From ed8172e3e20ddc6e8b7ddf811775cd41ef812018 Mon Sep 17 00:00:00 2001 From: Michael McMaster Date: Mon, 8 Mar 2021 09:36:13 +1000 Subject: [PATCH] Migrate to STM32Cubemx v1.8 --- Makefile | 198 - Makefile.revF | 198 + STM32CubeMX/SCSI2SD-V6/.mxproject | 13 - .../Device/ST/STM32F2xx/Include/stm32f205xx.h | 7342 -------- .../Device/ST/STM32F2xx/Include/stm32f207xx.h | 7947 -------- .../Device/ST/STM32F2xx/Include/stm32f215xx.h | 7501 -------- .../Device/ST/STM32F2xx/Include/stm32f217xx.h | 8107 -------- .../Drivers/CMSIS/Include/core_cm0.h | 740 - .../Drivers/CMSIS/Include/core_cm0plus.h | 854 - .../Drivers/CMSIS/Include/core_sc000.h | 864 - .../Inc/stm32f2xx_hal_crc.h | 249 - .../Inc/stm32f2xx_hal_cryp.h | 536 - .../Inc/stm32f2xx_hal_dac.h | 405 - .../Inc/stm32f2xx_hal_dac_ex.h | 193 - .../Inc/stm32f2xx_hal_hash.h | 432 - .../Inc/stm32f2xx_hal_hcd.h | 264 - .../Inc/stm32f2xx_hal_i2c.h | 532 - .../Inc/stm32f2xx_hal_i2s.h | 480 - .../Inc/stm32f2xx_hal_irda.h | 537 - .../Inc/stm32f2xx_hal_iwdg.h | 288 - .../Inc/stm32f2xx_hal_nand.h | 305 - .../Inc/stm32f2xx_hal_pcd.h | 319 - .../Inc/stm32f2xx_hal_pcd_ex.h | 93 - .../Inc/stm32f2xx_hal_sd.h | 789 - .../Inc/stm32f2xx_hal_smartcard.h | 620 - .../Inc/stm32f2xx_hal_spi.h | 575 - .../Inc/stm32f2xx_hal_sram.h | 191 - .../Inc/stm32f2xx_hal_tim.h | 1609 -- .../Inc/stm32f2xx_hal_tim_ex.h | 307 - .../Inc/stm32f2xx_hal_usart.h | 587 - .../Inc/stm32f2xx_hal_wwdg.h | 349 - .../Inc/stm32f2xx_ll_sdmmc.h | 907 - .../Inc/stm32f2xx_ll_usb.h | 461 - .../Src/stm32f2xx_hal_can.c | 1433 -- .../Src/stm32f2xx_hal_crc.c | 342 - .../Src/stm32f2xx_hal_cryp.c | 3812 ---- .../Src/stm32f2xx_hal_dac.c | 947 - .../Src/stm32f2xx_hal_dcmi.c | 826 - .../Src/stm32f2xx_hal_hash.c | 1851 -- .../Src/stm32f2xx_hal_hcd.c | 1215 -- .../Src/stm32f2xx_hal_i2c.c | 3649 ---- .../Src/stm32f2xx_hal_i2s.c | 1498 -- .../Src/stm32f2xx_hal_irda.c | 1504 -- .../Src/stm32f2xx_hal_iwdg.c | 361 - .../Src/stm32f2xx_hal_msp_template.c | 129 - .../Src/stm32f2xx_hal_nand.c | 1121 -- .../Src/stm32f2xx_hal_nor.c | 1003 - .../Src/stm32f2xx_hal_pcd.c | 1172 -- .../Src/stm32f2xx_hal_rng.c | 509 - .../Src/stm32f2xx_hal_sd.c | 3469 ---- .../Src/stm32f2xx_hal_smartcard.c | 1305 -- .../Src/stm32f2xx_hal_spi.c | 2298 --- .../Src/stm32f2xx_hal_sram.c | 678 - .../Src/stm32f2xx_hal_tim.c | 5315 ------ .../Src/stm32f2xx_hal_uart.c | 1932 -- .../Src/stm32f2xx_hal_usart.c | 1857 -- .../Src/stm32f2xx_hal_wwdg.c | 454 - .../Src/stm32f2xx_ll_fsmc.c | 954 - .../Src/stm32f2xx_ll_sdmmc.c | 505 - .../Src/stm32f2xx_ll_usb.c | 1687 -- STM32CubeMX/SCSI2SD-V6/Inc/bsp_driver_sd.h | 104 - STM32CubeMX/SCSI2SD-V6/Inc/ffconf.h | 276 - STM32CubeMX/SCSI2SD-V6/Inc/fsmc.h | 75 - STM32CubeMX/SCSI2SD-V6/Inc/gpio.h | 72 - STM32CubeMX/SCSI2SD-V6/Inc/sdio.h | 74 - STM32CubeMX/SCSI2SD-V6/Inc/spi.h | 73 - .../SCSI2SD-V6/Inc/stm32f2xx_hal_conf.h | 382 - STM32CubeMX/SCSI2SD-V6/Inc/stm32f2xx_it.h | 63 - STM32CubeMX/SCSI2SD-V6/Inc/usart.h | 73 - STM32CubeMX/SCSI2SD-V6/Inc/usb_device.h | 63 - STM32CubeMX/SCSI2SD-V6/Inc/usb_host.h | 68 - STM32CubeMX/SCSI2SD-V6/Inc/usbd_conf.h | 170 - STM32CubeMX/SCSI2SD-V6/Inc/usbd_desc.h | 103 - STM32CubeMX/SCSI2SD-V6/Inc/usbh_conf.h | 178 - .../Core/Inc/usbd_conf_template.h | 169 - .../Core/Inc/usbd_ctlreq.h | 113 - .../Core/Inc/usbd_def.h | 330 - .../Core/Inc/usbd_ioreq.h | 128 - .../Core/Src/usbd_core.c | 565 - .../Core/Src/usbd_ctlreq.c | 782 - .../Class/MSC/Inc/usbh_msc_scsi.h | 226 - .../Class/MSC/Src/usbh_msc.c | 805 - .../Class/MSC/Src/usbh_msc_bot.c | 633 - .../Class/MSC/Src/usbh_msc_scsi.c | 458 - .../Core/Inc/usbh_conf_template.h | 157 - .../Core/Inc/usbh_core.h | 169 - .../Core/Inc/usbh_ctlreq.h | 155 - .../Core/Inc/usbh_def.h | 490 - .../Core/Inc/usbh_ioreq.h | 168 - .../Core/Inc/usbh_pipes.h | 131 - .../Core/Src/usbh_conf_template.c | 271 - .../Core/Src/usbh_core.c | 933 - .../Core/Src/usbh_ctlreq.c | 881 - .../Core/Src/usbh_ioreq.c | 358 - STM32CubeMX/SCSI2SD-V6/Src/bsp_driver_sd.c | 308 - STM32CubeMX/SCSI2SD-V6/Src/main.c | 186 - STM32CubeMX/SCSI2SD-V6/Src/spi.c | 133 - .../SCSI2SD-V6/Src/stm32f2xx_hal_msp.c | 73 - STM32CubeMX/SCSI2SD-V6/Src/usb_device.c | 64 - STM32CubeMX/SCSI2SD-V6/Src/usb_host.c | 120 - STM32CubeMX/SCSI2SD-V6/Src/usbd_conf.c | 511 - STM32CubeMX/SCSI2SD-V6/Src/usbd_desc.c | 296 - STM32CubeMX/SCSI2SD-V6/Src/usbh_conf.c | 476 - STM32CubeMX/readme.txt | 4 - STM32CubeMX/revF/.mxproject | 14 + .../Drivers/CMSIS/Core/Include/cmsis_armcc.h | 865 + .../CMSIS/Core/Include/cmsis_armclang.h | 1869 ++ .../CMSIS/Core/Include/cmsis_compiler.h | 266 + .../Drivers/CMSIS/Core/Include/cmsis_gcc.h | 2085 +++ .../Drivers/CMSIS/Core/Include/cmsis_iccarm.h | 935 + .../CMSIS/Core/Include/cmsis_version.h | 39 + .../CMSIS/Core/Include/core_armv8mbl.h | 1918 ++ .../CMSIS/Core/Include/core_armv8mml.h | 2927 +++ .../Drivers/CMSIS/Core/Include/core_cm0.h | 949 + .../Drivers/CMSIS/Core/Include/core_cm0plus.h | 1083 ++ .../Drivers/CMSIS/Core/Include/core_cm1.h | 976 + .../Drivers/CMSIS/Core/Include/core_cm23.h | 1993 ++ .../Drivers/CMSIS/Core}/Include/core_cm3.h | 1720 +- .../Drivers/CMSIS/Core/Include/core_cm33.h | 3002 +++ .../Drivers/CMSIS/Core}/Include/core_cm4.h | 1895 +- .../Drivers/CMSIS/Core}/Include/core_cm7.h | 2416 +-- .../Drivers/CMSIS/Core/Include/core_sc000.h | 1022 ++ .../Drivers/CMSIS/Core}/Include/core_sc300.h | 1702 +- .../Drivers/CMSIS/Core/Include/mpu_armv7.h | 270 + .../Drivers/CMSIS/Core/Include/mpu_armv8.h | 333 + .../Drivers/CMSIS/Core/Include/tz_context.h | 70 + .../CMSIS/Core/Template/ARMv8-M/main_s.c | 58 + .../CMSIS/Core/Template/ARMv8-M/tz_context.c | 200 + .../CMSIS/Core_A/Include/cmsis_armcc.h | 544 + .../CMSIS/Core_A/Include/cmsis_armclang.h | 503 + .../CMSIS/Core_A/Include/cmsis_compiler.h | 201 + .../Drivers/CMSIS/Core_A/Include/cmsis_cp15.h | 514 + .../Drivers/CMSIS/Core_A/Include/cmsis_gcc.h | 679 + .../CMSIS/Core_A/Include/cmsis_iccarm.h | 559 + .../Drivers/CMSIS/Core_A/Include/core_ca.h | 2614 +++ .../Drivers/CMSIS/Core_A/Include/irq_ctrl.h | 186 + .../CMSIS/Core_A/Source/irq_ctrl_gic.c | 410 + .../Source/BasicMathFunctions/arm_abs_f32.c | 0 .../Source/BasicMathFunctions/arm_abs_q15.c | 0 .../Source/BasicMathFunctions/arm_abs_q31.c | 0 .../Source/BasicMathFunctions/arm_abs_q7.c | 0 .../Source/BasicMathFunctions/arm_add_f32.c | 0 .../Source/BasicMathFunctions/arm_add_q15.c | 0 .../Source/BasicMathFunctions/arm_add_q31.c | 0 .../Source/BasicMathFunctions/arm_add_q7.c | 0 .../BasicMathFunctions/arm_dot_prod_f32.c | 0 .../BasicMathFunctions/arm_dot_prod_q15.c | 0 .../BasicMathFunctions/arm_dot_prod_q31.c | 0 .../BasicMathFunctions/arm_dot_prod_q7.c | 0 .../Source/BasicMathFunctions/arm_mult_f32.c | 0 .../Source/BasicMathFunctions/arm_mult_q15.c | 0 .../Source/BasicMathFunctions/arm_mult_q31.c | 0 .../Source/BasicMathFunctions/arm_mult_q7.c | 0 .../BasicMathFunctions/arm_negate_f32.c | 0 .../BasicMathFunctions/arm_negate_q15.c | 0 .../BasicMathFunctions/arm_negate_q31.c | 0 .../Source/BasicMathFunctions/arm_negate_q7.c | 0 .../BasicMathFunctions/arm_offset_f32.c | 0 .../BasicMathFunctions/arm_offset_q15.c | 0 .../BasicMathFunctions/arm_offset_q31.c | 0 .../Source/BasicMathFunctions/arm_offset_q7.c | 0 .../Source/BasicMathFunctions/arm_scale_f32.c | 0 .../Source/BasicMathFunctions/arm_scale_q15.c | 0 .../Source/BasicMathFunctions/arm_scale_q31.c | 0 .../Source/BasicMathFunctions/arm_scale_q7.c | 0 .../Source/BasicMathFunctions/arm_shift_q15.c | 0 .../Source/BasicMathFunctions/arm_shift_q31.c | 0 .../Source/BasicMathFunctions/arm_shift_q7.c | 0 .../Source/BasicMathFunctions/arm_sub_f32.c | 0 .../Source/BasicMathFunctions/arm_sub_q15.c | 0 .../Source/BasicMathFunctions/arm_sub_q31.c | 0 .../Source/BasicMathFunctions/arm_sub_q7.c | 0 .../Source/CommonTables/arm_common_tables.c | 0 .../Source/CommonTables/arm_const_structs.c | 0 .../ComplexMathFunctions/arm_cmplx_conj_f32.c | 0 .../ComplexMathFunctions/arm_cmplx_conj_q15.c | 0 .../ComplexMathFunctions/arm_cmplx_conj_q31.c | 0 .../arm_cmplx_dot_prod_f32.c | 0 .../arm_cmplx_dot_prod_q15.c | 0 .../arm_cmplx_dot_prod_q31.c | 0 .../ComplexMathFunctions/arm_cmplx_mag_f32.c | 0 .../ComplexMathFunctions/arm_cmplx_mag_q15.c | 0 .../ComplexMathFunctions/arm_cmplx_mag_q31.c | 0 .../arm_cmplx_mag_squared_f32.c | 0 .../arm_cmplx_mag_squared_q15.c | 0 .../arm_cmplx_mag_squared_q31.c | 0 .../arm_cmplx_mult_cmplx_f32.c | 0 .../arm_cmplx_mult_cmplx_q15.c | 0 .../arm_cmplx_mult_cmplx_q31.c | 0 .../arm_cmplx_mult_real_f32.c | 0 .../arm_cmplx_mult_real_q15.c | 0 .../arm_cmplx_mult_real_q31.c | 0 .../ControllerFunctions/arm_pid_init_f32.c | 0 .../ControllerFunctions/arm_pid_init_q15.c | 0 .../ControllerFunctions/arm_pid_init_q31.c | 0 .../ControllerFunctions/arm_pid_reset_f32.c | 0 .../ControllerFunctions/arm_pid_reset_q15.c | 0 .../ControllerFunctions/arm_pid_reset_q31.c | 0 .../ControllerFunctions/arm_sin_cos_f32.c | 0 .../ControllerFunctions/arm_sin_cos_q31.c | 0 .../Source/FastMathFunctions/arm_cos_f32.c | 0 .../Source/FastMathFunctions/arm_cos_q15.c | 0 .../Source/FastMathFunctions/arm_cos_q31.c | 0 .../Source/FastMathFunctions/arm_sin_f32.c | 0 .../Source/FastMathFunctions/arm_sin_q15.c | 0 .../Source/FastMathFunctions/arm_sin_q31.c | 0 .../Source/FastMathFunctions/arm_sqrt_q15.c | 0 .../Source/FastMathFunctions/arm_sqrt_q31.c | 0 .../arm_biquad_cascade_df1_32x64_init_q31.c | 0 .../arm_biquad_cascade_df1_32x64_q31.c | 0 .../arm_biquad_cascade_df1_f32.c | 0 .../arm_biquad_cascade_df1_fast_q15.c | 0 .../arm_biquad_cascade_df1_fast_q31.c | 0 .../arm_biquad_cascade_df1_init_f32.c | 0 .../arm_biquad_cascade_df1_init_q15.c | 0 .../arm_biquad_cascade_df1_init_q31.c | 0 .../arm_biquad_cascade_df1_q15.c | 0 .../arm_biquad_cascade_df1_q31.c | 0 .../arm_biquad_cascade_df2T_f32.c | 0 .../arm_biquad_cascade_df2T_f64.c | 0 .../arm_biquad_cascade_df2T_init_f32.c | 0 .../arm_biquad_cascade_df2T_init_f64.c | 0 .../arm_biquad_cascade_stereo_df2T_f32.c | 0 .../arm_biquad_cascade_stereo_df2T_init_f32.c | 0 .../Source/FilteringFunctions/arm_conv_f32.c | 0 .../arm_conv_fast_opt_q15.c | 0 .../FilteringFunctions/arm_conv_fast_q15.c | 0 .../FilteringFunctions/arm_conv_fast_q31.c | 0 .../FilteringFunctions/arm_conv_opt_q15.c | 0 .../FilteringFunctions/arm_conv_opt_q7.c | 0 .../FilteringFunctions/arm_conv_partial_f32.c | 0 .../arm_conv_partial_fast_opt_q15.c | 0 .../arm_conv_partial_fast_q15.c | 0 .../arm_conv_partial_fast_q31.c | 0 .../arm_conv_partial_opt_q15.c | 0 .../arm_conv_partial_opt_q7.c | 0 .../FilteringFunctions/arm_conv_partial_q15.c | 0 .../FilteringFunctions/arm_conv_partial_q31.c | 0 .../FilteringFunctions/arm_conv_partial_q7.c | 0 .../Source/FilteringFunctions/arm_conv_q15.c | 0 .../Source/FilteringFunctions/arm_conv_q31.c | 0 .../Source/FilteringFunctions/arm_conv_q7.c | 0 .../FilteringFunctions/arm_correlate_f32.c | 0 .../arm_correlate_fast_opt_q15.c | 0 .../arm_correlate_fast_q15.c | 0 .../arm_correlate_fast_q31.c | 0 .../arm_correlate_opt_q15.c | 0 .../FilteringFunctions/arm_correlate_opt_q7.c | 0 .../FilteringFunctions/arm_correlate_q15.c | 0 .../FilteringFunctions/arm_correlate_q31.c | 0 .../FilteringFunctions/arm_correlate_q7.c | 0 .../FilteringFunctions/arm_fir_decimate_f32.c | 0 .../arm_fir_decimate_fast_q15.c | 0 .../arm_fir_decimate_fast_q31.c | 0 .../arm_fir_decimate_init_f32.c | 0 .../arm_fir_decimate_init_q15.c | 0 .../arm_fir_decimate_init_q31.c | 0 .../FilteringFunctions/arm_fir_decimate_q15.c | 0 .../FilteringFunctions/arm_fir_decimate_q31.c | 0 .../Source/FilteringFunctions/arm_fir_f32.c | 0 .../FilteringFunctions/arm_fir_fast_q15.c | 0 .../FilteringFunctions/arm_fir_fast_q31.c | 0 .../FilteringFunctions/arm_fir_init_f32.c | 0 .../FilteringFunctions/arm_fir_init_q15.c | 0 .../FilteringFunctions/arm_fir_init_q31.c | 0 .../FilteringFunctions/arm_fir_init_q7.c | 0 .../arm_fir_interpolate_f32.c | 0 .../arm_fir_interpolate_init_f32.c | 0 .../arm_fir_interpolate_init_q15.c | 0 .../arm_fir_interpolate_init_q31.c | 0 .../arm_fir_interpolate_q15.c | 0 .../arm_fir_interpolate_q31.c | 0 .../FilteringFunctions/arm_fir_lattice_f32.c | 0 .../arm_fir_lattice_init_f32.c | 0 .../arm_fir_lattice_init_q15.c | 0 .../arm_fir_lattice_init_q31.c | 0 .../FilteringFunctions/arm_fir_lattice_q15.c | 0 .../FilteringFunctions/arm_fir_lattice_q31.c | 0 .../Source/FilteringFunctions/arm_fir_q15.c | 0 .../Source/FilteringFunctions/arm_fir_q31.c | 0 .../Source/FilteringFunctions/arm_fir_q7.c | 0 .../FilteringFunctions/arm_fir_sparse_f32.c | 0 .../arm_fir_sparse_init_f32.c | 0 .../arm_fir_sparse_init_q15.c | 0 .../arm_fir_sparse_init_q31.c | 0 .../arm_fir_sparse_init_q7.c | 0 .../FilteringFunctions/arm_fir_sparse_q15.c | 0 .../FilteringFunctions/arm_fir_sparse_q31.c | 0 .../FilteringFunctions/arm_fir_sparse_q7.c | 0 .../FilteringFunctions/arm_iir_lattice_f32.c | 0 .../arm_iir_lattice_init_f32.c | 0 .../arm_iir_lattice_init_q15.c | 0 .../arm_iir_lattice_init_q31.c | 0 .../FilteringFunctions/arm_iir_lattice_q15.c | 0 .../FilteringFunctions/arm_iir_lattice_q31.c | 0 .../Source/FilteringFunctions/arm_lms_f32.c | 0 .../FilteringFunctions/arm_lms_init_f32.c | 0 .../FilteringFunctions/arm_lms_init_q15.c | 0 .../FilteringFunctions/arm_lms_init_q31.c | 0 .../FilteringFunctions/arm_lms_norm_f32.c | 0 .../arm_lms_norm_init_f32.c | 0 .../arm_lms_norm_init_q15.c | 0 .../arm_lms_norm_init_q31.c | 0 .../FilteringFunctions/arm_lms_norm_q15.c | 0 .../FilteringFunctions/arm_lms_norm_q31.c | 0 .../Source/FilteringFunctions/arm_lms_q15.c | 0 .../Source/FilteringFunctions/arm_lms_q31.c | 0 .../Source/MatrixFunctions/arm_mat_add_f32.c | 0 .../Source/MatrixFunctions/arm_mat_add_q15.c | 0 .../Source/MatrixFunctions/arm_mat_add_q31.c | 0 .../MatrixFunctions/arm_mat_cmplx_mult_f32.c | 0 .../MatrixFunctions/arm_mat_cmplx_mult_q15.c | 0 .../MatrixFunctions/arm_mat_cmplx_mult_q31.c | 0 .../Source/MatrixFunctions/arm_mat_init_f32.c | 0 .../Source/MatrixFunctions/arm_mat_init_q15.c | 0 .../Source/MatrixFunctions/arm_mat_init_q31.c | 0 .../MatrixFunctions/arm_mat_inverse_f32.c | 0 .../MatrixFunctions/arm_mat_inverse_f64.c | 0 .../Source/MatrixFunctions/arm_mat_mult_f32.c | 0 .../MatrixFunctions/arm_mat_mult_fast_q15.c | 0 .../MatrixFunctions/arm_mat_mult_fast_q31.c | 0 .../Source/MatrixFunctions/arm_mat_mult_q15.c | 0 .../Source/MatrixFunctions/arm_mat_mult_q31.c | 0 .../MatrixFunctions/arm_mat_scale_f32.c | 0 .../MatrixFunctions/arm_mat_scale_q15.c | 0 .../MatrixFunctions/arm_mat_scale_q31.c | 0 .../Source/MatrixFunctions/arm_mat_sub_f32.c | 0 .../Source/MatrixFunctions/arm_mat_sub_q15.c | 0 .../Source/MatrixFunctions/arm_mat_sub_q31.c | 0 .../MatrixFunctions/arm_mat_trans_f32.c | 0 .../MatrixFunctions/arm_mat_trans_q15.c | 0 .../MatrixFunctions/arm_mat_trans_q31.c | 0 .../Source/StatisticsFunctions/arm_max_f32.c | 0 .../Source/StatisticsFunctions/arm_max_q15.c | 0 .../Source/StatisticsFunctions/arm_max_q31.c | 0 .../Source/StatisticsFunctions/arm_max_q7.c | 0 .../Source/StatisticsFunctions/arm_mean_f32.c | 0 .../Source/StatisticsFunctions/arm_mean_q15.c | 0 .../Source/StatisticsFunctions/arm_mean_q31.c | 0 .../Source/StatisticsFunctions/arm_mean_q7.c | 0 .../Source/StatisticsFunctions/arm_min_f32.c | 0 .../Source/StatisticsFunctions/arm_min_q15.c | 0 .../Source/StatisticsFunctions/arm_min_q31.c | 0 .../Source/StatisticsFunctions/arm_min_q7.c | 0 .../StatisticsFunctions/arm_power_f32.c | 0 .../StatisticsFunctions/arm_power_q15.c | 0 .../StatisticsFunctions/arm_power_q31.c | 0 .../Source/StatisticsFunctions/arm_power_q7.c | 0 .../Source/StatisticsFunctions/arm_rms_f32.c | 0 .../Source/StatisticsFunctions/arm_rms_q15.c | 0 .../Source/StatisticsFunctions/arm_rms_q31.c | 0 .../Source/StatisticsFunctions/arm_std_f32.c | 0 .../Source/StatisticsFunctions/arm_std_q15.c | 0 .../Source/StatisticsFunctions/arm_std_q31.c | 0 .../Source/StatisticsFunctions/arm_var_f32.c | 0 .../Source/StatisticsFunctions/arm_var_q15.c | 0 .../Source/StatisticsFunctions/arm_var_q31.c | 0 .../Source/SupportFunctions/arm_copy_f32.c | 0 .../Source/SupportFunctions/arm_copy_q15.c | 0 .../Source/SupportFunctions/arm_copy_q31.c | 0 .../Source/SupportFunctions/arm_copy_q7.c | 0 .../Source/SupportFunctions/arm_fill_f32.c | 0 .../Source/SupportFunctions/arm_fill_q15.c | 0 .../Source/SupportFunctions/arm_fill_q31.c | 0 .../Source/SupportFunctions/arm_fill_q7.c | 0 .../SupportFunctions/arm_float_to_q15.c | 0 .../SupportFunctions/arm_float_to_q31.c | 0 .../Source/SupportFunctions/arm_float_to_q7.c | 0 .../SupportFunctions/arm_q15_to_float.c | 0 .../Source/SupportFunctions/arm_q15_to_q31.c | 0 .../Source/SupportFunctions/arm_q15_to_q7.c | 0 .../SupportFunctions/arm_q31_to_float.c | 0 .../Source/SupportFunctions/arm_q31_to_q15.c | 0 .../Source/SupportFunctions/arm_q31_to_q7.c | 0 .../Source/SupportFunctions/arm_q7_to_float.c | 0 .../Source/SupportFunctions/arm_q7_to_q15.c | 0 .../Source/SupportFunctions/arm_q7_to_q31.c | 0 .../TransformFunctions/arm_bitreversal.c | 0 .../Source/TransformFunctions/arm_cfft_f32.c | 0 .../Source/TransformFunctions/arm_cfft_q15.c | 0 .../Source/TransformFunctions/arm_cfft_q31.c | 0 .../TransformFunctions/arm_cfft_radix2_f32.c | 0 .../arm_cfft_radix2_init_f32.c | 0 .../arm_cfft_radix2_init_q15.c | 0 .../arm_cfft_radix2_init_q31.c | 0 .../TransformFunctions/arm_cfft_radix2_q15.c | 0 .../TransformFunctions/arm_cfft_radix2_q31.c | 0 .../TransformFunctions/arm_cfft_radix4_f32.c | 0 .../arm_cfft_radix4_init_f32.c | 0 .../arm_cfft_radix4_init_q15.c | 0 .../arm_cfft_radix4_init_q31.c | 0 .../TransformFunctions/arm_cfft_radix4_q15.c | 0 .../TransformFunctions/arm_cfft_radix4_q31.c | 0 .../TransformFunctions/arm_cfft_radix8_f32.c | 0 .../Source/TransformFunctions/arm_dct4_f32.c | 0 .../TransformFunctions/arm_dct4_init_f32.c | 0 .../TransformFunctions/arm_dct4_init_q15.c | 0 .../TransformFunctions/arm_dct4_init_q31.c | 0 .../Source/TransformFunctions/arm_dct4_q15.c | 0 .../Source/TransformFunctions/arm_dct4_q31.c | 0 .../Source/TransformFunctions/arm_rfft_f32.c | 0 .../TransformFunctions/arm_rfft_fast_f32.c | 0 .../arm_rfft_fast_init_f32.c | 0 .../TransformFunctions/arm_rfft_init_f32.c | 0 .../TransformFunctions/arm_rfft_init_q15.c | 0 .../TransformFunctions/arm_rfft_init_q31.c | 0 .../Source/TransformFunctions/arm_rfft_q15.c | 0 .../Source/TransformFunctions/arm_rfft_q31.c | 0 .../Device/ST/STM32F2xx/Include/stm32f205xx.h | 13717 ++++++++++++++ .../Device/ST/STM32F2xx/Include/stm32f207xx.h | 15008 +++++++++++++++ .../Device/ST/STM32F2xx/Include/stm32f215xx.h | 13972 ++++++++++++++ .../Device/ST/STM32F2xx/Include/stm32f217xx.h | 15263 ++++++++++++++++ .../Device/ST/STM32F2xx/Include/stm32f2xx.h | 60 +- .../ST/STM32F2xx/Include/system_stm32f2xx.h | 40 +- .../Templates/arm/startup_stm32f205xx.s | 39 +- .../Templates/arm/startup_stm32f207xx.s | 39 +- .../Templates/arm/startup_stm32f215xx.s | 39 +- .../Templates/arm/startup_stm32f217xx.s | 39 +- .../Templates/gcc/startup_stm32f205xx.s | 30 +- .../Templates/gcc/startup_stm32f207xx.s | 30 +- .../Templates/gcc/startup_stm32f215xx.s | 30 +- .../Templates/gcc/startup_stm32f217xx.s | 30 +- .../iar/linker/stm32f205xx_flash.icf | 31 + .../Templates/iar/linker/stm32f205xx_sram.icf | 31 + .../iar/linker/stm32f207xx_flash.icf | 31 + .../Templates/iar/linker/stm32f207xx_sram.icf | 31 + .../iar/linker/stm32f215xx_flash.icf | 31 + .../Templates/iar/linker/stm32f215xx_sram.icf | 31 + .../iar/linker/stm32f217xx_flash.icf | 31 + .../Templates/iar/linker/stm32f217xx_sram.icf | 31 + .../Templates/iar/startup_stm32f205xx.s | 37 +- .../Templates/iar/startup_stm32f207xx.s | 37 +- .../Templates/iar/startup_stm32f215xx.s | 37 +- .../Templates/iar/startup_stm32f217xx.s | 37 +- .../Source/Templates/system_stm32f2xx.c | 44 +- .../Drivers/CMSIS/Include/arm_common_tables.h | 0 .../Drivers/CMSIS/Include/arm_const_structs.h | 0 .../Drivers/CMSIS/Include/arm_math.h | 0 .../revF/Drivers/CMSIS/Include/cmsis_armcc.h | 865 + .../Drivers/CMSIS/Include/cmsis_armclang.h | 1869 ++ .../Drivers/CMSIS/Include/cmsis_compiler.h | 266 + .../revF/Drivers/CMSIS/Include/cmsis_gcc.h | 2085 +++ .../revF/Drivers/CMSIS/Include/cmsis_iccarm.h | 935 + .../Drivers/CMSIS/Include/cmsis_version.h | 39 + .../Drivers/CMSIS/Include/core_armv8mbl.h | 1918 ++ .../Drivers/CMSIS/Include/core_armv8mml.h | 2927 +++ .../revF/Drivers/CMSIS/Include/core_cm0.h | 949 + .../revF/Drivers/CMSIS/Include/core_cm0plus.h | 1083 ++ .../revF/Drivers/CMSIS/Include/core_cm1.h | 976 + .../revF/Drivers/CMSIS/Include/core_cm23.h | 1993 ++ .../revF/Drivers/CMSIS/Include/core_cm3.h | 1941 ++ .../revF/Drivers/CMSIS/Include/core_cm33.h | 3002 +++ .../revF/Drivers/CMSIS/Include/core_cm4.h | 2129 +++ .../revF/Drivers/CMSIS/Include/core_cm7.h | 2671 +++ .../Drivers/CMSIS/Include/core_cmFunc.h | 0 .../Drivers/CMSIS/Include/core_cmInstr.h | 0 .../Drivers/CMSIS/Include/core_cmSimd.h | 0 .../revF/Drivers/CMSIS/Include/core_sc000.h | 1022 ++ .../revF/Drivers/CMSIS/Include/core_sc300.h | 1915 ++ .../revF/Drivers/CMSIS/Include/mpu_armv7.h | 270 + .../revF/Drivers/CMSIS/Include/mpu_armv8.h | 333 + .../revF/Drivers/CMSIS/Include/tz_context.h | 70 + .../CMSIS/Lib/ARM/arm_cortexM3b_math.lib | Bin 0 -> 13694834 bytes .../CMSIS/Lib/ARM/arm_cortexM3l_math.lib | Bin 0 -> 13671734 bytes .../CMSIS/Lib/GCC/libarm_cortexM3l_math.a | Bin 0 -> 2688050 bytes .../CMSIS/Lib/IAR/iar_cortexM3b_math.a | Bin 0 -> 2846972 bytes .../CMSIS/Lib/IAR/iar_cortexM3l_math.a | Bin 0 -> 2840164 bytes .../Drivers/CMSIS/RTOS/Template/cmsis_os.h | 59 +- .../Inc/Legacy/stm32_hal_legacy.h | 1379 +- .../Inc/Legacy/stm32f2xx_hal_can_legacy.h} | 272 +- .../Inc/stm32_assert_template.h | 57 + .../STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal.h | 82 +- .../Inc/stm32f2xx_hal_adc.h | 263 +- .../Inc/stm32f2xx_hal_adc_ex.h | 67 +- .../Inc/stm32f2xx_hal_can.h | 848 + .../Inc/stm32f2xx_hal_conf_template.h | 213 +- .../Inc/stm32f2xx_hal_cortex.h | 216 +- .../Inc/stm32f2xx_hal_crc.h | 184 + .../Inc/stm32f2xx_hal_cryp.h | 511 + .../Inc/stm32f2xx_hal_dac.h | 468 + .../Inc/stm32f2xx_hal_dac_ex.h | 202 + .../Inc/stm32f2xx_hal_dcmi.h | 363 +- .../Inc/stm32f2xx_hal_dcmi_ex.h | 37 + .../Inc/stm32f2xx_hal_def.h | 85 +- .../Inc/stm32f2xx_hal_dma.h | 236 +- .../Inc/stm32f2xx_hal_dma_ex.h | 35 +- .../Inc/stm32f2xx_hal_eth.h | 1501 +- .../Inc/stm32f2xx_hal_exti.h | 293 + .../Inc/stm32f2xx_hal_flash.h | 106 +- .../Inc/stm32f2xx_hal_flash_ex.h | 144 +- .../Inc/stm32f2xx_hal_gpio.h | 88 +- .../Inc/stm32f2xx_hal_gpio_ex.h | 46 +- .../Inc/stm32f2xx_hal_hash.h | 573 + .../Inc/stm32f2xx_hal_hcd.h | 329 + .../Inc/stm32f2xx_hal_i2c.h | 735 + .../Inc/stm32f2xx_hal_i2s.h | 557 + .../Inc/stm32f2xx_hal_irda.h | 684 + .../Inc/stm32f2xx_hal_iwdg.h | 221 + .../Inc/stm32f2xx_hal_mmc.h | 745 + .../Inc/stm32f2xx_hal_nand.h | 368 + .../Inc/stm32f2xx_hal_nor.h | 235 +- .../Inc/stm32f2xx_hal_pccard.h | 162 +- .../Inc/stm32f2xx_hal_pcd.h | 437 + .../Inc/stm32f2xx_hal_pcd_ex.h | 82 + .../Inc/stm32f2xx_hal_pwr.h | 74 +- .../Inc/stm32f2xx_hal_pwr_ex.h | 52 +- .../Inc/stm32f2xx_hal_rcc.h | 783 +- .../Inc/stm32f2xx_hal_rcc_ex.h | 103 +- .../Inc/stm32f2xx_hal_rng.h | 280 +- .../Inc/stm32f2xx_hal_rtc.h | 480 +- .../Inc/stm32f2xx_hal_rtc_ex.h | 320 +- .../Inc/stm32f2xx_hal_sd.h | 762 + .../Inc/stm32f2xx_hal_smartcard.h | 757 + .../Inc/stm32f2xx_hal_spi.h | 726 + .../Inc/stm32f2xx_hal_sram.h | 222 + .../Inc/stm32f2xx_hal_tim.h | 2018 ++ .../Inc/stm32f2xx_hal_tim_ex.h | 283 + .../Inc/stm32f2xx_hal_uart.h | 611 +- .../Inc/stm32f2xx_hal_usart.h | 645 + .../Inc/stm32f2xx_hal_wwdg.h | 300 + .../Inc/stm32f2xx_ll_adc.h | 4622 +++++ .../Inc/stm32f2xx_ll_bus.h | 1520 ++ .../Inc/stm32f2xx_ll_cortex.h | 640 + .../Inc/stm32f2xx_ll_crc.h | 204 + .../Inc/stm32f2xx_ll_dac.h | 1313 ++ .../Inc/stm32f2xx_ll_dma.h | 2860 +++ .../Inc/stm32f2xx_ll_exti.h | 934 + .../Inc/stm32f2xx_ll_fsmc.h | 700 +- .../Inc/stm32f2xx_ll_gpio.h | 982 + .../Inc/stm32f2xx_ll_i2c.h | 1784 ++ .../Inc/stm32f2xx_ll_iwdg.h | 311 + .../Inc/stm32f2xx_ll_pwr.h | 510 + .../Inc/stm32f2xx_ll_rcc.h | 2427 +++ .../Inc/stm32f2xx_ll_rng.h | 337 + .../Inc/stm32f2xx_ll_rtc.h | 3360 ++++ .../Inc/stm32f2xx_ll_sdmmc.h | 1112 ++ .../Inc/stm32f2xx_ll_spi.h | 1991 ++ .../Inc/stm32f2xx_ll_system.h | 846 + .../Inc/stm32f2xx_ll_tim.h | 3965 ++++ .../Inc/stm32f2xx_ll_usart.h | 2521 +++ .../Inc/stm32f2xx_ll_usb.h | 511 + .../Inc/stm32f2xx_ll_utils.h | 272 + .../Inc/stm32f2xx_ll_wwdg.h | 319 + .../STM32F2xx_HAL_Driver/Src/stm32f2xx_hal.c | 183 +- .../Src/stm32f2xx_hal_adc.c | 542 +- .../Src/stm32f2xx_hal_adc_ex.c | 118 +- .../Src/stm32f2xx_hal_can.c | 2436 +++ .../Src/stm32f2xx_hal_cortex.c | 104 +- .../Src/stm32f2xx_hal_crc.c | 330 + .../Src/stm32f2xx_hal_cryp.c | 2468 +++ .../Src/stm32f2xx_hal_dac.c | 1350 ++ .../Src/stm32f2xx_hal_dac_ex.c | 380 +- .../Src/stm32f2xx_hal_dcmi.c | 1178 ++ .../Src/stm32f2xx_hal_dcmi_ex.c | 34 + .../Src/stm32f2xx_hal_dma.c | 1099 +- .../Src/stm32f2xx_hal_dma_ex.c | 252 +- .../Src/stm32f2xx_hal_eth.c | 1839 +- .../Src/stm32f2xx_hal_exti.c | 559 + .../Src/stm32f2xx_hal_flash.c | 125 +- .../Src/stm32f2xx_hal_flash_ex.c | 104 +- .../Src/stm32f2xx_hal_gpio.c | 240 +- .../Src/stm32f2xx_hal_hash.c | 2975 +++ .../Src/stm32f2xx_hal_hcd.c | 1638 ++ .../Src/stm32f2xx_hal_i2c.c | 7123 ++++++++ .../Src/stm32f2xx_hal_i2s.c | 1840 ++ .../Src/stm32f2xx_hal_irda.c | 2658 +++ .../Src/stm32f2xx_hal_iwdg.c | 240 + .../Src/stm32f2xx_hal_mmc.c | 2858 +++ .../Src/stm32f2xx_hal_msp_template.c | 96 + .../Src/stm32f2xx_hal_nand.c | 2265 +++ .../Src/stm32f2xx_hal_nor.c | 1282 ++ .../Src/stm32f2xx_hal_pccard.c | 752 +- .../Src/stm32f2xx_hal_pcd.c | 2005 ++ .../Src/stm32f2xx_hal_pcd_ex.c | 124 +- .../Src/stm32f2xx_hal_pwr.c | 57 +- .../Src/stm32f2xx_hal_pwr_ex.c | 40 +- .../Src/stm32f2xx_hal_rcc.c | 934 +- .../Src/stm32f2xx_hal_rcc_ex.c | 65 +- .../Src/stm32f2xx_hal_rng.c | 861 + .../Src/stm32f2xx_hal_rtc.c | 1458 +- .../Src/stm32f2xx_hal_rtc_ex.c | 1122 +- .../Src/stm32f2xx_hal_sd.c | 3243 ++++ .../Src/stm32f2xx_hal_smartcard.c | 2357 +++ .../Src/stm32f2xx_hal_spi.c | 3762 ++++ .../Src/stm32f2xx_hal_sram.c | 1110 ++ .../Src/stm32f2xx_hal_tim.c | 6654 +++++++ .../Src/stm32f2xx_hal_tim_ex.c | 1703 +- ...tm32f2xx_hal_timebase_rtc_alarm_template.c | 313 + ...m32f2xx_hal_timebase_rtc_wakeup_template.c | 285 + .../Src/stm32f2xx_hal_timebase_tim_template.c | 169 + .../Src/stm32f2xx_hal_uart.c | 3130 ++++ .../Src/stm32f2xx_hal_usart.c | 2799 +++ .../Src/stm32f2xx_hal_wwdg.c | 414 + .../Src/stm32f2xx_ll_adc.c | 922 + .../Src/stm32f2xx_ll_crc.c | 107 + .../Src/stm32f2xx_ll_dac.c | 272 + .../Src/stm32f2xx_ll_dma.c | 427 + .../Src/stm32f2xx_ll_exti.c | 215 + .../Src/stm32f2xx_ll_fsmc.c | 958 + .../Src/stm32f2xx_ll_gpio.c | 310 + .../Src/stm32f2xx_ll_i2c.c | 227 + .../Src/stm32f2xx_ll_pwr.c | 86 + .../Src/stm32f2xx_ll_rcc.c | 406 + .../Src/stm32f2xx_ll_rng.c | 96 + .../Src/stm32f2xx_ll_rtc.c | 857 + .../Src/stm32f2xx_ll_sdmmc.c | 1521 ++ .../Src/stm32f2xx_ll_spi.c | 524 + .../Src/stm32f2xx_ll_tim.c | 1180 ++ .../Src/stm32f2xx_ll_usart.c | 428 + .../Src/stm32f2xx_ll_usb.c | 1994 ++ .../Src/stm32f2xx_ll_utils.c | 627 + STM32CubeMX/revF/Inc/dma.h | 58 + STM32CubeMX/revF/Inc/fsmc.h | 60 + STM32CubeMX/revF/Inc/gpio.h | 57 + STM32CubeMX/revF/Inc/main.h | 136 + .../{SCSI2SD-V6 => revF}/Inc/mxconstants.h | 0 STM32CubeMX/revF/Inc/sdio.h | 58 + STM32CubeMX/revF/Inc/spi.h | 58 + STM32CubeMX/revF/Inc/stm32f2xx_hal_conf.h | 409 + STM32CubeMX/revF/Inc/stm32f2xx_it.h | 66 + STM32CubeMX/revF/Inc/sys.h | 56 + STM32CubeMX/revF/Inc/tim.h | 58 + STM32CubeMX/revF/Inc/usart.h | 58 + STM32CubeMX/revF/Inc/usb_device.h | 105 + STM32CubeMX/revF/Inc/usbd_conf.h | 176 + STM32CubeMX/revF/Inc/usbd_desc.h | 145 + STM32CubeMX/revF/Inc/usbd_storage_if.h | 129 + .../Class/HID/Inc/usbd_hid.h | 144 + .../Class/HID/Src/usbd_hid.c | 681 + .../Class/MSC/Inc/usbd_msc.h | 129 + .../Class/MSC/Inc/usbd_msc_bot.h | 150 + .../Class/MSC/Inc/usbd_msc_data.h | 103 + .../Class/MSC/Inc/usbd_msc_scsi.h | 192 + .../Class/MSC/Inc/usbd_msc_storage_template.h | 97 + .../Class/MSC/Src/usbd_msc.c | 608 + .../Class/MSC/Src/usbd_msc_bot.c | 387 + .../Class/MSC/Src/usbd_msc_data.c | 135 + .../Class/MSC/Src/usbd_msc_scsi.c | 716 + .../Class/MSC/Src/usbd_msc_storage_template.c | 177 + .../Core/Inc/usbd_conf_template.h | 162 + .../Core/Inc/usbd_core.h | 112 +- .../Core/Inc/usbd_ctlreq.h | 105 + .../Core/Inc/usbd_def.h | 348 + .../Core/Inc/usbd_desc_template.h | 41 + .../Core/Inc/usbd_ioreq.h | 119 + .../Core/Src/usbd_conf_template.c | 63 +- .../Core/Src/usbd_core.c | 611 + .../Core/Src/usbd_ctlreq.c | 918 + .../Core/Src/usbd_desc_template.c | 277 + .../Core/Src/usbd_ioreq.c | 132 +- .../Class/MSC/Inc/usbh_msc.h | 136 +- .../Class/MSC/Inc/usbh_msc_bot.h | 155 +- .../Class/MSC/Inc/usbh_msc_scsi.h | 218 + .../Class/MSC/Src/usbh_msc.c | 858 + .../Class/MSC/Src/usbh_msc_bot.c | 700 + .../Class/MSC/Src/usbh_msc_scsi.c | 466 + .../Core/Inc/usbh_conf_template.h | 152 + .../Core/Inc/usbh_core.h | 192 + .../Core/Inc/usbh_ctlreq.h | 141 + .../Core/Inc/usbh_def.h | 496 + .../Core/Inc/usbh_ioreq.h | 160 + .../Core/Inc/usbh_pipes.h | 123 + .../Core/Src/usbh_conf_template.c | 315 + .../Core/Src/usbh_core.c | 1193 ++ .../Core/Src/usbh_ctlreq.c | 1003 + .../Core/Src/usbh_ioreq.c | 350 + .../Core/Src/usbh_pipes.c | 130 +- STM32CubeMX/revF/Src/dma.c | 109 + STM32CubeMX/{SCSI2SD-V6 => revF}/Src/fsmc.c | 113 +- STM32CubeMX/{SCSI2SD-V6 => revF}/Src/gpio.c | 129 +- STM32CubeMX/revF/Src/main.c | 203 + STM32CubeMX/{SCSI2SD-V6 => revF}/Src/sdio.c | 120 +- STM32CubeMX/revF/Src/spi.c | 111 + STM32CubeMX/revF/Src/stm32f2xx_hal_msp.c | 84 + .../{SCSI2SD-V6 => revF}/Src/stm32f2xx_it.c | 111 +- STM32CubeMX/revF/Src/sys.c | 37 + STM32CubeMX/revF/Src/system_stm32f2xx.c | 346 + STM32CubeMX/revF/Src/tim.c | 117 + STM32CubeMX/{SCSI2SD-V6 => revF}/Src/usart.c | 65 +- STM32CubeMX/revF/Src/usb_device.c | 102 + STM32CubeMX/revF/Src/usbd_conf.c | 639 + STM32CubeMX/revF/Src/usbd_desc.c | 395 + STM32CubeMX/revF/Src/usbd_storage_if.c | 273 + .../SCSI2SD-V6 Configuration/.cproject | 0 .../SCSI2SD-V6 Configuration/.project | 0 ...lic.truestudio.debug.hardware_device.prefs | 0 .../SCSI2SD-V6 Configuration.elf.launch | 0 .../STM32F205VC_FLASH.ld | 0 .../revF/TrueSTUDIO/revF/STM32F205VC_FLASH.ld | 189 + .../revF/TrueSTUDIO/revF/revF.elf.launch | 46 + .../revF/TrueSTUDIO/startup_stm32f205xx.s | 492 + STM32CubeMX/revF/TrueSTUDIO/syscalls.c | 207 + .../SCSI2SD-V6.ioc => revF/revF.ioc} | 267 +- 693 files changed, 264818 insertions(+), 111667 deletions(-) delete mode 100644 Makefile create mode 100644 Makefile.revF delete mode 100755 STM32CubeMX/SCSI2SD-V6/.mxproject delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Include/stm32f205xx.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Include/stm32f207xx.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Include/stm32f215xx.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Include/stm32f217xx.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Include/core_cm0.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Include/core_cm0plus.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Include/core_sc000.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_crc.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_cryp.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_dac.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_dac_ex.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_hash.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_hcd.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_i2c.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_i2s.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_irda.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_iwdg.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_nand.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_pcd.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_pcd_ex.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_sd.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_smartcard.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_spi.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_sram.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_tim.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_tim_ex.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_usart.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_wwdg.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_sdmmc.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_usb.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_can.c delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_crc.c delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_cryp.c delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_dac.c delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_dcmi.c delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_hash.c delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_hcd.c delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_i2c.c delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_i2s.c delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_irda.c delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_iwdg.c delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_msp_template.c delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_nand.c delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_nor.c delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_pcd.c delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_rng.c delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_sd.c delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_smartcard.c delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_spi.c delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_sram.c delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_tim.c delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_uart.c delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_usart.c delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_wwdg.c delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_fsmc.c delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_sdmmc.c delete mode 100755 STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_usb.c delete mode 100755 STM32CubeMX/SCSI2SD-V6/Inc/bsp_driver_sd.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Inc/ffconf.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Inc/fsmc.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Inc/gpio.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Inc/sdio.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Inc/spi.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Inc/stm32f2xx_hal_conf.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Inc/stm32f2xx_it.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Inc/usart.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Inc/usb_device.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Inc/usb_host.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Inc/usbd_conf.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Inc/usbd_desc.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Inc/usbh_conf.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_conf_template.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_def.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ioreq.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c delete mode 100755 STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c delete mode 100755 STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Inc/usbh_msc_scsi.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Src/usbh_msc.c delete mode 100755 STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Src/usbh_msc_bot.c delete mode 100755 STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Src/usbh_msc_scsi.c delete mode 100755 STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_conf_template.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_core.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_ctlreq.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_def.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_ioreq.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_pipes.h delete mode 100755 STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_conf_template.c delete mode 100755 STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_core.c delete mode 100755 STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_ctlreq.c delete mode 100755 STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_ioreq.c delete mode 100755 STM32CubeMX/SCSI2SD-V6/Src/bsp_driver_sd.c delete mode 100755 STM32CubeMX/SCSI2SD-V6/Src/main.c delete mode 100755 STM32CubeMX/SCSI2SD-V6/Src/spi.c delete mode 100755 STM32CubeMX/SCSI2SD-V6/Src/stm32f2xx_hal_msp.c delete mode 100755 STM32CubeMX/SCSI2SD-V6/Src/usb_device.c delete mode 100755 STM32CubeMX/SCSI2SD-V6/Src/usb_host.c delete mode 100755 STM32CubeMX/SCSI2SD-V6/Src/usbd_conf.c delete mode 100755 STM32CubeMX/SCSI2SD-V6/Src/usbd_desc.c delete mode 100755 STM32CubeMX/SCSI2SD-V6/Src/usbh_conf.c delete mode 100644 STM32CubeMX/readme.txt create mode 100644 STM32CubeMX/revF/.mxproject create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Core/Include/cmsis_armcc.h create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Core/Include/cmsis_armclang.h create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Core/Include/cmsis_compiler.h create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Core/Include/cmsis_gcc.h create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Core/Include/cmsis_iccarm.h create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Core/Include/cmsis_version.h create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Core/Include/core_armv8mbl.h create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Core/Include/core_armv8mml.h create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Core/Include/core_cm0.h create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Core/Include/core_cm0plus.h create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Core/Include/core_cm1.h create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Core/Include/core_cm23.h rename STM32CubeMX/{SCSI2SD-V6/Drivers/CMSIS => revF/Drivers/CMSIS/Core}/Include/core_cm3.h (51%) mode change 100755 => 100644 create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Core/Include/core_cm33.h rename STM32CubeMX/{SCSI2SD-V6/Drivers/CMSIS => revF/Drivers/CMSIS/Core}/Include/core_cm4.h (51%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6/Drivers/CMSIS => revF/Drivers/CMSIS/Core}/Include/core_cm7.h (50%) mode change 100755 => 100644 create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Core/Include/core_sc000.h rename STM32CubeMX/{SCSI2SD-V6/Drivers/CMSIS => revF/Drivers/CMSIS/Core}/Include/core_sc300.h (51%) mode change 100755 => 100644 create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Core/Include/mpu_armv7.h create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Core/Include/mpu_armv8.h create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Core/Include/tz_context.h create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Core/Template/ARMv8-M/main_s.c create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Core/Template/ARMv8-M/tz_context.c create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Core_A/Include/cmsis_armcc.h create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Core_A/Include/cmsis_armclang.h create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Core_A/Include/cmsis_compiler.h create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Core_A/Include/cmsis_cp15.h create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Core_A/Include/cmsis_gcc.h create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Core_A/Include/cmsis_iccarm.h create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Core_A/Include/core_ca.h create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Core_A/Include/irq_ctrl.h create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Core_A/Source/irq_ctrl_gic.c rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_abs_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_abs_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_abs_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_abs_q7.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_add_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_add_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_add_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_add_q7.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_q7.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_mult_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_mult_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_mult_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_mult_q7.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_negate_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_negate_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_negate_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_negate_q7.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_offset_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_offset_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_offset_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_offset_q7.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_scale_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_scale_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_scale_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_scale_q7.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_shift_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_shift_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_shift_q7.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_sub_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_sub_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_sub_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_sub_q7.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/CommonTables/arm_common_tables.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/CommonTables/arm_const_structs.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_conj_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_conj_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_conj_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_dot_prod_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_dot_prod_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_dot_prod_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_squared_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_squared_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_squared_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_real_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_real_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_real_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_init_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_init_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_init_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_reset_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_reset_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_reset_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_sin_cos_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_sin_cos_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_cos_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_cos_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_cos_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sin_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sin_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sin_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sqrt_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sqrt_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_32x64_init_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_32x64_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_fast_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_fast_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_init_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_init_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_init_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_f64.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_init_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_init_f64.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_stereo_df2T_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_stereo_df2T_init_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_fast_opt_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_fast_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_fast_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_opt_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_opt_q7.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_fast_opt_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_fast_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_fast_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_opt_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_opt_q7.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_q7.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_q7.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_fast_opt_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_fast_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_fast_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_opt_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_opt_q7.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_q7.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_fast_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_fast_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_init_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_init_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_init_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_fast_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_fast_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_init_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_init_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_init_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_init_q7.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_init_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_init_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_init_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_init_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_init_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_init_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_q7.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_q7.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_q7.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_init_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_init_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_init_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_init_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_init_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_init_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_init_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_init_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_init_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_add_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_add_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_add_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_cmplx_mult_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_cmplx_mult_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_cmplx_mult_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_init_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_init_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_init_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_inverse_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_inverse_f64.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_fast_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_fast_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_scale_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_scale_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_scale_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_sub_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_sub_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_sub_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_trans_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_trans_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_trans_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_max_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_max_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_max_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_max_q7.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_mean_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_mean_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_mean_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_mean_q7.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_min_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_min_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_min_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_min_q7.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_power_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_power_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_power_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_power_q7.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_rms_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_rms_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_rms_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_std_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_std_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_std_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_var_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_var_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_var_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_copy_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_copy_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_copy_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_copy_q7.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_fill_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_fill_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_fill_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_fill_q7.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_float_to_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_float_to_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_float_to_q7.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q15_to_float.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q15_to_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q15_to_q7.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q31_to_float.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q31_to_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q31_to_q7.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q7_to_float.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q7_to_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q7_to_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_bitreversal.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_init_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_init_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_init_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_init_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_init_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_init_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix8_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_init_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_init_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_init_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_fast_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_fast_init_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_init_f32.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_init_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_init_q31.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_q15.c (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_q31.c (100%) mode change 100755 => 100644 create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Include/stm32f205xx.h create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Include/stm32f207xx.h create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Include/stm32f215xx.h create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Include/stm32f217xx.h rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/Device/ST/STM32F2xx/Include/stm32f2xx.h (63%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/Device/ST/STM32F2xx/Include/system_stm32f2xx.h (50%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/arm/startup_stm32f205xx.s (91%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/arm/startup_stm32f207xx.s (91%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/arm/startup_stm32f215xx.s (91%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/arm/startup_stm32f217xx.s (91%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/gcc/startup_stm32f205xx.s (91%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/gcc/startup_stm32f207xx.s (91%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/gcc/startup_stm32f215xx.s (91%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/gcc/startup_stm32f217xx.s (91%) mode change 100755 => 100644 create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/linker/stm32f205xx_flash.icf create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/linker/stm32f205xx_sram.icf create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/linker/stm32f207xx_flash.icf create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/linker/stm32f207xx_sram.icf create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/linker/stm32f215xx_flash.icf create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/linker/stm32f215xx_sram.icf create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/linker/stm32f217xx_flash.icf create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/linker/stm32f217xx_sram.icf rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/startup_stm32f205xx.s (92%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/startup_stm32f207xx.s (92%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/startup_stm32f215xx.s (92%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/startup_stm32f217xx.s (92%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/system_stm32f2xx.c (83%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/Include/arm_common_tables.h (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/Include/arm_const_structs.h (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/Include/arm_math.h (100%) mode change 100755 => 100644 create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Include/cmsis_armcc.h create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Include/cmsis_armclang.h create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Include/cmsis_compiler.h create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Include/cmsis_gcc.h create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Include/cmsis_iccarm.h create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Include/cmsis_version.h create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Include/core_armv8mbl.h create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Include/core_armv8mml.h create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Include/core_cm0.h create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Include/core_cm0plus.h create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Include/core_cm1.h create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Include/core_cm23.h create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Include/core_cm3.h create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Include/core_cm33.h create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Include/core_cm4.h create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Include/core_cm7.h rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/Include/core_cmFunc.h (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/Include/core_cmInstr.h (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/Include/core_cmSimd.h (100%) mode change 100755 => 100644 create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Include/core_sc000.h create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Include/core_sc300.h create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Include/mpu_armv7.h create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Include/mpu_armv8.h create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Include/tz_context.h create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Lib/ARM/arm_cortexM3b_math.lib create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Lib/ARM/arm_cortexM3l_math.lib create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Lib/GCC/libarm_cortexM3l_math.a create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Lib/IAR/iar_cortexM3b_math.a create mode 100644 STM32CubeMX/revF/Drivers/CMSIS/Lib/IAR/iar_cortexM3l_math.a rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/CMSIS/RTOS/Template/cmsis_os.h (93%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/STM32F2xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h (74%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_can.h => revF/Drivers/STM32F2xx_HAL_Driver/Inc/Legacy/stm32f2xx_hal_can_legacy.h} (70%) mode change 100755 => 100644 create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc/stm32_assert_template.h rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal.h (83%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_adc.h (80%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_adc_ex.h (88%) mode change 100755 => 100644 create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_can.h rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_conf_template.h (59%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_cortex.h (66%) mode change 100755 => 100644 create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_crc.h create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_cryp.h create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_dac.h create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_dac_ex.h rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_dcmi.h (55%) mode change 100755 => 100644 create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_dcmi_ex.h rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_def.h (62%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_dma.h (79%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_dma_ex.h (57%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_eth.h (56%) mode change 100755 => 100644 create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_exti.h rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_flash.h (72%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_flash_ex.h (65%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_gpio.h (66%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_gpio_ex.h (82%) mode change 100755 => 100644 create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_hash.h create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_hcd.h create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_i2c.h create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_i2s.h create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_irda.h create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_iwdg.h create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_mmc.h create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_nand.h rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_nor.h (51%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_pccard.h (64%) mode change 100755 => 100644 create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_pcd.h create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_pcd_ex.h rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_pwr.h (78%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_pwr_ex.h (52%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_rcc.h (75%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_rcc_ex.h (78%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_rng.h (50%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_rtc.h (66%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_rtc_ex.h (71%) mode change 100755 => 100644 create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_sd.h create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_smartcard.h create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_spi.h create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_sram.h create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_tim.h create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_tim_ex.h rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_uart.h (54%) mode change 100755 => 100644 create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_usart.h create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_wwdg.h create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_adc.h create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_bus.h create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_cortex.h create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_crc.h create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_dac.h create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_dma.h create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_exti.h rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_fsmc.h (66%) mode change 100755 => 100644 create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_gpio.h create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_i2c.h create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_iwdg.h create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_pwr.h create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_rcc.h create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_rng.h create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_rtc.h create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_sdmmc.h create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_spi.h create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_system.h create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_tim.h create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_usart.h create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_usb.h create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_utils.h create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_wwdg.h rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal.c (79%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_adc.c (74%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_adc_ex.c (90%) mode change 100755 => 100644 create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_can.c rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_cortex.c (86%) mode change 100755 => 100644 create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_crc.c create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_cryp.c create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_dac.c rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_dac_ex.c (52%) mode change 100755 => 100644 create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_dcmi.c create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_dcmi_ex.c rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_dma.c (50%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_dma_ex.c (51%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_eth.c (57%) mode change 100755 => 100644 create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_exti.c rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_flash.c (85%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_flash_ex.c (86%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_gpio.c (70%) mode change 100755 => 100644 create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_hash.c create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_hcd.c create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_i2c.c create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_i2s.c create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_irda.c create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_iwdg.c create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_mmc.c create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_msp_template.c create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_nand.c create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_nor.c rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_pccard.c (55%) mode change 100755 => 100644 create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_pcd.c rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_pcd_ex.c (57%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_pwr.c (88%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_pwr_ex.c (73%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_rcc.c (69%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_rcc_ex.c (75%) mode change 100755 => 100644 create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_rng.c rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_rtc.c (56%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_rtc_ex.c (63%) mode change 100755 => 100644 create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_sd.c create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_smartcard.c create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_spi.c create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_sram.c create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_tim.c rename STM32CubeMX/{SCSI2SD-V6 => revF}/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_tim_ex.c (59%) mode change 100755 => 100644 create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_timebase_rtc_alarm_template.c create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_timebase_rtc_wakeup_template.c create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_timebase_tim_template.c create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_uart.c create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_usart.c create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_wwdg.c create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_adc.c create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_crc.c create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_dac.c create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_dma.c create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_exti.c create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_fsmc.c create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_gpio.c create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_i2c.c create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_pwr.c create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_rcc.c create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_rng.c create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_rtc.c create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_sdmmc.c create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_spi.c create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_tim.c create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_usart.c create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_usb.c create mode 100644 STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_utils.c create mode 100644 STM32CubeMX/revF/Inc/dma.h create mode 100644 STM32CubeMX/revF/Inc/fsmc.h create mode 100644 STM32CubeMX/revF/Inc/gpio.h create mode 100644 STM32CubeMX/revF/Inc/main.h rename STM32CubeMX/{SCSI2SD-V6 => revF}/Inc/mxconstants.h (100%) mode change 100755 => 100644 create mode 100644 STM32CubeMX/revF/Inc/sdio.h create mode 100644 STM32CubeMX/revF/Inc/spi.h create mode 100644 STM32CubeMX/revF/Inc/stm32f2xx_hal_conf.h create mode 100644 STM32CubeMX/revF/Inc/stm32f2xx_it.h create mode 100644 STM32CubeMX/revF/Inc/sys.h create mode 100644 STM32CubeMX/revF/Inc/tim.h create mode 100644 STM32CubeMX/revF/Inc/usart.h create mode 100644 STM32CubeMX/revF/Inc/usb_device.h create mode 100644 STM32CubeMX/revF/Inc/usbd_conf.h create mode 100644 STM32CubeMX/revF/Inc/usbd_desc.h create mode 100644 STM32CubeMX/revF/Inc/usbd_storage_if.h create mode 100644 STM32CubeMX/revF/Middlewares/ST/STM32_USB_Device_Library/Class/HID/Inc/usbd_hid.h create mode 100644 STM32CubeMX/revF/Middlewares/ST/STM32_USB_Device_Library/Class/HID/Src/usbd_hid.c create mode 100644 STM32CubeMX/revF/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc.h create mode 100644 STM32CubeMX/revF/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc_bot.h create mode 100644 STM32CubeMX/revF/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc_data.h create mode 100644 STM32CubeMX/revF/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc_scsi.h create mode 100644 STM32CubeMX/revF/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc_storage_template.h create mode 100644 STM32CubeMX/revF/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc.c create mode 100644 STM32CubeMX/revF/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc_bot.c create mode 100644 STM32CubeMX/revF/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc_data.c create mode 100644 STM32CubeMX/revF/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc_scsi.c create mode 100644 STM32CubeMX/revF/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc_storage_template.c create mode 100644 STM32CubeMX/revF/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_conf_template.h rename STM32CubeMX/{SCSI2SD-V6 => revF}/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_core.h (53%) mode change 100755 => 100644 create mode 100644 STM32CubeMX/revF/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h create mode 100644 STM32CubeMX/revF/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_def.h create mode 100644 STM32CubeMX/revF/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_desc_template.h create mode 100644 STM32CubeMX/revF/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ioreq.h rename STM32CubeMX/{SCSI2SD-V6 => revF}/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_conf_template.c (74%) mode change 100755 => 100644 create mode 100644 STM32CubeMX/revF/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c create mode 100644 STM32CubeMX/revF/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c create mode 100644 STM32CubeMX/revF/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_desc_template.c rename STM32CubeMX/{SCSI2SD-V6 => revF}/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c (52%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Inc/usbh_msc.h (52%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Inc/usbh_msc_bot.h (54%) mode change 100755 => 100644 create mode 100644 STM32CubeMX/revF/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Inc/usbh_msc_scsi.h create mode 100644 STM32CubeMX/revF/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Src/usbh_msc.c create mode 100644 STM32CubeMX/revF/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Src/usbh_msc_bot.c create mode 100644 STM32CubeMX/revF/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Src/usbh_msc_scsi.c create mode 100644 STM32CubeMX/revF/Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_conf_template.h create mode 100644 STM32CubeMX/revF/Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_core.h create mode 100644 STM32CubeMX/revF/Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_ctlreq.h create mode 100644 STM32CubeMX/revF/Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_def.h create mode 100644 STM32CubeMX/revF/Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_ioreq.h create mode 100644 STM32CubeMX/revF/Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_pipes.h create mode 100644 STM32CubeMX/revF/Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_conf_template.c create mode 100644 STM32CubeMX/revF/Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_core.c create mode 100644 STM32CubeMX/revF/Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_ctlreq.c create mode 100644 STM32CubeMX/revF/Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_ioreq.c rename STM32CubeMX/{SCSI2SD-V6 => revF}/Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_pipes.c (51%) mode change 100755 => 100644 create mode 100644 STM32CubeMX/revF/Src/dma.c rename STM32CubeMX/{SCSI2SD-V6 => revF}/Src/fsmc.c (52%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/Src/gpio.c (61%) mode change 100755 => 100644 create mode 100644 STM32CubeMX/revF/Src/main.c rename STM32CubeMX/{SCSI2SD-V6 => revF}/Src/sdio.c (57%) mode change 100755 => 100644 create mode 100644 STM32CubeMX/revF/Src/spi.c create mode 100644 STM32CubeMX/revF/Src/stm32f2xx_hal_msp.c rename STM32CubeMX/{SCSI2SD-V6 => revF}/Src/stm32f2xx_it.c (54%) mode change 100755 => 100644 create mode 100644 STM32CubeMX/revF/Src/sys.c create mode 100644 STM32CubeMX/revF/Src/system_stm32f2xx.c create mode 100644 STM32CubeMX/revF/Src/tim.c rename STM32CubeMX/{SCSI2SD-V6 => revF}/Src/usart.c (50%) mode change 100755 => 100644 create mode 100644 STM32CubeMX/revF/Src/usb_device.c create mode 100644 STM32CubeMX/revF/Src/usbd_conf.c create mode 100644 STM32CubeMX/revF/Src/usbd_desc.c create mode 100644 STM32CubeMX/revF/Src/usbd_storage_if.c rename STM32CubeMX/{SCSI2SD-V6 => revF}/TrueSTUDIO/SCSI2SD-V6 Configuration/.cproject (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/TrueSTUDIO/SCSI2SD-V6 Configuration/.project (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/TrueSTUDIO/SCSI2SD-V6 Configuration/.settings/com.atollic.truestudio.debug.hardware_device.prefs (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/TrueSTUDIO/SCSI2SD-V6 Configuration/SCSI2SD-V6 Configuration.elf.launch (100%) mode change 100755 => 100644 rename STM32CubeMX/{SCSI2SD-V6 => revF}/TrueSTUDIO/SCSI2SD-V6 Configuration/STM32F205VC_FLASH.ld (100%) mode change 100755 => 100644 create mode 100644 STM32CubeMX/revF/TrueSTUDIO/revF/STM32F205VC_FLASH.ld create mode 100644 STM32CubeMX/revF/TrueSTUDIO/revF/revF.elf.launch create mode 100644 STM32CubeMX/revF/TrueSTUDIO/startup_stm32f205xx.s create mode 100644 STM32CubeMX/revF/TrueSTUDIO/syscalls.c rename STM32CubeMX/{SCSI2SD-V6/SCSI2SD-V6.ioc => revF/revF.ioc} (65%) mode change 100755 => 100644 diff --git a/Makefile b/Makefile deleted file mode 100644 index 021c52ad..00000000 --- a/Makefile +++ /dev/null @@ -1,198 +0,0 @@ -# Assume newlib gcc toolchain -ARMCC=arm-none-eabi-gcc -OBJCOPY=arm-none-eabi-objcopy - -CPPFLAGS=-DSTM32F205xx -DUSE_HAL_DRIVER -Wall -CFLAGS=-mcpu=cortex-m3 -mthumb -mslow-flash-data \ - -std=gnu11 \ - -specs=nosys.specs \ - -Os -g \ - -LDFLAGS= \ - "-Tsrc/firmware/link.ld" \ - -INCLUDE = -Iinclude - - -STM32CubeMX_INCUDE = \ - -ISTM32CubeMX/SCSI2SD-V6/Inc \ - -ISTM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Inc \ - -ISTM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Core/Inc \ - -ISTM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Include \ - -ISTM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Include \ - -ISTM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc \ - -ISTM32CubeMX/SCSI2SD-V6/Middlewares/Third_Party/FatFs/src/ \ - -ISTM32CubeMX/SCSI2SD-V6/Middlewares/Third_Party/FatFs/src/drivers \ - -ISTM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Device_Library/Core/Inc \ - -Isrc/firmware/usb_device \ - -all: build/firmware.dfu - -build/stm32cubemx/bsp_driver_sd.o: STM32CubeMX/SCSI2SD-V6/Src/bsp_driver_sd.c -build/stm32cubemx/fsmc.o: STM32CubeMX/SCSI2SD-V6/Src/fsmc.c -build/stm32cubemx/gpio.o: STM32CubeMX/SCSI2SD-V6/Src/gpio.c -build/stm32cubemx/main.o: STM32CubeMX/SCSI2SD-V6/Src/main.c -build/stm32cubemx/sdio.o: STM32CubeMX/SCSI2SD-V6/Src/sdio.c -build/stm32cubemx/spi.o: STM32CubeMX/SCSI2SD-V6/Src/spi.c -build/stm32cubemx/stm32f2xx_hal_msp.o: STM32CubeMX/SCSI2SD-V6/Src/stm32f2xx_hal_msp.c -build/stm32cubemx/stm32f2xx_it.o: STM32CubeMX/SCSI2SD-V6/Src/stm32f2xx_it.c -build/stm32cubemx/usart.o: STM32CubeMX/SCSI2SD-V6/Src/usart.c -build/stm32cubemx/usbd_conf.o: STM32CubeMX/SCSI2SD-V6/Src/usbd_conf.c -build/stm32cubemx/usbh_conf.o: STM32CubeMX/SCSI2SD-V6/Src/usbh_conf.c -build/stm32cubemx/usb_host.o: STM32CubeMX/SCSI2SD-V6/Src/usb_host.c -build/stm32cubemx/stm32f2xx_hal.o: STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal.c -build/stm32cubemx/stm32f2xx_hal_cortex.o: STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_cortex.c -build/stm32cubemx/stm32f2xx_hal_dma.o: STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_dma.c -build/stm32cubemx/stm32f2xx_hal_flash.o: STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_flash.c -build/stm32cubemx/stm32f2xx_hal_flash_ex.o: STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_flash_ex.c -build/stm32cubemx/stm32f2xx_hal_gpio.o: STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_gpio.c -build/stm32cubemx/stm32f2xx_hal_hcd.o: STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_hcd.c -build/stm32cubemx/stm32f2xx_hal_pcd.o: STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_pcd.c -build/stm32cubemx/stm32f2xx_hal_pcd_ex.o: STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_pcd_ex.c -build/stm32cubemx/stm32f2xx_hal_rcc.o: STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_rcc.c -build/stm32cubemx/stm32f2xx_hal_sd.o: STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_sd.c -build/stm32cubemx/stm32f2xx_hal_spi.o: STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_spi.c -build/stm32cubemx/stm32f2xx_hal_sram.o: STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_sram.c -build/stm32cubemx/stm32f2xx_hal_tim.o: STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_tim.c -build/stm32cubemx/stm32f2xx_hal_tim_ex.o: STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_tim_ex.c -build/stm32cubemx/stm32f2xx_hal_uart.o: STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_uart.c -build/stm32cubemx/stm32f2xx_ll_fsmc.o: STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_fsmc.c -build/stm32cubemx/stm32f2xx_ll_sdmmc.o: STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_sdmmc.c -build/stm32cubemx/stm32f2xx_ll_usb.o: STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_usb.c -build/stm32cubemx/usbd_core.o: STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c -build/stm32cubemx/usbd_ctlreq.o: STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c -build/stm32cubemx/usbd_ioreq.o: STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c -build/stm32cubemx/usbh_core.o: STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_core.c -build/stm32cubemx/usbh_ctlreq.o: STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_ctlreq.c -build/stm32cubemx/usbh_ioreq.o: STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_ioreq.c -build/stm32cubemx/usbh_pipes.o: STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_pipes.c -build/stm32cubemx/usbh_msc.o: STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Src/usbh_msc.c -build/stm32cubemx/usbh_msc_bot.o: STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Src/usbh_msc_bot.c -build/stm32cubemx/usbh_msc_scsi.o: STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Src/usbh_msc_scsi.c -build/stm32cubemx/system_stm32f2xx.o: STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/system_stm32f2xx.c -build/stm32cubemx/startup_stm32f205xx.o: STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/gcc/startup_stm32f205xx.s - -STM32OBJS = \ - build/stm32cubemx/bsp_driver_sd.o \ - build/stm32cubemx/fsmc.o \ - build/stm32cubemx/gpio.o \ - build/stm32cubemx/main.o \ - build/stm32cubemx/sdio.o \ - build/stm32cubemx/spi.o \ - build/stm32cubemx/stm32f2xx_hal_msp.o \ - build/stm32cubemx/stm32f2xx_it.o \ - build/stm32cubemx/usart.o \ - build/stm32cubemx/usbd_conf.o \ - build/stm32cubemx/usbh_conf.o \ - build/stm32cubemx/usb_host.o \ - build/stm32cubemx/stm32f2xx_hal.o \ - build/stm32cubemx/stm32f2xx_hal_cortex.o \ - build/stm32cubemx/stm32f2xx_hal_dma.o \ - build/stm32cubemx/stm32f2xx_hal_flash.o \ - build/stm32cubemx/stm32f2xx_hal_flash_ex.o \ - build/stm32cubemx/stm32f2xx_hal_gpio.o \ - build/stm32cubemx/stm32f2xx_hal_hcd.o \ - build/stm32cubemx/stm32f2xx_hal_pcd.o \ - build/stm32cubemx/stm32f2xx_hal_pcd_ex.o \ - build/stm32cubemx/stm32f2xx_hal_rcc.o \ - build/stm32cubemx/stm32f2xx_hal_sd.o \ - build/stm32cubemx/stm32f2xx_hal_spi.o \ - build/stm32cubemx/stm32f2xx_hal_sram.o \ - build/stm32cubemx/stm32f2xx_hal_tim.o \ - build/stm32cubemx/stm32f2xx_hal_tim_ex.o \ - build/stm32cubemx/stm32f2xx_hal_uart.o \ - build/stm32cubemx/stm32f2xx_ll_fsmc.o \ - build/stm32cubemx/stm32f2xx_ll_sdmmc.o \ - build/stm32cubemx/stm32f2xx_ll_usb.o \ - build/stm32cubemx/usbd_core.o \ - build/stm32cubemx/usbd_ctlreq.o \ - build/stm32cubemx/usbd_ioreq.o \ - build/stm32cubemx/usbh_core.o \ - build/stm32cubemx/usbh_ctlreq.o \ - build/stm32cubemx/usbh_ioreq.o \ - build/stm32cubemx/usbh_pipes.o \ - build/stm32cubemx/usbh_msc.o \ - build/stm32cubemx/usbh_msc_bot.o \ - build/stm32cubemx/usbh_msc_scsi.o \ - build/stm32cubemx/system_stm32f2xx.o \ - build/stm32cubemx/startup_stm32f205xx.o \ - -# Modified versin from stm32cubemx for a composite class with both -# mass-storage and HID interfaces -USBCOMPOSITE_SRC= \ - src/firmware/usb_device/usb_device.c \ - src/firmware/usb_device/usbd_composite.c \ - src/firmware/usb_device/usbd_desc.c \ - src/firmware/usb_device/usbd_hid.c \ - src/firmware/usb_device/usbd_msc_bot.c \ - src/firmware/usb_device/usbd_msc.c \ - src/firmware/usb_device/usbd_msc_data.c \ - src/firmware/usb_device/usbd_msc_scsi.c \ - src/firmware/usb_device/usbd_msc_storage_sd.c \ - -SRC = \ - src/firmware/bootloader.c \ - src/firmware/bsp.c \ - src/firmware/cdrom.c \ - src/firmware/config.c \ - src/firmware/disk.c \ - src/firmware/diagnostic.c \ - src/firmware/fpga.c \ - src/firmware/geometry.c \ - src/firmware/hidpacket.c \ - src/firmware/hwversion.c \ - src/firmware/inquiry.c \ - src/firmware/led.c \ - src/firmware/main.c \ - src/firmware/mo.c \ - src/firmware/mode.c \ - src/firmware/scsiPhy.c \ - src/firmware/scsi.c \ - src/firmware/sd.c \ - src/firmware/spinlock.c \ - src/firmware/tape.c \ - src/firmware/time.c \ - src/firmware/vendor.c \ - ${USBCOMPOSITE_SRC} - -build/firmware.elf: $(SRC) rtl/fpga_bitmap.o $(STM32OBJS) - $(ARMCC) $(CPPFLAGS) $(CFLAGS) -o $@ $(STM32CubeMX_INCUDE) $(INCLUDE) $^ $(LDFLAGS) - @EBSS=`arm-none-eabi-nm build/firmware.elf | grep _ebss | cut -f1 "-d "`; \ - echo HEAPSIZE = $$((0x2001C000 - 0x$${EBSS})) bytes - @echo STACKSIZE = 16384 bytes - - -build/firmware.bin: build/firmware.elf - $(OBJCOPY) -O binary $< $@ - -# Example to hard-code config within firmware -#sudo arm-none-eabi-objcopy --update-section .fixed_config=config.dat firmware.elf -O binary firmware.bin - -build/stm32cubemx/%.o: - mkdir -p build/stm32cubemx - $(ARMCC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $(STM32CubeMX_INCUDE) $(INCLUDE) $^ - - -build/stm32cubemx/stm32f2xx_it.o: - mkdir -p build/stm32cubemx - $(ARMCC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $(STM32CubeMX_INCUDE) $(INCLUDE) $^ - $(OBJCOPY) -N EXTI4_IRQHandler $@ - -build/stm32cubemx/system_stm32f2xx.o: - mkdir -p build/stm32cubemx - $(ARMCC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $(STM32CubeMX_INCUDE) $(INCLUDE) $^ - $(OBJCOPY) --redefine-sym SystemInit=OrigSystemInit $@ - -build/scsiPhy.s: src/firmware/scsiPhy.c - $(ARMCC) $(CPPFLAGS) $(CFLAGS) -S -o $@ $(STM32CubeMX_INCUDE) $(INCLUDE) $^ - - -build/firmware.dfu: build/firmware.bin - python tools/dfu-convert.py -b 0x08000000:$< $@ - -clean: - rm -f build/firmware.elf build/firmware.bin - -program: - dfu-util --download build/firmware.dfu --alt 0 - diff --git a/Makefile.revF b/Makefile.revF new file mode 100644 index 00000000..4099808b --- /dev/null +++ b/Makefile.revF @@ -0,0 +1,198 @@ +# Assume newlib gcc toolchain +ARMCC=arm-none-eabi-gcc +OBJCOPY=arm-none-eabi-objcopy + +CPPFLAGS=-DSTM32F2xx -DSTM32F205xx -DUSE_HAL_DRIVER -Wall +CFLAGS=-mcpu=cortex-m3 -mthumb -mslow-flash-data \ + -std=gnu11 \ + -specs=nosys.specs \ + -Os -g \ + +LDFLAGS= \ + "-Tsrc/firmware/link.ld" \ + +INCLUDE = -Iinclude + + +STM32CubeMX_INCUDE = \ + -ISTM32CubeMX/revF/Inc \ + -ISTM32CubeMX/revF/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Inc \ + -ISTM32CubeMX/revF/Middlewares/ST/STM32_USB_Host_Library/Core/Inc \ + -ISTM32CubeMX/revF/Drivers/CMSIS/Include \ + -ISTM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Include \ + -ISTM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Inc \ + -ISTM32CubeMX/revF/Middlewares/Third_Party/FatFs/src/ \ + -ISTM32CubeMX/revF/Middlewares/Third_Party/FatFs/src/drivers \ + -ISTM32CubeMX/revF/Middlewares/ST/STM32_USB_Device_Library/Core/Inc \ + -Isrc/firmware/usb_device \ + +all: build/firmware.dfu + +build/stm32cubemx/bsp_driver_sd.o: STM32CubeMX/revF/Src/bsp_driver_sd.c +build/stm32cubemx/fsmc.o: STM32CubeMX/revF/Src/fsmc.c +build/stm32cubemx/gpio.o: STM32CubeMX/revF/Src/gpio.c +build/stm32cubemx/main.o: STM32CubeMX/revF/Src/main.c +build/stm32cubemx/sdio.o: STM32CubeMX/revF/Src/sdio.c +build/stm32cubemx/spi.o: STM32CubeMX/revF/Src/spi.c +build/stm32cubemx/stm32f2xx_hal_msp.o: STM32CubeMX/revF/Src/stm32f2xx_hal_msp.c +build/stm32cubemx/stm32f2xx_it.o: STM32CubeMX/revF/Src/stm32f2xx_it.c +build/stm32cubemx/usart.o: STM32CubeMX/revF/Src/usart.c +build/stm32cubemx/usbd_conf.o: STM32CubeMX/revF/Src/usbd_conf.c +build/stm32cubemx/usbh_conf.o: STM32CubeMX/revF/Src/usbh_conf.c +build/stm32cubemx/usb_host.o: STM32CubeMX/revF/Src/usb_host.c +build/stm32cubemx/stm32f2xx_hal.o: STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal.c +build/stm32cubemx/stm32f2xx_hal_cortex.o: STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_cortex.c +build/stm32cubemx/stm32f2xx_hal_dma.o: STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_dma.c +build/stm32cubemx/stm32f2xx_hal_flash.o: STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_flash.c +build/stm32cubemx/stm32f2xx_hal_flash_ex.o: STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_flash_ex.c +build/stm32cubemx/stm32f2xx_hal_gpio.o: STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_gpio.c +build/stm32cubemx/stm32f2xx_hal_hcd.o: STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_hcd.c +build/stm32cubemx/stm32f2xx_hal_pcd.o: STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_pcd.c +build/stm32cubemx/stm32f2xx_hal_pcd_ex.o: STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_pcd_ex.c +build/stm32cubemx/stm32f2xx_hal_rcc.o: STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_rcc.c +build/stm32cubemx/stm32f2xx_hal_sd.o: STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_sd.c +build/stm32cubemx/stm32f2xx_hal_spi.o: STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_spi.c +build/stm32cubemx/stm32f2xx_hal_sram.o: STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_sram.c +build/stm32cubemx/stm32f2xx_hal_tim.o: STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_tim.c +build/stm32cubemx/stm32f2xx_hal_tim_ex.o: STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_tim_ex.c +build/stm32cubemx/stm32f2xx_hal_uart.o: STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_uart.c +build/stm32cubemx/stm32f2xx_ll_fsmc.o: STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_fsmc.c +build/stm32cubemx/stm32f2xx_ll_sdmmc.o: STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_sdmmc.c +build/stm32cubemx/stm32f2xx_ll_usb.o: STM32CubeMX/revF/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_usb.c +build/stm32cubemx/usbd_core.o: STM32CubeMX/revF/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c +build/stm32cubemx/usbd_ctlreq.o: STM32CubeMX/revF/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c +build/stm32cubemx/usbd_ioreq.o: STM32CubeMX/revF/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c +build/stm32cubemx/usbh_core.o: STM32CubeMX/revF/Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_core.c +build/stm32cubemx/usbh_ctlreq.o: STM32CubeMX/revF/Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_ctlreq.c +build/stm32cubemx/usbh_ioreq.o: STM32CubeMX/revF/Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_ioreq.c +build/stm32cubemx/usbh_pipes.o: STM32CubeMX/revF/Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_pipes.c +build/stm32cubemx/usbh_msc.o: STM32CubeMX/revF/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Src/usbh_msc.c +build/stm32cubemx/usbh_msc_bot.o: STM32CubeMX/revF/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Src/usbh_msc_bot.c +build/stm32cubemx/usbh_msc_scsi.o: STM32CubeMX/revF/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Src/usbh_msc_scsi.c +build/stm32cubemx/system_stm32f2xx.o: STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/system_stm32f2xx.c +build/stm32cubemx/startup_stm32f205xx.o: STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/gcc/startup_stm32f205xx.s + +STM32OBJS = \ + build/stm32cubemx/bsp_driver_sd.o \ + build/stm32cubemx/fsmc.o \ + build/stm32cubemx/gpio.o \ + build/stm32cubemx/main.o \ + build/stm32cubemx/sdio.o \ + build/stm32cubemx/spi.o \ + build/stm32cubemx/stm32f2xx_hal_msp.o \ + build/stm32cubemx/stm32f2xx_it.o \ + build/stm32cubemx/usart.o \ + build/stm32cubemx/usbd_conf.o \ + build/stm32cubemx/usbh_conf.o \ + build/stm32cubemx/usb_host.o \ + build/stm32cubemx/stm32f2xx_hal.o \ + build/stm32cubemx/stm32f2xx_hal_cortex.o \ + build/stm32cubemx/stm32f2xx_hal_dma.o \ + build/stm32cubemx/stm32f2xx_hal_flash.o \ + build/stm32cubemx/stm32f2xx_hal_flash_ex.o \ + build/stm32cubemx/stm32f2xx_hal_gpio.o \ + build/stm32cubemx/stm32f2xx_hal_hcd.o \ + build/stm32cubemx/stm32f2xx_hal_pcd.o \ + build/stm32cubemx/stm32f2xx_hal_pcd_ex.o \ + build/stm32cubemx/stm32f2xx_hal_rcc.o \ + build/stm32cubemx/stm32f2xx_hal_sd.o \ + build/stm32cubemx/stm32f2xx_hal_spi.o \ + build/stm32cubemx/stm32f2xx_hal_sram.o \ + build/stm32cubemx/stm32f2xx_hal_tim.o \ + build/stm32cubemx/stm32f2xx_hal_tim_ex.o \ + build/stm32cubemx/stm32f2xx_hal_uart.o \ + build/stm32cubemx/stm32f2xx_ll_fsmc.o \ + build/stm32cubemx/stm32f2xx_ll_sdmmc.o \ + build/stm32cubemx/stm32f2xx_ll_usb.o \ + build/stm32cubemx/usbd_core.o \ + build/stm32cubemx/usbd_ctlreq.o \ + build/stm32cubemx/usbd_ioreq.o \ + build/stm32cubemx/usbh_core.o \ + build/stm32cubemx/usbh_ctlreq.o \ + build/stm32cubemx/usbh_ioreq.o \ + build/stm32cubemx/usbh_pipes.o \ + build/stm32cubemx/usbh_msc.o \ + build/stm32cubemx/usbh_msc_bot.o \ + build/stm32cubemx/usbh_msc_scsi.o \ + build/stm32cubemx/system_stm32f2xx.o \ + build/stm32cubemx/startup_stm32f205xx.o \ + +# Modified versin from stm32cubemx for a composite class with both +# mass-storage and HID interfaces +USBCOMPOSITE_SRC= \ + src/firmware/usb_device/usb_device.c \ + src/firmware/usb_device/usbd_composite.c \ + src/firmware/usb_device/usbd_desc.c \ + src/firmware/usb_device/usbd_hid.c \ + src/firmware/usb_device/usbd_msc_bot.c \ + src/firmware/usb_device/usbd_msc.c \ + src/firmware/usb_device/usbd_msc_data.c \ + src/firmware/usb_device/usbd_msc_scsi.c \ + src/firmware/usb_device/usbd_msc_storage_sd.c \ + +SRC = \ + src/firmware/bootloader.c \ + src/firmware/bsp.c \ + src/firmware/cdrom.c \ + src/firmware/config.c \ + src/firmware/disk.c \ + src/firmware/diagnostic.c \ + src/firmware/fpga.c \ + src/firmware/geometry.c \ + src/firmware/hidpacket.c \ + src/firmware/hwversion.c \ + src/firmware/inquiry.c \ + src/firmware/led.c \ + src/firmware/main.c \ + src/firmware/mo.c \ + src/firmware/mode.c \ + src/firmware/scsiPhy.c \ + src/firmware/scsi.c \ + src/firmware/sd.c \ + src/firmware/spinlock.c \ + src/firmware/tape.c \ + src/firmware/time.c \ + src/firmware/vendor.c \ + ${USBCOMPOSITE_SRC} + +build/firmware.elf: $(SRC) rtl/fpga_bitmap.o $(STM32OBJS) + $(ARMCC) $(CPPFLAGS) $(CFLAGS) -o $@ $(STM32CubeMX_INCUDE) $(INCLUDE) $^ $(LDFLAGS) + @EBSS=`arm-none-eabi-nm build/firmware.elf | grep _ebss | cut -f1 "-d "`; \ + echo HEAPSIZE = $$((0x2001C000 - 0x$${EBSS})) bytes + @echo STACKSIZE = 16384 bytes + + +build/firmware.bin: build/firmware.elf + $(OBJCOPY) -O binary $< $@ + +# Example to hard-code config within firmware +#sudo arm-none-eabi-objcopy --update-section .fixed_config=config.dat firmware.elf -O binary firmware.bin + +build/stm32cubemx/%.o: + mkdir -p build/stm32cubemx + $(ARMCC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $(STM32CubeMX_INCUDE) $(INCLUDE) $^ + + +build/stm32cubemx/stm32f2xx_it.o: + mkdir -p build/stm32cubemx + $(ARMCC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $(STM32CubeMX_INCUDE) $(INCLUDE) $^ + $(OBJCOPY) -N EXTI4_IRQHandler $@ + +build/stm32cubemx/system_stm32f2xx.o: + mkdir -p build/stm32cubemx + $(ARMCC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $(STM32CubeMX_INCUDE) $(INCLUDE) $^ + $(OBJCOPY) --redefine-sym SystemInit=OrigSystemInit $@ + +build/scsiPhy.s: src/firmware/scsiPhy.c + $(ARMCC) $(CPPFLAGS) $(CFLAGS) -S -o $@ $(STM32CubeMX_INCUDE) $(INCLUDE) $^ + + +build/firmware.dfu: build/firmware.bin + python tools/dfu-convert.py -b 0x08000000:$< $@ + +clean: + rm -f build/firmware.elf build/firmware.bin + +program: + dfu-util --download build/firmware.dfu --alt 0 + diff --git a/STM32CubeMX/SCSI2SD-V6/.mxproject b/STM32CubeMX/SCSI2SD-V6/.mxproject deleted file mode 100755 index 86661c5d..00000000 --- a/STM32CubeMX/SCSI2SD-V6/.mxproject +++ /dev/null @@ -1,13 +0,0 @@ -[PreviousGenFiles] -HeaderPath=Z:/projects/SCSI2SD/git-v6/STM32CubeMX/SCSI2SD-V6/Inc -SourcePath=Z:/projects/SCSI2SD/git-v6/STM32CubeMX/SCSI2SD-V6/Src -SourceFiles=gpio.h;dma.h;ffconf.h;bsp_driver_sd.h;fatfs.h;fsmc.h;sdio.h;spi.h;tim.h;usart.h;usb_device.h;usbd_conf.h;usbd_desc.h;usbd_storage_if.h;usb_host.h;usbh_conf.h;stm32f2xx_it.h;stm32f2xx_hal_conf.h;mxconstants.h;gpio.c;dma.c;bsp_driver_sd.c;fatfs.c;fsmc.c;sdio.c;spi.c;tim.c;usart.c;usb_device.c;usbd_conf.c;usbd_desc.c;usbd_storage_if.c;usb_host.c;usbh_conf.c;stm32f2xx_it.c;stm32f2xx_hal_msp.c;main.c; -HeaderFiles=gpio.h;dma.h;ffconf.h;bsp_driver_sd.h;fatfs.h;fsmc.h;sdio.h;spi.h;tim.h;usart.h;usb_device.h;usbd_conf.h;usbd_desc.h;usbd_storage_if.h;usb_host.h;usbh_conf.h;stm32f2xx_it.h;stm32f2xx_hal_conf.h;mxconstants.h; - -[PreviousLibFiles] -LibFiles=Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_gpio.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_gpio_ex.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_dma_ex.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_dma.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_pcd_ex.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_pcd.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_usb.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_hcd.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_fsmc.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_sd.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_sdmmc.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_spi.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_tim.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_tim_ex.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_uart.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_def.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_rcc.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_rcc_ex.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_cortex.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_flash.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_flash_ex.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_pwr.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_pwr_ex.h;Drivers/STM32F2xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_sram.h;Middlewares/Third_Party/FatFs/src/drivers/sd_diskio.h;Middlewares/Third_Party/FatFs/src/drivers/usbh_diskio.h;Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_core.h;Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h;Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_def.h;Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ioreq.h;Middlewares/ST/STM32_USB_Device_Library/Class/HID/Inc/usbd_hid.h;Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_core.h;Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_ctlreq.h;Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_def.h;Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_ioreq.h;Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_pipes.h;Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Inc/usbh_msc.h;Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Inc/usbh_msc_bot.h;Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Inc/usbh_msc_scsi.h;Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_gpio.c;Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_dma.c;Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_pcd_ex.c;Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_pcd.c;Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_usb.c;Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_dma_ex.c;Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_hcd.c;Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_fsmc.c;Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_sd.c;Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_sdmmc.c;Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_spi.c;Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_tim.c;Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_tim_ex.c;Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_uart.c;Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_flash.c;Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_flash_ex.c;Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_rcc.c;Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_rcc_ex.c;Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal.c;Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_cortex.c;Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_pwr.c;Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_pwr_ex.c;Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_sram.c;Middlewares/Third_Party/FatFs/src/option/syscall.c;Middlewares/Third_Party/FatFs/src/option/ccsbcs.c;Middlewares/Third_Party/FatFs/src/drivers/sd_diskio.c;Middlewares/Third_Party/FatFs/src/drivers/usbh_diskio.c;Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c;Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c;Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c;Middlewares/ST/STM32_USB_Device_Library/Class/HID/Src/usbd_hid.c;Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_core.c;Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_ctlreq.c;Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_ioreq.c;Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_pipes.c;Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Src/usbh_msc.c;Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Src/usbh_msc_bot.c;Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Src/usbh_msc_scsi.c;Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/system_stm32f2xx.c;Middlewares/Third_Party/FatFs/src/diskio.h;Middlewares/Third_Party/FatFs/src/ff.h;Middlewares/Third_Party/FatFs/src/ffconf_template.h;Middlewares/Third_Party/FatFs/src/ff_gen_drv.h;Middlewares/Third_Party/FatFs/src/integer.h;Middlewares/Third_Party/FatFs/src/diskio.c;Middlewares/Third_Party/FatFs/src/ff.c;Middlewares/Third_Party/FatFs/src/ff_gen_drv.c;Drivers/CMSIS/Include/arm_common_tables.h;Drivers/CMSIS/Include/arm_const_structs.h;Drivers/CMSIS/Include/arm_math.h;Drivers/CMSIS/Include/core_cm0.h;Drivers/CMSIS/Include/core_cm0plus.h;Drivers/CMSIS/Include/core_cm3.h;Drivers/CMSIS/Include/core_cm4.h;Drivers/CMSIS/Include/core_cm7.h;Drivers/CMSIS/Include/core_cmFunc.h;Drivers/CMSIS/Include/core_cmInstr.h;Drivers/CMSIS/Include/core_cmSimd.h;Drivers/CMSIS/Include/core_sc000.h;Drivers/CMSIS/Include/core_sc300.h;Drivers/CMSIS/Device/ST/STM32F2xx/Include/stm32f205xx.h;Drivers/CMSIS/Device/ST/STM32F2xx/Include/stm32f207xx.h;Drivers/CMSIS/Device/ST/STM32F2xx/Include/stm32f215xx.h;Drivers/CMSIS/Device/ST/STM32F2xx/Include/stm32f217xx.h;Drivers/CMSIS/Device/ST/STM32F2xx/Include/stm32f2xx.h;Drivers/CMSIS/Device/ST/STM32F2xx/Include/system_stm32f2xx.h; - -[PreviousUsedTStudioFiles] -HeaderPath=..\Drivers\STM32F2xx_HAL_Driver\Inc;..\Drivers\STM32F2xx_HAL_Driver\Inc\Legacy;..\Middlewares\Third_Party\FatFs\src\drivers;..\Middlewares\ST\STM32_USB_Device_Library\Core\Inc;..\Middlewares\ST\STM32_USB_Device_Library\Class\HID\Inc;..\Middlewares\ST\STM32_USB_Host_Library\Core\Inc;..\Middlewares\ST\STM32_USB_Host_Library\Class\MSC\Inc;..\Middlewares\Third_Party\FatFs\src;..\Drivers\CMSIS\Include;..\Drivers\CMSIS\Device\ST\STM32F2xx\Include; -SourceFiles=../Src/main.c;../Src/gpio.c;../Src/dma.c;../Src/bsp_driver_sd.c;../Src/fatfs.c;../Src/fsmc.c;../Src/sdio.c;../Src/spi.c;../Src/tim.c;../Src/usart.c;../Src/usb_device.c;../Src/usbd_conf.c;../Src/usbd_desc.c;../Src/usb_host.c;../Src/usbh_conf.c;../Src/stm32f2xx_it.c;../Src/stm32f2xx_hal_msp.c;../Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_gpio.c;../Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_dma.c;../Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_pcd_ex.c;../Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_pcd.c;../Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_usb.c;../Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_dma_ex.c;../Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_hcd.c;../Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_fsmc.c;../Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_sd.c;../Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_sdmmc.c;../Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_spi.c;../Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_tim.c;../Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_tim_ex.c;../Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_uart.c;../Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_flash.c;../Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_flash_ex.c;../Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_rcc.c;../Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_rcc_ex.c;../Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal.c;../Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_cortex.c;../Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_pwr.c;../Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_pwr_ex.c;../Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_sram.c;../Middlewares/Third_Party/FatFs/src/option/syscall.c;../Middlewares/Third_Party/FatFs/src/option/ccsbcs.c;../Middlewares/Third_Party/FatFs/src/drivers/sd_diskio.c;../Middlewares/Third_Party/FatFs/src/drivers/usbh_diskio.c;../Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c;../Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c;../Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c;../Middlewares/ST/STM32_USB_Device_Library/Class/HID/Src/usbd_hid.c;../Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_core.c;../Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_ctlreq.c;../Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_ioreq.c;../Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_pipes.c;../Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Src/usbh_msc.c;../Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Src/usbh_msc_bot.c;../Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Src/usbh_msc_scsi.c;../Middlewares/Third_Party/FatFs/src/diskio.c;../Middlewares/Third_Party/FatFs/src/ff.c;../Middlewares/Third_Party/FatFs/src/ff_gen_drv.c;../Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/system_stm32f2xx.c;../Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/gcc/startup_stm32f205xx.s;../Middlewares/Third_Party/FatFs/src/option/syscall.c;../Middlewares/Third_Party/FatFs/src/option/ccsbcs.c;../Middlewares/Third_Party/FatFs/src/drivers/sd_diskio.c;../Middlewares/Third_Party/FatFs/src/drivers/usbh_diskio.c;../Middlewares/Third_Party/FatFs/src/diskio.c;../Middlewares/Third_Party/FatFs/src/ff.c;../Middlewares/Third_Party/FatFs/src/ff_gen_drv.c;../Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c;../Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c;../Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c;../Middlewares/ST/STM32_USB_Device_Library/Class/HID/Src/usbd_hid.c;../Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_core.c;../Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_ctlreq.c;../Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_ioreq.c;../Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_pipes.c;../Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Src/usbh_msc.c;../Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Src/usbh_msc_bot.c;../Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Src/usbh_msc_scsi.c; - diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Include/stm32f205xx.h b/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Include/stm32f205xx.h deleted file mode 100755 index cc72a55c..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Include/stm32f205xx.h +++ /dev/null @@ -1,7342 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f205xx.h - * @author MCD Application Team - * @version V2.1.0 - * @date 09-October-2015 - * @brief CMSIS STM32F205xx Device Peripheral Access Layer Header File. - * This file contains : - * - Data structures and the address mapping for all peripherals - * - Peripheral's registers declarations and bits definition - * - Macros to access peripheral’s registers hardware - * - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/** @addtogroup CMSIS - * @{ - */ - -/** @addtogroup stm32f205xx - * @{ - */ - -#ifndef __STM32F205xx_H -#define __STM32F205xx_H - -#ifdef __cplusplus - extern "C" { -#endif /* __cplusplus */ - - -/** @addtogroup Configuration_section_for_CMSIS - * @{ - */ - -/** - * @brief Configuration of the Cortex-M3 Processor and Core Peripherals - */ -#define __CM3_REV 0x0200 /*!< Core revision r0p1 */ -#define __MPU_PRESENT 1 /*!< STM32F2XX provides an MPU */ -#define __NVIC_PRIO_BITS 4 /*!< STM32F2XX uses 4 Bits for the Priority Levels */ -#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */ - -/** - * @} - */ - -/** @addtogroup Peripheral_interrupt_number_definition - * @{ - */ - -/** - * @brief STM32F2XX Interrupt Number Definition, according to the selected device - * in @ref Library_configuration_section - */ -typedef enum -{ -/****** Cortex-M3 Processor Exceptions Numbers ****************************************************************/ - NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ - MemoryManagement_IRQn = -12, /*!< 4 Cortex-M3 Memory Management Interrupt */ - BusFault_IRQn = -11, /*!< 5 Cortex-M3 Bus Fault Interrupt */ - UsageFault_IRQn = -10, /*!< 6 Cortex-M3 Usage Fault Interrupt */ - SVCall_IRQn = -5, /*!< 11 Cortex-M3 SV Call Interrupt */ - DebugMonitor_IRQn = -4, /*!< 12 Cortex-M3 Debug Monitor Interrupt */ - PendSV_IRQn = -2, /*!< 14 Cortex-M3 Pend SV Interrupt */ - SysTick_IRQn = -1, /*!< 15 Cortex-M3 System Tick Interrupt */ -/****** STM32 specific Interrupt Numbers **********************************************************************/ - WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */ - PVD_IRQn = 1, /*!< PVD through EXTI Line detection Interrupt */ - TAMP_STAMP_IRQn = 2, /*!< Tamper and TimeStamp interrupts through the EXTI line */ - RTC_WKUP_IRQn = 3, /*!< RTC Wakeup interrupt through the EXTI line */ - FLASH_IRQn = 4, /*!< FLASH global Interrupt */ - RCC_IRQn = 5, /*!< RCC global Interrupt */ - EXTI0_IRQn = 6, /*!< EXTI Line0 Interrupt */ - EXTI1_IRQn = 7, /*!< EXTI Line1 Interrupt */ - EXTI2_IRQn = 8, /*!< EXTI Line2 Interrupt */ - EXTI3_IRQn = 9, /*!< EXTI Line3 Interrupt */ - EXTI4_IRQn = 10, /*!< EXTI Line4 Interrupt */ - DMA1_Stream0_IRQn = 11, /*!< DMA1 Stream 0 global Interrupt */ - DMA1_Stream1_IRQn = 12, /*!< DMA1 Stream 1 global Interrupt */ - DMA1_Stream2_IRQn = 13, /*!< DMA1 Stream 2 global Interrupt */ - DMA1_Stream3_IRQn = 14, /*!< DMA1 Stream 3 global Interrupt */ - DMA1_Stream4_IRQn = 15, /*!< DMA1 Stream 4 global Interrupt */ - DMA1_Stream5_IRQn = 16, /*!< DMA1 Stream 5 global Interrupt */ - DMA1_Stream6_IRQn = 17, /*!< DMA1 Stream 6 global Interrupt */ - ADC_IRQn = 18, /*!< ADC1, ADC2 and ADC3 global Interrupts */ - CAN1_TX_IRQn = 19, /*!< CAN1 TX Interrupt */ - CAN1_RX0_IRQn = 20, /*!< CAN1 RX0 Interrupt */ - CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ - CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ - EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ - TIM1_BRK_TIM9_IRQn = 24, /*!< TIM1 Break interrupt and TIM9 global interrupt */ - TIM1_UP_TIM10_IRQn = 25, /*!< TIM1 Update Interrupt and TIM10 global interrupt */ - TIM1_TRG_COM_TIM11_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt and TIM11 global interrupt */ - TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ - TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ - TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ - TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ - I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ - I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ - I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ - I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ - SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ - SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ - USART1_IRQn = 37, /*!< USART1 global Interrupt */ - USART2_IRQn = 38, /*!< USART2 global Interrupt */ - USART3_IRQn = 39, /*!< USART3 global Interrupt */ - EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ - RTC_Alarm_IRQn = 41, /*!< RTC Alarm (A and B) through EXTI Line Interrupt */ - OTG_FS_WKUP_IRQn = 42, /*!< USB OTG FS Wakeup through EXTI line interrupt */ - TIM8_BRK_TIM12_IRQn = 43, /*!< TIM8 Break Interrupt and TIM12 global interrupt */ - TIM8_UP_TIM13_IRQn = 44, /*!< TIM8 Update Interrupt and TIM13 global interrupt */ - TIM8_TRG_COM_TIM14_IRQn = 45, /*!< TIM8 Trigger and Commutation Interrupt and TIM14 global interrupt */ - TIM8_CC_IRQn = 46, /*!< TIM8 Capture Compare Interrupt */ - DMA1_Stream7_IRQn = 47, /*!< DMA1 Stream7 Interrupt */ - FSMC_IRQn = 48, /*!< FSMC global Interrupt */ - SDIO_IRQn = 49, /*!< SDIO global Interrupt */ - TIM5_IRQn = 50, /*!< TIM5 global Interrupt */ - SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ - UART4_IRQn = 52, /*!< UART4 global Interrupt */ - UART5_IRQn = 53, /*!< UART5 global Interrupt */ - TIM6_DAC_IRQn = 54, /*!< TIM6 global and DAC1&2 underrun error interrupts */ - TIM7_IRQn = 55, /*!< TIM7 global interrupt */ - DMA2_Stream0_IRQn = 56, /*!< DMA2 Stream 0 global Interrupt */ - DMA2_Stream1_IRQn = 57, /*!< DMA2 Stream 1 global Interrupt */ - DMA2_Stream2_IRQn = 58, /*!< DMA2 Stream 2 global Interrupt */ - DMA2_Stream3_IRQn = 59, /*!< DMA2 Stream 3 global Interrupt */ - DMA2_Stream4_IRQn = 60, /*!< DMA2 Stream 4 global Interrupt */ - CAN2_TX_IRQn = 63, /*!< CAN2 TX Interrupt */ - CAN2_RX0_IRQn = 64, /*!< CAN2 RX0 Interrupt */ - CAN2_RX1_IRQn = 65, /*!< CAN2 RX1 Interrupt */ - CAN2_SCE_IRQn = 66, /*!< CAN2 SCE Interrupt */ - OTG_FS_IRQn = 67, /*!< USB OTG FS global Interrupt */ - DMA2_Stream5_IRQn = 68, /*!< DMA2 Stream 5 global interrupt */ - DMA2_Stream6_IRQn = 69, /*!< DMA2 Stream 6 global interrupt */ - DMA2_Stream7_IRQn = 70, /*!< DMA2 Stream 7 global interrupt */ - USART6_IRQn = 71, /*!< USART6 global interrupt */ - I2C3_EV_IRQn = 72, /*!< I2C3 event interrupt */ - I2C3_ER_IRQn = 73, /*!< I2C3 error interrupt */ - OTG_HS_EP1_OUT_IRQn = 74, /*!< USB OTG HS End Point 1 Out global interrupt */ - OTG_HS_EP1_IN_IRQn = 75, /*!< USB OTG HS End Point 1 In global interrupt */ - OTG_HS_WKUP_IRQn = 76, /*!< USB OTG HS Wakeup through EXTI interrupt */ - OTG_HS_IRQn = 77, /*!< USB OTG HS global interrupt */ - HASH_RNG_IRQn = 80 /*!< Hash and Rng global interrupt */ -} IRQn_Type; - -/** - * @} - */ - -#include "core_cm3.h" -#include "system_stm32f2xx.h" -#include - -/** @addtogroup Peripheral_registers_structures - * @{ - */ - -/** - * @brief Analog to Digital Converter - */ - -typedef struct -{ - __IO uint32_t SR; /*!< ADC status register, Address offset: 0x00 */ - __IO uint32_t CR1; /*!< ADC control register 1, Address offset: 0x04 */ - __IO uint32_t CR2; /*!< ADC control register 2, Address offset: 0x08 */ - __IO uint32_t SMPR1; /*!< ADC sample time register 1, Address offset: 0x0C */ - __IO uint32_t SMPR2; /*!< ADC sample time register 2, Address offset: 0x10 */ - __IO uint32_t JOFR1; /*!< ADC injected channel data offset register 1, Address offset: 0x14 */ - __IO uint32_t JOFR2; /*!< ADC injected channel data offset register 2, Address offset: 0x18 */ - __IO uint32_t JOFR3; /*!< ADC injected channel data offset register 3, Address offset: 0x1C */ - __IO uint32_t JOFR4; /*!< ADC injected channel data offset register 4, Address offset: 0x20 */ - __IO uint32_t HTR; /*!< ADC watchdog higher threshold register, Address offset: 0x24 */ - __IO uint32_t LTR; /*!< ADC watchdog lower threshold register, Address offset: 0x28 */ - __IO uint32_t SQR1; /*!< ADC regular sequence register 1, Address offset: 0x2C */ - __IO uint32_t SQR2; /*!< ADC regular sequence register 2, Address offset: 0x30 */ - __IO uint32_t SQR3; /*!< ADC regular sequence register 3, Address offset: 0x34 */ - __IO uint32_t JSQR; /*!< ADC injected sequence register, Address offset: 0x38*/ - __IO uint32_t JDR1; /*!< ADC injected data register 1, Address offset: 0x3C */ - __IO uint32_t JDR2; /*!< ADC injected data register 2, Address offset: 0x40 */ - __IO uint32_t JDR3; /*!< ADC injected data register 3, Address offset: 0x44 */ - __IO uint32_t JDR4; /*!< ADC injected data register 4, Address offset: 0x48 */ - __IO uint32_t DR; /*!< ADC regular data register, Address offset: 0x4C */ -} ADC_TypeDef; - -typedef struct -{ - __IO uint32_t CSR; /*!< ADC Common status register, Address offset: ADC1 base address + 0x300 */ - __IO uint32_t CCR; /*!< ADC common control register, Address offset: ADC1 base address + 0x304 */ - __IO uint32_t CDR; /*!< ADC common regular data register for dual - AND triple modes, Address offset: ADC1 base address + 0x308 */ -} ADC_Common_TypeDef; - - -/** - * @brief Controller Area Network TxMailBox - */ - -typedef struct -{ - __IO uint32_t TIR; /*!< CAN TX mailbox identifier register */ - __IO uint32_t TDTR; /*!< CAN mailbox data length control and time stamp register */ - __IO uint32_t TDLR; /*!< CAN mailbox data low register */ - __IO uint32_t TDHR; /*!< CAN mailbox data high register */ -} CAN_TxMailBox_TypeDef; - -/** - * @brief Controller Area Network FIFOMailBox - */ - -typedef struct -{ - __IO uint32_t RIR; /*!< CAN receive FIFO mailbox identifier register */ - __IO uint32_t RDTR; /*!< CAN receive FIFO mailbox data length control and time stamp register */ - __IO uint32_t RDLR; /*!< CAN receive FIFO mailbox data low register */ - __IO uint32_t RDHR; /*!< CAN receive FIFO mailbox data high register */ -} CAN_FIFOMailBox_TypeDef; - -/** - * @brief Controller Area Network FilterRegister - */ - -typedef struct -{ - __IO uint32_t FR1; /*!< CAN Filter bank register 1 */ - __IO uint32_t FR2; /*!< CAN Filter bank register 1 */ -} CAN_FilterRegister_TypeDef; - -/** - * @brief Controller Area Network - */ - -typedef struct -{ - __IO uint32_t MCR; /*!< CAN master control register, Address offset: 0x00 */ - __IO uint32_t MSR; /*!< CAN master status register, Address offset: 0x04 */ - __IO uint32_t TSR; /*!< CAN transmit status register, Address offset: 0x08 */ - __IO uint32_t RF0R; /*!< CAN receive FIFO 0 register, Address offset: 0x0C */ - __IO uint32_t RF1R; /*!< CAN receive FIFO 1 register, Address offset: 0x10 */ - __IO uint32_t IER; /*!< CAN interrupt enable register, Address offset: 0x14 */ - __IO uint32_t ESR; /*!< CAN error status register, Address offset: 0x18 */ - __IO uint32_t BTR; /*!< CAN bit timing register, Address offset: 0x1C */ - uint32_t RESERVED0[88]; /*!< Reserved, 0x020 - 0x17F */ - CAN_TxMailBox_TypeDef sTxMailBox[3]; /*!< CAN Tx MailBox, Address offset: 0x180 - 0x1AC */ - CAN_FIFOMailBox_TypeDef sFIFOMailBox[2]; /*!< CAN FIFO MailBox, Address offset: 0x1B0 - 0x1CC */ - uint32_t RESERVED1[12]; /*!< Reserved, 0x1D0 - 0x1FF */ - __IO uint32_t FMR; /*!< CAN filter master register, Address offset: 0x200 */ - __IO uint32_t FM1R; /*!< CAN filter mode register, Address offset: 0x204 */ - uint32_t RESERVED2; /*!< Reserved, 0x208 */ - __IO uint32_t FS1R; /*!< CAN filter scale register, Address offset: 0x20C */ - uint32_t RESERVED3; /*!< Reserved, 0x210 */ - __IO uint32_t FFA1R; /*!< CAN filter FIFO assignment register, Address offset: 0x214 */ - uint32_t RESERVED4; /*!< Reserved, 0x218 */ - __IO uint32_t FA1R; /*!< CAN filter activation register, Address offset: 0x21C */ - uint32_t RESERVED5[8]; /*!< Reserved, 0x220-0x23F */ - CAN_FilterRegister_TypeDef sFilterRegister[28]; /*!< CAN Filter Register, Address offset: 0x240-0x31C */ -} CAN_TypeDef; - -/** - * @brief CRC calculation unit - */ - -typedef struct -{ - __IO uint32_t DR; /*!< CRC Data register, Address offset: 0x00 */ - __IO uint8_t IDR; /*!< CRC Independent data register, Address offset: 0x04 */ - uint8_t RESERVED0; /*!< Reserved, 0x05 */ - uint16_t RESERVED1; /*!< Reserved, 0x06 */ - __IO uint32_t CR; /*!< CRC Control register, Address offset: 0x08 */ -} CRC_TypeDef; - -/** - * @brief Digital to Analog Converter - */ - -typedef struct -{ - __IO uint32_t CR; /*!< DAC control register, Address offset: 0x00 */ - __IO uint32_t SWTRIGR; /*!< DAC software trigger register, Address offset: 0x04 */ - __IO uint32_t DHR12R1; /*!< DAC channel1 12-bit right-aligned data holding register, Address offset: 0x08 */ - __IO uint32_t DHR12L1; /*!< DAC channel1 12-bit left aligned data holding register, Address offset: 0x0C */ - __IO uint32_t DHR8R1; /*!< DAC channel1 8-bit right aligned data holding register, Address offset: 0x10 */ - __IO uint32_t DHR12R2; /*!< DAC channel2 12-bit right aligned data holding register, Address offset: 0x14 */ - __IO uint32_t DHR12L2; /*!< DAC channel2 12-bit left aligned data holding register, Address offset: 0x18 */ - __IO uint32_t DHR8R2; /*!< DAC channel2 8-bit right-aligned data holding register, Address offset: 0x1C */ - __IO uint32_t DHR12RD; /*!< Dual DAC 12-bit right-aligned data holding register, Address offset: 0x20 */ - __IO uint32_t DHR12LD; /*!< DUAL DAC 12-bit left aligned data holding register, Address offset: 0x24 */ - __IO uint32_t DHR8RD; /*!< DUAL DAC 8-bit right aligned data holding register, Address offset: 0x28 */ - __IO uint32_t DOR1; /*!< DAC channel1 data output register, Address offset: 0x2C */ - __IO uint32_t DOR2; /*!< DAC channel2 data output register, Address offset: 0x30 */ - __IO uint32_t SR; /*!< DAC status register, Address offset: 0x34 */ -} DAC_TypeDef; - -/** - * @brief Debug MCU - */ - -typedef struct -{ - __IO uint32_t IDCODE; /*!< MCU device ID code, Address offset: 0x00 */ - __IO uint32_t CR; /*!< Debug MCU configuration register, Address offset: 0x04 */ - __IO uint32_t APB1FZ; /*!< Debug MCU APB1 freeze register, Address offset: 0x08 */ - __IO uint32_t APB2FZ; /*!< Debug MCU APB2 freeze register, Address offset: 0x0C */ -}DBGMCU_TypeDef; - - -/** - * @brief DMA Controller - */ - -typedef struct -{ - __IO uint32_t CR; /*!< DMA stream x configuration register */ - __IO uint32_t NDTR; /*!< DMA stream x number of data register */ - __IO uint32_t PAR; /*!< DMA stream x peripheral address register */ - __IO uint32_t M0AR; /*!< DMA stream x memory 0 address register */ - __IO uint32_t M1AR; /*!< DMA stream x memory 1 address register */ - __IO uint32_t FCR; /*!< DMA stream x FIFO control register */ -} DMA_Stream_TypeDef; - -typedef struct -{ - __IO uint32_t LISR; /*!< DMA low interrupt status register, Address offset: 0x00 */ - __IO uint32_t HISR; /*!< DMA high interrupt status register, Address offset: 0x04 */ - __IO uint32_t LIFCR; /*!< DMA low interrupt flag clear register, Address offset: 0x08 */ - __IO uint32_t HIFCR; /*!< DMA high interrupt flag clear register, Address offset: 0x0C */ -} DMA_TypeDef; - - -/** - * @brief External Interrupt/Event Controller - */ - -typedef struct -{ - __IO uint32_t IMR; /*!< EXTI Interrupt mask register, Address offset: 0x00 */ - __IO uint32_t EMR; /*!< EXTI Event mask register, Address offset: 0x04 */ - __IO uint32_t RTSR; /*!< EXTI Rising trigger selection register, Address offset: 0x08 */ - __IO uint32_t FTSR; /*!< EXTI Falling trigger selection register, Address offset: 0x0C */ - __IO uint32_t SWIER; /*!< EXTI Software interrupt event register, Address offset: 0x10 */ - __IO uint32_t PR; /*!< EXTI Pending register, Address offset: 0x14 */ -} EXTI_TypeDef; - -/** - * @brief FLASH Registers - */ - -typedef struct -{ - __IO uint32_t ACR; /*!< FLASH access control register, Address offset: 0x00 */ - __IO uint32_t KEYR; /*!< FLASH key register, Address offset: 0x04 */ - __IO uint32_t OPTKEYR; /*!< FLASH option key register, Address offset: 0x08 */ - __IO uint32_t SR; /*!< FLASH status register, Address offset: 0x0C */ - __IO uint32_t CR; /*!< FLASH control register, Address offset: 0x10 */ - __IO uint32_t OPTCR; /*!< FLASH option control register, Address offset: 0x14 */ -} FLASH_TypeDef; - - -/** - * @brief Flexible Static Memory Controller - */ - -typedef struct -{ - __IO uint32_t BTCR[8]; /*!< NOR/PSRAM chip-select control register(BCR) and chip-select timing register(BTR), Address offset: 0x00-1C */ -} FSMC_Bank1_TypeDef; - -/** - * @brief Flexible Static Memory Controller Bank1E - */ - -typedef struct -{ - __IO uint32_t BWTR[7]; /*!< NOR/PSRAM write timing registers, Address offset: 0x104-0x11C */ -} FSMC_Bank1E_TypeDef; - -/** - * @brief Flexible Static Memory Controller Bank2 - */ - -typedef struct -{ - __IO uint32_t PCR2; /*!< NAND Flash control register 2, Address offset: 0x60 */ - __IO uint32_t SR2; /*!< NAND Flash FIFO status and interrupt register 2, Address offset: 0x64 */ - __IO uint32_t PMEM2; /*!< NAND Flash Common memory space timing register 2, Address offset: 0x68 */ - __IO uint32_t PATT2; /*!< NAND Flash Attribute memory space timing register 2, Address offset: 0x6C */ - uint32_t RESERVED0; /*!< Reserved, 0x70 */ - __IO uint32_t ECCR2; /*!< NAND Flash ECC result registers 2, Address offset: 0x74 */ - uint32_t RESERVED1; /*!< Reserved, 0x78 */ - uint32_t RESERVED2; /*!< Reserved, 0x7C */ - __IO uint32_t PCR3; /*!< NAND Flash control register 3, Address offset: 0x80 */ - __IO uint32_t SR3; /*!< NAND Flash FIFO status and interrupt register 3, Address offset: 0x84 */ - __IO uint32_t PMEM3; /*!< NAND Flash Common memory space timing register 3, Address offset: 0x88 */ - __IO uint32_t PATT3; /*!< NAND Flash Attribute memory space timing register 3, Address offset: 0x8C */ - uint32_t RESERVED3; /*!< Reserved, 0x90 */ - __IO uint32_t ECCR3; /*!< NAND Flash ECC result registers 3, Address offset: 0x94 */ -} FSMC_Bank2_3_TypeDef; - -/** - * @brief Flexible Static Memory Controller Bank4 - */ - -typedef struct -{ - __IO uint32_t PCR4; /*!< PC Card control register 4, Address offset: 0xA0 */ - __IO uint32_t SR4; /*!< PC Card FIFO status and interrupt register 4, Address offset: 0xA4 */ - __IO uint32_t PMEM4; /*!< PC Card Common memory space timing register 4, Address offset: 0xA8 */ - __IO uint32_t PATT4; /*!< PC Card Attribute memory space timing register 4, Address offset: 0xAC */ - __IO uint32_t PIO4; /*!< PC Card I/O space timing register 4, Address offset: 0xB0 */ -} FSMC_Bank4_TypeDef; - - -/** - * @brief General Purpose I/O - */ - -typedef struct -{ - __IO uint32_t MODER; /*!< GPIO port mode register, Address offset: 0x00 */ - __IO uint32_t OTYPER; /*!< GPIO port output type register, Address offset: 0x04 */ - __IO uint32_t OSPEEDR; /*!< GPIO port output speed register, Address offset: 0x08 */ - __IO uint32_t PUPDR; /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */ - __IO uint32_t IDR; /*!< GPIO port input data register, Address offset: 0x10 */ - __IO uint32_t ODR; /*!< GPIO port output data register, Address offset: 0x14 */ - __IO uint32_t BSRR; /*!< GPIO port bit set/reset register, Address offset: 0x18 */ - __IO uint32_t LCKR; /*!< GPIO port configuration lock register, Address offset: 0x1C */ - __IO uint32_t AFR[2]; /*!< GPIO alternate function registers, Address offset: 0x20-0x24 */ -} GPIO_TypeDef; - -/** - * @brief System configuration controller - */ - -typedef struct -{ - __IO uint32_t MEMRMP; /*!< SYSCFG memory remap register, Address offset: 0x00 */ - __IO uint32_t PMC; /*!< SYSCFG peripheral mode configuration register, Address offset: 0x04 */ - __IO uint32_t EXTICR[4]; /*!< SYSCFG external interrupt configuration registers, Address offset: 0x08-0x14 */ - uint32_t RESERVED[2]; /*!< Reserved, 0x18-0x1C */ - __IO uint32_t CMPCR; /*!< SYSCFG Compensation cell control register, Address offset: 0x20 */ -} SYSCFG_TypeDef; - -/** - * @brief Inter-integrated Circuit Interface - */ - -typedef struct -{ - __IO uint32_t CR1; /*!< I2C Control register 1, Address offset: 0x00 */ - __IO uint32_t CR2; /*!< I2C Control register 2, Address offset: 0x04 */ - __IO uint32_t OAR1; /*!< I2C Own address register 1, Address offset: 0x08 */ - __IO uint32_t OAR2; /*!< I2C Own address register 2, Address offset: 0x0C */ - __IO uint32_t DR; /*!< I2C Data register, Address offset: 0x10 */ - __IO uint32_t SR1; /*!< I2C Status register 1, Address offset: 0x14 */ - __IO uint32_t SR2; /*!< I2C Status register 2, Address offset: 0x18 */ - __IO uint32_t CCR; /*!< I2C Clock control register, Address offset: 0x1C */ - __IO uint32_t TRISE; /*!< I2C TRISE register, Address offset: 0x20 */ - __IO uint32_t FLTR; /*!< I2C FLTR register, Address offset: 0x24 */ -} I2C_TypeDef; - -/** - * @brief Independent WATCHDOG - */ - -typedef struct -{ - __IO uint32_t KR; /*!< IWDG Key register, Address offset: 0x00 */ - __IO uint32_t PR; /*!< IWDG Prescaler register, Address offset: 0x04 */ - __IO uint32_t RLR; /*!< IWDG Reload register, Address offset: 0x08 */ - __IO uint32_t SR; /*!< IWDG Status register, Address offset: 0x0C */ -} IWDG_TypeDef; - -/** - * @brief Power Control - */ - -typedef struct -{ - __IO uint32_t CR; /*!< PWR power control register, Address offset: 0x00 */ - __IO uint32_t CSR; /*!< PWR power control/status register, Address offset: 0x04 */ -} PWR_TypeDef; - -/** - * @brief Reset and Clock Control - */ - -typedef struct -{ - __IO uint32_t CR; /*!< RCC clock control register, Address offset: 0x00 */ - __IO uint32_t PLLCFGR; /*!< RCC PLL configuration register, Address offset: 0x04 */ - __IO uint32_t CFGR; /*!< RCC clock configuration register, Address offset: 0x08 */ - __IO uint32_t CIR; /*!< RCC clock interrupt register, Address offset: 0x0C */ - __IO uint32_t AHB1RSTR; /*!< RCC AHB1 peripheral reset register, Address offset: 0x10 */ - __IO uint32_t AHB2RSTR; /*!< RCC AHB2 peripheral reset register, Address offset: 0x14 */ - __IO uint32_t AHB3RSTR; /*!< RCC AHB3 peripheral reset register, Address offset: 0x18 */ - uint32_t RESERVED0; /*!< Reserved, 0x1C */ - __IO uint32_t APB1RSTR; /*!< RCC APB1 peripheral reset register, Address offset: 0x20 */ - __IO uint32_t APB2RSTR; /*!< RCC APB2 peripheral reset register, Address offset: 0x24 */ - uint32_t RESERVED1[2]; /*!< Reserved, 0x28-0x2C */ - __IO uint32_t AHB1ENR; /*!< RCC AHB1 peripheral clock register, Address offset: 0x30 */ - __IO uint32_t AHB2ENR; /*!< RCC AHB2 peripheral clock register, Address offset: 0x34 */ - __IO uint32_t AHB3ENR; /*!< RCC AHB3 peripheral clock register, Address offset: 0x38 */ - uint32_t RESERVED2; /*!< Reserved, 0x3C */ - __IO uint32_t APB1ENR; /*!< RCC APB1 peripheral clock enable register, Address offset: 0x40 */ - __IO uint32_t APB2ENR; /*!< RCC APB2 peripheral clock enable register, Address offset: 0x44 */ - uint32_t RESERVED3[2]; /*!< Reserved, 0x48-0x4C */ - __IO uint32_t AHB1LPENR; /*!< RCC AHB1 peripheral clock enable in low power mode register, Address offset: 0x50 */ - __IO uint32_t AHB2LPENR; /*!< RCC AHB2 peripheral clock enable in low power mode register, Address offset: 0x54 */ - __IO uint32_t AHB3LPENR; /*!< RCC AHB3 peripheral clock enable in low power mode register, Address offset: 0x58 */ - uint32_t RESERVED4; /*!< Reserved, 0x5C */ - __IO uint32_t APB1LPENR; /*!< RCC APB1 peripheral clock enable in low power mode register, Address offset: 0x60 */ - __IO uint32_t APB2LPENR; /*!< RCC APB2 peripheral clock enable in low power mode register, Address offset: 0x64 */ - uint32_t RESERVED5[2]; /*!< Reserved, 0x68-0x6C */ - __IO uint32_t BDCR; /*!< RCC Backup domain control register, Address offset: 0x70 */ - __IO uint32_t CSR; /*!< RCC clock control & status register, Address offset: 0x74 */ - uint32_t RESERVED6[2]; /*!< Reserved, 0x78-0x7C */ - __IO uint32_t SSCGR; /*!< RCC spread spectrum clock generation register, Address offset: 0x80 */ - __IO uint32_t PLLI2SCFGR; /*!< RCC PLLI2S configuration register, Address offset: 0x84 */ - -} RCC_TypeDef; - -/** - * @brief Real-Time Clock - */ - -typedef struct -{ - __IO uint32_t TR; /*!< RTC time register, Address offset: 0x00 */ - __IO uint32_t DR; /*!< RTC date register, Address offset: 0x04 */ - __IO uint32_t CR; /*!< RTC control register, Address offset: 0x08 */ - __IO uint32_t ISR; /*!< RTC initialization and status register, Address offset: 0x0C */ - __IO uint32_t PRER; /*!< RTC prescaler register, Address offset: 0x10 */ - __IO uint32_t WUTR; /*!< RTC wakeup timer register, Address offset: 0x14 */ - __IO uint32_t CALIBR; /*!< RTC calibration register, Address offset: 0x18 */ - __IO uint32_t ALRMAR; /*!< RTC alarm A register, Address offset: 0x1C */ - __IO uint32_t ALRMBR; /*!< RTC alarm B register, Address offset: 0x20 */ - __IO uint32_t WPR; /*!< RTC write protection register, Address offset: 0x24 */ - uint32_t RESERVED1; /*!< Reserved, 0x28 */ - uint32_t RESERVED2; /*!< Reserved, 0x2C */ - __IO uint32_t TSTR; /*!< RTC time stamp time register, Address offset: 0x30 */ - __IO uint32_t TSDR; /*!< RTC time stamp date register, Address offset: 0x34 */ - uint32_t RESERVED3; /*!< Reserved, 0x38 */ - uint32_t RESERVED4; /*!< Reserved, 0x3C */ - __IO uint32_t TAFCR; /*!< RTC tamper and alternate function configuration register, Address offset: 0x40 */ - uint32_t RESERVED5; /*!< Reserved, 0x44 */ - uint32_t RESERVED6; /*!< Reserved, 0x48 */ - uint32_t RESERVED7; /*!< Reserved, 0x4C */ - __IO uint32_t BKP0R; /*!< RTC backup register 1, Address offset: 0x50 */ - __IO uint32_t BKP1R; /*!< RTC backup register 1, Address offset: 0x54 */ - __IO uint32_t BKP2R; /*!< RTC backup register 2, Address offset: 0x58 */ - __IO uint32_t BKP3R; /*!< RTC backup register 3, Address offset: 0x5C */ - __IO uint32_t BKP4R; /*!< RTC backup register 4, Address offset: 0x60 */ - __IO uint32_t BKP5R; /*!< RTC backup register 5, Address offset: 0x64 */ - __IO uint32_t BKP6R; /*!< RTC backup register 6, Address offset: 0x68 */ - __IO uint32_t BKP7R; /*!< RTC backup register 7, Address offset: 0x6C */ - __IO uint32_t BKP8R; /*!< RTC backup register 8, Address offset: 0x70 */ - __IO uint32_t BKP9R; /*!< RTC backup register 9, Address offset: 0x74 */ - __IO uint32_t BKP10R; /*!< RTC backup register 10, Address offset: 0x78 */ - __IO uint32_t BKP11R; /*!< RTC backup register 11, Address offset: 0x7C */ - __IO uint32_t BKP12R; /*!< RTC backup register 12, Address offset: 0x80 */ - __IO uint32_t BKP13R; /*!< RTC backup register 13, Address offset: 0x84 */ - __IO uint32_t BKP14R; /*!< RTC backup register 14, Address offset: 0x88 */ - __IO uint32_t BKP15R; /*!< RTC backup register 15, Address offset: 0x8C */ - __IO uint32_t BKP16R; /*!< RTC backup register 16, Address offset: 0x90 */ - __IO uint32_t BKP17R; /*!< RTC backup register 17, Address offset: 0x94 */ - __IO uint32_t BKP18R; /*!< RTC backup register 18, Address offset: 0x98 */ - __IO uint32_t BKP19R; /*!< RTC backup register 19, Address offset: 0x9C */ -} RTC_TypeDef; - - -/** - * @brief SD host Interface - */ - -typedef struct -{ - __IO uint32_t POWER; /*!< SDIO power control register, Address offset: 0x00 */ - __IO uint32_t CLKCR; /*!< SDI clock control register, Address offset: 0x04 */ - __IO uint32_t ARG; /*!< SDIO argument register, Address offset: 0x08 */ - __IO uint32_t CMD; /*!< SDIO command register, Address offset: 0x0C */ - __IO const uint32_t RESPCMD; /*!< SDIO command response register, Address offset: 0x10 */ - __IO const uint32_t RESP1; /*!< SDIO response 1 register, Address offset: 0x14 */ - __IO const uint32_t RESP2; /*!< SDIO response 2 register, Address offset: 0x18 */ - __IO const uint32_t RESP3; /*!< SDIO response 3 register, Address offset: 0x1C */ - __IO const uint32_t RESP4; /*!< SDIO response 4 register, Address offset: 0x20 */ - __IO uint32_t DTIMER; /*!< SDIO data timer register, Address offset: 0x24 */ - __IO uint32_t DLEN; /*!< SDIO data length register, Address offset: 0x28 */ - __IO uint32_t DCTRL; /*!< SDIO data control register, Address offset: 0x2C */ - __IO const uint32_t DCOUNT; /*!< SDIO data counter register, Address offset: 0x30 */ - __IO const uint32_t STA; /*!< SDIO status register, Address offset: 0x34 */ - __IO uint32_t ICR; /*!< SDIO interrupt clear register, Address offset: 0x38 */ - __IO uint32_t MASK; /*!< SDIO mask register, Address offset: 0x3C */ - uint32_t RESERVED0[2]; /*!< Reserved, 0x40-0x44 */ - __IO const uint32_t FIFOCNT; /*!< SDIO FIFO counter register, Address offset: 0x48 */ - uint32_t RESERVED1[13]; /*!< Reserved, 0x4C-0x7C */ - __IO uint32_t FIFO; /*!< SDIO data FIFO register, Address offset: 0x80 */ -} SDIO_TypeDef; - -/** - * @brief Serial Peripheral Interface - */ - -typedef struct -{ - __IO uint32_t CR1; /*!< SPI control register 1 (not used in I2S mode), Address offset: 0x00 */ - __IO uint32_t CR2; /*!< SPI control register 2, Address offset: 0x04 */ - __IO uint32_t SR; /*!< SPI status register, Address offset: 0x08 */ - __IO uint32_t DR; /*!< SPI data register, Address offset: 0x0C */ - __IO uint32_t CRCPR; /*!< SPI CRC polynomial register (not used in I2S mode), Address offset: 0x10 */ - __IO uint32_t RXCRCR; /*!< SPI RX CRC register (not used in I2S mode), Address offset: 0x14 */ - __IO uint32_t TXCRCR; /*!< SPI TX CRC register (not used in I2S mode), Address offset: 0x18 */ - __IO uint32_t I2SCFGR; /*!< SPI_I2S configuration register, Address offset: 0x1C */ - __IO uint32_t I2SPR; /*!< SPI_I2S prescaler register, Address offset: 0x20 */ -} SPI_TypeDef; - -/** - * @brief TIM - */ - -typedef struct -{ - __IO uint32_t CR1; /*!< TIM control register 1, Address offset: 0x00 */ - __IO uint32_t CR2; /*!< TIM control register 2, Address offset: 0x04 */ - __IO uint32_t SMCR; /*!< TIM slave mode control register, Address offset: 0x08 */ - __IO uint32_t DIER; /*!< TIM DMA/interrupt enable register, Address offset: 0x0C */ - __IO uint32_t SR; /*!< TIM status register, Address offset: 0x10 */ - __IO uint32_t EGR; /*!< TIM event generation register, Address offset: 0x14 */ - __IO uint32_t CCMR1; /*!< TIM capture/compare mode register 1, Address offset: 0x18 */ - __IO uint32_t CCMR2; /*!< TIM capture/compare mode register 2, Address offset: 0x1C */ - __IO uint32_t CCER; /*!< TIM capture/compare enable register, Address offset: 0x20 */ - __IO uint32_t CNT; /*!< TIM counter register, Address offset: 0x24 */ - __IO uint32_t PSC; /*!< TIM prescaler, Address offset: 0x28 */ - __IO uint32_t ARR; /*!< TIM auto-reload register, Address offset: 0x2C */ - __IO uint32_t RCR; /*!< TIM repetition counter register, Address offset: 0x30 */ - __IO uint32_t CCR1; /*!< TIM capture/compare register 1, Address offset: 0x34 */ - __IO uint32_t CCR2; /*!< TIM capture/compare register 2, Address offset: 0x38 */ - __IO uint32_t CCR3; /*!< TIM capture/compare register 3, Address offset: 0x3C */ - __IO uint32_t CCR4; /*!< TIM capture/compare register 4, Address offset: 0x40 */ - __IO uint32_t BDTR; /*!< TIM break and dead-time register, Address offset: 0x44 */ - __IO uint32_t DCR; /*!< TIM DMA control register, Address offset: 0x48 */ - __IO uint32_t DMAR; /*!< TIM DMA address for full transfer, Address offset: 0x4C */ - __IO uint32_t OR; /*!< TIM option register, Address offset: 0x50 */ -} TIM_TypeDef; - -/** - * @brief Universal Synchronous Asynchronous Receiver Transmitter - */ - -typedef struct -{ - __IO uint32_t SR; /*!< USART Status register, Address offset: 0x00 */ - __IO uint32_t DR; /*!< USART Data register, Address offset: 0x04 */ - __IO uint32_t BRR; /*!< USART Baud rate register, Address offset: 0x08 */ - __IO uint32_t CR1; /*!< USART Control register 1, Address offset: 0x0C */ - __IO uint32_t CR2; /*!< USART Control register 2, Address offset: 0x10 */ - __IO uint32_t CR3; /*!< USART Control register 3, Address offset: 0x14 */ - __IO uint32_t GTPR; /*!< USART Guard time and prescaler register, Address offset: 0x18 */ -} USART_TypeDef; - -/** - * @brief Window WATCHDOG - */ - -typedef struct -{ - __IO uint32_t CR; /*!< WWDG Control register, Address offset: 0x00 */ - __IO uint32_t CFR; /*!< WWDG Configuration register, Address offset: 0x04 */ - __IO uint32_t SR; /*!< WWDG Status register, Address offset: 0x08 */ -} WWDG_TypeDef; - - -/** - * @brief RNG - */ - -typedef struct -{ - __IO uint32_t CR; /*!< RNG control register, Address offset: 0x00 */ - __IO uint32_t SR; /*!< RNG status register, Address offset: 0x04 */ - __IO uint32_t DR; /*!< RNG data register, Address offset: 0x08 */ -} RNG_TypeDef; - - - -/** - * @brief __USB_OTG_Core_register - */ -typedef struct -{ - __IO uint32_t GOTGCTL; /*!< USB_OTG Control and Status Register 000h*/ - __IO uint32_t GOTGINT; /*!< USB_OTG Interrupt Register 004h*/ - __IO uint32_t GAHBCFG; /*!< Core AHB Configuration Register 008h*/ - __IO uint32_t GUSBCFG; /*!< Core USB Configuration Register 00Ch*/ - __IO uint32_t GRSTCTL; /*!< Core Reset Register 010h*/ - __IO uint32_t GINTSTS; /*!< Core Interrupt Register 014h*/ - __IO uint32_t GINTMSK; /*!< Core Interrupt Mask Register 018h*/ - __IO uint32_t GRXSTSR; /*!< Receive Sts Q Read Register 01Ch*/ - __IO uint32_t GRXSTSP; /*!< Receive Sts Q Read & POP Register 020h*/ - __IO uint32_t GRXFSIZ; /* Receive FIFO Size Register 024h*/ - __IO uint32_t DIEPTXF0_HNPTXFSIZ; /*!< EP0 / Non Periodic Tx FIFO Size Register 028h*/ - __IO uint32_t HNPTXSTS; /*!< Non Periodic Tx FIFO/Queue Sts reg 02Ch*/ - uint32_t Reserved30[2]; /* Reserved 030h*/ - __IO uint32_t GCCFG; /* General Purpose IO Register 038h*/ - __IO uint32_t CID; /* User ID Register 03Ch*/ - uint32_t Reserved40[48]; /* Reserved 040h-0FFh*/ - __IO uint32_t HPTXFSIZ; /* Host Periodic Tx FIFO Size Reg 100h*/ - __IO uint32_t DIEPTXF[0x0F];/* dev Periodic Transmit FIFO */ -} -USB_OTG_GlobalTypeDef; - - - -/** - * @brief __device_Registers - */ -typedef struct -{ - __IO uint32_t DCFG; /* dev Configuration Register 800h*/ - __IO uint32_t DCTL; /* dev Control Register 804h*/ - __IO uint32_t DSTS; /* dev Status Register (RO) 808h*/ - uint32_t Reserved0C; /* Reserved 80Ch*/ - __IO uint32_t DIEPMSK; /* dev IN Endpoint Mask 810h*/ - __IO uint32_t DOEPMSK; /* dev OUT Endpoint Mask 814h*/ - __IO uint32_t DAINT; /* dev All Endpoints Itr Reg 818h*/ - __IO uint32_t DAINTMSK; /* dev All Endpoints Itr Mask 81Ch*/ - uint32_t Reserved20; /* Reserved 820h*/ - uint32_t Reserved9; /* Reserved 824h*/ - __IO uint32_t DVBUSDIS; /* dev VBUS discharge Register 828h*/ - __IO uint32_t DVBUSPULSE; /* dev VBUS Pulse Register 82Ch*/ - __IO uint32_t DTHRCTL; /* dev thr 830h*/ - __IO uint32_t DIEPEMPMSK; /* dev empty msk 834h*/ - __IO uint32_t DEACHINT; /* dedicated EP interrupt 838h*/ - __IO uint32_t DEACHMSK; /* dedicated EP msk 83Ch*/ - uint32_t Reserved40; /* dedicated EP mask 840h*/ - __IO uint32_t DINEP1MSK; /* dedicated EP mask 844h*/ - uint32_t Reserved44[15]; /* Reserved 844-87Ch*/ - __IO uint32_t DOUTEP1MSK; /* dedicated EP msk 884h*/ -} -USB_OTG_DeviceTypeDef; - - -/** - * @brief __IN_Endpoint-Specific_Register - */ -typedef struct -{ - __IO uint32_t DIEPCTL; /* dev IN Endpoint Control Reg 900h + (ep_num * 20h) + 00h*/ - uint32_t Reserved04; /* Reserved 900h + (ep_num * 20h) + 04h*/ - __IO uint32_t DIEPINT; /* dev IN Endpoint Itr Reg 900h + (ep_num * 20h) + 08h*/ - uint32_t Reserved0C; /* Reserved 900h + (ep_num * 20h) + 0Ch*/ - __IO uint32_t DIEPTSIZ; /* IN Endpoint Txfer Size 900h + (ep_num * 20h) + 10h*/ - __IO uint32_t DIEPDMA; /* IN Endpoint DMA Address Reg 900h + (ep_num * 20h) + 14h*/ - __IO uint32_t DTXFSTS;/*IN Endpoint Tx FIFO Status Reg 900h + (ep_num * 20h) + 18h*/ - uint32_t Reserved18; /* Reserved 900h+(ep_num*20h)+1Ch-900h+ (ep_num * 20h) + 1Ch*/ -} -USB_OTG_INEndpointTypeDef; - - -/** - * @brief __OUT_Endpoint-Specific_Registers - */ -typedef struct -{ - __IO uint32_t DOEPCTL; /* dev OUT Endpoint Control Reg B00h + (ep_num * 20h) + 00h*/ - uint32_t Reserved04; /* Reserved B00h + (ep_num * 20h) + 04h*/ - __IO uint32_t DOEPINT; /* dev OUT Endpoint Itr Reg B00h + (ep_num * 20h) + 08h*/ - uint32_t Reserved0C; /* Reserved B00h + (ep_num * 20h) + 0Ch*/ - __IO uint32_t DOEPTSIZ; /* dev OUT Endpoint Txfer Size B00h + (ep_num * 20h) + 10h*/ - __IO uint32_t DOEPDMA; /* dev OUT Endpoint DMA Address B00h + (ep_num * 20h) + 14h*/ - uint32_t Reserved18[2]; /* Reserved B00h + (ep_num * 20h) + 18h - B00h + (ep_num * 20h) + 1Ch*/ -} -USB_OTG_OUTEndpointTypeDef; - - -/** - * @brief __Host_Mode_Register_Structures - */ -typedef struct -{ - __IO uint32_t HCFG; /* Host Configuration Register 400h*/ - __IO uint32_t HFIR; /* Host Frame Interval Register 404h*/ - __IO uint32_t HFNUM; /* Host Frame Nbr/Frame Remaining 408h*/ - uint32_t Reserved40C; /* Reserved 40Ch*/ - __IO uint32_t HPTXSTS; /* Host Periodic Tx FIFO/ Queue Status 410h*/ - __IO uint32_t HAINT; /* Host All Channels Interrupt Register 414h*/ - __IO uint32_t HAINTMSK; /* Host All Channels Interrupt Mask 418h*/ -} -USB_OTG_HostTypeDef; - - -/** - * @brief __Host_Channel_Specific_Registers - */ -typedef struct -{ - __IO uint32_t HCCHAR; - __IO uint32_t HCSPLT; - __IO uint32_t HCINT; - __IO uint32_t HCINTMSK; - __IO uint32_t HCTSIZ; - __IO uint32_t HCDMA; - uint32_t Reserved[2]; -} -USB_OTG_HostChannelTypeDef; - - -/** - * @brief Peripheral_memory_map - */ -#define FLASH_BASE ((uint32_t)0x08000000) /*!< FLASH(up to 1 MB) base address in the alias region */ -#define SRAM1_BASE ((uint32_t)0x20000000) /*!< SRAM1(112 KB) base address in the alias region */ -#define SRAM2_BASE ((uint32_t)0x2001C000) /*!< SRAM2(16 KB) base address in the alias region */ -#define PERIPH_BASE ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */ -#define BKPSRAM_BASE ((uint32_t)0x40024000) /*!< Backup SRAM(4 KB) base address in the alias region */ -#define FSMC_R_BASE ((uint32_t)0xA0000000) /*!< FSMC registers base address */ -#define SRAM1_BB_BASE ((uint32_t)0x22000000) /*!< SRAM1(112 KB) base address in the bit-band region */ -#define SRAM2_BB_BASE ((uint32_t)0x22380000) /*!< SRAM2(16 KB) base address in the bit-band region */ -#define PERIPH_BB_BASE ((uint32_t)0x42000000) /*!< Peripheral base address in the bit-band region */ -#define BKPSRAM_BB_BASE ((uint32_t)0x42480000) /*!< Backup SRAM(4 KB) base address in the bit-band region */ -#define FLASH_END ((uint32_t)0x080FFFFF) /*!< FLASH end address */ - -/* Legacy defines */ -#define SRAM_BASE SRAM1_BASE -#define SRAM_BB_BASE SRAM1_BB_BASE - - -/*!< Peripheral memory map */ -#define APB1PERIPH_BASE PERIPH_BASE -#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000) -#define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000) -#define AHB2PERIPH_BASE (PERIPH_BASE + 0x10000000) - -/*!< APB1 peripherals */ -#define TIM2_BASE (APB1PERIPH_BASE + 0x0000) -#define TIM3_BASE (APB1PERIPH_BASE + 0x0400) -#define TIM4_BASE (APB1PERIPH_BASE + 0x0800) -#define TIM5_BASE (APB1PERIPH_BASE + 0x0C00) -#define TIM6_BASE (APB1PERIPH_BASE + 0x1000) -#define TIM7_BASE (APB1PERIPH_BASE + 0x1400) -#define TIM12_BASE (APB1PERIPH_BASE + 0x1800) -#define TIM13_BASE (APB1PERIPH_BASE + 0x1C00) -#define TIM14_BASE (APB1PERIPH_BASE + 0x2000) -#define RTC_BASE (APB1PERIPH_BASE + 0x2800) -#define WWDG_BASE (APB1PERIPH_BASE + 0x2C00) -#define IWDG_BASE (APB1PERIPH_BASE + 0x3000) -#define SPI2_BASE (APB1PERIPH_BASE + 0x3800) -#define SPI3_BASE (APB1PERIPH_BASE + 0x3C00) -#define USART2_BASE (APB1PERIPH_BASE + 0x4400) -#define USART3_BASE (APB1PERIPH_BASE + 0x4800) -#define UART4_BASE (APB1PERIPH_BASE + 0x4C00) -#define UART5_BASE (APB1PERIPH_BASE + 0x5000) -#define I2C1_BASE (APB1PERIPH_BASE + 0x5400) -#define I2C2_BASE (APB1PERIPH_BASE + 0x5800) -#define I2C3_BASE (APB1PERIPH_BASE + 0x5C00) -#define CAN1_BASE (APB1PERIPH_BASE + 0x6400) -#define CAN2_BASE (APB1PERIPH_BASE + 0x6800) -#define PWR_BASE (APB1PERIPH_BASE + 0x7000) -#define DAC_BASE (APB1PERIPH_BASE + 0x7400) - -/*!< APB2 peripherals */ -#define TIM1_BASE (APB2PERIPH_BASE + 0x0000) -#define TIM8_BASE (APB2PERIPH_BASE + 0x0400) -#define USART1_BASE (APB2PERIPH_BASE + 0x1000) -#define USART6_BASE (APB2PERIPH_BASE + 0x1400) -#define ADC1_BASE (APB2PERIPH_BASE + 0x2000) -#define ADC2_BASE (APB2PERIPH_BASE + 0x2100) -#define ADC3_BASE (APB2PERIPH_BASE + 0x2200) -#define ADC_BASE (APB2PERIPH_BASE + 0x2300) -#define SDIO_BASE (APB2PERIPH_BASE + 0x2C00) -#define SPI1_BASE (APB2PERIPH_BASE + 0x3000) -#define SYSCFG_BASE (APB2PERIPH_BASE + 0x3800) -#define EXTI_BASE (APB2PERIPH_BASE + 0x3C00) -#define TIM9_BASE (APB2PERIPH_BASE + 0x4000) -#define TIM10_BASE (APB2PERIPH_BASE + 0x4400) -#define TIM11_BASE (APB2PERIPH_BASE + 0x4800) - -/*!< AHB1 peripherals */ -#define GPIOA_BASE (AHB1PERIPH_BASE + 0x0000) -#define GPIOB_BASE (AHB1PERIPH_BASE + 0x0400) -#define GPIOC_BASE (AHB1PERIPH_BASE + 0x0800) -#define GPIOD_BASE (AHB1PERIPH_BASE + 0x0C00) -#define GPIOE_BASE (AHB1PERIPH_BASE + 0x1000) -#define GPIOF_BASE (AHB1PERIPH_BASE + 0x1400) -#define GPIOG_BASE (AHB1PERIPH_BASE + 0x1800) -#define GPIOH_BASE (AHB1PERIPH_BASE + 0x1C00) -#define GPIOI_BASE (AHB1PERIPH_BASE + 0x2000) -#define CRC_BASE (AHB1PERIPH_BASE + 0x3000) -#define RCC_BASE (AHB1PERIPH_BASE + 0x3800) -#define FLASH_R_BASE (AHB1PERIPH_BASE + 0x3C00) -#define DMA1_BASE (AHB1PERIPH_BASE + 0x6000) -#define DMA1_Stream0_BASE (DMA1_BASE + 0x010) -#define DMA1_Stream1_BASE (DMA1_BASE + 0x028) -#define DMA1_Stream2_BASE (DMA1_BASE + 0x040) -#define DMA1_Stream3_BASE (DMA1_BASE + 0x058) -#define DMA1_Stream4_BASE (DMA1_BASE + 0x070) -#define DMA1_Stream5_BASE (DMA1_BASE + 0x088) -#define DMA1_Stream6_BASE (DMA1_BASE + 0x0A0) -#define DMA1_Stream7_BASE (DMA1_BASE + 0x0B8) -#define DMA2_BASE (AHB1PERIPH_BASE + 0x6400) -#define DMA2_Stream0_BASE (DMA2_BASE + 0x010) -#define DMA2_Stream1_BASE (DMA2_BASE + 0x028) -#define DMA2_Stream2_BASE (DMA2_BASE + 0x040) -#define DMA2_Stream3_BASE (DMA2_BASE + 0x058) -#define DMA2_Stream4_BASE (DMA2_BASE + 0x070) -#define DMA2_Stream5_BASE (DMA2_BASE + 0x088) -#define DMA2_Stream6_BASE (DMA2_BASE + 0x0A0) -#define DMA2_Stream7_BASE (DMA2_BASE + 0x0B8) - -/*!< AHB2 peripherals */ -#define RNG_BASE (AHB2PERIPH_BASE + 0x60800) - -/*!< FSMC Bankx registers base address */ -#define FSMC_Bank1_R_BASE (FSMC_R_BASE + 0x0000) -#define FSMC_Bank1E_R_BASE (FSMC_R_BASE + 0x0104) -#define FSMC_Bank2_3_R_BASE (FSMC_R_BASE + 0x0060) -#define FSMC_Bank4_R_BASE (FSMC_R_BASE + 0x00A0) - -/* Debug MCU registers base address */ -#define DBGMCU_BASE ((uint32_t )0xE0042000) - -/*!< USB registers base address */ -#define USB_OTG_HS_PERIPH_BASE ((uint32_t )0x40040000) -#define USB_OTG_FS_PERIPH_BASE ((uint32_t )0x50000000) - -#define USB_OTG_GLOBAL_BASE ((uint32_t )0x000) -#define USB_OTG_DEVICE_BASE ((uint32_t )0x800) -#define USB_OTG_IN_ENDPOINT_BASE ((uint32_t )0x900) -#define USB_OTG_OUT_ENDPOINT_BASE ((uint32_t )0xB00) -#define USB_OTG_EP_REG_SIZE ((uint32_t )0x20) -#define USB_OTG_HOST_BASE ((uint32_t )0x400) -#define USB_OTG_HOST_PORT_BASE ((uint32_t )0x440) -#define USB_OTG_HOST_CHANNEL_BASE ((uint32_t )0x500) -#define USB_OTG_HOST_CHANNEL_SIZE ((uint32_t )0x20) -#define USB_OTG_PCGCCTL_BASE ((uint32_t )0xE00) -#define USB_OTG_FIFO_BASE ((uint32_t )0x1000) -#define USB_OTG_FIFO_SIZE ((uint32_t )0x1000) - -/** - * @} - */ - -/** @addtogroup Peripheral_declaration - * @{ - */ -#define TIM2 ((TIM_TypeDef *) TIM2_BASE) -#define TIM3 ((TIM_TypeDef *) TIM3_BASE) -#define TIM4 ((TIM_TypeDef *) TIM4_BASE) -#define TIM5 ((TIM_TypeDef *) TIM5_BASE) -#define TIM6 ((TIM_TypeDef *) TIM6_BASE) -#define TIM7 ((TIM_TypeDef *) TIM7_BASE) -#define TIM12 ((TIM_TypeDef *) TIM12_BASE) -#define TIM13 ((TIM_TypeDef *) TIM13_BASE) -#define TIM14 ((TIM_TypeDef *) TIM14_BASE) -#define RTC ((RTC_TypeDef *) RTC_BASE) -#define WWDG ((WWDG_TypeDef *) WWDG_BASE) -#define IWDG ((IWDG_TypeDef *) IWDG_BASE) -#define SPI2 ((SPI_TypeDef *) SPI2_BASE) -#define SPI3 ((SPI_TypeDef *) SPI3_BASE) -#define USART2 ((USART_TypeDef *) USART2_BASE) -#define USART3 ((USART_TypeDef *) USART3_BASE) -#define UART4 ((USART_TypeDef *) UART4_BASE) -#define UART5 ((USART_TypeDef *) UART5_BASE) -#define I2C1 ((I2C_TypeDef *) I2C1_BASE) -#define I2C2 ((I2C_TypeDef *) I2C2_BASE) -#define I2C3 ((I2C_TypeDef *) I2C3_BASE) -#define CAN1 ((CAN_TypeDef *) CAN1_BASE) -#define CAN2 ((CAN_TypeDef *) CAN2_BASE) -#define PWR ((PWR_TypeDef *) PWR_BASE) -#define DAC ((DAC_TypeDef *) DAC_BASE) -#define TIM1 ((TIM_TypeDef *) TIM1_BASE) -#define TIM8 ((TIM_TypeDef *) TIM8_BASE) -#define USART1 ((USART_TypeDef *) USART1_BASE) -#define USART6 ((USART_TypeDef *) USART6_BASE) -#define ADC ((ADC_Common_TypeDef *) ADC_BASE) -#define ADC1 ((ADC_TypeDef *) ADC1_BASE) -#define ADC2 ((ADC_TypeDef *) ADC2_BASE) -#define ADC3 ((ADC_TypeDef *) ADC3_BASE) -#define SDIO ((SDIO_TypeDef *) SDIO_BASE) -#define SPI1 ((SPI_TypeDef *) SPI1_BASE) -#define SYSCFG ((SYSCFG_TypeDef *) SYSCFG_BASE) -#define EXTI ((EXTI_TypeDef *) EXTI_BASE) -#define TIM9 ((TIM_TypeDef *) TIM9_BASE) -#define TIM10 ((TIM_TypeDef *) TIM10_BASE) -#define TIM11 ((TIM_TypeDef *) TIM11_BASE) -#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) -#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE) -#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE) -#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE) -#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE) -#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE) -#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE) -#define GPIOH ((GPIO_TypeDef *) GPIOH_BASE) -#define GPIOI ((GPIO_TypeDef *) GPIOI_BASE) -#define CRC ((CRC_TypeDef *) CRC_BASE) -#define RCC ((RCC_TypeDef *) RCC_BASE) -#define FLASH ((FLASH_TypeDef *) FLASH_R_BASE) -#define DMA1 ((DMA_TypeDef *) DMA1_BASE) -#define DMA1_Stream0 ((DMA_Stream_TypeDef *) DMA1_Stream0_BASE) -#define DMA1_Stream1 ((DMA_Stream_TypeDef *) DMA1_Stream1_BASE) -#define DMA1_Stream2 ((DMA_Stream_TypeDef *) DMA1_Stream2_BASE) -#define DMA1_Stream3 ((DMA_Stream_TypeDef *) DMA1_Stream3_BASE) -#define DMA1_Stream4 ((DMA_Stream_TypeDef *) DMA1_Stream4_BASE) -#define DMA1_Stream5 ((DMA_Stream_TypeDef *) DMA1_Stream5_BASE) -#define DMA1_Stream6 ((DMA_Stream_TypeDef *) DMA1_Stream6_BASE) -#define DMA1_Stream7 ((DMA_Stream_TypeDef *) DMA1_Stream7_BASE) -#define DMA2 ((DMA_TypeDef *) DMA2_BASE) -#define DMA2_Stream0 ((DMA_Stream_TypeDef *) DMA2_Stream0_BASE) -#define DMA2_Stream1 ((DMA_Stream_TypeDef *) DMA2_Stream1_BASE) -#define DMA2_Stream2 ((DMA_Stream_TypeDef *) DMA2_Stream2_BASE) -#define DMA2_Stream3 ((DMA_Stream_TypeDef *) DMA2_Stream3_BASE) -#define DMA2_Stream4 ((DMA_Stream_TypeDef *) DMA2_Stream4_BASE) -#define DMA2_Stream5 ((DMA_Stream_TypeDef *) DMA2_Stream5_BASE) -#define DMA2_Stream6 ((DMA_Stream_TypeDef *) DMA2_Stream6_BASE) -#define DMA2_Stream7 ((DMA_Stream_TypeDef *) DMA2_Stream7_BASE) -#define RNG ((RNG_TypeDef *) RNG_BASE) -#define FSMC_Bank1 ((FSMC_Bank1_TypeDef *) FSMC_Bank1_R_BASE) -#define FSMC_Bank1E ((FSMC_Bank1E_TypeDef *) FSMC_Bank1E_R_BASE) -#define FSMC_Bank2_3 ((FSMC_Bank2_3_TypeDef *) FSMC_Bank2_3_R_BASE) -#define FSMC_Bank4 ((FSMC_Bank4_TypeDef *) FSMC_Bank4_R_BASE) - -#define DBGMCU ((DBGMCU_TypeDef *) DBGMCU_BASE) - -#define USB_OTG_FS ((USB_OTG_GlobalTypeDef *) USB_OTG_FS_PERIPH_BASE) -#define USB_OTG_HS ((USB_OTG_GlobalTypeDef *) USB_OTG_HS_PERIPH_BASE) - -/** - * @} - */ - -/** @addtogroup Exported_constants - * @{ - */ - - /** @addtogroup Peripheral_Registers_Bits_Definition - * @{ - */ - -/******************************************************************************/ -/* Peripheral Registers_Bits_Definition */ -/******************************************************************************/ - -/******************************************************************************/ -/* */ -/* Analog to Digital Converter */ -/* */ -/******************************************************************************/ -/******************** Bit definition for ADC_SR register ********************/ -#define ADC_SR_AWD ((uint32_t)0x00000001) /*!
© COPYRIGHT(c) 2015 STMicroelectronics
- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/** @addtogroup CMSIS - * @{ - */ - -/** @addtogroup stm32f207xx - * @{ - */ - -#ifndef __STM32F207xx_H -#define __STM32F207xx_H - -#ifdef __cplusplus - extern "C" { -#endif /* __cplusplus */ - - -/** @addtogroup Configuration_section_for_CMSIS - * @{ - */ - -/** - * @brief Configuration of the Cortex-M3 Processor and Core Peripherals - */ -#define __CM3_REV 0x0200 /*!< Core revision r0p1 */ -#define __MPU_PRESENT 1 /*!< STM32F2XX provides an MPU */ -#define __NVIC_PRIO_BITS 4 /*!< STM32F2XX uses 4 Bits for the Priority Levels */ -#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */ - -/** - * @} - */ - -/** @addtogroup Peripheral_interrupt_number_definition - * @{ - */ - -/** - * @brief STM32F2XX Interrupt Number Definition, according to the selected device - * in @ref Library_configuration_section - */ -typedef enum -{ -/****** Cortex-M3 Processor Exceptions Numbers ****************************************************************/ - NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ - MemoryManagement_IRQn = -12, /*!< 4 Cortex-M3 Memory Management Interrupt */ - BusFault_IRQn = -11, /*!< 5 Cortex-M3 Bus Fault Interrupt */ - UsageFault_IRQn = -10, /*!< 6 Cortex-M3 Usage Fault Interrupt */ - SVCall_IRQn = -5, /*!< 11 Cortex-M3 SV Call Interrupt */ - DebugMonitor_IRQn = -4, /*!< 12 Cortex-M3 Debug Monitor Interrupt */ - PendSV_IRQn = -2, /*!< 14 Cortex-M3 Pend SV Interrupt */ - SysTick_IRQn = -1, /*!< 15 Cortex-M3 System Tick Interrupt */ -/****** STM32 specific Interrupt Numbers **********************************************************************/ - WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */ - PVD_IRQn = 1, /*!< PVD through EXTI Line detection Interrupt */ - TAMP_STAMP_IRQn = 2, /*!< Tamper and TimeStamp interrupts through the EXTI line */ - RTC_WKUP_IRQn = 3, /*!< RTC Wakeup interrupt through the EXTI line */ - FLASH_IRQn = 4, /*!< FLASH global Interrupt */ - RCC_IRQn = 5, /*!< RCC global Interrupt */ - EXTI0_IRQn = 6, /*!< EXTI Line0 Interrupt */ - EXTI1_IRQn = 7, /*!< EXTI Line1 Interrupt */ - EXTI2_IRQn = 8, /*!< EXTI Line2 Interrupt */ - EXTI3_IRQn = 9, /*!< EXTI Line3 Interrupt */ - EXTI4_IRQn = 10, /*!< EXTI Line4 Interrupt */ - DMA1_Stream0_IRQn = 11, /*!< DMA1 Stream 0 global Interrupt */ - DMA1_Stream1_IRQn = 12, /*!< DMA1 Stream 1 global Interrupt */ - DMA1_Stream2_IRQn = 13, /*!< DMA1 Stream 2 global Interrupt */ - DMA1_Stream3_IRQn = 14, /*!< DMA1 Stream 3 global Interrupt */ - DMA1_Stream4_IRQn = 15, /*!< DMA1 Stream 4 global Interrupt */ - DMA1_Stream5_IRQn = 16, /*!< DMA1 Stream 5 global Interrupt */ - DMA1_Stream6_IRQn = 17, /*!< DMA1 Stream 6 global Interrupt */ - ADC_IRQn = 18, /*!< ADC1, ADC2 and ADC3 global Interrupts */ - CAN1_TX_IRQn = 19, /*!< CAN1 TX Interrupt */ - CAN1_RX0_IRQn = 20, /*!< CAN1 RX0 Interrupt */ - CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ - CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ - EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ - TIM1_BRK_TIM9_IRQn = 24, /*!< TIM1 Break interrupt and TIM9 global interrupt */ - TIM1_UP_TIM10_IRQn = 25, /*!< TIM1 Update Interrupt and TIM10 global interrupt */ - TIM1_TRG_COM_TIM11_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt and TIM11 global interrupt */ - TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ - TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ - TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ - TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ - I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ - I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ - I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ - I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ - SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ - SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ - USART1_IRQn = 37, /*!< USART1 global Interrupt */ - USART2_IRQn = 38, /*!< USART2 global Interrupt */ - USART3_IRQn = 39, /*!< USART3 global Interrupt */ - EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ - RTC_Alarm_IRQn = 41, /*!< RTC Alarm (A and B) through EXTI Line Interrupt */ - OTG_FS_WKUP_IRQn = 42, /*!< USB OTG FS Wakeup through EXTI line interrupt */ - TIM8_BRK_TIM12_IRQn = 43, /*!< TIM8 Break Interrupt and TIM12 global interrupt */ - TIM8_UP_TIM13_IRQn = 44, /*!< TIM8 Update Interrupt and TIM13 global interrupt */ - TIM8_TRG_COM_TIM14_IRQn = 45, /*!< TIM8 Trigger and Commutation Interrupt and TIM14 global interrupt */ - TIM8_CC_IRQn = 46, /*!< TIM8 Capture Compare Interrupt */ - DMA1_Stream7_IRQn = 47, /*!< DMA1 Stream7 Interrupt */ - FSMC_IRQn = 48, /*!< FSMC global Interrupt */ - SDIO_IRQn = 49, /*!< SDIO global Interrupt */ - TIM5_IRQn = 50, /*!< TIM5 global Interrupt */ - SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ - UART4_IRQn = 52, /*!< UART4 global Interrupt */ - UART5_IRQn = 53, /*!< UART5 global Interrupt */ - TIM6_DAC_IRQn = 54, /*!< TIM6 global and DAC1&2 underrun error interrupts */ - TIM7_IRQn = 55, /*!< TIM7 global interrupt */ - DMA2_Stream0_IRQn = 56, /*!< DMA2 Stream 0 global Interrupt */ - DMA2_Stream1_IRQn = 57, /*!< DMA2 Stream 1 global Interrupt */ - DMA2_Stream2_IRQn = 58, /*!< DMA2 Stream 2 global Interrupt */ - DMA2_Stream3_IRQn = 59, /*!< DMA2 Stream 3 global Interrupt */ - DMA2_Stream4_IRQn = 60, /*!< DMA2 Stream 4 global Interrupt */ - ETH_IRQn = 61, /*!< Ethernet global Interrupt */ - ETH_WKUP_IRQn = 62, /*!< Ethernet Wakeup through EXTI line Interrupt */ - CAN2_TX_IRQn = 63, /*!< CAN2 TX Interrupt */ - CAN2_RX0_IRQn = 64, /*!< CAN2 RX0 Interrupt */ - CAN2_RX1_IRQn = 65, /*!< CAN2 RX1 Interrupt */ - CAN2_SCE_IRQn = 66, /*!< CAN2 SCE Interrupt */ - OTG_FS_IRQn = 67, /*!< USB OTG FS global Interrupt */ - DMA2_Stream5_IRQn = 68, /*!< DMA2 Stream 5 global interrupt */ - DMA2_Stream6_IRQn = 69, /*!< DMA2 Stream 6 global interrupt */ - DMA2_Stream7_IRQn = 70, /*!< DMA2 Stream 7 global interrupt */ - USART6_IRQn = 71, /*!< USART6 global interrupt */ - I2C3_EV_IRQn = 72, /*!< I2C3 event interrupt */ - I2C3_ER_IRQn = 73, /*!< I2C3 error interrupt */ - OTG_HS_EP1_OUT_IRQn = 74, /*!< USB OTG HS End Point 1 Out global interrupt */ - OTG_HS_EP1_IN_IRQn = 75, /*!< USB OTG HS End Point 1 In global interrupt */ - OTG_HS_WKUP_IRQn = 76, /*!< USB OTG HS Wakeup through EXTI interrupt */ - OTG_HS_IRQn = 77, /*!< USB OTG HS global interrupt */ - DCMI_IRQn = 78, /*!< DCMI global interrupt */ - HASH_RNG_IRQn = 80 /*!< Hash and Rng global interrupt */ -} IRQn_Type; - -/** - * @} - */ - -#include "core_cm3.h" -#include "system_stm32f2xx.h" -#include - -/** @addtogroup Peripheral_registers_structures - * @{ - */ - -/** - * @brief Analog to Digital Converter - */ - -typedef struct -{ - __IO uint32_t SR; /*!< ADC status register, Address offset: 0x00 */ - __IO uint32_t CR1; /*!< ADC control register 1, Address offset: 0x04 */ - __IO uint32_t CR2; /*!< ADC control register 2, Address offset: 0x08 */ - __IO uint32_t SMPR1; /*!< ADC sample time register 1, Address offset: 0x0C */ - __IO uint32_t SMPR2; /*!< ADC sample time register 2, Address offset: 0x10 */ - __IO uint32_t JOFR1; /*!< ADC injected channel data offset register 1, Address offset: 0x14 */ - __IO uint32_t JOFR2; /*!< ADC injected channel data offset register 2, Address offset: 0x18 */ - __IO uint32_t JOFR3; /*!< ADC injected channel data offset register 3, Address offset: 0x1C */ - __IO uint32_t JOFR4; /*!< ADC injected channel data offset register 4, Address offset: 0x20 */ - __IO uint32_t HTR; /*!< ADC watchdog higher threshold register, Address offset: 0x24 */ - __IO uint32_t LTR; /*!< ADC watchdog lower threshold register, Address offset: 0x28 */ - __IO uint32_t SQR1; /*!< ADC regular sequence register 1, Address offset: 0x2C */ - __IO uint32_t SQR2; /*!< ADC regular sequence register 2, Address offset: 0x30 */ - __IO uint32_t SQR3; /*!< ADC regular sequence register 3, Address offset: 0x34 */ - __IO uint32_t JSQR; /*!< ADC injected sequence register, Address offset: 0x38*/ - __IO uint32_t JDR1; /*!< ADC injected data register 1, Address offset: 0x3C */ - __IO uint32_t JDR2; /*!< ADC injected data register 2, Address offset: 0x40 */ - __IO uint32_t JDR3; /*!< ADC injected data register 3, Address offset: 0x44 */ - __IO uint32_t JDR4; /*!< ADC injected data register 4, Address offset: 0x48 */ - __IO uint32_t DR; /*!< ADC regular data register, Address offset: 0x4C */ -} ADC_TypeDef; - -typedef struct -{ - __IO uint32_t CSR; /*!< ADC Common status register, Address offset: ADC1 base address + 0x300 */ - __IO uint32_t CCR; /*!< ADC common control register, Address offset: ADC1 base address + 0x304 */ - __IO uint32_t CDR; /*!< ADC common regular data register for dual - AND triple modes, Address offset: ADC1 base address + 0x308 */ -} ADC_Common_TypeDef; - - -/** - * @brief Controller Area Network TxMailBox - */ - -typedef struct -{ - __IO uint32_t TIR; /*!< CAN TX mailbox identifier register */ - __IO uint32_t TDTR; /*!< CAN mailbox data length control and time stamp register */ - __IO uint32_t TDLR; /*!< CAN mailbox data low register */ - __IO uint32_t TDHR; /*!< CAN mailbox data high register */ -} CAN_TxMailBox_TypeDef; - -/** - * @brief Controller Area Network FIFOMailBox - */ - -typedef struct -{ - __IO uint32_t RIR; /*!< CAN receive FIFO mailbox identifier register */ - __IO uint32_t RDTR; /*!< CAN receive FIFO mailbox data length control and time stamp register */ - __IO uint32_t RDLR; /*!< CAN receive FIFO mailbox data low register */ - __IO uint32_t RDHR; /*!< CAN receive FIFO mailbox data high register */ -} CAN_FIFOMailBox_TypeDef; - -/** - * @brief Controller Area Network FilterRegister - */ - -typedef struct -{ - __IO uint32_t FR1; /*!< CAN Filter bank register 1 */ - __IO uint32_t FR2; /*!< CAN Filter bank register 1 */ -} CAN_FilterRegister_TypeDef; - -/** - * @brief Controller Area Network - */ - -typedef struct -{ - __IO uint32_t MCR; /*!< CAN master control register, Address offset: 0x00 */ - __IO uint32_t MSR; /*!< CAN master status register, Address offset: 0x04 */ - __IO uint32_t TSR; /*!< CAN transmit status register, Address offset: 0x08 */ - __IO uint32_t RF0R; /*!< CAN receive FIFO 0 register, Address offset: 0x0C */ - __IO uint32_t RF1R; /*!< CAN receive FIFO 1 register, Address offset: 0x10 */ - __IO uint32_t IER; /*!< CAN interrupt enable register, Address offset: 0x14 */ - __IO uint32_t ESR; /*!< CAN error status register, Address offset: 0x18 */ - __IO uint32_t BTR; /*!< CAN bit timing register, Address offset: 0x1C */ - uint32_t RESERVED0[88]; /*!< Reserved, 0x020 - 0x17F */ - CAN_TxMailBox_TypeDef sTxMailBox[3]; /*!< CAN Tx MailBox, Address offset: 0x180 - 0x1AC */ - CAN_FIFOMailBox_TypeDef sFIFOMailBox[2]; /*!< CAN FIFO MailBox, Address offset: 0x1B0 - 0x1CC */ - uint32_t RESERVED1[12]; /*!< Reserved, 0x1D0 - 0x1FF */ - __IO uint32_t FMR; /*!< CAN filter master register, Address offset: 0x200 */ - __IO uint32_t FM1R; /*!< CAN filter mode register, Address offset: 0x204 */ - uint32_t RESERVED2; /*!< Reserved, 0x208 */ - __IO uint32_t FS1R; /*!< CAN filter scale register, Address offset: 0x20C */ - uint32_t RESERVED3; /*!< Reserved, 0x210 */ - __IO uint32_t FFA1R; /*!< CAN filter FIFO assignment register, Address offset: 0x214 */ - uint32_t RESERVED4; /*!< Reserved, 0x218 */ - __IO uint32_t FA1R; /*!< CAN filter activation register, Address offset: 0x21C */ - uint32_t RESERVED5[8]; /*!< Reserved, 0x220-0x23F */ - CAN_FilterRegister_TypeDef sFilterRegister[28]; /*!< CAN Filter Register, Address offset: 0x240-0x31C */ -} CAN_TypeDef; - -/** - * @brief CRC calculation unit - */ - -typedef struct -{ - __IO uint32_t DR; /*!< CRC Data register, Address offset: 0x00 */ - __IO uint8_t IDR; /*!< CRC Independent data register, Address offset: 0x04 */ - uint8_t RESERVED0; /*!< Reserved, 0x05 */ - uint16_t RESERVED1; /*!< Reserved, 0x06 */ - __IO uint32_t CR; /*!< CRC Control register, Address offset: 0x08 */ -} CRC_TypeDef; - -/** - * @brief Digital to Analog Converter - */ - -typedef struct -{ - __IO uint32_t CR; /*!< DAC control register, Address offset: 0x00 */ - __IO uint32_t SWTRIGR; /*!< DAC software trigger register, Address offset: 0x04 */ - __IO uint32_t DHR12R1; /*!< DAC channel1 12-bit right-aligned data holding register, Address offset: 0x08 */ - __IO uint32_t DHR12L1; /*!< DAC channel1 12-bit left aligned data holding register, Address offset: 0x0C */ - __IO uint32_t DHR8R1; /*!< DAC channel1 8-bit right aligned data holding register, Address offset: 0x10 */ - __IO uint32_t DHR12R2; /*!< DAC channel2 12-bit right aligned data holding register, Address offset: 0x14 */ - __IO uint32_t DHR12L2; /*!< DAC channel2 12-bit left aligned data holding register, Address offset: 0x18 */ - __IO uint32_t DHR8R2; /*!< DAC channel2 8-bit right-aligned data holding register, Address offset: 0x1C */ - __IO uint32_t DHR12RD; /*!< Dual DAC 12-bit right-aligned data holding register, Address offset: 0x20 */ - __IO uint32_t DHR12LD; /*!< DUAL DAC 12-bit left aligned data holding register, Address offset: 0x24 */ - __IO uint32_t DHR8RD; /*!< DUAL DAC 8-bit right aligned data holding register, Address offset: 0x28 */ - __IO uint32_t DOR1; /*!< DAC channel1 data output register, Address offset: 0x2C */ - __IO uint32_t DOR2; /*!< DAC channel2 data output register, Address offset: 0x30 */ - __IO uint32_t SR; /*!< DAC status register, Address offset: 0x34 */ -} DAC_TypeDef; - -/** - * @brief Debug MCU - */ - -typedef struct -{ - __IO uint32_t IDCODE; /*!< MCU device ID code, Address offset: 0x00 */ - __IO uint32_t CR; /*!< Debug MCU configuration register, Address offset: 0x04 */ - __IO uint32_t APB1FZ; /*!< Debug MCU APB1 freeze register, Address offset: 0x08 */ - __IO uint32_t APB2FZ; /*!< Debug MCU APB2 freeze register, Address offset: 0x0C */ -}DBGMCU_TypeDef; - -/** - * @brief DCMI - */ - -typedef struct -{ - __IO uint32_t CR; /*!< DCMI control register 1, Address offset: 0x00 */ - __IO uint32_t SR; /*!< DCMI status register, Address offset: 0x04 */ - __IO uint32_t RISR; /*!< DCMI raw interrupt status register, Address offset: 0x08 */ - __IO uint32_t IER; /*!< DCMI interrupt enable register, Address offset: 0x0C */ - __IO uint32_t MISR; /*!< DCMI masked interrupt status register, Address offset: 0x10 */ - __IO uint32_t ICR; /*!< DCMI interrupt clear register, Address offset: 0x14 */ - __IO uint32_t ESCR; /*!< DCMI embedded synchronization code register, Address offset: 0x18 */ - __IO uint32_t ESUR; /*!< DCMI embedded synchronization unmask register, Address offset: 0x1C */ - __IO uint32_t CWSTRTR; /*!< DCMI crop window start, Address offset: 0x20 */ - __IO uint32_t CWSIZER; /*!< DCMI crop window size, Address offset: 0x24 */ - __IO uint32_t DR; /*!< DCMI data register, Address offset: 0x28 */ -} DCMI_TypeDef; - -/** - * @brief DMA Controller - */ - -typedef struct -{ - __IO uint32_t CR; /*!< DMA stream x configuration register */ - __IO uint32_t NDTR; /*!< DMA stream x number of data register */ - __IO uint32_t PAR; /*!< DMA stream x peripheral address register */ - __IO uint32_t M0AR; /*!< DMA stream x memory 0 address register */ - __IO uint32_t M1AR; /*!< DMA stream x memory 1 address register */ - __IO uint32_t FCR; /*!< DMA stream x FIFO control register */ -} DMA_Stream_TypeDef; - -typedef struct -{ - __IO uint32_t LISR; /*!< DMA low interrupt status register, Address offset: 0x00 */ - __IO uint32_t HISR; /*!< DMA high interrupt status register, Address offset: 0x04 */ - __IO uint32_t LIFCR; /*!< DMA low interrupt flag clear register, Address offset: 0x08 */ - __IO uint32_t HIFCR; /*!< DMA high interrupt flag clear register, Address offset: 0x0C */ -} DMA_TypeDef; - - -/** - * @brief Ethernet MAC - */ - -typedef struct -{ - __IO uint32_t MACCR; - __IO uint32_t MACFFR; - __IO uint32_t MACHTHR; - __IO uint32_t MACHTLR; - __IO uint32_t MACMIIAR; - __IO uint32_t MACMIIDR; - __IO uint32_t MACFCR; - __IO uint32_t MACVLANTR; /* 8 */ - uint32_t RESERVED0[2]; - __IO uint32_t MACRWUFFR; /* 11 */ - __IO uint32_t MACPMTCSR; - uint32_t RESERVED1[2]; - __IO uint32_t MACSR; /* 15 */ - __IO uint32_t MACIMR; - __IO uint32_t MACA0HR; - __IO uint32_t MACA0LR; - __IO uint32_t MACA1HR; - __IO uint32_t MACA1LR; - __IO uint32_t MACA2HR; - __IO uint32_t MACA2LR; - __IO uint32_t MACA3HR; - __IO uint32_t MACA3LR; /* 24 */ - uint32_t RESERVED2[40]; - __IO uint32_t MMCCR; /* 65 */ - __IO uint32_t MMCRIR; - __IO uint32_t MMCTIR; - __IO uint32_t MMCRIMR; - __IO uint32_t MMCTIMR; /* 69 */ - uint32_t RESERVED3[14]; - __IO uint32_t MMCTGFSCCR; /* 84 */ - __IO uint32_t MMCTGFMSCCR; - uint32_t RESERVED4[5]; - __IO uint32_t MMCTGFCR; - uint32_t RESERVED5[10]; - __IO uint32_t MMCRFCECR; - __IO uint32_t MMCRFAECR; - uint32_t RESERVED6[10]; - __IO uint32_t MMCRGUFCR; - uint32_t RESERVED7[334]; - __IO uint32_t PTPTSCR; - __IO uint32_t PTPSSIR; - __IO uint32_t PTPTSHR; - __IO uint32_t PTPTSLR; - __IO uint32_t PTPTSHUR; - __IO uint32_t PTPTSLUR; - __IO uint32_t PTPTSAR; - __IO uint32_t PTPTTHR; - __IO uint32_t PTPTTLR; - __IO uint32_t RESERVED8; - __IO uint32_t PTPTSSR; - uint32_t RESERVED9[565]; - __IO uint32_t DMABMR; - __IO uint32_t DMATPDR; - __IO uint32_t DMARPDR; - __IO uint32_t DMARDLAR; - __IO uint32_t DMATDLAR; - __IO uint32_t DMASR; - __IO uint32_t DMAOMR; - __IO uint32_t DMAIER; - __IO uint32_t DMAMFBOCR; - __IO uint32_t DMARSWTR; - uint32_t RESERVED10[8]; - __IO uint32_t DMACHTDR; - __IO uint32_t DMACHRDR; - __IO uint32_t DMACHTBAR; - __IO uint32_t DMACHRBAR; -} ETH_TypeDef; - -/** - * @brief External Interrupt/Event Controller - */ - -typedef struct -{ - __IO uint32_t IMR; /*!< EXTI Interrupt mask register, Address offset: 0x00 */ - __IO uint32_t EMR; /*!< EXTI Event mask register, Address offset: 0x04 */ - __IO uint32_t RTSR; /*!< EXTI Rising trigger selection register, Address offset: 0x08 */ - __IO uint32_t FTSR; /*!< EXTI Falling trigger selection register, Address offset: 0x0C */ - __IO uint32_t SWIER; /*!< EXTI Software interrupt event register, Address offset: 0x10 */ - __IO uint32_t PR; /*!< EXTI Pending register, Address offset: 0x14 */ -} EXTI_TypeDef; - -/** - * @brief FLASH Registers - */ - -typedef struct -{ - __IO uint32_t ACR; /*!< FLASH access control register, Address offset: 0x00 */ - __IO uint32_t KEYR; /*!< FLASH key register, Address offset: 0x04 */ - __IO uint32_t OPTKEYR; /*!< FLASH option key register, Address offset: 0x08 */ - __IO uint32_t SR; /*!< FLASH status register, Address offset: 0x0C */ - __IO uint32_t CR; /*!< FLASH control register, Address offset: 0x10 */ - __IO uint32_t OPTCR; /*!< FLASH option control register, Address offset: 0x14 */ -} FLASH_TypeDef; - - -/** - * @brief Flexible Static Memory Controller - */ - -typedef struct -{ - __IO uint32_t BTCR[8]; /*!< NOR/PSRAM chip-select control register(BCR) and chip-select timing register(BTR), Address offset: 0x00-1C */ -} FSMC_Bank1_TypeDef; - -/** - * @brief Flexible Static Memory Controller Bank1E - */ - -typedef struct -{ - __IO uint32_t BWTR[7]; /*!< NOR/PSRAM write timing registers, Address offset: 0x104-0x11C */ -} FSMC_Bank1E_TypeDef; - -/** - * @brief Flexible Static Memory Controller Bank2 - */ - -typedef struct -{ - __IO uint32_t PCR2; /*!< NAND Flash control register 2, Address offset: 0x60 */ - __IO uint32_t SR2; /*!< NAND Flash FIFO status and interrupt register 2, Address offset: 0x64 */ - __IO uint32_t PMEM2; /*!< NAND Flash Common memory space timing register 2, Address offset: 0x68 */ - __IO uint32_t PATT2; /*!< NAND Flash Attribute memory space timing register 2, Address offset: 0x6C */ - uint32_t RESERVED0; /*!< Reserved, 0x70 */ - __IO uint32_t ECCR2; /*!< NAND Flash ECC result registers 2, Address offset: 0x74 */ - uint32_t RESERVED1; /*!< Reserved, 0x78 */ - uint32_t RESERVED2; /*!< Reserved, 0x7C */ - __IO uint32_t PCR3; /*!< NAND Flash control register 3, Address offset: 0x80 */ - __IO uint32_t SR3; /*!< NAND Flash FIFO status and interrupt register 3, Address offset: 0x84 */ - __IO uint32_t PMEM3; /*!< NAND Flash Common memory space timing register 3, Address offset: 0x88 */ - __IO uint32_t PATT3; /*!< NAND Flash Attribute memory space timing register 3, Address offset: 0x8C */ - uint32_t RESERVED3; /*!< Reserved, 0x90 */ - __IO uint32_t ECCR3; /*!< NAND Flash ECC result registers 3, Address offset: 0x94 */ -} FSMC_Bank2_3_TypeDef; - -/** - * @brief Flexible Static Memory Controller Bank4 - */ - -typedef struct -{ - __IO uint32_t PCR4; /*!< PC Card control register 4, Address offset: 0xA0 */ - __IO uint32_t SR4; /*!< PC Card FIFO status and interrupt register 4, Address offset: 0xA4 */ - __IO uint32_t PMEM4; /*!< PC Card Common memory space timing register 4, Address offset: 0xA8 */ - __IO uint32_t PATT4; /*!< PC Card Attribute memory space timing register 4, Address offset: 0xAC */ - __IO uint32_t PIO4; /*!< PC Card I/O space timing register 4, Address offset: 0xB0 */ -} FSMC_Bank4_TypeDef; - - -/** - * @brief General Purpose I/O - */ - -typedef struct -{ - __IO uint32_t MODER; /*!< GPIO port mode register, Address offset: 0x00 */ - __IO uint32_t OTYPER; /*!< GPIO port output type register, Address offset: 0x04 */ - __IO uint32_t OSPEEDR; /*!< GPIO port output speed register, Address offset: 0x08 */ - __IO uint32_t PUPDR; /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */ - __IO uint32_t IDR; /*!< GPIO port input data register, Address offset: 0x10 */ - __IO uint32_t ODR; /*!< GPIO port output data register, Address offset: 0x14 */ - __IO uint32_t BSRR; /*!< GPIO port bit set/reset register, Address offset: 0x18 */ - __IO uint32_t LCKR; /*!< GPIO port configuration lock register, Address offset: 0x1C */ - __IO uint32_t AFR[2]; /*!< GPIO alternate function registers, Address offset: 0x20-0x24 */ -} GPIO_TypeDef; - -/** - * @brief System configuration controller - */ - -typedef struct -{ - __IO uint32_t MEMRMP; /*!< SYSCFG memory remap register, Address offset: 0x00 */ - __IO uint32_t PMC; /*!< SYSCFG peripheral mode configuration register, Address offset: 0x04 */ - __IO uint32_t EXTICR[4]; /*!< SYSCFG external interrupt configuration registers, Address offset: 0x08-0x14 */ - uint32_t RESERVED[2]; /*!< Reserved, 0x18-0x1C */ - __IO uint32_t CMPCR; /*!< SYSCFG Compensation cell control register, Address offset: 0x20 */ -} SYSCFG_TypeDef; - -/** - * @brief Inter-integrated Circuit Interface - */ - -typedef struct -{ - __IO uint32_t CR1; /*!< I2C Control register 1, Address offset: 0x00 */ - __IO uint32_t CR2; /*!< I2C Control register 2, Address offset: 0x04 */ - __IO uint32_t OAR1; /*!< I2C Own address register 1, Address offset: 0x08 */ - __IO uint32_t OAR2; /*!< I2C Own address register 2, Address offset: 0x0C */ - __IO uint32_t DR; /*!< I2C Data register, Address offset: 0x10 */ - __IO uint32_t SR1; /*!< I2C Status register 1, Address offset: 0x14 */ - __IO uint32_t SR2; /*!< I2C Status register 2, Address offset: 0x18 */ - __IO uint32_t CCR; /*!< I2C Clock control register, Address offset: 0x1C */ - __IO uint32_t TRISE; /*!< I2C TRISE register, Address offset: 0x20 */ - __IO uint32_t FLTR; /*!< I2C FLTR register, Address offset: 0x24 */ -} I2C_TypeDef; - -/** - * @brief Independent WATCHDOG - */ - -typedef struct -{ - __IO uint32_t KR; /*!< IWDG Key register, Address offset: 0x00 */ - __IO uint32_t PR; /*!< IWDG Prescaler register, Address offset: 0x04 */ - __IO uint32_t RLR; /*!< IWDG Reload register, Address offset: 0x08 */ - __IO uint32_t SR; /*!< IWDG Status register, Address offset: 0x0C */ -} IWDG_TypeDef; - -/** - * @brief Power Control - */ - -typedef struct -{ - __IO uint32_t CR; /*!< PWR power control register, Address offset: 0x00 */ - __IO uint32_t CSR; /*!< PWR power control/status register, Address offset: 0x04 */ -} PWR_TypeDef; - -/** - * @brief Reset and Clock Control - */ - -typedef struct -{ - __IO uint32_t CR; /*!< RCC clock control register, Address offset: 0x00 */ - __IO uint32_t PLLCFGR; /*!< RCC PLL configuration register, Address offset: 0x04 */ - __IO uint32_t CFGR; /*!< RCC clock configuration register, Address offset: 0x08 */ - __IO uint32_t CIR; /*!< RCC clock interrupt register, Address offset: 0x0C */ - __IO uint32_t AHB1RSTR; /*!< RCC AHB1 peripheral reset register, Address offset: 0x10 */ - __IO uint32_t AHB2RSTR; /*!< RCC AHB2 peripheral reset register, Address offset: 0x14 */ - __IO uint32_t AHB3RSTR; /*!< RCC AHB3 peripheral reset register, Address offset: 0x18 */ - uint32_t RESERVED0; /*!< Reserved, 0x1C */ - __IO uint32_t APB1RSTR; /*!< RCC APB1 peripheral reset register, Address offset: 0x20 */ - __IO uint32_t APB2RSTR; /*!< RCC APB2 peripheral reset register, Address offset: 0x24 */ - uint32_t RESERVED1[2]; /*!< Reserved, 0x28-0x2C */ - __IO uint32_t AHB1ENR; /*!< RCC AHB1 peripheral clock register, Address offset: 0x30 */ - __IO uint32_t AHB2ENR; /*!< RCC AHB2 peripheral clock register, Address offset: 0x34 */ - __IO uint32_t AHB3ENR; /*!< RCC AHB3 peripheral clock register, Address offset: 0x38 */ - uint32_t RESERVED2; /*!< Reserved, 0x3C */ - __IO uint32_t APB1ENR; /*!< RCC APB1 peripheral clock enable register, Address offset: 0x40 */ - __IO uint32_t APB2ENR; /*!< RCC APB2 peripheral clock enable register, Address offset: 0x44 */ - uint32_t RESERVED3[2]; /*!< Reserved, 0x48-0x4C */ - __IO uint32_t AHB1LPENR; /*!< RCC AHB1 peripheral clock enable in low power mode register, Address offset: 0x50 */ - __IO uint32_t AHB2LPENR; /*!< RCC AHB2 peripheral clock enable in low power mode register, Address offset: 0x54 */ - __IO uint32_t AHB3LPENR; /*!< RCC AHB3 peripheral clock enable in low power mode register, Address offset: 0x58 */ - uint32_t RESERVED4; /*!< Reserved, 0x5C */ - __IO uint32_t APB1LPENR; /*!< RCC APB1 peripheral clock enable in low power mode register, Address offset: 0x60 */ - __IO uint32_t APB2LPENR; /*!< RCC APB2 peripheral clock enable in low power mode register, Address offset: 0x64 */ - uint32_t RESERVED5[2]; /*!< Reserved, 0x68-0x6C */ - __IO uint32_t BDCR; /*!< RCC Backup domain control register, Address offset: 0x70 */ - __IO uint32_t CSR; /*!< RCC clock control & status register, Address offset: 0x74 */ - uint32_t RESERVED6[2]; /*!< Reserved, 0x78-0x7C */ - __IO uint32_t SSCGR; /*!< RCC spread spectrum clock generation register, Address offset: 0x80 */ - __IO uint32_t PLLI2SCFGR; /*!< RCC PLLI2S configuration register, Address offset: 0x84 */ - -} RCC_TypeDef; - -/** - * @brief Real-Time Clock - */ - -typedef struct -{ - __IO uint32_t TR; /*!< RTC time register, Address offset: 0x00 */ - __IO uint32_t DR; /*!< RTC date register, Address offset: 0x04 */ - __IO uint32_t CR; /*!< RTC control register, Address offset: 0x08 */ - __IO uint32_t ISR; /*!< RTC initialization and status register, Address offset: 0x0C */ - __IO uint32_t PRER; /*!< RTC prescaler register, Address offset: 0x10 */ - __IO uint32_t WUTR; /*!< RTC wakeup timer register, Address offset: 0x14 */ - __IO uint32_t CALIBR; /*!< RTC calibration register, Address offset: 0x18 */ - __IO uint32_t ALRMAR; /*!< RTC alarm A register, Address offset: 0x1C */ - __IO uint32_t ALRMBR; /*!< RTC alarm B register, Address offset: 0x20 */ - __IO uint32_t WPR; /*!< RTC write protection register, Address offset: 0x24 */ - uint32_t RESERVED1; /*!< Reserved, 0x28 */ - uint32_t RESERVED2; /*!< Reserved, 0x2C */ - __IO uint32_t TSTR; /*!< RTC time stamp time register, Address offset: 0x30 */ - __IO uint32_t TSDR; /*!< RTC time stamp date register, Address offset: 0x34 */ - uint32_t RESERVED3; /*!< Reserved, 0x38 */ - uint32_t RESERVED4; /*!< Reserved, 0x3C */ - __IO uint32_t TAFCR; /*!< RTC tamper and alternate function configuration register, Address offset: 0x40 */ - uint32_t RESERVED5; /*!< Reserved, 0x44 */ - uint32_t RESERVED6; /*!< Reserved, 0x48 */ - uint32_t RESERVED7; /*!< Reserved, 0x4C */ - __IO uint32_t BKP0R; /*!< RTC backup register 1, Address offset: 0x50 */ - __IO uint32_t BKP1R; /*!< RTC backup register 1, Address offset: 0x54 */ - __IO uint32_t BKP2R; /*!< RTC backup register 2, Address offset: 0x58 */ - __IO uint32_t BKP3R; /*!< RTC backup register 3, Address offset: 0x5C */ - __IO uint32_t BKP4R; /*!< RTC backup register 4, Address offset: 0x60 */ - __IO uint32_t BKP5R; /*!< RTC backup register 5, Address offset: 0x64 */ - __IO uint32_t BKP6R; /*!< RTC backup register 6, Address offset: 0x68 */ - __IO uint32_t BKP7R; /*!< RTC backup register 7, Address offset: 0x6C */ - __IO uint32_t BKP8R; /*!< RTC backup register 8, Address offset: 0x70 */ - __IO uint32_t BKP9R; /*!< RTC backup register 9, Address offset: 0x74 */ - __IO uint32_t BKP10R; /*!< RTC backup register 10, Address offset: 0x78 */ - __IO uint32_t BKP11R; /*!< RTC backup register 11, Address offset: 0x7C */ - __IO uint32_t BKP12R; /*!< RTC backup register 12, Address offset: 0x80 */ - __IO uint32_t BKP13R; /*!< RTC backup register 13, Address offset: 0x84 */ - __IO uint32_t BKP14R; /*!< RTC backup register 14, Address offset: 0x88 */ - __IO uint32_t BKP15R; /*!< RTC backup register 15, Address offset: 0x8C */ - __IO uint32_t BKP16R; /*!< RTC backup register 16, Address offset: 0x90 */ - __IO uint32_t BKP17R; /*!< RTC backup register 17, Address offset: 0x94 */ - __IO uint32_t BKP18R; /*!< RTC backup register 18, Address offset: 0x98 */ - __IO uint32_t BKP19R; /*!< RTC backup register 19, Address offset: 0x9C */ -} RTC_TypeDef; - - -/** - * @brief SD host Interface - */ - -typedef struct -{ - __IO uint32_t POWER; /*!< SDIO power control register, Address offset: 0x00 */ - __IO uint32_t CLKCR; /*!< SDI clock control register, Address offset: 0x04 */ - __IO uint32_t ARG; /*!< SDIO argument register, Address offset: 0x08 */ - __IO uint32_t CMD; /*!< SDIO command register, Address offset: 0x0C */ - __IO const uint32_t RESPCMD; /*!< SDIO command response register, Address offset: 0x10 */ - __IO const uint32_t RESP1; /*!< SDIO response 1 register, Address offset: 0x14 */ - __IO const uint32_t RESP2; /*!< SDIO response 2 register, Address offset: 0x18 */ - __IO const uint32_t RESP3; /*!< SDIO response 3 register, Address offset: 0x1C */ - __IO const uint32_t RESP4; /*!< SDIO response 4 register, Address offset: 0x20 */ - __IO uint32_t DTIMER; /*!< SDIO data timer register, Address offset: 0x24 */ - __IO uint32_t DLEN; /*!< SDIO data length register, Address offset: 0x28 */ - __IO uint32_t DCTRL; /*!< SDIO data control register, Address offset: 0x2C */ - __IO const uint32_t DCOUNT; /*!< SDIO data counter register, Address offset: 0x30 */ - __IO const uint32_t STA; /*!< SDIO status register, Address offset: 0x34 */ - __IO uint32_t ICR; /*!< SDIO interrupt clear register, Address offset: 0x38 */ - __IO uint32_t MASK; /*!< SDIO mask register, Address offset: 0x3C */ - uint32_t RESERVED0[2]; /*!< Reserved, 0x40-0x44 */ - __IO const uint32_t FIFOCNT; /*!< SDIO FIFO counter register, Address offset: 0x48 */ - uint32_t RESERVED1[13]; /*!< Reserved, 0x4C-0x7C */ - __IO uint32_t FIFO; /*!< SDIO data FIFO register, Address offset: 0x80 */ -} SDIO_TypeDef; - -/** - * @brief Serial Peripheral Interface - */ - -typedef struct -{ - __IO uint32_t CR1; /*!< SPI control register 1 (not used in I2S mode), Address offset: 0x00 */ - __IO uint32_t CR2; /*!< SPI control register 2, Address offset: 0x04 */ - __IO uint32_t SR; /*!< SPI status register, Address offset: 0x08 */ - __IO uint32_t DR; /*!< SPI data register, Address offset: 0x0C */ - __IO uint32_t CRCPR; /*!< SPI CRC polynomial register (not used in I2S mode), Address offset: 0x10 */ - __IO uint32_t RXCRCR; /*!< SPI RX CRC register (not used in I2S mode), Address offset: 0x14 */ - __IO uint32_t TXCRCR; /*!< SPI TX CRC register (not used in I2S mode), Address offset: 0x18 */ - __IO uint32_t I2SCFGR; /*!< SPI_I2S configuration register, Address offset: 0x1C */ - __IO uint32_t I2SPR; /*!< SPI_I2S prescaler register, Address offset: 0x20 */ -} SPI_TypeDef; - -/** - * @brief TIM - */ - -typedef struct -{ - __IO uint32_t CR1; /*!< TIM control register 1, Address offset: 0x00 */ - __IO uint32_t CR2; /*!< TIM control register 2, Address offset: 0x04 */ - __IO uint32_t SMCR; /*!< TIM slave mode control register, Address offset: 0x08 */ - __IO uint32_t DIER; /*!< TIM DMA/interrupt enable register, Address offset: 0x0C */ - __IO uint32_t SR; /*!< TIM status register, Address offset: 0x10 */ - __IO uint32_t EGR; /*!< TIM event generation register, Address offset: 0x14 */ - __IO uint32_t CCMR1; /*!< TIM capture/compare mode register 1, Address offset: 0x18 */ - __IO uint32_t CCMR2; /*!< TIM capture/compare mode register 2, Address offset: 0x1C */ - __IO uint32_t CCER; /*!< TIM capture/compare enable register, Address offset: 0x20 */ - __IO uint32_t CNT; /*!< TIM counter register, Address offset: 0x24 */ - __IO uint32_t PSC; /*!< TIM prescaler, Address offset: 0x28 */ - __IO uint32_t ARR; /*!< TIM auto-reload register, Address offset: 0x2C */ - __IO uint32_t RCR; /*!< TIM repetition counter register, Address offset: 0x30 */ - __IO uint32_t CCR1; /*!< TIM capture/compare register 1, Address offset: 0x34 */ - __IO uint32_t CCR2; /*!< TIM capture/compare register 2, Address offset: 0x38 */ - __IO uint32_t CCR3; /*!< TIM capture/compare register 3, Address offset: 0x3C */ - __IO uint32_t CCR4; /*!< TIM capture/compare register 4, Address offset: 0x40 */ - __IO uint32_t BDTR; /*!< TIM break and dead-time register, Address offset: 0x44 */ - __IO uint32_t DCR; /*!< TIM DMA control register, Address offset: 0x48 */ - __IO uint32_t DMAR; /*!< TIM DMA address for full transfer, Address offset: 0x4C */ - __IO uint32_t OR; /*!< TIM option register, Address offset: 0x50 */ -} TIM_TypeDef; - -/** - * @brief Universal Synchronous Asynchronous Receiver Transmitter - */ - -typedef struct -{ - __IO uint32_t SR; /*!< USART Status register, Address offset: 0x00 */ - __IO uint32_t DR; /*!< USART Data register, Address offset: 0x04 */ - __IO uint32_t BRR; /*!< USART Baud rate register, Address offset: 0x08 */ - __IO uint32_t CR1; /*!< USART Control register 1, Address offset: 0x0C */ - __IO uint32_t CR2; /*!< USART Control register 2, Address offset: 0x10 */ - __IO uint32_t CR3; /*!< USART Control register 3, Address offset: 0x14 */ - __IO uint32_t GTPR; /*!< USART Guard time and prescaler register, Address offset: 0x18 */ -} USART_TypeDef; - -/** - * @brief Window WATCHDOG - */ - -typedef struct -{ - __IO uint32_t CR; /*!< WWDG Control register, Address offset: 0x00 */ - __IO uint32_t CFR; /*!< WWDG Configuration register, Address offset: 0x04 */ - __IO uint32_t SR; /*!< WWDG Status register, Address offset: 0x08 */ -} WWDG_TypeDef; - -/** - * @brief RNG - */ - -typedef struct -{ - __IO uint32_t CR; /*!< RNG control register, Address offset: 0x00 */ - __IO uint32_t SR; /*!< RNG status register, Address offset: 0x04 */ - __IO uint32_t DR; /*!< RNG data register, Address offset: 0x08 */ -} RNG_TypeDef; - - - -/** - * @brief __USB_OTG_Core_register - */ -typedef struct -{ - __IO uint32_t GOTGCTL; /*!< USB_OTG Control and Status Register 000h*/ - __IO uint32_t GOTGINT; /*!< USB_OTG Interrupt Register 004h*/ - __IO uint32_t GAHBCFG; /*!< Core AHB Configuration Register 008h*/ - __IO uint32_t GUSBCFG; /*!< Core USB Configuration Register 00Ch*/ - __IO uint32_t GRSTCTL; /*!< Core Reset Register 010h*/ - __IO uint32_t GINTSTS; /*!< Core Interrupt Register 014h*/ - __IO uint32_t GINTMSK; /*!< Core Interrupt Mask Register 018h*/ - __IO uint32_t GRXSTSR; /*!< Receive Sts Q Read Register 01Ch*/ - __IO uint32_t GRXSTSP; /*!< Receive Sts Q Read & POP Register 020h*/ - __IO uint32_t GRXFSIZ; /* Receive FIFO Size Register 024h*/ - __IO uint32_t DIEPTXF0_HNPTXFSIZ; /*!< EP0 / Non Periodic Tx FIFO Size Register 028h*/ - __IO uint32_t HNPTXSTS; /*!< Non Periodic Tx FIFO/Queue Sts reg 02Ch*/ - uint32_t Reserved30[2]; /* Reserved 030h*/ - __IO uint32_t GCCFG; /* General Purpose IO Register 038h*/ - __IO uint32_t CID; /* User ID Register 03Ch*/ - uint32_t Reserved40[48]; /* Reserved 040h-0FFh*/ - __IO uint32_t HPTXFSIZ; /* Host Periodic Tx FIFO Size Reg 100h*/ - __IO uint32_t DIEPTXF[0x0F];/* dev Periodic Transmit FIFO */ -} -USB_OTG_GlobalTypeDef; - - - -/** - * @brief __device_Registers - */ -typedef struct -{ - __IO uint32_t DCFG; /* dev Configuration Register 800h*/ - __IO uint32_t DCTL; /* dev Control Register 804h*/ - __IO uint32_t DSTS; /* dev Status Register (RO) 808h*/ - uint32_t Reserved0C; /* Reserved 80Ch*/ - __IO uint32_t DIEPMSK; /* dev IN Endpoint Mask 810h*/ - __IO uint32_t DOEPMSK; /* dev OUT Endpoint Mask 814h*/ - __IO uint32_t DAINT; /* dev All Endpoints Itr Reg 818h*/ - __IO uint32_t DAINTMSK; /* dev All Endpoints Itr Mask 81Ch*/ - uint32_t Reserved20; /* Reserved 820h*/ - uint32_t Reserved9; /* Reserved 824h*/ - __IO uint32_t DVBUSDIS; /* dev VBUS discharge Register 828h*/ - __IO uint32_t DVBUSPULSE; /* dev VBUS Pulse Register 82Ch*/ - __IO uint32_t DTHRCTL; /* dev thr 830h*/ - __IO uint32_t DIEPEMPMSK; /* dev empty msk 834h*/ - __IO uint32_t DEACHINT; /* dedicated EP interrupt 838h*/ - __IO uint32_t DEACHMSK; /* dedicated EP msk 83Ch*/ - uint32_t Reserved40; /* dedicated EP mask 840h*/ - __IO uint32_t DINEP1MSK; /* dedicated EP mask 844h*/ - uint32_t Reserved44[15]; /* Reserved 844-87Ch*/ - __IO uint32_t DOUTEP1MSK; /* dedicated EP msk 884h*/ -} -USB_OTG_DeviceTypeDef; - - -/** - * @brief __IN_Endpoint-Specific_Register - */ -typedef struct -{ - __IO uint32_t DIEPCTL; /* dev IN Endpoint Control Reg 900h + (ep_num * 20h) + 00h*/ - uint32_t Reserved04; /* Reserved 900h + (ep_num * 20h) + 04h*/ - __IO uint32_t DIEPINT; /* dev IN Endpoint Itr Reg 900h + (ep_num * 20h) + 08h*/ - uint32_t Reserved0C; /* Reserved 900h + (ep_num * 20h) + 0Ch*/ - __IO uint32_t DIEPTSIZ; /* IN Endpoint Txfer Size 900h + (ep_num * 20h) + 10h*/ - __IO uint32_t DIEPDMA; /* IN Endpoint DMA Address Reg 900h + (ep_num * 20h) + 14h*/ - __IO uint32_t DTXFSTS;/*IN Endpoint Tx FIFO Status Reg 900h + (ep_num * 20h) + 18h*/ - uint32_t Reserved18; /* Reserved 900h+(ep_num*20h)+1Ch-900h+ (ep_num * 20h) + 1Ch*/ -} -USB_OTG_INEndpointTypeDef; - - -/** - * @brief __OUT_Endpoint-Specific_Registers - */ -typedef struct -{ - __IO uint32_t DOEPCTL; /* dev OUT Endpoint Control Reg B00h + (ep_num * 20h) + 00h*/ - uint32_t Reserved04; /* Reserved B00h + (ep_num * 20h) + 04h*/ - __IO uint32_t DOEPINT; /* dev OUT Endpoint Itr Reg B00h + (ep_num * 20h) + 08h*/ - uint32_t Reserved0C; /* Reserved B00h + (ep_num * 20h) + 0Ch*/ - __IO uint32_t DOEPTSIZ; /* dev OUT Endpoint Txfer Size B00h + (ep_num * 20h) + 10h*/ - __IO uint32_t DOEPDMA; /* dev OUT Endpoint DMA Address B00h + (ep_num * 20h) + 14h*/ - uint32_t Reserved18[2]; /* Reserved B00h + (ep_num * 20h) + 18h - B00h + (ep_num * 20h) + 1Ch*/ -} -USB_OTG_OUTEndpointTypeDef; - - -/** - * @brief __Host_Mode_Register_Structures - */ -typedef struct -{ - __IO uint32_t HCFG; /* Host Configuration Register 400h*/ - __IO uint32_t HFIR; /* Host Frame Interval Register 404h*/ - __IO uint32_t HFNUM; /* Host Frame Nbr/Frame Remaining 408h*/ - uint32_t Reserved40C; /* Reserved 40Ch*/ - __IO uint32_t HPTXSTS; /* Host Periodic Tx FIFO/ Queue Status 410h*/ - __IO uint32_t HAINT; /* Host All Channels Interrupt Register 414h*/ - __IO uint32_t HAINTMSK; /* Host All Channels Interrupt Mask 418h*/ -} -USB_OTG_HostTypeDef; - - -/** - * @brief __Host_Channel_Specific_Registers - */ -typedef struct -{ - __IO uint32_t HCCHAR; - __IO uint32_t HCSPLT; - __IO uint32_t HCINT; - __IO uint32_t HCINTMSK; - __IO uint32_t HCTSIZ; - __IO uint32_t HCDMA; - uint32_t Reserved[2]; -} -USB_OTG_HostChannelTypeDef; - - -/** - * @brief Peripheral_memory_map - */ -#define FLASH_BASE ((uint32_t)0x08000000) /*!< FLASH(up to 1 MB) base address in the alias region */ -#define SRAM1_BASE ((uint32_t)0x20000000) /*!< SRAM1(112 KB) base address in the alias region */ -#define SRAM2_BASE ((uint32_t)0x2001C000) /*!< SRAM2(16 KB) base address in the alias region */ -#define PERIPH_BASE ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */ -#define BKPSRAM_BASE ((uint32_t)0x40024000) /*!< Backup SRAM(4 KB) base address in the alias region */ -#define FSMC_R_BASE ((uint32_t)0xA0000000) /*!< FSMC registers base address */ -#define SRAM1_BB_BASE ((uint32_t)0x22000000) /*!< SRAM1(112 KB) base address in the bit-band region */ -#define SRAM2_BB_BASE ((uint32_t)0x22380000) /*!< SRAM2(16 KB) base address in the bit-band region */ -#define PERIPH_BB_BASE ((uint32_t)0x42000000) /*!< Peripheral base address in the bit-band region */ -#define BKPSRAM_BB_BASE ((uint32_t)0x42480000) /*!< Backup SRAM(4 KB) base address in the bit-band region */ -#define FLASH_END ((uint32_t)0x080FFFFF) /*!< FLASH end address */ - -/* Legacy defines */ -#define SRAM_BASE SRAM1_BASE -#define SRAM_BB_BASE SRAM1_BB_BASE - - -/*!< Peripheral memory map */ -#define APB1PERIPH_BASE PERIPH_BASE -#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000) -#define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000) -#define AHB2PERIPH_BASE (PERIPH_BASE + 0x10000000) - -/*!< APB1 peripherals */ -#define TIM2_BASE (APB1PERIPH_BASE + 0x0000) -#define TIM3_BASE (APB1PERIPH_BASE + 0x0400) -#define TIM4_BASE (APB1PERIPH_BASE + 0x0800) -#define TIM5_BASE (APB1PERIPH_BASE + 0x0C00) -#define TIM6_BASE (APB1PERIPH_BASE + 0x1000) -#define TIM7_BASE (APB1PERIPH_BASE + 0x1400) -#define TIM12_BASE (APB1PERIPH_BASE + 0x1800) -#define TIM13_BASE (APB1PERIPH_BASE + 0x1C00) -#define TIM14_BASE (APB1PERIPH_BASE + 0x2000) -#define RTC_BASE (APB1PERIPH_BASE + 0x2800) -#define WWDG_BASE (APB1PERIPH_BASE + 0x2C00) -#define IWDG_BASE (APB1PERIPH_BASE + 0x3000) -#define SPI2_BASE (APB1PERIPH_BASE + 0x3800) -#define SPI3_BASE (APB1PERIPH_BASE + 0x3C00) -#define USART2_BASE (APB1PERIPH_BASE + 0x4400) -#define USART3_BASE (APB1PERIPH_BASE + 0x4800) -#define UART4_BASE (APB1PERIPH_BASE + 0x4C00) -#define UART5_BASE (APB1PERIPH_BASE + 0x5000) -#define I2C1_BASE (APB1PERIPH_BASE + 0x5400) -#define I2C2_BASE (APB1PERIPH_BASE + 0x5800) -#define I2C3_BASE (APB1PERIPH_BASE + 0x5C00) -#define CAN1_BASE (APB1PERIPH_BASE + 0x6400) -#define CAN2_BASE (APB1PERIPH_BASE + 0x6800) -#define PWR_BASE (APB1PERIPH_BASE + 0x7000) -#define DAC_BASE (APB1PERIPH_BASE + 0x7400) - -/*!< APB2 peripherals */ -#define TIM1_BASE (APB2PERIPH_BASE + 0x0000) -#define TIM8_BASE (APB2PERIPH_BASE + 0x0400) -#define USART1_BASE (APB2PERIPH_BASE + 0x1000) -#define USART6_BASE (APB2PERIPH_BASE + 0x1400) -#define ADC1_BASE (APB2PERIPH_BASE + 0x2000) -#define ADC2_BASE (APB2PERIPH_BASE + 0x2100) -#define ADC3_BASE (APB2PERIPH_BASE + 0x2200) -#define ADC_BASE (APB2PERIPH_BASE + 0x2300) -#define SDIO_BASE (APB2PERIPH_BASE + 0x2C00) -#define SPI1_BASE (APB2PERIPH_BASE + 0x3000) -#define SYSCFG_BASE (APB2PERIPH_BASE + 0x3800) -#define EXTI_BASE (APB2PERIPH_BASE + 0x3C00) -#define TIM9_BASE (APB2PERIPH_BASE + 0x4000) -#define TIM10_BASE (APB2PERIPH_BASE + 0x4400) -#define TIM11_BASE (APB2PERIPH_BASE + 0x4800) - -/*!< AHB1 peripherals */ -#define GPIOA_BASE (AHB1PERIPH_BASE + 0x0000) -#define GPIOB_BASE (AHB1PERIPH_BASE + 0x0400) -#define GPIOC_BASE (AHB1PERIPH_BASE + 0x0800) -#define GPIOD_BASE (AHB1PERIPH_BASE + 0x0C00) -#define GPIOE_BASE (AHB1PERIPH_BASE + 0x1000) -#define GPIOF_BASE (AHB1PERIPH_BASE + 0x1400) -#define GPIOG_BASE (AHB1PERIPH_BASE + 0x1800) -#define GPIOH_BASE (AHB1PERIPH_BASE + 0x1C00) -#define GPIOI_BASE (AHB1PERIPH_BASE + 0x2000) -#define CRC_BASE (AHB1PERIPH_BASE + 0x3000) -#define RCC_BASE (AHB1PERIPH_BASE + 0x3800) -#define FLASH_R_BASE (AHB1PERIPH_BASE + 0x3C00) -#define DMA1_BASE (AHB1PERIPH_BASE + 0x6000) -#define DMA1_Stream0_BASE (DMA1_BASE + 0x010) -#define DMA1_Stream1_BASE (DMA1_BASE + 0x028) -#define DMA1_Stream2_BASE (DMA1_BASE + 0x040) -#define DMA1_Stream3_BASE (DMA1_BASE + 0x058) -#define DMA1_Stream4_BASE (DMA1_BASE + 0x070) -#define DMA1_Stream5_BASE (DMA1_BASE + 0x088) -#define DMA1_Stream6_BASE (DMA1_BASE + 0x0A0) -#define DMA1_Stream7_BASE (DMA1_BASE + 0x0B8) -#define DMA2_BASE (AHB1PERIPH_BASE + 0x6400) -#define DMA2_Stream0_BASE (DMA2_BASE + 0x010) -#define DMA2_Stream1_BASE (DMA2_BASE + 0x028) -#define DMA2_Stream2_BASE (DMA2_BASE + 0x040) -#define DMA2_Stream3_BASE (DMA2_BASE + 0x058) -#define DMA2_Stream4_BASE (DMA2_BASE + 0x070) -#define DMA2_Stream5_BASE (DMA2_BASE + 0x088) -#define DMA2_Stream6_BASE (DMA2_BASE + 0x0A0) -#define DMA2_Stream7_BASE (DMA2_BASE + 0x0B8) -#define ETH_BASE (AHB1PERIPH_BASE + 0x8000) -#define ETH_MAC_BASE (ETH_BASE) -#define ETH_MMC_BASE (ETH_BASE + 0x0100) -#define ETH_PTP_BASE (ETH_BASE + 0x0700) -#define ETH_DMA_BASE (ETH_BASE + 0x1000) - -/*!< AHB2 peripherals */ -#define DCMI_BASE (AHB2PERIPH_BASE + 0x50000) -#define RNG_BASE (AHB2PERIPH_BASE + 0x60800) - -/*!< FSMC Bankx registers base address */ -#define FSMC_Bank1_R_BASE (FSMC_R_BASE + 0x0000) -#define FSMC_Bank1E_R_BASE (FSMC_R_BASE + 0x0104) -#define FSMC_Bank2_3_R_BASE (FSMC_R_BASE + 0x0060) -#define FSMC_Bank4_R_BASE (FSMC_R_BASE + 0x00A0) - -/* Debug MCU registers base address */ -#define DBGMCU_BASE ((uint32_t )0xE0042000) - -/*!< USB registers base address */ -#define USB_OTG_HS_PERIPH_BASE ((uint32_t )0x40040000) -#define USB_OTG_FS_PERIPH_BASE ((uint32_t )0x50000000) - -#define USB_OTG_GLOBAL_BASE ((uint32_t )0x000) -#define USB_OTG_DEVICE_BASE ((uint32_t )0x800) -#define USB_OTG_IN_ENDPOINT_BASE ((uint32_t )0x900) -#define USB_OTG_OUT_ENDPOINT_BASE ((uint32_t )0xB00) -#define USB_OTG_EP_REG_SIZE ((uint32_t )0x20) -#define USB_OTG_HOST_BASE ((uint32_t )0x400) -#define USB_OTG_HOST_PORT_BASE ((uint32_t )0x440) -#define USB_OTG_HOST_CHANNEL_BASE ((uint32_t )0x500) -#define USB_OTG_HOST_CHANNEL_SIZE ((uint32_t )0x20) -#define USB_OTG_PCGCCTL_BASE ((uint32_t )0xE00) -#define USB_OTG_FIFO_BASE ((uint32_t )0x1000) -#define USB_OTG_FIFO_SIZE ((uint32_t )0x1000) - -/** - * @} - */ - -/** @addtogroup Peripheral_declaration - * @{ - */ -#define TIM2 ((TIM_TypeDef *) TIM2_BASE) -#define TIM3 ((TIM_TypeDef *) TIM3_BASE) -#define TIM4 ((TIM_TypeDef *) TIM4_BASE) -#define TIM5 ((TIM_TypeDef *) TIM5_BASE) -#define TIM6 ((TIM_TypeDef *) TIM6_BASE) -#define TIM7 ((TIM_TypeDef *) TIM7_BASE) -#define TIM12 ((TIM_TypeDef *) TIM12_BASE) -#define TIM13 ((TIM_TypeDef *) TIM13_BASE) -#define TIM14 ((TIM_TypeDef *) TIM14_BASE) -#define RTC ((RTC_TypeDef *) RTC_BASE) -#define WWDG ((WWDG_TypeDef *) WWDG_BASE) -#define IWDG ((IWDG_TypeDef *) IWDG_BASE) -#define SPI2 ((SPI_TypeDef *) SPI2_BASE) -#define SPI3 ((SPI_TypeDef *) SPI3_BASE) -#define USART2 ((USART_TypeDef *) USART2_BASE) -#define USART3 ((USART_TypeDef *) USART3_BASE) -#define UART4 ((USART_TypeDef *) UART4_BASE) -#define UART5 ((USART_TypeDef *) UART5_BASE) -#define I2C1 ((I2C_TypeDef *) I2C1_BASE) -#define I2C2 ((I2C_TypeDef *) I2C2_BASE) -#define I2C3 ((I2C_TypeDef *) I2C3_BASE) -#define CAN1 ((CAN_TypeDef *) CAN1_BASE) -#define CAN2 ((CAN_TypeDef *) CAN2_BASE) -#define PWR ((PWR_TypeDef *) PWR_BASE) -#define DAC ((DAC_TypeDef *) DAC_BASE) -#define TIM1 ((TIM_TypeDef *) TIM1_BASE) -#define TIM8 ((TIM_TypeDef *) TIM8_BASE) -#define USART1 ((USART_TypeDef *) USART1_BASE) -#define USART6 ((USART_TypeDef *) USART6_BASE) -#define ADC ((ADC_Common_TypeDef *) ADC_BASE) -#define ADC1 ((ADC_TypeDef *) ADC1_BASE) -#define ADC2 ((ADC_TypeDef *) ADC2_BASE) -#define ADC3 ((ADC_TypeDef *) ADC3_BASE) -#define SDIO ((SDIO_TypeDef *) SDIO_BASE) -#define SPI1 ((SPI_TypeDef *) SPI1_BASE) -#define SYSCFG ((SYSCFG_TypeDef *) SYSCFG_BASE) -#define EXTI ((EXTI_TypeDef *) EXTI_BASE) -#define TIM9 ((TIM_TypeDef *) TIM9_BASE) -#define TIM10 ((TIM_TypeDef *) TIM10_BASE) -#define TIM11 ((TIM_TypeDef *) TIM11_BASE) -#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) -#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE) -#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE) -#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE) -#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE) -#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE) -#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE) -#define GPIOH ((GPIO_TypeDef *) GPIOH_BASE) -#define GPIOI ((GPIO_TypeDef *) GPIOI_BASE) -#define CRC ((CRC_TypeDef *) CRC_BASE) -#define RCC ((RCC_TypeDef *) RCC_BASE) -#define FLASH ((FLASH_TypeDef *) FLASH_R_BASE) -#define DMA1 ((DMA_TypeDef *) DMA1_BASE) -#define DMA1_Stream0 ((DMA_Stream_TypeDef *) DMA1_Stream0_BASE) -#define DMA1_Stream1 ((DMA_Stream_TypeDef *) DMA1_Stream1_BASE) -#define DMA1_Stream2 ((DMA_Stream_TypeDef *) DMA1_Stream2_BASE) -#define DMA1_Stream3 ((DMA_Stream_TypeDef *) DMA1_Stream3_BASE) -#define DMA1_Stream4 ((DMA_Stream_TypeDef *) DMA1_Stream4_BASE) -#define DMA1_Stream5 ((DMA_Stream_TypeDef *) DMA1_Stream5_BASE) -#define DMA1_Stream6 ((DMA_Stream_TypeDef *) DMA1_Stream6_BASE) -#define DMA1_Stream7 ((DMA_Stream_TypeDef *) DMA1_Stream7_BASE) -#define DMA2 ((DMA_TypeDef *) DMA2_BASE) -#define DMA2_Stream0 ((DMA_Stream_TypeDef *) DMA2_Stream0_BASE) -#define DMA2_Stream1 ((DMA_Stream_TypeDef *) DMA2_Stream1_BASE) -#define DMA2_Stream2 ((DMA_Stream_TypeDef *) DMA2_Stream2_BASE) -#define DMA2_Stream3 ((DMA_Stream_TypeDef *) DMA2_Stream3_BASE) -#define DMA2_Stream4 ((DMA_Stream_TypeDef *) DMA2_Stream4_BASE) -#define DMA2_Stream5 ((DMA_Stream_TypeDef *) DMA2_Stream5_BASE) -#define DMA2_Stream6 ((DMA_Stream_TypeDef *) DMA2_Stream6_BASE) -#define DMA2_Stream7 ((DMA_Stream_TypeDef *) DMA2_Stream7_BASE) -#define ETH ((ETH_TypeDef *) ETH_BASE) -#define DCMI ((DCMI_TypeDef *) DCMI_BASE) -#define RNG ((RNG_TypeDef *) RNG_BASE) -#define FSMC_Bank1 ((FSMC_Bank1_TypeDef *) FSMC_Bank1_R_BASE) -#define FSMC_Bank1E ((FSMC_Bank1E_TypeDef *) FSMC_Bank1E_R_BASE) -#define FSMC_Bank2_3 ((FSMC_Bank2_3_TypeDef *) FSMC_Bank2_3_R_BASE) -#define FSMC_Bank4 ((FSMC_Bank4_TypeDef *) FSMC_Bank4_R_BASE) - -#define DBGMCU ((DBGMCU_TypeDef *) DBGMCU_BASE) - -#define USB_OTG_FS ((USB_OTG_GlobalTypeDef *) USB_OTG_FS_PERIPH_BASE) -#define USB_OTG_HS ((USB_OTG_GlobalTypeDef *) USB_OTG_HS_PERIPH_BASE) - -/** - * @} - */ - -/** @addtogroup Exported_constants - * @{ - */ - - /** @addtogroup Peripheral_Registers_Bits_Definition - * @{ - */ - -/******************************************************************************/ -/* Peripheral Registers_Bits_Definition */ -/******************************************************************************/ - -/******************************************************************************/ -/* */ -/* Analog to Digital Converter */ -/* */ -/******************************************************************************/ -/******************** Bit definition for ADC_SR register ********************/ -#define ADC_SR_AWD ((uint32_t)0x00000001) /*!
© COPYRIGHT(c) 2015 STMicroelectronics
- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/** @addtogroup CMSIS - * @{ - */ - -/** @addtogroup stm32f215xx - * @{ - */ - -#ifndef __STM32F215xx_H -#define __STM32F215xx_H - -#ifdef __cplusplus - extern "C" { -#endif /* __cplusplus */ - - -/** @addtogroup Configuration_section_for_CMSIS - * @{ - */ - -/** - * @brief Configuration of the Cortex-M3 Processor and Core Peripherals - */ -#define __CM3_REV 0x0200 /*!< Core revision r0p1 */ -#define __MPU_PRESENT 1 /*!< STM32F2XX provides an MPU */ -#define __NVIC_PRIO_BITS 4 /*!< STM32F2XX uses 4 Bits for the Priority Levels */ -#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */ - -/** - * @} - */ - -/** @addtogroup Peripheral_interrupt_number_definition - * @{ - */ - -/** - * @brief STM32F2XX Interrupt Number Definition, according to the selected device - * in @ref Library_configuration_section - */ -typedef enum -{ -/****** Cortex-M3 Processor Exceptions Numbers ****************************************************************/ - NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ - MemoryManagement_IRQn = -12, /*!< 4 Cortex-M3 Memory Management Interrupt */ - BusFault_IRQn = -11, /*!< 5 Cortex-M3 Bus Fault Interrupt */ - UsageFault_IRQn = -10, /*!< 6 Cortex-M3 Usage Fault Interrupt */ - SVCall_IRQn = -5, /*!< 11 Cortex-M3 SV Call Interrupt */ - DebugMonitor_IRQn = -4, /*!< 12 Cortex-M3 Debug Monitor Interrupt */ - PendSV_IRQn = -2, /*!< 14 Cortex-M3 Pend SV Interrupt */ - SysTick_IRQn = -1, /*!< 15 Cortex-M3 System Tick Interrupt */ -/****** STM32 specific Interrupt Numbers **********************************************************************/ - WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */ - PVD_IRQn = 1, /*!< PVD through EXTI Line detection Interrupt */ - TAMP_STAMP_IRQn = 2, /*!< Tamper and TimeStamp interrupts through the EXTI line */ - RTC_WKUP_IRQn = 3, /*!< RTC Wakeup interrupt through the EXTI line */ - FLASH_IRQn = 4, /*!< FLASH global Interrupt */ - RCC_IRQn = 5, /*!< RCC global Interrupt */ - EXTI0_IRQn = 6, /*!< EXTI Line0 Interrupt */ - EXTI1_IRQn = 7, /*!< EXTI Line1 Interrupt */ - EXTI2_IRQn = 8, /*!< EXTI Line2 Interrupt */ - EXTI3_IRQn = 9, /*!< EXTI Line3 Interrupt */ - EXTI4_IRQn = 10, /*!< EXTI Line4 Interrupt */ - DMA1_Stream0_IRQn = 11, /*!< DMA1 Stream 0 global Interrupt */ - DMA1_Stream1_IRQn = 12, /*!< DMA1 Stream 1 global Interrupt */ - DMA1_Stream2_IRQn = 13, /*!< DMA1 Stream 2 global Interrupt */ - DMA1_Stream3_IRQn = 14, /*!< DMA1 Stream 3 global Interrupt */ - DMA1_Stream4_IRQn = 15, /*!< DMA1 Stream 4 global Interrupt */ - DMA1_Stream5_IRQn = 16, /*!< DMA1 Stream 5 global Interrupt */ - DMA1_Stream6_IRQn = 17, /*!< DMA1 Stream 6 global Interrupt */ - ADC_IRQn = 18, /*!< ADC1, ADC2 and ADC3 global Interrupts */ - CAN1_TX_IRQn = 19, /*!< CAN1 TX Interrupt */ - CAN1_RX0_IRQn = 20, /*!< CAN1 RX0 Interrupt */ - CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ - CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ - EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ - TIM1_BRK_TIM9_IRQn = 24, /*!< TIM1 Break interrupt and TIM9 global interrupt */ - TIM1_UP_TIM10_IRQn = 25, /*!< TIM1 Update Interrupt and TIM10 global interrupt */ - TIM1_TRG_COM_TIM11_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt and TIM11 global interrupt */ - TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ - TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ - TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ - TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ - I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ - I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ - I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ - I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ - SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ - SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ - USART1_IRQn = 37, /*!< USART1 global Interrupt */ - USART2_IRQn = 38, /*!< USART2 global Interrupt */ - USART3_IRQn = 39, /*!< USART3 global Interrupt */ - EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ - RTC_Alarm_IRQn = 41, /*!< RTC Alarm (A and B) through EXTI Line Interrupt */ - OTG_FS_WKUP_IRQn = 42, /*!< USB OTG FS Wakeup through EXTI line interrupt */ - TIM8_BRK_TIM12_IRQn = 43, /*!< TIM8 Break Interrupt and TIM12 global interrupt */ - TIM8_UP_TIM13_IRQn = 44, /*!< TIM8 Update Interrupt and TIM13 global interrupt */ - TIM8_TRG_COM_TIM14_IRQn = 45, /*!< TIM8 Trigger and Commutation Interrupt and TIM14 global interrupt */ - TIM8_CC_IRQn = 46, /*!< TIM8 Capture Compare Interrupt */ - DMA1_Stream7_IRQn = 47, /*!< DMA1 Stream7 Interrupt */ - FSMC_IRQn = 48, /*!< FSMC global Interrupt */ - SDIO_IRQn = 49, /*!< SDIO global Interrupt */ - TIM5_IRQn = 50, /*!< TIM5 global Interrupt */ - SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ - UART4_IRQn = 52, /*!< UART4 global Interrupt */ - UART5_IRQn = 53, /*!< UART5 global Interrupt */ - TIM6_DAC_IRQn = 54, /*!< TIM6 global and DAC1&2 underrun error interrupts */ - TIM7_IRQn = 55, /*!< TIM7 global interrupt */ - DMA2_Stream0_IRQn = 56, /*!< DMA2 Stream 0 global Interrupt */ - DMA2_Stream1_IRQn = 57, /*!< DMA2 Stream 1 global Interrupt */ - DMA2_Stream2_IRQn = 58, /*!< DMA2 Stream 2 global Interrupt */ - DMA2_Stream3_IRQn = 59, /*!< DMA2 Stream 3 global Interrupt */ - DMA2_Stream4_IRQn = 60, /*!< DMA2 Stream 4 global Interrupt */ - CAN2_TX_IRQn = 63, /*!< CAN2 TX Interrupt */ - CAN2_RX0_IRQn = 64, /*!< CAN2 RX0 Interrupt */ - CAN2_RX1_IRQn = 65, /*!< CAN2 RX1 Interrupt */ - CAN2_SCE_IRQn = 66, /*!< CAN2 SCE Interrupt */ - OTG_FS_IRQn = 67, /*!< USB OTG FS global Interrupt */ - DMA2_Stream5_IRQn = 68, /*!< DMA2 Stream 5 global interrupt */ - DMA2_Stream6_IRQn = 69, /*!< DMA2 Stream 6 global interrupt */ - DMA2_Stream7_IRQn = 70, /*!< DMA2 Stream 7 global interrupt */ - USART6_IRQn = 71, /*!< USART6 global interrupt */ - I2C3_EV_IRQn = 72, /*!< I2C3 event interrupt */ - I2C3_ER_IRQn = 73, /*!< I2C3 error interrupt */ - OTG_HS_EP1_OUT_IRQn = 74, /*!< USB OTG HS End Point 1 Out global interrupt */ - OTG_HS_EP1_IN_IRQn = 75, /*!< USB OTG HS End Point 1 In global interrupt */ - OTG_HS_WKUP_IRQn = 76, /*!< USB OTG HS Wakeup through EXTI interrupt */ - OTG_HS_IRQn = 77, /*!< USB OTG HS global interrupt */ - CRYP_IRQn = 79, /*!< CRYP crypto global interrupt */ - HASH_RNG_IRQn = 80 /*!< Hash and Rng global interrupt */ -} IRQn_Type; - -/** - * @} - */ - -#include "core_cm3.h" -#include "system_stm32f2xx.h" -#include - -/** @addtogroup Peripheral_registers_structures - * @{ - */ - -/** - * @brief Analog to Digital Converter - */ - -typedef struct -{ - __IO uint32_t SR; /*!< ADC status register, Address offset: 0x00 */ - __IO uint32_t CR1; /*!< ADC control register 1, Address offset: 0x04 */ - __IO uint32_t CR2; /*!< ADC control register 2, Address offset: 0x08 */ - __IO uint32_t SMPR1; /*!< ADC sample time register 1, Address offset: 0x0C */ - __IO uint32_t SMPR2; /*!< ADC sample time register 2, Address offset: 0x10 */ - __IO uint32_t JOFR1; /*!< ADC injected channel data offset register 1, Address offset: 0x14 */ - __IO uint32_t JOFR2; /*!< ADC injected channel data offset register 2, Address offset: 0x18 */ - __IO uint32_t JOFR3; /*!< ADC injected channel data offset register 3, Address offset: 0x1C */ - __IO uint32_t JOFR4; /*!< ADC injected channel data offset register 4, Address offset: 0x20 */ - __IO uint32_t HTR; /*!< ADC watchdog higher threshold register, Address offset: 0x24 */ - __IO uint32_t LTR; /*!< ADC watchdog lower threshold register, Address offset: 0x28 */ - __IO uint32_t SQR1; /*!< ADC regular sequence register 1, Address offset: 0x2C */ - __IO uint32_t SQR2; /*!< ADC regular sequence register 2, Address offset: 0x30 */ - __IO uint32_t SQR3; /*!< ADC regular sequence register 3, Address offset: 0x34 */ - __IO uint32_t JSQR; /*!< ADC injected sequence register, Address offset: 0x38*/ - __IO uint32_t JDR1; /*!< ADC injected data register 1, Address offset: 0x3C */ - __IO uint32_t JDR2; /*!< ADC injected data register 2, Address offset: 0x40 */ - __IO uint32_t JDR3; /*!< ADC injected data register 3, Address offset: 0x44 */ - __IO uint32_t JDR4; /*!< ADC injected data register 4, Address offset: 0x48 */ - __IO uint32_t DR; /*!< ADC regular data register, Address offset: 0x4C */ -} ADC_TypeDef; - -typedef struct -{ - __IO uint32_t CSR; /*!< ADC Common status register, Address offset: ADC1 base address + 0x300 */ - __IO uint32_t CCR; /*!< ADC common control register, Address offset: ADC1 base address + 0x304 */ - __IO uint32_t CDR; /*!< ADC common regular data register for dual - AND triple modes, Address offset: ADC1 base address + 0x308 */ -} ADC_Common_TypeDef; - - -/** - * @brief Controller Area Network TxMailBox - */ - -typedef struct -{ - __IO uint32_t TIR; /*!< CAN TX mailbox identifier register */ - __IO uint32_t TDTR; /*!< CAN mailbox data length control and time stamp register */ - __IO uint32_t TDLR; /*!< CAN mailbox data low register */ - __IO uint32_t TDHR; /*!< CAN mailbox data high register */ -} CAN_TxMailBox_TypeDef; - -/** - * @brief Controller Area Network FIFOMailBox - */ - -typedef struct -{ - __IO uint32_t RIR; /*!< CAN receive FIFO mailbox identifier register */ - __IO uint32_t RDTR; /*!< CAN receive FIFO mailbox data length control and time stamp register */ - __IO uint32_t RDLR; /*!< CAN receive FIFO mailbox data low register */ - __IO uint32_t RDHR; /*!< CAN receive FIFO mailbox data high register */ -} CAN_FIFOMailBox_TypeDef; - -/** - * @brief Controller Area Network FilterRegister - */ - -typedef struct -{ - __IO uint32_t FR1; /*!< CAN Filter bank register 1 */ - __IO uint32_t FR2; /*!< CAN Filter bank register 1 */ -} CAN_FilterRegister_TypeDef; - -/** - * @brief Controller Area Network - */ - -typedef struct -{ - __IO uint32_t MCR; /*!< CAN master control register, Address offset: 0x00 */ - __IO uint32_t MSR; /*!< CAN master status register, Address offset: 0x04 */ - __IO uint32_t TSR; /*!< CAN transmit status register, Address offset: 0x08 */ - __IO uint32_t RF0R; /*!< CAN receive FIFO 0 register, Address offset: 0x0C */ - __IO uint32_t RF1R; /*!< CAN receive FIFO 1 register, Address offset: 0x10 */ - __IO uint32_t IER; /*!< CAN interrupt enable register, Address offset: 0x14 */ - __IO uint32_t ESR; /*!< CAN error status register, Address offset: 0x18 */ - __IO uint32_t BTR; /*!< CAN bit timing register, Address offset: 0x1C */ - uint32_t RESERVED0[88]; /*!< Reserved, 0x020 - 0x17F */ - CAN_TxMailBox_TypeDef sTxMailBox[3]; /*!< CAN Tx MailBox, Address offset: 0x180 - 0x1AC */ - CAN_FIFOMailBox_TypeDef sFIFOMailBox[2]; /*!< CAN FIFO MailBox, Address offset: 0x1B0 - 0x1CC */ - uint32_t RESERVED1[12]; /*!< Reserved, 0x1D0 - 0x1FF */ - __IO uint32_t FMR; /*!< CAN filter master register, Address offset: 0x200 */ - __IO uint32_t FM1R; /*!< CAN filter mode register, Address offset: 0x204 */ - uint32_t RESERVED2; /*!< Reserved, 0x208 */ - __IO uint32_t FS1R; /*!< CAN filter scale register, Address offset: 0x20C */ - uint32_t RESERVED3; /*!< Reserved, 0x210 */ - __IO uint32_t FFA1R; /*!< CAN filter FIFO assignment register, Address offset: 0x214 */ - uint32_t RESERVED4; /*!< Reserved, 0x218 */ - __IO uint32_t FA1R; /*!< CAN filter activation register, Address offset: 0x21C */ - uint32_t RESERVED5[8]; /*!< Reserved, 0x220-0x23F */ - CAN_FilterRegister_TypeDef sFilterRegister[28]; /*!< CAN Filter Register, Address offset: 0x240-0x31C */ -} CAN_TypeDef; - -/** - * @brief CRC calculation unit - */ - -typedef struct -{ - __IO uint32_t DR; /*!< CRC Data register, Address offset: 0x00 */ - __IO uint8_t IDR; /*!< CRC Independent data register, Address offset: 0x04 */ - uint8_t RESERVED0; /*!< Reserved, 0x05 */ - uint16_t RESERVED1; /*!< Reserved, 0x06 */ - __IO uint32_t CR; /*!< CRC Control register, Address offset: 0x08 */ -} CRC_TypeDef; - -/** - * @brief Digital to Analog Converter - */ - -typedef struct -{ - __IO uint32_t CR; /*!< DAC control register, Address offset: 0x00 */ - __IO uint32_t SWTRIGR; /*!< DAC software trigger register, Address offset: 0x04 */ - __IO uint32_t DHR12R1; /*!< DAC channel1 12-bit right-aligned data holding register, Address offset: 0x08 */ - __IO uint32_t DHR12L1; /*!< DAC channel1 12-bit left aligned data holding register, Address offset: 0x0C */ - __IO uint32_t DHR8R1; /*!< DAC channel1 8-bit right aligned data holding register, Address offset: 0x10 */ - __IO uint32_t DHR12R2; /*!< DAC channel2 12-bit right aligned data holding register, Address offset: 0x14 */ - __IO uint32_t DHR12L2; /*!< DAC channel2 12-bit left aligned data holding register, Address offset: 0x18 */ - __IO uint32_t DHR8R2; /*!< DAC channel2 8-bit right-aligned data holding register, Address offset: 0x1C */ - __IO uint32_t DHR12RD; /*!< Dual DAC 12-bit right-aligned data holding register, Address offset: 0x20 */ - __IO uint32_t DHR12LD; /*!< DUAL DAC 12-bit left aligned data holding register, Address offset: 0x24 */ - __IO uint32_t DHR8RD; /*!< DUAL DAC 8-bit right aligned data holding register, Address offset: 0x28 */ - __IO uint32_t DOR1; /*!< DAC channel1 data output register, Address offset: 0x2C */ - __IO uint32_t DOR2; /*!< DAC channel2 data output register, Address offset: 0x30 */ - __IO uint32_t SR; /*!< DAC status register, Address offset: 0x34 */ -} DAC_TypeDef; - -/** - * @brief Debug MCU - */ - -typedef struct -{ - __IO uint32_t IDCODE; /*!< MCU device ID code, Address offset: 0x00 */ - __IO uint32_t CR; /*!< Debug MCU configuration register, Address offset: 0x04 */ - __IO uint32_t APB1FZ; /*!< Debug MCU APB1 freeze register, Address offset: 0x08 */ - __IO uint32_t APB2FZ; /*!< Debug MCU APB2 freeze register, Address offset: 0x0C */ -}DBGMCU_TypeDef; - - -/** - * @brief DMA Controller - */ - -typedef struct -{ - __IO uint32_t CR; /*!< DMA stream x configuration register */ - __IO uint32_t NDTR; /*!< DMA stream x number of data register */ - __IO uint32_t PAR; /*!< DMA stream x peripheral address register */ - __IO uint32_t M0AR; /*!< DMA stream x memory 0 address register */ - __IO uint32_t M1AR; /*!< DMA stream x memory 1 address register */ - __IO uint32_t FCR; /*!< DMA stream x FIFO control register */ -} DMA_Stream_TypeDef; - -typedef struct -{ - __IO uint32_t LISR; /*!< DMA low interrupt status register, Address offset: 0x00 */ - __IO uint32_t HISR; /*!< DMA high interrupt status register, Address offset: 0x04 */ - __IO uint32_t LIFCR; /*!< DMA low interrupt flag clear register, Address offset: 0x08 */ - __IO uint32_t HIFCR; /*!< DMA high interrupt flag clear register, Address offset: 0x0C */ -} DMA_TypeDef; - - -/** - * @brief External Interrupt/Event Controller - */ - -typedef struct -{ - __IO uint32_t IMR; /*!< EXTI Interrupt mask register, Address offset: 0x00 */ - __IO uint32_t EMR; /*!< EXTI Event mask register, Address offset: 0x04 */ - __IO uint32_t RTSR; /*!< EXTI Rising trigger selection register, Address offset: 0x08 */ - __IO uint32_t FTSR; /*!< EXTI Falling trigger selection register, Address offset: 0x0C */ - __IO uint32_t SWIER; /*!< EXTI Software interrupt event register, Address offset: 0x10 */ - __IO uint32_t PR; /*!< EXTI Pending register, Address offset: 0x14 */ -} EXTI_TypeDef; - -/** - * @brief FLASH Registers - */ - -typedef struct -{ - __IO uint32_t ACR; /*!< FLASH access control register, Address offset: 0x00 */ - __IO uint32_t KEYR; /*!< FLASH key register, Address offset: 0x04 */ - __IO uint32_t OPTKEYR; /*!< FLASH option key register, Address offset: 0x08 */ - __IO uint32_t SR; /*!< FLASH status register, Address offset: 0x0C */ - __IO uint32_t CR; /*!< FLASH control register, Address offset: 0x10 */ - __IO uint32_t OPTCR; /*!< FLASH option control register, Address offset: 0x14 */ -} FLASH_TypeDef; - - -/** - * @brief Flexible Static Memory Controller - */ - -typedef struct -{ - __IO uint32_t BTCR[8]; /*!< NOR/PSRAM chip-select control register(BCR) and chip-select timing register(BTR), Address offset: 0x00-1C */ -} FSMC_Bank1_TypeDef; - -/** - * @brief Flexible Static Memory Controller Bank1E - */ - -typedef struct -{ - __IO uint32_t BWTR[7]; /*!< NOR/PSRAM write timing registers, Address offset: 0x104-0x11C */ -} FSMC_Bank1E_TypeDef; - -/** - * @brief Flexible Static Memory Controller Bank2 - */ - -typedef struct -{ - __IO uint32_t PCR2; /*!< NAND Flash control register 2, Address offset: 0x60 */ - __IO uint32_t SR2; /*!< NAND Flash FIFO status and interrupt register 2, Address offset: 0x64 */ - __IO uint32_t PMEM2; /*!< NAND Flash Common memory space timing register 2, Address offset: 0x68 */ - __IO uint32_t PATT2; /*!< NAND Flash Attribute memory space timing register 2, Address offset: 0x6C */ - uint32_t RESERVED0; /*!< Reserved, 0x70 */ - __IO uint32_t ECCR2; /*!< NAND Flash ECC result registers 2, Address offset: 0x74 */ - uint32_t RESERVED1; /*!< Reserved, 0x78 */ - uint32_t RESERVED2; /*!< Reserved, 0x7C */ - __IO uint32_t PCR3; /*!< NAND Flash control register 3, Address offset: 0x80 */ - __IO uint32_t SR3; /*!< NAND Flash FIFO status and interrupt register 3, Address offset: 0x84 */ - __IO uint32_t PMEM3; /*!< NAND Flash Common memory space timing register 3, Address offset: 0x88 */ - __IO uint32_t PATT3; /*!< NAND Flash Attribute memory space timing register 3, Address offset: 0x8C */ - uint32_t RESERVED3; /*!< Reserved, 0x90 */ - __IO uint32_t ECCR3; /*!< NAND Flash ECC result registers 3, Address offset: 0x94 */ -} FSMC_Bank2_3_TypeDef; - -/** - * @brief Flexible Static Memory Controller Bank4 - */ - -typedef struct -{ - __IO uint32_t PCR4; /*!< PC Card control register 4, Address offset: 0xA0 */ - __IO uint32_t SR4; /*!< PC Card FIFO status and interrupt register 4, Address offset: 0xA4 */ - __IO uint32_t PMEM4; /*!< PC Card Common memory space timing register 4, Address offset: 0xA8 */ - __IO uint32_t PATT4; /*!< PC Card Attribute memory space timing register 4, Address offset: 0xAC */ - __IO uint32_t PIO4; /*!< PC Card I/O space timing register 4, Address offset: 0xB0 */ -} FSMC_Bank4_TypeDef; - - -/** - * @brief General Purpose I/O - */ - -typedef struct -{ - __IO uint32_t MODER; /*!< GPIO port mode register, Address offset: 0x00 */ - __IO uint32_t OTYPER; /*!< GPIO port output type register, Address offset: 0x04 */ - __IO uint32_t OSPEEDR; /*!< GPIO port output speed register, Address offset: 0x08 */ - __IO uint32_t PUPDR; /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */ - __IO uint32_t IDR; /*!< GPIO port input data register, Address offset: 0x10 */ - __IO uint32_t ODR; /*!< GPIO port output data register, Address offset: 0x14 */ - __IO uint32_t BSRR; /*!< GPIO port bit set/reset register, Address offset: 0x18 */ - __IO uint32_t LCKR; /*!< GPIO port configuration lock register, Address offset: 0x1C */ - __IO uint32_t AFR[2]; /*!< GPIO alternate function registers, Address offset: 0x20-0x24 */ -} GPIO_TypeDef; - -/** - * @brief System configuration controller - */ - -typedef struct -{ - __IO uint32_t MEMRMP; /*!< SYSCFG memory remap register, Address offset: 0x00 */ - __IO uint32_t PMC; /*!< SYSCFG peripheral mode configuration register, Address offset: 0x04 */ - __IO uint32_t EXTICR[4]; /*!< SYSCFG external interrupt configuration registers, Address offset: 0x08-0x14 */ - uint32_t RESERVED[2]; /*!< Reserved, 0x18-0x1C */ - __IO uint32_t CMPCR; /*!< SYSCFG Compensation cell control register, Address offset: 0x20 */ -} SYSCFG_TypeDef; - -/** - * @brief Inter-integrated Circuit Interface - */ - -typedef struct -{ - __IO uint32_t CR1; /*!< I2C Control register 1, Address offset: 0x00 */ - __IO uint32_t CR2; /*!< I2C Control register 2, Address offset: 0x04 */ - __IO uint32_t OAR1; /*!< I2C Own address register 1, Address offset: 0x08 */ - __IO uint32_t OAR2; /*!< I2C Own address register 2, Address offset: 0x0C */ - __IO uint32_t DR; /*!< I2C Data register, Address offset: 0x10 */ - __IO uint32_t SR1; /*!< I2C Status register 1, Address offset: 0x14 */ - __IO uint32_t SR2; /*!< I2C Status register 2, Address offset: 0x18 */ - __IO uint32_t CCR; /*!< I2C Clock control register, Address offset: 0x1C */ - __IO uint32_t TRISE; /*!< I2C TRISE register, Address offset: 0x20 */ - __IO uint32_t FLTR; /*!< I2C FLTR register, Address offset: 0x24 */ -} I2C_TypeDef; - -/** - * @brief Independent WATCHDOG - */ - -typedef struct -{ - __IO uint32_t KR; /*!< IWDG Key register, Address offset: 0x00 */ - __IO uint32_t PR; /*!< IWDG Prescaler register, Address offset: 0x04 */ - __IO uint32_t RLR; /*!< IWDG Reload register, Address offset: 0x08 */ - __IO uint32_t SR; /*!< IWDG Status register, Address offset: 0x0C */ -} IWDG_TypeDef; - -/** - * @brief Power Control - */ - -typedef struct -{ - __IO uint32_t CR; /*!< PWR power control register, Address offset: 0x00 */ - __IO uint32_t CSR; /*!< PWR power control/status register, Address offset: 0x04 */ -} PWR_TypeDef; - -/** - * @brief Reset and Clock Control - */ - -typedef struct -{ - __IO uint32_t CR; /*!< RCC clock control register, Address offset: 0x00 */ - __IO uint32_t PLLCFGR; /*!< RCC PLL configuration register, Address offset: 0x04 */ - __IO uint32_t CFGR; /*!< RCC clock configuration register, Address offset: 0x08 */ - __IO uint32_t CIR; /*!< RCC clock interrupt register, Address offset: 0x0C */ - __IO uint32_t AHB1RSTR; /*!< RCC AHB1 peripheral reset register, Address offset: 0x10 */ - __IO uint32_t AHB2RSTR; /*!< RCC AHB2 peripheral reset register, Address offset: 0x14 */ - __IO uint32_t AHB3RSTR; /*!< RCC AHB3 peripheral reset register, Address offset: 0x18 */ - uint32_t RESERVED0; /*!< Reserved, 0x1C */ - __IO uint32_t APB1RSTR; /*!< RCC APB1 peripheral reset register, Address offset: 0x20 */ - __IO uint32_t APB2RSTR; /*!< RCC APB2 peripheral reset register, Address offset: 0x24 */ - uint32_t RESERVED1[2]; /*!< Reserved, 0x28-0x2C */ - __IO uint32_t AHB1ENR; /*!< RCC AHB1 peripheral clock register, Address offset: 0x30 */ - __IO uint32_t AHB2ENR; /*!< RCC AHB2 peripheral clock register, Address offset: 0x34 */ - __IO uint32_t AHB3ENR; /*!< RCC AHB3 peripheral clock register, Address offset: 0x38 */ - uint32_t RESERVED2; /*!< Reserved, 0x3C */ - __IO uint32_t APB1ENR; /*!< RCC APB1 peripheral clock enable register, Address offset: 0x40 */ - __IO uint32_t APB2ENR; /*!< RCC APB2 peripheral clock enable register, Address offset: 0x44 */ - uint32_t RESERVED3[2]; /*!< Reserved, 0x48-0x4C */ - __IO uint32_t AHB1LPENR; /*!< RCC AHB1 peripheral clock enable in low power mode register, Address offset: 0x50 */ - __IO uint32_t AHB2LPENR; /*!< RCC AHB2 peripheral clock enable in low power mode register, Address offset: 0x54 */ - __IO uint32_t AHB3LPENR; /*!< RCC AHB3 peripheral clock enable in low power mode register, Address offset: 0x58 */ - uint32_t RESERVED4; /*!< Reserved, 0x5C */ - __IO uint32_t APB1LPENR; /*!< RCC APB1 peripheral clock enable in low power mode register, Address offset: 0x60 */ - __IO uint32_t APB2LPENR; /*!< RCC APB2 peripheral clock enable in low power mode register, Address offset: 0x64 */ - uint32_t RESERVED5[2]; /*!< Reserved, 0x68-0x6C */ - __IO uint32_t BDCR; /*!< RCC Backup domain control register, Address offset: 0x70 */ - __IO uint32_t CSR; /*!< RCC clock control & status register, Address offset: 0x74 */ - uint32_t RESERVED6[2]; /*!< Reserved, 0x78-0x7C */ - __IO uint32_t SSCGR; /*!< RCC spread spectrum clock generation register, Address offset: 0x80 */ - __IO uint32_t PLLI2SCFGR; /*!< RCC PLLI2S configuration register, Address offset: 0x84 */ - -} RCC_TypeDef; - -/** - * @brief Real-Time Clock - */ - -typedef struct -{ - __IO uint32_t TR; /*!< RTC time register, Address offset: 0x00 */ - __IO uint32_t DR; /*!< RTC date register, Address offset: 0x04 */ - __IO uint32_t CR; /*!< RTC control register, Address offset: 0x08 */ - __IO uint32_t ISR; /*!< RTC initialization and status register, Address offset: 0x0C */ - __IO uint32_t PRER; /*!< RTC prescaler register, Address offset: 0x10 */ - __IO uint32_t WUTR; /*!< RTC wakeup timer register, Address offset: 0x14 */ - __IO uint32_t CALIBR; /*!< RTC calibration register, Address offset: 0x18 */ - __IO uint32_t ALRMAR; /*!< RTC alarm A register, Address offset: 0x1C */ - __IO uint32_t ALRMBR; /*!< RTC alarm B register, Address offset: 0x20 */ - __IO uint32_t WPR; /*!< RTC write protection register, Address offset: 0x24 */ - uint32_t RESERVED1; /*!< Reserved, 0x28 */ - uint32_t RESERVED2; /*!< Reserved, 0x2C */ - __IO uint32_t TSTR; /*!< RTC time stamp time register, Address offset: 0x30 */ - __IO uint32_t TSDR; /*!< RTC time stamp date register, Address offset: 0x34 */ - uint32_t RESERVED3; /*!< Reserved, 0x38 */ - uint32_t RESERVED4; /*!< Reserved, 0x3C */ - __IO uint32_t TAFCR; /*!< RTC tamper and alternate function configuration register, Address offset: 0x40 */ - uint32_t RESERVED5; /*!< Reserved, 0x44 */ - uint32_t RESERVED6; /*!< Reserved, 0x48 */ - uint32_t RESERVED7; /*!< Reserved, 0x4C */ - __IO uint32_t BKP0R; /*!< RTC backup register 1, Address offset: 0x50 */ - __IO uint32_t BKP1R; /*!< RTC backup register 1, Address offset: 0x54 */ - __IO uint32_t BKP2R; /*!< RTC backup register 2, Address offset: 0x58 */ - __IO uint32_t BKP3R; /*!< RTC backup register 3, Address offset: 0x5C */ - __IO uint32_t BKP4R; /*!< RTC backup register 4, Address offset: 0x60 */ - __IO uint32_t BKP5R; /*!< RTC backup register 5, Address offset: 0x64 */ - __IO uint32_t BKP6R; /*!< RTC backup register 6, Address offset: 0x68 */ - __IO uint32_t BKP7R; /*!< RTC backup register 7, Address offset: 0x6C */ - __IO uint32_t BKP8R; /*!< RTC backup register 8, Address offset: 0x70 */ - __IO uint32_t BKP9R; /*!< RTC backup register 9, Address offset: 0x74 */ - __IO uint32_t BKP10R; /*!< RTC backup register 10, Address offset: 0x78 */ - __IO uint32_t BKP11R; /*!< RTC backup register 11, Address offset: 0x7C */ - __IO uint32_t BKP12R; /*!< RTC backup register 12, Address offset: 0x80 */ - __IO uint32_t BKP13R; /*!< RTC backup register 13, Address offset: 0x84 */ - __IO uint32_t BKP14R; /*!< RTC backup register 14, Address offset: 0x88 */ - __IO uint32_t BKP15R; /*!< RTC backup register 15, Address offset: 0x8C */ - __IO uint32_t BKP16R; /*!< RTC backup register 16, Address offset: 0x90 */ - __IO uint32_t BKP17R; /*!< RTC backup register 17, Address offset: 0x94 */ - __IO uint32_t BKP18R; /*!< RTC backup register 18, Address offset: 0x98 */ - __IO uint32_t BKP19R; /*!< RTC backup register 19, Address offset: 0x9C */ -} RTC_TypeDef; - - -/** - * @brief SD host Interface - */ - -typedef struct -{ - __IO uint32_t POWER; /*!< SDIO power control register, Address offset: 0x00 */ - __IO uint32_t CLKCR; /*!< SDI clock control register, Address offset: 0x04 */ - __IO uint32_t ARG; /*!< SDIO argument register, Address offset: 0x08 */ - __IO uint32_t CMD; /*!< SDIO command register, Address offset: 0x0C */ - __IO const uint32_t RESPCMD; /*!< SDIO command response register, Address offset: 0x10 */ - __IO const uint32_t RESP1; /*!< SDIO response 1 register, Address offset: 0x14 */ - __IO const uint32_t RESP2; /*!< SDIO response 2 register, Address offset: 0x18 */ - __IO const uint32_t RESP3; /*!< SDIO response 3 register, Address offset: 0x1C */ - __IO const uint32_t RESP4; /*!< SDIO response 4 register, Address offset: 0x20 */ - __IO uint32_t DTIMER; /*!< SDIO data timer register, Address offset: 0x24 */ - __IO uint32_t DLEN; /*!< SDIO data length register, Address offset: 0x28 */ - __IO uint32_t DCTRL; /*!< SDIO data control register, Address offset: 0x2C */ - __IO const uint32_t DCOUNT; /*!< SDIO data counter register, Address offset: 0x30 */ - __IO const uint32_t STA; /*!< SDIO status register, Address offset: 0x34 */ - __IO uint32_t ICR; /*!< SDIO interrupt clear register, Address offset: 0x38 */ - __IO uint32_t MASK; /*!< SDIO mask register, Address offset: 0x3C */ - uint32_t RESERVED0[2]; /*!< Reserved, 0x40-0x44 */ - __IO const uint32_t FIFOCNT; /*!< SDIO FIFO counter register, Address offset: 0x48 */ - uint32_t RESERVED1[13]; /*!< Reserved, 0x4C-0x7C */ - __IO uint32_t FIFO; /*!< SDIO data FIFO register, Address offset: 0x80 */ -} SDIO_TypeDef; - -/** - * @brief Serial Peripheral Interface - */ - -typedef struct -{ - __IO uint32_t CR1; /*!< SPI control register 1 (not used in I2S mode), Address offset: 0x00 */ - __IO uint32_t CR2; /*!< SPI control register 2, Address offset: 0x04 */ - __IO uint32_t SR; /*!< SPI status register, Address offset: 0x08 */ - __IO uint32_t DR; /*!< SPI data register, Address offset: 0x0C */ - __IO uint32_t CRCPR; /*!< SPI CRC polynomial register (not used in I2S mode), Address offset: 0x10 */ - __IO uint32_t RXCRCR; /*!< SPI RX CRC register (not used in I2S mode), Address offset: 0x14 */ - __IO uint32_t TXCRCR; /*!< SPI TX CRC register (not used in I2S mode), Address offset: 0x18 */ - __IO uint32_t I2SCFGR; /*!< SPI_I2S configuration register, Address offset: 0x1C */ - __IO uint32_t I2SPR; /*!< SPI_I2S prescaler register, Address offset: 0x20 */ -} SPI_TypeDef; - -/** - * @brief TIM - */ - -typedef struct -{ - __IO uint32_t CR1; /*!< TIM control register 1, Address offset: 0x00 */ - __IO uint32_t CR2; /*!< TIM control register 2, Address offset: 0x04 */ - __IO uint32_t SMCR; /*!< TIM slave mode control register, Address offset: 0x08 */ - __IO uint32_t DIER; /*!< TIM DMA/interrupt enable register, Address offset: 0x0C */ - __IO uint32_t SR; /*!< TIM status register, Address offset: 0x10 */ - __IO uint32_t EGR; /*!< TIM event generation register, Address offset: 0x14 */ - __IO uint32_t CCMR1; /*!< TIM capture/compare mode register 1, Address offset: 0x18 */ - __IO uint32_t CCMR2; /*!< TIM capture/compare mode register 2, Address offset: 0x1C */ - __IO uint32_t CCER; /*!< TIM capture/compare enable register, Address offset: 0x20 */ - __IO uint32_t CNT; /*!< TIM counter register, Address offset: 0x24 */ - __IO uint32_t PSC; /*!< TIM prescaler, Address offset: 0x28 */ - __IO uint32_t ARR; /*!< TIM auto-reload register, Address offset: 0x2C */ - __IO uint32_t RCR; /*!< TIM repetition counter register, Address offset: 0x30 */ - __IO uint32_t CCR1; /*!< TIM capture/compare register 1, Address offset: 0x34 */ - __IO uint32_t CCR2; /*!< TIM capture/compare register 2, Address offset: 0x38 */ - __IO uint32_t CCR3; /*!< TIM capture/compare register 3, Address offset: 0x3C */ - __IO uint32_t CCR4; /*!< TIM capture/compare register 4, Address offset: 0x40 */ - __IO uint32_t BDTR; /*!< TIM break and dead-time register, Address offset: 0x44 */ - __IO uint32_t DCR; /*!< TIM DMA control register, Address offset: 0x48 */ - __IO uint32_t DMAR; /*!< TIM DMA address for full transfer, Address offset: 0x4C */ - __IO uint32_t OR; /*!< TIM option register, Address offset: 0x50 */ -} TIM_TypeDef; - -/** - * @brief Universal Synchronous Asynchronous Receiver Transmitter - */ - -typedef struct -{ - __IO uint32_t SR; /*!< USART Status register, Address offset: 0x00 */ - __IO uint32_t DR; /*!< USART Data register, Address offset: 0x04 */ - __IO uint32_t BRR; /*!< USART Baud rate register, Address offset: 0x08 */ - __IO uint32_t CR1; /*!< USART Control register 1, Address offset: 0x0C */ - __IO uint32_t CR2; /*!< USART Control register 2, Address offset: 0x10 */ - __IO uint32_t CR3; /*!< USART Control register 3, Address offset: 0x14 */ - __IO uint32_t GTPR; /*!< USART Guard time and prescaler register, Address offset: 0x18 */ -} USART_TypeDef; - -/** - * @brief Window WATCHDOG - */ - -typedef struct -{ - __IO uint32_t CR; /*!< WWDG Control register, Address offset: 0x00 */ - __IO uint32_t CFR; /*!< WWDG Configuration register, Address offset: 0x04 */ - __IO uint32_t SR; /*!< WWDG Status register, Address offset: 0x08 */ -} WWDG_TypeDef; - -/** - * @brief Crypto Processor - */ - -typedef struct -{ - __IO uint32_t CR; /*!< CRYP control register, Address offset: 0x00 */ - __IO uint32_t SR; /*!< CRYP status register, Address offset: 0x04 */ - __IO uint32_t DR; /*!< CRYP data input register, Address offset: 0x08 */ - __IO uint32_t DOUT; /*!< CRYP data output register, Address offset: 0x0C */ - __IO uint32_t DMACR; /*!< CRYP DMA control register, Address offset: 0x10 */ - __IO uint32_t IMSCR; /*!< CRYP interrupt mask set/clear register, Address offset: 0x14 */ - __IO uint32_t RISR; /*!< CRYP raw interrupt status register, Address offset: 0x18 */ - __IO uint32_t MISR; /*!< CRYP masked interrupt status register, Address offset: 0x1C */ - __IO uint32_t K0LR; /*!< CRYP key left register 0, Address offset: 0x20 */ - __IO uint32_t K0RR; /*!< CRYP key right register 0, Address offset: 0x24 */ - __IO uint32_t K1LR; /*!< CRYP key left register 1, Address offset: 0x28 */ - __IO uint32_t K1RR; /*!< CRYP key right register 1, Address offset: 0x2C */ - __IO uint32_t K2LR; /*!< CRYP key left register 2, Address offset: 0x30 */ - __IO uint32_t K2RR; /*!< CRYP key right register 2, Address offset: 0x34 */ - __IO uint32_t K3LR; /*!< CRYP key left register 3, Address offset: 0x38 */ - __IO uint32_t K3RR; /*!< CRYP key right register 3, Address offset: 0x3C */ - __IO uint32_t IV0LR; /*!< CRYP initialization vector left-word register 0, Address offset: 0x40 */ - __IO uint32_t IV0RR; /*!< CRYP initialization vector right-word register 0, Address offset: 0x44 */ - __IO uint32_t IV1LR; /*!< CRYP initialization vector left-word register 1, Address offset: 0x48 */ - __IO uint32_t IV1RR; /*!< CRYP initialization vector right-word register 1, Address offset: 0x4C */ -} CRYP_TypeDef; - -/** - * @brief HASH - */ - -typedef struct -{ - __IO uint32_t CR; /*!< HASH control register, Address offset: 0x00 */ - __IO uint32_t DIN; /*!< HASH data input register, Address offset: 0x04 */ - __IO uint32_t STR; /*!< HASH start register, Address offset: 0x08 */ - __IO uint32_t HR[5]; /*!< HASH digest registers, Address offset: 0x0C-0x1C */ - __IO uint32_t IMR; /*!< HASH interrupt enable register, Address offset: 0x20 */ - __IO uint32_t SR; /*!< HASH status register, Address offset: 0x24 */ - uint32_t RESERVED[52]; /*!< Reserved, 0x28-0xF4 */ - __IO uint32_t CSR[51]; /*!< HASH context swap registers, Address offset: 0x0F8-0x1C0 */ -} HASH_TypeDef; - -/** - * @brief RNG - */ - -typedef struct -{ - __IO uint32_t CR; /*!< RNG control register, Address offset: 0x00 */ - __IO uint32_t SR; /*!< RNG status register, Address offset: 0x04 */ - __IO uint32_t DR; /*!< RNG data register, Address offset: 0x08 */ -} RNG_TypeDef; - - - -/** - * @brief __USB_OTG_Core_register - */ -typedef struct -{ - __IO uint32_t GOTGCTL; /*!< USB_OTG Control and Status Register 000h*/ - __IO uint32_t GOTGINT; /*!< USB_OTG Interrupt Register 004h*/ - __IO uint32_t GAHBCFG; /*!< Core AHB Configuration Register 008h*/ - __IO uint32_t GUSBCFG; /*!< Core USB Configuration Register 00Ch*/ - __IO uint32_t GRSTCTL; /*!< Core Reset Register 010h*/ - __IO uint32_t GINTSTS; /*!< Core Interrupt Register 014h*/ - __IO uint32_t GINTMSK; /*!< Core Interrupt Mask Register 018h*/ - __IO uint32_t GRXSTSR; /*!< Receive Sts Q Read Register 01Ch*/ - __IO uint32_t GRXSTSP; /*!< Receive Sts Q Read & POP Register 020h*/ - __IO uint32_t GRXFSIZ; /* Receive FIFO Size Register 024h*/ - __IO uint32_t DIEPTXF0_HNPTXFSIZ; /*!< EP0 / Non Periodic Tx FIFO Size Register 028h*/ - __IO uint32_t HNPTXSTS; /*!< Non Periodic Tx FIFO/Queue Sts reg 02Ch*/ - uint32_t Reserved30[2]; /* Reserved 030h*/ - __IO uint32_t GCCFG; /* General Purpose IO Register 038h*/ - __IO uint32_t CID; /* User ID Register 03Ch*/ - uint32_t Reserved40[48]; /* Reserved 040h-0FFh*/ - __IO uint32_t HPTXFSIZ; /* Host Periodic Tx FIFO Size Reg 100h*/ - __IO uint32_t DIEPTXF[0x0F];/* dev Periodic Transmit FIFO */ -} -USB_OTG_GlobalTypeDef; - - - -/** - * @brief __device_Registers - */ -typedef struct -{ - __IO uint32_t DCFG; /* dev Configuration Register 800h*/ - __IO uint32_t DCTL; /* dev Control Register 804h*/ - __IO uint32_t DSTS; /* dev Status Register (RO) 808h*/ - uint32_t Reserved0C; /* Reserved 80Ch*/ - __IO uint32_t DIEPMSK; /* dev IN Endpoint Mask 810h*/ - __IO uint32_t DOEPMSK; /* dev OUT Endpoint Mask 814h*/ - __IO uint32_t DAINT; /* dev All Endpoints Itr Reg 818h*/ - __IO uint32_t DAINTMSK; /* dev All Endpoints Itr Mask 81Ch*/ - uint32_t Reserved20; /* Reserved 820h*/ - uint32_t Reserved9; /* Reserved 824h*/ - __IO uint32_t DVBUSDIS; /* dev VBUS discharge Register 828h*/ - __IO uint32_t DVBUSPULSE; /* dev VBUS Pulse Register 82Ch*/ - __IO uint32_t DTHRCTL; /* dev thr 830h*/ - __IO uint32_t DIEPEMPMSK; /* dev empty msk 834h*/ - __IO uint32_t DEACHINT; /* dedicated EP interrupt 838h*/ - __IO uint32_t DEACHMSK; /* dedicated EP msk 83Ch*/ - uint32_t Reserved40; /* dedicated EP mask 840h*/ - __IO uint32_t DINEP1MSK; /* dedicated EP mask 844h*/ - uint32_t Reserved44[15]; /* Reserved 844-87Ch*/ - __IO uint32_t DOUTEP1MSK; /* dedicated EP msk 884h*/ -} -USB_OTG_DeviceTypeDef; - - -/** - * @brief __IN_Endpoint-Specific_Register - */ -typedef struct -{ - __IO uint32_t DIEPCTL; /* dev IN Endpoint Control Reg 900h + (ep_num * 20h) + 00h*/ - uint32_t Reserved04; /* Reserved 900h + (ep_num * 20h) + 04h*/ - __IO uint32_t DIEPINT; /* dev IN Endpoint Itr Reg 900h + (ep_num * 20h) + 08h*/ - uint32_t Reserved0C; /* Reserved 900h + (ep_num * 20h) + 0Ch*/ - __IO uint32_t DIEPTSIZ; /* IN Endpoint Txfer Size 900h + (ep_num * 20h) + 10h*/ - __IO uint32_t DIEPDMA; /* IN Endpoint DMA Address Reg 900h + (ep_num * 20h) + 14h*/ - __IO uint32_t DTXFSTS;/*IN Endpoint Tx FIFO Status Reg 900h + (ep_num * 20h) + 18h*/ - uint32_t Reserved18; /* Reserved 900h+(ep_num*20h)+1Ch-900h+ (ep_num * 20h) + 1Ch*/ -} -USB_OTG_INEndpointTypeDef; - - -/** - * @brief __OUT_Endpoint-Specific_Registers - */ -typedef struct -{ - __IO uint32_t DOEPCTL; /* dev OUT Endpoint Control Reg B00h + (ep_num * 20h) + 00h*/ - uint32_t Reserved04; /* Reserved B00h + (ep_num * 20h) + 04h*/ - __IO uint32_t DOEPINT; /* dev OUT Endpoint Itr Reg B00h + (ep_num * 20h) + 08h*/ - uint32_t Reserved0C; /* Reserved B00h + (ep_num * 20h) + 0Ch*/ - __IO uint32_t DOEPTSIZ; /* dev OUT Endpoint Txfer Size B00h + (ep_num * 20h) + 10h*/ - __IO uint32_t DOEPDMA; /* dev OUT Endpoint DMA Address B00h + (ep_num * 20h) + 14h*/ - uint32_t Reserved18[2]; /* Reserved B00h + (ep_num * 20h) + 18h - B00h + (ep_num * 20h) + 1Ch*/ -} -USB_OTG_OUTEndpointTypeDef; - - -/** - * @brief __Host_Mode_Register_Structures - */ -typedef struct -{ - __IO uint32_t HCFG; /* Host Configuration Register 400h*/ - __IO uint32_t HFIR; /* Host Frame Interval Register 404h*/ - __IO uint32_t HFNUM; /* Host Frame Nbr/Frame Remaining 408h*/ - uint32_t Reserved40C; /* Reserved 40Ch*/ - __IO uint32_t HPTXSTS; /* Host Periodic Tx FIFO/ Queue Status 410h*/ - __IO uint32_t HAINT; /* Host All Channels Interrupt Register 414h*/ - __IO uint32_t HAINTMSK; /* Host All Channels Interrupt Mask 418h*/ -} -USB_OTG_HostTypeDef; - - -/** - * @brief __Host_Channel_Specific_Registers - */ -typedef struct -{ - __IO uint32_t HCCHAR; - __IO uint32_t HCSPLT; - __IO uint32_t HCINT; - __IO uint32_t HCINTMSK; - __IO uint32_t HCTSIZ; - __IO uint32_t HCDMA; - uint32_t Reserved[2]; -} -USB_OTG_HostChannelTypeDef; - - -/** - * @brief Peripheral_memory_map - */ -#define FLASH_BASE ((uint32_t)0x08000000) /*!< FLASH(up to 1 MB) base address in the alias region */ -#define SRAM1_BASE ((uint32_t)0x20000000) /*!< SRAM1(112 KB) base address in the alias region */ -#define SRAM2_BASE ((uint32_t)0x2001C000) /*!< SRAM2(16 KB) base address in the alias region */ -#define PERIPH_BASE ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */ -#define BKPSRAM_BASE ((uint32_t)0x40024000) /*!< Backup SRAM(4 KB) base address in the alias region */ -#define FSMC_R_BASE ((uint32_t)0xA0000000) /*!< FSMC registers base address */ -#define SRAM1_BB_BASE ((uint32_t)0x22000000) /*!< SRAM1(112 KB) base address in the bit-band region */ -#define SRAM2_BB_BASE ((uint32_t)0x22380000) /*!< SRAM2(16 KB) base address in the bit-band region */ -#define PERIPH_BB_BASE ((uint32_t)0x42000000) /*!< Peripheral base address in the bit-band region */ -#define BKPSRAM_BB_BASE ((uint32_t)0x42480000) /*!< Backup SRAM(4 KB) base address in the bit-band region */ -#define FLASH_END ((uint32_t)0x080FFFFF) /*!< FLASH end address */ - - -/* Legacy defines */ -#define SRAM_BASE SRAM1_BASE -#define SRAM_BB_BASE SRAM1_BB_BASE - - -/*!< Peripheral memory map */ -#define APB1PERIPH_BASE PERIPH_BASE -#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000) -#define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000) -#define AHB2PERIPH_BASE (PERIPH_BASE + 0x10000000) - -/*!< APB1 peripherals */ -#define TIM2_BASE (APB1PERIPH_BASE + 0x0000) -#define TIM3_BASE (APB1PERIPH_BASE + 0x0400) -#define TIM4_BASE (APB1PERIPH_BASE + 0x0800) -#define TIM5_BASE (APB1PERIPH_BASE + 0x0C00) -#define TIM6_BASE (APB1PERIPH_BASE + 0x1000) -#define TIM7_BASE (APB1PERIPH_BASE + 0x1400) -#define TIM12_BASE (APB1PERIPH_BASE + 0x1800) -#define TIM13_BASE (APB1PERIPH_BASE + 0x1C00) -#define TIM14_BASE (APB1PERIPH_BASE + 0x2000) -#define RTC_BASE (APB1PERIPH_BASE + 0x2800) -#define WWDG_BASE (APB1PERIPH_BASE + 0x2C00) -#define IWDG_BASE (APB1PERIPH_BASE + 0x3000) -#define SPI2_BASE (APB1PERIPH_BASE + 0x3800) -#define SPI3_BASE (APB1PERIPH_BASE + 0x3C00) -#define USART2_BASE (APB1PERIPH_BASE + 0x4400) -#define USART3_BASE (APB1PERIPH_BASE + 0x4800) -#define UART4_BASE (APB1PERIPH_BASE + 0x4C00) -#define UART5_BASE (APB1PERIPH_BASE + 0x5000) -#define I2C1_BASE (APB1PERIPH_BASE + 0x5400) -#define I2C2_BASE (APB1PERIPH_BASE + 0x5800) -#define I2C3_BASE (APB1PERIPH_BASE + 0x5C00) -#define CAN1_BASE (APB1PERIPH_BASE + 0x6400) -#define CAN2_BASE (APB1PERIPH_BASE + 0x6800) -#define PWR_BASE (APB1PERIPH_BASE + 0x7000) -#define DAC_BASE (APB1PERIPH_BASE + 0x7400) - -/*!< APB2 peripherals */ -#define TIM1_BASE (APB2PERIPH_BASE + 0x0000) -#define TIM8_BASE (APB2PERIPH_BASE + 0x0400) -#define USART1_BASE (APB2PERIPH_BASE + 0x1000) -#define USART6_BASE (APB2PERIPH_BASE + 0x1400) -#define ADC1_BASE (APB2PERIPH_BASE + 0x2000) -#define ADC2_BASE (APB2PERIPH_BASE + 0x2100) -#define ADC3_BASE (APB2PERIPH_BASE + 0x2200) -#define ADC_BASE (APB2PERIPH_BASE + 0x2300) -#define SDIO_BASE (APB2PERIPH_BASE + 0x2C00) -#define SPI1_BASE (APB2PERIPH_BASE + 0x3000) -#define SYSCFG_BASE (APB2PERIPH_BASE + 0x3800) -#define EXTI_BASE (APB2PERIPH_BASE + 0x3C00) -#define TIM9_BASE (APB2PERIPH_BASE + 0x4000) -#define TIM10_BASE (APB2PERIPH_BASE + 0x4400) -#define TIM11_BASE (APB2PERIPH_BASE + 0x4800) - -/*!< AHB1 peripherals */ -#define GPIOA_BASE (AHB1PERIPH_BASE + 0x0000) -#define GPIOB_BASE (AHB1PERIPH_BASE + 0x0400) -#define GPIOC_BASE (AHB1PERIPH_BASE + 0x0800) -#define GPIOD_BASE (AHB1PERIPH_BASE + 0x0C00) -#define GPIOE_BASE (AHB1PERIPH_BASE + 0x1000) -#define GPIOF_BASE (AHB1PERIPH_BASE + 0x1400) -#define GPIOG_BASE (AHB1PERIPH_BASE + 0x1800) -#define GPIOH_BASE (AHB1PERIPH_BASE + 0x1C00) -#define GPIOI_BASE (AHB1PERIPH_BASE + 0x2000) -#define CRC_BASE (AHB1PERIPH_BASE + 0x3000) -#define RCC_BASE (AHB1PERIPH_BASE + 0x3800) -#define FLASH_R_BASE (AHB1PERIPH_BASE + 0x3C00) -#define DMA1_BASE (AHB1PERIPH_BASE + 0x6000) -#define DMA1_Stream0_BASE (DMA1_BASE + 0x010) -#define DMA1_Stream1_BASE (DMA1_BASE + 0x028) -#define DMA1_Stream2_BASE (DMA1_BASE + 0x040) -#define DMA1_Stream3_BASE (DMA1_BASE + 0x058) -#define DMA1_Stream4_BASE (DMA1_BASE + 0x070) -#define DMA1_Stream5_BASE (DMA1_BASE + 0x088) -#define DMA1_Stream6_BASE (DMA1_BASE + 0x0A0) -#define DMA1_Stream7_BASE (DMA1_BASE + 0x0B8) -#define DMA2_BASE (AHB1PERIPH_BASE + 0x6400) -#define DMA2_Stream0_BASE (DMA2_BASE + 0x010) -#define DMA2_Stream1_BASE (DMA2_BASE + 0x028) -#define DMA2_Stream2_BASE (DMA2_BASE + 0x040) -#define DMA2_Stream3_BASE (DMA2_BASE + 0x058) -#define DMA2_Stream4_BASE (DMA2_BASE + 0x070) -#define DMA2_Stream5_BASE (DMA2_BASE + 0x088) -#define DMA2_Stream6_BASE (DMA2_BASE + 0x0A0) -#define DMA2_Stream7_BASE (DMA2_BASE + 0x0B8) - -/*!< AHB2 peripherals */ -#define CRYP_BASE (AHB2PERIPH_BASE + 0x60000) -#define HASH_BASE (AHB2PERIPH_BASE + 0x60400) -#define HASH_DIGEST_BASE (AHB2PERIPH_BASE + 0x60710) -#define RNG_BASE (AHB2PERIPH_BASE + 0x60800) - -/*!< FSMC Bankx registers base address */ -#define FSMC_Bank1_R_BASE (FSMC_R_BASE + 0x0000) -#define FSMC_Bank1E_R_BASE (FSMC_R_BASE + 0x0104) -#define FSMC_Bank2_3_R_BASE (FSMC_R_BASE + 0x0060) -#define FSMC_Bank4_R_BASE (FSMC_R_BASE + 0x00A0) - -/* Debug MCU registers base address */ -#define DBGMCU_BASE ((uint32_t )0xE0042000) - -/*!< USB registers base address */ -#define USB_OTG_HS_PERIPH_BASE ((uint32_t )0x40040000) -#define USB_OTG_FS_PERIPH_BASE ((uint32_t )0x50000000) - -#define USB_OTG_GLOBAL_BASE ((uint32_t )0x000) -#define USB_OTG_DEVICE_BASE ((uint32_t )0x800) -#define USB_OTG_IN_ENDPOINT_BASE ((uint32_t )0x900) -#define USB_OTG_OUT_ENDPOINT_BASE ((uint32_t )0xB00) -#define USB_OTG_EP_REG_SIZE ((uint32_t )0x20) -#define USB_OTG_HOST_BASE ((uint32_t )0x400) -#define USB_OTG_HOST_PORT_BASE ((uint32_t )0x440) -#define USB_OTG_HOST_CHANNEL_BASE ((uint32_t )0x500) -#define USB_OTG_HOST_CHANNEL_SIZE ((uint32_t )0x20) -#define USB_OTG_PCGCCTL_BASE ((uint32_t )0xE00) -#define USB_OTG_FIFO_BASE ((uint32_t )0x1000) -#define USB_OTG_FIFO_SIZE ((uint32_t )0x1000) - -/** - * @} - */ - -/** @addtogroup Peripheral_declaration - * @{ - */ -#define TIM2 ((TIM_TypeDef *) TIM2_BASE) -#define TIM3 ((TIM_TypeDef *) TIM3_BASE) -#define TIM4 ((TIM_TypeDef *) TIM4_BASE) -#define TIM5 ((TIM_TypeDef *) TIM5_BASE) -#define TIM6 ((TIM_TypeDef *) TIM6_BASE) -#define TIM7 ((TIM_TypeDef *) TIM7_BASE) -#define TIM12 ((TIM_TypeDef *) TIM12_BASE) -#define TIM13 ((TIM_TypeDef *) TIM13_BASE) -#define TIM14 ((TIM_TypeDef *) TIM14_BASE) -#define RTC ((RTC_TypeDef *) RTC_BASE) -#define WWDG ((WWDG_TypeDef *) WWDG_BASE) -#define IWDG ((IWDG_TypeDef *) IWDG_BASE) -#define SPI2 ((SPI_TypeDef *) SPI2_BASE) -#define SPI3 ((SPI_TypeDef *) SPI3_BASE) -#define USART2 ((USART_TypeDef *) USART2_BASE) -#define USART3 ((USART_TypeDef *) USART3_BASE) -#define UART4 ((USART_TypeDef *) UART4_BASE) -#define UART5 ((USART_TypeDef *) UART5_BASE) -#define I2C1 ((I2C_TypeDef *) I2C1_BASE) -#define I2C2 ((I2C_TypeDef *) I2C2_BASE) -#define I2C3 ((I2C_TypeDef *) I2C3_BASE) -#define CAN1 ((CAN_TypeDef *) CAN1_BASE) -#define CAN2 ((CAN_TypeDef *) CAN2_BASE) -#define PWR ((PWR_TypeDef *) PWR_BASE) -#define DAC ((DAC_TypeDef *) DAC_BASE) -#define TIM1 ((TIM_TypeDef *) TIM1_BASE) -#define TIM8 ((TIM_TypeDef *) TIM8_BASE) -#define USART1 ((USART_TypeDef *) USART1_BASE) -#define USART6 ((USART_TypeDef *) USART6_BASE) -#define ADC ((ADC_Common_TypeDef *) ADC_BASE) -#define ADC1 ((ADC_TypeDef *) ADC1_BASE) -#define ADC2 ((ADC_TypeDef *) ADC2_BASE) -#define ADC3 ((ADC_TypeDef *) ADC3_BASE) -#define SDIO ((SDIO_TypeDef *) SDIO_BASE) -#define SPI1 ((SPI_TypeDef *) SPI1_BASE) -#define SYSCFG ((SYSCFG_TypeDef *) SYSCFG_BASE) -#define EXTI ((EXTI_TypeDef *) EXTI_BASE) -#define TIM9 ((TIM_TypeDef *) TIM9_BASE) -#define TIM10 ((TIM_TypeDef *) TIM10_BASE) -#define TIM11 ((TIM_TypeDef *) TIM11_BASE) -#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) -#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE) -#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE) -#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE) -#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE) -#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE) -#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE) -#define GPIOH ((GPIO_TypeDef *) GPIOH_BASE) -#define GPIOI ((GPIO_TypeDef *) GPIOI_BASE) -#define CRC ((CRC_TypeDef *) CRC_BASE) -#define RCC ((RCC_TypeDef *) RCC_BASE) -#define FLASH ((FLASH_TypeDef *) FLASH_R_BASE) -#define DMA1 ((DMA_TypeDef *) DMA1_BASE) -#define DMA1_Stream0 ((DMA_Stream_TypeDef *) DMA1_Stream0_BASE) -#define DMA1_Stream1 ((DMA_Stream_TypeDef *) DMA1_Stream1_BASE) -#define DMA1_Stream2 ((DMA_Stream_TypeDef *) DMA1_Stream2_BASE) -#define DMA1_Stream3 ((DMA_Stream_TypeDef *) DMA1_Stream3_BASE) -#define DMA1_Stream4 ((DMA_Stream_TypeDef *) DMA1_Stream4_BASE) -#define DMA1_Stream5 ((DMA_Stream_TypeDef *) DMA1_Stream5_BASE) -#define DMA1_Stream6 ((DMA_Stream_TypeDef *) DMA1_Stream6_BASE) -#define DMA1_Stream7 ((DMA_Stream_TypeDef *) DMA1_Stream7_BASE) -#define DMA2 ((DMA_TypeDef *) DMA2_BASE) -#define DMA2_Stream0 ((DMA_Stream_TypeDef *) DMA2_Stream0_BASE) -#define DMA2_Stream1 ((DMA_Stream_TypeDef *) DMA2_Stream1_BASE) -#define DMA2_Stream2 ((DMA_Stream_TypeDef *) DMA2_Stream2_BASE) -#define DMA2_Stream3 ((DMA_Stream_TypeDef *) DMA2_Stream3_BASE) -#define DMA2_Stream4 ((DMA_Stream_TypeDef *) DMA2_Stream4_BASE) -#define DMA2_Stream5 ((DMA_Stream_TypeDef *) DMA2_Stream5_BASE) -#define DMA2_Stream6 ((DMA_Stream_TypeDef *) DMA2_Stream6_BASE) -#define DMA2_Stream7 ((DMA_Stream_TypeDef *) DMA2_Stream7_BASE) -#define CRYP ((CRYP_TypeDef *) CRYP_BASE) -#define HASH ((HASH_TypeDef *) HASH_BASE) -#define HASH_DIGEST ((HASH_DIGEST_TypeDef *) HASH_DIGEST_BASE) -#define RNG ((RNG_TypeDef *) RNG_BASE) -#define FSMC_Bank1 ((FSMC_Bank1_TypeDef *) FSMC_Bank1_R_BASE) -#define FSMC_Bank1E ((FSMC_Bank1E_TypeDef *) FSMC_Bank1E_R_BASE) -#define FSMC_Bank2_3 ((FSMC_Bank2_3_TypeDef *) FSMC_Bank2_3_R_BASE) -#define FSMC_Bank4 ((FSMC_Bank4_TypeDef *) FSMC_Bank4_R_BASE) - -#define DBGMCU ((DBGMCU_TypeDef *) DBGMCU_BASE) - -#define USB_OTG_FS ((USB_OTG_GlobalTypeDef *) USB_OTG_FS_PERIPH_BASE) -#define USB_OTG_HS ((USB_OTG_GlobalTypeDef *) USB_OTG_HS_PERIPH_BASE) - -/** - * @} - */ - -/** @addtogroup Exported_constants - * @{ - */ - - /** @addtogroup Peripheral_Registers_Bits_Definition - * @{ - */ - -/******************************************************************************/ -/* Peripheral Registers_Bits_Definition */ -/******************************************************************************/ - -/******************************************************************************/ -/* */ -/* Analog to Digital Converter */ -/* */ -/******************************************************************************/ -/******************** Bit definition for ADC_SR register ********************/ -#define ADC_SR_AWD ((uint32_t)0x00000001) /*!
© COPYRIGHT 2015 STMicroelectronics
- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/** @addtogroup CMSIS - * @{ - */ - -/** @addtogroup stm32f217xx - * @{ - */ - -#ifndef __STM32F217xx_H -#define __STM32F217xx_H - -#ifdef __cplusplus - extern "C" { -#endif /* __cplusplus */ - - -/** @addtogroup Configuration_section_for_CMSIS - * @{ - */ - -/** - * @brief Configuration of the Cortex-M3 Processor and Core Peripherals - */ -#define __CM3_REV 0x0200 /*!< Core revision r0p1 */ -#define __MPU_PRESENT 1 /*!< STM32F2XX provides an MPU */ -#define __NVIC_PRIO_BITS 4 /*!< STM32F2XX uses 4 Bits for the Priority Levels */ -#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */ - -/** - * @} - */ - -/** @addtogroup Peripheral_interrupt_number_definition - * @{ - */ - -/** - * @brief STM32F2XX Interrupt Number Definition, according to the selected device - * in @ref Library_configuration_section - */ -typedef enum -{ -/****** Cortex-M3 Processor Exceptions Numbers ****************************************************************/ - NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ - MemoryManagement_IRQn = -12, /*!< 4 Cortex-M3 Memory Management Interrupt */ - BusFault_IRQn = -11, /*!< 5 Cortex-M3 Bus Fault Interrupt */ - UsageFault_IRQn = -10, /*!< 6 Cortex-M3 Usage Fault Interrupt */ - SVCall_IRQn = -5, /*!< 11 Cortex-M3 SV Call Interrupt */ - DebugMonitor_IRQn = -4, /*!< 12 Cortex-M3 Debug Monitor Interrupt */ - PendSV_IRQn = -2, /*!< 14 Cortex-M3 Pend SV Interrupt */ - SysTick_IRQn = -1, /*!< 15 Cortex-M3 System Tick Interrupt */ -/****** STM32 specific Interrupt Numbers **********************************************************************/ - WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */ - PVD_IRQn = 1, /*!< PVD through EXTI Line detection Interrupt */ - TAMP_STAMP_IRQn = 2, /*!< Tamper and TimeStamp interrupts through the EXTI line */ - RTC_WKUP_IRQn = 3, /*!< RTC Wakeup interrupt through the EXTI line */ - FLASH_IRQn = 4, /*!< FLASH global Interrupt */ - RCC_IRQn = 5, /*!< RCC global Interrupt */ - EXTI0_IRQn = 6, /*!< EXTI Line0 Interrupt */ - EXTI1_IRQn = 7, /*!< EXTI Line1 Interrupt */ - EXTI2_IRQn = 8, /*!< EXTI Line2 Interrupt */ - EXTI3_IRQn = 9, /*!< EXTI Line3 Interrupt */ - EXTI4_IRQn = 10, /*!< EXTI Line4 Interrupt */ - DMA1_Stream0_IRQn = 11, /*!< DMA1 Stream 0 global Interrupt */ - DMA1_Stream1_IRQn = 12, /*!< DMA1 Stream 1 global Interrupt */ - DMA1_Stream2_IRQn = 13, /*!< DMA1 Stream 2 global Interrupt */ - DMA1_Stream3_IRQn = 14, /*!< DMA1 Stream 3 global Interrupt */ - DMA1_Stream4_IRQn = 15, /*!< DMA1 Stream 4 global Interrupt */ - DMA1_Stream5_IRQn = 16, /*!< DMA1 Stream 5 global Interrupt */ - DMA1_Stream6_IRQn = 17, /*!< DMA1 Stream 6 global Interrupt */ - ADC_IRQn = 18, /*!< ADC1, ADC2 and ADC3 global Interrupts */ - CAN1_TX_IRQn = 19, /*!< CAN1 TX Interrupt */ - CAN1_RX0_IRQn = 20, /*!< CAN1 RX0 Interrupt */ - CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ - CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ - EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ - TIM1_BRK_TIM9_IRQn = 24, /*!< TIM1 Break interrupt and TIM9 global interrupt */ - TIM1_UP_TIM10_IRQn = 25, /*!< TIM1 Update Interrupt and TIM10 global interrupt */ - TIM1_TRG_COM_TIM11_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt and TIM11 global interrupt */ - TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ - TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ - TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ - TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ - I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ - I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ - I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ - I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ - SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ - SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ - USART1_IRQn = 37, /*!< USART1 global Interrupt */ - USART2_IRQn = 38, /*!< USART2 global Interrupt */ - USART3_IRQn = 39, /*!< USART3 global Interrupt */ - EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ - RTC_Alarm_IRQn = 41, /*!< RTC Alarm (A and B) through EXTI Line Interrupt */ - OTG_FS_WKUP_IRQn = 42, /*!< USB OTG FS Wakeup through EXTI line interrupt */ - TIM8_BRK_TIM12_IRQn = 43, /*!< TIM8 Break Interrupt and TIM12 global interrupt */ - TIM8_UP_TIM13_IRQn = 44, /*!< TIM8 Update Interrupt and TIM13 global interrupt */ - TIM8_TRG_COM_TIM14_IRQn = 45, /*!< TIM8 Trigger and Commutation Interrupt and TIM14 global interrupt */ - TIM8_CC_IRQn = 46, /*!< TIM8 Capture Compare Interrupt */ - DMA1_Stream7_IRQn = 47, /*!< DMA1 Stream7 Interrupt */ - FSMC_IRQn = 48, /*!< FSMC global Interrupt */ - SDIO_IRQn = 49, /*!< SDIO global Interrupt */ - TIM5_IRQn = 50, /*!< TIM5 global Interrupt */ - SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ - UART4_IRQn = 52, /*!< UART4 global Interrupt */ - UART5_IRQn = 53, /*!< UART5 global Interrupt */ - TIM6_DAC_IRQn = 54, /*!< TIM6 global and DAC1&2 underrun error interrupts */ - TIM7_IRQn = 55, /*!< TIM7 global interrupt */ - DMA2_Stream0_IRQn = 56, /*!< DMA2 Stream 0 global Interrupt */ - DMA2_Stream1_IRQn = 57, /*!< DMA2 Stream 1 global Interrupt */ - DMA2_Stream2_IRQn = 58, /*!< DMA2 Stream 2 global Interrupt */ - DMA2_Stream3_IRQn = 59, /*!< DMA2 Stream 3 global Interrupt */ - DMA2_Stream4_IRQn = 60, /*!< DMA2 Stream 4 global Interrupt */ - ETH_IRQn = 61, /*!< Ethernet global Interrupt */ - ETH_WKUP_IRQn = 62, /*!< Ethernet Wakeup through EXTI line Interrupt */ - CAN2_TX_IRQn = 63, /*!< CAN2 TX Interrupt */ - CAN2_RX0_IRQn = 64, /*!< CAN2 RX0 Interrupt */ - CAN2_RX1_IRQn = 65, /*!< CAN2 RX1 Interrupt */ - CAN2_SCE_IRQn = 66, /*!< CAN2 SCE Interrupt */ - OTG_FS_IRQn = 67, /*!< USB OTG FS global Interrupt */ - DMA2_Stream5_IRQn = 68, /*!< DMA2 Stream 5 global interrupt */ - DMA2_Stream6_IRQn = 69, /*!< DMA2 Stream 6 global interrupt */ - DMA2_Stream7_IRQn = 70, /*!< DMA2 Stream 7 global interrupt */ - USART6_IRQn = 71, /*!< USART6 global interrupt */ - I2C3_EV_IRQn = 72, /*!< I2C3 event interrupt */ - I2C3_ER_IRQn = 73, /*!< I2C3 error interrupt */ - OTG_HS_EP1_OUT_IRQn = 74, /*!< USB OTG HS End Point 1 Out global interrupt */ - OTG_HS_EP1_IN_IRQn = 75, /*!< USB OTG HS End Point 1 In global interrupt */ - OTG_HS_WKUP_IRQn = 76, /*!< USB OTG HS Wakeup through EXTI interrupt */ - OTG_HS_IRQn = 77, /*!< USB OTG HS global interrupt */ - DCMI_IRQn = 78, /*!< DCMI global interrupt */ - CRYP_IRQn = 79, /*!< CRYP crypto global interrupt */ - HASH_RNG_IRQn = 80 /*!< Hash and Rng global interrupt */ -} IRQn_Type; - -/** - * @} - */ - -#include "core_cm3.h" -#include "system_stm32f2xx.h" -#include - -/** @addtogroup Peripheral_registers_structures - * @{ - */ - -/** - * @brief Analog to Digital Converter - */ - -typedef struct -{ - __IO uint32_t SR; /*!< ADC status register, Address offset: 0x00 */ - __IO uint32_t CR1; /*!< ADC control register 1, Address offset: 0x04 */ - __IO uint32_t CR2; /*!< ADC control register 2, Address offset: 0x08 */ - __IO uint32_t SMPR1; /*!< ADC sample time register 1, Address offset: 0x0C */ - __IO uint32_t SMPR2; /*!< ADC sample time register 2, Address offset: 0x10 */ - __IO uint32_t JOFR1; /*!< ADC injected channel data offset register 1, Address offset: 0x14 */ - __IO uint32_t JOFR2; /*!< ADC injected channel data offset register 2, Address offset: 0x18 */ - __IO uint32_t JOFR3; /*!< ADC injected channel data offset register 3, Address offset: 0x1C */ - __IO uint32_t JOFR4; /*!< ADC injected channel data offset register 4, Address offset: 0x20 */ - __IO uint32_t HTR; /*!< ADC watchdog higher threshold register, Address offset: 0x24 */ - __IO uint32_t LTR; /*!< ADC watchdog lower threshold register, Address offset: 0x28 */ - __IO uint32_t SQR1; /*!< ADC regular sequence register 1, Address offset: 0x2C */ - __IO uint32_t SQR2; /*!< ADC regular sequence register 2, Address offset: 0x30 */ - __IO uint32_t SQR3; /*!< ADC regular sequence register 3, Address offset: 0x34 */ - __IO uint32_t JSQR; /*!< ADC injected sequence register, Address offset: 0x38*/ - __IO uint32_t JDR1; /*!< ADC injected data register 1, Address offset: 0x3C */ - __IO uint32_t JDR2; /*!< ADC injected data register 2, Address offset: 0x40 */ - __IO uint32_t JDR3; /*!< ADC injected data register 3, Address offset: 0x44 */ - __IO uint32_t JDR4; /*!< ADC injected data register 4, Address offset: 0x48 */ - __IO uint32_t DR; /*!< ADC regular data register, Address offset: 0x4C */ -} ADC_TypeDef; - -typedef struct -{ - __IO uint32_t CSR; /*!< ADC Common status register, Address offset: ADC1 base address + 0x300 */ - __IO uint32_t CCR; /*!< ADC common control register, Address offset: ADC1 base address + 0x304 */ - __IO uint32_t CDR; /*!< ADC common regular data register for dual - AND triple modes, Address offset: ADC1 base address + 0x308 */ -} ADC_Common_TypeDef; - - -/** - * @brief Controller Area Network TxMailBox - */ - -typedef struct -{ - __IO uint32_t TIR; /*!< CAN TX mailbox identifier register */ - __IO uint32_t TDTR; /*!< CAN mailbox data length control and time stamp register */ - __IO uint32_t TDLR; /*!< CAN mailbox data low register */ - __IO uint32_t TDHR; /*!< CAN mailbox data high register */ -} CAN_TxMailBox_TypeDef; - -/** - * @brief Controller Area Network FIFOMailBox - */ - -typedef struct -{ - __IO uint32_t RIR; /*!< CAN receive FIFO mailbox identifier register */ - __IO uint32_t RDTR; /*!< CAN receive FIFO mailbox data length control and time stamp register */ - __IO uint32_t RDLR; /*!< CAN receive FIFO mailbox data low register */ - __IO uint32_t RDHR; /*!< CAN receive FIFO mailbox data high register */ -} CAN_FIFOMailBox_TypeDef; - -/** - * @brief Controller Area Network FilterRegister - */ - -typedef struct -{ - __IO uint32_t FR1; /*!< CAN Filter bank register 1 */ - __IO uint32_t FR2; /*!< CAN Filter bank register 1 */ -} CAN_FilterRegister_TypeDef; - -/** - * @brief Controller Area Network - */ - -typedef struct -{ - __IO uint32_t MCR; /*!< CAN master control register, Address offset: 0x00 */ - __IO uint32_t MSR; /*!< CAN master status register, Address offset: 0x04 */ - __IO uint32_t TSR; /*!< CAN transmit status register, Address offset: 0x08 */ - __IO uint32_t RF0R; /*!< CAN receive FIFO 0 register, Address offset: 0x0C */ - __IO uint32_t RF1R; /*!< CAN receive FIFO 1 register, Address offset: 0x10 */ - __IO uint32_t IER; /*!< CAN interrupt enable register, Address offset: 0x14 */ - __IO uint32_t ESR; /*!< CAN error status register, Address offset: 0x18 */ - __IO uint32_t BTR; /*!< CAN bit timing register, Address offset: 0x1C */ - uint32_t RESERVED0[88]; /*!< Reserved, 0x020 - 0x17F */ - CAN_TxMailBox_TypeDef sTxMailBox[3]; /*!< CAN Tx MailBox, Address offset: 0x180 - 0x1AC */ - CAN_FIFOMailBox_TypeDef sFIFOMailBox[2]; /*!< CAN FIFO MailBox, Address offset: 0x1B0 - 0x1CC */ - uint32_t RESERVED1[12]; /*!< Reserved, 0x1D0 - 0x1FF */ - __IO uint32_t FMR; /*!< CAN filter master register, Address offset: 0x200 */ - __IO uint32_t FM1R; /*!< CAN filter mode register, Address offset: 0x204 */ - uint32_t RESERVED2; /*!< Reserved, 0x208 */ - __IO uint32_t FS1R; /*!< CAN filter scale register, Address offset: 0x20C */ - uint32_t RESERVED3; /*!< Reserved, 0x210 */ - __IO uint32_t FFA1R; /*!< CAN filter FIFO assignment register, Address offset: 0x214 */ - uint32_t RESERVED4; /*!< Reserved, 0x218 */ - __IO uint32_t FA1R; /*!< CAN filter activation register, Address offset: 0x21C */ - uint32_t RESERVED5[8]; /*!< Reserved, 0x220-0x23F */ - CAN_FilterRegister_TypeDef sFilterRegister[28]; /*!< CAN Filter Register, Address offset: 0x240-0x31C */ -} CAN_TypeDef; - -/** - * @brief CRC calculation unit - */ - -typedef struct -{ - __IO uint32_t DR; /*!< CRC Data register, Address offset: 0x00 */ - __IO uint8_t IDR; /*!< CRC Independent data register, Address offset: 0x04 */ - uint8_t RESERVED0; /*!< Reserved, 0x05 */ - uint16_t RESERVED1; /*!< Reserved, 0x06 */ - __IO uint32_t CR; /*!< CRC Control register, Address offset: 0x08 */ -} CRC_TypeDef; - -/** - * @brief Digital to Analog Converter - */ - -typedef struct -{ - __IO uint32_t CR; /*!< DAC control register, Address offset: 0x00 */ - __IO uint32_t SWTRIGR; /*!< DAC software trigger register, Address offset: 0x04 */ - __IO uint32_t DHR12R1; /*!< DAC channel1 12-bit right-aligned data holding register, Address offset: 0x08 */ - __IO uint32_t DHR12L1; /*!< DAC channel1 12-bit left aligned data holding register, Address offset: 0x0C */ - __IO uint32_t DHR8R1; /*!< DAC channel1 8-bit right aligned data holding register, Address offset: 0x10 */ - __IO uint32_t DHR12R2; /*!< DAC channel2 12-bit right aligned data holding register, Address offset: 0x14 */ - __IO uint32_t DHR12L2; /*!< DAC channel2 12-bit left aligned data holding register, Address offset: 0x18 */ - __IO uint32_t DHR8R2; /*!< DAC channel2 8-bit right-aligned data holding register, Address offset: 0x1C */ - __IO uint32_t DHR12RD; /*!< Dual DAC 12-bit right-aligned data holding register, Address offset: 0x20 */ - __IO uint32_t DHR12LD; /*!< DUAL DAC 12-bit left aligned data holding register, Address offset: 0x24 */ - __IO uint32_t DHR8RD; /*!< DUAL DAC 8-bit right aligned data holding register, Address offset: 0x28 */ - __IO uint32_t DOR1; /*!< DAC channel1 data output register, Address offset: 0x2C */ - __IO uint32_t DOR2; /*!< DAC channel2 data output register, Address offset: 0x30 */ - __IO uint32_t SR; /*!< DAC status register, Address offset: 0x34 */ -} DAC_TypeDef; - -/** - * @brief Debug MCU - */ - -typedef struct -{ - __IO uint32_t IDCODE; /*!< MCU device ID code, Address offset: 0x00 */ - __IO uint32_t CR; /*!< Debug MCU configuration register, Address offset: 0x04 */ - __IO uint32_t APB1FZ; /*!< Debug MCU APB1 freeze register, Address offset: 0x08 */ - __IO uint32_t APB2FZ; /*!< Debug MCU APB2 freeze register, Address offset: 0x0C */ -}DBGMCU_TypeDef; - -/** - * @brief DCMI - */ - -typedef struct -{ - __IO uint32_t CR; /*!< DCMI control register 1, Address offset: 0x00 */ - __IO uint32_t SR; /*!< DCMI status register, Address offset: 0x04 */ - __IO uint32_t RISR; /*!< DCMI raw interrupt status register, Address offset: 0x08 */ - __IO uint32_t IER; /*!< DCMI interrupt enable register, Address offset: 0x0C */ - __IO uint32_t MISR; /*!< DCMI masked interrupt status register, Address offset: 0x10 */ - __IO uint32_t ICR; /*!< DCMI interrupt clear register, Address offset: 0x14 */ - __IO uint32_t ESCR; /*!< DCMI embedded synchronization code register, Address offset: 0x18 */ - __IO uint32_t ESUR; /*!< DCMI embedded synchronization unmask register, Address offset: 0x1C */ - __IO uint32_t CWSTRTR; /*!< DCMI crop window start, Address offset: 0x20 */ - __IO uint32_t CWSIZER; /*!< DCMI crop window size, Address offset: 0x24 */ - __IO uint32_t DR; /*!< DCMI data register, Address offset: 0x28 */ -} DCMI_TypeDef; - -/** - * @brief DMA Controller - */ - -typedef struct -{ - __IO uint32_t CR; /*!< DMA stream x configuration register */ - __IO uint32_t NDTR; /*!< DMA stream x number of data register */ - __IO uint32_t PAR; /*!< DMA stream x peripheral address register */ - __IO uint32_t M0AR; /*!< DMA stream x memory 0 address register */ - __IO uint32_t M1AR; /*!< DMA stream x memory 1 address register */ - __IO uint32_t FCR; /*!< DMA stream x FIFO control register */ -} DMA_Stream_TypeDef; - -typedef struct -{ - __IO uint32_t LISR; /*!< DMA low interrupt status register, Address offset: 0x00 */ - __IO uint32_t HISR; /*!< DMA high interrupt status register, Address offset: 0x04 */ - __IO uint32_t LIFCR; /*!< DMA low interrupt flag clear register, Address offset: 0x08 */ - __IO uint32_t HIFCR; /*!< DMA high interrupt flag clear register, Address offset: 0x0C */ -} DMA_TypeDef; - - -/** - * @brief Ethernet MAC - */ - -typedef struct -{ - __IO uint32_t MACCR; - __IO uint32_t MACFFR; - __IO uint32_t MACHTHR; - __IO uint32_t MACHTLR; - __IO uint32_t MACMIIAR; - __IO uint32_t MACMIIDR; - __IO uint32_t MACFCR; - __IO uint32_t MACVLANTR; /* 8 */ - uint32_t RESERVED0[2]; - __IO uint32_t MACRWUFFR; /* 11 */ - __IO uint32_t MACPMTCSR; - uint32_t RESERVED1[2]; - __IO uint32_t MACSR; /* 15 */ - __IO uint32_t MACIMR; - __IO uint32_t MACA0HR; - __IO uint32_t MACA0LR; - __IO uint32_t MACA1HR; - __IO uint32_t MACA1LR; - __IO uint32_t MACA2HR; - __IO uint32_t MACA2LR; - __IO uint32_t MACA3HR; - __IO uint32_t MACA3LR; /* 24 */ - uint32_t RESERVED2[40]; - __IO uint32_t MMCCR; /* 65 */ - __IO uint32_t MMCRIR; - __IO uint32_t MMCTIR; - __IO uint32_t MMCRIMR; - __IO uint32_t MMCTIMR; /* 69 */ - uint32_t RESERVED3[14]; - __IO uint32_t MMCTGFSCCR; /* 84 */ - __IO uint32_t MMCTGFMSCCR; - uint32_t RESERVED4[5]; - __IO uint32_t MMCTGFCR; - uint32_t RESERVED5[10]; - __IO uint32_t MMCRFCECR; - __IO uint32_t MMCRFAECR; - uint32_t RESERVED6[10]; - __IO uint32_t MMCRGUFCR; - uint32_t RESERVED7[334]; - __IO uint32_t PTPTSCR; - __IO uint32_t PTPSSIR; - __IO uint32_t PTPTSHR; - __IO uint32_t PTPTSLR; - __IO uint32_t PTPTSHUR; - __IO uint32_t PTPTSLUR; - __IO uint32_t PTPTSAR; - __IO uint32_t PTPTTHR; - __IO uint32_t PTPTTLR; - __IO uint32_t RESERVED8; - __IO uint32_t PTPTSSR; - uint32_t RESERVED9[565]; - __IO uint32_t DMABMR; - __IO uint32_t DMATPDR; - __IO uint32_t DMARPDR; - __IO uint32_t DMARDLAR; - __IO uint32_t DMATDLAR; - __IO uint32_t DMASR; - __IO uint32_t DMAOMR; - __IO uint32_t DMAIER; - __IO uint32_t DMAMFBOCR; - __IO uint32_t DMARSWTR; - uint32_t RESERVED10[8]; - __IO uint32_t DMACHTDR; - __IO uint32_t DMACHRDR; - __IO uint32_t DMACHTBAR; - __IO uint32_t DMACHRBAR; -} ETH_TypeDef; - -/** - * @brief External Interrupt/Event Controller - */ - -typedef struct -{ - __IO uint32_t IMR; /*!< EXTI Interrupt mask register, Address offset: 0x00 */ - __IO uint32_t EMR; /*!< EXTI Event mask register, Address offset: 0x04 */ - __IO uint32_t RTSR; /*!< EXTI Rising trigger selection register, Address offset: 0x08 */ - __IO uint32_t FTSR; /*!< EXTI Falling trigger selection register, Address offset: 0x0C */ - __IO uint32_t SWIER; /*!< EXTI Software interrupt event register, Address offset: 0x10 */ - __IO uint32_t PR; /*!< EXTI Pending register, Address offset: 0x14 */ -} EXTI_TypeDef; - -/** - * @brief FLASH Registers - */ - -typedef struct -{ - __IO uint32_t ACR; /*!< FLASH access control register, Address offset: 0x00 */ - __IO uint32_t KEYR; /*!< FLASH key register, Address offset: 0x04 */ - __IO uint32_t OPTKEYR; /*!< FLASH option key register, Address offset: 0x08 */ - __IO uint32_t SR; /*!< FLASH status register, Address offset: 0x0C */ - __IO uint32_t CR; /*!< FLASH control register, Address offset: 0x10 */ - __IO uint32_t OPTCR; /*!< FLASH option control register, Address offset: 0x14 */ -} FLASH_TypeDef; - - -/** - * @brief Flexible Static Memory Controller - */ - -typedef struct -{ - __IO uint32_t BTCR[8]; /*!< NOR/PSRAM chip-select control register(BCR) and chip-select timing register(BTR), Address offset: 0x00-1C */ -} FSMC_Bank1_TypeDef; - -/** - * @brief Flexible Static Memory Controller Bank1E - */ - -typedef struct -{ - __IO uint32_t BWTR[7]; /*!< NOR/PSRAM write timing registers, Address offset: 0x104-0x11C */ -} FSMC_Bank1E_TypeDef; - -/** - * @brief Flexible Static Memory Controller Bank2 - */ - -typedef struct -{ - __IO uint32_t PCR2; /*!< NAND Flash control register 2, Address offset: 0x60 */ - __IO uint32_t SR2; /*!< NAND Flash FIFO status and interrupt register 2, Address offset: 0x64 */ - __IO uint32_t PMEM2; /*!< NAND Flash Common memory space timing register 2, Address offset: 0x68 */ - __IO uint32_t PATT2; /*!< NAND Flash Attribute memory space timing register 2, Address offset: 0x6C */ - uint32_t RESERVED0; /*!< Reserved, 0x70 */ - __IO uint32_t ECCR2; /*!< NAND Flash ECC result registers 2, Address offset: 0x74 */ - uint32_t RESERVED1; /*!< Reserved, 0x78 */ - uint32_t RESERVED2; /*!< Reserved, 0x7C */ - __IO uint32_t PCR3; /*!< NAND Flash control register 3, Address offset: 0x80 */ - __IO uint32_t SR3; /*!< NAND Flash FIFO status and interrupt register 3, Address offset: 0x84 */ - __IO uint32_t PMEM3; /*!< NAND Flash Common memory space timing register 3, Address offset: 0x88 */ - __IO uint32_t PATT3; /*!< NAND Flash Attribute memory space timing register 3, Address offset: 0x8C */ - uint32_t RESERVED3; /*!< Reserved, 0x90 */ - __IO uint32_t ECCR3; /*!< NAND Flash ECC result registers 3, Address offset: 0x94 */ -} FSMC_Bank2_3_TypeDef; - -/** - * @brief Flexible Static Memory Controller Bank4 - */ - -typedef struct -{ - __IO uint32_t PCR4; /*!< PC Card control register 4, Address offset: 0xA0 */ - __IO uint32_t SR4; /*!< PC Card FIFO status and interrupt register 4, Address offset: 0xA4 */ - __IO uint32_t PMEM4; /*!< PC Card Common memory space timing register 4, Address offset: 0xA8 */ - __IO uint32_t PATT4; /*!< PC Card Attribute memory space timing register 4, Address offset: 0xAC */ - __IO uint32_t PIO4; /*!< PC Card I/O space timing register 4, Address offset: 0xB0 */ -} FSMC_Bank4_TypeDef; - - -/** - * @brief General Purpose I/O - */ - -typedef struct -{ - __IO uint32_t MODER; /*!< GPIO port mode register, Address offset: 0x00 */ - __IO uint32_t OTYPER; /*!< GPIO port output type register, Address offset: 0x04 */ - __IO uint32_t OSPEEDR; /*!< GPIO port output speed register, Address offset: 0x08 */ - __IO uint32_t PUPDR; /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */ - __IO uint32_t IDR; /*!< GPIO port input data register, Address offset: 0x10 */ - __IO uint32_t ODR; /*!< GPIO port output data register, Address offset: 0x14 */ - __IO uint32_t BSRR; /*!< GPIO port bit set/reset register, Address offset: 0x18 */ - __IO uint32_t LCKR; /*!< GPIO port configuration lock register, Address offset: 0x1C */ - __IO uint32_t AFR[2]; /*!< GPIO alternate function registers, Address offset: 0x20-0x24 */ -} GPIO_TypeDef; - -/** - * @brief System configuration controller - */ - -typedef struct -{ - __IO uint32_t MEMRMP; /*!< SYSCFG memory remap register, Address offset: 0x00 */ - __IO uint32_t PMC; /*!< SYSCFG peripheral mode configuration register, Address offset: 0x04 */ - __IO uint32_t EXTICR[4]; /*!< SYSCFG external interrupt configuration registers, Address offset: 0x08-0x14 */ - uint32_t RESERVED[2]; /*!< Reserved, 0x18-0x1C */ - __IO uint32_t CMPCR; /*!< SYSCFG Compensation cell control register, Address offset: 0x20 */ -} SYSCFG_TypeDef; - -/** - * @brief Inter-integrated Circuit Interface - */ - -typedef struct -{ - __IO uint32_t CR1; /*!< I2C Control register 1, Address offset: 0x00 */ - __IO uint32_t CR2; /*!< I2C Control register 2, Address offset: 0x04 */ - __IO uint32_t OAR1; /*!< I2C Own address register 1, Address offset: 0x08 */ - __IO uint32_t OAR2; /*!< I2C Own address register 2, Address offset: 0x0C */ - __IO uint32_t DR; /*!< I2C Data register, Address offset: 0x10 */ - __IO uint32_t SR1; /*!< I2C Status register 1, Address offset: 0x14 */ - __IO uint32_t SR2; /*!< I2C Status register 2, Address offset: 0x18 */ - __IO uint32_t CCR; /*!< I2C Clock control register, Address offset: 0x1C */ - __IO uint32_t TRISE; /*!< I2C TRISE register, Address offset: 0x20 */ - __IO uint32_t FLTR; /*!< I2C FLTR register, Address offset: 0x24 */ -} I2C_TypeDef; - -/** - * @brief Independent WATCHDOG - */ - -typedef struct -{ - __IO uint32_t KR; /*!< IWDG Key register, Address offset: 0x00 */ - __IO uint32_t PR; /*!< IWDG Prescaler register, Address offset: 0x04 */ - __IO uint32_t RLR; /*!< IWDG Reload register, Address offset: 0x08 */ - __IO uint32_t SR; /*!< IWDG Status register, Address offset: 0x0C */ -} IWDG_TypeDef; - -/** - * @brief Power Control - */ - -typedef struct -{ - __IO uint32_t CR; /*!< PWR power control register, Address offset: 0x00 */ - __IO uint32_t CSR; /*!< PWR power control/status register, Address offset: 0x04 */ -} PWR_TypeDef; - -/** - * @brief Reset and Clock Control - */ - -typedef struct -{ - __IO uint32_t CR; /*!< RCC clock control register, Address offset: 0x00 */ - __IO uint32_t PLLCFGR; /*!< RCC PLL configuration register, Address offset: 0x04 */ - __IO uint32_t CFGR; /*!< RCC clock configuration register, Address offset: 0x08 */ - __IO uint32_t CIR; /*!< RCC clock interrupt register, Address offset: 0x0C */ - __IO uint32_t AHB1RSTR; /*!< RCC AHB1 peripheral reset register, Address offset: 0x10 */ - __IO uint32_t AHB2RSTR; /*!< RCC AHB2 peripheral reset register, Address offset: 0x14 */ - __IO uint32_t AHB3RSTR; /*!< RCC AHB3 peripheral reset register, Address offset: 0x18 */ - uint32_t RESERVED0; /*!< Reserved, 0x1C */ - __IO uint32_t APB1RSTR; /*!< RCC APB1 peripheral reset register, Address offset: 0x20 */ - __IO uint32_t APB2RSTR; /*!< RCC APB2 peripheral reset register, Address offset: 0x24 */ - uint32_t RESERVED1[2]; /*!< Reserved, 0x28-0x2C */ - __IO uint32_t AHB1ENR; /*!< RCC AHB1 peripheral clock register, Address offset: 0x30 */ - __IO uint32_t AHB2ENR; /*!< RCC AHB2 peripheral clock register, Address offset: 0x34 */ - __IO uint32_t AHB3ENR; /*!< RCC AHB3 peripheral clock register, Address offset: 0x38 */ - uint32_t RESERVED2; /*!< Reserved, 0x3C */ - __IO uint32_t APB1ENR; /*!< RCC APB1 peripheral clock enable register, Address offset: 0x40 */ - __IO uint32_t APB2ENR; /*!< RCC APB2 peripheral clock enable register, Address offset: 0x44 */ - uint32_t RESERVED3[2]; /*!< Reserved, 0x48-0x4C */ - __IO uint32_t AHB1LPENR; /*!< RCC AHB1 peripheral clock enable in low power mode register, Address offset: 0x50 */ - __IO uint32_t AHB2LPENR; /*!< RCC AHB2 peripheral clock enable in low power mode register, Address offset: 0x54 */ - __IO uint32_t AHB3LPENR; /*!< RCC AHB3 peripheral clock enable in low power mode register, Address offset: 0x58 */ - uint32_t RESERVED4; /*!< Reserved, 0x5C */ - __IO uint32_t APB1LPENR; /*!< RCC APB1 peripheral clock enable in low power mode register, Address offset: 0x60 */ - __IO uint32_t APB2LPENR; /*!< RCC APB2 peripheral clock enable in low power mode register, Address offset: 0x64 */ - uint32_t RESERVED5[2]; /*!< Reserved, 0x68-0x6C */ - __IO uint32_t BDCR; /*!< RCC Backup domain control register, Address offset: 0x70 */ - __IO uint32_t CSR; /*!< RCC clock control & status register, Address offset: 0x74 */ - uint32_t RESERVED6[2]; /*!< Reserved, 0x78-0x7C */ - __IO uint32_t SSCGR; /*!< RCC spread spectrum clock generation register, Address offset: 0x80 */ - __IO uint32_t PLLI2SCFGR; /*!< RCC PLLI2S configuration register, Address offset: 0x84 */ - -} RCC_TypeDef; - -/** - * @brief Real-Time Clock - */ - -typedef struct -{ - __IO uint32_t TR; /*!< RTC time register, Address offset: 0x00 */ - __IO uint32_t DR; /*!< RTC date register, Address offset: 0x04 */ - __IO uint32_t CR; /*!< RTC control register, Address offset: 0x08 */ - __IO uint32_t ISR; /*!< RTC initialization and status register, Address offset: 0x0C */ - __IO uint32_t PRER; /*!< RTC prescaler register, Address offset: 0x10 */ - __IO uint32_t WUTR; /*!< RTC wakeup timer register, Address offset: 0x14 */ - __IO uint32_t CALIBR; /*!< RTC calibration register, Address offset: 0x18 */ - __IO uint32_t ALRMAR; /*!< RTC alarm A register, Address offset: 0x1C */ - __IO uint32_t ALRMBR; /*!< RTC alarm B register, Address offset: 0x20 */ - __IO uint32_t WPR; /*!< RTC write protection register, Address offset: 0x24 */ - uint32_t RESERVED1; /*!< Reserved, 0x28 */ - uint32_t RESERVED2; /*!< Reserved, 0x2C */ - __IO uint32_t TSTR; /*!< RTC time stamp time register, Address offset: 0x30 */ - __IO uint32_t TSDR; /*!< RTC time stamp date register, Address offset: 0x34 */ - uint32_t RESERVED3; /*!< Reserved, 0x38 */ - uint32_t RESERVED4; /*!< Reserved, 0x3C */ - __IO uint32_t TAFCR; /*!< RTC tamper and alternate function configuration register, Address offset: 0x40 */ - uint32_t RESERVED5; /*!< Reserved, 0x44 */ - uint32_t RESERVED6; /*!< Reserved, 0x48 */ - uint32_t RESERVED7; /*!< Reserved, 0x4C */ - __IO uint32_t BKP0R; /*!< RTC backup register 1, Address offset: 0x50 */ - __IO uint32_t BKP1R; /*!< RTC backup register 1, Address offset: 0x54 */ - __IO uint32_t BKP2R; /*!< RTC backup register 2, Address offset: 0x58 */ - __IO uint32_t BKP3R; /*!< RTC backup register 3, Address offset: 0x5C */ - __IO uint32_t BKP4R; /*!< RTC backup register 4, Address offset: 0x60 */ - __IO uint32_t BKP5R; /*!< RTC backup register 5, Address offset: 0x64 */ - __IO uint32_t BKP6R; /*!< RTC backup register 6, Address offset: 0x68 */ - __IO uint32_t BKP7R; /*!< RTC backup register 7, Address offset: 0x6C */ - __IO uint32_t BKP8R; /*!< RTC backup register 8, Address offset: 0x70 */ - __IO uint32_t BKP9R; /*!< RTC backup register 9, Address offset: 0x74 */ - __IO uint32_t BKP10R; /*!< RTC backup register 10, Address offset: 0x78 */ - __IO uint32_t BKP11R; /*!< RTC backup register 11, Address offset: 0x7C */ - __IO uint32_t BKP12R; /*!< RTC backup register 12, Address offset: 0x80 */ - __IO uint32_t BKP13R; /*!< RTC backup register 13, Address offset: 0x84 */ - __IO uint32_t BKP14R; /*!< RTC backup register 14, Address offset: 0x88 */ - __IO uint32_t BKP15R; /*!< RTC backup register 15, Address offset: 0x8C */ - __IO uint32_t BKP16R; /*!< RTC backup register 16, Address offset: 0x90 */ - __IO uint32_t BKP17R; /*!< RTC backup register 17, Address offset: 0x94 */ - __IO uint32_t BKP18R; /*!< RTC backup register 18, Address offset: 0x98 */ - __IO uint32_t BKP19R; /*!< RTC backup register 19, Address offset: 0x9C */ -} RTC_TypeDef; - - -/** - * @brief SD host Interface - */ - -typedef struct -{ - __IO uint32_t POWER; /*!< SDIO power control register, Address offset: 0x00 */ - __IO uint32_t CLKCR; /*!< SDI clock control register, Address offset: 0x04 */ - __IO uint32_t ARG; /*!< SDIO argument register, Address offset: 0x08 */ - __IO uint32_t CMD; /*!< SDIO command register, Address offset: 0x0C */ - __IO const uint32_t RESPCMD; /*!< SDIO command response register, Address offset: 0x10 */ - __IO const uint32_t RESP1; /*!< SDIO response 1 register, Address offset: 0x14 */ - __IO const uint32_t RESP2; /*!< SDIO response 2 register, Address offset: 0x18 */ - __IO const uint32_t RESP3; /*!< SDIO response 3 register, Address offset: 0x1C */ - __IO const uint32_t RESP4; /*!< SDIO response 4 register, Address offset: 0x20 */ - __IO uint32_t DTIMER; /*!< SDIO data timer register, Address offset: 0x24 */ - __IO uint32_t DLEN; /*!< SDIO data length register, Address offset: 0x28 */ - __IO uint32_t DCTRL; /*!< SDIO data control register, Address offset: 0x2C */ - __IO const uint32_t DCOUNT; /*!< SDIO data counter register, Address offset: 0x30 */ - __IO const uint32_t STA; /*!< SDIO status register, Address offset: 0x34 */ - __IO uint32_t ICR; /*!< SDIO interrupt clear register, Address offset: 0x38 */ - __IO uint32_t MASK; /*!< SDIO mask register, Address offset: 0x3C */ - uint32_t RESERVED0[2]; /*!< Reserved, 0x40-0x44 */ - __IO const uint32_t FIFOCNT; /*!< SDIO FIFO counter register, Address offset: 0x48 */ - uint32_t RESERVED1[13]; /*!< Reserved, 0x4C-0x7C */ - __IO uint32_t FIFO; /*!< SDIO data FIFO register, Address offset: 0x80 */ -} SDIO_TypeDef; - -/** - * @brief Serial Peripheral Interface - */ - -typedef struct -{ - __IO uint32_t CR1; /*!< SPI control register 1 (not used in I2S mode), Address offset: 0x00 */ - __IO uint32_t CR2; /*!< SPI control register 2, Address offset: 0x04 */ - __IO uint32_t SR; /*!< SPI status register, Address offset: 0x08 */ - __IO uint32_t DR; /*!< SPI data register, Address offset: 0x0C */ - __IO uint32_t CRCPR; /*!< SPI CRC polynomial register (not used in I2S mode), Address offset: 0x10 */ - __IO uint32_t RXCRCR; /*!< SPI RX CRC register (not used in I2S mode), Address offset: 0x14 */ - __IO uint32_t TXCRCR; /*!< SPI TX CRC register (not used in I2S mode), Address offset: 0x18 */ - __IO uint32_t I2SCFGR; /*!< SPI_I2S configuration register, Address offset: 0x1C */ - __IO uint32_t I2SPR; /*!< SPI_I2S prescaler register, Address offset: 0x20 */ -} SPI_TypeDef; - -/** - * @brief TIM - */ - -typedef struct -{ - __IO uint32_t CR1; /*!< TIM control register 1, Address offset: 0x00 */ - __IO uint32_t CR2; /*!< TIM control register 2, Address offset: 0x04 */ - __IO uint32_t SMCR; /*!< TIM slave mode control register, Address offset: 0x08 */ - __IO uint32_t DIER; /*!< TIM DMA/interrupt enable register, Address offset: 0x0C */ - __IO uint32_t SR; /*!< TIM status register, Address offset: 0x10 */ - __IO uint32_t EGR; /*!< TIM event generation register, Address offset: 0x14 */ - __IO uint32_t CCMR1; /*!< TIM capture/compare mode register 1, Address offset: 0x18 */ - __IO uint32_t CCMR2; /*!< TIM capture/compare mode register 2, Address offset: 0x1C */ - __IO uint32_t CCER; /*!< TIM capture/compare enable register, Address offset: 0x20 */ - __IO uint32_t CNT; /*!< TIM counter register, Address offset: 0x24 */ - __IO uint32_t PSC; /*!< TIM prescaler, Address offset: 0x28 */ - __IO uint32_t ARR; /*!< TIM auto-reload register, Address offset: 0x2C */ - __IO uint32_t RCR; /*!< TIM repetition counter register, Address offset: 0x30 */ - __IO uint32_t CCR1; /*!< TIM capture/compare register 1, Address offset: 0x34 */ - __IO uint32_t CCR2; /*!< TIM capture/compare register 2, Address offset: 0x38 */ - __IO uint32_t CCR3; /*!< TIM capture/compare register 3, Address offset: 0x3C */ - __IO uint32_t CCR4; /*!< TIM capture/compare register 4, Address offset: 0x40 */ - __IO uint32_t BDTR; /*!< TIM break and dead-time register, Address offset: 0x44 */ - __IO uint32_t DCR; /*!< TIM DMA control register, Address offset: 0x48 */ - __IO uint32_t DMAR; /*!< TIM DMA address for full transfer, Address offset: 0x4C */ - __IO uint32_t OR; /*!< TIM option register, Address offset: 0x50 */ -} TIM_TypeDef; - -/** - * @brief Universal Synchronous Asynchronous Receiver Transmitter - */ - -typedef struct -{ - __IO uint32_t SR; /*!< USART Status register, Address offset: 0x00 */ - __IO uint32_t DR; /*!< USART Data register, Address offset: 0x04 */ - __IO uint32_t BRR; /*!< USART Baud rate register, Address offset: 0x08 */ - __IO uint32_t CR1; /*!< USART Control register 1, Address offset: 0x0C */ - __IO uint32_t CR2; /*!< USART Control register 2, Address offset: 0x10 */ - __IO uint32_t CR3; /*!< USART Control register 3, Address offset: 0x14 */ - __IO uint32_t GTPR; /*!< USART Guard time and prescaler register, Address offset: 0x18 */ -} USART_TypeDef; - -/** - * @brief Window WATCHDOG - */ - -typedef struct -{ - __IO uint32_t CR; /*!< WWDG Control register, Address offset: 0x00 */ - __IO uint32_t CFR; /*!< WWDG Configuration register, Address offset: 0x04 */ - __IO uint32_t SR; /*!< WWDG Status register, Address offset: 0x08 */ -} WWDG_TypeDef; - -/** - * @brief Crypto Processor - */ - -typedef struct -{ - __IO uint32_t CR; /*!< CRYP control register, Address offset: 0x00 */ - __IO uint32_t SR; /*!< CRYP status register, Address offset: 0x04 */ - __IO uint32_t DR; /*!< CRYP data input register, Address offset: 0x08 */ - __IO uint32_t DOUT; /*!< CRYP data output register, Address offset: 0x0C */ - __IO uint32_t DMACR; /*!< CRYP DMA control register, Address offset: 0x10 */ - __IO uint32_t IMSCR; /*!< CRYP interrupt mask set/clear register, Address offset: 0x14 */ - __IO uint32_t RISR; /*!< CRYP raw interrupt status register, Address offset: 0x18 */ - __IO uint32_t MISR; /*!< CRYP masked interrupt status register, Address offset: 0x1C */ - __IO uint32_t K0LR; /*!< CRYP key left register 0, Address offset: 0x20 */ - __IO uint32_t K0RR; /*!< CRYP key right register 0, Address offset: 0x24 */ - __IO uint32_t K1LR; /*!< CRYP key left register 1, Address offset: 0x28 */ - __IO uint32_t K1RR; /*!< CRYP key right register 1, Address offset: 0x2C */ - __IO uint32_t K2LR; /*!< CRYP key left register 2, Address offset: 0x30 */ - __IO uint32_t K2RR; /*!< CRYP key right register 2, Address offset: 0x34 */ - __IO uint32_t K3LR; /*!< CRYP key left register 3, Address offset: 0x38 */ - __IO uint32_t K3RR; /*!< CRYP key right register 3, Address offset: 0x3C */ - __IO uint32_t IV0LR; /*!< CRYP initialization vector left-word register 0, Address offset: 0x40 */ - __IO uint32_t IV0RR; /*!< CRYP initialization vector right-word register 0, Address offset: 0x44 */ - __IO uint32_t IV1LR; /*!< CRYP initialization vector left-word register 1, Address offset: 0x48 */ - __IO uint32_t IV1RR; /*!< CRYP initialization vector right-word register 1, Address offset: 0x4C */ -} CRYP_TypeDef; - -/** - * @brief HASH - */ - -typedef struct -{ - __IO uint32_t CR; /*!< HASH control register, Address offset: 0x00 */ - __IO uint32_t DIN; /*!< HASH data input register, Address offset: 0x04 */ - __IO uint32_t STR; /*!< HASH start register, Address offset: 0x08 */ - __IO uint32_t HR[5]; /*!< HASH digest registers, Address offset: 0x0C-0x1C */ - __IO uint32_t IMR; /*!< HASH interrupt enable register, Address offset: 0x20 */ - __IO uint32_t SR; /*!< HASH status register, Address offset: 0x24 */ - uint32_t RESERVED[52]; /*!< Reserved, 0x28-0xF4 */ - __IO uint32_t CSR[51]; /*!< HASH context swap registers, Address offset: 0x0F8-0x1C0 */ -} HASH_TypeDef; - -/** - * @brief RNG - */ - -typedef struct -{ - __IO uint32_t CR; /*!< RNG control register, Address offset: 0x00 */ - __IO uint32_t SR; /*!< RNG status register, Address offset: 0x04 */ - __IO uint32_t DR; /*!< RNG data register, Address offset: 0x08 */ -} RNG_TypeDef; - - - -/** - * @brief __USB_OTG_Core_register - */ -typedef struct -{ - __IO uint32_t GOTGCTL; /*!< USB_OTG Control and Status Register 000h*/ - __IO uint32_t GOTGINT; /*!< USB_OTG Interrupt Register 004h*/ - __IO uint32_t GAHBCFG; /*!< Core AHB Configuration Register 008h*/ - __IO uint32_t GUSBCFG; /*!< Core USB Configuration Register 00Ch*/ - __IO uint32_t GRSTCTL; /*!< Core Reset Register 010h*/ - __IO uint32_t GINTSTS; /*!< Core Interrupt Register 014h*/ - __IO uint32_t GINTMSK; /*!< Core Interrupt Mask Register 018h*/ - __IO uint32_t GRXSTSR; /*!< Receive Sts Q Read Register 01Ch*/ - __IO uint32_t GRXSTSP; /*!< Receive Sts Q Read & POP Register 020h*/ - __IO uint32_t GRXFSIZ; /* Receive FIFO Size Register 024h*/ - __IO uint32_t DIEPTXF0_HNPTXFSIZ; /*!< EP0 / Non Periodic Tx FIFO Size Register 028h*/ - __IO uint32_t HNPTXSTS; /*!< Non Periodic Tx FIFO/Queue Sts reg 02Ch*/ - uint32_t Reserved30[2]; /* Reserved 030h*/ - __IO uint32_t GCCFG; /* General Purpose IO Register 038h*/ - __IO uint32_t CID; /* User ID Register 03Ch*/ - uint32_t Reserved40[48]; /* Reserved 040h-0FFh*/ - __IO uint32_t HPTXFSIZ; /* Host Periodic Tx FIFO Size Reg 100h*/ - __IO uint32_t DIEPTXF[0x0F];/* dev Periodic Transmit FIFO */ -} -USB_OTG_GlobalTypeDef; - - - -/** - * @brief __device_Registers - */ -typedef struct -{ - __IO uint32_t DCFG; /* dev Configuration Register 800h*/ - __IO uint32_t DCTL; /* dev Control Register 804h*/ - __IO uint32_t DSTS; /* dev Status Register (RO) 808h*/ - uint32_t Reserved0C; /* Reserved 80Ch*/ - __IO uint32_t DIEPMSK; /* dev IN Endpoint Mask 810h*/ - __IO uint32_t DOEPMSK; /* dev OUT Endpoint Mask 814h*/ - __IO uint32_t DAINT; /* dev All Endpoints Itr Reg 818h*/ - __IO uint32_t DAINTMSK; /* dev All Endpoints Itr Mask 81Ch*/ - uint32_t Reserved20; /* Reserved 820h*/ - uint32_t Reserved9; /* Reserved 824h*/ - __IO uint32_t DVBUSDIS; /* dev VBUS discharge Register 828h*/ - __IO uint32_t DVBUSPULSE; /* dev VBUS Pulse Register 82Ch*/ - __IO uint32_t DTHRCTL; /* dev thr 830h*/ - __IO uint32_t DIEPEMPMSK; /* dev empty msk 834h*/ - __IO uint32_t DEACHINT; /* dedicated EP interrupt 838h*/ - __IO uint32_t DEACHMSK; /* dedicated EP msk 83Ch*/ - uint32_t Reserved40; /* dedicated EP mask 840h*/ - __IO uint32_t DINEP1MSK; /* dedicated EP mask 844h*/ - uint32_t Reserved44[15]; /* Reserved 844-87Ch*/ - __IO uint32_t DOUTEP1MSK; /* dedicated EP msk 884h*/ -} -USB_OTG_DeviceTypeDef; - - -/** - * @brief __IN_Endpoint-Specific_Register - */ -typedef struct -{ - __IO uint32_t DIEPCTL; /* dev IN Endpoint Control Reg 900h + (ep_num * 20h) + 00h*/ - uint32_t Reserved04; /* Reserved 900h + (ep_num * 20h) + 04h*/ - __IO uint32_t DIEPINT; /* dev IN Endpoint Itr Reg 900h + (ep_num * 20h) + 08h*/ - uint32_t Reserved0C; /* Reserved 900h + (ep_num * 20h) + 0Ch*/ - __IO uint32_t DIEPTSIZ; /* IN Endpoint Txfer Size 900h + (ep_num * 20h) + 10h*/ - __IO uint32_t DIEPDMA; /* IN Endpoint DMA Address Reg 900h + (ep_num * 20h) + 14h*/ - __IO uint32_t DTXFSTS;/*IN Endpoint Tx FIFO Status Reg 900h + (ep_num * 20h) + 18h*/ - uint32_t Reserved18; /* Reserved 900h+(ep_num*20h)+1Ch-900h+ (ep_num * 20h) + 1Ch*/ -} -USB_OTG_INEndpointTypeDef; - - -/** - * @brief __OUT_Endpoint-Specific_Registers - */ -typedef struct -{ - __IO uint32_t DOEPCTL; /* dev OUT Endpoint Control Reg B00h + (ep_num * 20h) + 00h*/ - uint32_t Reserved04; /* Reserved B00h + (ep_num * 20h) + 04h*/ - __IO uint32_t DOEPINT; /* dev OUT Endpoint Itr Reg B00h + (ep_num * 20h) + 08h*/ - uint32_t Reserved0C; /* Reserved B00h + (ep_num * 20h) + 0Ch*/ - __IO uint32_t DOEPTSIZ; /* dev OUT Endpoint Txfer Size B00h + (ep_num * 20h) + 10h*/ - __IO uint32_t DOEPDMA; /* dev OUT Endpoint DMA Address B00h + (ep_num * 20h) + 14h*/ - uint32_t Reserved18[2]; /* Reserved B00h + (ep_num * 20h) + 18h - B00h + (ep_num * 20h) + 1Ch*/ -} -USB_OTG_OUTEndpointTypeDef; - - -/** - * @brief __Host_Mode_Register_Structures - */ -typedef struct -{ - __IO uint32_t HCFG; /* Host Configuration Register 400h*/ - __IO uint32_t HFIR; /* Host Frame Interval Register 404h*/ - __IO uint32_t HFNUM; /* Host Frame Nbr/Frame Remaining 408h*/ - uint32_t Reserved40C; /* Reserved 40Ch*/ - __IO uint32_t HPTXSTS; /* Host Periodic Tx FIFO/ Queue Status 410h*/ - __IO uint32_t HAINT; /* Host All Channels Interrupt Register 414h*/ - __IO uint32_t HAINTMSK; /* Host All Channels Interrupt Mask 418h*/ -} -USB_OTG_HostTypeDef; - - -/** - * @brief __Host_Channel_Specific_Registers - */ -typedef struct -{ - __IO uint32_t HCCHAR; - __IO uint32_t HCSPLT; - __IO uint32_t HCINT; - __IO uint32_t HCINTMSK; - __IO uint32_t HCTSIZ; - __IO uint32_t HCDMA; - uint32_t Reserved[2]; -} -USB_OTG_HostChannelTypeDef; - - -/** - * @brief Peripheral_memory_map - */ -#define FLASH_BASE ((uint32_t)0x08000000) /*!< FLASH(up to 1 MB) base address in the alias region */ -#define SRAM1_BASE ((uint32_t)0x20000000) /*!< SRAM1(112 KB) base address in the alias region */ -#define SRAM2_BASE ((uint32_t)0x2001C000) /*!< SRAM2(16 KB) base address in the alias region */ -#define PERIPH_BASE ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */ -#define BKPSRAM_BASE ((uint32_t)0x40024000) /*!< Backup SRAM(4 KB) base address in the alias region */ -#define FSMC_R_BASE ((uint32_t)0xA0000000) /*!< FSMC registers base address */ -#define SRAM1_BB_BASE ((uint32_t)0x22000000) /*!< SRAM1(112 KB) base address in the bit-band region */ -#define SRAM2_BB_BASE ((uint32_t)0x22380000) /*!< SRAM2(16 KB) base address in the bit-band region */ -#define PERIPH_BB_BASE ((uint32_t)0x42000000) /*!< Peripheral base address in the bit-band region */ -#define BKPSRAM_BB_BASE ((uint32_t)0x42480000) /*!< Backup SRAM(4 KB) base address in the bit-band region */ -#define FLASH_END ((uint32_t)0x080FFFFF) /*!< FLASH end address */ - -/* Legacy defines */ -#define SRAM_BASE SRAM1_BASE -#define SRAM_BB_BASE SRAM1_BB_BASE - - -/*!< Peripheral memory map */ -#define APB1PERIPH_BASE PERIPH_BASE -#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000) -#define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000) -#define AHB2PERIPH_BASE (PERIPH_BASE + 0x10000000) - -/*!< APB1 peripherals */ -#define TIM2_BASE (APB1PERIPH_BASE + 0x0000) -#define TIM3_BASE (APB1PERIPH_BASE + 0x0400) -#define TIM4_BASE (APB1PERIPH_BASE + 0x0800) -#define TIM5_BASE (APB1PERIPH_BASE + 0x0C00) -#define TIM6_BASE (APB1PERIPH_BASE + 0x1000) -#define TIM7_BASE (APB1PERIPH_BASE + 0x1400) -#define TIM12_BASE (APB1PERIPH_BASE + 0x1800) -#define TIM13_BASE (APB1PERIPH_BASE + 0x1C00) -#define TIM14_BASE (APB1PERIPH_BASE + 0x2000) -#define RTC_BASE (APB1PERIPH_BASE + 0x2800) -#define WWDG_BASE (APB1PERIPH_BASE + 0x2C00) -#define IWDG_BASE (APB1PERIPH_BASE + 0x3000) -#define SPI2_BASE (APB1PERIPH_BASE + 0x3800) -#define SPI3_BASE (APB1PERIPH_BASE + 0x3C00) -#define USART2_BASE (APB1PERIPH_BASE + 0x4400) -#define USART3_BASE (APB1PERIPH_BASE + 0x4800) -#define UART4_BASE (APB1PERIPH_BASE + 0x4C00) -#define UART5_BASE (APB1PERIPH_BASE + 0x5000) -#define I2C1_BASE (APB1PERIPH_BASE + 0x5400) -#define I2C2_BASE (APB1PERIPH_BASE + 0x5800) -#define I2C3_BASE (APB1PERIPH_BASE + 0x5C00) -#define CAN1_BASE (APB1PERIPH_BASE + 0x6400) -#define CAN2_BASE (APB1PERIPH_BASE + 0x6800) -#define PWR_BASE (APB1PERIPH_BASE + 0x7000) -#define DAC_BASE (APB1PERIPH_BASE + 0x7400) - -/*!< APB2 peripherals */ -#define TIM1_BASE (APB2PERIPH_BASE + 0x0000) -#define TIM8_BASE (APB2PERIPH_BASE + 0x0400) -#define USART1_BASE (APB2PERIPH_BASE + 0x1000) -#define USART6_BASE (APB2PERIPH_BASE + 0x1400) -#define ADC1_BASE (APB2PERIPH_BASE + 0x2000) -#define ADC2_BASE (APB2PERIPH_BASE + 0x2100) -#define ADC3_BASE (APB2PERIPH_BASE + 0x2200) -#define ADC_BASE (APB2PERIPH_BASE + 0x2300) -#define SDIO_BASE (APB2PERIPH_BASE + 0x2C00) -#define SPI1_BASE (APB2PERIPH_BASE + 0x3000) -#define SYSCFG_BASE (APB2PERIPH_BASE + 0x3800) -#define EXTI_BASE (APB2PERIPH_BASE + 0x3C00) -#define TIM9_BASE (APB2PERIPH_BASE + 0x4000) -#define TIM10_BASE (APB2PERIPH_BASE + 0x4400) -#define TIM11_BASE (APB2PERIPH_BASE + 0x4800) - -/*!< AHB1 peripherals */ -#define GPIOA_BASE (AHB1PERIPH_BASE + 0x0000) -#define GPIOB_BASE (AHB1PERIPH_BASE + 0x0400) -#define GPIOC_BASE (AHB1PERIPH_BASE + 0x0800) -#define GPIOD_BASE (AHB1PERIPH_BASE + 0x0C00) -#define GPIOE_BASE (AHB1PERIPH_BASE + 0x1000) -#define GPIOF_BASE (AHB1PERIPH_BASE + 0x1400) -#define GPIOG_BASE (AHB1PERIPH_BASE + 0x1800) -#define GPIOH_BASE (AHB1PERIPH_BASE + 0x1C00) -#define GPIOI_BASE (AHB1PERIPH_BASE + 0x2000) -#define CRC_BASE (AHB1PERIPH_BASE + 0x3000) -#define RCC_BASE (AHB1PERIPH_BASE + 0x3800) -#define FLASH_R_BASE (AHB1PERIPH_BASE + 0x3C00) -#define DMA1_BASE (AHB1PERIPH_BASE + 0x6000) -#define DMA1_Stream0_BASE (DMA1_BASE + 0x010) -#define DMA1_Stream1_BASE (DMA1_BASE + 0x028) -#define DMA1_Stream2_BASE (DMA1_BASE + 0x040) -#define DMA1_Stream3_BASE (DMA1_BASE + 0x058) -#define DMA1_Stream4_BASE (DMA1_BASE + 0x070) -#define DMA1_Stream5_BASE (DMA1_BASE + 0x088) -#define DMA1_Stream6_BASE (DMA1_BASE + 0x0A0) -#define DMA1_Stream7_BASE (DMA1_BASE + 0x0B8) -#define DMA2_BASE (AHB1PERIPH_BASE + 0x6400) -#define DMA2_Stream0_BASE (DMA2_BASE + 0x010) -#define DMA2_Stream1_BASE (DMA2_BASE + 0x028) -#define DMA2_Stream2_BASE (DMA2_BASE + 0x040) -#define DMA2_Stream3_BASE (DMA2_BASE + 0x058) -#define DMA2_Stream4_BASE (DMA2_BASE + 0x070) -#define DMA2_Stream5_BASE (DMA2_BASE + 0x088) -#define DMA2_Stream6_BASE (DMA2_BASE + 0x0A0) -#define DMA2_Stream7_BASE (DMA2_BASE + 0x0B8) -#define ETH_BASE (AHB1PERIPH_BASE + 0x8000) -#define ETH_MAC_BASE (ETH_BASE) -#define ETH_MMC_BASE (ETH_BASE + 0x0100) -#define ETH_PTP_BASE (ETH_BASE + 0x0700) -#define ETH_DMA_BASE (ETH_BASE + 0x1000) - -/*!< AHB2 peripherals */ -#define DCMI_BASE (AHB2PERIPH_BASE + 0x50000) -#define CRYP_BASE (AHB2PERIPH_BASE + 0x60000) -#define HASH_BASE (AHB2PERIPH_BASE + 0x60400) -#define HASH_DIGEST_BASE (AHB2PERIPH_BASE + 0x60710) -#define RNG_BASE (AHB2PERIPH_BASE + 0x60800) - -/*!< FSMC Bankx registers base address */ -#define FSMC_Bank1_R_BASE (FSMC_R_BASE + 0x0000) -#define FSMC_Bank1E_R_BASE (FSMC_R_BASE + 0x0104) -#define FSMC_Bank2_3_R_BASE (FSMC_R_BASE + 0x0060) -#define FSMC_Bank4_R_BASE (FSMC_R_BASE + 0x00A0) - -/* Debug MCU registers base address */ -#define DBGMCU_BASE ((uint32_t )0xE0042000) - -/*!< USB registers base address */ -#define USB_OTG_HS_PERIPH_BASE ((uint32_t )0x40040000) -#define USB_OTG_FS_PERIPH_BASE ((uint32_t )0x50000000) - -#define USB_OTG_GLOBAL_BASE ((uint32_t )0x000) -#define USB_OTG_DEVICE_BASE ((uint32_t )0x800) -#define USB_OTG_IN_ENDPOINT_BASE ((uint32_t )0x900) -#define USB_OTG_OUT_ENDPOINT_BASE ((uint32_t )0xB00) -#define USB_OTG_EP_REG_SIZE ((uint32_t )0x20) -#define USB_OTG_HOST_BASE ((uint32_t )0x400) -#define USB_OTG_HOST_PORT_BASE ((uint32_t )0x440) -#define USB_OTG_HOST_CHANNEL_BASE ((uint32_t )0x500) -#define USB_OTG_HOST_CHANNEL_SIZE ((uint32_t )0x20) -#define USB_OTG_PCGCCTL_BASE ((uint32_t )0xE00) -#define USB_OTG_FIFO_BASE ((uint32_t )0x1000) -#define USB_OTG_FIFO_SIZE ((uint32_t )0x1000) - -/** - * @} - */ - -/** @addtogroup Peripheral_declaration - * @{ - */ -#define TIM2 ((TIM_TypeDef *) TIM2_BASE) -#define TIM3 ((TIM_TypeDef *) TIM3_BASE) -#define TIM4 ((TIM_TypeDef *) TIM4_BASE) -#define TIM5 ((TIM_TypeDef *) TIM5_BASE) -#define TIM6 ((TIM_TypeDef *) TIM6_BASE) -#define TIM7 ((TIM_TypeDef *) TIM7_BASE) -#define TIM12 ((TIM_TypeDef *) TIM12_BASE) -#define TIM13 ((TIM_TypeDef *) TIM13_BASE) -#define TIM14 ((TIM_TypeDef *) TIM14_BASE) -#define RTC ((RTC_TypeDef *) RTC_BASE) -#define WWDG ((WWDG_TypeDef *) WWDG_BASE) -#define IWDG ((IWDG_TypeDef *) IWDG_BASE) -#define SPI2 ((SPI_TypeDef *) SPI2_BASE) -#define SPI3 ((SPI_TypeDef *) SPI3_BASE) -#define USART2 ((USART_TypeDef *) USART2_BASE) -#define USART3 ((USART_TypeDef *) USART3_BASE) -#define UART4 ((USART_TypeDef *) UART4_BASE) -#define UART5 ((USART_TypeDef *) UART5_BASE) -#define I2C1 ((I2C_TypeDef *) I2C1_BASE) -#define I2C2 ((I2C_TypeDef *) I2C2_BASE) -#define I2C3 ((I2C_TypeDef *) I2C3_BASE) -#define CAN1 ((CAN_TypeDef *) CAN1_BASE) -#define CAN2 ((CAN_TypeDef *) CAN2_BASE) -#define PWR ((PWR_TypeDef *) PWR_BASE) -#define DAC ((DAC_TypeDef *) DAC_BASE) -#define TIM1 ((TIM_TypeDef *) TIM1_BASE) -#define TIM8 ((TIM_TypeDef *) TIM8_BASE) -#define USART1 ((USART_TypeDef *) USART1_BASE) -#define USART6 ((USART_TypeDef *) USART6_BASE) -#define ADC ((ADC_Common_TypeDef *) ADC_BASE) -#define ADC1 ((ADC_TypeDef *) ADC1_BASE) -#define ADC2 ((ADC_TypeDef *) ADC2_BASE) -#define ADC3 ((ADC_TypeDef *) ADC3_BASE) -#define SDIO ((SDIO_TypeDef *) SDIO_BASE) -#define SPI1 ((SPI_TypeDef *) SPI1_BASE) -#define SYSCFG ((SYSCFG_TypeDef *) SYSCFG_BASE) -#define EXTI ((EXTI_TypeDef *) EXTI_BASE) -#define TIM9 ((TIM_TypeDef *) TIM9_BASE) -#define TIM10 ((TIM_TypeDef *) TIM10_BASE) -#define TIM11 ((TIM_TypeDef *) TIM11_BASE) -#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) -#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE) -#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE) -#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE) -#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE) -#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE) -#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE) -#define GPIOH ((GPIO_TypeDef *) GPIOH_BASE) -#define GPIOI ((GPIO_TypeDef *) GPIOI_BASE) -#define CRC ((CRC_TypeDef *) CRC_BASE) -#define RCC ((RCC_TypeDef *) RCC_BASE) -#define FLASH ((FLASH_TypeDef *) FLASH_R_BASE) -#define DMA1 ((DMA_TypeDef *) DMA1_BASE) -#define DMA1_Stream0 ((DMA_Stream_TypeDef *) DMA1_Stream0_BASE) -#define DMA1_Stream1 ((DMA_Stream_TypeDef *) DMA1_Stream1_BASE) -#define DMA1_Stream2 ((DMA_Stream_TypeDef *) DMA1_Stream2_BASE) -#define DMA1_Stream3 ((DMA_Stream_TypeDef *) DMA1_Stream3_BASE) -#define DMA1_Stream4 ((DMA_Stream_TypeDef *) DMA1_Stream4_BASE) -#define DMA1_Stream5 ((DMA_Stream_TypeDef *) DMA1_Stream5_BASE) -#define DMA1_Stream6 ((DMA_Stream_TypeDef *) DMA1_Stream6_BASE) -#define DMA1_Stream7 ((DMA_Stream_TypeDef *) DMA1_Stream7_BASE) -#define DMA2 ((DMA_TypeDef *) DMA2_BASE) -#define DMA2_Stream0 ((DMA_Stream_TypeDef *) DMA2_Stream0_BASE) -#define DMA2_Stream1 ((DMA_Stream_TypeDef *) DMA2_Stream1_BASE) -#define DMA2_Stream2 ((DMA_Stream_TypeDef *) DMA2_Stream2_BASE) -#define DMA2_Stream3 ((DMA_Stream_TypeDef *) DMA2_Stream3_BASE) -#define DMA2_Stream4 ((DMA_Stream_TypeDef *) DMA2_Stream4_BASE) -#define DMA2_Stream5 ((DMA_Stream_TypeDef *) DMA2_Stream5_BASE) -#define DMA2_Stream6 ((DMA_Stream_TypeDef *) DMA2_Stream6_BASE) -#define DMA2_Stream7 ((DMA_Stream_TypeDef *) DMA2_Stream7_BASE) -#define ETH ((ETH_TypeDef *) ETH_BASE) -#define DCMI ((DCMI_TypeDef *) DCMI_BASE) -#define CRYP ((CRYP_TypeDef *) CRYP_BASE) -#define HASH ((HASH_TypeDef *) HASH_BASE) -#define HASH_DIGEST ((HASH_DIGEST_TypeDef *) HASH_DIGEST_BASE) -#define RNG ((RNG_TypeDef *) RNG_BASE) -#define FSMC_Bank1 ((FSMC_Bank1_TypeDef *) FSMC_Bank1_R_BASE) -#define FSMC_Bank1E ((FSMC_Bank1E_TypeDef *) FSMC_Bank1E_R_BASE) -#define FSMC_Bank2_3 ((FSMC_Bank2_3_TypeDef *) FSMC_Bank2_3_R_BASE) -#define FSMC_Bank4 ((FSMC_Bank4_TypeDef *) FSMC_Bank4_R_BASE) - -#define DBGMCU ((DBGMCU_TypeDef *) DBGMCU_BASE) - -#define USB_OTG_FS ((USB_OTG_GlobalTypeDef *) USB_OTG_FS_PERIPH_BASE) -#define USB_OTG_HS ((USB_OTG_GlobalTypeDef *) USB_OTG_HS_PERIPH_BASE) - -/** - * @} - */ - -/** @addtogroup Exported_constants - * @{ - */ - - /** @addtogroup Peripheral_Registers_Bits_Definition - * @{ - */ - -/******************************************************************************/ -/* Peripheral Registers_Bits_Definition */ -/******************************************************************************/ - -/******************************************************************************/ -/* */ -/* Analog to Digital Converter */ -/* */ -/******************************************************************************/ -/******************** Bit definition for ADC_SR register ********************/ -#define ADC_SR_AWD ((uint32_t)0x00000001) /*! - Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** \ingroup Cortex_M0 - @{ - */ - -/* CMSIS CM0 definitions */ -#define __CM0_CMSIS_VERSION_MAIN (0x04) /*!< [31:16] CMSIS HAL main version */ -#define __CM0_CMSIS_VERSION_SUB (0x00) /*!< [15:0] CMSIS HAL sub version */ -#define __CM0_CMSIS_VERSION ((__CM0_CMSIS_VERSION_MAIN << 16) | \ - __CM0_CMSIS_VERSION_SUB ) /*!< CMSIS HAL version number */ - -#define __CORTEX_M (0x00) /*!< Cortex-M Core */ - - -#if defined ( __CC_ARM ) - #define __ASM __asm /*!< asm keyword for ARM Compiler */ - #define __INLINE __inline /*!< inline keyword for ARM Compiler */ - #define __STATIC_INLINE static __inline - -#elif defined ( __GNUC__ ) - #define __ASM __asm /*!< asm keyword for GNU Compiler */ - #define __INLINE inline /*!< inline keyword for GNU Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __ICCARM__ ) - #define __ASM __asm /*!< asm keyword for IAR Compiler */ - #define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */ - #define __STATIC_INLINE static inline - -#elif defined ( __TMS470__ ) - #define __ASM __asm /*!< asm keyword for TI CCS Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __TASKING__ ) - #define __ASM __asm /*!< asm keyword for TASKING Compiler */ - #define __INLINE inline /*!< inline keyword for TASKING Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __CSMC__ ) - #define __packed - #define __ASM _asm /*!< asm keyword for COSMIC Compiler */ - #define __INLINE inline /*use -pc99 on compile line !< inline keyword for COSMIC Compiler */ - #define __STATIC_INLINE static inline - -#endif - -/** __FPU_USED indicates whether an FPU is used or not. - This core does not support an FPU at all -*/ -#define __FPU_USED 0 - -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TMS470__ ) - #if defined __TI__VFP_SUPPORT____ - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __CSMC__ ) /* Cosmic */ - #if ( __CSMC__ & 0x400) // FPU present for parser - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif -#endif - -#include /* standard types definitions */ -#include /* Core Instruction Access */ -#include /* Core Function Access */ - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM0_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM0_H_DEPENDANT -#define __CORE_CM0_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM0_REV - #define __CM0_REV 0x0000 - #warning "__CM0_REV not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 2 - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0 - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - IO Type Qualifiers are used - \li to specify the access to peripheral variables. - \li for automatic generation of peripheral register debug information. -*/ -#ifdef __cplusplus - #define __I volatile /*!< Defines 'read only' permissions */ -#else - #define __I volatile const /*!< Defines 'read only' permissions */ -#endif -#define __O volatile /*!< Defines 'write only' permissions */ -#define __IO volatile /*!< Defines 'read / write' permissions */ - -/*@} end of group Cortex_M0 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - ******************************************************************************/ -/** \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31 /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30 /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29 /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28 /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - - -/** \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0 /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31 /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30 /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29 /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28 /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_T_Pos 24 /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_ISR_Pos 0 /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t _reserved0:1; /*!< bit: 0 Reserved */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SPSEL_Pos 1 /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IO uint32_t ISER[1]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[31]; - __IO uint32_t ICER[1]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[31]; - __IO uint32_t ISPR[1]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[31]; - __IO uint32_t ICPR[1]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[31]; - uint32_t RESERVED4[64]; - __IO uint32_t IP[8]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ -} NVIC_Type; - -/*@} end of group CMSIS_NVIC */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __I uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IO uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - uint32_t RESERVED0; - __IO uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IO uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IO uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - uint32_t RESERVED1; - __IO uint32_t SHP[2]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ - __IO uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24 /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20 /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16 /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4 /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0 /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31 /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28 /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27 /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26 /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25 /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23 /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22 /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12 /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0 /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16 /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16 /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15 /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2 /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1 /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4 /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2 /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1 /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_STKALIGN_Pos 9 /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3 /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_SVCALLPENDED_Pos 15 /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IO uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IO uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __I uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16 /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2 /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1 /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0 /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0 /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0 /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31 /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30 /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0 /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Cortex-M0 Core Debug Registers (DCB registers, SHCSR, and DFSR) - are only accessible over DAP and not via processor. Therefore - they are not covered by the Cortex-M0 header file. - @{ - */ -/*@} end of group CMSIS_CoreDebug */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Cortex-M0 Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ - - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Register Access Functions - ******************************************************************************/ -/** \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -/* Interrupt Priorities are WORD accessible only under ARMv6M */ -/* The following MACROS handle generation of the register offset and byte masks */ -#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) -#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) -#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) - - -/** \brief Enable External Interrupt - - The function enables a device-specific interrupt in the NVIC interrupt controller. - - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) -{ - NVIC->ISER[0] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); -} - - -/** \brief Disable External Interrupt - - The function disables a device-specific interrupt in the NVIC interrupt controller. - - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) -{ - NVIC->ICER[0] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); -} - - -/** \brief Get Pending Interrupt - - The function reads the pending register in the NVIC and returns the pending bit - for the specified interrupt. - - \param [in] IRQn Interrupt number. - - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - */ -__STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - return((uint32_t)(((NVIC->ISPR[0] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); -} - - -/** \brief Set Pending Interrupt - - The function sets the pending bit of an external interrupt. - - \param [in] IRQn Interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ISPR[0] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); -} - - -/** \brief Clear Pending Interrupt - - The function clears the pending bit of an external interrupt. - - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ICPR[0] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); -} - - -/** \brief Set Interrupt Priority - - The function sets the priority of an interrupt. - - \note The priority cannot be set for every core interrupt. - - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - */ -__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if((int32_t)(IRQn) < 0) { - SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8 - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } - else { - NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8 - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } -} - - -/** \brief Get Interrupt Priority - - The function reads the priority of an interrupt. The interrupt - number can be positive to specify an external (device specific) - interrupt, or negative to specify an internal (core) interrupt. - - - \param [in] IRQn Interrupt number. - \return Interrupt Priority. Value is aligned automatically to the implemented - priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) -{ - - if((int32_t)(IRQn) < 0) { - return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8 - __NVIC_PRIO_BITS))); - } - else { - return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8 - __NVIC_PRIO_BITS))); - } -} - - -/** \brief System Reset - - The function initiates a system reset request to reset the MCU. - */ -__STATIC_INLINE void NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - SCB_AIRCR_SYSRESETREQ_Msk); - __DSB(); /* Ensure completion of memory access */ - while(1) { __NOP(); } /* wait until reset */ -} - -/*@} end of CMSIS_Core_NVICFunctions */ - - - -/* ################################## SysTick function ############################################ */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if (__Vendor_SysTickConfig == 0) - -/** \brief System Tick Configuration - - The function initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - - \param [in] ticks Number of ticks between two interrupts. - - \return 0 Function succeeded. - \return 1 Function failed. - - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) { return (1UL); } /* Reload value impossible */ - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM0_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Include/core_cm0plus.h b/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Include/core_cm0plus.h deleted file mode 100755 index 123cb400..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Include/core_cm0plus.h +++ /dev/null @@ -1,854 +0,0 @@ -/**************************************************************************//** - * @file core_cm0plus.h - * @brief CMSIS Cortex-M0+ Core Peripheral Access Layer Header File - * @version V4.10 - * @date 18. March 2015 - * - * @note - * - ******************************************************************************/ -/* Copyright (c) 2009 - 2015 ARM LIMITED - - All rights reserved. - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - Neither the name of ARM nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - * - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - ---------------------------------------------------------------------------*/ - - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#endif - -#ifndef __CORE_CM0PLUS_H_GENERIC -#define __CORE_CM0PLUS_H_GENERIC - -#ifdef __cplusplus - extern "C" { -#endif - -/** \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** \ingroup Cortex-M0+ - @{ - */ - -/* CMSIS CM0P definitions */ -#define __CM0PLUS_CMSIS_VERSION_MAIN (0x04) /*!< [31:16] CMSIS HAL main version */ -#define __CM0PLUS_CMSIS_VERSION_SUB (0x00) /*!< [15:0] CMSIS HAL sub version */ -#define __CM0PLUS_CMSIS_VERSION ((__CM0PLUS_CMSIS_VERSION_MAIN << 16) | \ - __CM0PLUS_CMSIS_VERSION_SUB) /*!< CMSIS HAL version number */ - -#define __CORTEX_M (0x00) /*!< Cortex-M Core */ - - -#if defined ( __CC_ARM ) - #define __ASM __asm /*!< asm keyword for ARM Compiler */ - #define __INLINE __inline /*!< inline keyword for ARM Compiler */ - #define __STATIC_INLINE static __inline - -#elif defined ( __GNUC__ ) - #define __ASM __asm /*!< asm keyword for GNU Compiler */ - #define __INLINE inline /*!< inline keyword for GNU Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __ICCARM__ ) - #define __ASM __asm /*!< asm keyword for IAR Compiler */ - #define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */ - #define __STATIC_INLINE static inline - -#elif defined ( __TMS470__ ) - #define __ASM __asm /*!< asm keyword for TI CCS Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __TASKING__ ) - #define __ASM __asm /*!< asm keyword for TASKING Compiler */ - #define __INLINE inline /*!< inline keyword for TASKING Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __CSMC__ ) - #define __packed - #define __ASM _asm /*!< asm keyword for COSMIC Compiler */ - #define __INLINE inline /*use -pc99 on compile line !< inline keyword for COSMIC Compiler */ - #define __STATIC_INLINE static inline - -#endif - -/** __FPU_USED indicates whether an FPU is used or not. - This core does not support an FPU at all -*/ -#define __FPU_USED 0 - -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TMS470__ ) - #if defined __TI__VFP_SUPPORT____ - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __CSMC__ ) /* Cosmic */ - #if ( __CSMC__ & 0x400) // FPU present for parser - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif -#endif - -#include /* standard types definitions */ -#include /* Core Instruction Access */ -#include /* Core Function Access */ - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM0PLUS_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_CM0PLUS_H_DEPENDANT -#define __CORE_CM0PLUS_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __CM0PLUS_REV - #define __CM0PLUS_REV 0x0000 - #warning "__CM0PLUS_REV not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0 - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __VTOR_PRESENT - #define __VTOR_PRESENT 0 - #warning "__VTOR_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 2 - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0 - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - IO Type Qualifiers are used - \li to specify the access to peripheral variables. - \li for automatic generation of peripheral register debug information. -*/ -#ifdef __cplusplus - #define __I volatile /*!< Defines 'read only' permissions */ -#else - #define __I volatile const /*!< Defines 'read only' permissions */ -#endif -#define __O volatile /*!< Defines 'write only' permissions */ -#define __IO volatile /*!< Defines 'read / write' permissions */ - -/*@} end of group Cortex-M0+ */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core MPU Register - ******************************************************************************/ -/** \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31 /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30 /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29 /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28 /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - - -/** \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0 /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31 /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30 /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29 /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28 /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_T_Pos 24 /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_ISR_Pos 0 /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SPSEL_Pos 1 /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -#define CONTROL_nPRIV_Pos 0 /*!< CONTROL: nPRIV Position */ -#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IO uint32_t ISER[1]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[31]; - __IO uint32_t ICER[1]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[31]; - __IO uint32_t ISPR[1]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[31]; - __IO uint32_t ICPR[1]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[31]; - uint32_t RESERVED4[64]; - __IO uint32_t IP[8]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ -} NVIC_Type; - -/*@} end of group CMSIS_NVIC */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __I uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IO uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ -#if (__VTOR_PRESENT == 1) - __IO uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ -#else - uint32_t RESERVED0; -#endif - __IO uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IO uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IO uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - uint32_t RESERVED1; - __IO uint32_t SHP[2]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ - __IO uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24 /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20 /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16 /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4 /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0 /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31 /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28 /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27 /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26 /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25 /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23 /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22 /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12 /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0 /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -#if (__VTOR_PRESENT == 1) -/* SCB Interrupt Control State Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 8 /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0xFFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ -#endif - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16 /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16 /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15 /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2 /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1 /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4 /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2 /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1 /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_STKALIGN_Pos 9 /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3 /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_SVCALLPENDED_Pos 15 /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IO uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IO uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __I uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16 /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2 /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1 /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0 /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0 /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0 /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31 /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30 /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0 /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - -#if (__MPU_PRESENT == 1) -/** \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __I uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IO uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IO uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IO uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IO uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ -} MPU_Type; - -/* MPU Type Register */ -#define MPU_TYPE_IREGION_Pos 16 /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8 /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0 /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register */ -#define MPU_CTRL_PRIVDEFENA_Pos 2 /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1 /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0 /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register */ -#define MPU_RNR_REGION_Pos 0 /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register */ -#define MPU_RBAR_ADDR_Pos 8 /*!< MPU RBAR: ADDR Position */ -#define MPU_RBAR_ADDR_Msk (0xFFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ - -#define MPU_RBAR_VALID_Pos 4 /*!< MPU RBAR: VALID Position */ -#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ - -#define MPU_RBAR_REGION_Pos 0 /*!< MPU RBAR: REGION Position */ -#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ - -/* MPU Region Attribute and Size Register */ -#define MPU_RASR_ATTRS_Pos 16 /*!< MPU RASR: MPU Region Attribute field Position */ -#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ - -#define MPU_RASR_XN_Pos 28 /*!< MPU RASR: ATTRS.XN Position */ -#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ - -#define MPU_RASR_AP_Pos 24 /*!< MPU RASR: ATTRS.AP Position */ -#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ - -#define MPU_RASR_TEX_Pos 19 /*!< MPU RASR: ATTRS.TEX Position */ -#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ - -#define MPU_RASR_S_Pos 18 /*!< MPU RASR: ATTRS.S Position */ -#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ - -#define MPU_RASR_C_Pos 17 /*!< MPU RASR: ATTRS.C Position */ -#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ - -#define MPU_RASR_B_Pos 16 /*!< MPU RASR: ATTRS.B Position */ -#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ - -#define MPU_RASR_SRD_Pos 8 /*!< MPU RASR: Sub-Region Disable Position */ -#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ - -#define MPU_RASR_SIZE_Pos 1 /*!< MPU RASR: Region Size Field Position */ -#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ - -#define MPU_RASR_ENABLE_Pos 0 /*!< MPU RASR: Region enable bit Position */ -#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Cortex-M0+ Core Debug Registers (DCB registers, SHCSR, and DFSR) - are only accessible over DAP and not via processor. Therefore - they are not covered by the Cortex-M0 header file. - @{ - */ -/*@} end of group CMSIS_CoreDebug */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of Cortex-M0+ Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ - -#if (__MPU_PRESENT == 1) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ -#endif - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Register Access Functions - ******************************************************************************/ -/** \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -/* Interrupt Priorities are WORD accessible only under ARMv6M */ -/* The following MACROS handle generation of the register offset and byte masks */ -#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) -#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) -#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) - - -/** \brief Enable External Interrupt - - The function enables a device-specific interrupt in the NVIC interrupt controller. - - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) -{ - NVIC->ISER[0] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); -} - - -/** \brief Disable External Interrupt - - The function disables a device-specific interrupt in the NVIC interrupt controller. - - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) -{ - NVIC->ICER[0] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); -} - - -/** \brief Get Pending Interrupt - - The function reads the pending register in the NVIC and returns the pending bit - for the specified interrupt. - - \param [in] IRQn Interrupt number. - - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - */ -__STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - return((uint32_t)(((NVIC->ISPR[0] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); -} - - -/** \brief Set Pending Interrupt - - The function sets the pending bit of an external interrupt. - - \param [in] IRQn Interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ISPR[0] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); -} - - -/** \brief Clear Pending Interrupt - - The function clears the pending bit of an external interrupt. - - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ICPR[0] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); -} - - -/** \brief Set Interrupt Priority - - The function sets the priority of an interrupt. - - \note The priority cannot be set for every core interrupt. - - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - */ -__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if((int32_t)(IRQn) < 0) { - SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8 - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } - else { - NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8 - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } -} - - -/** \brief Get Interrupt Priority - - The function reads the priority of an interrupt. The interrupt - number can be positive to specify an external (device specific) - interrupt, or negative to specify an internal (core) interrupt. - - - \param [in] IRQn Interrupt number. - \return Interrupt Priority. Value is aligned automatically to the implemented - priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) -{ - - if((int32_t)(IRQn) < 0) { - return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8 - __NVIC_PRIO_BITS))); - } - else { - return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8 - __NVIC_PRIO_BITS))); - } -} - - -/** \brief System Reset - - The function initiates a system reset request to reset the MCU. - */ -__STATIC_INLINE void NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - SCB_AIRCR_SYSRESETREQ_Msk); - __DSB(); /* Ensure completion of memory access */ - while(1) { __NOP(); } /* wait until reset */ -} - -/*@} end of CMSIS_Core_NVICFunctions */ - - - -/* ################################## SysTick function ############################################ */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if (__Vendor_SysTickConfig == 0) - -/** \brief System Tick Configuration - - The function initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - - \param [in] ticks Number of ticks between two interrupts. - - \return 0 Function succeeded. - \return 1 Function failed. - - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) {return (1UL);} /* Reload value impossible */ - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_CM0PLUS_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Include/core_sc000.h b/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Include/core_sc000.h deleted file mode 100755 index 44cb0274..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Include/core_sc000.h +++ /dev/null @@ -1,864 +0,0 @@ -/**************************************************************************//** - * @file core_sc000.h - * @brief CMSIS SC000 Core Peripheral Access Layer Header File - * @version V4.10 - * @date 18. March 2015 - * - * @note - * - ******************************************************************************/ -/* Copyright (c) 2009 - 2015 ARM LIMITED - - All rights reserved. - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - Neither the name of ARM nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - * - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - ---------------------------------------------------------------------------*/ - - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ -#endif - -#ifndef __CORE_SC000_H_GENERIC -#define __CORE_SC000_H_GENERIC - -#ifdef __cplusplus - extern "C" { -#endif - -/** \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions - CMSIS violates the following MISRA-C:2004 rules: - - \li Required Rule 8.5, object/function definition in header file.
- Function definitions in header files are used to allow 'inlining'. - - \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
- Unions are used for effective representation of core registers. - - \li Advisory Rule 19.7, Function-like macro defined.
- Function-like macros are used to allow more efficient code. - */ - - -/******************************************************************************* - * CMSIS definitions - ******************************************************************************/ -/** \ingroup SC000 - @{ - */ - -/* CMSIS SC000 definitions */ -#define __SC000_CMSIS_VERSION_MAIN (0x04) /*!< [31:16] CMSIS HAL main version */ -#define __SC000_CMSIS_VERSION_SUB (0x00) /*!< [15:0] CMSIS HAL sub version */ -#define __SC000_CMSIS_VERSION ((__SC000_CMSIS_VERSION_MAIN << 16) | \ - __SC000_CMSIS_VERSION_SUB ) /*!< CMSIS HAL version number */ - -#define __CORTEX_SC (000) /*!< Cortex secure core */ - - -#if defined ( __CC_ARM ) - #define __ASM __asm /*!< asm keyword for ARM Compiler */ - #define __INLINE __inline /*!< inline keyword for ARM Compiler */ - #define __STATIC_INLINE static __inline - -#elif defined ( __GNUC__ ) - #define __ASM __asm /*!< asm keyword for GNU Compiler */ - #define __INLINE inline /*!< inline keyword for GNU Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __ICCARM__ ) - #define __ASM __asm /*!< asm keyword for IAR Compiler */ - #define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */ - #define __STATIC_INLINE static inline - -#elif defined ( __TMS470__ ) - #define __ASM __asm /*!< asm keyword for TI CCS Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __TASKING__ ) - #define __ASM __asm /*!< asm keyword for TASKING Compiler */ - #define __INLINE inline /*!< inline keyword for TASKING Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __CSMC__ ) - #define __packed - #define __ASM _asm /*!< asm keyword for COSMIC Compiler */ - #define __INLINE inline /*use -pc99 on compile line !< inline keyword for COSMIC Compiler */ - #define __STATIC_INLINE static inline - -#endif - -/** __FPU_USED indicates whether an FPU is used or not. - This core does not support an FPU at all -*/ -#define __FPU_USED 0 - -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TMS470__ ) - #if defined __TI__VFP_SUPPORT____ - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif - -#elif defined ( __CSMC__ ) /* Cosmic */ - #if ( __CSMC__ & 0x400) // FPU present for parser - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif -#endif - -#include /* standard types definitions */ -#include /* Core Instruction Access */ -#include /* Core Function Access */ - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_SC000_H_GENERIC */ - -#ifndef __CMSIS_GENERIC - -#ifndef __CORE_SC000_H_DEPENDANT -#define __CORE_SC000_H_DEPENDANT - -#ifdef __cplusplus - extern "C" { -#endif - -/* check device defines and use defaults */ -#if defined __CHECK_DEVICE_DEFINES - #ifndef __SC000_REV - #define __SC000_REV 0x0000 - #warning "__SC000_REV not defined in device header file; using default!" - #endif - - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0 - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif - - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 2 - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif - - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0 - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif -#endif - -/* IO definitions (access restrictions to peripheral registers) */ -/** - \defgroup CMSIS_glob_defs CMSIS Global Defines - - IO Type Qualifiers are used - \li to specify the access to peripheral variables. - \li for automatic generation of peripheral register debug information. -*/ -#ifdef __cplusplus - #define __I volatile /*!< Defines 'read only' permissions */ -#else - #define __I volatile const /*!< Defines 'read only' permissions */ -#endif -#define __O volatile /*!< Defines 'write only' permissions */ -#define __IO volatile /*!< Defines 'read / write' permissions */ - -/*@} end of group SC000 */ - - - -/******************************************************************************* - * Register Abstraction - Core Register contain: - - Core Register - - Core NVIC Register - - Core SCB Register - - Core SysTick Register - - Core MPU Register - ******************************************************************************/ -/** \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. -*/ - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. - @{ - */ - -/** \brief Union type to access the Application Program Status Register (APSR). - */ -typedef union -{ - struct - { - uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} APSR_Type; - -/* APSR Register Definitions */ -#define APSR_N_Pos 31 /*!< APSR: N Position */ -#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ - -#define APSR_Z_Pos 30 /*!< APSR: Z Position */ -#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ - -#define APSR_C_Pos 29 /*!< APSR: C Position */ -#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ - -#define APSR_V_Pos 28 /*!< APSR: V Position */ -#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ - - -/** \brief Union type to access the Interrupt Program Status Register (IPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} IPSR_Type; - -/* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0 /*!< IPSR: ISR Position */ -#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ - - -/** \brief Union type to access the Special-Purpose Program Status Registers (xPSR). - */ -typedef union -{ - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} xPSR_Type; - -/* xPSR Register Definitions */ -#define xPSR_N_Pos 31 /*!< xPSR: N Position */ -#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ - -#define xPSR_Z_Pos 30 /*!< xPSR: Z Position */ -#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ - -#define xPSR_C_Pos 29 /*!< xPSR: C Position */ -#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ - -#define xPSR_V_Pos 28 /*!< xPSR: V Position */ -#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ - -#define xPSR_T_Pos 24 /*!< xPSR: T Position */ -#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ - -#define xPSR_ISR_Pos 0 /*!< xPSR: ISR Position */ -#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ - - -/** \brief Union type to access the Control Registers (CONTROL). - */ -typedef union -{ - struct - { - uint32_t _reserved0:1; /*!< bit: 0 Reserved */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ -} CONTROL_Type; - -/* CONTROL Register Definitions */ -#define CONTROL_SPSEL_Pos 1 /*!< CONTROL: SPSEL Position */ -#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ - -/*@} end of group CMSIS_CORE */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers - @{ - */ - -/** \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). - */ -typedef struct -{ - __IO uint32_t ISER[1]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[31]; - __IO uint32_t ICER[1]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[31]; - __IO uint32_t ISPR[1]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[31]; - __IO uint32_t ICPR[1]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[31]; - uint32_t RESERVED4[64]; - __IO uint32_t IP[8]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ -} NVIC_Type; - -/*@} end of group CMSIS_NVIC */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers - @{ - */ - -/** \brief Structure type to access the System Control Block (SCB). - */ -typedef struct -{ - __I uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IO uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IO uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IO uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IO uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IO uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - uint32_t RESERVED0[1]; - __IO uint32_t SHP[2]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ - __IO uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - uint32_t RESERVED1[154]; - __IO uint32_t SFCR; /*!< Offset: 0x290 (R/W) Security Features Control Register */ -} SCB_Type; - -/* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24 /*!< SCB CPUID: IMPLEMENTER Position */ -#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ - -#define SCB_CPUID_VARIANT_Pos 20 /*!< SCB CPUID: VARIANT Position */ -#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ - -#define SCB_CPUID_ARCHITECTURE_Pos 16 /*!< SCB CPUID: ARCHITECTURE Position */ -#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ - -#define SCB_CPUID_PARTNO_Pos 4 /*!< SCB CPUID: PARTNO Position */ -#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ - -#define SCB_CPUID_REVISION_Pos 0 /*!< SCB CPUID: REVISION Position */ -#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31 /*!< SCB ICSR: NMIPENDSET Position */ -#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ - -#define SCB_ICSR_PENDSVSET_Pos 28 /*!< SCB ICSR: PENDSVSET Position */ -#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ - -#define SCB_ICSR_PENDSVCLR_Pos 27 /*!< SCB ICSR: PENDSVCLR Position */ -#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ - -#define SCB_ICSR_PENDSTSET_Pos 26 /*!< SCB ICSR: PENDSTSET Position */ -#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ - -#define SCB_ICSR_PENDSTCLR_Pos 25 /*!< SCB ICSR: PENDSTCLR Position */ -#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ - -#define SCB_ICSR_ISRPREEMPT_Pos 23 /*!< SCB ICSR: ISRPREEMPT Position */ -#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ - -#define SCB_ICSR_ISRPENDING_Pos 22 /*!< SCB ICSR: ISRPENDING Position */ -#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ - -#define SCB_ICSR_VECTPENDING_Pos 12 /*!< SCB ICSR: VECTPENDING Position */ -#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ - -#define SCB_ICSR_VECTACTIVE_Pos 0 /*!< SCB ICSR: VECTACTIVE Position */ -#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ - -/* SCB Interrupt Control State Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7 /*!< SCB VTOR: TBLOFF Position */ -#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ - -/* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16 /*!< SCB AIRCR: VECTKEY Position */ -#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ - -#define SCB_AIRCR_VECTKEYSTAT_Pos 16 /*!< SCB AIRCR: VECTKEYSTAT Position */ -#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ - -#define SCB_AIRCR_ENDIANESS_Pos 15 /*!< SCB AIRCR: ENDIANESS Position */ -#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ - -#define SCB_AIRCR_SYSRESETREQ_Pos 2 /*!< SCB AIRCR: SYSRESETREQ Position */ -#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ - -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1 /*!< SCB AIRCR: VECTCLRACTIVE Position */ -#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ - -/* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4 /*!< SCB SCR: SEVONPEND Position */ -#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ - -#define SCB_SCR_SLEEPDEEP_Pos 2 /*!< SCB SCR: SLEEPDEEP Position */ -#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ - -#define SCB_SCR_SLEEPONEXIT_Pos 1 /*!< SCB SCR: SLEEPONEXIT Position */ -#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ - -/* SCB Configuration Control Register Definitions */ -#define SCB_CCR_STKALIGN_Pos 9 /*!< SCB CCR: STKALIGN Position */ -#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ - -#define SCB_CCR_UNALIGN_TRP_Pos 3 /*!< SCB CCR: UNALIGN_TRP Position */ -#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ - -/* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_SVCALLPENDED_Pos 15 /*!< SCB SHCSR: SVCALLPENDED Position */ -#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ - -/*@} end of group CMSIS_SCB */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) - \brief Type definitions for the System Control and ID Register not in the SCB - @{ - */ - -/** \brief Structure type to access the System Control and ID Register not in the SCB. - */ -typedef struct -{ - uint32_t RESERVED0[2]; - __IO uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ -} SCnSCB_Type; - -/* Auxiliary Control Register Definitions */ -#define SCnSCB_ACTLR_DISMCYCINT_Pos 0 /*!< ACTLR: DISMCYCINT Position */ -#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ - -/*@} end of group CMSIS_SCnotSCB */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. - @{ - */ - -/** \brief Structure type to access the System Timer (SysTick). - */ -typedef struct -{ - __IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IO uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IO uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __I uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ -} SysTick_Type; - -/* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16 /*!< SysTick CTRL: COUNTFLAG Position */ -#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ - -#define SysTick_CTRL_CLKSOURCE_Pos 2 /*!< SysTick CTRL: CLKSOURCE Position */ -#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ - -#define SysTick_CTRL_TICKINT_Pos 1 /*!< SysTick CTRL: TICKINT Position */ -#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ - -#define SysTick_CTRL_ENABLE_Pos 0 /*!< SysTick CTRL: ENABLE Position */ -#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ - -/* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0 /*!< SysTick LOAD: RELOAD Position */ -#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ - -/* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0 /*!< SysTick VAL: CURRENT Position */ -#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ - -/* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31 /*!< SysTick CALIB: NOREF Position */ -#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ - -#define SysTick_CALIB_SKEW_Pos 30 /*!< SysTick CALIB: SKEW Position */ -#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ - -#define SysTick_CALIB_TENMS_Pos 0 /*!< SysTick CALIB: TENMS Position */ -#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ - -/*@} end of group CMSIS_SysTick */ - -#if (__MPU_PRESENT == 1) -/** \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) - @{ - */ - -/** \brief Structure type to access the Memory Protection Unit (MPU). - */ -typedef struct -{ - __I uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IO uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IO uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IO uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IO uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ -} MPU_Type; - -/* MPU Type Register */ -#define MPU_TYPE_IREGION_Pos 16 /*!< MPU TYPE: IREGION Position */ -#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ - -#define MPU_TYPE_DREGION_Pos 8 /*!< MPU TYPE: DREGION Position */ -#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ - -#define MPU_TYPE_SEPARATE_Pos 0 /*!< MPU TYPE: SEPARATE Position */ -#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ - -/* MPU Control Register */ -#define MPU_CTRL_PRIVDEFENA_Pos 2 /*!< MPU CTRL: PRIVDEFENA Position */ -#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ - -#define MPU_CTRL_HFNMIENA_Pos 1 /*!< MPU CTRL: HFNMIENA Position */ -#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ - -#define MPU_CTRL_ENABLE_Pos 0 /*!< MPU CTRL: ENABLE Position */ -#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ - -/* MPU Region Number Register */ -#define MPU_RNR_REGION_Pos 0 /*!< MPU RNR: REGION Position */ -#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ - -/* MPU Region Base Address Register */ -#define MPU_RBAR_ADDR_Pos 8 /*!< MPU RBAR: ADDR Position */ -#define MPU_RBAR_ADDR_Msk (0xFFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ - -#define MPU_RBAR_VALID_Pos 4 /*!< MPU RBAR: VALID Position */ -#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ - -#define MPU_RBAR_REGION_Pos 0 /*!< MPU RBAR: REGION Position */ -#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ - -/* MPU Region Attribute and Size Register */ -#define MPU_RASR_ATTRS_Pos 16 /*!< MPU RASR: MPU Region Attribute field Position */ -#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ - -#define MPU_RASR_XN_Pos 28 /*!< MPU RASR: ATTRS.XN Position */ -#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ - -#define MPU_RASR_AP_Pos 24 /*!< MPU RASR: ATTRS.AP Position */ -#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ - -#define MPU_RASR_TEX_Pos 19 /*!< MPU RASR: ATTRS.TEX Position */ -#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ - -#define MPU_RASR_S_Pos 18 /*!< MPU RASR: ATTRS.S Position */ -#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ - -#define MPU_RASR_C_Pos 17 /*!< MPU RASR: ATTRS.C Position */ -#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ - -#define MPU_RASR_B_Pos 16 /*!< MPU RASR: ATTRS.B Position */ -#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ - -#define MPU_RASR_SRD_Pos 8 /*!< MPU RASR: Sub-Region Disable Position */ -#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ - -#define MPU_RASR_SIZE_Pos 1 /*!< MPU RASR: Region Size Field Position */ -#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ - -#define MPU_RASR_ENABLE_Pos 0 /*!< MPU RASR: Region enable bit Position */ -#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ - -/*@} end of group CMSIS_MPU */ -#endif - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief SC000 Core Debug Registers (DCB registers, SHCSR, and DFSR) - are only accessible over DAP and not via processor. Therefore - they are not covered by the Cortex-M0 header file. - @{ - */ -/*@} end of group CMSIS_CoreDebug */ - - -/** \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. - @{ - */ - -/* Memory mapping of SC000 Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ - -#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ - -#if (__MPU_PRESENT == 1) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ -#endif - -/*@} */ - - - -/******************************************************************************* - * Hardware Abstraction Layer - Core Function Interface contains: - - Core NVIC Functions - - Core SysTick Functions - - Core Register Access Functions - ******************************************************************************/ -/** \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference -*/ - - - -/* ########################## NVIC functions #################################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ - */ - -/* Interrupt Priorities are WORD accessible only under ARMv6M */ -/* The following MACROS handle generation of the register offset and byte masks */ -#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) -#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) -#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) - - -/** \brief Enable External Interrupt - - The function enables a device-specific interrupt in the NVIC interrupt controller. - - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) -{ - NVIC->ISER[0] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); -} - - -/** \brief Disable External Interrupt - - The function disables a device-specific interrupt in the NVIC interrupt controller. - - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) -{ - NVIC->ICER[0] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); -} - - -/** \brief Get Pending Interrupt - - The function reads the pending register in the NVIC and returns the pending bit - for the specified interrupt. - - \param [in] IRQn Interrupt number. - - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. - */ -__STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) -{ - return((uint32_t)(((NVIC->ISPR[0] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); -} - - -/** \brief Set Pending Interrupt - - The function sets the pending bit of an external interrupt. - - \param [in] IRQn Interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ISPR[0] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); -} - - -/** \brief Clear Pending Interrupt - - The function clears the pending bit of an external interrupt. - - \param [in] IRQn External interrupt number. Value cannot be negative. - */ -__STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) -{ - NVIC->ICPR[0] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); -} - - -/** \brief Set Interrupt Priority - - The function sets the priority of an interrupt. - - \note The priority cannot be set for every core interrupt. - - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. - */ -__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if((int32_t)(IRQn) < 0) { - SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8 - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } - else { - NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | - (((priority << (8 - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); - } -} - - -/** \brief Get Interrupt Priority - - The function reads the priority of an interrupt. The interrupt - number can be positive to specify an external (device specific) - interrupt, or negative to specify an internal (core) interrupt. - - - \param [in] IRQn Interrupt number. - \return Interrupt Priority. Value is aligned automatically to the implemented - priority bits of the microcontroller. - */ -__STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) -{ - - if((int32_t)(IRQn) < 0) { - return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8 - __NVIC_PRIO_BITS))); - } - else { - return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8 - __NVIC_PRIO_BITS))); - } -} - - -/** \brief System Reset - - The function initiates a system reset request to reset the MCU. - */ -__STATIC_INLINE void NVIC_SystemReset(void) -{ - __DSB(); /* Ensure all outstanding memory accesses included - buffered write are completed before reset */ - SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - SCB_AIRCR_SYSRESETREQ_Msk); - __DSB(); /* Ensure completion of memory access */ - while(1) { __NOP(); } /* wait until reset */ -} - -/*@} end of CMSIS_Core_NVICFunctions */ - - - -/* ################################## SysTick function ############################################ */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. - @{ - */ - -#if (__Vendor_SysTickConfig == 0) - -/** \brief System Tick Configuration - - The function initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - - \param [in] ticks Number of ticks between two interrupts. - - \return 0 Function succeeded. - \return 1 Function failed. - - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. - - */ -__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) -{ - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) {return (1UL);} /* Reload value impossible */ - - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ -} - -#endif - -/*@} end of CMSIS_Core_SysTickFunctions */ - - - - -#ifdef __cplusplus -} -#endif - -#endif /* __CORE_SC000_H_DEPENDANT */ - -#endif /* __CMSIS_GENERIC */ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_crc.h b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_crc.h deleted file mode 100755 index 6089497a..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_crc.h +++ /dev/null @@ -1,249 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_hal_crc.h - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief Header file of CRC HAL module. - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F2xx_HAL_CRC_H -#define __STM32F2xx_HAL_CRC_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal_def.h" - -/** @addtogroup STM32F2xx_HAL_Driver - * @{ - */ - -/** @defgroup CRC CRC - * @brief CRC HAL module driver - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup CRC_Exported_Types CRC Exported Types - * @{ - */ - -/** @defgroup CRC_Exported_Types_Group1 CRC State Structure definition - * @{ - */ -typedef enum -{ - HAL_CRC_STATE_RESET = 0x00, /*!< CRC not yet initialized or disabled */ - HAL_CRC_STATE_READY = 0x01, /*!< CRC initialized and ready for use */ - HAL_CRC_STATE_BUSY = 0x02, /*!< CRC internal process is ongoing */ - HAL_CRC_STATE_TIMEOUT = 0x03, /*!< CRC timeout state */ - HAL_CRC_STATE_ERROR = 0x04 /*!< CRC error state */ - -}HAL_CRC_StateTypeDef; -/** - * @} - */ - -/** @defgroup CRC_Exported_Types_Group2 CRC Handle Structure definition - * @{ - */ -typedef struct -{ - CRC_TypeDef *Instance; /*!< Register base address */ - - HAL_LockTypeDef Lock; /*!< CRC locking object */ - - __IO HAL_CRC_StateTypeDef State; /*!< CRC communication state */ - -}CRC_HandleTypeDef; -/** - * @} - */ - -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup CRC_Exported_Macros CRC Exported Macros - * @{ - */ - -/** @brief Resets CRC handle state - * @param __HANDLE__: CRC handle - * @retval None - */ -#define __HAL_CRC_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_CRC_STATE_RESET) - -/** - * @brief Resets CRC Data Register. - * @param __HANDLE__: CRC handle - * @retval None - */ -#define __HAL_CRC_DR_RESET(__HANDLE__) ((__HANDLE__)->Instance->CR |= CRC_CR_RESET) - -/** - * @brief Stores a 8-bit data in the Independent Data(ID) register. - * @param __HANDLE__: CRC handle - * @param __VALUE__: 8-bit value to be stored in the ID register - * @retval None - */ -#define __HAL_CRC_SET_IDR(__HANDLE__, __VALUE__) (WRITE_REG((__HANDLE__)->Instance->IDR, (__VALUE__))) - -/** - * @brief Returns the 8-bit data stored in the Independent Data(ID) register. - * @param __HANDLE__: CRC handle - * @retval 8-bit value of the ID register - */ -#define __HAL_CRC_GET_IDR(__HANDLE__) (((__HANDLE__)->Instance->IDR) & CRC_IDR_IDR) -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup CRC_Exported_Functions CRC Exported Functions - * @{ - */ - -/** @defgroup CRC_Exported_Functions_Group1 Initialization and de-initialization functions - * @{ - */ -HAL_StatusTypeDef HAL_CRC_Init(CRC_HandleTypeDef *hcrc); -HAL_StatusTypeDef HAL_CRC_DeInit (CRC_HandleTypeDef *hcrc); -void HAL_CRC_MspInit(CRC_HandleTypeDef *hcrc); -void HAL_CRC_MspDeInit(CRC_HandleTypeDef *hcrc); -/** - * @} - */ - -/** @defgroup CRC_Exported_Functions_Group2 Peripheral Control functions - * @{ - */ -uint32_t HAL_CRC_Accumulate(CRC_HandleTypeDef *hcrc, uint32_t pBuffer[], uint32_t BufferLength); -uint32_t HAL_CRC_Calculate(CRC_HandleTypeDef *hcrc, uint32_t pBuffer[], uint32_t BufferLength); -/** - * @} - */ - -/** @defgroup CRC_Exported_Functions_Group3 Peripheral State functions - * @{ - */ -HAL_CRC_StateTypeDef HAL_CRC_GetState(CRC_HandleTypeDef *hcrc); -/** - * @} - */ - -/** - * @} - */ -/* Private types -------------------------------------------------------------*/ -/** @defgroup CRC_Private_Types CRC Private Types - * @{ - */ - -/** - * @} - */ - -/* Private defines -----------------------------------------------------------*/ -/** @defgroup CRC_Private_Defines CRC Private Defines - * @{ - */ - -/** - * @} - */ - -/* Private variables ---------------------------------------------------------*/ -/** @defgroup CRC_Private_Variables CRC Private Variables - * @{ - */ - -/** - * @} - */ - -/* Private constants ---------------------------------------------------------*/ -/** @defgroup CRC_Private_Constants CRC Private Constants - * @{ - */ - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup CRC_Private_Macros CRC Private Macros - * @{ - */ - -/** - * @} - */ - -/* Private functions prototypes ----------------------------------------------*/ -/** @defgroup CRC_Private_Functions_Prototypes CRC Private Functions Prototypes - * @{ - */ - -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup CRC_Private_Functions CRC Private Functions - * @{ - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F2xx_HAL_CRC_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_cryp.h b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_cryp.h deleted file mode 100755 index 6ad71357..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_cryp.h +++ /dev/null @@ -1,536 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_hal_cryp.h - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief Header file of CRYP HAL module. - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F2xx_HAL_CRYP_H -#define __STM32F2xx_HAL_CRYP_H - -#ifdef __cplusplus - extern "C" { -#endif - -#if defined(STM32F215xx) || defined(STM32F217xx) -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal_def.h" - -/** @addtogroup STM32F2xx_HAL_Driver - * @{ - */ - -/** @addtogroup CRYP - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ - -/** @defgroup CRYP_Exported_Types CRYP Exported Types - * @{ - */ - -/** @defgroup CRYP_Exported_Types_Group1 CRYP Configuration Structure definition - * @{ - */ - -typedef struct -{ - uint32_t DataType; /*!< 32-bit data, 16-bit data, 8-bit data or 1-bit string. - This parameter can be a value of @ref CRYP CRYP_Data_Type */ - - uint32_t KeySize; /*!< Used only in AES mode only : 128, 192 or 256 bit key length. - This parameter can be a value of @ref CRYP CRYP_Key_Size */ - - uint8_t* pKey; /*!< The key used for encryption/decryption */ - - uint8_t* pInitVect; /*!< The initialization vector used also as initialization - counter in CTR mode */ - - uint8_t IVSize; /*!< The size of initialization vector. - This parameter (called nonce size in CCM) is used only - in AES-128/192/256 encryption/decryption CCM mode */ - - uint8_t TagSize; /*!< The size of returned authentication TAG. - This parameter is used only in AES-128/192/256 - encryption/decryption CCM mode */ - - uint8_t* Header; /*!< The header used in GCM and CCM modes */ - - uint32_t HeaderSize; /*!< The size of header buffer in bytes */ - - uint8_t* pScratch; /*!< Scratch buffer used to append the header. It's size must be equal to header size + 21 bytes. - This parameter is used only in AES-128/192/256 encryption/decryption CCM mode */ -}CRYP_InitTypeDef; - -/** - * @} - */ - -/** @defgroup CRYP_Exported_Types_Group2 CRYP State structures definition - * @{ - */ - - -typedef enum -{ - HAL_CRYP_STATE_RESET = 0x00, /*!< CRYP not yet initialized or disabled */ - HAL_CRYP_STATE_READY = 0x01, /*!< CRYP initialized and ready for use */ - HAL_CRYP_STATE_BUSY = 0x02, /*!< CRYP internal processing is ongoing */ - HAL_CRYP_STATE_TIMEOUT = 0x03, /*!< CRYP timeout state */ - HAL_CRYP_STATE_ERROR = 0x04 /*!< CRYP error state */ -}HAL_CRYP_STATETypeDef; - -/** - * @} - */ - -/** @defgroup CRYP_Exported_Types_Group3 CRYP phase structures definition - * @{ - */ - - -typedef enum -{ - HAL_CRYP_PHASE_READY = 0x01, /*!< CRYP peripheral is ready for initialization. */ - HAL_CRYP_PHASE_PROCESS = 0x02, /*!< CRYP peripheral is in processing phase */ - HAL_CRYP_PHASE_FINAL = 0x03 /*!< CRYP peripheral is in final phase - This is relevant only with CCM and GCM modes */ -}HAL_PhaseTypeDef; - -/** - * @} - */ - -/** @defgroup CRYP_Exported_Types_Group4 CRYP handle Structure definition - * @{ - */ - -typedef struct -{ - CRYP_TypeDef *Instance; /*!< CRYP registers base address */ - - CRYP_InitTypeDef Init; /*!< CRYP required parameters */ - - uint8_t *pCrypInBuffPtr; /*!< Pointer to CRYP processing (encryption, decryption,...) buffer */ - - uint8_t *pCrypOutBuffPtr; /*!< Pointer to CRYP processing (encryption, decryption,...) buffer */ - - __IO uint16_t CrypInCount; /*!< Counter of input data */ - - __IO uint16_t CrypOutCount; /*!< Counter of outputted data */ - - HAL_StatusTypeDef Status; /*!< CRYP peripheral status */ - - HAL_PhaseTypeDef Phase; /*!< CRYP peripheral phase */ - - DMA_HandleTypeDef *hdmain; /*!< CRYP In DMA handle parameters */ - - DMA_HandleTypeDef *hdmaout; /*!< CRYP Out DMA handle parameters */ - - HAL_LockTypeDef Lock; /*!< CRYP locking object */ - - __IO HAL_CRYP_STATETypeDef State; /*!< CRYP peripheral state */ -}CRYP_HandleTypeDef; - -/** - * @} - */ - -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup CRYP_Exported_Constants CRYP Exported Constants - * @{ - */ - -/** @defgroup CRYP_Exported_Constants_Group1 CRYP CRYP_Key_Size - * @{ - */ -#define CRYP_KEYSIZE_128B ((uint32_t)0x00000000) -#define CRYP_KEYSIZE_192B CRYP_CR_KEYSIZE_0 -#define CRYP_KEYSIZE_256B CRYP_CR_KEYSIZE_1 -/** - * @} - */ - -/** @defgroup CRYP_Exported_Constants_Group2 CRYP CRYP_Data_Type - * @{ - */ -#define CRYP_DATATYPE_32B ((uint32_t)0x00000000) -#define CRYP_DATATYPE_16B CRYP_CR_DATATYPE_0 -#define CRYP_DATATYPE_8B CRYP_CR_DATATYPE_1 -#define CRYP_DATATYPE_1B CRYP_CR_DATATYPE -/** - * @} - */ - -/** @defgroup CRYP_Exported_Constants_Group3 CRYP CRYP_AlgoModeDirection - * @{ - */ -#define CRYP_CR_ALGOMODE_DIRECTION ((uint32_t)0x0008003C) -#define CRYP_CR_ALGOMODE_TDES_ECB_ENCRYPT ((uint32_t)0x00000000) -#define CRYP_CR_ALGOMODE_TDES_ECB_DECRYPT ((uint32_t)0x00000004) -#define CRYP_CR_ALGOMODE_TDES_CBC_ENCRYPT ((uint32_t)0x00000008) -#define CRYP_CR_ALGOMODE_TDES_CBC_DECRYPT ((uint32_t)0x0000000C) -#define CRYP_CR_ALGOMODE_DES_ECB_ENCRYPT ((uint32_t)0x00000010) -#define CRYP_CR_ALGOMODE_DES_ECB_DECRYPT ((uint32_t)0x00000014) -#define CRYP_CR_ALGOMODE_DES_CBC_ENCRYPT ((uint32_t)0x00000018) -#define CRYP_CR_ALGOMODE_DES_CBC_DECRYPT ((uint32_t)0x0000001C) -#define CRYP_CR_ALGOMODE_AES_ECB_ENCRYPT ((uint32_t)0x00000020) -#define CRYP_CR_ALGOMODE_AES_ECB_DECRYPT ((uint32_t)0x00000024) -#define CRYP_CR_ALGOMODE_AES_CBC_ENCRYPT ((uint32_t)0x00000028) -#define CRYP_CR_ALGOMODE_AES_CBC_DECRYPT ((uint32_t)0x0000002C) -#define CRYP_CR_ALGOMODE_AES_CTR_ENCRYPT ((uint32_t)0x00000030) -#define CRYP_CR_ALGOMODE_AES_CTR_DECRYPT ((uint32_t)0x00000034) -/** - * @} - */ - -/** @defgroup CRYP_Exported_Constants_Group4 CRYP CRYP_Interrupt - * @{ - */ -#define CRYP_IT_INI ((uint32_t)CRYP_IMSCR_INIM) /*!< Input FIFO Interrupt */ -#define CRYP_IT_OUTI ((uint32_t)CRYP_IMSCR_OUTIM) /*!< Output FIFO Interrupt */ -/** - * @} - */ - -/** @defgroup CRYP_Exported_Constants_Group5 CRYP CRYP_Flags - * @{ - */ -#define CRYP_FLAG_BUSY ((uint32_t)0x00000010) /*!< The CRYP core is currently - processing a block of data - or a key preparation (for - AES decryption). */ -#define CRYP_FLAG_IFEM ((uint32_t)0x00000001) /*!< Input FIFO is empty */ -#define CRYP_FLAG_IFNF ((uint32_t)0x00000002) /*!< Input FIFO is not Full */ -#define CRYP_FLAG_OFNE ((uint32_t)0x00000004) /*!< Output FIFO is not empty */ -#define CRYP_FLAG_OFFU ((uint32_t)0x00000008) /*!< Output FIFO is Full */ -#define CRYP_FLAG_OUTRIS ((uint32_t)0x01000002) /*!< Output FIFO service raw - interrupt status */ -#define CRYP_FLAG_INRIS ((uint32_t)0x01000001) /*!< Input FIFO service raw - interrupt status */ -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup CRYP_Exported_Macros CRYP Exported Macros - * @{ - */ - -/** @brief Reset CRYP handle state - * @param __HANDLE__: specifies the CRYP handle. - * @retval None - */ -#define __HAL_CRYP_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_CRYP_STATE_RESET) - -/** - * @brief Enable/Disable the CRYP peripheral. - * @param __HANDLE__: specifies the CRYP handle. - * @retval None - */ -#define __HAL_CRYP_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR |= CRYP_CR_CRYPEN) -#define __HAL_CRYP_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR &= ~CRYP_CR_CRYPEN) - -/** - * @brief Flush the data FIFO. - * @param __HANDLE__: specifies the CRYP handle. - * @retval None - */ -#define __HAL_CRYP_FIFO_FLUSH(__HANDLE__) ((__HANDLE__)->Instance->CR |= CRYP_CR_FFLUSH) - -/** - * @brief Set the algorithm mode: AES-ECB, AES-CBC, AES-CTR, DES-ECB, DES-CBC. - * @param __HANDLE__: specifies the CRYP handle. - * @param MODE: The algorithm mode. - * @retval None - */ -#define __HAL_CRYP_SET_MODE(__HANDLE__, MODE) ((__HANDLE__)->Instance->CR |= (uint32_t)(MODE)) - -/** @brief Check whether the specified CRYP flag is set or not. - * @param __HANDLE__: specifies the CRYP handle. - * @param __FLAG__: specifies the flag to check. - * This parameter can be one of the following values: - * @arg CRYP_FLAG_BUSY: The CRYP core is currently processing a block of data - * or a key preparation (for AES decryption). - * @arg CRYP_FLAG_IFEM: Input FIFO is empty - * @arg CRYP_FLAG_IFNF: Input FIFO is not full - * @arg CRYP_FLAG_INRIS: Input FIFO service raw interrupt is pending - * @arg CRYP_FLAG_OFNE: Output FIFO is not empty - * @arg CRYP_FLAG_OFFU: Output FIFO is full - * @arg CRYP_FLAG_OUTRIS: Input FIFO service raw interrupt is pending - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ - -#define __HAL_CRYP_GET_FLAG(__HANDLE__, __FLAG__) ((((uint8_t)((__FLAG__) >> 24)) == 0x01)?((((__HANDLE__)->Instance->RISR) & ((__FLAG__) & CRYP_FLAG_MASK)) == ((__FLAG__) & CRYP_FLAG_MASK)): \ - ((((__HANDLE__)->Instance->RISR) & ((__FLAG__) & CRYP_FLAG_MASK)) == ((__FLAG__) & CRYP_FLAG_MASK))) - -/** @brief Check whether the specified CRYP interrupt is set or not. - * @param __HANDLE__: specifies the CRYP handle. - * @param __INTERRUPT__: specifies the interrupt to check. - * This parameter can be one of the following values: - * @arg CRYP_IT_INRIS: Input FIFO service raw interrupt is pending - * @arg CRYP_IT_OUTRIS: Output FIFO service raw interrupt is pending - * @retval The new state of __INTERRUPT__ (TRUE or FALSE). - */ -#define __HAL_CRYP_GET_IT(__HANDLE__, __INTERRUPT__) (((__HANDLE__)->Instance->MISR & (__INTERRUPT__)) == (__INTERRUPT__)) - -/** - * @brief Enable the CRYP interrupt. - * @param __HANDLE__: specifies the CRYP handle. - * @param __INTERRUPT__: CRYP Interrupt. - * @retval None - */ -#define __HAL_CRYP_ENABLE_IT(__HANDLE__, __INTERRUPT__) (((__HANDLE__)->Instance->IMSCR) |= (__INTERRUPT__)) - -/** - * @brief Disable the CRYP interrupt. - * @param __HANDLE__: specifies the CRYP handle. - * @param __INTERRUPT__: CRYP interrupt. - * @retval None - */ -#define __HAL_CRYP_DISABLE_IT(__HANDLE__, __INTERRUPT__) (((__HANDLE__)->Instance->IMSCR) &= ~(__INTERRUPT__)) - -/** - * @} - */ - - - - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup CRYP_Exported_Functions CRYP Exported Functions - * @{ - */ - -/** @addtogroup CRYP_Exported_Functions_Group1 - * @{ - */ -HAL_StatusTypeDef HAL_CRYP_Init(CRYP_HandleTypeDef *hcryp); -HAL_StatusTypeDef HAL_CRYP_DeInit(CRYP_HandleTypeDef *hcryp); -void HAL_CRYP_MspInit(CRYP_HandleTypeDef *hcryp); -void HAL_CRYP_MspDeInit(CRYP_HandleTypeDef *hcryp); -/** - * @} - */ - -/** @addtogroup CRYP_Exported_Functions_Group2 - * @{ - */ -/* AES encryption/decryption using polling ***********************************/ -HAL_StatusTypeDef HAL_CRYP_AESECB_Encrypt(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData, uint32_t Timeout); -HAL_StatusTypeDef HAL_CRYP_AESECB_Decrypt(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData, uint32_t Timeout); -HAL_StatusTypeDef HAL_CRYP_AESCBC_Encrypt(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData, uint32_t Timeout); -HAL_StatusTypeDef HAL_CRYP_AESCBC_Decrypt(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData, uint32_t Timeout); -HAL_StatusTypeDef HAL_CRYP_AESCTR_Encrypt(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData, uint32_t Timeout); -HAL_StatusTypeDef HAL_CRYP_AESCTR_Decrypt(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData, uint32_t Timeout); - -/* AES encryption/decryption using interrupt *********************************/ -HAL_StatusTypeDef HAL_CRYP_AESECB_Encrypt_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData); -HAL_StatusTypeDef HAL_CRYP_AESCBC_Encrypt_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData); -HAL_StatusTypeDef HAL_CRYP_AESCTR_Encrypt_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData); -HAL_StatusTypeDef HAL_CRYP_AESECB_Decrypt_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData); -HAL_StatusTypeDef HAL_CRYP_AESCTR_Decrypt_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData); -HAL_StatusTypeDef HAL_CRYP_AESCBC_Decrypt_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData); - -/* AES encryption/decryption using DMA ***************************************/ -HAL_StatusTypeDef HAL_CRYP_AESECB_Encrypt_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData); -HAL_StatusTypeDef HAL_CRYP_AESECB_Decrypt_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData); -HAL_StatusTypeDef HAL_CRYP_AESCBC_Encrypt_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData); -HAL_StatusTypeDef HAL_CRYP_AESCBC_Decrypt_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData); -HAL_StatusTypeDef HAL_CRYP_AESCTR_Encrypt_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData); -HAL_StatusTypeDef HAL_CRYP_AESCTR_Decrypt_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData); -/** - * @} - */ - -/** @addtogroup CRYP_Exported_Functions_Group3 - * @{ - */ -/* DES encryption/decryption using polling ***********************************/ -HAL_StatusTypeDef HAL_CRYP_DESECB_Encrypt(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData, uint32_t Timeout); -HAL_StatusTypeDef HAL_CRYP_DESCBC_Encrypt(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData, uint32_t Timeout); -HAL_StatusTypeDef HAL_CRYP_DESECB_Decrypt(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData, uint32_t Timeout); -HAL_StatusTypeDef HAL_CRYP_DESCBC_Decrypt(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData, uint32_t Timeout); - -/* DES encryption/decryption using interrupt *********************************/ -HAL_StatusTypeDef HAL_CRYP_DESECB_Encrypt_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData); -HAL_StatusTypeDef HAL_CRYP_DESECB_Decrypt_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData); -HAL_StatusTypeDef HAL_CRYP_DESCBC_Encrypt_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData); -HAL_StatusTypeDef HAL_CRYP_DESCBC_Decrypt_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData); - -/* DES encryption/decryption using DMA ***************************************/ -HAL_StatusTypeDef HAL_CRYP_DESECB_Encrypt_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData); -HAL_StatusTypeDef HAL_CRYP_DESECB_Decrypt_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData); -HAL_StatusTypeDef HAL_CRYP_DESCBC_Encrypt_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData); -HAL_StatusTypeDef HAL_CRYP_DESCBC_Decrypt_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData); -/** - * @} - */ - -/** @addtogroup CRYP_Exported_Functions_Group4 - * @{ - */ -/* TDES encryption/decryption using polling **********************************/ -HAL_StatusTypeDef HAL_CRYP_TDESECB_Encrypt(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData, uint32_t Timeout); -HAL_StatusTypeDef HAL_CRYP_TDESCBC_Encrypt(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData, uint32_t Timeout); -HAL_StatusTypeDef HAL_CRYP_TDESECB_Decrypt(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData, uint32_t Timeout); -HAL_StatusTypeDef HAL_CRYP_TDESCBC_Decrypt(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData, uint32_t Timeout); - -/* TDES encryption/decryption using interrupt ********************************/ -HAL_StatusTypeDef HAL_CRYP_TDESECB_Encrypt_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData); -HAL_StatusTypeDef HAL_CRYP_TDESECB_Decrypt_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData); -HAL_StatusTypeDef HAL_CRYP_TDESCBC_Encrypt_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData); -HAL_StatusTypeDef HAL_CRYP_TDESCBC_Decrypt_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData); - -/* TDES encryption/decryption using DMA **************************************/ -HAL_StatusTypeDef HAL_CRYP_TDESECB_Encrypt_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData); -HAL_StatusTypeDef HAL_CRYP_TDESECB_Decrypt_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData); -HAL_StatusTypeDef HAL_CRYP_TDESCBC_Encrypt_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData); -HAL_StatusTypeDef HAL_CRYP_TDESCBC_Decrypt_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData); -/** - * @} - */ - -/** @addtogroup CRYP_Exported_Functions_Group5 - * @{ - */ -void HAL_CRYP_InCpltCallback(CRYP_HandleTypeDef *hcryp); -void HAL_CRYP_OutCpltCallback(CRYP_HandleTypeDef *hcryp); -void HAL_CRYP_ErrorCallback(CRYP_HandleTypeDef *hcryp); -/** - * @} - */ - -/** @addtogroup CRYP_Exported_Functions_Group6 - * @{ - */ -void HAL_CRYP_IRQHandler(CRYP_HandleTypeDef *hcryp); -/** - * @} - */ - -/** @addtogroup CRYP_Exported_Functions_Group7 - * @{ - */ -HAL_CRYP_STATETypeDef HAL_CRYP_GetState(CRYP_HandleTypeDef *hcryp); -/** - * @} - */ - -/** - * @} - */ - -/* Private types -------------------------------------------------------------*/ -/** @defgroup CRYP_Private_Types CRYP Private Types - * @{ - */ - -/** - * @} - */ - -/* Private variables ---------------------------------------------------------*/ -/** @defgroup CRYP_Private_Variables CRYP Private Variables - * @{ - */ - -/** - * @} - */ - -/* Private constants ---------------------------------------------------------*/ -/** @defgroup CRYP_Private_Constants CRYP Private Constants - * @{ - */ -#define CRYP_FLAG_MASK ((uint32_t)0x0000001F) -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup CRYP_Private_Macros CRYP Private Macros - * @{ - */ - -#define IS_CRYP_KEYSIZE(__KEYSIZE__) (((__KEYSIZE__) == CRYP_KEYSIZE_128B) || \ - ((__KEYSIZE__) == CRYP_KEYSIZE_192B) || \ - ((__KEYSIZE__) == CRYP_KEYSIZE_256B)) - - -#define IS_CRYP_DATATYPE(__DATATYPE__) (((__DATATYPE__) == CRYP_DATATYPE_32B) || \ - ((__DATATYPE__) == CRYP_DATATYPE_16B) || \ - ((__DATATYPE__) == CRYP_DATATYPE_8B) || \ - ((__DATATYPE__) == CRYP_DATATYPE_1B)) - - - /** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup CRYP_Private_Functions CRYP Private Functions - * @{ - */ - -/** - * @} - */ - -#endif /* STM32F215xx || STM32F217xx */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F2xx_HAL_CRYP_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_dac.h b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_dac.h deleted file mode 100755 index e4cc175e..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_dac.h +++ /dev/null @@ -1,405 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_hal_dac.h - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief Header file of DAC HAL module. - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F2xx_HAL_DAC_H -#define __STM32F2xx_HAL_DAC_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal_def.h" - -/** @addtogroup STM32F2xx_HAL_Driver - * @{ - */ - -/** @addtogroup DAC - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup DAC_Exported_Types DAC Exported Types - * @{ - */ - -/** - * @brief HAL State structures definition - */ -typedef enum -{ - HAL_DAC_STATE_RESET = 0x00, /*!< DAC not yet initialized or disabled */ - HAL_DAC_STATE_READY = 0x01, /*!< DAC initialized and ready for use */ - HAL_DAC_STATE_BUSY = 0x02, /*!< DAC internal processing is ongoing */ - HAL_DAC_STATE_TIMEOUT = 0x03, /*!< DAC timeout state */ - HAL_DAC_STATE_ERROR = 0x04 /*!< DAC error state */ -}HAL_DAC_StateTypeDef; - -/** - * @brief DAC handle Structure definition - */ -typedef struct -{ - DAC_TypeDef *Instance; /*!< Register base address */ - - __IO HAL_DAC_StateTypeDef State; /*!< DAC communication state */ - - HAL_LockTypeDef Lock; /*!< DAC locking object */ - - DMA_HandleTypeDef *DMA_Handle1; /*!< Pointer DMA handler for channel 1 */ - - DMA_HandleTypeDef *DMA_Handle2; /*!< Pointer DMA handler for channel 2 */ - - __IO uint32_t ErrorCode; /*!< DAC Error code */ - -}DAC_HandleTypeDef; - -/** - * @brief DAC Configuration regular Channel structure definition - */ -typedef struct -{ - uint32_t DAC_Trigger; /*!< Specifies the external trigger for the selected DAC channel. - This parameter can be a value of @ref DAC_trigger_selection */ - - uint32_t DAC_OutputBuffer; /*!< Specifies whether the DAC channel output buffer is enabled or disabled. - This parameter can be a value of @ref DAC_output_buffer */ -}DAC_ChannelConfTypeDef; -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup DAC_Exported_Constants DAC Exported Constants - * @{ - */ - -/** @defgroup DAC_Error_Code DAC Error Code - * @{ - */ -#define HAL_DAC_ERROR_NONE 0x00 /*!< No error */ -#define HAL_DAC_ERROR_DMAUNDERRUNCH1 0x01 /*!< DAC channel1 DAM underrun error */ -#define HAL_DAC_ERROR_DMAUNDERRUNCH2 0x02 /*!< DAC channel2 DAM underrun error */ -#define HAL_DAC_ERROR_DMA 0x04 /*!< DMA error */ -/** - * @} - */ - -/** @defgroup DAC_trigger_selection DAC Trigger Selection - * @{ - */ - -#define DAC_TRIGGER_NONE ((uint32_t)0x00000000) /*!< Conversion is automatic once the DAC1_DHRxxxx register - has been loaded, and not by external trigger */ -#define DAC_TRIGGER_T2_TRGO ((uint32_t)(DAC_CR_TSEL1_2 | DAC_CR_TEN1)) /*!< TIM2 TRGO selected as external conversion trigger for DAC channel */ -#define DAC_TRIGGER_T4_TRGO ((uint32_t)(DAC_CR_TSEL1_2 | DAC_CR_TSEL1_0 | DAC_CR_TEN1)) /*!< TIM4 TRGO selected as external conversion trigger for DAC channel */ -#define DAC_TRIGGER_T5_TRGO ((uint32_t)(DAC_CR_TSEL1_1 | DAC_CR_TSEL1_0 | DAC_CR_TEN1)) /*!< TIM5 TRGO selected as external conversion trigger for DAC channel */ -#define DAC_TRIGGER_T6_TRGO ((uint32_t)DAC_CR_TEN1) /*!< TIM6 TRGO selected as external conversion trigger for DAC channel */ -#define DAC_TRIGGER_T7_TRGO ((uint32_t)(DAC_CR_TSEL1_1 | DAC_CR_TEN1)) /*!< TIM7 TRGO selected as external conversion trigger for DAC channel */ -#define DAC_TRIGGER_T8_TRGO ((uint32_t)(DAC_CR_TSEL1_0 | DAC_CR_TEN1)) /*!< TIM8 TRGO selected as external conversion trigger for DAC channel */ - -#define DAC_TRIGGER_EXT_IT9 ((uint32_t)(DAC_CR_TSEL1_2 | DAC_CR_TSEL1_1 | DAC_CR_TEN1)) /*!< EXTI Line9 event selected as external conversion trigger for DAC channel */ -#define DAC_TRIGGER_SOFTWARE ((uint32_t)(DAC_CR_TSEL1 | DAC_CR_TEN1)) /*!< Conversion started by software trigger for DAC channel */ -/** - * @} - */ - -/** @defgroup DAC_output_buffer DAC Output Buffer - * @{ - */ -#define DAC_OUTPUTBUFFER_ENABLE ((uint32_t)0x00000000) -#define DAC_OUTPUTBUFFER_DISABLE ((uint32_t)DAC_CR_BOFF1) -/** - * @} - */ - -/** @defgroup DAC_Channel_selection DAC Channel Selection - * @{ - */ -#define DAC_CHANNEL_1 ((uint32_t)0x00000000) -#define DAC_CHANNEL_2 ((uint32_t)0x00000010) -/** - * @} - */ - -/** @defgroup DAC_data_alignment DAC Data Alignment - * @{ - */ -#define DAC_ALIGN_12B_R ((uint32_t)0x00000000) -#define DAC_ALIGN_12B_L ((uint32_t)0x00000004) -#define DAC_ALIGN_8B_R ((uint32_t)0x00000008) -/** - * @} - */ - -/** @defgroup DAC_flags_definition DAC Flags Definition - * @{ - */ -#define DAC_FLAG_DMAUDR1 ((uint32_t)DAC_SR_DMAUDR1) -#define DAC_FLAG_DMAUDR2 ((uint32_t)DAC_SR_DMAUDR2) -/** - * @} - */ - -/** @defgroup DAC_IT_definition DAC IT Definition - * @{ - */ -#define DAC_IT_DMAUDR1 ((uint32_t)DAC_SR_DMAUDR1) -#define DAC_IT_DMAUDR2 ((uint32_t)DAC_SR_DMAUDR2) -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup DAC_Exported_Macros DAC Exported Macros - * @{ - */ - -/** @brief Reset DAC handle state - * @param __HANDLE__: specifies the DAC handle. - * @retval None - */ -#define __HAL_DAC_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_DAC_STATE_RESET) - -/** @brief Enable the DAC channel - * @param __HANDLE__: specifies the DAC handle. - * @param __DAC_Channel__: specifies the DAC channel - * @retval None - */ -#define __HAL_DAC_ENABLE(__HANDLE__, __DAC_Channel__) ((__HANDLE__)->Instance->CR |= (DAC_CR_EN1 << (__DAC_Channel__))) - -/** @brief Disable the DAC channel - * @param __HANDLE__: specifies the DAC handle - * @param __DAC_Channel__: specifies the DAC channel. - * @retval None - */ -#define __HAL_DAC_DISABLE(__HANDLE__, __DAC_Channel__) ((__HANDLE__)->Instance->CR &= ~(DAC_CR_EN1 << (__DAC_Channel__))) - -/** @brief Enable the DAC interrupt - * @param __HANDLE__: specifies the DAC handle - * @param __INTERRUPT__: specifies the DAC interrupt. - * @retval None - */ -#define __HAL_DAC_ENABLE_IT(__HANDLE__, __INTERRUPT__) (((__HANDLE__)->Instance->CR) |= (__INTERRUPT__)) - -/** @brief Disable the DAC interrupt - * @param __HANDLE__: specifies the DAC handle - * @param __INTERRUPT__: specifies the DAC interrupt. - * @retval None - */ -#define __HAL_DAC_DISABLE_IT(__HANDLE__, __INTERRUPT__) (((__HANDLE__)->Instance->CR) &= ~(__INTERRUPT__)) - -/** @brief Checks if the specified DAC interrupt source is enabled or disabled. - * @param __HANDLE__: DAC handle - * @param __INTERRUPT__: DAC interrupt source to check - * This parameter can be any combination of the following values: - * @arg DAC_IT_DMAUDR1: DAC channel 1 DMA underrun interrupt - * @arg DAC_IT_DMAUDR2: DAC channel 2 DMA underrun interrupt - * @retval State of interruption (SET or RESET) - */ -#define __HAL_DAC_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) (((__HANDLE__)->Instance->CR & (__INTERRUPT__)) == (__INTERRUPT__)) - -/** @brief Get the selected DAC's flag status. - * @param __HANDLE__: specifies the DAC handle. - * @param __FLAG__: specifies the flag to clear. - * This parameter can be any combination of the following values: - * @arg DAC_FLAG_DMAUDR1: DMA underrun 1 flag - * @arg DAC_FLAG_DMAUDR2: DMA underrun 2 flag - * @retval None - */ -#define __HAL_DAC_GET_FLAG(__HANDLE__, __FLAG__) ((((__HANDLE__)->Instance->SR) & (__FLAG__)) == (__FLAG__)) - -/** @brief Clear the DAC's flag. - * @param __HANDLE__: specifies the DAC handle. - * @param __FLAG__: specifies the flag to clear. - * This parameter can be any combination of the following values: - * @arg DAC_FLAG_DMAUDR1: DMA underrun 1 flag - * @arg DAC_FLAG_DMAUDR2: DMA underrun 2 flag - * @retval None - */ -#define __HAL_DAC_CLEAR_FLAG(__HANDLE__, __FLAG__) (((__HANDLE__)->Instance->SR) = (__FLAG__)) -/** - * @} - */ - -/* Include DAC HAL Extension module */ -#include "stm32f2xx_hal_dac_ex.h" - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup DAC_Exported_Functions - * @{ - */ - -/** @addtogroup DAC_Exported_Functions_Group1 - * @{ - */ -/* Initialization/de-initialization functions *********************************/ -HAL_StatusTypeDef HAL_DAC_Init(DAC_HandleTypeDef* hdac); -HAL_StatusTypeDef HAL_DAC_DeInit(DAC_HandleTypeDef* hdac); -void HAL_DAC_MspInit(DAC_HandleTypeDef* hdac); -void HAL_DAC_MspDeInit(DAC_HandleTypeDef* hdac); -/** - * @} - */ - -/** @addtogroup DAC_Exported_Functions_Group2 - * @{ - */ -/* I/O operation functions ****************************************************/ -HAL_StatusTypeDef HAL_DAC_Start(DAC_HandleTypeDef* hdac, uint32_t Channel); -HAL_StatusTypeDef HAL_DAC_Stop(DAC_HandleTypeDef* hdac, uint32_t Channel); -HAL_StatusTypeDef HAL_DAC_Start_DMA(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t* pData, uint32_t Length, uint32_t Alignment); -HAL_StatusTypeDef HAL_DAC_Stop_DMA(DAC_HandleTypeDef* hdac, uint32_t Channel); -uint32_t HAL_DAC_GetValue(DAC_HandleTypeDef* hdac, uint32_t Channel); -/** - * @} - */ - -/** @addtogroup DAC_Exported_Functions_Group3 - * @{ - */ -/* Peripheral Control functions ***********************************************/ -HAL_StatusTypeDef HAL_DAC_ConfigChannel(DAC_HandleTypeDef* hdac, DAC_ChannelConfTypeDef* sConfig, uint32_t Channel); -HAL_StatusTypeDef HAL_DAC_SetValue(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t Alignment, uint32_t Data); -/** - * @} - */ - -/** @addtogroup DAC_Exported_Functions_Group4 - * @{ - */ -/* Peripheral State functions *************************************************/ -HAL_DAC_StateTypeDef HAL_DAC_GetState(DAC_HandleTypeDef* hdac); -void HAL_DAC_IRQHandler(DAC_HandleTypeDef* hdac); -uint32_t HAL_DAC_GetError(DAC_HandleTypeDef *hdac); - -void HAL_DAC_ConvCpltCallbackCh1(DAC_HandleTypeDef* hdac); -void HAL_DAC_ConvHalfCpltCallbackCh1(DAC_HandleTypeDef* hdac); -void HAL_DAC_ErrorCallbackCh1(DAC_HandleTypeDef *hdac); -void HAL_DAC_DMAUnderrunCallbackCh1(DAC_HandleTypeDef *hdac); -/** - * @} - */ - -/** - * @} - */ -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup DAC_Private_Constants DAC Private Constants - * @{ - */ - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup DAC_Private_Macros DAC Private Macros - * @{ - */ -#define IS_DAC_DATA(DATA) ((DATA) <= 0xFFF0) -#define IS_DAC_ALIGN(ALIGN) (((ALIGN) == DAC_ALIGN_12B_R) || \ - ((ALIGN) == DAC_ALIGN_12B_L) || \ - ((ALIGN) == DAC_ALIGN_8B_R)) -#define IS_DAC_CHANNEL(CHANNEL) (((CHANNEL) == DAC_CHANNEL_1) || \ - ((CHANNEL) == DAC_CHANNEL_2)) -#define IS_DAC_OUTPUT_BUFFER_STATE(STATE) (((STATE) == DAC_OUTPUTBUFFER_ENABLE) || \ - ((STATE) == DAC_OUTPUTBUFFER_DISABLE)) - -#define IS_DAC_TRIGGER(TRIGGER) (((TRIGGER) == DAC_TRIGGER_NONE) || \ - ((TRIGGER) == DAC_TRIGGER_T2_TRGO) || \ - ((TRIGGER) == DAC_TRIGGER_T8_TRGO) || \ - ((TRIGGER) == DAC_TRIGGER_T7_TRGO) || \ - ((TRIGGER) == DAC_TRIGGER_T5_TRGO) || \ - ((TRIGGER) == DAC_TRIGGER_T6_TRGO) || \ - ((TRIGGER) == DAC_TRIGGER_T4_TRGO) || \ - ((TRIGGER) == DAC_TRIGGER_EXT_IT9) || \ - ((TRIGGER) == DAC_TRIGGER_SOFTWARE)) - -/** @brief Set DHR12R1 alignment - * @param __ALIGNMENT__: specifies the DAC alignment - * @retval None - */ -#define DAC_DHR12R1_ALIGNMENT(__ALIGNMENT__) (((uint32_t)0x00000008) + (__ALIGNMENT__)) - -/** @brief Set DHR12R2 alignment - * @param __ALIGNMENT__: specifies the DAC alignment - * @retval None - */ -#define DAC_DHR12R2_ALIGNMENT(__ALIGNMENT__) (((uint32_t)0x00000014) + (__ALIGNMENT__)) - -/** @brief Set DHR12RD alignment - * @param __ALIGNMENT__: specifies the DAC alignment - * @retval None - */ -#define DAC_DHR12RD_ALIGNMENT(__ALIGNMENT__) (((uint32_t)0x00000020) + (__ALIGNMENT__)) - -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup DAC_Private_Functions DAC Private Functions - * @{ - */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /*__STM32F2xx_HAL_DAC_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_dac_ex.h b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_dac_ex.h deleted file mode 100755 index dbbad816..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_dac_ex.h +++ /dev/null @@ -1,193 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_hal_dac.h - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief Header file of DAC HAL Extension module. - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F2xx_HAL_DAC_EX_H -#define __STM32F2xx_HAL_DAC_EX_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal_def.h" - -/** @addtogroup STM32F2xx_HAL_Driver - * @{ - */ - -/** @addtogroup DACEx - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/** @defgroup DACEx_Exported_Constants DAC Exported Constants - * @{ - */ - -/** @defgroup DACEx_lfsrunmask_triangleamplitude DAC LFS Run Mask Triangle Amplitude - * @{ - */ -#define DAC_LFSRUNMASK_BIT0 ((uint32_t)0x00000000) /*!< Unmask DAC channel LFSR bit0 for noise wave generation */ -#define DAC_LFSRUNMASK_BITS1_0 ((uint32_t)DAC_CR_MAMP1_0) /*!< Unmask DAC channel LFSR bit[1:0] for noise wave generation */ -#define DAC_LFSRUNMASK_BITS2_0 ((uint32_t)DAC_CR_MAMP1_1) /*!< Unmask DAC channel LFSR bit[2:0] for noise wave generation */ -#define DAC_LFSRUNMASK_BITS3_0 ((uint32_t)DAC_CR_MAMP1_1 | DAC_CR_MAMP1_0)/*!< Unmask DAC channel LFSR bit[3:0] for noise wave generation */ -#define DAC_LFSRUNMASK_BITS4_0 ((uint32_t)DAC_CR_MAMP1_2) /*!< Unmask DAC channel LFSR bit[4:0] for noise wave generation */ -#define DAC_LFSRUNMASK_BITS5_0 ((uint32_t)DAC_CR_MAMP1_2 | DAC_CR_MAMP1_0) /*!< Unmask DAC channel LFSR bit[5:0] for noise wave generation */ -#define DAC_LFSRUNMASK_BITS6_0 ((uint32_t)DAC_CR_MAMP1_2 | DAC_CR_MAMP1_1) /*!< Unmask DAC channel LFSR bit[6:0] for noise wave generation */ -#define DAC_LFSRUNMASK_BITS7_0 ((uint32_t)DAC_CR_MAMP1_2 | DAC_CR_MAMP1_1 | DAC_CR_MAMP1_0) /*!< Unmask DAC channel LFSR bit[7:0] for noise wave generation */ -#define DAC_LFSRUNMASK_BITS8_0 ((uint32_t)DAC_CR_MAMP1_3) /*!< Unmask DAC channel LFSR bit[8:0] for noise wave generation */ -#define DAC_LFSRUNMASK_BITS9_0 ((uint32_t)DAC_CR_MAMP1_3 | DAC_CR_MAMP1_0) /*!< Unmask DAC channel LFSR bit[9:0] for noise wave generation */ -#define DAC_LFSRUNMASK_BITS10_0 ((uint32_t)DAC_CR_MAMP1_3 | DAC_CR_MAMP1_1) /*!< Unmask DAC channel LFSR bit[10:0] for noise wave generation */ -#define DAC_LFSRUNMASK_BITS11_0 ((uint32_t)DAC_CR_MAMP1_3 | DAC_CR_MAMP1_1 | DAC_CR_MAMP1_0) /*!< Unmask DAC channel LFSR bit[11:0] for noise wave generation */ -#define DAC_TRIANGLEAMPLITUDE_1 ((uint32_t)0x00000000) /*!< Select max triangle amplitude of 1 */ -#define DAC_TRIANGLEAMPLITUDE_3 ((uint32_t)DAC_CR_MAMP1_0) /*!< Select max triangle amplitude of 3 */ -#define DAC_TRIANGLEAMPLITUDE_7 ((uint32_t)DAC_CR_MAMP1_1) /*!< Select max triangle amplitude of 7 */ -#define DAC_TRIANGLEAMPLITUDE_15 ((uint32_t)DAC_CR_MAMP1_1 | DAC_CR_MAMP1_0) /*!< Select max triangle amplitude of 15 */ -#define DAC_TRIANGLEAMPLITUDE_31 ((uint32_t)DAC_CR_MAMP1_2) /*!< Select max triangle amplitude of 31 */ -#define DAC_TRIANGLEAMPLITUDE_63 ((uint32_t)DAC_CR_MAMP1_2 | DAC_CR_MAMP1_0) /*!< Select max triangle amplitude of 63 */ -#define DAC_TRIANGLEAMPLITUDE_127 ((uint32_t)DAC_CR_MAMP1_2 | DAC_CR_MAMP1_1) /*!< Select max triangle amplitude of 127 */ -#define DAC_TRIANGLEAMPLITUDE_255 ((uint32_t)DAC_CR_MAMP1_2 | DAC_CR_MAMP1_1 | DAC_CR_MAMP1_0) /*!< Select max triangle amplitude of 255 */ -#define DAC_TRIANGLEAMPLITUDE_511 ((uint32_t)DAC_CR_MAMP1_3) /*!< Select max triangle amplitude of 511 */ -#define DAC_TRIANGLEAMPLITUDE_1023 ((uint32_t)DAC_CR_MAMP1_3 | DAC_CR_MAMP1_0) /*!< Select max triangle amplitude of 1023 */ -#define DAC_TRIANGLEAMPLITUDE_2047 ((uint32_t)DAC_CR_MAMP1_3 | DAC_CR_MAMP1_1) /*!< Select max triangle amplitude of 2047 */ -#define DAC_TRIANGLEAMPLITUDE_4095 ((uint32_t)DAC_CR_MAMP1_3 | DAC_CR_MAMP1_1 | DAC_CR_MAMP1_0) /*!< Select max triangle amplitude of 4095 */ -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup DACEx_Exported_Functions - * @{ - */ - -/** @addtogroup DACEx_Exported_Functions_Group1 - * @{ - */ -/* Extension features functions ***********************************************/ -uint32_t HAL_DACEx_DualGetValue(DAC_HandleTypeDef* hdac); -HAL_StatusTypeDef HAL_DACEx_TriangleWaveGenerate(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t Amplitude); -HAL_StatusTypeDef HAL_DACEx_NoiseWaveGenerate(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t Amplitude); -HAL_StatusTypeDef HAL_DACEx_DualSetValue(DAC_HandleTypeDef* hdac, uint32_t Alignment, uint32_t Data1, uint32_t Data2); - -void HAL_DACEx_ConvCpltCallbackCh2(DAC_HandleTypeDef* hdac); -void HAL_DACEx_ConvHalfCpltCallbackCh2(DAC_HandleTypeDef* hdac); -void HAL_DACEx_ErrorCallbackCh2(DAC_HandleTypeDef* hdac); -void HAL_DACEx_DMAUnderrunCallbackCh2(DAC_HandleTypeDef* hdac); -/** - * @} - */ - -/** - * @} - */ -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup DACEx_Private_Constants DAC Private Constants - * @{ - */ - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup DACEx_Private_Macros DAC Private Macros - * @{ - */ -#define IS_DAC_LFSR_UNMASK_TRIANGLE_AMPLITUDE(VALUE) (((VALUE) == DAC_LFSRUNMASK_BIT0) || \ - ((VALUE) == DAC_LFSRUNMASK_BITS1_0) || \ - ((VALUE) == DAC_LFSRUNMASK_BITS2_0) || \ - ((VALUE) == DAC_LFSRUNMASK_BITS3_0) || \ - ((VALUE) == DAC_LFSRUNMASK_BITS4_0) || \ - ((VALUE) == DAC_LFSRUNMASK_BITS5_0) || \ - ((VALUE) == DAC_LFSRUNMASK_BITS6_0) || \ - ((VALUE) == DAC_LFSRUNMASK_BITS7_0) || \ - ((VALUE) == DAC_LFSRUNMASK_BITS8_0) || \ - ((VALUE) == DAC_LFSRUNMASK_BITS9_0) || \ - ((VALUE) == DAC_LFSRUNMASK_BITS10_0) || \ - ((VALUE) == DAC_LFSRUNMASK_BITS11_0) || \ - ((VALUE) == DAC_TRIANGLEAMPLITUDE_1) || \ - ((VALUE) == DAC_TRIANGLEAMPLITUDE_3) || \ - ((VALUE) == DAC_TRIANGLEAMPLITUDE_7) || \ - ((VALUE) == DAC_TRIANGLEAMPLITUDE_15) || \ - ((VALUE) == DAC_TRIANGLEAMPLITUDE_31) || \ - ((VALUE) == DAC_TRIANGLEAMPLITUDE_63) || \ - ((VALUE) == DAC_TRIANGLEAMPLITUDE_127) || \ - ((VALUE) == DAC_TRIANGLEAMPLITUDE_255) || \ - ((VALUE) == DAC_TRIANGLEAMPLITUDE_511) || \ - ((VALUE) == DAC_TRIANGLEAMPLITUDE_1023) || \ - ((VALUE) == DAC_TRIANGLEAMPLITUDE_2047) || \ - ((VALUE) == DAC_TRIANGLEAMPLITUDE_4095)) - -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup DACEx_Private_Functions DAC Private Functions - * @{ - */ -void DAC_DMAConvCpltCh2(DMA_HandleTypeDef *hdma); -void DAC_DMAErrorCh2(DMA_HandleTypeDef *hdma); -void DAC_DMAHalfConvCpltCh2(DMA_HandleTypeDef *hdma); -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /*__STM32F2xx_HAL_DAC_EX_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_hash.h b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_hash.h deleted file mode 100755 index 2078e3db..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_hash.h +++ /dev/null @@ -1,432 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_hal_hash.h - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief Header file of HASH HAL module. - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F2xx_HAL_HASH_H -#define __STM32F2xx_HAL_HASH_H - -#ifdef __cplusplus - extern "C" { -#endif - -#if defined(STM32F215xx) || defined(STM32F217xx) - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal_def.h" - -/** @addtogroup STM32F2xx_HAL_Driver - * @{ - */ - -/** @addtogroup HASH - * @brief HASH HAL module driver - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup HASH_Exported_Types HASH Exported Types - * @{ - */ - -/** @defgroup HASH_Exported_Types_Group1 HASH Configuration Structure definition - * @{ - */ - -typedef struct -{ - uint32_t DataType; /*!< 32-bit data, 16-bit data, 8-bit data or 1-bit string. - This parameter can be a value of @ref HASH_Data_Type */ - - uint32_t KeySize; /*!< The key size is used only in HMAC operation */ - - uint8_t* pKey; /*!< The key is used only in HMAC operation */ -}HASH_InitTypeDef; - -/** - * @} - */ - -/** @defgroup HASH_Exported_Types_Group2 HASH State structures definition - * @{ - */ - -typedef enum -{ - HAL_HASH_STATE_RESET = 0x00, /*!< HASH not yet initialized or disabled */ - HAL_HASH_STATE_READY = 0x01, /*!< HASH initialized and ready for use */ - HAL_HASH_STATE_BUSY = 0x02, /*!< HASH internal process is ongoing */ - HAL_HASH_STATE_TIMEOUT = 0x03, /*!< HASH timeout state */ - HAL_HASH_STATE_ERROR = 0x04 /*!< HASH error state */ -}HAL_HASH_STATETypeDef; - -/** - * @} - */ - -/** @defgroup HASH_Exported_Types_Group3 HASH phase structures definition - * @{ - */ - -typedef enum -{ - HAL_HASH_PHASE_READY = 0x01, /*!< HASH peripheral is ready for initialization */ - HAL_HASH_PHASE_PROCESS = 0x02, /*!< HASH peripheral is in processing phase */ -}HAL_HASHPhaseTypeDef; - -/** - * @} - */ - -/** @defgroup HASH_Exported_Types_Group4 HASH Handle structures definition - * @{ - */ - -typedef struct -{ - HASH_InitTypeDef Init; /*!< HASH required parameters */ - - uint8_t *pHashInBuffPtr; /*!< Pointer to input buffer */ - - uint8_t *pHashOutBuffPtr; /*!< Pointer to input buffer */ - - __IO uint32_t HashBuffSize; /*!< Size of buffer to be processed */ - - __IO uint32_t HashInCount; /*!< Counter of input data */ - - __IO uint32_t HashITCounter; /*!< Counter of issued interrupts */ - - HAL_StatusTypeDef Status; /*!< HASH peripheral status */ - - HAL_HASHPhaseTypeDef Phase; /*!< HASH peripheral phase */ - - DMA_HandleTypeDef *hdmain; /*!< HASH In DMA handle parameters */ - - HAL_LockTypeDef Lock; /*!< HASH locking object */ - - __IO HAL_HASH_STATETypeDef State; /*!< HASH peripheral state */ -} HASH_HandleTypeDef; - -/** - * @} - */ - - -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup HASH_Exported_Constants HASH Exported Constants - * @{ - */ - -/** @defgroup HASH_Exported_Constants_Group1 HASH Algorithm Selection - * @{ - */ -#define HASH_ALGOSELECTION_SHA1 ((uint32_t)0x0000) /*!< HASH function is SHA1 */ -#define HASH_ALGOSELECTION_MD5 HASH_CR_ALGO_0 /*!< HASH function is MD5 */ -/** - * @} - */ - -/** @defgroup HASH_Exported_Constants_Group2 HASH Algorithm Mode - * @{ - */ -#define HASH_ALGOMODE_HASH ((uint32_t)0x00000000) /*!< Algorithm is HASH */ -#define HASH_ALGOMODE_HMAC HASH_CR_MODE /*!< Algorithm is HMAC */ -/** - * @} - */ - -/** @defgroup HASH_Data_Type HASH Data Type - * @{ - */ -#define HASH_DATATYPE_32B ((uint32_t)0x0000) /*!< 32-bit data. No swapping */ -#define HASH_DATATYPE_16B HASH_CR_DATATYPE_0 /*!< 16-bit data. Each half word is swapped */ -#define HASH_DATATYPE_8B HASH_CR_DATATYPE_1 /*!< 8-bit data. All bytes are swapped */ -#define HASH_DATATYPE_1B HASH_CR_DATATYPE /*!< 1-bit data. In the word all bits are swapped */ -/** - * @} - */ - -/** @defgroup HASH_Exported_Constants_Group4 HASH HMAC Long key - * @brief HASH HMAC Long key used only for HMAC mode - * @{ - */ -#define HASH_HMAC_KEYTYPE_SHORTKEY ((uint32_t)0x00000000) /*!< HMAC Key is <= 64 bytes */ -#define HASH_HMAC_KEYTYPE_LONGKEY HASH_CR_LKEY /*!< HMAC Key is > 64 bytes */ -/** - * @} - */ - -/** @defgroup HASH_Exported_Constants_Group5 HASH Flags definition - * @{ - */ -#define HASH_FLAG_DINIS HASH_SR_DINIS /*!< 16 locations are free in the DIN : A new block can be entered into the input buffer */ -#define HASH_FLAG_DCIS HASH_SR_DCIS /*!< Digest calculation complete */ -#define HASH_FLAG_DMAS HASH_SR_DMAS /*!< DMA interface is enabled (DMAE=1) or a transfer is ongoing */ -#define HASH_FLAG_BUSY HASH_SR_BUSY /*!< The hash core is Busy : processing a block of data */ -#define HASH_FLAG_DINNE HASH_CR_DINNE /*!< DIN not empty : The input buffer contains at least one word of data */ -/** - * @} - */ - -/** @defgroup HASH_Exported_Constants_Group6 HASH Interrupts definition - * @{ - */ -#define HASH_IT_DINI HASH_IMR_DINIE /*!< A new block can be entered into the input buffer (DIN) */ -#define HASH_IT_DCI HASH_IMR_DCIE /*!< Digest calculation complete */ -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup HASH_Exported_Macros HASH Exported Macros - * @{ - */ - -/** @brief Reset HASH handle state - * @param __HANDLE__: specifies the HASH handle. - * @retval None - */ -#define __HAL_HASH_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_HASH_STATE_RESET) - -/** @brief Check whether the specified HASH flag is set or not. - * @param __FLAG__: specifies the flag to check. - * This parameter can be one of the following values: - * @arg HASH_FLAG_DINIS: A new block can be entered into the input buffer. - * @arg HASH_FLAG_DCIS: Digest calculation complete - * @arg HASH_FLAG_DMAS: DMA interface is enabled (DMAE=1) or a transfer is ongoing - * @arg HASH_FLAG_BUSY: The hash core is Busy : processing a block of data - * @arg HASH_FLAG_DINNE: DIN not empty : The input buffer contains at least one word of data - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define __HAL_HASH_GET_FLAG(__FLAG__) (((__FLAG__) > 8U) ? ((HASH->CR & (__FLAG__)) == (__FLAG__)) :\ - ((HASH->SR & (__FLAG__)) == (__FLAG__))) -/** - * @brief Start the digest computation - * @retval None - */ -#define __HAL_HASH_START_DIGEST() HASH->STR |= HASH_STR_DCAL - -/** - * @brief Set the number of valid bits in last word written in Data register - * @param SIZE: size in byte of last data written in Data register. - * @retval None -*/ -#define __HAL_HASH_SET_NBVALIDBITS(SIZE) do{HASH->STR &= ~(HASH_STR_NBLW);\ - HASH->STR |= 8 * ((SIZE) % 4);\ - }while(0) - -/** - * @} - */ - - -/* Exported functions --------------------------------------------------------*/ - -/** @defgroup HASH_Exported_Functions HASH Exported Functions - * @{ - */ - -/** @addtogroup HASH_Exported_Functions_Group1 - * @{ - */ -HAL_StatusTypeDef HAL_HASH_Init(HASH_HandleTypeDef *hhash); -HAL_StatusTypeDef HAL_HASH_DeInit(HASH_HandleTypeDef *hhash); -/** - * @} - */ - -/** @addtogroup HASH_Exported_Functions_Group2 - * @{ - */ -HAL_StatusTypeDef HAL_HASH_SHA1_Start(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size, uint8_t* pOutBuffer, uint32_t Timeout); -HAL_StatusTypeDef HAL_HASH_MD5_Start(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size, uint8_t* pOutBuffer, uint32_t Timeout); -HAL_StatusTypeDef HAL_HASH_MD5_Accumulate(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size); -HAL_StatusTypeDef HAL_HASH_SHA1_Accumulate(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size); -/** - * @} - */ - -/** @addtogroup HASH_Exported_Functions_Group3 - * @{ - */ -HAL_StatusTypeDef HAL_HMAC_SHA1_Start(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size, uint8_t* pOutBuffer, uint32_t Timeout); -HAL_StatusTypeDef HAL_HMAC_MD5_Start(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size, uint8_t* pOutBuffer, uint32_t Timeout); -/** - * @} - */ - -/** @addtogroup HASH_Exported_Functions_Group4 - * @{ - */ -HAL_StatusTypeDef HAL_HASH_SHA1_Start_IT(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size, uint8_t* pOutBuffer); -HAL_StatusTypeDef HAL_HASH_MD5_Start_IT(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size, uint8_t* pOutBuffer); -/** - * @} - */ - -/** @addtogroup HASH_Exported_Functions_Group5 - * @{ - */ -HAL_StatusTypeDef HAL_HASH_SHA1_Start_DMA(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size); -HAL_StatusTypeDef HAL_HASH_SHA1_Finish(HASH_HandleTypeDef *hhash, uint8_t* pOutBuffer, uint32_t Timeout); -HAL_StatusTypeDef HAL_HASH_MD5_Start_DMA(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size); -HAL_StatusTypeDef HAL_HASH_MD5_Finish(HASH_HandleTypeDef *hhash, uint8_t* pOutBuffer, uint32_t Timeout); -/** - * @} - */ - -/** @addtogroup HASH_Exported_Functions_Group6 - * @{ - */ -HAL_StatusTypeDef HAL_HMAC_SHA1_Start_DMA(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size); -HAL_StatusTypeDef HAL_HMAC_MD5_Start_DMA(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size); -/** - * @} - */ - -/** @addtogroup HASH_Exported_Functions_Group7 - * @{ - */ -void HAL_HASH_IRQHandler(HASH_HandleTypeDef *hhash); -/** - * @} - */ - -/** @addtogroup HASH_Exported_Functions_Group8 - * @{ - */ -HAL_HASH_STATETypeDef HAL_HASH_GetState(HASH_HandleTypeDef *hhash); -void HAL_HASH_MspInit(HASH_HandleTypeDef *hhash); -void HAL_HASH_MspDeInit(HASH_HandleTypeDef *hhash); -void HAL_HASH_InCpltCallback(HASH_HandleTypeDef *hhash); -void HAL_HASH_DgstCpltCallback(HASH_HandleTypeDef *hhash); -void HAL_HASH_ErrorCallback(HASH_HandleTypeDef *hhash); -/** - * @} - */ - - /** - * @} - */ - - /* Private types -------------------------------------------------------------*/ -/** @defgroup HASH_Private_Types HASH Private Types - * @{ - */ - -/** - * @} - */ - -/* Private variables ---------------------------------------------------------*/ -/** @defgroup HASH_Private_Variables HASH Private Variables - * @{ - */ - -/** - * @} - */ - -/* Private constants ---------------------------------------------------------*/ -/** @defgroup HASH_Private_Constants HASH Private Constants - * @{ - */ - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup HASH_Private_Macros HASH Private Macros - * @{ - */ -#define IS_HASH_ALGOSELECTION(__ALGOSELECTION__) (((__ALGOSELECTION__) == HASH_ALGOSELECTION_SHA1) || \ - ((__ALGOSELECTION__) == HASH_ALGOSELECTION_MD5)) - - -#define IS_HASH_ALGOMODE(__ALGOMODE__) (((__ALGOMODE__) == HASH_ALGOMODE_HASH) || \ - ((__ALGOMODE__) == HASH_ALGOMODE_HMAC)) - - -#define IS_HASH_DATATYPE(__DATATYPE__) (((__DATATYPE__) == HASH_DATATYPE_32B)|| \ - ((__DATATYPE__) == HASH_DATATYPE_16B)|| \ - ((__DATATYPE__) == HASH_DATATYPE_8B) || \ - ((__DATATYPE__) == HASH_DATATYPE_1B)) - - -#define IS_HASH_HMAC_KEYTYPE(__KEYTYPE__) (((__KEYTYPE__) == HASH_HMAC_KEYTYPE_SHORTKEY) || \ - ((__KEYTYPE__) == HASH_HMAC_KEYTYPE_LONGKEY)) - -#define IS_HASH_SHA1_BUFFER_SIZE(__SIZE__) ((((__SIZE__)%4) != 0)? 0U: 1U) - -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup HASH_Private_Functions HASH Private Functions - * @{ - */ - -/** - * @} - */ - -#endif /* STM32F215xx || STM32F217xx */ -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - - -#endif /* __STM32F2xx_HAL_HASH_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_hcd.h b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_hcd.h deleted file mode 100755 index 2cca6c50..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_hcd.h +++ /dev/null @@ -1,264 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_hal_hcd.h - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief Header file of HCD HAL module. - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F2xx_HAL_HCD_H -#define __STM32F2xx_HAL_HCD_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_ll_usb.h" - -/** @addtogroup STM32F2xx_HAL_Driver - * @{ - */ - -/** @addtogroup HCD - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup HCD_Exported_Types HCD Exported Types - * @{ - */ - -/** @defgroup HCD_Exported_Types_Group1 HCD State Structure definition - * @{ - */ -typedef enum -{ - HAL_HCD_STATE_RESET = 0x00, - HAL_HCD_STATE_READY = 0x01, - HAL_HCD_STATE_ERROR = 0x02, - HAL_HCD_STATE_BUSY = 0x03, - HAL_HCD_STATE_TIMEOUT = 0x04 -} HCD_StateTypeDef; - -typedef USB_OTG_GlobalTypeDef HCD_TypeDef; -typedef USB_OTG_CfgTypeDef HCD_InitTypeDef; -typedef USB_OTG_HCTypeDef HCD_HCTypeDef ; -typedef USB_OTG_URBStateTypeDef HCD_URBStateTypeDef ; -typedef USB_OTG_HCStateTypeDef HCD_HCStateTypeDef ; -/** - * @} - */ - -/** @defgroup HCD_Exported_Types_Group2 HCD Handle Structure definition - * @{ - */ -typedef struct -{ - HCD_TypeDef *Instance; /*!< Register base address */ - HCD_InitTypeDef Init; /*!< HCD required parameters */ - HCD_HCTypeDef hc[15]; /*!< Host channels parameters */ - HAL_LockTypeDef Lock; /*!< HCD peripheral status */ - __IO HCD_StateTypeDef State; /*!< HCD communication state */ - void *pData; /*!< Pointer Stack Handler */ -} HCD_HandleTypeDef; -/** - * @} - */ - -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup HCD_Exported_Constants HCD Exported Constants - * @{ - */ - -/** @defgroup HCD_Speed HCD Speed - * @{ - */ -#define HCD_SPEED_HIGH 0 -#define HCD_SPEED_LOW 2 -#define HCD_SPEED_FULL 3 -/** - * @} - */ - -/** @defgroup HCD_PHY_Module HCD PHY Module - * @{ - */ -#define HCD_PHY_ULPI 1 -#define HCD_PHY_EMBEDDED 2 -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup HCD_Exported_Macros HCD Exported Macros - * @brief macros to handle interrupts and specific clock configurations - * @{ - */ -#define __HAL_HCD_ENABLE(__HANDLE__) USB_EnableGlobalInt ((__HANDLE__)->Instance) -#define __HAL_HCD_DISABLE(__HANDLE__) USB_DisableGlobalInt ((__HANDLE__)->Instance) - -#define __HAL_HCD_GET_FLAG(__HANDLE__, __INTERRUPT__) ((USB_ReadInterrupts((__HANDLE__)->Instance) & (__INTERRUPT__)) == (__INTERRUPT__)) -#define __HAL_HCD_CLEAR_FLAG(__HANDLE__, __INTERRUPT__) (((__HANDLE__)->Instance->GINTSTS) = (__INTERRUPT__)) -#define __HAL_HCD_IS_INVALID_INTERRUPT(__HANDLE__) (USB_ReadInterrupts((__HANDLE__)->Instance) == 0) - -#define __HAL_HCD_CLEAR_HC_INT(chnum, __INTERRUPT__) (USBx_HC(chnum)->HCINT = (__INTERRUPT__)) -#define __HAL_HCD_MASK_HALT_HC_INT(chnum) (USBx_HC(chnum)->HCINTMSK &= ~USB_OTG_HCINTMSK_CHHM) -#define __HAL_HCD_UNMASK_HALT_HC_INT(chnum) (USBx_HC(chnum)->HCINTMSK |= USB_OTG_HCINTMSK_CHHM) -#define __HAL_HCD_MASK_ACK_HC_INT(chnum) (USBx_HC(chnum)->HCINTMSK &= ~USB_OTG_HCINTMSK_ACKM) -#define __HAL_HCD_UNMASK_ACK_HC_INT(chnum) (USBx_HC(chnum)->HCINTMSK |= USB_OTG_HCINTMSK_ACKM) -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup HCD_Exported_Functions HCD Exported Functions - * @{ - */ - -/* Initialization/de-initialization functions ********************************/ -/** @addtogroup HCD_Exported_Functions_Group1 Initialization and de-initialization functions - * @{ - */ -HAL_StatusTypeDef HAL_HCD_Init(HCD_HandleTypeDef *hhcd); -HAL_StatusTypeDef HAL_HCD_DeInit(HCD_HandleTypeDef *hhcd); -HAL_StatusTypeDef HAL_HCD_HC_Init(HCD_HandleTypeDef *hhcd, - uint8_t ch_num, - uint8_t epnum, - uint8_t dev_address, - uint8_t speed, - uint8_t ep_type, - uint16_t mps); - -HAL_StatusTypeDef HAL_HCD_HC_Halt(HCD_HandleTypeDef *hhcd, uint8_t ch_num); - -void HAL_HCD_MspInit(HCD_HandleTypeDef *hhcd); -void HAL_HCD_MspDeInit(HCD_HandleTypeDef *hhcd); -/** - * @} - */ - -/* I/O operation functions ***************************************************/ -/** @addtogroup HCD_Exported_Functions_Group2 Input and Output operation functions - * @{ - */ -HAL_StatusTypeDef HAL_HCD_HC_SubmitRequest(HCD_HandleTypeDef *hhcd, - uint8_t pipe, - uint8_t direction, - uint8_t ep_type, - uint8_t token, - uint8_t* pbuff, - uint16_t length, - uint8_t do_ping); - -/* Non-Blocking mode: Interrupt */ -void HAL_HCD_IRQHandler(HCD_HandleTypeDef *hhcd); -void HAL_HCD_SOF_Callback(HCD_HandleTypeDef *hhcd); -void HAL_HCD_Connect_Callback(HCD_HandleTypeDef *hhcd); -void HAL_HCD_Disconnect_Callback(HCD_HandleTypeDef *hhcd); -void HAL_HCD_HC_NotifyURBChange_Callback(HCD_HandleTypeDef *hhcd, - uint8_t chnum, - HCD_URBStateTypeDef urb_state); -/** - * @} - */ - -/* Peripheral Control functions **********************************************/ -/** @addtogroup HCD_Exported_Functions_Group3 Peripheral Control functions - * @{ - */ -HAL_StatusTypeDef HAL_HCD_ResetPort(HCD_HandleTypeDef *hhcd); -HAL_StatusTypeDef HAL_HCD_Start(HCD_HandleTypeDef *hhcd); -HAL_StatusTypeDef HAL_HCD_Stop(HCD_HandleTypeDef *hhcd); -/** - * @} - */ - -/* Peripheral State functions ************************************************/ -/** @addtogroup HCD_Exported_Functions_Group4 Peripheral State functions - * @{ - */ -HCD_StateTypeDef HAL_HCD_GetState(HCD_HandleTypeDef *hhcd); -HCD_URBStateTypeDef HAL_HCD_HC_GetURBState(HCD_HandleTypeDef *hhcd, uint8_t chnum); -uint32_t HAL_HCD_HC_GetXferCount(HCD_HandleTypeDef *hhcd, uint8_t chnum); -HCD_HCStateTypeDef HAL_HCD_HC_GetState(HCD_HandleTypeDef *hhcd, uint8_t chnum); -uint32_t HAL_HCD_GetCurrentFrame(HCD_HandleTypeDef *hhcd); -uint32_t HAL_HCD_GetCurrentSpeed(HCD_HandleTypeDef *hhcd); -/** - * @} - */ - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup HCD_Private_Macros HCD Private Macros - * @{ - */ -/** @defgroup HCD_Instance_definition HCD Instance definition - * @{ - */ - #define IS_HCD_ALL_INSTANCE(INSTANCE) (((INSTANCE) == USB_OTG_FS) || \ - ((INSTANCE) == USB_OTG_HS)) -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F2xx_HAL_HCD_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_i2c.h b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_i2c.h deleted file mode 100755 index 0027617e..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_i2c.h +++ /dev/null @@ -1,532 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_hal_i2c.h - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief Header file of I2C HAL module. - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F2xx_HAL_I2C_H -#define __STM32F2xx_HAL_I2C_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal_def.h" - -/** @addtogroup STM32F2xx_HAL_Driver - * @{ - */ - -/** @addtogroup I2C - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup I2C_Exported_Types I2C Exported Types - * @{ - */ - -/** - * @brief I2C Configuration Structure definition - */ -typedef struct -{ - uint32_t ClockSpeed; /*!< Specifies the clock frequency. - This parameter must be set to a value lower than 400kHz */ - - uint32_t DutyCycle; /*!< Specifies the I2C fast mode duty cycle. - This parameter can be a value of @ref I2C_duty_cycle_in_fast_mode */ - - uint32_t OwnAddress1; /*!< Specifies the first device own address. - This parameter can be a 7-bit or 10-bit address. */ - - uint32_t AddressingMode; /*!< Specifies if 7-bit or 10-bit addressing mode is selected. - This parameter can be a value of @ref I2C_addressing_mode */ - - uint32_t DualAddressMode; /*!< Specifies if dual addressing mode is selected. - This parameter can be a value of @ref I2C_dual_addressing_mode */ - - uint32_t OwnAddress2; /*!< Specifies the second device own address if dual addressing mode is selected - This parameter can be a 7-bit address. */ - - uint32_t GeneralCallMode; /*!< Specifies if general call mode is selected. - This parameter can be a value of @ref I2C_general_call_addressing_mode */ - - uint32_t NoStretchMode; /*!< Specifies if nostretch mode is selected. - This parameter can be a value of @ref I2C_nostretch_mode */ - -}I2C_InitTypeDef; - -/** - * @brief HAL State structures definition - */ -typedef enum -{ - HAL_I2C_STATE_RESET = 0x00, /*!< I2C not yet initialized or disabled */ - HAL_I2C_STATE_READY = 0x01, /*!< I2C initialized and ready for use */ - HAL_I2C_STATE_BUSY = 0x02, /*!< I2C internal process is ongoing */ - HAL_I2C_STATE_BUSY_TX = 0x12, /*!< Data Transmission process is ongoing */ - HAL_I2C_STATE_BUSY_RX = 0x22, /*!< Data Reception process is ongoing */ - HAL_I2C_STATE_MEM_BUSY_TX = 0x32, /*!< Memory Data Transmission process is ongoing */ - HAL_I2C_STATE_MEM_BUSY_RX = 0x42, /*!< Memory Data Reception process is ongoing */ - HAL_I2C_STATE_TIMEOUT = 0x03, /*!< I2C timeout state */ - HAL_I2C_STATE_ERROR = 0x04 /*!< I2C error state */ - -}HAL_I2C_StateTypeDef; - -/** - * @brief I2C handle Structure definition - */ -typedef struct -{ - I2C_TypeDef *Instance; /*!< I2C registers base address */ - - I2C_InitTypeDef Init; /*!< I2C communication parameters */ - - uint8_t *pBuffPtr; /*!< Pointer to I2C transfer buffer */ - - uint16_t XferSize; /*!< I2C transfer size */ - - __IO uint16_t XferCount; /*!< I2C transfer counter */ - - DMA_HandleTypeDef *hdmatx; /*!< I2C Tx DMA handle parameters */ - - DMA_HandleTypeDef *hdmarx; /*!< I2C Rx DMA handle parameters */ - - HAL_LockTypeDef Lock; /*!< I2C locking object */ - - __IO HAL_I2C_StateTypeDef State; /*!< I2C communication state */ - - __IO uint32_t ErrorCode; /*!< I2C Error code */ - -}I2C_HandleTypeDef; -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup I2C_Exported_Constants I2C Exported Constants - * @{ - */ - -/** @defgroup I2C_Error_Code I2C Error Code - * @brief I2C Error Code - * @{ - */ -#define HAL_I2C_ERROR_NONE ((uint32_t)0x00000000) /*!< No error */ -#define HAL_I2C_ERROR_BERR ((uint32_t)0x00000001) /*!< BERR error */ -#define HAL_I2C_ERROR_ARLO ((uint32_t)0x00000002) /*!< ARLO error */ -#define HAL_I2C_ERROR_AF ((uint32_t)0x00000004) /*!< AF error */ -#define HAL_I2C_ERROR_OVR ((uint32_t)0x00000008) /*!< OVR error */ -#define HAL_I2C_ERROR_DMA ((uint32_t)0x00000010) /*!< DMA transfer error */ -#define HAL_I2C_ERROR_TIMEOUT ((uint32_t)0x00000020) /*!< Timeout Error */ -/** - * @} - */ - -/** @defgroup I2C_duty_cycle_in_fast_mode I2C duty cycle in fast mode - * @{ - */ -#define I2C_DUTYCYCLE_2 ((uint32_t)0x00000000) -#define I2C_DUTYCYCLE_16_9 I2C_CCR_DUTY -/** - * @} - */ - -/** @defgroup I2C_addressing_mode I2C addressing mode - * @{ - */ -#define I2C_ADDRESSINGMODE_7BIT ((uint32_t)0x00004000) -#define I2C_ADDRESSINGMODE_10BIT (I2C_OAR1_ADDMODE | ((uint32_t)0x00004000)) -/** - * @} - */ - -/** @defgroup I2C_dual_addressing_mode I2C dual addressing mode - * @{ - */ -#define I2C_DUALADDRESS_DISABLE ((uint32_t)0x00000000) -#define I2C_DUALADDRESS_ENABLE I2C_OAR2_ENDUAL -/** - * @} - */ - -/** @defgroup I2C_general_call_addressing_mode I2C general call addressing mode - * @{ - */ -#define I2C_GENERALCALL_DISABLE ((uint32_t)0x00000000) -#define I2C_GENERALCALL_ENABLE I2C_CR1_ENGC -/** - * @} - */ - -/** @defgroup I2C_nostretch_mode I2C nostretch mode - * @{ - */ -#define I2C_NOSTRETCH_DISABLE ((uint32_t)0x00000000) -#define I2C_NOSTRETCH_ENABLE I2C_CR1_NOSTRETCH -/** - * @} - */ - -/** @defgroup I2C_Memory_Address_Size I2C Memory Address Size - * @{ - */ -#define I2C_MEMADD_SIZE_8BIT ((uint32_t)0x00000001) -#define I2C_MEMADD_SIZE_16BIT ((uint32_t)0x00000010) -/** - * @} - */ - -/** @defgroup I2C_Interrupt_configuration_definition I2C Interrupt configuration definition - * @{ - */ -#define I2C_IT_BUF I2C_CR2_ITBUFEN -#define I2C_IT_EVT I2C_CR2_ITEVTEN -#define I2C_IT_ERR I2C_CR2_ITERREN -/** - * @} - */ - -/** @defgroup I2C_Flag_definition I2C Flag definition - * @{ - */ -#define I2C_FLAG_SMBALERT ((uint32_t)0x00018000) -#define I2C_FLAG_TIMEOUT ((uint32_t)0x00014000) -#define I2C_FLAG_PECERR ((uint32_t)0x00011000) -#define I2C_FLAG_OVR ((uint32_t)0x00010800) -#define I2C_FLAG_AF ((uint32_t)0x00010400) -#define I2C_FLAG_ARLO ((uint32_t)0x00010200) -#define I2C_FLAG_BERR ((uint32_t)0x00010100) -#define I2C_FLAG_TXE ((uint32_t)0x00010080) -#define I2C_FLAG_RXNE ((uint32_t)0x00010040) -#define I2C_FLAG_STOPF ((uint32_t)0x00010010) -#define I2C_FLAG_ADD10 ((uint32_t)0x00010008) -#define I2C_FLAG_BTF ((uint32_t)0x00010004) -#define I2C_FLAG_ADDR ((uint32_t)0x00010002) -#define I2C_FLAG_SB ((uint32_t)0x00010001) -#define I2C_FLAG_DUALF ((uint32_t)0x00100080) -#define I2C_FLAG_SMBHOST ((uint32_t)0x00100040) -#define I2C_FLAG_SMBDEFAULT ((uint32_t)0x00100020) -#define I2C_FLAG_GENCALL ((uint32_t)0x00100010) -#define I2C_FLAG_TRA ((uint32_t)0x00100004) -#define I2C_FLAG_BUSY ((uint32_t)0x00100002) -#define I2C_FLAG_MSL ((uint32_t)0x00100001) -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup I2C_Exported_Macros I2C Exported Macros - * @{ - */ - -/** @brief Reset I2C handle state - * @param __HANDLE__: specifies the I2C Handle. - * This parameter can be I2C where x: 1, 2, or 3 to select the I2C peripheral. - * @retval None - */ -#define __HAL_I2C_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_I2C_STATE_RESET) - -/** @brief Enable or disable the specified I2C interrupts. - * @param __HANDLE__: specifies the I2C Handle. - * This parameter can be I2C where x: 1, 2, or 3 to select the I2C peripheral. - * @param __INTERRUPT__: specifies the interrupt source to enable or disable. - * This parameter can be one of the following values: - * @arg I2C_IT_BUF: Buffer interrupt enable - * @arg I2C_IT_EVT: Event interrupt enable - * @arg I2C_IT_ERR: Error interrupt enable - * @retval None - */ -#define __HAL_I2C_ENABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->CR2 |= (__INTERRUPT__)) -#define __HAL_I2C_DISABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->CR2 &= (~(__INTERRUPT__))) - -/** @brief Checks if the specified I2C interrupt source is enabled or disabled. - * @param __HANDLE__: specifies the I2C Handle. - * This parameter can be I2C where x: 1, 2, or 3 to select the I2C peripheral. - * @param __INTERRUPT__: specifies the I2C interrupt source to check. - * This parameter can be one of the following values: - * @arg I2C_IT_BUF: Buffer interrupt enable - * @arg I2C_IT_EVT: Event interrupt enable - * @arg I2C_IT_ERR: Error interrupt enable - * @retval The new state of __INTERRUPT__ (TRUE or FALSE). - */ -#define __HAL_I2C_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->CR2 & (__INTERRUPT__)) == (__INTERRUPT__)) ? SET : RESET) - -/** @brief Checks whether the specified I2C flag is set or not. - * @param __HANDLE__: specifies the I2C Handle. - * This parameter can be I2C where x: 1, 2, or 3 to select the I2C peripheral. - * @param __FLAG__: specifies the flag to check. - * This parameter can be one of the following values: - * @arg I2C_FLAG_SMBALERT: SMBus Alert flag - * @arg I2C_FLAG_TIMEOUT: Timeout or Tlow error flag - * @arg I2C_FLAG_PECERR: PEC error in reception flag - * @arg I2C_FLAG_OVR: Overrun/Underrun flag - * @arg I2C_FLAG_AF: Acknowledge failure flag - * @arg I2C_FLAG_ARLO: Arbitration lost flag - * @arg I2C_FLAG_BERR: Bus error flag - * @arg I2C_FLAG_TXE: Data register empty flag - * @arg I2C_FLAG_RXNE: Data register not empty flag - * @arg I2C_FLAG_STOPF: Stop detection flag - * @arg I2C_FLAG_ADD10: 10-bit header sent flag - * @arg I2C_FLAG_BTF: Byte transfer finished flag - * @arg I2C_FLAG_ADDR: Address sent flag - * Address matched flag - * @arg I2C_FLAG_SB: Start bit flag - * @arg I2C_FLAG_DUALF: Dual flag - * @arg I2C_FLAG_SMBHOST: SMBus host header - * @arg I2C_FLAG_SMBDEFAULT: SMBus default header - * @arg I2C_FLAG_GENCALL: General call header flag - * @arg I2C_FLAG_TRA: Transmitter/Receiver flag - * @arg I2C_FLAG_BUSY: Bus busy flag - * @arg I2C_FLAG_MSL: Master/Slave flag - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define __HAL_I2C_GET_FLAG(__HANDLE__, __FLAG__) ((((uint8_t)((__FLAG__) >> 16)) == 0x01)?((((__HANDLE__)->Instance->SR1) & ((__FLAG__) & I2C_FLAG_MASK)) == ((__FLAG__) & I2C_FLAG_MASK)): \ - ((((__HANDLE__)->Instance->SR2) & ((__FLAG__) & I2C_FLAG_MASK)) == ((__FLAG__) & I2C_FLAG_MASK))) - -/** @brief Clears the I2C pending flags which are cleared by writing 0 in a specific bit. - * @param __HANDLE__: specifies the I2C Handle. - * This parameter can be I2C where x: 1, 2, or 3 to select the I2C peripheral. - * @param __FLAG__: specifies the flag to clear. - * This parameter can be any combination of the following values: - * @arg I2C_FLAG_SMBALERT: SMBus Alert flag - * @arg I2C_FLAG_TIMEOUT: Timeout or Tlow error flag - * @arg I2C_FLAG_PECERR: PEC error in reception flag - * @arg I2C_FLAG_OVR: Overrun/Underrun flag (Slave mode) - * @arg I2C_FLAG_AF: Acknowledge failure flag - * @arg I2C_FLAG_ARLO: Arbitration lost flag (Master mode) - * @arg I2C_FLAG_BERR: Bus error flag - * @retval None - */ -#define __HAL_I2C_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->SR1 = ~((__FLAG__) & I2C_FLAG_MASK)) - -/** @brief Clears the I2C ADDR pending flag. - * @param __HANDLE__: specifies the I2C Handle. - * This parameter can be I2C where x: 1, 2, or 3 to select the I2C peripheral. - * @retval None - */ -#define __HAL_I2C_CLEAR_ADDRFLAG(__HANDLE__) \ - do{ \ - __IO uint32_t tmpreg; \ - tmpreg = (__HANDLE__)->Instance->SR1; \ - tmpreg = (__HANDLE__)->Instance->SR2; \ - UNUSED(tmpreg); \ - } while(0) - -/** @brief Clears the I2C STOPF pending flag. - * @param __HANDLE__: specifies the I2C Handle. - * This parameter can be I2C where x: 1, 2, or 3 to select the I2C peripheral. - * @retval None - */ -#define __HAL_I2C_CLEAR_STOPFLAG(__HANDLE__) \ - do{ \ - __IO uint32_t tmpreg; \ - tmpreg = (__HANDLE__)->Instance->SR1; \ - (__HANDLE__)->Instance->CR1 |= I2C_CR1_PE; \ - UNUSED(tmpreg); \ - } while(0) - -#define __HAL_I2C_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1 |= I2C_CR1_PE) -#define __HAL_I2C_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1 &= ~I2C_CR1_PE) - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup I2C_Exported_Functions - * @{ - */ - -/** @addtogroup I2C_Exported_Functions_Group1 - * @{ - */ -/* Initialization/de-initialization functions **********************************/ -HAL_StatusTypeDef HAL_I2C_Init(I2C_HandleTypeDef *hi2c); -HAL_StatusTypeDef HAL_I2C_DeInit (I2C_HandleTypeDef *hi2c); -void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c); -void HAL_I2C_MspDeInit(I2C_HandleTypeDef *hi2c); -/** - * @} - */ - -/** @addtogroup I2C_Exported_Functions_Group2 - * @{ - */ -/* I/O operation functions *****************************************************/ -/******* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_I2C_Slave_Transmit(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_I2C_Slave_Receive(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_I2C_IsDeviceReady(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Trials, uint32_t Timeout); - -/******* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_I2C_Master_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_I2C_Master_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_I2C_Slave_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_I2C_Slave_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_I2C_Mem_Write_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_I2C_Mem_Read_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size); - -/******* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_I2C_Master_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_I2C_Master_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_I2C_Slave_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_I2C_Slave_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_I2C_Mem_Write_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_I2C_Mem_Read_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size); - -/******* I2C IRQHandler and Callbacks used in non blocking modes (Interrupt and DMA) */ -void HAL_I2C_EV_IRQHandler(I2C_HandleTypeDef *hi2c); -void HAL_I2C_ER_IRQHandler(I2C_HandleTypeDef *hi2c); -void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c); -void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c); -void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *hi2c); -void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c); -void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c); -void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c); -void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c); -/** - * @} - */ - -/** @addtogroup I2C_Exported_Functions_Group3 - * @{ - */ -/* Peripheral Control and State functions **************************************/ -HAL_I2C_StateTypeDef HAL_I2C_GetState(I2C_HandleTypeDef *hi2c); -uint32_t HAL_I2C_GetError(I2C_HandleTypeDef *hi2c); - -/** - * @} - */ - -/** - * @} - */ -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup I2C_Private_Constants I2C Private Constants - * @{ - */ -#define I2C_FLAG_MASK ((uint32_t)0x0000FFFF) -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup I2C_Private_Macros I2C Private Macros - * @{ - */ - -#define I2C_FREQRANGE(__PCLK__) ((__PCLK__)/1000000) -#define I2C_RISE_TIME(__FREQRANGE__, __SPEED__) (((__SPEED__) <= 100000) ? ((__FREQRANGE__) + 1) : ((((__FREQRANGE__) * 300) / 1000) + 1)) -#define I2C_SPEED_STANDARD(__PCLK__, __SPEED__) (((((__PCLK__)/((__SPEED__) << 1)) & I2C_CCR_CCR) < 4)? 4:((__PCLK__) / ((__SPEED__) << 1))) -#define I2C_SPEED_FAST(__PCLK__, __SPEED__, __DUTYCYCLE__) (((__DUTYCYCLE__) == I2C_DUTYCYCLE_2)? ((__PCLK__) / ((__SPEED__) * 3)) : (((__PCLK__) / ((__SPEED__) * 25)) | I2C_DUTYCYCLE_16_9)) -#define I2C_SPEED(__PCLK__, __SPEED__, __DUTYCYCLE__) (((__SPEED__) <= 100000)? (I2C_SPEED_STANDARD((__PCLK__), (__SPEED__))) : \ - ((I2C_SPEED_FAST((__PCLK__), (__SPEED__), (__DUTYCYCLE__)) & I2C_CCR_CCR) == 0)? 1 : \ - ((I2C_SPEED_FAST((__PCLK__), (__SPEED__), (__DUTYCYCLE__))) | I2C_CCR_FS)) - -#define I2C_7BIT_ADD_WRITE(__ADDRESS__) ((uint8_t)((__ADDRESS__) & (~I2C_OAR1_ADD0))) -#define I2C_7BIT_ADD_READ(__ADDRESS__) ((uint8_t)((__ADDRESS__) | I2C_OAR1_ADD0)) - -#define I2C_10BIT_ADDRESS(__ADDRESS__) ((uint8_t)((uint16_t)((__ADDRESS__) & (uint16_t)(0x00FF)))) -#define I2C_10BIT_HEADER_WRITE(__ADDRESS__) ((uint8_t)((uint16_t)((uint16_t)(((uint16_t)((__ADDRESS__) & (uint16_t)(0x0300))) >> 7) | (uint16_t)(0xF0)))) -#define I2C_10BIT_HEADER_READ(__ADDRESS__) ((uint8_t)((uint16_t)((uint16_t)(((uint16_t)((__ADDRESS__) & (uint16_t)(0x0300))) >> 7) | (uint16_t)(0xF1)))) - -#define I2C_MEM_ADD_MSB(__ADDRESS__) ((uint8_t)((uint16_t)(((uint16_t)((__ADDRESS__) & (uint16_t)(0xFF00))) >> 8))) -#define I2C_MEM_ADD_LSB(__ADDRESS__) ((uint8_t)((uint16_t)((__ADDRESS__) & (uint16_t)(0x00FF)))) - -/** @defgroup I2C_IS_RTC_Definitions I2C Private macros to check input parameters - * @{ - */ -#define IS_I2C_DUTY_CYCLE(CYCLE) (((CYCLE) == I2C_DUTYCYCLE_2) || \ - ((CYCLE) == I2C_DUTYCYCLE_16_9)) -#define IS_I2C_ADDRESSING_MODE(ADDRESS) (((ADDRESS) == I2C_ADDRESSINGMODE_7BIT) || \ - ((ADDRESS) == I2C_ADDRESSINGMODE_10BIT)) -#define IS_I2C_DUAL_ADDRESS(ADDRESS) (((ADDRESS) == I2C_DUALADDRESS_DISABLE) || \ - ((ADDRESS) == I2C_DUALADDRESS_ENABLE)) -#define IS_I2C_GENERAL_CALL(CALL) (((CALL) == I2C_GENERALCALL_DISABLE) || \ - ((CALL) == I2C_GENERALCALL_ENABLE)) -#define IS_I2C_NO_STRETCH(STRETCH) (((STRETCH) == I2C_NOSTRETCH_DISABLE) || \ - ((STRETCH) == I2C_NOSTRETCH_ENABLE)) -#define IS_I2C_MEMADD_SIZE(SIZE) (((SIZE) == I2C_MEMADD_SIZE_8BIT) || \ - ((SIZE) == I2C_MEMADD_SIZE_16BIT)) -#define IS_I2C_CLOCK_SPEED(SPEED) (((SPEED) > 0) && ((SPEED) <= 400000)) -#define IS_I2C_OWN_ADDRESS1(ADDRESS1) (((ADDRESS1) & (uint32_t)(0xFFFFFC00)) == 0) -#define IS_I2C_OWN_ADDRESS2(ADDRESS2) (((ADDRESS2) & (uint32_t)(0xFFFFFF01)) == 0) -/** - * @} - */ - -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup I2C_Private_Functions I2C Private Functions - * @{ - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - - -#endif /* __STM32F2xx_HAL_I2C_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_i2s.h b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_i2s.h deleted file mode 100755 index cc6c8819..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_i2s.h +++ /dev/null @@ -1,480 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_hal_i2s.h - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief Header file of I2S HAL module. - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F2xx_HAL_I2S_H -#define __STM32F2xx_HAL_I2S_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal_def.h" - -/** @addtogroup STM32F2xx_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 */ - -}I2S_InitTypeDef; - -/** - * @brief HAL State structures definition - */ -typedef enum -{ - HAL_I2S_STATE_RESET = 0x00, /*!< I2S not yet initialized or disabled */ - HAL_I2S_STATE_READY = 0x01, /*!< I2S initialized and ready for use */ - HAL_I2S_STATE_BUSY = 0x02, /*!< I2S internal process is ongoing */ - HAL_I2S_STATE_BUSY_TX = 0x12, /*!< Data Transmission process is ongoing */ - HAL_I2S_STATE_BUSY_RX = 0x22, /*!< Data Reception process is ongoing */ - HAL_I2S_STATE_BUSY_TX_RX = 0x32, /*!< Data Transmission and Reception process is ongoing */ - HAL_I2S_STATE_TIMEOUT = 0x03, /*!< I2S timeout state */ - HAL_I2S_STATE_ERROR = 0x04 /*!< I2S error state */ - -}HAL_I2S_StateTypeDef; - -/** - * @brief I2S handle Structure definition - */ -typedef struct -{ - 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 */ - - 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 */ - -}I2S_HandleTypeDef; -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup I2S_Exported_Constants I2S Exported Constants - * @{ - */ - -/** @defgroup I2S_Error_Code I2S Error Code - * @brief I2S Error Code - * @{ - */ -#define HAL_I2S_ERROR_NONE ((uint32_t)0x00000000) /*!< No error */ -#define HAL_I2S_ERROR_UDR ((uint32_t)0x00000001) /*!< I2S Underrun error */ -#define HAL_I2S_ERROR_OVR ((uint32_t)0x00000002) /*!< I2S Overrun error */ -#define HAL_I2SEX_ERROR_UDR ((uint32_t)0x00000004) /*!< I2S extended Underrun error */ -#define HAL_I2SEX_ERROR_OVR ((uint32_t)0x00000008) /*!< I2S extended Overrun error */ -#define HAL_I2S_ERROR_FRE ((uint32_t)0x00000010) /*!< I2S Frame format error */ -#define HAL_I2S_ERROR_DMA ((uint32_t)0x00000020) /*!< DMA transfer error */ -/** - * @} - */ - -/** @defgroup I2S_Clock_Source I2S Clock Source - * @{ - */ -#define I2S_CLOCK_PLL ((uint32_t)0x00000000) -#define I2S_CLOCK_EXTERNAL ((uint32_t)0x00000001) -/** - * @} - */ - -/** @defgroup I2S_Mode I2S Mode - * @{ - */ -#define I2S_MODE_SLAVE_TX ((uint32_t)0x00000000) -#define I2S_MODE_SLAVE_RX ((uint32_t)0x00000100) -#define I2S_MODE_MASTER_TX ((uint32_t)0x00000200) -#define I2S_MODE_MASTER_RX ((uint32_t)0x00000300) -/** - * @} - */ - -/** @defgroup I2S_Standard I2S Standard - * @{ - */ -#define I2S_STANDARD_PHILIPS ((uint32_t)0x00000000) -#define I2S_STANDARD_MSB ((uint32_t)0x00000010) -#define I2S_STANDARD_LSB ((uint32_t)0x00000020) -#define I2S_STANDARD_PCM_SHORT ((uint32_t)0x00000030) -#define I2S_STANDARD_PCM_LONG ((uint32_t)0x000000B0) -/** - * @} - */ - -/** @defgroup I2S_Data_Format I2S Data Format - * @{ - */ -#define I2S_DATAFORMAT_16B ((uint32_t)0x00000000) -#define I2S_DATAFORMAT_16B_EXTENDED ((uint32_t)0x00000001) -#define I2S_DATAFORMAT_24B ((uint32_t)0x00000003) -#define I2S_DATAFORMAT_32B ((uint32_t)0x00000005) -/** - * @} - */ - -/** @defgroup I2S_MCLK_Output I2S Mclk Output - * @{ - */ -#define I2S_MCLKOUTPUT_ENABLE ((uint32_t)SPI_I2SPR_MCKOE) -#define I2S_MCLKOUTPUT_DISABLE ((uint32_t)0x00000000) -/** - * @} - */ - -/** @defgroup I2S_Audio_Frequency I2S Audio Frequency - * @{ - */ -#define I2S_AUDIOFREQ_192K ((uint32_t)192000) -#define I2S_AUDIOFREQ_96K ((uint32_t)96000) -#define I2S_AUDIOFREQ_48K ((uint32_t)48000) -#define I2S_AUDIOFREQ_44K ((uint32_t)44100) -#define I2S_AUDIOFREQ_32K ((uint32_t)32000) -#define I2S_AUDIOFREQ_22K ((uint32_t)22050) -#define I2S_AUDIOFREQ_16K ((uint32_t)16000) -#define I2S_AUDIOFREQ_11K ((uint32_t)11025) -#define I2S_AUDIOFREQ_8K ((uint32_t)8000) -#define I2S_AUDIOFREQ_DEFAULT ((uint32_t)2) -/** - * @} - */ - -/** @defgroup I2S_Clock_Polarity I2S Clock Polarity - * @{ - */ -#define I2S_CPOL_LOW ((uint32_t)0x00000000) -#define I2S_CPOL_HIGH ((uint32_t)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 -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup I2S_Exported_Macros I2S Exported Macros - * @{ - */ - -/** @brief Reset I2S handle state - * @param __HANDLE__: specifies the I2S Handle. - * @retval None - */ -#define __HAL_I2S_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_I2S_STATE_RESET) - -/** @brief Enable or disable the specified SPI peripheral (in I2S mode). - * @param __HANDLE__: specifies the I2S Handle. - * @retval None - */ -#define __HAL_I2S_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->I2SCFGR |= SPI_I2SCFGR_I2SE) -#define __HAL_I2S_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->I2SCFGR &= ~SPI_I2SCFGR_I2SE) - -/** @brief Enable or 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_ENABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->CR2 |= (__INTERRUPT__)) -#define __HAL_I2S_DISABLE_IT(__HANDLE__, __INTERRUPT__) ((__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; \ - tmpreg = (__HANDLE__)->Instance->DR; \ - tmpreg = (__HANDLE__)->Instance->SR; \ - UNUSED(tmpreg); \ - } while(0) - -/** @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; \ - tmpreg = (__HANDLE__)->Instance->SR; \ - UNUSED(tmpreg); \ - } while(0) -/** - * @} - */ - -/* 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); -/** - * @} - */ - -/** @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); - -/* Peripheral Control and State functions **************************************/ -HAL_I2S_StateTypeDef HAL_I2S_GetState(I2S_HandleTypeDef *hi2s); -uint32_t HAL_I2S_GetError(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); -/** - * @} - */ - -/** - * @} - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup I2S_Private_Constants I2S Private Constants - * @{ - */ - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup I2S_Private_Macros I2S Private Macros - * @{ - */ -#define IS_I2S_CLOCKSOURCE(CLOCK) (((CLOCK) == I2S_CLOCK_EXTERNAL) || \ - ((CLOCK) == I2S_CLOCK_PLL)) - -#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_CPOL(CPOL) (((CPOL) == I2S_CPOL_LOW) || \ - ((CPOL) == I2S_CPOL_HIGH)) - -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup I2S_Private_Functions I2S Private Functions - * @{ - */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - - -#endif /* __STM32F2xx_HAL_I2S_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_irda.h b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_irda.h deleted file mode 100755 index a6da289d..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_irda.h +++ /dev/null @@ -1,537 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_hal_irda.h - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief Header file of IRDA HAL module. - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F2xx_HAL_IRDA_H -#define __STM32F2xx_HAL_IRDA_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal_def.h" - -/** @addtogroup STM32F2xx_HAL_Driver - * @{ - */ - -/** @addtogroup IRDA - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup IRDA_Exported_Types IRDA Exported Types - * @{ - */ -/** - * @brief IRDA Init Structure definition - */ -typedef struct -{ - uint32_t BaudRate; /*!< This member configures the IRDA communication baud rate. - The baud rate is computed using the following formula: - - IntegerDivider = ((PCLKx) / (8 * (hirda->Init.BaudRate))) - - FractionalDivider = ((IntegerDivider - ((uint32_t) IntegerDivider)) * 8) + 0.5 */ - - uint32_t WordLength; /*!< Specifies the number of data bits transmitted or received in a frame. - This parameter can be a value of @ref IRDA_Word_Length */ - - - uint32_t Parity; /*!< Specifies the parity mode. - This parameter can be a value of @ref IRDA_Parity - @note When parity is enabled, the computed parity is inserted - at the MSB position of the transmitted data (9th bit when - the word length is set to 9 data bits; 8th bit when the - word length is set to 8 data bits). */ - - uint32_t Mode; /*!< Specifies wether the Receive or Transmit mode is enabled or disabled. - This parameter can be a value of @ref IRDA_Mode */ - - uint8_t Prescaler; /*!< Specifies the Prescaler */ - - uint32_t IrDAMode; /*!< Specifies the IrDA mode - This parameter can be a value of @ref IRDA_Low_Power */ -}IRDA_InitTypeDef; - -/** - * @brief HAL State structures definition - */ -typedef enum -{ - HAL_IRDA_STATE_RESET = 0x00, /*!< Peripheral is not yet Initialized */ - HAL_IRDA_STATE_READY = 0x01, /*!< Peripheral Initialized and ready for use */ - HAL_IRDA_STATE_BUSY = 0x02, /*!< An internal process is ongoing */ - HAL_IRDA_STATE_BUSY_TX = 0x12, /*!< Data Transmission process is ongoing */ - HAL_IRDA_STATE_BUSY_RX = 0x22, /*!< Data Reception process is ongoing */ - HAL_IRDA_STATE_BUSY_TX_RX = 0x32, /*!< Data Transmission and Reception process is ongoing */ - HAL_IRDA_STATE_TIMEOUT = 0x03, /*!< Timeout state */ - HAL_IRDA_STATE_ERROR = 0x04 /*!< Error */ -}HAL_IRDA_StateTypeDef; - -/** - * @brief IRDA handle Structure definition - */ -typedef struct -{ - USART_TypeDef *Instance; /* USART registers base address */ - - IRDA_InitTypeDef Init; /* IRDA communication parameters */ - - uint8_t *pTxBuffPtr; /* Pointer to IRDA Tx transfer Buffer */ - - uint16_t TxXferSize; /* IRDA Tx Transfer size */ - - uint16_t TxXferCount; /* IRDA Tx Transfer Counter */ - - uint8_t *pRxBuffPtr; /* Pointer to IRDA Rx transfer Buffer */ - - uint16_t RxXferSize; /* IRDA Rx Transfer size */ - - uint16_t RxXferCount; /* IRDA Rx Transfer Counter */ - - DMA_HandleTypeDef *hdmatx; /* IRDA Tx DMA Handle parameters */ - - DMA_HandleTypeDef *hdmarx; /* IRDA Rx DMA Handle parameters */ - - HAL_LockTypeDef Lock; /* Locking object */ - - __IO HAL_IRDA_StateTypeDef State; /* IRDA communication state */ - - __IO uint32_t ErrorCode; /* IRDA Error code */ - -}IRDA_HandleTypeDef; -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup IRDA_Exported_Constants IRDA Exported constants - * @{ - */ -/** @defgroup IRDA_Error_Code IRDA Error Code - * @brief IRDA Error Code - * @{ - */ -#define HAL_IRDA_ERROR_NONE ((uint32_t)0x00000000) /*!< No error */ -#define HAL_IRDA_ERROR_PE ((uint32_t)0x00000001) /*!< Parity error */ -#define HAL_IRDA_ERROR_NE ((uint32_t)0x00000002) /*!< Noise error */ -#define HAL_IRDA_ERROR_FE ((uint32_t)0x00000004) /*!< Frame error */ -#define HAL_IRDA_ERROR_ORE ((uint32_t)0x00000008) /*!< Overrun error */ -#define HAL_IRDA_ERROR_DMA ((uint32_t)0x00000010) /*!< DMA transfer error */ -/** - * @} - */ - -/** @defgroup IRDA_Word_Length IRDA Word Length - * @{ - */ -#define IRDA_WORDLENGTH_8B ((uint32_t)0x00000000) -#define IRDA_WORDLENGTH_9B ((uint32_t)USART_CR1_M) -/** - * @} - */ - -/** @defgroup IRDA_Parity IRDA Parity - * @{ - */ -#define IRDA_PARITY_NONE ((uint32_t)0x00000000) -#define IRDA_PARITY_EVEN ((uint32_t)USART_CR1_PCE) -#define IRDA_PARITY_ODD ((uint32_t)(USART_CR1_PCE | USART_CR1_PS)) -/** - * @} - */ - -/** @defgroup IRDA_Mode IRDA Transfer Mode - * @{ - */ -#define IRDA_MODE_RX ((uint32_t)USART_CR1_RE) -#define IRDA_MODE_TX ((uint32_t)USART_CR1_TE) -#define IRDA_MODE_TX_RX ((uint32_t)(USART_CR1_TE |USART_CR1_RE)) -/** - * @} - */ - -/** @defgroup IRDA_Low_Power IRDA Low Power - * @{ - */ -#define IRDA_POWERMODE_LOWPOWER ((uint32_t)USART_CR3_IRLP) -#define IRDA_POWERMODE_NORMAL ((uint32_t)0x00000000) -/** - * @} - */ - -/** @defgroup IRDA_Flags IRDA Flags - * Elements values convention: 0xXXXX - * - 0xXXXX : Flag mask in the SR register - * @{ - */ -#define IRDA_FLAG_TXE ((uint32_t)0x00000080) -#define IRDA_FLAG_TC ((uint32_t)0x00000040) -#define IRDA_FLAG_RXNE ((uint32_t)0x00000020) -#define IRDA_FLAG_IDLE ((uint32_t)0x00000010) -#define IRDA_FLAG_ORE ((uint32_t)0x00000008) -#define IRDA_FLAG_NE ((uint32_t)0x00000004) -#define IRDA_FLAG_FE ((uint32_t)0x00000002) -#define IRDA_FLAG_PE ((uint32_t)0x00000001) -/** - * @} - */ - -/** @defgroup IRDA_Interrupt_definition IRDA Interrupt Definitions - * Elements values convention: 0xY000XXXX - * - XXXX : Interrupt mask in the XX register - * - Y : Interrupt source register (2bits) - * - 01: CR1 register - * - 10: CR2 register - * - 11: CR3 register - * @{ - */ -#define IRDA_IT_PE ((uint32_t)(IRDA_CR1_REG_INDEX << 28 | USART_CR1_PEIE)) -#define IRDA_IT_TXE ((uint32_t)(IRDA_CR1_REG_INDEX << 28 | USART_CR1_TXEIE)) -#define IRDA_IT_TC ((uint32_t)(IRDA_CR1_REG_INDEX << 28 | USART_CR1_TCIE)) -#define IRDA_IT_RXNE ((uint32_t)(IRDA_CR1_REG_INDEX << 28 | USART_CR1_RXNEIE)) -#define IRDA_IT_IDLE ((uint32_t)(IRDA_CR1_REG_INDEX << 28 | USART_CR1_IDLEIE)) - -#define IRDA_IT_LBD ((uint32_t)(IRDA_CR2_REG_INDEX << 28 | USART_CR2_LBDIE)) - -#define IRDA_IT_CTS ((uint32_t)(IRDA_CR3_REG_INDEX << 28 | USART_CR3_CTSIE)) -#define IRDA_IT_ERR ((uint32_t)(IRDA_CR3_REG_INDEX << 28 | USART_CR3_EIE)) -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup IRDA_Exported_Macros IRDA Exported Macros - * @{ - */ - -/** @brief Reset IRDA handle state - * @param __HANDLE__: specifies the USART Handle. - * This parameter can be USARTx where x: 1, 2, 3, 4, 5, 6, 7 or 8 to select the USART or - * UART peripheral. - * @retval None - */ -#define __HAL_IRDA_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_IRDA_STATE_RESET) - -/** @brief Flushes the IRDA DR register - * @param __HANDLE__: specifies the USART Handle. - * This parameter can be USARTx where x: 1, 2, 3, 4, 5, 6, 7 or 8 to select the USART or - * UART peripheral. - */ -#define __HAL_IRDA_FLUSH_DRREGISTER(__HANDLE__) ((__HANDLE__)->Instance->DR) - -/** @brief Checks whether the specified IRDA flag is set or not. - * @param __HANDLE__: specifies the USART Handle. - * This parameter can be USARTx where x: 1, 2, 3, 4, 5, 6, 7 or 8 to select the USART or - * UART peripheral. - * @param __FLAG__: specifies the flag to check. - * This parameter can be one of the following values: - * @arg IRDA_FLAG_TXE: Transmit data register empty flag - * @arg IRDA_FLAG_TC: Transmission Complete flag - * @arg IRDA_FLAG_RXNE: Receive data register not empty flag - * @arg IRDA_FLAG_IDLE: Idle Line detection flag - * @arg IRDA_FLAG_ORE: OverRun Error flag - * @arg IRDA_FLAG_NE: Noise Error flag - * @arg IRDA_FLAG_FE: Framing Error flag - * @arg IRDA_FLAG_PE: Parity Error flag - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define __HAL_IRDA_GET_FLAG(__HANDLE__, __FLAG__) (((__HANDLE__)->Instance->SR & (__FLAG__)) == (__FLAG__)) - -/** @brief Clears the specified IRDA pending flag. - * @param __HANDLE__: specifies the USART Handle. - * This parameter can be USARTx where x: 1, 2, 3, 4, 5, 6, 7 or 8 to select the USART or - * UART peripheral. - * @param __FLAG__: specifies the flag to check. - * This parameter can be any combination of the following values: - * @arg IRDA_FLAG_TC: Transmission Complete flag. - * @arg IRDA_FLAG_RXNE: Receive data register not empty flag. - * - * @note PE (Parity error), FE (Framing error), NE (Noise error), ORE (OverRun - * error) and IDLE (Idle line detected) flags are cleared by software - * sequence: a read operation to USART_SR register followed by a read - * operation to USART_DR register. - * @note RXNE flag can be also cleared by a read to the USART_DR register. - * @note TC flag can be also cleared by software sequence: a read operation to - * USART_SR register followed by a write operation to USART_DR register. - * @note TXE flag is cleared only by a write to the USART_DR register. - * - * @retval None - */ -#define __HAL_IRDA_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->SR = ~(__FLAG__)) - -/** @brief Clear the IRDA PE pending flag. - * @param __HANDLE__: specifies the USART Handle. - * This parameter can be USARTx where x: 1, 2, 3, 4, 5, 6, 7 or 8 to select the USART or - * UART peripheral. - * @retval None - */ -#define __HAL_IRDA_CLEAR_PEFLAG(__HANDLE__) \ - do{ \ - __IO uint32_t tmpreg; \ - tmpreg = (__HANDLE__)->Instance->SR; \ - UNUSED(tmpreg); \ - } while(0) - -/** @brief Clear the IRDA FE pending flag. - * @param __HANDLE__: specifies the USART Handle. - * This parameter can be USARTx where x: 1, 2, 3, 4, 5, 6, 7 or 8 to select the USART or - * UART peripheral. - * @retval None - */ -#define __HAL_IRDA_CLEAR_FEFLAG(__HANDLE__) __HAL_IRDA_CLEAR_PEFLAG(__HANDLE__) - -/** @brief Clear the IRDA NE pending flag. - * @param __HANDLE__: specifies the USART Handle. - * This parameter can be USARTx where x: 1, 2, 3, 4, 5, 6, 7 or 8 to select the USART or - * UART peripheral. - * @retval None - */ -#define __HAL_IRDA_CLEAR_NEFLAG(__HANDLE__) __HAL_IRDA_CLEAR_PEFLAG(__HANDLE__) - -/** @brief Clear the IRDA ORE pending flag. - * @param __HANDLE__: specifies the USART Handle. - * This parameter can be USARTx where x: 1, 2, 3, 4, 5, 6, 7 or 8 to select the USART or - * UART peripheral. - * @retval None - */ -#define __HAL_IRDA_CLEAR_OREFLAG(__HANDLE__) __HAL_IRDA_CLEAR_PEFLAG(__HANDLE__) - -/** @brief Clear the IRDA IDLE pending flag. - * @param __HANDLE__: specifies the USART Handle. - * This parameter can be USARTx where x: 1, 2, 3, 4, 5, 6, 7 or 8 to select the USART or - * UART peripheral. - * @retval None - */ -#define __HAL_IRDA_CLEAR_IDLEFLAG(__HANDLE__) __HAL_IRDA_CLEAR_PEFLAG(__HANDLE__) - -/** @brief Enables or disables the specified IRDA interrupt. - * @param __HANDLE__: specifies the USART Handle. - * This parameter can be USARTx where x: 1, 2, 3, 4, 5, 6, 7 or 8 to select the USART or - * UART peripheral. - * @param __INTERRUPT__: specifies the IRDA interrupt source to check. - * This parameter can be one of the following values: - * @arg IRDA_IT_TXE: Transmit Data Register empty interrupt - * @arg IRDA_IT_TC: Transmission complete interrupt - * @arg IRDA_IT_RXNE: Receive Data register not empty interrupt - * @arg IRDA_IT_IDLE: Idle line detection interrupt - * @arg IRDA_IT_PE: Parity Error interrupt - * @arg IRDA_IT_ERR: Error interrupt(Frame error, noise error, overrun error) - * @retval None - */ -#define __HAL_IRDA_ENABLE_IT(__HANDLE__, __INTERRUPT__) ((((__INTERRUPT__) >> 28) == 1)? ((__HANDLE__)->Instance->CR1 |= ((__INTERRUPT__) & IRDA_IT_MASK)): \ - (((__INTERRUPT__) >> 28) == 2)? ((__HANDLE__)->Instance->CR2 |= ((__INTERRUPT__) & IRDA_IT_MASK)): \ - ((__HANDLE__)->Instance->CR3 |= ((__INTERRUPT__) & IRDA_IT_MASK))) -#define __HAL_IRDA_DISABLE_IT(__HANDLE__, __INTERRUPT__) ((((__INTERRUPT__) >> 28) == 1)? ((__HANDLE__)->Instance->CR1 &= ~((__INTERRUPT__) & IRDA_IT_MASK)): \ - (((__INTERRUPT__) >> 28) == 2)? ((__HANDLE__)->Instance->CR2 &= ~((__INTERRUPT__) & IRDA_IT_MASK)): \ - ((__HANDLE__)->Instance->CR3 &= ~ ((__INTERRUPT__) & IRDA_IT_MASK))) - -/** @brief Checks whether the specified IRDA interrupt has occurred or not. - * @param __HANDLE__: specifies the USART Handle. - * This parameter can be USARTx where x: 1, 2, 3, 4, 5, 6, 7 or 8 to select the USART or - * UART peripheral. - * @param __IT__: specifies the IRDA interrupt source to check. - * This parameter can be one of the following values: - * @arg IRDA_IT_TXE: Transmit Data Register empty interrupt - * @arg IRDA_IT_TC: Transmission complete interrupt - * @arg IRDA_IT_RXNE: Receive Data register not empty interrupt - * @arg IRDA_IT_IDLE: Idle line detection interrupt - * @arg USART_IT_ERR: Error interrupt - * @arg IRDA_IT_PE: Parity Error interrupt - * @retval The new state of __IT__ (TRUE or FALSE). - */ -#define __HAL_IRDA_GET_IT_SOURCE(__HANDLE__, __IT__) (((((__IT__) >> 28) == 1)? (__HANDLE__)->Instance->CR1:(((((uint32_t)(__IT__)) >> 28) == 2)? \ - (__HANDLE__)->Instance->CR2 : (__HANDLE__)->Instance->CR3)) & (((uint32_t)(__IT__)) & IRDA_IT_MASK)) - -/** @brief Macro to enable the IRDA's one bit sample method - * @param __HANDLE__: specifies the IRDA Handle. - * @retval None - */ -#define __HAL_IRDA_ONE_BIT_SAMPLE_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR3|= USART_CR3_ONEBIT) - -/** @brief Macro to disable the IRDA's one bit sample method - * @param __HANDLE__: specifies the IRDA Handle. - * @retval None - */ -#define __HAL_IRDA_ONE_BIT_SAMPLE_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR3 &= (uint16_t)~((uint16_t)USART_CR3_ONEBIT)) - -/** @brief Enable UART/USART associated to IRDA Handle - * @param __HANDLE__: specifies the IRDA Handle. - * IRDA Handle selects the USARTx or UARTy peripheral - * (USART,UART availability and x,y values depending on device). - * @retval None - */ -#define __HAL_IRDA_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1 |= USART_CR1_UE) - -/** @brief Disable UART/USART associated to IRDA Handle - * @param __HANDLE__: specifies the IRDA Handle. - * IRDA Handle selects the USARTx or UARTy peripheral - * (USART,UART availability and x,y values depending on device). - * @retval None - */ -#define __HAL_IRDA_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1 &= ~USART_CR1_UE) - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup IRDA_Exported_Functions - * @{ - */ - -/** @addtogroup IRDA_Exported_Functions_Group1 - * @{ - */ -/* Initialization/de-initialization functions **********************************/ -HAL_StatusTypeDef HAL_IRDA_Init(IRDA_HandleTypeDef *hirda); -HAL_StatusTypeDef HAL_IRDA_DeInit(IRDA_HandleTypeDef *hirda); -void HAL_IRDA_MspInit(IRDA_HandleTypeDef *hirda); -void HAL_IRDA_MspDeInit(IRDA_HandleTypeDef *hirda); -/** - * @} - */ - -/** @addtogroup IRDA_Exported_Functions_Group2 - * @{ - */ -/* IO operation functions *******************************************************/ -HAL_StatusTypeDef HAL_IRDA_Transmit(IRDA_HandleTypeDef *hirda, uint8_t *pData, uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_IRDA_Receive(IRDA_HandleTypeDef *hirda, uint8_t *pData, uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_IRDA_Transmit_IT(IRDA_HandleTypeDef *hirda, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_IRDA_Receive_IT(IRDA_HandleTypeDef *hirda, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_IRDA_Transmit_DMA(IRDA_HandleTypeDef *hirda, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_IRDA_Receive_DMA(IRDA_HandleTypeDef *hirda, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_IRDA_DMAPause(IRDA_HandleTypeDef *hirda); -HAL_StatusTypeDef HAL_IRDA_DMAResume(IRDA_HandleTypeDef *hirda); -HAL_StatusTypeDef HAL_IRDA_DMAStop(IRDA_HandleTypeDef *hirda); -void HAL_IRDA_IRQHandler(IRDA_HandleTypeDef *hirda); -void HAL_IRDA_TxCpltCallback(IRDA_HandleTypeDef *hirda); -void HAL_IRDA_RxCpltCallback(IRDA_HandleTypeDef *hirda); -void HAL_IRDA_TxHalfCpltCallback(IRDA_HandleTypeDef *hirda); -void HAL_IRDA_RxHalfCpltCallback(IRDA_HandleTypeDef *hirda); -void HAL_IRDA_ErrorCallback(IRDA_HandleTypeDef *hirda); -/** - * @} - */ - -/** @addtogroup IRDA_Exported_Functions_Group3 - * @{ - */ -/* Peripheral State functions **************************************************/ -HAL_IRDA_StateTypeDef HAL_IRDA_GetState(IRDA_HandleTypeDef *hirda); -uint32_t HAL_IRDA_GetError(IRDA_HandleTypeDef *hirda); -/** - * @} - */ - -/** - * @} - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup IRDA_Private_Constants IRDA Private Constants - * @{ - */ - -/** @brief IRDA interruptions flag mask - * - */ -#define IRDA_IT_MASK ((uint32_t) USART_CR1_PEIE | USART_CR1_TXEIE | USART_CR1_TCIE | USART_CR1_RXNEIE | \ - USART_CR1_IDLEIE | USART_CR2_LBDIE | USART_CR3_CTSIE | USART_CR3_EIE ) - -#define IRDA_CR1_REG_INDEX 1 -#define IRDA_CR2_REG_INDEX 2 -#define IRDA_CR3_REG_INDEX 3 -/** - * @} - */ - -/* Private macros --------------------------------------------------------*/ -/** @defgroup IRDA_Private_Macros IRDA Private Macros - * @{ - */ -#define IS_IRDA_WORD_LENGTH(LENGTH) (((LENGTH) == IRDA_WORDLENGTH_8B) || \ - ((LENGTH) == IRDA_WORDLENGTH_9B)) -#define IS_IRDA_PARITY(PARITY) (((PARITY) == IRDA_PARITY_NONE) || \ - ((PARITY) == IRDA_PARITY_EVEN) || \ - ((PARITY) == IRDA_PARITY_ODD)) -#define IS_IRDA_MODE(MODE) ((((MODE) & (uint32_t)0x0000FFF3) == 0x00) && ((MODE) != (uint32_t)0x000000)) -#define IS_IRDA_POWERMODE(MODE) (((MODE) == IRDA_POWERMODE_LOWPOWER) || \ - ((MODE) == IRDA_POWERMODE_NORMAL)) -#define IS_IRDA_BAUDRATE(BAUDRATE) ((BAUDRATE) < 115201) - -#define IRDA_DIV(_PCLK_, _BAUD_) (((_PCLK_)*25)/(4*(_BAUD_))) -#define IRDA_DIVMANT(_PCLK_, _BAUD_) (IRDA_DIV((_PCLK_), (_BAUD_))/100) -#define IRDA_DIVFRAQ(_PCLK_, _BAUD_) (((IRDA_DIV((_PCLK_), (_BAUD_)) - (IRDA_DIVMANT((_PCLK_), (_BAUD_)) * 100)) * 16 + 50) / 100) -#define IRDA_BRR(_PCLK_, _BAUD_) ((IRDA_DIVMANT((_PCLK_), (_BAUD_)) << 4)|(IRDA_DIVFRAQ((_PCLK_), (_BAUD_)) & 0x0F)) - -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup IRDA_Private_Functions IRDA Private Functions - * @{ - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F2xx_HAL_IRDA_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_iwdg.h b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_iwdg.h deleted file mode 100755 index a03716bb..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_iwdg.h +++ /dev/null @@ -1,288 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_hal_iwdg.h - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief Header file of IWDG HAL module. - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F2xx_HAL_IWDG_H -#define __STM32F2xx_HAL_IWDG_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal_def.h" - -/** @addtogroup STM32F2xx_HAL_Driver - * @{ - */ - -/** @addtogroup IWDG - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup IWDG_Exported_Types IWDG Exported Types - * @{ - */ - -/** - * @brief IWDG HAL State Structure definition - */ -typedef enum -{ - HAL_IWDG_STATE_RESET = 0x00, /*!< IWDG not yet initialized or disabled */ - HAL_IWDG_STATE_READY = 0x01, /*!< IWDG initialized and ready for use */ - HAL_IWDG_STATE_BUSY = 0x02, /*!< IWDG internal process is ongoing */ - HAL_IWDG_STATE_TIMEOUT = 0x03, /*!< IWDG timeout state */ - HAL_IWDG_STATE_ERROR = 0x04 /*!< IWDG error state */ -}HAL_IWDG_StateTypeDef; - -/** - * @brief IWDG Init structure definition - */ -typedef struct -{ - uint32_t Prescaler; /*!< Select the prescaler of the IWDG. - This parameter can be a value of @ref IWDG_Prescaler */ - - uint32_t Reload; /*!< Specifies the IWDG down-counter reload value. - This parameter must be a number between Min_Data = 0 and Max_Data = 0x0FFF */ -}IWDG_InitTypeDef; - -/** - * @brief IWDG Handle Structure definition - */ -typedef struct -{ - IWDG_TypeDef *Instance; /*!< Register base address */ - - IWDG_InitTypeDef Init; /*!< IWDG required parameters */ - - HAL_LockTypeDef Lock; /*!< IWDG Locking object */ - - __IO HAL_IWDG_StateTypeDef State; /*!< IWDG communication state */ -}IWDG_HandleTypeDef; - -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup IWDG_Exported_Constants IWDG Exported Constants - * @{ - */ - -/** @defgroup IWDG_Registers_BitMask IWDG Registers BitMask - * @brief IWDG registers bit mask - * @{ - */ -/* --- KR Register ---*/ -/* KR register bit mask */ -#define IWDG_KEY_RELOAD ((uint32_t)0xAAAA) /*!< IWDG Reload Counter Enable */ -#define IWDG_KEY_ENABLE ((uint32_t)0xCCCC) /*!< IWDG Peripheral Enable */ -#define IWDG_KEY_WRITE_ACCESS_ENABLE ((uint32_t)0x5555) /*!< IWDG KR Write Access Enable */ -#define IWDG_KEY_WRITE_ACCESS_DISABLE ((uint32_t)0x0000) /*!< IWDG KR Write Access Disable */ -/** - * @} - */ - -/** @defgroup IWDG_Flag_definition IWDG Flag definition - * @{ - */ -#define IWDG_FLAG_PVU ((uint32_t)IWDG_SR_PVU) /*!< Watchdog counter prescaler value update Flag */ -#define IWDG_FLAG_RVU ((uint32_t)IWDG_SR_RVU) /*!< Watchdog counter reload value update Flag */ -/** - * @} - */ - -/** @defgroup IWDG_Prescaler IWDG Prescaler - * @{ - */ -#define IWDG_PRESCALER_4 ((uint8_t)0x00) /*!< IWDG prescaler set to 4 */ -#define IWDG_PRESCALER_8 ((uint8_t)(IWDG_PR_PR_0)) /*!< IWDG prescaler set to 8 */ -#define IWDG_PRESCALER_16 ((uint8_t)(IWDG_PR_PR_1)) /*!< IWDG prescaler set to 16 */ -#define IWDG_PRESCALER_32 ((uint8_t)(IWDG_PR_PR_1 | IWDG_PR_PR_0)) /*!< IWDG prescaler set to 32 */ -#define IWDG_PRESCALER_64 ((uint8_t)(IWDG_PR_PR_2)) /*!< IWDG prescaler set to 64 */ -#define IWDG_PRESCALER_128 ((uint8_t)(IWDG_PR_PR_2 | IWDG_PR_PR_0)) /*!< IWDG prescaler set to 128 */ -#define IWDG_PRESCALER_256 ((uint8_t)(IWDG_PR_PR_2 | IWDG_PR_PR_1)) /*!< IWDG prescaler set to 256 */ -/** - * @} - */ - -/** - * @} - */ - -/* Exported macros -----------------------------------------------------------*/ -/** @defgroup IWDG_Exported_Macros IWDG Exported Macros - * @{ - */ - -/** @brief Reset IWDG handle state - * @param __HANDLE__: IWDG handle. - * @retval None - */ -#define __HAL_IWDG_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_IWDG_STATE_RESET) - -/** - * @brief Enables the IWDG peripheral. - * @param __HANDLE__: IWDG handle - * @retval None - */ -#define __HAL_IWDG_START(__HANDLE__) WRITE_REG((__HANDLE__)->Instance->KR, IWDG_KEY_ENABLE) - -/** - * @brief Reloads IWDG counter with value defined in the reload register - * (write access to IWDG_PR and IWDG_RLR registers disabled). - * @param __HANDLE__: IWDG handle - * @retval None - */ -#define __HAL_IWDG_RELOAD_COUNTER(__HANDLE__) WRITE_REG((__HANDLE__)->Instance->KR, IWDG_KEY_RELOAD) - -/** - * @brief Gets the selected IWDG's flag status. - * @param __HANDLE__: IWDG handle - * @param __FLAG__: specifies the flag to check. - * This parameter can be one of the following values: - * @arg IWDG_FLAG_PVU: Watchdog counter reload value update flag - * @arg IWDG_FLAG_RVU: Watchdog counter prescaler value flag - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define __HAL_IWDG_GET_FLAG(__HANDLE__, __FLAG__) (((__HANDLE__)->Instance->SR & (__FLAG__)) == (__FLAG__)) - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup IWDG_Exported_Functions - * @{ - */ - -/** @addtogroup IWDG_Exported_Functions_Group1 - * @{ - */ -/* Initialization/de-initialization functions ********************************/ -HAL_StatusTypeDef HAL_IWDG_Init(IWDG_HandleTypeDef *hiwdg); -void HAL_IWDG_MspInit(IWDG_HandleTypeDef *hiwdg); -/** - * @} - */ - -/** @addtogroup IWDG_Exported_Functions_Group2 - * @{ - */ -/* I/O operation functions ****************************************************/ -HAL_StatusTypeDef HAL_IWDG_Start(IWDG_HandleTypeDef *hiwdg); -HAL_StatusTypeDef HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg); -/** - * @} - */ - -/** @addtogroup IWDG_Exported_Functions_Group3 - * @{ - */ -/* Peripheral State functions ************************************************/ -HAL_IWDG_StateTypeDef HAL_IWDG_GetState(IWDG_HandleTypeDef *hiwdg); - -/** - * @} - */ - -/** - * @} - */ - -/* Private macro -------------------------------------------------------------*/ -/** @defgroup IWDG_Private_Macros IWDG Private Macros - * @{ - */ - -/** - * @brief Enables write access to IWDG_PR and IWDG_RLR registers. - * @param __HANDLE__: IWDG handle - * @retval None - */ -#define IWDG_ENABLE_WRITE_ACCESS(__HANDLE__) WRITE_REG((__HANDLE__)->Instance->KR, IWDG_KEY_WRITE_ACCESS_ENABLE) - -/** - * @brief Disables write access to IWDG_PR and IWDG_RLR registers. - * @param __HANDLE__: IWDG handle - * @retval None - */ -#define IWDG_DISABLE_WRITE_ACCESS(__HANDLE__) WRITE_REG((__HANDLE__)->Instance->KR, IWDG_KEY_WRITE_ACCESS_DISABLE) - - -#define IS_IWDG_PRESCALER(__PRESCALER__) (((__PRESCALER__) == IWDG_PRESCALER_4) || \ - ((__PRESCALER__) == IWDG_PRESCALER_8) || \ - ((__PRESCALER__) == IWDG_PRESCALER_16) || \ - ((__PRESCALER__) == IWDG_PRESCALER_32) || \ - ((__PRESCALER__) == IWDG_PRESCALER_64) || \ - ((__PRESCALER__) == IWDG_PRESCALER_128)|| \ - ((__PRESCALER__) == IWDG_PRESCALER_256)) - - -#define IS_IWDG_RELOAD(__RELOAD__) ((__RELOAD__) <= 0xFFF) - -/** - * @} - */ - -/* Private define ------------------------------------------------------------*/ - /** @defgroup IWDG_Private_Constants IWDG Private Constants - * @{ - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F2xx_HAL_IWDG_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_nand.h b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_nand.h deleted file mode 100755 index 1edf1e3f..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_nand.h +++ /dev/null @@ -1,305 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_hal_nand.h - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief Header file of NAND HAL module. - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F2xx_HAL_NAND_H -#define __STM32F2xx_HAL_NAND_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ - #include "stm32f2xx_ll_fsmc.h" - - -/** @addtogroup STM32F2xx_HAL_Driver - * @{ - */ - -/** @addtogroup NAND - * @{ - */ - -/* Exported typedef ----------------------------------------------------------*/ -/* Exported types ------------------------------------------------------------*/ -/** @defgroup NAND_Exported_Types NAND Exported Types - * @{ - */ - -/** - * @brief HAL NAND State structures definition - */ -typedef enum -{ - HAL_NAND_STATE_RESET = 0x00, /*!< NAND not yet initialized or disabled */ - HAL_NAND_STATE_READY = 0x01, /*!< NAND initialized and ready for use */ - HAL_NAND_STATE_BUSY = 0x02, /*!< NAND internal process is ongoing */ - HAL_NAND_STATE_ERROR = 0x03 /*!< NAND error state */ -}HAL_NAND_StateTypeDef; - -/** - * @brief NAND Memory electronic signature Structure definition - */ -typedef struct -{ - /*State = HAL_NAND_STATE_RESET) - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup NAND_Exported_Functions NAND Exported Functions - * @{ - */ - -/** @addtogroup NAND_Exported_Functions_Group1 Initialization and de-initialization functions - * @{ - */ - -/* Initialization/de-initialization functions ********************************/ -HAL_StatusTypeDef HAL_NAND_Init(NAND_HandleTypeDef *hnand, FSMC_NAND_PCC_TimingTypeDef *ComSpace_Timing, FSMC_NAND_PCC_TimingTypeDef *AttSpace_Timing); -HAL_StatusTypeDef HAL_NAND_DeInit(NAND_HandleTypeDef *hnand); -void HAL_NAND_MspInit(NAND_HandleTypeDef *hnand); -void HAL_NAND_MspDeInit(NAND_HandleTypeDef *hnand); -void HAL_NAND_IRQHandler(NAND_HandleTypeDef *hnand); -void HAL_NAND_ITCallback(NAND_HandleTypeDef *hnand); - -/** - * @} - */ - -/** @addtogroup NAND_Exported_Functions_Group2 Input and Output functions - * @{ - */ - -/* IO operation functions ****************************************************/ -HAL_StatusTypeDef HAL_NAND_Read_ID(NAND_HandleTypeDef *hnand, NAND_IDTypeDef *pNAND_ID); -HAL_StatusTypeDef HAL_NAND_Reset(NAND_HandleTypeDef *hnand); -HAL_StatusTypeDef HAL_NAND_Read_Page(NAND_HandleTypeDef *hnand, NAND_AddressTypeDef *pAddress, uint8_t *pBuffer, uint32_t NumPageToRead); -HAL_StatusTypeDef HAL_NAND_Write_Page(NAND_HandleTypeDef *hnand, NAND_AddressTypeDef *pAddress, uint8_t *pBuffer, uint32_t NumPageToWrite); -HAL_StatusTypeDef HAL_NAND_Read_SpareArea(NAND_HandleTypeDef *hnand, NAND_AddressTypeDef *pAddress, uint8_t *pBuffer, uint32_t NumSpareAreaToRead); -HAL_StatusTypeDef HAL_NAND_Write_SpareArea(NAND_HandleTypeDef *hnand, NAND_AddressTypeDef *pAddress, uint8_t *pBuffer, uint32_t NumSpareAreaTowrite); -HAL_StatusTypeDef HAL_NAND_Erase_Block(NAND_HandleTypeDef *hnand, NAND_AddressTypeDef *pAddress); -uint32_t HAL_NAND_Read_Status(NAND_HandleTypeDef *hnand); -uint32_t HAL_NAND_Address_Inc(NAND_HandleTypeDef *hnand, NAND_AddressTypeDef *pAddress); - -/** - * @} - */ - -/** @addtogroup NAND_Exported_Functions_Group3 Peripheral Control functions - * @{ - */ - -/* NAND Control functions ****************************************************/ -HAL_StatusTypeDef HAL_NAND_ECC_Enable(NAND_HandleTypeDef *hnand); -HAL_StatusTypeDef HAL_NAND_ECC_Disable(NAND_HandleTypeDef *hnand); -HAL_StatusTypeDef HAL_NAND_GetECC(NAND_HandleTypeDef *hnand, uint32_t *ECCval, uint32_t Timeout); - -/** - * @} - */ - -/** @addtogroup NAND_Exported_Functions_Group4 Peripheral State functions - * @{ - */ -/* NAND State functions *******************************************************/ -HAL_NAND_StateTypeDef HAL_NAND_GetState(NAND_HandleTypeDef *hnand); -uint32_t HAL_NAND_Read_Status(NAND_HandleTypeDef *hnand); -/** - * @} - */ - -/** - * @} - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup NAND_Private_Constants NAND Private Constants - * @{ - */ -#define NAND_DEVICE1 ((uint32_t)0x70000000) -#define NAND_DEVICE2 ((uint32_t)0x80000000) -#define NAND_WRITE_TIMEOUT ((uint32_t)0x01000000) - -#define CMD_AREA ((uint32_t)(1<<16)) /* A16 = CLE high */ -#define ADDR_AREA ((uint32_t)(1<<17)) /* A17 = ALE high */ - -#define NAND_CMD_AREA_A ((uint8_t)0x00) -#define NAND_CMD_AREA_B ((uint8_t)0x01) -#define NAND_CMD_AREA_C ((uint8_t)0x50) -#define NAND_CMD_AREA_TRUE1 ((uint8_t)0x30) - -#define NAND_CMD_WRITE0 ((uint8_t)0x80) -#define NAND_CMD_WRITE_TRUE1 ((uint8_t)0x10) -#define NAND_CMD_ERASE0 ((uint8_t)0x60) -#define NAND_CMD_ERASE1 ((uint8_t)0xD0) -#define NAND_CMD_READID ((uint8_t)0x90) -#define NAND_CMD_STATUS ((uint8_t)0x70) -#define NAND_CMD_LOCK_STATUS ((uint8_t)0x7A) -#define NAND_CMD_RESET ((uint8_t)0xFF) - -/* NAND memory status */ -#define NAND_VALID_ADDRESS ((uint32_t)0x00000100) -#define NAND_INVALID_ADDRESS ((uint32_t)0x00000200) -#define NAND_TIMEOUT_ERROR ((uint32_t)0x00000400) -#define NAND_BUSY ((uint32_t)0x00000000) -#define NAND_ERROR ((uint32_t)0x00000001) -#define NAND_READY ((uint32_t)0x00000040) -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup NAND_Private_Macros NAND Private Macros - * @{ - */ - -/** - * @brief NAND memory address computation. - * @param __ADDRESS__: NAND memory address. - * @param __HANDLE__ : NAND handle. - * @retval NAND Raw address value - */ -#define ARRAY_ADDRESS(__ADDRESS__ , __HANDLE__) ((__ADDRESS__)->Page + \ - (((__ADDRESS__)->Block + (((__ADDRESS__)->Zone) * ((__HANDLE__)->Info.ZoneSize)))* ((__HANDLE__)->Info.BlockSize))) - -/** - * @brief NAND memory address cycling. - * @param __ADDRESS__: NAND memory address. - * @retval NAND address cycling value. - */ -#define ADDR_1ST_CYCLE(__ADDRESS__) (uint8_t)(__ADDRESS__) /* 1st addressing cycle */ -#define ADDR_2ND_CYCLE(__ADDRESS__) (uint8_t)((__ADDRESS__) >> 8) /* 2nd addressing cycle */ -#define ADDR_3RD_CYCLE(__ADDRESS__) (uint8_t)((__ADDRESS__) >> 16) /* 3rd addressing cycle */ -#define ADDR_4TH_CYCLE(__ADDRESS__) (uint8_t)((__ADDRESS__) >> 24) /* 4th addressing cycle */ -/** - * @} - */ - - -/** - * @} - */ -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F2xx_HAL_NAND_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_pcd.h b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_pcd.h deleted file mode 100755 index 8c25b03c..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_pcd.h +++ /dev/null @@ -1,319 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_hal_pcd.h - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief Header file of PCD HAL module. - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F2xx_HAL_PCD_H -#define __STM32F2xx_HAL_PCD_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_ll_usb.h" - -/** @addtogroup STM32F2xx_HAL_Driver - * @{ - */ - -/** @addtogroup PCD - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup PCD_Exported_Types PCD Exported Types - * @{ - */ - -/** - * @brief PCD State structure definition - */ -typedef enum -{ - HAL_PCD_STATE_RESET = 0x00, - HAL_PCD_STATE_READY = 0x01, - HAL_PCD_STATE_ERROR = 0x02, - HAL_PCD_STATE_BUSY = 0x03, - HAL_PCD_STATE_TIMEOUT = 0x04 -} PCD_StateTypeDef; - -typedef USB_OTG_GlobalTypeDef PCD_TypeDef; -typedef USB_OTG_CfgTypeDef PCD_InitTypeDef; -typedef USB_OTG_EPTypeDef PCD_EPTypeDef ; - -/** - * @brief PCD Handle Structure definition - */ -typedef struct -{ - PCD_TypeDef *Instance; /*!< Register base address */ - PCD_InitTypeDef Init; /*!< PCD required parameters */ - PCD_EPTypeDef IN_ep[15]; /*!< IN endpoint parameters */ - PCD_EPTypeDef OUT_ep[15]; /*!< OUT endpoint parameters */ - HAL_LockTypeDef Lock; /*!< PCD peripheral status */ - __IO PCD_StateTypeDef State; /*!< PCD communication state */ - uint32_t Setup[12]; /*!< Setup packet buffer */ - void *pData; /*!< Pointer to upper stack Handler */ -} PCD_HandleTypeDef; - -/** - * @} - */ - -/* Include PCD HAL Extension module */ -#include "stm32f2xx_hal_pcd_ex.h" - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup PCD_Exported_Constants PCD Exported Constants - * @{ - */ - -/** @defgroup PCD_Speed PCD Speed - * @{ - */ -#define PCD_SPEED_HIGH 0 -#define PCD_SPEED_HIGH_IN_FULL 1 -#define PCD_SPEED_FULL 2 -/** - * @} - */ - -/** @defgroup PCD_PHY_Module PCD PHY Module - * @{ - */ -#define PCD_PHY_ULPI 1 -#define PCD_PHY_EMBEDDED 2 -/** - * @} - */ - -/** @defgroup PCD_Turnaround_Timeout Turnaround Timeout Value - * @{ - */ -#ifndef USBD_HS_TRDT_VALUE - #define USBD_HS_TRDT_VALUE 9 -#endif /* USBD_HS_TRDT_VALUE */ -#ifndef USBD_FS_TRDT_VALUE - #define USBD_FS_TRDT_VALUE 5 -#endif /* USBD_FS_TRDT_VALUE */ -/** - * @} - */ - -/** - * @} - */ - -/* Exported macros -----------------------------------------------------------*/ -/** @defgroup PCD_Exported_Macros PCD Exported Macros - * @brief macros to handle interrupts and specific clock configurations - * @{ - */ -#define __HAL_PCD_ENABLE(__HANDLE__) USB_EnableGlobalInt ((__HANDLE__)->Instance) -#define __HAL_PCD_DISABLE(__HANDLE__) USB_DisableGlobalInt ((__HANDLE__)->Instance) - -#define __HAL_PCD_GET_FLAG(__HANDLE__, __INTERRUPT__) ((USB_ReadInterrupts((__HANDLE__)->Instance) & (__INTERRUPT__)) == (__INTERRUPT__)) -#define __HAL_PCD_CLEAR_FLAG(__HANDLE__, __INTERRUPT__) (((__HANDLE__)->Instance->GINTSTS) = (__INTERRUPT__)) -#define __HAL_PCD_IS_INVALID_INTERRUPT(__HANDLE__) (USB_ReadInterrupts((__HANDLE__)->Instance) == 0) - - -#define __HAL_PCD_UNGATE_PHYCLOCK(__HANDLE__) *(__IO uint32_t *)((uint32_t)((__HANDLE__)->Instance) + USB_OTG_PCGCCTL_BASE) &= \ - ~(USB_OTG_PCGCCTL_STOPCLK) - -#define __HAL_PCD_GATE_PHYCLOCK(__HANDLE__) *(__IO uint32_t *)((uint32_t)((__HANDLE__)->Instance) + USB_OTG_PCGCCTL_BASE) |= USB_OTG_PCGCCTL_STOPCLK - -#define __HAL_PCD_IS_PHY_SUSPENDED(__HANDLE__) ((*(__IO uint32_t *)((uint32_t)((__HANDLE__)->Instance) + USB_OTG_PCGCCTL_BASE))&0x10) - -#define USB_OTG_FS_WAKEUP_EXTI_RISING_EDGE ((uint32_t)0x08) -#define USB_OTG_FS_WAKEUP_EXTI_FALLING_EDGE ((uint32_t)0x0C) -#define USB_OTG_FS_WAKEUP_EXTI_RISING_FALLING_EDGE ((uint32_t)0x10) - -#define USB_OTG_HS_WAKEUP_EXTI_RISING_EDGE ((uint32_t)0x08) -#define USB_OTG_HS_WAKEUP_EXTI_FALLING_EDGE ((uint32_t)0x0C) -#define USB_OTG_HS_WAKEUP_EXTI_RISING_FALLING_EDGE ((uint32_t)0x10) - -#define USB_OTG_HS_WAKEUP_EXTI_LINE ((uint32_t)0x00100000) /*!< External interrupt line 20 Connected to the USB HS EXTI Line */ -#define USB_OTG_FS_WAKEUP_EXTI_LINE ((uint32_t)0x00040000) /*!< External interrupt line 18 Connected to the USB FS EXTI Line */ - -#define __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_IT() EXTI->IMR |= (USB_OTG_HS_WAKEUP_EXTI_LINE) -#define __HAL_USB_OTG_HS_WAKEUP_EXTI_DISABLE_IT() EXTI->IMR &= ~(USB_OTG_HS_WAKEUP_EXTI_LINE) -#define __HAL_USB_OTG_HS_WAKEUP_EXTI_GET_FLAG() EXTI->PR & (USB_OTG_HS_WAKEUP_EXTI_LINE) -#define __HAL_USB_OTG_HS_WAKEUP_EXTI_CLEAR_FLAG() EXTI->PR = (USB_OTG_HS_WAKEUP_EXTI_LINE) - -#define __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_RISING_EDGE() EXTI->FTSR &= ~(USB_OTG_HS_WAKEUP_EXTI_LINE);\ - EXTI->RTSR |= USB_OTG_HS_WAKEUP_EXTI_LINE - -#define __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_FALLING_EDGE() EXTI->FTSR |= (USB_OTG_HS_WAKEUP_EXTI_LINE);\ - EXTI->RTSR &= ~(USB_OTG_HS_WAKEUP_EXTI_LINE) - -#define __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_RISING_FALLING_EDGE() EXTI->RTSR &= ~(USB_OTG_HS_WAKEUP_EXTI_LINE);\ - EXTI->FTSR &= ~(USB_OTG_HS_WAKEUP_EXTI_LINE;)\ - EXTI->RTSR |= USB_OTG_HS_WAKEUP_EXTI_LINE;\ - EXTI->FTSR |= USB_OTG_HS_WAKEUP_EXTI_LINE - -#define __HAL_USB_OTG_HS_WAKEUP_EXTI_GENERATE_SWIT() (EXTI->SWIER |= USB_OTG_FS_WAKEUP_EXTI_LINE) - -#define __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_IT() EXTI->IMR |= USB_OTG_FS_WAKEUP_EXTI_LINE -#define __HAL_USB_OTG_FS_WAKEUP_EXTI_DISABLE_IT() EXTI->IMR &= ~(USB_OTG_FS_WAKEUP_EXTI_LINE) -#define __HAL_USB_OTG_FS_WAKEUP_EXTI_GET_FLAG() EXTI->PR & (USB_OTG_FS_WAKEUP_EXTI_LINE) -#define __HAL_USB_OTG_FS_WAKEUP_EXTI_CLEAR_FLAG() EXTI->PR = USB_OTG_FS_WAKEUP_EXTI_LINE - -#define __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_RISING_EDGE() EXTI->FTSR &= ~(USB_OTG_FS_WAKEUP_EXTI_LINE);\ - EXTI->RTSR |= USB_OTG_FS_WAKEUP_EXTI_LINE - - -#define __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_FALLING_EDGE() EXTI->FTSR |= (USB_OTG_FS_WAKEUP_EXTI_LINE);\ - EXTI->RTSR &= ~(USB_OTG_FS_WAKEUP_EXTI_LINE) - -#define __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_RISING_FALLING_EDGE() EXTI->RTSR &= ~(USB_OTG_FS_WAKEUP_EXTI_LINE);\ - EXTI->FTSR &= ~(USB_OTG_FS_WAKEUP_EXTI_LINE);\ - EXTI->RTSR |= USB_OTG_FS_WAKEUP_EXTI_LINE;\ - EXTI->FTSR |= USB_OTG_FS_WAKEUP_EXTI_LINE - -#define __HAL_USB_OTG_FS_WAKEUP_EXTI_GENERATE_SWIT() (EXTI->SWIER |= USB_OTG_FS_WAKEUP_EXTI_LINE) -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup PCD_Exported_Functions PCD Exported Functions - * @{ - */ - -/* Initialization/de-initialization functions ********************************/ -/** @addtogroup PCD_Exported_Functions_Group1 Initialization and de-initialization functions - * @{ - */ -HAL_StatusTypeDef HAL_PCD_Init(PCD_HandleTypeDef *hpcd); -HAL_StatusTypeDef HAL_PCD_DeInit(PCD_HandleTypeDef *hpcd); -void HAL_PCD_MspInit(PCD_HandleTypeDef *hpcd); -void HAL_PCD_MspDeInit(PCD_HandleTypeDef *hpcd); -/** - * @} - */ - -/* I/O operation functions ***************************************************/ -/* Non-Blocking mode: Interrupt */ -/** @addtogroup PCD_Exported_Functions_Group2 Input and Output operation functions - * @{ - */ -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_PCD_Start(PCD_HandleTypeDef *hpcd); -HAL_StatusTypeDef HAL_PCD_Stop(PCD_HandleTypeDef *hpcd); -void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd); - -void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum); -void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum); -void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd); -void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd); -void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd); -void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd); -void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd); -void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum); -void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum); -void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd); -void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd); -/** - * @} - */ - -/* Peripheral Control functions **********************************************/ -/** @addtogroup PCD_Exported_Functions_Group3 Peripheral Control functions - * @{ - */ -HAL_StatusTypeDef HAL_PCD_DevConnect(PCD_HandleTypeDef *hpcd); -HAL_StatusTypeDef HAL_PCD_DevDisconnect(PCD_HandleTypeDef *hpcd); -HAL_StatusTypeDef HAL_PCD_SetAddress(PCD_HandleTypeDef *hpcd, uint8_t address); -HAL_StatusTypeDef HAL_PCD_EP_Open(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint16_t ep_mps, uint8_t ep_type); -HAL_StatusTypeDef HAL_PCD_EP_Close(PCD_HandleTypeDef *hpcd, uint8_t ep_addr); -HAL_StatusTypeDef HAL_PCD_EP_Receive(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len); -HAL_StatusTypeDef HAL_PCD_EP_Transmit(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len); -uint16_t HAL_PCD_EP_GetRxCount(PCD_HandleTypeDef *hpcd, uint8_t ep_addr); -HAL_StatusTypeDef HAL_PCD_EP_SetStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr); -HAL_StatusTypeDef HAL_PCD_EP_ClrStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr); -HAL_StatusTypeDef HAL_PCD_EP_Flush(PCD_HandleTypeDef *hpcd, uint8_t ep_addr); -HAL_StatusTypeDef HAL_PCD_ActivateRemoteWakeup(PCD_HandleTypeDef *hpcd); -HAL_StatusTypeDef HAL_PCD_DeActivateRemoteWakeup(PCD_HandleTypeDef *hpcd); -/** - * @} - */ - -/* Peripheral State functions ************************************************/ -/** @addtogroup PCD_Exported_Functions_Group4 Peripheral State functions - * @{ - */ -PCD_StateTypeDef HAL_PCD_GetState(PCD_HandleTypeDef *hpcd); -/** - * @} - */ - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup PCD_Private_Macros PCD Private Macros - * @{ - */ -/** @defgroup PCD_Instance_definition PCD Instance definition - * @{ - */ - #define IS_PCD_ALL_INSTANCE(INSTANCE) (((INSTANCE) == USB_OTG_FS) || \ - ((INSTANCE) == USB_OTG_HS)) -/** - * @} - */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - - -#endif /* __STM32F2xx_HAL_PCD_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_pcd_ex.h b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_pcd_ex.h deleted file mode 100755 index 51594491..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_pcd_ex.h +++ /dev/null @@ -1,93 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_hal_pcd_ex.h - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief Header file of PCD HAL module. - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F2xx_HAL_PCD_EX_H -#define __STM32F2xx_HAL_PCD_EX_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal_def.h" - -/** @addtogroup STM32F2xx_HAL_Driver - * @{ - */ - -/** @addtogroup PCDEx - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/* Exported macros -----------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup PCDEx_Exported_Functions - * @{ - */ -/** @addtogroup PCDEx_Exported_Functions_Group1 - * @{ - */ -HAL_StatusTypeDef HAL_PCDEx_SetTxFiFo(PCD_HandleTypeDef *hpcd, uint8_t fifo, uint16_t size); -HAL_StatusTypeDef HAL_PCDEx_SetRxFiFo(PCD_HandleTypeDef *hpcd, uint16_t size); - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - - -#endif /* __STM32F2xx_HAL_PCD_EX_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_sd.h b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_sd.h deleted file mode 100755 index 796ee074..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_sd.h +++ /dev/null @@ -1,789 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_hal_sd.h - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief Header file of SD HAL module. - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F2xx_HAL_SD_H -#define __STM32F2xx_HAL_SD_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_ll_sdmmc.h" - -/** @addtogroup STM32F2xx_HAL_Driver - * @{ - */ - -/** @defgroup SD SD - * @brief SD HAL module driver - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup SD_Exported_Types SD Exported Types - * @{ - */ - -/** @defgroup SD_Exported_Types_Group1 SD Handle Structure definition - * @{ - */ -#define SD_InitTypeDef SDIO_InitTypeDef -#define SD_TypeDef SDIO_TypeDef - -typedef struct -{ - SD_TypeDef *Instance; /*!< SDIO register base address */ - - SD_InitTypeDef Init; /*!< SD required parameters */ - - HAL_LockTypeDef Lock; /*!< SD locking object */ - - uint32_t CardType; /*!< SD card type */ - - uint32_t RCA; /*!< SD relative card address */ - - uint32_t CSD[4]; /*!< SD card specific data table */ - - uint32_t CID[4]; /*!< SD card identification number table */ - - __IO uint32_t SdTransferCplt; /*!< SD transfer complete flag in non blocking mode */ - - __IO uint32_t SdTransferErr; /*!< SD transfer error flag in non blocking mode */ - - __IO uint32_t DmaTransferCplt; /*!< SD DMA transfer complete flag */ - - __IO uint32_t SdOperation; /*!< SD transfer operation (read/write) */ - - DMA_HandleTypeDef *hdmarx; /*!< SD Rx DMA handle parameters */ - - DMA_HandleTypeDef *hdmatx; /*!< SD Tx DMA handle parameters */ - -}SD_HandleTypeDef; -/** - * @} - */ - -/** @defgroup SD_Exported_Types_Group2 Card Specific Data: CSD Register - * @{ - */ -typedef struct -{ - __IO uint8_t CSDStruct; /*!< CSD structure */ - __IO uint8_t SysSpecVersion; /*!< System specification version */ - __IO uint8_t Reserved1; /*!< Reserved */ - __IO uint8_t TAAC; /*!< Data read access time 1 */ - __IO uint8_t NSAC; /*!< Data read access time 2 in CLK cycles */ - __IO uint8_t MaxBusClkFrec; /*!< Max. bus clock frequency */ - __IO uint16_t CardComdClasses; /*!< Card command classes */ - __IO uint8_t RdBlockLen; /*!< Max. read data block length */ - __IO uint8_t PartBlockRead; /*!< Partial blocks for read allowed */ - __IO uint8_t WrBlockMisalign; /*!< Write block misalignment */ - __IO uint8_t RdBlockMisalign; /*!< Read block misalignment */ - __IO uint8_t DSRImpl; /*!< DSR implemented */ - __IO uint8_t Reserved2; /*!< Reserved */ - __IO uint32_t DeviceSize; /*!< Device Size */ - __IO uint8_t MaxRdCurrentVDDMin; /*!< Max. read current @ VDD min */ - __IO uint8_t MaxRdCurrentVDDMax; /*!< Max. read current @ VDD max */ - __IO uint8_t MaxWrCurrentVDDMin; /*!< Max. write current @ VDD min */ - __IO uint8_t MaxWrCurrentVDDMax; /*!< Max. write current @ VDD max */ - __IO uint8_t DeviceSizeMul; /*!< Device size multiplier */ - __IO uint8_t EraseGrSize; /*!< Erase group size */ - __IO uint8_t EraseGrMul; /*!< Erase group size multiplier */ - __IO uint8_t WrProtectGrSize; /*!< Write protect group size */ - __IO uint8_t WrProtectGrEnable; /*!< Write protect group enable */ - __IO uint8_t ManDeflECC; /*!< Manufacturer default ECC */ - __IO uint8_t WrSpeedFact; /*!< Write speed factor */ - __IO uint8_t MaxWrBlockLen; /*!< Max. write data block length */ - __IO uint8_t WriteBlockPaPartial; /*!< Partial blocks for write allowed */ - __IO uint8_t Reserved3; /*!< Reserved */ - __IO uint8_t ContentProtectAppli; /*!< Content protection application */ - __IO uint8_t FileFormatGrouop; /*!< File format group */ - __IO uint8_t CopyFlag; /*!< Copy flag (OTP) */ - __IO uint8_t PermWrProtect; /*!< Permanent write protection */ - __IO uint8_t TempWrProtect; /*!< Temporary write protection */ - __IO uint8_t FileFormat; /*!< File format */ - __IO uint8_t ECC; /*!< ECC code */ - __IO uint8_t CSD_CRC; /*!< CSD CRC */ - __IO uint8_t Reserved4; /*!< Always 1 */ - -}HAL_SD_CSDTypedef; -/** - * @} - */ - -/** @defgroup SD_Exported_Types_Group3 Card Identification Data: CID Register - * @{ - */ -typedef struct -{ - __IO uint8_t ManufacturerID; /*!< Manufacturer ID */ - __IO uint16_t OEM_AppliID; /*!< OEM/Application ID */ - __IO uint32_t ProdName1; /*!< Product Name part1 */ - __IO uint8_t ProdName2; /*!< Product Name part2 */ - __IO uint8_t ProdRev; /*!< Product Revision */ - __IO uint32_t ProdSN; /*!< Product Serial Number */ - __IO uint8_t Reserved1; /*!< Reserved1 */ - __IO uint16_t ManufactDate; /*!< Manufacturing Date */ - __IO uint8_t CID_CRC; /*!< CID CRC */ - __IO uint8_t Reserved2; /*!< Always 1 */ - -}HAL_SD_CIDTypedef; -/** - * @} - */ - -/** @defgroup SD_Exported_Types_Group4 SD Card Status returned by ACMD13 - * @{ - */ -typedef struct -{ - __IO uint8_t DAT_BUS_WIDTH; /*!< Shows the currently defined data bus width */ - __IO uint8_t SECURED_MODE; /*!< Card is in secured mode of operation */ - __IO uint16_t SD_CARD_TYPE; /*!< Carries information about card type */ - __IO uint32_t SIZE_OF_PROTECTED_AREA; /*!< Carries information about the capacity of protected area */ - __IO uint8_t SPEED_CLASS; /*!< Carries information about the speed class of the card */ - __IO uint8_t PERFORMANCE_MOVE; /*!< Carries information about the card's performance move */ - __IO uint8_t AU_SIZE; /*!< Carries information about the card's allocation unit size */ - __IO uint16_t ERASE_SIZE; /*!< Determines the number of AUs to be erased in one operation */ - __IO uint8_t ERASE_TIMEOUT; /*!< Determines the timeout for any number of AU erase */ - __IO uint8_t ERASE_OFFSET; /*!< Carries information about the erase offset */ - -}HAL_SD_CardStatusTypedef; -/** - * @} - */ - -/** @defgroup SD_Exported_Types_Group5 SD Card information structure - * @{ - */ -typedef struct -{ - HAL_SD_CSDTypedef SD_csd; /*!< SD card specific data register */ - HAL_SD_CIDTypedef SD_cid; /*!< SD card identification number register */ - uint64_t CardCapacity; /*!< Card capacity */ - uint32_t CardBlockSize; /*!< Card block size */ - uint16_t RCA; /*!< SD relative card address */ - uint8_t CardType; /*!< SD card type */ - -}HAL_SD_CardInfoTypedef; -/** - * @} - */ - -/** @defgroup SD_Exported_Types_Group6 SD Error status enumeration Structure definition - * @{ - */ -typedef enum -{ -/** - * @brief SD specific error defines - */ - SD_CMD_CRC_FAIL = (1), /*!< Command response received (but CRC check failed) */ - SD_DATA_CRC_FAIL = (2), /*!< Data block sent/received (CRC check failed) */ - SD_CMD_RSP_TIMEOUT = (3), /*!< Command response timeout */ - SD_DATA_TIMEOUT = (4), /*!< Data timeout */ - SD_TX_UNDERRUN = (5), /*!< Transmit FIFO underrun */ - SD_RX_OVERRUN = (6), /*!< Receive FIFO overrun */ - SD_START_BIT_ERR = (7), /*!< Start bit not detected on all data signals in wide bus mode */ - SD_CMD_OUT_OF_RANGE = (8), /*!< Command's argument was out of range. */ - SD_ADDR_MISALIGNED = (9), /*!< Misaligned address */ - SD_BLOCK_LEN_ERR = (10), /*!< Transferred block length is not allowed for the card or the number of transferred bytes does not match the block length */ - SD_ERASE_SEQ_ERR = (11), /*!< An error in the sequence of erase command occurs. */ - SD_BAD_ERASE_PARAM = (12), /*!< An invalid selection for erase groups */ - SD_WRITE_PROT_VIOLATION = (13), /*!< Attempt to program a write protect block */ - SD_LOCK_UNLOCK_FAILED = (14), /*!< Sequence or password error has been detected in unlock command or if there was an attempt to access a locked card */ - SD_COM_CRC_FAILED = (15), /*!< CRC check of the previous command failed */ - SD_ILLEGAL_CMD = (16), /*!< Command is not legal for the card state */ - SD_CARD_ECC_FAILED = (17), /*!< Card internal ECC was applied but failed to correct the data */ - SD_CC_ERROR = (18), /*!< Internal card controller error */ - SD_GENERAL_UNKNOWN_ERROR = (19), /*!< General or unknown error */ - SD_STREAM_READ_UNDERRUN = (20), /*!< The card could not sustain data transfer in stream read operation. */ - SD_STREAM_WRITE_OVERRUN = (21), /*!< The card could not sustain data programming in stream mode */ - SD_CID_CSD_OVERWRITE = (22), /*!< CID/CSD overwrite error */ - SD_WP_ERASE_SKIP = (23), /*!< Only partial address space was erased */ - SD_CARD_ECC_DISABLED = (24), /*!< Command has been executed without using internal ECC */ - SD_ERASE_RESET = (25), /*!< Erase sequence was cleared before executing because an out of erase sequence command was received */ - SD_AKE_SEQ_ERROR = (26), /*!< Error in sequence of authentication. */ - SD_INVALID_VOLTRANGE = (27), - SD_ADDR_OUT_OF_RANGE = (28), - SD_SWITCH_ERROR = (29), - SD_SDIO_DISABLED = (30), - SD_SDIO_FUNCTION_BUSY = (31), - SD_SDIO_FUNCTION_FAILED = (32), - SD_SDIO_UNKNOWN_FUNCTION = (33), - -/** - * @brief Standard error defines - */ - SD_INTERNAL_ERROR = (34), - SD_NOT_CONFIGURED = (35), - SD_REQUEST_PENDING = (36), - SD_REQUEST_NOT_APPLICABLE = (37), - SD_INVALID_PARAMETER = (38), - SD_UNSUPPORTED_FEATURE = (39), - SD_UNSUPPORTED_HW = (40), - SD_ERROR = (41), - SD_OK = (0) - -}HAL_SD_ErrorTypedef; -/** - * @} - */ - -/** @defgroup SD_Exported_Types_Group7 SD Transfer state enumeration structure - * @{ - */ -typedef enum -{ - SD_TRANSFER_OK = 0, /*!< Transfer success */ - SD_TRANSFER_BUSY = 1, /*!< Transfer is occurring */ - SD_TRANSFER_ERROR = 2 /*!< Transfer failed */ - -}HAL_SD_TransferStateTypedef; -/** - * @} - */ - -/** @defgroup SD_Exported_Types_Group8 SD Card State enumeration structure - * @{ - */ -typedef enum -{ - SD_CARD_READY = ((uint32_t)0x00000001), /*!< Card state is ready */ - SD_CARD_IDENTIFICATION = ((uint32_t)0x00000002), /*!< Card is in identification state */ - SD_CARD_STANDBY = ((uint32_t)0x00000003), /*!< Card is in standby state */ - SD_CARD_TRANSFER = ((uint32_t)0x00000004), /*!< Card is in transfer state */ - SD_CARD_SENDING = ((uint32_t)0x00000005), /*!< Card is sending an operation */ - SD_CARD_RECEIVING = ((uint32_t)0x00000006), /*!< Card is receiving operation information */ - SD_CARD_PROGRAMMING = ((uint32_t)0x00000007), /*!< Card is in programming state */ - SD_CARD_DISCONNECTED = ((uint32_t)0x00000008), /*!< Card is disconnected */ - SD_CARD_ERROR = ((uint32_t)0x000000FF) /*!< Card is in error state */ - -}HAL_SD_CardStateTypedef; -/** - * @} - */ - -/** @defgroup SD_Exported_Types_Group9 SD Operation enumeration structure - * @{ - */ -typedef enum -{ - SD_READ_SINGLE_BLOCK = 0, /*!< Read single block operation */ - SD_READ_MULTIPLE_BLOCK = 1, /*!< Read multiple blocks operation */ - SD_WRITE_SINGLE_BLOCK = 2, /*!< Write single block operation */ - SD_WRITE_MULTIPLE_BLOCK = 3 /*!< Write multiple blocks operation */ - -}HAL_SD_OperationTypedef; -/** - * @} - */ - -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup SD_Exported_Constants SD Exported Constants - * @{ - */ - -/** - * @brief SD Commands Index - */ -#define SD_CMD_GO_IDLE_STATE ((uint8_t)0) /*!< Resets the SD memory card. */ -#define SD_CMD_SEND_OP_COND ((uint8_t)1) /*!< Sends host capacity support information and activates the card's initialization process. */ -#define SD_CMD_ALL_SEND_CID ((uint8_t)2) /*!< Asks any card connected to the host to send the CID numbers on the CMD line. */ -#define SD_CMD_SET_REL_ADDR ((uint8_t)3) /*!< Asks the card to publish a new relative address (RCA). */ -#define SD_CMD_SET_DSR ((uint8_t)4) /*!< Programs the DSR of all cards. */ -#define SD_CMD_SDIO_SEN_OP_COND ((uint8_t)5) /*!< Sends host capacity support information (HCS) and asks the accessed card to send its - operating condition register (OCR) content in the response on the CMD line. */ -#define SD_CMD_HS_SWITCH ((uint8_t)6) /*!< Checks switchable function (mode 0) and switch card function (mode 1). */ -#define SD_CMD_SEL_DESEL_CARD ((uint8_t)7) /*!< Selects the card by its own relative address and gets deselected by any other address */ -#define SD_CMD_HS_SEND_EXT_CSD ((uint8_t)8) /*!< Sends SD Memory Card interface condition, which includes host supply voltage information - and asks the card whether card supports voltage. */ -#define SD_CMD_SEND_CSD ((uint8_t)9) /*!< Addressed card sends its card specific data (CSD) on the CMD line. */ -#define SD_CMD_SEND_CID ((uint8_t)10) /*!< Addressed card sends its card identification (CID) on the CMD line. */ -#define SD_CMD_READ_DAT_UNTIL_STOP ((uint8_t)11) /*!< SD card doesn't support it. */ -#define SD_CMD_STOP_TRANSMISSION ((uint8_t)12) /*!< Forces the card to stop transmission. */ -#define SD_CMD_SEND_STATUS ((uint8_t)13) /*!< Addressed card sends its status register. */ -#define SD_CMD_HS_BUSTEST_READ ((uint8_t)14) -#define SD_CMD_GO_INACTIVE_STATE ((uint8_t)15) /*!< Sends an addressed card into the inactive state. */ -#define SD_CMD_SET_BLOCKLEN ((uint8_t)16) /*!< Sets the block length (in bytes for SDSC) for all following block commands - (read, write, lock). Default block length is fixed to 512 Bytes. Not effective - for SDHS and SDXC. */ -#define SD_CMD_READ_SINGLE_BLOCK ((uint8_t)17) /*!< Reads single block of size selected by SET_BLOCKLEN in case of SDSC, and a block of - fixed 512 bytes in case of SDHC and SDXC. */ -#define SD_CMD_READ_MULT_BLOCK ((uint8_t)18) /*!< Continuously transfers data blocks from card to host until interrupted by - STOP_TRANSMISSION command. */ -#define SD_CMD_HS_BUSTEST_WRITE ((uint8_t)19) /*!< 64 bytes tuning pattern is sent for SDR50 and SDR104. */ -#define SD_CMD_WRITE_DAT_UNTIL_STOP ((uint8_t)20) /*!< Speed class control command. */ -#define SD_CMD_SET_BLOCK_COUNT ((uint8_t)23) /*!< Specify block count for CMD18 and CMD25. */ -#define SD_CMD_WRITE_SINGLE_BLOCK ((uint8_t)24) /*!< Writes single block of size selected by SET_BLOCKLEN in case of SDSC, and a block of - fixed 512 bytes in case of SDHC and SDXC. */ -#define SD_CMD_WRITE_MULT_BLOCK ((uint8_t)25) /*!< Continuously writes blocks of data until a STOP_TRANSMISSION follows. */ -#define SD_CMD_PROG_CID ((uint8_t)26) /*!< Reserved for manufacturers. */ -#define SD_CMD_PROG_CSD ((uint8_t)27) /*!< Programming of the programmable bits of the CSD. */ -#define SD_CMD_SET_WRITE_PROT ((uint8_t)28) /*!< Sets the write protection bit of the addressed group. */ -#define SD_CMD_CLR_WRITE_PROT ((uint8_t)29) /*!< Clears the write protection bit of the addressed group. */ -#define SD_CMD_SEND_WRITE_PROT ((uint8_t)30) /*!< Asks the card to send the status of the write protection bits. */ -#define SD_CMD_SD_ERASE_GRP_START ((uint8_t)32) /*!< Sets the address of the first write block to be erased. (For SD card only). */ -#define SD_CMD_SD_ERASE_GRP_END ((uint8_t)33) /*!< Sets the address of the last write block of the continuous range to be erased. */ -#define SD_CMD_ERASE_GRP_START ((uint8_t)35) /*!< Sets the address of the first write block to be erased. Reserved for each command - system set by switch function command (CMD6). */ -#define SD_CMD_ERASE_GRP_END ((uint8_t)36) /*!< Sets the address of the last write block of the continuous range to be erased. - Reserved for each command system set by switch function command (CMD6). */ -#define SD_CMD_ERASE ((uint8_t)38) /*!< Reserved for SD security applications. */ -#define SD_CMD_FAST_IO ((uint8_t)39) /*!< SD card doesn't support it (Reserved). */ -#define SD_CMD_GO_IRQ_STATE ((uint8_t)40) /*!< SD card doesn't support it (Reserved). */ -#define SD_CMD_LOCK_UNLOCK ((uint8_t)42) /*!< Sets/resets the password or lock/unlock the card. The size of the data block is set by - the SET_BLOCK_LEN command. */ -#define SD_CMD_APP_CMD ((uint8_t)55) /*!< Indicates to the card that the next command is an application specific command rather - than a standard command. */ -#define SD_CMD_GEN_CMD ((uint8_t)56) /*!< Used either to transfer a data block to the card or to get a data block from the card - for general purpose/application specific commands. */ -#define SD_CMD_NO_CMD ((uint8_t)64) - -/** - * @brief Following commands are SD Card Specific commands. - * SDIO_APP_CMD should be sent before sending these commands. - */ -#define SD_CMD_APP_SD_SET_BUSWIDTH ((uint8_t)6) /*!< (ACMD6) Defines the data bus width to be used for data transfer. The allowed data bus - widths are given in SCR register. */ -#define SD_CMD_SD_APP_STATUS ((uint8_t)13) /*!< (ACMD13) Sends the SD status. */ -#define SD_CMD_SD_APP_SEND_NUM_WRITE_BLOCKS ((uint8_t)22) /*!< (ACMD22) Sends the number of the written (without errors) write blocks. Responds with - 32bit+CRC data block. */ -#define SD_CMD_SD_APP_OP_COND ((uint8_t)41) /*!< (ACMD41) Sends host capacity support information (HCS) and asks the accessed card to - send its operating condition register (OCR) content in the response on the CMD line. */ -#define SD_CMD_SD_APP_SET_CLR_CARD_DETECT ((uint8_t)42) /*!< (ACMD42) Connects/Disconnects the 50 KOhm pull-up resistor on CD/DAT3 (pin 1) of the card. */ -#define SD_CMD_SD_APP_SEND_SCR ((uint8_t)51) /*!< Reads the SD Configuration Register (SCR). */ -#define SD_CMD_SDIO_RW_DIRECT ((uint8_t)52) /*!< For SD I/O card only, reserved for security specification. */ -#define SD_CMD_SDIO_RW_EXTENDED ((uint8_t)53) /*!< For SD I/O card only, reserved for security specification. */ - -/** - * @brief Following commands are SD Card Specific security commands. - * SD_CMD_APP_CMD should be sent before sending these commands. - */ -#define SD_CMD_SD_APP_GET_MKB ((uint8_t)43) /*!< For SD card only */ -#define SD_CMD_SD_APP_GET_MID ((uint8_t)44) /*!< For SD card only */ -#define SD_CMD_SD_APP_SET_CER_RN1 ((uint8_t)45) /*!< For SD card only */ -#define SD_CMD_SD_APP_GET_CER_RN2 ((uint8_t)46) /*!< For SD card only */ -#define SD_CMD_SD_APP_SET_CER_RES2 ((uint8_t)47) /*!< For SD card only */ -#define SD_CMD_SD_APP_GET_CER_RES1 ((uint8_t)48) /*!< For SD card only */ -#define SD_CMD_SD_APP_SECURE_READ_MULTIPLE_BLOCK ((uint8_t)18) /*!< For SD card only */ -#define SD_CMD_SD_APP_SECURE_WRITE_MULTIPLE_BLOCK ((uint8_t)25) /*!< For SD card only */ -#define SD_CMD_SD_APP_SECURE_ERASE ((uint8_t)38) /*!< For SD card only */ -#define SD_CMD_SD_APP_CHANGE_SECURE_AREA ((uint8_t)49) /*!< For SD card only */ -#define SD_CMD_SD_APP_SECURE_WRITE_MKB ((uint8_t)48) /*!< For SD card only */ - -/** - * @brief Supported SD Memory Cards - */ -#define STD_CAPACITY_SD_CARD_V1_1 ((uint32_t)0x00000000) -#define STD_CAPACITY_SD_CARD_V2_0 ((uint32_t)0x00000001) -#define HIGH_CAPACITY_SD_CARD ((uint32_t)0x00000002) -#define MULTIMEDIA_CARD ((uint32_t)0x00000003) -#define SECURE_DIGITAL_IO_CARD ((uint32_t)0x00000004) -#define HIGH_SPEED_MULTIMEDIA_CARD ((uint32_t)0x00000005) -#define SECURE_DIGITAL_IO_COMBO_CARD ((uint32_t)0x00000006) -#define HIGH_CAPACITY_MMC_CARD ((uint32_t)0x00000007) -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup SD_Exported_macros SD Exported Macros - * @brief macros to handle interrupts and specific clock configurations - * @{ - */ - -/** - * @brief Enable the SD device. - * @retval None - */ -#define __HAL_SD_SDIO_ENABLE() __SDIO_ENABLE() - -/** - * @brief Disable the SD device. - * @retval None - */ -#define __HAL_SD_SDIO_DISABLE() __SDIO_DISABLE() - -/** - * @brief Enable the SDIO DMA transfer. - * @retval None - */ -#define __HAL_SD_SDIO_DMA_ENABLE() __SDIO_DMA_ENABLE() - -/** - * @brief Disable the SDIO DMA transfer. - * @retval None - */ -#define __HAL_SD_SDIO_DMA_DISABLE() __SDIO_DMA_DISABLE() - -/** - * @brief Enable the SD device interrupt. - * @param __HANDLE__: SD Handle - * @param __INTERRUPT__: specifies the SDIO interrupt sources to be enabled. - * This parameter can be one or a combination of the following values: - * @arg SDIO_IT_CCRCFAIL: Command response received (CRC check failed) interrupt - * @arg SDIO_IT_DCRCFAIL: Data block sent/received (CRC check failed) interrupt - * @arg SDIO_IT_CTIMEOUT: Command response timeout interrupt - * @arg SDIO_IT_DTIMEOUT: Data timeout interrupt - * @arg SDIO_IT_TXUNDERR: Transmit FIFO underrun error interrupt - * @arg SDIO_IT_RXOVERR: Received FIFO overrun error interrupt - * @arg SDIO_IT_CMDREND: Command response received (CRC check passed) interrupt - * @arg SDIO_IT_CMDSENT: Command sent (no response required) interrupt - * @arg SDIO_IT_DATAEND: Data end (data counter, SDIDCOUNT, is zero) interrupt - * @arg SDIO_IT_STBITERR: Start bit not detected on all data signals in wide - * bus mode interrupt - * @arg SDIO_IT_DBCKEND: Data block sent/received (CRC check passed) interrupt - * @arg SDIO_IT_CMDACT: Command transfer in progress interrupt - * @arg SDIO_IT_TXACT: Data transmit in progress interrupt - * @arg SDIO_IT_RXACT: Data receive in progress interrupt - * @arg SDIO_IT_TXFIFOHE: Transmit FIFO Half Empty interrupt - * @arg SDIO_IT_RXFIFOHF: Receive FIFO Half Full interrupt - * @arg SDIO_IT_TXFIFOF: Transmit FIFO full interrupt - * @arg SDIO_IT_RXFIFOF: Receive FIFO full interrupt - * @arg SDIO_IT_TXFIFOE: Transmit FIFO empty interrupt - * @arg SDIO_IT_RXFIFOE: Receive FIFO empty interrupt - * @arg SDIO_IT_TXDAVL: Data available in transmit FIFO interrupt - * @arg SDIO_IT_RXDAVL: Data available in receive FIFO interrupt - * @arg SDIO_IT_SDIOIT: SD I/O interrupt received interrupt - * @arg SDIO_IT_CEATAEND: CE-ATA command completion signal received for CMD61 interrupt - * @retval None - */ -#define __HAL_SD_SDIO_ENABLE_IT(__HANDLE__, __INTERRUPT__) __SDIO_ENABLE_IT((__HANDLE__)->Instance, (__INTERRUPT__)) - -/** - * @brief Disable the SD device interrupt. - * @param __HANDLE__: SD Handle - * @param __INTERRUPT__: specifies the SDIO interrupt sources to be disabled. - * This parameter can be one or a combination of the following values: - * @arg SDIO_IT_CCRCFAIL: Command response received (CRC check failed) interrupt - * @arg SDIO_IT_DCRCFAIL: Data block sent/received (CRC check failed) interrupt - * @arg SDIO_IT_CTIMEOUT: Command response timeout interrupt - * @arg SDIO_IT_DTIMEOUT: Data timeout interrupt - * @arg SDIO_IT_TXUNDERR: Transmit FIFO underrun error interrupt - * @arg SDIO_IT_RXOVERR: Received FIFO overrun error interrupt - * @arg SDIO_IT_CMDREND: Command response received (CRC check passed) interrupt - * @arg SDIO_IT_CMDSENT: Command sent (no response required) interrupt - * @arg SDIO_IT_DATAEND: Data end (data counter, SDIDCOUNT, is zero) interrupt - * @arg SDIO_IT_STBITERR: Start bit not detected on all data signals in wide - * bus mode interrupt - * @arg SDIO_IT_DBCKEND: Data block sent/received (CRC check passed) interrupt - * @arg SDIO_IT_CMDACT: Command transfer in progress interrupt - * @arg SDIO_IT_TXACT: Data transmit in progress interrupt - * @arg SDIO_IT_RXACT: Data receive in progress interrupt - * @arg SDIO_IT_TXFIFOHE: Transmit FIFO Half Empty interrupt - * @arg SDIO_IT_RXFIFOHF: Receive FIFO Half Full interrupt - * @arg SDIO_IT_TXFIFOF: Transmit FIFO full interrupt - * @arg SDIO_IT_RXFIFOF: Receive FIFO full interrupt - * @arg SDIO_IT_TXFIFOE: Transmit FIFO empty interrupt - * @arg SDIO_IT_RXFIFOE: Receive FIFO empty interrupt - * @arg SDIO_IT_TXDAVL: Data available in transmit FIFO interrupt - * @arg SDIO_IT_RXDAVL: Data available in receive FIFO interrupt - * @arg SDIO_IT_SDIOIT: SD I/O interrupt received interrupt - * @arg SDIO_IT_CEATAEND: CE-ATA command completion signal received for CMD61 interrupt - * @retval None - */ -#define __HAL_SD_SDIO_DISABLE_IT(__HANDLE__, __INTERRUPT__) __SDIO_DISABLE_IT((__HANDLE__)->Instance, (__INTERRUPT__)) - -/** - * @brief Check whether the specified SD flag is set or not. - * @param __HANDLE__: SD Handle - * @param __FLAG__: specifies the flag to check. - * This parameter can be one of the following values: - * @arg SDIO_FLAG_CCRCFAIL: Command response received (CRC check failed) - * @arg SDIO_FLAG_DCRCFAIL: Data block sent/received (CRC check failed) - * @arg SDIO_FLAG_CTIMEOUT: Command response timeout - * @arg SDIO_FLAG_DTIMEOUT: Data timeout - * @arg SDIO_FLAG_TXUNDERR: Transmit FIFO underrun error - * @arg SDIO_FLAG_RXOVERR: Received FIFO overrun error - * @arg SDIO_FLAG_CMDREND: Command response received (CRC check passed) - * @arg SDIO_FLAG_CMDSENT: Command sent (no response required) - * @arg SDIO_FLAG_DATAEND: Data end (data counter, SDIDCOUNT, is zero) - * @arg SDIO_FLAG_STBITERR: Start bit not detected on all data signals in wide bus mode. - * @arg SDIO_FLAG_DBCKEND: Data block sent/received (CRC check passed) - * @arg SDIO_FLAG_CMDACT: Command transfer in progress - * @arg SDIO_FLAG_TXACT: Data transmit in progress - * @arg SDIO_FLAG_RXACT: Data receive in progress - * @arg SDIO_FLAG_TXFIFOHE: Transmit FIFO Half Empty - * @arg SDIO_FLAG_RXFIFOHF: Receive FIFO Half Full - * @arg SDIO_FLAG_TXFIFOF: Transmit FIFO full - * @arg SDIO_FLAG_RXFIFOF: Receive FIFO full - * @arg SDIO_FLAG_TXFIFOE: Transmit FIFO empty - * @arg SDIO_FLAG_RXFIFOE: Receive FIFO empty - * @arg SDIO_FLAG_TXDAVL: Data available in transmit FIFO - * @arg SDIO_FLAG_RXDAVL: Data available in receive FIFO - * @arg SDIO_FLAG_SDIOIT: SD I/O interrupt received - * @arg SDIO_FLAG_CEATAEND: CE-ATA command completion signal received for CMD61 - * @retval The new state of SD FLAG (SET or RESET). - */ -#define __HAL_SD_SDIO_GET_FLAG(__HANDLE__, __FLAG__) __SDIO_GET_FLAG((__HANDLE__)->Instance, (__FLAG__)) - -/** - * @brief Clear the SD's pending flags. - * @param __HANDLE__: SD Handle - * @param __FLAG__: specifies the flag to clear. - * This parameter can be one or a combination of the following values: - * @arg SDIO_FLAG_CCRCFAIL: Command response received (CRC check failed) - * @arg SDIO_FLAG_DCRCFAIL: Data block sent/received (CRC check failed) - * @arg SDIO_FLAG_CTIMEOUT: Command response timeout - * @arg SDIO_FLAG_DTIMEOUT: Data timeout - * @arg SDIO_FLAG_TXUNDERR: Transmit FIFO underrun error - * @arg SDIO_FLAG_RXOVERR: Received FIFO overrun error - * @arg SDIO_FLAG_CMDREND: Command response received (CRC check passed) - * @arg SDIO_FLAG_CMDSENT: Command sent (no response required) - * @arg SDIO_FLAG_DATAEND: Data end (data counter, SDIDCOUNT, is zero) - * @arg SDIO_FLAG_STBITERR: Start bit not detected on all data signals in wide bus mode - * @arg SDIO_FLAG_DBCKEND: Data block sent/received (CRC check passed) - * @arg SDIO_FLAG_SDIOIT: SD I/O interrupt received - * @arg SDIO_FLAG_CEATAEND: CE-ATA command completion signal received for CMD61 - * @retval None - */ -#define __HAL_SD_SDIO_CLEAR_FLAG(__HANDLE__, __FLAG__) __SDIO_CLEAR_FLAG((__HANDLE__)->Instance, (__FLAG__)) - -/** - * @brief Check whether the specified SD interrupt has occurred or not. - * @param __HANDLE__: SD Handle - * @param __INTERRUPT__: specifies the SDIO interrupt source to check. - * This parameter can be one of the following values: - * @arg SDIO_IT_CCRCFAIL: Command response received (CRC check failed) interrupt - * @arg SDIO_IT_DCRCFAIL: Data block sent/received (CRC check failed) interrupt - * @arg SDIO_IT_CTIMEOUT: Command response timeout interrupt - * @arg SDIO_IT_DTIMEOUT: Data timeout interrupt - * @arg SDIO_IT_TXUNDERR: Transmit FIFO underrun error interrupt - * @arg SDIO_IT_RXOVERR: Received FIFO overrun error interrupt - * @arg SDIO_IT_CMDREND: Command response received (CRC check passed) interrupt - * @arg SDIO_IT_CMDSENT: Command sent (no response required) interrupt - * @arg SDIO_IT_DATAEND: Data end (data counter, SDIDCOUNT, is zero) interrupt - * @arg SDIO_IT_STBITERR: Start bit not detected on all data signals in wide - * bus mode interrupt - * @arg SDIO_IT_DBCKEND: Data block sent/received (CRC check passed) interrupt - * @arg SDIO_IT_CMDACT: Command transfer in progress interrupt - * @arg SDIO_IT_TXACT: Data transmit in progress interrupt - * @arg SDIO_IT_RXACT: Data receive in progress interrupt - * @arg SDIO_IT_TXFIFOHE: Transmit FIFO Half Empty interrupt - * @arg SDIO_IT_RXFIFOHF: Receive FIFO Half Full interrupt - * @arg SDIO_IT_TXFIFOF: Transmit FIFO full interrupt - * @arg SDIO_IT_RXFIFOF: Receive FIFO full interrupt - * @arg SDIO_IT_TXFIFOE: Transmit FIFO empty interrupt - * @arg SDIO_IT_RXFIFOE: Receive FIFO empty interrupt - * @arg SDIO_IT_TXDAVL: Data available in transmit FIFO interrupt - * @arg SDIO_IT_RXDAVL: Data available in receive FIFO interrupt - * @arg SDIO_IT_SDIOIT: SD I/O interrupt received interrupt - * @arg SDIO_IT_CEATAEND: CE-ATA command completion signal received for CMD61 interrupt - * @retval The new state of SD IT (SET or RESET). - */ -#define __HAL_SD_SDIO_GET_IT (__HANDLE__, __INTERRUPT__) __SDIO_GET_IT ((__HANDLE__)->Instance, __INTERRUPT__) - -/** - * @brief Clear the SD's interrupt pending bits. - * @param __HANDLE__ : SD Handle - * @param __INTERRUPT__: specifies the interrupt pending bit to clear. - * This parameter can be one or a combination of the following values: - * @arg SDIO_IT_CCRCFAIL: Command response received (CRC check failed) interrupt - * @arg SDIO_IT_DCRCFAIL: Data block sent/received (CRC check failed) interrupt - * @arg SDIO_IT_CTIMEOUT: Command response timeout interrupt - * @arg SDIO_IT_DTIMEOUT: Data timeout interrupt - * @arg SDIO_IT_TXUNDERR: Transmit FIFO underrun error interrupt - * @arg SDIO_IT_RXOVERR: Received FIFO overrun error interrupt - * @arg SDIO_IT_CMDREND: Command response received (CRC check passed) interrupt - * @arg SDIO_IT_CMDSENT: Command sent (no response required) interrupt - * @arg SDIO_IT_DATAEND: Data end (data counter, SDIO_DCOUNT, is zero) interrupt - * @arg SDIO_IT_STBITERR: Start bit not detected on all data signals in wide - * bus mode interrupt - * @arg SDIO_IT_SDIOIT: SD I/O interrupt received interrupt - * @arg SDIO_IT_CEATAEND: CE-ATA command completion signal received for CMD61 - * @retval None - */ -#define __HAL_SD_SDIO_CLEAR_IT(__HANDLE__, __INTERRUPT__) __SDIO_CLEAR_IT((__HANDLE__)->Instance, (__INTERRUPT__)) -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup SD_Exported_Functions SD Exported Functions - * @{ - */ - -/** @defgroup SD_Exported_Functions_Group1 Initialization and de-initialization functions - * @{ - */ -HAL_SD_ErrorTypedef HAL_SD_Init(SD_HandleTypeDef *hsd, HAL_SD_CardInfoTypedef *SDCardInfo); -HAL_StatusTypeDef HAL_SD_DeInit (SD_HandleTypeDef *hsd); -void HAL_SD_MspInit(SD_HandleTypeDef *hsd); -void HAL_SD_MspDeInit(SD_HandleTypeDef *hsd); -/** - * @} - */ - -/** @defgroup SD_Exported_Functions_Group2 I/O operation functions - * @{ - */ -/* Blocking mode: Polling */ -HAL_SD_ErrorTypedef HAL_SD_ReadBlocks(SD_HandleTypeDef *hsd, uint32_t *pReadBuffer, uint64_t ReadAddr, uint32_t BlockSize, uint32_t NumberOfBlocks); -HAL_SD_ErrorTypedef HAL_SD_WriteBlocks(SD_HandleTypeDef *hsd, uint32_t *pWriteBuffer, uint64_t WriteAddr, uint32_t BlockSize, uint32_t NumberOfBlocks); -HAL_SD_ErrorTypedef HAL_SD_Erase(SD_HandleTypeDef *hsd, uint64_t startaddr, uint64_t endaddr); - -/* Non-Blocking mode: Interrupt */ -void HAL_SD_IRQHandler(SD_HandleTypeDef *hsd); - -/* Callback in non blocking modes (DMA) */ -void HAL_SD_DMA_RxCpltCallback(DMA_HandleTypeDef *hdma); -void HAL_SD_DMA_RxErrorCallback(DMA_HandleTypeDef *hdma); -void HAL_SD_DMA_TxCpltCallback(DMA_HandleTypeDef *hdma); -void HAL_SD_DMA_TxErrorCallback(DMA_HandleTypeDef *hdma); -void HAL_SD_XferCpltCallback(SD_HandleTypeDef *hsd); -void HAL_SD_XferErrorCallback(SD_HandleTypeDef *hsd); - -/* Non-Blocking mode: DMA */ -HAL_SD_ErrorTypedef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pReadBuffer, uint64_t ReadAddr, uint32_t BlockSize, uint32_t NumberOfBlocks); -HAL_SD_ErrorTypedef HAL_SD_WriteBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pWriteBuffer, uint64_t WriteAddr, uint32_t BlockSize, uint32_t NumberOfBlocks); -HAL_SD_ErrorTypedef HAL_SD_CheckWriteOperation(SD_HandleTypeDef *hsd, uint32_t Timeout); -HAL_SD_ErrorTypedef HAL_SD_CheckReadOperation(SD_HandleTypeDef *hsd, uint32_t Timeout); -/** - * @} - */ - -/** @defgroup SD_Exported_Functions_Group3 Peripheral Control functions - * @{ - */ -HAL_SD_ErrorTypedef HAL_SD_Get_CardInfo(SD_HandleTypeDef *hsd, HAL_SD_CardInfoTypedef *pCardInfo); -HAL_SD_ErrorTypedef HAL_SD_WideBusOperation_Config(SD_HandleTypeDef *hsd, uint32_t WideMode); -HAL_SD_ErrorTypedef HAL_SD_StopTransfer(SD_HandleTypeDef *hsd); -HAL_SD_ErrorTypedef HAL_SD_HighSpeed (SD_HandleTypeDef *hsd); -/** - * @} - */ - -/* Peripheral State functions ************************************************/ -/** @defgroup SD_Exported_Functions_Group4 Peripheral State functions - * @{ - */ -HAL_SD_ErrorTypedef HAL_SD_SendSDStatus(SD_HandleTypeDef *hsd, uint32_t *pSDstatus); -HAL_SD_ErrorTypedef HAL_SD_GetCardStatus(SD_HandleTypeDef *hsd, HAL_SD_CardStatusTypedef *pCardStatus); -HAL_SD_TransferStateTypedef HAL_SD_GetStatus(SD_HandleTypeDef *hsd); -/** - * @} - */ - -/** - * @} - */ - -/* Private types -------------------------------------------------------------*/ -/** @defgroup SD_Private_Types SD Private Types - * @{ - */ - -/** - * @} - */ - -/* Private defines -----------------------------------------------------------*/ -/** @defgroup SD_Private_Defines SD Private Defines - * @{ - */ - -/** - * @} - */ - -/* Private variables ---------------------------------------------------------*/ -/** @defgroup SD_Private_Variables SD Private Variables - * @{ - */ - -/** - * @} - */ - -/* Private constants ---------------------------------------------------------*/ -/** @defgroup SD_Private_Constants SD Private Constants - * @{ - */ - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup SD_Private_Macros SD Private Macros - * @{ - */ - -/** - * @} - */ - -/* Private functions prototypes ----------------------------------------------*/ -/** @defgroup SD_Private_Functions_Prototypes SD Private Functions Prototypes - * @{ - */ - -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup SD_Private_Functions SD Private Functions - * @{ - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F2xx_HAL_SD_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_smartcard.h b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_smartcard.h deleted file mode 100755 index 4007d182..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_smartcard.h +++ /dev/null @@ -1,620 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_hal_smartcard.h - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief Header file of SMARTCARD HAL module. - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F2xx_HAL_SMARTCARD_H -#define __STM32F2xx_HAL_SMARTCARD_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal_def.h" - -/** @addtogroup STM32F2xx_HAL_Driver - * @{ - */ - -/** @addtogroup SMARTCARD - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup SMARTCARD_Exported_Types SMARTCARD Exported Types - * @{ - */ - -/** - * @brief SMARTCARD Init Structure definition - */ -typedef struct -{ - uint32_t BaudRate; /*!< This member configures the SmartCard communication baud rate. - The baud rate is computed using the following formula: - - IntegerDivider = ((PCLKx) / (8 * (hirda->Init.BaudRate))) - - FractionalDivider = ((IntegerDivider - ((uint32_t) IntegerDivider)) * 8) + 0.5 */ - - uint32_t WordLength; /*!< Specifies the number of data bits transmitted or received in a frame. - This parameter can be a value of @ref SMARTCARD_Word_Length */ - - uint32_t StopBits; /*!< Specifies the number of stop bits transmitted. - This parameter can be a value of @ref SMARTCARD_Stop_Bits */ - - uint32_t Parity; /*!< Specifies the parity mode. - This parameter can be a value of @ref SMARTCARD_Parity - @note When parity is enabled, the computed parity is inserted - at the MSB position of the transmitted data (9th bit when - the word length is set to 9 data bits; 8th bit when the - word length is set to 8 data bits).*/ - - uint32_t Mode; /*!< Specifies whether the Receive or Transmit mode is enabled or disabled. - This parameter can be a value of @ref SMARTCARD_Mode */ - - uint32_t CLKPolarity; /*!< Specifies the steady state of the serial clock. - This parameter can be a value of @ref SMARTCARD_Clock_Polarity */ - - uint32_t CLKPhase; /*!< Specifies the clock transition on which the bit capture is made. - This parameter can be a value of @ref SMARTCARD_Clock_Phase */ - - uint32_t CLKLastBit; /*!< Specifies whether the clock pulse corresponding to the last transmitted - data bit (MSB) has to be output on the SCLK pin in synchronous mode. - This parameter can be a value of @ref SMARTCARD_Last_Bit */ - - uint32_t Prescaler; /*!< Specifies the SmartCard Prescaler value used for dividing the system clock - to provide the smartcard clock - This parameter can be a value of @ref SMARTCARD_Prescaler */ - - uint32_t GuardTime; /*!< Specifies the SmartCard Guard Time value in terms of number of baud clocks - The value given in the register (5 significant bits) is multiplied by 2 - to give the division factor of the source clock frequency */ - - uint32_t NACKState; /*!< Specifies the SmartCard NACK Transmission state. - This parameter can be a value of @ref SMARTCARD_NACK_State */ -}SMARTCARD_InitTypeDef; - -/** - * @brief HAL State structures definition - */ -typedef enum -{ - HAL_SMARTCARD_STATE_RESET = 0x00, /*!< Peripheral is not yet Initialized */ - HAL_SMARTCARD_STATE_READY = 0x01, /*!< Peripheral Initialized and ready for use */ - HAL_SMARTCARD_STATE_BUSY = 0x02, /*!< an internal process is ongoing */ - HAL_SMARTCARD_STATE_BUSY_TX = 0x12, /*!< Data Transmission process is ongoing */ - HAL_SMARTCARD_STATE_BUSY_RX = 0x22, /*!< Data Reception process is ongoing */ - HAL_SMARTCARD_STATE_BUSY_TX_RX = 0x32, /*!< Data Transmission and Reception process is ongoing */ - HAL_SMARTCARD_STATE_TIMEOUT = 0x03, /*!< Timeout state */ - HAL_SMARTCARD_STATE_ERROR = 0x04 /*!< Error */ -}HAL_SMARTCARD_StateTypeDef; - -/** - * @brief SMARTCARD handle Structure definition - */ -typedef struct -{ - USART_TypeDef *Instance; /* USART registers base address */ - - SMARTCARD_InitTypeDef Init; /* SmartCard communication parameters */ - - uint8_t *pTxBuffPtr; /* Pointer to SmartCard Tx transfer Buffer */ - - uint16_t TxXferSize; /* SmartCard Tx Transfer size */ - - uint16_t TxXferCount; /* SmartCard Tx Transfer Counter */ - - uint8_t *pRxBuffPtr; /* Pointer to SmartCard Rx transfer Buffer */ - - uint16_t RxXferSize; /* SmartCard Rx Transfer size */ - - uint16_t RxXferCount; /* SmartCard Rx Transfer Counter */ - - DMA_HandleTypeDef *hdmatx; /* SmartCard Tx DMA Handle parameters */ - - DMA_HandleTypeDef *hdmarx; /* SmartCard Rx DMA Handle parameters */ - - HAL_LockTypeDef Lock; /* Locking object */ - - __IO HAL_SMARTCARD_StateTypeDef State; /* SmartCard communication state */ - - __IO uint32_t ErrorCode; /* SmartCard Error code */ - -}SMARTCARD_HandleTypeDef; - -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup SMARTCARD_Exported_Constants SMARTCARD Exported constants - * @{ - */ -/** @defgroup SMARTCARD_Error_Code SMARTCARD Error Code - * @brief SMARTCARD Error Code - * @{ - */ -#define HAL_SMARTCARD_ERROR_NONE ((uint32_t)0x00000000) /*!< No error */ -#define HAL_SMARTCARD_ERROR_PE ((uint32_t)0x00000001) /*!< Parity error */ -#define HAL_SMARTCARD_ERROR_NE ((uint32_t)0x00000002) /*!< Noise error */ -#define HAL_SMARTCARD_ERROR_FE ((uint32_t)0x00000004) /*!< Frame error */ -#define HAL_SMARTCARD_ERROR_ORE ((uint32_t)0x00000008) /*!< Overrun error */ -#define HAL_SMARTCARD_ERROR_DMA ((uint32_t)0x00000010) /*!< DMA transfer error */ -/** - * @} - */ - -/** @defgroup SMARTCARD_Word_Length SMARTCARD Word Length - * @{ - */ -#define SMARTCARD_WORDLENGTH_9B ((uint32_t)USART_CR1_M) -/** - * @} - */ - -/** @defgroup SMARTCARD_Stop_Bits SMARTCARD Number of Stop Bits - * @{ - */ -#define SMARTCARD_STOPBITS_0_5 ((uint32_t)USART_CR2_STOP_0) -#define SMARTCARD_STOPBITS_1_5 ((uint32_t)(USART_CR2_STOP_0 | USART_CR2_STOP_1)) -/** - * @} - */ - -/** @defgroup SMARTCARD_Parity SMARTCARD Parity - * @{ - */ -#define SMARTCARD_PARITY_EVEN ((uint32_t)USART_CR1_PCE) -#define SMARTCARD_PARITY_ODD ((uint32_t)(USART_CR1_PCE | USART_CR1_PS)) -/** - * @} - */ - -/** @defgroup SMARTCARD_Mode SMARTCARD Mode - * @{ - */ -#define SMARTCARD_MODE_RX ((uint32_t)USART_CR1_RE) -#define SMARTCARD_MODE_TX ((uint32_t)USART_CR1_TE) -#define SMARTCARD_MODE_TX_RX ((uint32_t)(USART_CR1_TE |USART_CR1_RE)) -/** - * @} - */ - -/** @defgroup SMARTCARD_Clock_Polarity SMARTCARD Clock Polarity - * @{ - */ -#define SMARTCARD_POLARITY_LOW ((uint32_t)0x00000000) -#define SMARTCARD_POLARITY_HIGH ((uint32_t)USART_CR2_CPOL) -/** - * @} - */ - -/** @defgroup SMARTCARD_Clock_Phase SMARTCARD Clock Phase - * @{ - */ -#define SMARTCARD_PHASE_1EDGE ((uint32_t)0x00000000) -#define SMARTCARD_PHASE_2EDGE ((uint32_t)USART_CR2_CPHA) -/** - * @} - */ - -/** @defgroup SMARTCARD_Last_Bit SMARTCARD Last Bit - * @{ - */ -#define SMARTCARD_LASTBIT_DISABLE ((uint32_t)0x00000000) -#define SMARTCARD_LASTBIT_ENABLE ((uint32_t)USART_CR2_LBCL) -/** - * @} - */ - -/** @defgroup SMARTCARD_NACK_State SMARTCARD NACK State - * @{ - */ -#define SMARTCARD_NACK_ENABLE ((uint32_t)USART_CR3_NACK) -#define SMARTCARD_NACK_DISABLE ((uint32_t)0x00000000) -/** - * @} - */ - -/** @defgroup SMARTCARD_DMA_Requests SMARTCARD DMA requests - * @{ - */ -#define SMARTCARD_DMAREQ_TX ((uint32_t)USART_CR3_DMAT) -#define SMARTCARD_DMAREQ_RX ((uint32_t)USART_CR3_DMAR) -/** - * @} - */ - -/** @defgroup SMARTCARD_Prescaler SMARTCARD Prescaler - * @{ - */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV2 ((uint32_t)0x00000001) /*!< SYSCLK divided by 2 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV4 ((uint32_t)0x00000002) /*!< SYSCLK divided by 4 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV6 ((uint32_t)0x00000003) /*!< SYSCLK divided by 6 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV8 ((uint32_t)0x00000004) /*!< SYSCLK divided by 8 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV10 ((uint32_t)0x00000005) /*!< SYSCLK divided by 10 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV12 ((uint32_t)0x00000006) /*!< SYSCLK divided by 12 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV14 ((uint32_t)0x00000007) /*!< SYSCLK divided by 14 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV16 ((uint32_t)0x00000008) /*!< SYSCLK divided by 16 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV18 ((uint32_t)0x00000009) /*!< SYSCLK divided by 18 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV20 ((uint32_t)0x0000000A) /*!< SYSCLK divided by 20 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV22 ((uint32_t)0x0000000B) /*!< SYSCLK divided by 22 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV24 ((uint32_t)0x0000000C) /*!< SYSCLK divided by 24 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV26 ((uint32_t)0x0000000D) /*!< SYSCLK divided by 26 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV28 ((uint32_t)0x0000000E) /*!< SYSCLK divided by 28 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV30 ((uint32_t)0x0000000F) /*!< SYSCLK divided by 30 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV32 ((uint32_t)0x00000010) /*!< SYSCLK divided by 32 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV34 ((uint32_t)0x00000011) /*!< SYSCLK divided by 34 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV36 ((uint32_t)0x00000012) /*!< SYSCLK divided by 36 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV38 ((uint32_t)0x00000013) /*!< SYSCLK divided by 38 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV40 ((uint32_t)0x00000014) /*!< SYSCLK divided by 40 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV42 ((uint32_t)0x00000015) /*!< SYSCLK divided by 42 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV44 ((uint32_t)0x00000016) /*!< SYSCLK divided by 44 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV46 ((uint32_t)0x00000017) /*!< SYSCLK divided by 46 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV48 ((uint32_t)0x00000018) /*!< SYSCLK divided by 48 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV50 ((uint32_t)0x00000019) /*!< SYSCLK divided by 50 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV52 ((uint32_t)0x0000001A) /*!< SYSCLK divided by 52 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV54 ((uint32_t)0x0000001B) /*!< SYSCLK divided by 54 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV56 ((uint32_t)0x0000001C) /*!< SYSCLK divided by 56 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV58 ((uint32_t)0x0000001D) /*!< SYSCLK divided by 58 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV60 ((uint32_t)0x0000001E) /*!< SYSCLK divided by 60 */ -#define SMARTCARD_PRESCALER_SYSCLK_DIV62 ((uint32_t)0x0000001F) /*!< SYSCLK divided by 62 */ -/** - * @} - */ - -/** @defgroup SMARTCARD_Flags SMARTCARD Flags - * Elements values convention: 0xXXXX - * - 0xXXXX : Flag mask in the SR register - * @{ - */ -#define SMARTCARD_FLAG_TXE ((uint32_t)0x00000080) -#define SMARTCARD_FLAG_TC ((uint32_t)0x00000040) -#define SMARTCARD_FLAG_RXNE ((uint32_t)0x00000020) -#define SMARTCARD_FLAG_IDLE ((uint32_t)0x00000010) -#define SMARTCARD_FLAG_ORE ((uint32_t)0x00000008) -#define SMARTCARD_FLAG_NE ((uint32_t)0x00000004) -#define SMARTCARD_FLAG_FE ((uint32_t)0x00000002) -#define SMARTCARD_FLAG_PE ((uint32_t)0x00000001) -/** - * @} - */ - -/** @defgroup SMARTCARD_Interrupt_definition SMARTCARD Interrupts Definition - * Elements values convention: 0xY000XXXX - * - XXXX : Interrupt mask in the XX register - * - Y : Interrupt source register (2bits) - * - 01: CR1 register - * - 10: CR3 register - * @{ - */ -#define SMARTCARD_IT_PE ((uint32_t)(SMARTCARD_CR1_REG_INDEX << 28 | USART_CR1_PEIE)) -#define SMARTCARD_IT_TXE ((uint32_t)(SMARTCARD_CR1_REG_INDEX << 28 | USART_CR1_TXEIE)) -#define SMARTCARD_IT_TC ((uint32_t)(SMARTCARD_CR1_REG_INDEX << 28 | USART_CR1_TCIE)) -#define SMARTCARD_IT_RXNE ((uint32_t)(SMARTCARD_CR1_REG_INDEX << 28 | USART_CR1_RXNEIE)) -#define SMARTCARD_IT_IDLE ((uint32_t)(SMARTCARD_CR1_REG_INDEX << 28 | USART_CR1_IDLEIE)) -#define SMARTCARD_IT_ERR ((uint32_t)(SMARTCARD_CR3_REG_INDEX << 28 | USART_CR3_EIE)) -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup SMARTCARD_Exported_Macros SMARTCARD Exported Macros - * @{ - */ - -/** @brief Reset SMARTCARD handle state - * @param __HANDLE__: specifies the SMARTCARD Handle. - * @retval None - */ -#define __HAL_SMARTCARD_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_SMARTCARD_STATE_RESET) - -/** @brief Flushes the Smartcard DR register - * @param __HANDLE__: specifies the SMARTCARD Handle. - */ -#define __HAL_SMARTCARD_FLUSH_DRREGISTER(__HANDLE__) ((__HANDLE__)->Instance->DR) - -/** @brief Checks whether the specified Smartcard flag is set or not. - * @param __HANDLE__: specifies the SMARTCARD Handle. - * @param __FLAG__: specifies the flag to check. - * This parameter can be one of the following values: - * @arg SMARTCARD_FLAG_TXE: Transmit data register empty flag - * @arg SMARTCARD_FLAG_TC: Transmission Complete flag - * @arg SMARTCARD_FLAG_RXNE: Receive data register not empty flag - * @arg SMARTCARD_FLAG_IDLE: Idle Line detection flag - * @arg SMARTCARD_FLAG_ORE: Overrun Error flag - * @arg SMARTCARD_FLAG_NE: Noise Error flag - * @arg SMARTCARD_FLAG_FE: Framing Error flag - * @arg SMARTCARD_FLAG_PE: Parity Error flag - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define __HAL_SMARTCARD_GET_FLAG(__HANDLE__, __FLAG__) (((__HANDLE__)->Instance->SR & (__FLAG__)) == (__FLAG__)) - -/** @brief Clears the specified Smartcard pending flags. - * @param __HANDLE__: specifies the SMARTCARD Handle. - * @param __FLAG__: specifies the flag to check. - * This parameter can be any combination of the following values: - * @arg SMARTCARD_FLAG_TC: Transmission Complete flag. - * @arg SMARTCARD_FLAG_RXNE: Receive data register not empty flag. - * - * @note PE (Parity error), FE (Framing error), NE (Noise error) and ORE (Overrun - * error) flags are cleared by software sequence: a read operation to - * USART_SR register followed by a read operation to USART_DR register. - * @note RXNE flag can be also cleared by a read to the USART_DR register. - * @note TC flag can be also cleared by software sequence: a read operation to - * USART_SR register followed by a write operation to USART_DR register. - * @note TXE flag is cleared only by a write to the USART_DR register. - */ -#define __HAL_SMARTCARD_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->SR = ~(__FLAG__)) - -/** @brief Clear the SMARTCARD PE pending flag. - * @param __HANDLE__: specifies the USART Handle. - * This parameter can be USARTx where x: 1, 2, 3, 4, 5, 6, 7 or 8 to select the USART or - * UART peripheral. - * @retval None - */ -#define __HAL_SMARTCARD_CLEAR_PEFLAG(__HANDLE__) \ - do{ \ - __IO uint32_t tmpreg; \ - tmpreg = (__HANDLE__)->Instance->SR; \ - tmpreg = (__HANDLE__)->Instance->DR; \ - UNUSED(tmpreg); \ - } while(0) - -/** @brief Clear the SMARTCARD FE pending flag. - * @param __HANDLE__: specifies the USART Handle. - * This parameter can be USARTx where x: 1, 2, 3, 4, 5, 6, 7 or 8 to select the USART or - * UART peripheral. - * @retval None - */ -#define __HAL_SMARTCARD_CLEAR_FEFLAG(__HANDLE__) __HAL_SMARTCARD_CLEAR_PEFLAG(__HANDLE__) - -/** @brief Clear the SMARTCARD NE pending flag. - * @param __HANDLE__: specifies the USART Handle. - * This parameter can be USARTx where x: 1, 2, 3, 4, 5, 6, 7 or 8 to select the USART or - * UART peripheral. - * @retval None - */ -#define __HAL_SMARTCARD_CLEAR_NEFLAG(__HANDLE__) __HAL_SMARTCARD_CLEAR_PEFLAG(__HANDLE__) - -/** @brief Clear the SMARTCARD ORE pending flag. - * @param __HANDLE__: specifies the USART Handle. - * This parameter can be USARTx where x: 1, 2, 3, 4, 5, 6, 7 or 8 to select the USART or - * UART peripheral. - * @retval None - */ -#define __HAL_SMARTCARD_CLEAR_OREFLAG(__HANDLE__) __HAL_SMARTCARD_CLEAR_PEFLAG(__HANDLE__) - -/** @brief Clear the SMARTCARD IDLE pending flag. - * @param __HANDLE__: specifies the USART Handle. - * This parameter can be USARTx where x: 1, 2, 3, 4, 5, 6, 7 or 8 to select the USART or - * UART peripheral. - * @retval None - */ -#define __HAL_SMARTCARD_CLEAR_IDLEFLAG(__HANDLE__) __HAL_SMARTCARD_CLEAR_PEFLAG(__HANDLE__) - - -/** @brief Enables or disables the specified SmartCard interrupts. - * @param __HANDLE__: specifies the SMARTCARD Handle. - * @param __INTERRUPT__: specifies the SMARTCARD interrupt source to check. - * This parameter can be one of the following values: - * @arg SMARTCARD_IT_TXE: Transmit Data Register empty interrupt - * @arg SMARTCARD_IT_TC: Transmission complete interrupt - * @arg SMARTCARD_IT_RXNE: Receive Data register not empty interrupt - * @arg SMARTCARD_IT_IDLE: Idle line detection interrupt - * @arg SMARTCARD_IT_PE: Parity Error interrupt - * @arg SMARTCARD_IT_ERR: Error interrupt(Frame error, noise error, overrun error) - */ -#define __HAL_SMARTCARD_ENABLE_IT(__HANDLE__, __INTERRUPT__) ((((__INTERRUPT__) >> 28) == 1)? ((__HANDLE__)->Instance->CR1 |= ((__INTERRUPT__) & SMARTCARD_IT_MASK)): \ - ((__HANDLE__)->Instance->CR3 |= ((__INTERRUPT__) & SMARTCARD_IT_MASK))) -#define __HAL_SMARTCARD_DISABLE_IT(__HANDLE__, __INTERRUPT__) ((((__INTERRUPT__) >> 28) == 1)? ((__HANDLE__)->Instance->CR1 &= ~((__INTERRUPT__) & SMARTCARD_IT_MASK)): \ - ((__HANDLE__)->Instance->CR3 &= ~ ((__INTERRUPT__) & SMARTCARD_IT_MASK))) - -/** @brief Checks whether the specified SmartCard interrupt has occurred or not. - * @param __HANDLE__: specifies the SmartCard Handle. - * @param __IT__: specifies the SMARTCARD interrupt source to check. - * This parameter can be one of the following values: - * @arg SMARTCARD_IT_TXE: Transmit Data Register empty interrupt - * @arg SMARTCARD_IT_TC: Transmission complete interrupt - * @arg SMARTCARD_IT_RXNE: Receive Data register not empty interrupt - * @arg SMARTCARD_IT_IDLE: Idle line detection interrupt - * @arg SMARTCARD_IT_ERR: Error interrupt - * @arg SMARTCARD_IT_PE: Parity Error interrupt - * @retval The new state of __IT__ (TRUE or FALSE). - */ -#define __HAL_SMARTCARD_GET_IT_SOURCE(__HANDLE__, __IT__) (((((__IT__) >> 28) == 1)? (__HANDLE__)->Instance->CR1: (__HANDLE__)->Instance->CR3) & (((uint32_t)(__IT__)) & SMARTCARD_IT_MASK)) - -/** @brief Macro to enable the SMARTCARD's one bit sample method - * @param __HANDLE__: specifies the SMARTCARD Handle. - * @retval None - */ -#define __HAL_SMARTCARD_ONE_BIT_SAMPLE_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR3|= USART_CR3_ONEBIT) - -/** @brief Macro to disable the SMARTCARD's one bit sample method - * @param __HANDLE__: specifies the SMARTCARD Handle. - * @retval None - */ -#define __HAL_SMARTCARD_ONE_BIT_SAMPLE_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR3 &= (uint16_t)~((uint16_t)USART_CR3_ONEBIT)) - -/** @brief Enable the USART associated to the SMARTCARD Handle - * @param __HANDLE__: specifies the SMARTCARD Handle. - * SMARTCARD Handle selects the USARTx peripheral (USART availability and x value depending on device). - * @retval None - */ -#define __HAL_SMARTCARD_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1 |= USART_CR1_UE) - -/** @brief Disable the USART associated to the SMARTCARD Handle - * @param __HANDLE__: specifies the SMARTCARD Handle. - * SMARTCARD Handle selects the USARTx peripheral (USART availability and x value depending on device). - * @retval None - */ -#define __HAL_SMARTCARD_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1 &= ~USART_CR1_UE) - -/** @brief Macros to enable or disable the SmartCard DMA request. - * @param __HANDLE__: specifies the SmartCard Handle. - * @param __REQUEST__: specifies the SmartCard DMA request. - * This parameter can be one of the following values: - * @arg SMARTCARD_DMAREQ_TX: SmartCard DMA transmit request - * @arg SMARTCARD_DMAREQ_RX: SmartCard DMA receive request - */ -#define __HAL_SMARTCARD_DMA_REQUEST_ENABLE(__HANDLE__, __REQUEST__) ((__HANDLE__)->Instance->CR3 |= (__REQUEST__)) -#define __HAL_SMARTCARD_DMA_REQUEST_DISABLE(__HANDLE__, __REQUEST__) ((__HANDLE__)->Instance->CR3 &= ~(__REQUEST__)) - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup SMARTCARD_Exported_Functions - * @{ - */ - -/** @addtogroup SMARTCARD_Exported_Functions_Group1 - * @{ - */ -/* Initialization/de-initialization functions **********************************/ -HAL_StatusTypeDef HAL_SMARTCARD_Init(SMARTCARD_HandleTypeDef *hsc); -HAL_StatusTypeDef HAL_SMARTCARD_ReInit(SMARTCARD_HandleTypeDef *hsc); -HAL_StatusTypeDef HAL_SMARTCARD_DeInit(SMARTCARD_HandleTypeDef *hsc); -void HAL_SMARTCARD_MspInit(SMARTCARD_HandleTypeDef *hsc); -void HAL_SMARTCARD_MspDeInit(SMARTCARD_HandleTypeDef *hsc); -/** - * @} - */ - -/** @addtogroup SMARTCARD_Exported_Functions_Group2 - * @{ - */ -/* IO operation functions *******************************************************/ -HAL_StatusTypeDef HAL_SMARTCARD_Transmit(SMARTCARD_HandleTypeDef *hsc, uint8_t *pData, uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_SMARTCARD_Receive(SMARTCARD_HandleTypeDef *hsc, uint8_t *pData, uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_SMARTCARD_Transmit_IT(SMARTCARD_HandleTypeDef *hsc, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_SMARTCARD_Receive_IT(SMARTCARD_HandleTypeDef *hsc, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_SMARTCARD_Transmit_DMA(SMARTCARD_HandleTypeDef *hsc, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_SMARTCARD_Receive_DMA(SMARTCARD_HandleTypeDef *hsc, uint8_t *pData, uint16_t Size); -void HAL_SMARTCARD_IRQHandler(SMARTCARD_HandleTypeDef *hsc); -void HAL_SMARTCARD_TxCpltCallback(SMARTCARD_HandleTypeDef *hsc); -void HAL_SMARTCARD_RxCpltCallback(SMARTCARD_HandleTypeDef *hsc); -void HAL_SMARTCARD_ErrorCallback(SMARTCARD_HandleTypeDef *hsc); -/** - * @} - */ - -/** @addtogroup SMARTCARD_Exported_Functions_Group3 - * @{ - */ -/* Peripheral State functions **************************************************/ -HAL_SMARTCARD_StateTypeDef HAL_SMARTCARD_GetState(SMARTCARD_HandleTypeDef *hsc); -uint32_t HAL_SMARTCARD_GetError(SMARTCARD_HandleTypeDef *hsc); - -/** - * @} - */ - -/** - * @} - */ -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup SMARTCARD_Private_Constants SMARTCARD Private Constants - * @{ - */ - -/** @brief SMARTCARD interruptions flag mask - * - */ -#define SMARTCARD_IT_MASK ((uint32_t) USART_CR1_PEIE | USART_CR1_TXEIE | USART_CR1_TCIE | USART_CR1_RXNEIE | \ - USART_CR1_IDLEIE | USART_CR3_EIE ) -#define SMARTCARD_DIV(_PCLK_, _BAUD_) (((_PCLK_)*25)/(4*(_BAUD_))) -#define SMARTCARD_DIVMANT(_PCLK_, _BAUD_) (SMARTCARD_DIV((_PCLK_), (_BAUD_))/100) -#define SMARTCARD_DIVFRAQ(_PCLK_, _BAUD_) (((SMARTCARD_DIV((_PCLK_), (_BAUD_)) - (SMARTCARD_DIVMANT((_PCLK_), (_BAUD_)) * 100)) * 16 + 50) / 100) -#define SMARTCARD_BRR(_PCLK_, _BAUD_) ((SMARTCARD_DIVMANT((_PCLK_), (_BAUD_)) << 4)|(SMARTCARD_DIVFRAQ((_PCLK_), (_BAUD_)) & 0x0F)) - -#define SMARTCARD_CR1_REG_INDEX 1 -#define SMARTCARD_CR3_REG_INDEX 3 -/** - * @} - */ - -/* Private macros --------------------------------------------------------*/ -/** @defgroup SMARTCARD_Private_Macros SMARTCARD Private Macros - * @{ - */ -#define IS_SMARTCARD_WORD_LENGTH(LENGTH) ((LENGTH) == SMARTCARD_WORDLENGTH_9B) -#define IS_SMARTCARD_STOPBITS(STOPBITS) (((STOPBITS) == SMARTCARD_STOPBITS_0_5) || \ - ((STOPBITS) == SMARTCARD_STOPBITS_1_5)) -#define IS_SMARTCARD_PARITY(PARITY) (((PARITY) == SMARTCARD_PARITY_EVEN) || \ - ((PARITY) == SMARTCARD_PARITY_ODD)) -#define IS_SMARTCARD_MODE(MODE) ((((MODE) & (uint32_t)0x0000FFF3) == 0x00) && ((MODE) != (uint32_t)0x000000)) -#define IS_SMARTCARD_POLARITY(CPOL) (((CPOL) == SMARTCARD_POLARITY_LOW) || ((CPOL) == SMARTCARD_POLARITY_HIGH)) -#define IS_SMARTCARD_PHASE(CPHA) (((CPHA) == SMARTCARD_PHASE_1EDGE) || ((CPHA) == SMARTCARD_PHASE_2EDGE)) -#define IS_SMARTCARD_LASTBIT(LASTBIT) (((LASTBIT) == SMARTCARD_LASTBIT_DISABLE) || \ - ((LASTBIT) == SMARTCARD_LASTBIT_ENABLE)) -#define IS_SMARTCARD_NACK_STATE(NACK) (((NACK) == SMARTCARD_NACK_ENABLE) || \ - ((NACK) == SMARTCARD_NACK_DISABLE)) -#define IS_SMARTCARD_BAUDRATE(BAUDRATE) ((BAUDRATE) < 7500001) -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup SMARTCARD_Private_Functions SMARTCARD Private Functions - * @{ - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F2xx_HAL_SMARTCARD_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_spi.h b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_spi.h deleted file mode 100755 index 7c8b9585..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_spi.h +++ /dev/null @@ -1,575 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_hal_spi.h - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief Header file of SPI HAL module. - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F2xx_HAL_SPI_H -#define __STM32F2xx_HAL_SPI_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal_def.h" - -/** @addtogroup STM32F2xx_HAL_Driver - * @{ - */ - -/** @addtogroup SPI - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup SPI_Exported_Types SPI Exported Types - * @{ - */ - -/** - * @brief SPI Configuration Structure definition - */ -typedef struct -{ - uint32_t Mode; /*!< Specifies the SPI operating mode. - This parameter can be a value of @ref SPI_mode */ - - uint32_t Direction; /*!< Specifies the SPI Directional mode state. - This parameter can be a value of @ref SPI_Direction_mode */ - - uint32_t DataSize; /*!< Specifies the SPI data size. - This parameter can be a value of @ref SPI_data_size */ - - uint32_t CLKPolarity; /*!< Specifies the serial clock steady state. - This parameter can be a value of @ref SPI_Clock_Polarity */ - - uint32_t CLKPhase; /*!< Specifies the clock active edge for the bit capture. - This parameter can be a value of @ref SPI_Clock_Phase */ - - uint32_t NSS; /*!< Specifies whether the NSS signal is managed by - hardware (NSS pin) or by software using the SSI bit. - This parameter can be a value of @ref SPI_Slave_Select_management */ - - uint32_t BaudRatePrescaler; /*!< Specifies the Baud Rate prescaler value which will be - used to configure the transmit and receive SCK clock. - This parameter can be a value of @ref SPI_BaudRate_Prescaler - @note The communication clock is derived from the master - clock. The slave clock does not need to be set */ - - uint32_t FirstBit; /*!< Specifies whether data transfers start from MSB or LSB bit. - This parameter can be a value of @ref SPI_MSB_LSB_transmission */ - - uint32_t TIMode; /*!< Specifies if the TI mode is enabled or not. - This parameter can be a value of @ref SPI_TI_mode */ - - uint32_t CRCCalculation; /*!< Specifies if the CRC calculation is enabled or not. - This parameter can be a value of @ref SPI_CRC_Calculation */ - - uint32_t CRCPolynomial; /*!< Specifies the polynomial used for the CRC calculation. - This parameter must be a number between Min_Data = 0 and Max_Data = 65535 */ - -}SPI_InitTypeDef; - -/** - * @brief HAL SPI State structure definition - */ -typedef enum -{ - HAL_SPI_STATE_RESET = 0x00, /*!< SPI not yet initialized or disabled */ - HAL_SPI_STATE_READY = 0x01, /*!< SPI initialized and ready for use */ - HAL_SPI_STATE_BUSY = 0x02, /*!< SPI process is ongoing */ - HAL_SPI_STATE_BUSY_TX = 0x12, /*!< Data Transmission process is ongoing */ - HAL_SPI_STATE_BUSY_RX = 0x22, /*!< Data Reception process is ongoing */ - HAL_SPI_STATE_BUSY_TX_RX = 0x32, /*!< Data Transmission and Reception process is ongoing */ - HAL_SPI_STATE_ERROR = 0x03 /*!< SPI error state */ - -}HAL_SPI_StateTypeDef; - -/** - * @brief SPI handle Structure definition - */ -typedef struct __SPI_HandleTypeDef -{ - SPI_TypeDef *Instance; /* SPI registers base address */ - - SPI_InitTypeDef Init; /* SPI communication parameters */ - - uint8_t *pTxBuffPtr; /* Pointer to SPI Tx transfer Buffer */ - - uint16_t TxXferSize; /* SPI Tx transfer size */ - - uint16_t TxXferCount; /* SPI Tx Transfer Counter */ - - uint8_t *pRxBuffPtr; /* Pointer to SPI Rx transfer Buffer */ - - uint16_t RxXferSize; /* SPI Rx transfer size */ - - uint16_t RxXferCount; /* SPI Rx Transfer Counter */ - - DMA_HandleTypeDef *hdmatx; /* SPI Tx DMA handle parameters */ - - DMA_HandleTypeDef *hdmarx; /* SPI Rx DMA handle parameters */ - - void (*RxISR)(struct __SPI_HandleTypeDef * hspi); /* function pointer on Rx ISR */ - - void (*TxISR)(struct __SPI_HandleTypeDef * hspi); /* function pointer on Tx ISR */ - - HAL_LockTypeDef Lock; /* SPI locking object */ - - __IO HAL_SPI_StateTypeDef State; /* SPI communication state */ - - __IO uint32_t ErrorCode; /* SPI Error code */ - -}SPI_HandleTypeDef; -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup SPI_Exported_Constants SPI Exported Constants - * @{ - */ - -/** @defgroup SPI_Error_Code SPI Error Code - * @brief SPI Error Code - * @{ - */ -#define HAL_SPI_ERROR_NONE ((uint32_t)0x00000000) /*!< No error */ -#define HAL_SPI_ERROR_MODF ((uint32_t)0x00000001) /*!< MODF error */ -#define HAL_SPI_ERROR_CRC ((uint32_t)0x00000002) /*!< CRC error */ -#define HAL_SPI_ERROR_OVR ((uint32_t)0x00000004) /*!< OVR error */ -#define HAL_SPI_ERROR_FRE ((uint32_t)0x00000008) /*!< FRE error */ -#define HAL_SPI_ERROR_DMA ((uint32_t)0x00000010) /*!< DMA transfer error */ -#define HAL_SPI_ERROR_FLAG ((uint32_t)0x00000020) /*!< Flag: RXNE,TXE, BSY */ -/** - * @} - */ - -/** @defgroup SPI_mode SPI Mode - * @{ - */ -#define SPI_MODE_SLAVE ((uint32_t)0x00000000) -#define SPI_MODE_MASTER (SPI_CR1_MSTR | SPI_CR1_SSI) -/** - * @} - */ - -/** @defgroup SPI_Direction_mode SPI Direction Mode - * @{ - */ -#define SPI_DIRECTION_2LINES ((uint32_t)0x00000000) -#define SPI_DIRECTION_2LINES_RXONLY SPI_CR1_RXONLY -#define SPI_DIRECTION_1LINE SPI_CR1_BIDIMODE -/** - * @} - */ - -/** @defgroup SPI_data_size SPI Data Size - * @{ - */ -#define SPI_DATASIZE_8BIT ((uint32_t)0x00000000) -#define SPI_DATASIZE_16BIT SPI_CR1_DFF -/** - * @} - */ - -/** @defgroup SPI_Clock_Polarity SPI Clock Polarity - * @{ - */ -#define SPI_POLARITY_LOW ((uint32_t)0x00000000) -#define SPI_POLARITY_HIGH SPI_CR1_CPOL -/** - * @} - */ - -/** @defgroup SPI_Clock_Phase SPI Clock Phase - * @{ - */ -#define SPI_PHASE_1EDGE ((uint32_t)0x00000000) -#define SPI_PHASE_2EDGE SPI_CR1_CPHA -/** - * @} - */ - -/** @defgroup SPI_Slave_Select_management SPI Slave Select Management - * @{ - */ -#define SPI_NSS_SOFT SPI_CR1_SSM -#define SPI_NSS_HARD_INPUT ((uint32_t)0x00000000) -#define SPI_NSS_HARD_OUTPUT ((uint32_t)0x00040000) -/** - * @} - */ - -/** @defgroup SPI_BaudRate_Prescaler SPI BaudRate Prescaler - * @{ - */ -#define SPI_BAUDRATEPRESCALER_2 ((uint32_t)0x00000000) -#define SPI_BAUDRATEPRESCALER_4 ((uint32_t)0x00000008) -#define SPI_BAUDRATEPRESCALER_8 ((uint32_t)0x00000010) -#define SPI_BAUDRATEPRESCALER_16 ((uint32_t)0x00000018) -#define SPI_BAUDRATEPRESCALER_32 ((uint32_t)0x00000020) -#define SPI_BAUDRATEPRESCALER_64 ((uint32_t)0x00000028) -#define SPI_BAUDRATEPRESCALER_128 ((uint32_t)0x00000030) -#define SPI_BAUDRATEPRESCALER_256 ((uint32_t)0x00000038) -/** - * @} - */ - -/** @defgroup SPI_MSB_LSB_transmission SPI MSB LSB Transsmission - * @{ - */ -#define SPI_FIRSTBIT_MSB ((uint32_t)0x00000000) -#define SPI_FIRSTBIT_LSB SPI_CR1_LSBFIRST -/** - * @} - */ - -/** @defgroup SPI_TI_mode SPI TI Mode - * @{ - */ -#define SPI_TIMODE_DISABLE ((uint32_t)0x00000000) -#define SPI_TIMODE_ENABLE SPI_CR2_FRF -/** - * @} - */ - -/** @defgroup SPI_CRC_Calculation SPI CRC Calculation - * @{ - */ -#define SPI_CRCCALCULATION_DISABLE ((uint32_t)0x00000000) -#define SPI_CRCCALCULATION_ENABLE SPI_CR1_CRCEN -/** - * @} - */ - -/** @defgroup SPI_Interrupt_definition SPI Interrupt Definition - * @{ - */ -#define SPI_IT_TXE SPI_CR2_TXEIE -#define SPI_IT_RXNE SPI_CR2_RXNEIE -#define SPI_IT_ERR SPI_CR2_ERRIE -/** - * @} - */ - -/** @defgroup SPI_Flags_definition SPI Flags Definition - * @{ - */ -#define SPI_FLAG_RXNE SPI_SR_RXNE -#define SPI_FLAG_TXE SPI_SR_TXE -#define SPI_FLAG_CRCERR SPI_SR_CRCERR -#define SPI_FLAG_MODF SPI_SR_MODF -#define SPI_FLAG_OVR SPI_SR_OVR -#define SPI_FLAG_BSY SPI_SR_BSY -#define SPI_FLAG_FRE SPI_SR_FRE -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup SPI_Exported_Macros SPI Exported Macros - * @{ - */ -/** @brief Reset SPI handle state - * @param __HANDLE__: specifies the SPI handle. - * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. - * @retval None - */ -#define __HAL_SPI_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_SPI_STATE_RESET) - -/** @brief Enable or disable the specified SPI interrupts. - * @param __HANDLE__: specifies the SPI handle. - * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. - * @param __INTERRUPT__: specifies the interrupt source to enable or disable. - * This parameter can be one of the following values: - * @arg SPI_IT_TXE: Tx buffer empty interrupt enable - * @arg SPI_IT_RXNE: RX buffer not empty interrupt enable - * @arg SPI_IT_ERR: Error interrupt enable - * @retval None - */ -#define __HAL_SPI_ENABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->CR2 |= (__INTERRUPT__)) -#define __HAL_SPI_DISABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->CR2 &= (~(__INTERRUPT__))) - -/** @brief Check if the specified SPI interrupt source is enabled or disabled. - * @param __HANDLE__: specifies the SPI handle. - * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. - * @param __INTERRUPT__: specifies the SPI interrupt source to check. - * This parameter can be one of the following values: - * @arg SPI_IT_TXE: Tx buffer empty interrupt enable - * @arg SPI_IT_RXNE: RX buffer not empty interrupt enable - * @arg SPI_IT_ERR: Error interrupt enable - * @retval The new state of __IT__ (TRUE or FALSE). - */ -#define __HAL_SPI_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->CR2 & (__INTERRUPT__)) == (__INTERRUPT__)) ? SET : RESET) - -/** @brief Check whether the specified SPI flag is set or not. - * @param __HANDLE__: specifies the SPI handle. - * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. - * @param __FLAG__: specifies the flag to check. - * This parameter can be one of the following values: - * @arg SPI_FLAG_RXNE: Receive buffer not empty flag - * @arg SPI_FLAG_TXE: Transmit buffer empty flag - * @arg SPI_FLAG_CRCERR: CRC error flag - * @arg SPI_FLAG_MODF: Mode fault flag - * @arg SPI_FLAG_OVR: Overrun flag - * @arg SPI_FLAG_BSY: Busy flag - * @arg SPI_FLAG_FRE: Frame format error flag - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define __HAL_SPI_GET_FLAG(__HANDLE__, __FLAG__) ((((__HANDLE__)->Instance->SR) & (__FLAG__)) == (__FLAG__)) - -/** @brief Clear the SPI CRCERR pending flag. - * @param __HANDLE__: specifies the SPI handle. - * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. - * @retval None - */ -#define __HAL_SPI_CLEAR_CRCERRFLAG(__HANDLE__) ((__HANDLE__)->Instance->SR = ~(SPI_FLAG_CRCERR)) - -/** @brief Clear the SPI MODF pending flag. - * @param __HANDLE__: specifies the SPI handle. - * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. - * @retval None - */ -#define __HAL_SPI_CLEAR_MODFFLAG(__HANDLE__) \ - do{ \ - __IO uint32_t tmpreg; \ - tmpreg = (__HANDLE__)->Instance->SR; \ - (__HANDLE__)->Instance->CR1 &= (~SPI_CR1_SPE); \ - UNUSED(tmpreg); \ - } while(0) - -/** @brief Clear the SPI OVR pending flag. - * @param __HANDLE__: specifies the SPI handle. - * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. - * @retval None - */ -#define __HAL_SPI_CLEAR_OVRFLAG(__HANDLE__) \ - do{ \ - __IO uint32_t tmpreg; \ - tmpreg = (__HANDLE__)->Instance->DR; \ - tmpreg = (__HANDLE__)->Instance->SR; \ - UNUSED(tmpreg); \ - } while(0) - -/** @brief Clear the SPI FRE pending flag. - * @param __HANDLE__: specifies the SPI handle. - * This parameter can be SPI where x: 1, 2, or 3 to select the SPI peripheral. - * @retval None - */ -#define __HAL_SPI_CLEAR_FREFLAG(__HANDLE__) \ - do{ \ - __IO uint32_t tmpreg; \ - tmpreg = (__HANDLE__)->Instance->SR; \ - UNUSED(tmpreg); \ - }while(0) - -/** @brief Enable SPI - * @param __HANDLE__: specifies the SPI Handle. - * @retval None - */ -#define __HAL_SPI_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1 |= SPI_CR1_SPE) - -/** @brief Disable SPI - * @param __HANDLE__: specifies the SPI Handle. - * @retval None - */ -#define __HAL_SPI_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1 &= ~SPI_CR1_SPE) -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup SPI_Exported_Functions - * @{ - */ - -/** @addtogroup SPI_Exported_Functions_Group1 - * @{ - */ -/* Initialization/de-initialization functions **********************************/ -HAL_StatusTypeDef HAL_SPI_Init(SPI_HandleTypeDef *hspi); -HAL_StatusTypeDef HAL_SPI_DeInit (SPI_HandleTypeDef *hspi); -void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi); -void HAL_SPI_MspDeInit(SPI_HandleTypeDef *hspi); -/** - * @} - */ - -/** @addtogroup SPI_Exported_Functions_Group2 - * @{ - */ -/* I/O operation functions *****************************************************/ -HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_SPI_Transmit_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_SPI_Receive_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_SPI_TransmitReceive_IT(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size); -HAL_StatusTypeDef HAL_SPI_Transmit_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_SPI_Receive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size); -HAL_StatusTypeDef HAL_SPI_TransmitReceive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size); -HAL_StatusTypeDef HAL_SPI_DMAPause(SPI_HandleTypeDef *hspi); -HAL_StatusTypeDef HAL_SPI_DMAResume(SPI_HandleTypeDef *hspi); -HAL_StatusTypeDef HAL_SPI_DMAStop(SPI_HandleTypeDef *hspi); - -void HAL_SPI_IRQHandler(SPI_HandleTypeDef *hspi); -void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi); -void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi); -void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi); -void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi); -void HAL_SPI_TxHalfCpltCallback(SPI_HandleTypeDef *hspi); -void HAL_SPI_RxHalfCpltCallback(SPI_HandleTypeDef *hspi); -void HAL_SPI_TxRxHalfCpltCallback(SPI_HandleTypeDef *hspi); -/** - * @} - */ - -/** @addtogroup SPI_Exported_Functions_Group3 - * @{ - */ -/* Peripheral State and Control functions **************************************/ -HAL_SPI_StateTypeDef HAL_SPI_GetState(SPI_HandleTypeDef *hspi); -uint32_t HAL_SPI_GetError(SPI_HandleTypeDef *hspi); - -/** - * @} - */ - -/** - * @} - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup SPI_Private_Constants SPI Private Constants - * @{ - */ -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup SPI_Private_Macros SPI Private Macros - * @{ - */ - -#define IS_SPI_MODE(MODE) (((MODE) == SPI_MODE_SLAVE) || \ - ((MODE) == SPI_MODE_MASTER)) - - -#define IS_SPI_DIRECTION_MODE(MODE) (((MODE) == SPI_DIRECTION_2LINES) || \ - ((MODE) == SPI_DIRECTION_2LINES_RXONLY) || \ - ((MODE) == SPI_DIRECTION_1LINE)) - -#define IS_SPI_DIRECTION_2LINES_OR_1LINE(MODE) (((MODE) == SPI_DIRECTION_2LINES) || \ - ((MODE) == SPI_DIRECTION_1LINE)) - -#define IS_SPI_DIRECTION_2LINES(MODE) ((MODE) == SPI_DIRECTION_2LINES) - -#define IS_SPI_DATASIZE(DATASIZE) (((DATASIZE) == SPI_DATASIZE_16BIT) || \ - ((DATASIZE) == SPI_DATASIZE_8BIT)) - -#define IS_SPI_CPOL(CPOL) (((CPOL) == SPI_POLARITY_LOW) || \ - ((CPOL) == SPI_POLARITY_HIGH)) - -#define IS_SPI_CPHA(CPHA) (((CPHA) == SPI_PHASE_1EDGE) || \ - ((CPHA) == SPI_PHASE_2EDGE)) - -#define IS_SPI_NSS(NSS) (((NSS) == SPI_NSS_SOFT) || \ - ((NSS) == SPI_NSS_HARD_INPUT) || \ - ((NSS) == SPI_NSS_HARD_OUTPUT)) - -#define IS_SPI_BAUDRATE_PRESCALER(PRESCALER) (((PRESCALER) == SPI_BAUDRATEPRESCALER_2) || \ - ((PRESCALER) == SPI_BAUDRATEPRESCALER_4) || \ - ((PRESCALER) == SPI_BAUDRATEPRESCALER_8) || \ - ((PRESCALER) == SPI_BAUDRATEPRESCALER_16) || \ - ((PRESCALER) == SPI_BAUDRATEPRESCALER_32) || \ - ((PRESCALER) == SPI_BAUDRATEPRESCALER_64) || \ - ((PRESCALER) == SPI_BAUDRATEPRESCALER_128) || \ - ((PRESCALER) == SPI_BAUDRATEPRESCALER_256)) - -#define IS_SPI_FIRST_BIT(BIT) (((BIT) == SPI_FIRSTBIT_MSB) || \ - ((BIT) == SPI_FIRSTBIT_LSB)) - -#define IS_SPI_TIMODE(MODE) (((MODE) == SPI_TIMODE_DISABLE) || \ - ((MODE) == SPI_TIMODE_ENABLE)) - -#define IS_SPI_CRC_CALCULATION(CALCULATION) (((CALCULATION) == SPI_CRCCALCULATION_DISABLE) || \ - ((CALCULATION) == SPI_CRCCALCULATION_ENABLE)) - -#define IS_SPI_CRC_POLYNOMIAL(POLYNOMIAL) (((POLYNOMIAL) >= 0x1) && ((POLYNOMIAL) <= 0xFFFF)) - -#define SPI_1LINE_TX(__HANDLE__) ((__HANDLE__)->Instance->CR1 |= SPI_CR1_BIDIOE) - -#define SPI_1LINE_RX(__HANDLE__) ((__HANDLE__)->Instance->CR1 &= ~SPI_CR1_BIDIOE) - -#define SPI_RESET_CRC(__HANDLE__) do{(__HANDLE__)->Instance->CR1 &= (~SPI_CR1_CRCEN);\ - (__HANDLE__)->Instance->CR1 |= SPI_CR1_CRCEN;}while(0) -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup SPI_Private_Functions SPI Private Functions - * @{ - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F2xx_HAL_SPI_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_sram.h b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_sram.h deleted file mode 100755 index 6c415907..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_sram.h +++ /dev/null @@ -1,191 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_hal_sram.h - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief Header file of SRAM HAL module. - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F2xx_HAL_SRAM_H -#define __STM32F2xx_HAL_SRAM_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_ll_fsmc.h" - -/** @addtogroup STM32F2xx_HAL_Driver - * @{ - */ - -/** @addtogroup SRAM - * @{ - */ - -/* Exported typedef ----------------------------------------------------------*/ - -/** @defgroup SRAM_Exported_Types SRAM Exported Types - * @{ - */ -/** - * @brief HAL SRAM State structures definition - */ -typedef enum -{ - HAL_SRAM_STATE_RESET = 0x00, /*!< SRAM not yet initialized or disabled */ - HAL_SRAM_STATE_READY = 0x01, /*!< SRAM initialized and ready for use */ - HAL_SRAM_STATE_BUSY = 0x02, /*!< SRAM internal process is ongoing */ - HAL_SRAM_STATE_ERROR = 0x03, /*!< SRAM error state */ - HAL_SRAM_STATE_PROTECTED = 0x04 /*!< SRAM peripheral NORSRAM device write protected */ - -}HAL_SRAM_StateTypeDef; - -/** - * @brief SRAM handle Structure definition - */ -typedef struct -{ - FSMC_NORSRAM_TypeDef *Instance; /*!< Register base address */ - - FSMC_NORSRAM_EXTENDED_TypeDef *Extended; /*!< Extended mode register base address */ - - FSMC_NORSRAM_InitTypeDef Init; /*!< SRAM device control configuration parameters */ - - HAL_LockTypeDef Lock; /*!< SRAM locking object */ - - __IO HAL_SRAM_StateTypeDef State; /*!< SRAM device access state */ - - DMA_HandleTypeDef *hdma; /*!< Pointer DMA handler */ - -}SRAM_HandleTypeDef; - -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/* Exported macro ------------------------------------------------------------*/ - -/** @defgroup SRAM_Exported_Macros SRAM Exported Macros - * @{ - */ -/** @brief Reset SRAM handle state - * @param __HANDLE__: SRAM handle - * @retval None - */ -#define __HAL_SRAM_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_SRAM_STATE_RESET) - -/** - * @} - */ -/* Exported functions --------------------------------------------------------*/ - -/** @addtogroup SRAM_Exported_Functions - * @{ - */ - -/** @addtogroup SRAM_Exported_Functions_Group1 - * @{ - */ -/* Initialization/de-initialization functions **********************************/ -HAL_StatusTypeDef HAL_SRAM_Init(SRAM_HandleTypeDef *hsram, FSMC_NORSRAM_TimingTypeDef *Timing, FSMC_NORSRAM_TimingTypeDef *ExtTiming); -HAL_StatusTypeDef HAL_SRAM_DeInit(SRAM_HandleTypeDef *hsram); -void HAL_SRAM_MspInit(SRAM_HandleTypeDef *hsram); -void HAL_SRAM_MspDeInit(SRAM_HandleTypeDef *hsram); - -void HAL_SRAM_DMA_XferCpltCallback(DMA_HandleTypeDef *hdma); -void HAL_SRAM_DMA_XferErrorCallback(DMA_HandleTypeDef *hdma); -/** - * @} - */ - -/** @addtogroup SRAM_Exported_Functions_Group2 - * @{ - */ -/* I/O operation functions *****************************************************/ -HAL_StatusTypeDef HAL_SRAM_Read_8b(SRAM_HandleTypeDef *hsram, uint32_t *pAddress, uint8_t *pDstBuffer, uint32_t BufferSize); -HAL_StatusTypeDef HAL_SRAM_Write_8b(SRAM_HandleTypeDef *hsram, uint32_t *pAddress, uint8_t *pSrcBuffer, uint32_t BufferSize); -HAL_StatusTypeDef HAL_SRAM_Read_16b(SRAM_HandleTypeDef *hsram, uint32_t *pAddress, uint16_t *pDstBuffer, uint32_t BufferSize); -HAL_StatusTypeDef HAL_SRAM_Write_16b(SRAM_HandleTypeDef *hsram, uint32_t *pAddress, uint16_t *pSrcBuffer, uint32_t BufferSize); -HAL_StatusTypeDef HAL_SRAM_Read_32b(SRAM_HandleTypeDef *hsram, uint32_t *pAddress, uint32_t *pDstBuffer, uint32_t BufferSize); -HAL_StatusTypeDef HAL_SRAM_Write_32b(SRAM_HandleTypeDef *hsram, uint32_t *pAddress, uint32_t *pSrcBuffer, uint32_t BufferSize); -HAL_StatusTypeDef HAL_SRAM_Read_DMA(SRAM_HandleTypeDef *hsram, uint32_t *pAddress, uint32_t *pDstBuffer, uint32_t BufferSize); -HAL_StatusTypeDef HAL_SRAM_Write_DMA(SRAM_HandleTypeDef *hsram, uint32_t *pAddress, uint32_t *pSrcBuffer, uint32_t BufferSize); -/** - * @} - */ - -/** @addtogroup SRAM_Exported_Functions_Group3 - * @{ - */ -/* SRAM Control functions ******************************************************/ -HAL_StatusTypeDef HAL_SRAM_WriteOperation_Enable(SRAM_HandleTypeDef *hsram); -HAL_StatusTypeDef HAL_SRAM_WriteOperation_Disable(SRAM_HandleTypeDef *hsram); -/** - * @} - */ - -/** @addtogroup SRAM_Exported_Functions_Group4 - * @{ - */ -/* SRAM State functions *********************************************************/ -HAL_SRAM_StateTypeDef HAL_SRAM_GetState(SRAM_HandleTypeDef *hsram); -/** - * @} - */ - -/** - * @} - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/** - * @} - */ - -/** - * @} - */ -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F2xx_HAL_SRAM_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_tim.h b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_tim.h deleted file mode 100755 index 0b9e0f30..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_tim.h +++ /dev/null @@ -1,1609 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_hal_tim.h - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief Header file of TIM HAL module. - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F2xx_HAL_TIM_H -#define __STM32F2xx_HAL_TIM_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal_def.h" - -/** @addtogroup STM32F2xx_HAL_Driver - * @{ - */ - -/** @addtogroup TIM - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup TIM_Exported_Types TIM Exported Types - * @{ - */ - -/** - * @brief TIM Time base Configuration Structure definition - */ -typedef struct -{ - uint32_t Prescaler; /*!< Specifies the prescaler value used to divide the TIM clock. - This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */ - - uint32_t CounterMode; /*!< Specifies the counter mode. - This parameter can be a value of @ref TIM_Counter_Mode */ - - uint32_t Period; /*!< Specifies the period value to be loaded into the active - Auto-Reload Register at the next update event. - This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF. */ - - uint32_t ClockDivision; /*!< Specifies the clock division. - This parameter can be a value of @ref TIM_ClockDivision */ - - uint32_t RepetitionCounter; /*!< Specifies the repetition counter value. Each time the RCR downcounter - reaches zero, an update event is generated and counting restarts - from the RCR value (N). - This means in PWM mode that (N+1) corresponds to: - - the number of PWM periods in edge-aligned mode - - the number of half PWM period in center-aligned mode - This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF. - @note This parameter is valid only for TIM1 and TIM8. */ -} TIM_Base_InitTypeDef; - -/** - * @brief TIM Output Compare Configuration Structure definition - */ - -typedef struct -{ - uint32_t OCMode; /*!< Specifies the TIM mode. - This parameter can be a value of @ref TIM_Output_Compare_and_PWM_modes */ - - uint32_t Pulse; /*!< Specifies the pulse value to be loaded into the Capture Compare Register. - This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */ - - uint32_t OCPolarity; /*!< Specifies the output polarity. - This parameter can be a value of @ref TIM_Output_Compare_Polarity */ - - uint32_t OCNPolarity; /*!< Specifies the complementary output polarity. - This parameter can be a value of @ref TIM_Output_Compare_N_Polarity - @note This parameter is valid only for TIM1 and TIM8. */ - - uint32_t OCFastMode; /*!< Specifies the Fast mode state. - This parameter can be a value of @ref TIM_Output_Fast_State - @note This parameter is valid only in PWM1 and PWM2 mode. */ - - - uint32_t OCIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. - This parameter can be a value of @ref TIM_Output_Compare_Idle_State - @note This parameter is valid only for TIM1 and TIM8. */ - - uint32_t OCNIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. - This parameter can be a value of @ref TIM_Output_Compare_N_Idle_State - @note This parameter is valid only for TIM1 and TIM8. */ -} TIM_OC_InitTypeDef; - -/** - * @brief TIM One Pulse Mode Configuration Structure definition - */ -typedef struct -{ - uint32_t OCMode; /*!< Specifies the TIM mode. - This parameter can be a value of @ref TIM_Output_Compare_and_PWM_modes */ - - uint32_t Pulse; /*!< Specifies the pulse value to be loaded into the Capture Compare Register. - This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */ - - uint32_t OCPolarity; /*!< Specifies the output polarity. - This parameter can be a value of @ref TIM_Output_Compare_Polarity */ - - uint32_t OCNPolarity; /*!< Specifies the complementary output polarity. - This parameter can be a value of @ref TIM_Output_Compare_N_Polarity - @note This parameter is valid only for TIM1 and TIM8. */ - - uint32_t OCIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. - This parameter can be a value of @ref TIM_Output_Compare_Idle_State - @note This parameter is valid only for TIM1 and TIM8. */ - - uint32_t OCNIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. - This parameter can be a value of @ref TIM_Output_Compare_N_Idle_State - @note This parameter is valid only for TIM1 and TIM8. */ - - uint32_t ICPolarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Input_Capture_Polarity */ - - uint32_t ICSelection; /*!< Specifies the input. - This parameter can be a value of @ref TIM_Input_Capture_Selection */ - - uint32_t ICFilter; /*!< Specifies the input capture filter. - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ -} TIM_OnePulse_InitTypeDef; - - -/** - * @brief TIM Input Capture Configuration Structure definition - */ - -typedef struct -{ - uint32_t ICPolarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Input_Capture_Polarity */ - - uint32_t ICSelection; /*!< Specifies the input. - This parameter can be a value of @ref TIM_Input_Capture_Selection */ - - uint32_t ICPrescaler; /*!< Specifies the Input Capture Prescaler. - This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ - - uint32_t ICFilter; /*!< Specifies the input capture filter. - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ -} TIM_IC_InitTypeDef; - -/** - * @brief TIM Encoder Configuration Structure definition - */ - -typedef struct -{ - uint32_t EncoderMode; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Encoder_Mode */ - - uint32_t IC1Polarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Input_Capture_Polarity */ - - uint32_t IC1Selection; /*!< Specifies the input. - This parameter can be a value of @ref TIM_Input_Capture_Selection */ - - uint32_t IC1Prescaler; /*!< Specifies the Input Capture Prescaler. - This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ - - uint32_t IC1Filter; /*!< Specifies the input capture filter. - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ - - uint32_t IC2Polarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Input_Capture_Polarity */ - - uint32_t IC2Selection; /*!< Specifies the input. - This parameter can be a value of @ref TIM_Input_Capture_Selection */ - - uint32_t IC2Prescaler; /*!< Specifies the Input Capture Prescaler. - This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ - - uint32_t IC2Filter; /*!< Specifies the input capture filter. - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ -} TIM_Encoder_InitTypeDef; - -/** - * @brief Clock Configuration Handle Structure definition - */ -typedef struct -{ - uint32_t ClockSource; /*!< TIM clock sources. - This parameter can be a value of @ref TIM_Clock_Source */ - uint32_t ClockPolarity; /*!< TIM clock polarity. - This parameter can be a value of @ref TIM_Clock_Polarity */ - uint32_t ClockPrescaler; /*!< TIM clock prescaler. - This parameter can be a value of @ref TIM_Clock_Prescaler */ - uint32_t ClockFilter; /*!< TIM clock filter. - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ -}TIM_ClockConfigTypeDef; - -/** - * @brief Clear Input Configuration Handle Structure definition - */ -typedef struct -{ - uint32_t ClearInputState; /*!< TIM clear Input state. - This parameter can be ENABLE or DISABLE */ - uint32_t ClearInputSource; /*!< TIM clear Input sources. - This parameter can be a value of @ref TIM_ClearInput_Source */ - uint32_t ClearInputPolarity; /*!< TIM Clear Input polarity. - This parameter can be a value of @ref TIM_ClearInput_Polarity */ - uint32_t ClearInputPrescaler; /*!< TIM Clear Input prescaler. - This parameter can be a value of @ref TIM_ClearInput_Prescaler */ - uint32_t ClearInputFilter; /*!< TIM Clear Input filter. - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ -}TIM_ClearInputConfigTypeDef; - -/** - * @brief TIM Slave configuration Structure definition - */ -typedef struct { - uint32_t SlaveMode; /*!< Slave mode selection - This parameter can be a value of @ref TIM_Slave_Mode */ - uint32_t InputTrigger; /*!< Input Trigger source - This parameter can be a value of @ref TIM_Trigger_Selection */ - uint32_t TriggerPolarity; /*!< Input Trigger polarity - This parameter can be a value of @ref TIM_Trigger_Polarity */ - uint32_t TriggerPrescaler; /*!< Input trigger prescaler - This parameter can be a value of @ref TIM_Trigger_Prescaler */ - uint32_t TriggerFilter; /*!< Input trigger filter - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ - -}TIM_SlaveConfigTypeDef; - -/** - * @brief HAL State structures definition - */ -typedef enum -{ - HAL_TIM_STATE_RESET = 0x00, /*!< Peripheral not yet initialized or disabled */ - HAL_TIM_STATE_READY = 0x01, /*!< Peripheral Initialized and ready for use */ - HAL_TIM_STATE_BUSY = 0x02, /*!< An internal process is ongoing */ - HAL_TIM_STATE_TIMEOUT = 0x03, /*!< Timeout state */ - HAL_TIM_STATE_ERROR = 0x04 /*!< Reception process is ongoing */ -}HAL_TIM_StateTypeDef; - -/** - * @brief HAL Active channel structures definition - */ -typedef enum -{ - HAL_TIM_ACTIVE_CHANNEL_1 = 0x01, /*!< The active channel is 1 */ - HAL_TIM_ACTIVE_CHANNEL_2 = 0x02, /*!< The active channel is 2 */ - HAL_TIM_ACTIVE_CHANNEL_3 = 0x04, /*!< The active channel is 3 */ - HAL_TIM_ACTIVE_CHANNEL_4 = 0x08, /*!< The active channel is 4 */ - HAL_TIM_ACTIVE_CHANNEL_CLEARED = 0x00 /*!< All active channels cleared */ -}HAL_TIM_ActiveChannel; - -/** - * @brief TIM Time Base Handle Structure definition - */ -typedef struct -{ - TIM_TypeDef *Instance; /*!< Register base address */ - TIM_Base_InitTypeDef Init; /*!< TIM Time Base required parameters */ - HAL_TIM_ActiveChannel Channel; /*!< Active channel */ - DMA_HandleTypeDef *hdma[7]; /*!< DMA Handlers array - This array is accessed by a @ref DMA_Handle_index */ - HAL_LockTypeDef Lock; /*!< Locking object */ - __IO HAL_TIM_StateTypeDef State; /*!< TIM operation state */ -}TIM_HandleTypeDef; -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup TIM_Exported_Constants TIM Exported Constants - * @{ - */ - -/** @defgroup TIM_Input_Channel_Polarity TIM Input Channel Polarity - * @{ - */ -#define TIM_INPUTCHANNELPOLARITY_RISING ((uint32_t)0x00000000) /*!< Polarity for TIx source */ -#define TIM_INPUTCHANNELPOLARITY_FALLING (TIM_CCER_CC1P) /*!< Polarity for TIx source */ -#define TIM_INPUTCHANNELPOLARITY_BOTHEDGE (TIM_CCER_CC1P | TIM_CCER_CC1NP) /*!< Polarity for TIx source */ -/** - * @} - */ - -/** @defgroup TIM_ETR_Polarity TIM ETR Polarity - * @{ - */ -#define TIM_ETRPOLARITY_INVERTED (TIM_SMCR_ETP) /*!< Polarity for ETR source */ -#define TIM_ETRPOLARITY_NONINVERTED ((uint32_t)0x0000) /*!< Polarity for ETR source */ -/** - * @} - */ - -/** @defgroup TIM_ETR_Prescaler TIM ETR Prescaler - * @{ - */ -#define TIM_ETRPRESCALER_DIV1 ((uint32_t)0x0000) /*!< No prescaler is used */ -#define TIM_ETRPRESCALER_DIV2 (TIM_SMCR_ETPS_0) /*!< ETR input source is divided by 2 */ -#define TIM_ETRPRESCALER_DIV4 (TIM_SMCR_ETPS_1) /*!< ETR input source is divided by 4 */ -#define TIM_ETRPRESCALER_DIV8 (TIM_SMCR_ETPS) /*!< ETR input source is divided by 8 */ -/** - * @} - */ - -/** @defgroup TIM_Counter_Mode TIM Counter Mode - * @{ - */ -#define TIM_COUNTERMODE_UP ((uint32_t)0x0000) -#define TIM_COUNTERMODE_DOWN TIM_CR1_DIR -#define TIM_COUNTERMODE_CENTERALIGNED1 TIM_CR1_CMS_0 -#define TIM_COUNTERMODE_CENTERALIGNED2 TIM_CR1_CMS_1 -#define TIM_COUNTERMODE_CENTERALIGNED3 TIM_CR1_CMS -/** - * @} - */ - -/** @defgroup TIM_ClockDivision TIM Clock Division - * @{ - */ -#define TIM_CLOCKDIVISION_DIV1 ((uint32_t)0x0000) -#define TIM_CLOCKDIVISION_DIV2 (TIM_CR1_CKD_0) -#define TIM_CLOCKDIVISION_DIV4 (TIM_CR1_CKD_1) -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_and_PWM_modes TIM Output Compare and PWM modes - * @{ - */ -#define TIM_OCMODE_TIMING ((uint32_t)0x0000) -#define TIM_OCMODE_ACTIVE (TIM_CCMR1_OC1M_0) -#define TIM_OCMODE_INACTIVE (TIM_CCMR1_OC1M_1) -#define TIM_OCMODE_TOGGLE (TIM_CCMR1_OC1M_0 | TIM_CCMR1_OC1M_1) -#define TIM_OCMODE_PWM1 (TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2) -#define TIM_OCMODE_PWM2 (TIM_CCMR1_OC1M) -#define TIM_OCMODE_FORCED_ACTIVE (TIM_CCMR1_OC1M_0 | TIM_CCMR1_OC1M_2) -#define TIM_OCMODE_FORCED_INACTIVE (TIM_CCMR1_OC1M_2) - -/** - * @} - */ - -/** @defgroup TIM_Output_Fast_State TIM Output Fast State - * @{ - */ -#define TIM_OCFAST_DISABLE ((uint32_t)0x0000) -#define TIM_OCFAST_ENABLE (TIM_CCMR1_OC1FE) -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_Polarity TIM Output Compare Polarity - * @{ - */ -#define TIM_OCPOLARITY_HIGH ((uint32_t)0x0000) -#define TIM_OCPOLARITY_LOW (TIM_CCER_CC1P) -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_N_Polarity TIM Output CompareN Polarity - * @{ - */ -#define TIM_OCNPOLARITY_HIGH ((uint32_t)0x0000) -#define TIM_OCNPOLARITY_LOW (TIM_CCER_CC1NP) -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_Idle_State TIM Output Compare Idle State - * @{ - */ -#define TIM_OCIDLESTATE_SET (TIM_CR2_OIS1) -#define TIM_OCIDLESTATE_RESET ((uint32_t)0x0000) -/** - * @} - */ - -/** @defgroup TIM_Output_Compare_N_Idle_State TIM Output Compare N Idle State - * @{ - */ -#define TIM_OCNIDLESTATE_SET (TIM_CR2_OIS1N) -#define TIM_OCNIDLESTATE_RESET ((uint32_t)0x0000) -/** - * @} - */ - -/** @defgroup TIM_Channel TIM Channel - * @{ - */ -#define TIM_CHANNEL_1 ((uint32_t)0x0000) -#define TIM_CHANNEL_2 ((uint32_t)0x0004) -#define TIM_CHANNEL_3 ((uint32_t)0x0008) -#define TIM_CHANNEL_4 ((uint32_t)0x000C) -#define TIM_CHANNEL_ALL ((uint32_t)0x0018) - -/** - * @} - */ - -/** @defgroup TIM_Input_Capture_Polarity TIM Input Capture Polarity - * @{ - */ -#define TIM_ICPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING -#define TIM_ICPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING -#define TIM_ICPOLARITY_BOTHEDGE TIM_INPUTCHANNELPOLARITY_BOTHEDGE -/** - * @} - */ - -/** @defgroup TIM_Input_Capture_Selection TIM Input Capture Selection - * @{ - */ -#define TIM_ICSELECTION_DIRECTTI (TIM_CCMR1_CC1S_0) /*!< TIM Input 1, 2, 3 or 4 is selected to be - connected to IC1, IC2, IC3 or IC4, respectively */ -#define TIM_ICSELECTION_INDIRECTTI (TIM_CCMR1_CC1S_1) /*!< TIM Input 1, 2, 3 or 4 is selected to be - connected to IC2, IC1, IC4 or IC3, respectively */ -#define TIM_ICSELECTION_TRC (TIM_CCMR1_CC1S) /*!< TIM Input 1, 2, 3 or 4 is selected to be connected to TRC */ - -/** - * @} - */ - -/** @defgroup TIM_Input_Capture_Prescaler TIM Input Capture Prescaler - * @{ - */ -#define TIM_ICPSC_DIV1 ((uint32_t)0x0000) /*!< Capture performed each time an edge is detected on the capture input */ -#define TIM_ICPSC_DIV2 (TIM_CCMR1_IC1PSC_0) /*!< Capture performed once every 2 events */ -#define TIM_ICPSC_DIV4 (TIM_CCMR1_IC1PSC_1) /*!< Capture performed once every 4 events */ -#define TIM_ICPSC_DIV8 (TIM_CCMR1_IC1PSC) /*!< Capture performed once every 8 events */ -/** - * @} - */ - -/** @defgroup TIM_One_Pulse_Mode TIM One Pulse Mode - * @{ - */ -#define TIM_OPMODE_SINGLE (TIM_CR1_OPM) -#define TIM_OPMODE_REPETITIVE ((uint32_t)0x0000) -/** - * @} - */ - -/** @defgroup TIM_Encoder_Mode TIM Encoder Mode - * @{ - */ -#define TIM_ENCODERMODE_TI1 (TIM_SMCR_SMS_0) -#define TIM_ENCODERMODE_TI2 (TIM_SMCR_SMS_1) -#define TIM_ENCODERMODE_TI12 (TIM_SMCR_SMS_1 | TIM_SMCR_SMS_0) - -/** - * @} - */ - -/** @defgroup TIM_Interrupt_definition TIM Interrupt definition - * @{ - */ -#define TIM_IT_UPDATE (TIM_DIER_UIE) -#define TIM_IT_CC1 (TIM_DIER_CC1IE) -#define TIM_IT_CC2 (TIM_DIER_CC2IE) -#define TIM_IT_CC3 (TIM_DIER_CC3IE) -#define TIM_IT_CC4 (TIM_DIER_CC4IE) -#define TIM_IT_COM (TIM_DIER_COMIE) -#define TIM_IT_TRIGGER (TIM_DIER_TIE) -#define TIM_IT_BREAK (TIM_DIER_BIE) -/** - * @} - */ - -/** @defgroup TIM_Commutation_Source TIM Commutation Source - * @{ - */ -#define TIM_COMMUTATION_TRGI (TIM_CR2_CCUS) -#define TIM_COMMUTATION_SOFTWARE ((uint32_t)0x0000) -/** - * @} - */ - -/** @defgroup TIM_DMA_sources TIM DMA sources - * @{ - */ -#define TIM_DMA_UPDATE (TIM_DIER_UDE) -#define TIM_DMA_CC1 (TIM_DIER_CC1DE) -#define TIM_DMA_CC2 (TIM_DIER_CC2DE) -#define TIM_DMA_CC3 (TIM_DIER_CC3DE) -#define TIM_DMA_CC4 (TIM_DIER_CC4DE) -#define TIM_DMA_COM (TIM_DIER_COMDE) -#define TIM_DMA_TRIGGER (TIM_DIER_TDE) -/** - * @} - */ - -/** @defgroup TIM_Event_Source TIM Event Source - * @{ - */ -#define TIM_EVENTSOURCE_UPDATE TIM_EGR_UG -#define TIM_EVENTSOURCE_CC1 TIM_EGR_CC1G -#define TIM_EVENTSOURCE_CC2 TIM_EGR_CC2G -#define TIM_EVENTSOURCE_CC3 TIM_EGR_CC3G -#define TIM_EVENTSOURCE_CC4 TIM_EGR_CC4G -#define TIM_EVENTSOURCE_COM TIM_EGR_COMG -#define TIM_EVENTSOURCE_TRIGGER TIM_EGR_TG -#define TIM_EVENTSOURCE_BREAK TIM_EGR_BG - -/** - * @} - */ - -/** @defgroup TIM_Flag_definition TIM Flag definition - * @{ - */ -#define TIM_FLAG_UPDATE (TIM_SR_UIF) -#define TIM_FLAG_CC1 (TIM_SR_CC1IF) -#define TIM_FLAG_CC2 (TIM_SR_CC2IF) -#define TIM_FLAG_CC3 (TIM_SR_CC3IF) -#define TIM_FLAG_CC4 (TIM_SR_CC4IF) -#define TIM_FLAG_COM (TIM_SR_COMIF) -#define TIM_FLAG_TRIGGER (TIM_SR_TIF) -#define TIM_FLAG_BREAK (TIM_SR_BIF) -#define TIM_FLAG_CC1OF (TIM_SR_CC1OF) -#define TIM_FLAG_CC2OF (TIM_SR_CC2OF) -#define TIM_FLAG_CC3OF (TIM_SR_CC3OF) -#define TIM_FLAG_CC4OF (TIM_SR_CC4OF) -/** - * @} - */ - -/** @defgroup TIM_Clock_Source TIM Clock Source - * @{ - */ -#define TIM_CLOCKSOURCE_ETRMODE2 (TIM_SMCR_ETPS_1) -#define TIM_CLOCKSOURCE_INTERNAL (TIM_SMCR_ETPS_0) -#define TIM_CLOCKSOURCE_ITR0 ((uint32_t)0x0000) -#define TIM_CLOCKSOURCE_ITR1 (TIM_SMCR_TS_0) -#define TIM_CLOCKSOURCE_ITR2 (TIM_SMCR_TS_1) -#define TIM_CLOCKSOURCE_ITR3 (TIM_SMCR_TS_0 | TIM_SMCR_TS_1) -#define TIM_CLOCKSOURCE_TI1ED (TIM_SMCR_TS_2) -#define TIM_CLOCKSOURCE_TI1 (TIM_SMCR_TS_0 | TIM_SMCR_TS_2) -#define TIM_CLOCKSOURCE_TI2 (TIM_SMCR_TS_1 | TIM_SMCR_TS_2) -#define TIM_CLOCKSOURCE_ETRMODE1 (TIM_SMCR_TS) -/** - * @} - */ - -/** @defgroup TIM_Clock_Polarity TIM Clock Polarity - * @{ - */ -#define TIM_CLOCKPOLARITY_INVERTED TIM_ETRPOLARITY_INVERTED /*!< Polarity for ETRx clock sources */ -#define TIM_CLOCKPOLARITY_NONINVERTED TIM_ETRPOLARITY_NONINVERTED /*!< Polarity for ETRx clock sources */ -#define TIM_CLOCKPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Polarity for TIx clock sources */ -#define TIM_CLOCKPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Polarity for TIx clock sources */ -#define TIM_CLOCKPOLARITY_BOTHEDGE TIM_INPUTCHANNELPOLARITY_BOTHEDGE /*!< Polarity for TIx clock sources */ -/** - * @} - */ - -/** @defgroup TIM_Clock_Prescaler TIM Clock Prescaler - * @{ - */ -#define TIM_CLOCKPRESCALER_DIV1 TIM_ETRPRESCALER_DIV1 /*!< No prescaler is used */ -#define TIM_CLOCKPRESCALER_DIV2 TIM_ETRPRESCALER_DIV2 /*!< Prescaler for External ETR Clock: Capture performed once every 2 events. */ -#define TIM_CLOCKPRESCALER_DIV4 TIM_ETRPRESCALER_DIV4 /*!< Prescaler for External ETR Clock: Capture performed once every 4 events. */ -#define TIM_CLOCKPRESCALER_DIV8 TIM_ETRPRESCALER_DIV8 /*!< Prescaler for External ETR Clock: Capture performed once every 8 events. */ -/** - * @} - */ - -/** @defgroup TIM_ClearInput_Source TIM Clear Input Source - * @{ - */ -#define TIM_CLEARINPUTSOURCE_ETR ((uint32_t)0x0001) -#define TIM_CLEARINPUTSOURCE_NONE ((uint32_t)0x0000) -/** - * @} - */ - -/** @defgroup TIM_ClearInput_Polarity TIM Clear Input Polarity - * @{ - */ -#define TIM_CLEARINPUTPOLARITY_INVERTED TIM_ETRPOLARITY_INVERTED /*!< Polarity for ETRx pin */ -#define TIM_CLEARINPUTPOLARITY_NONINVERTED TIM_ETRPOLARITY_NONINVERTED /*!< Polarity for ETRx pin */ -/** - * @} - */ - -/** @defgroup TIM_ClearInput_Prescaler TIM Clear Input Prescaler - * @{ - */ -#define TIM_CLEARINPUTPRESCALER_DIV1 TIM_ETRPRESCALER_DIV1 /*!< No prescaler is used */ -#define TIM_CLEARINPUTPRESCALER_DIV2 TIM_ETRPRESCALER_DIV2 /*!< Prescaler for External ETR pin: Capture performed once every 2 events. */ -#define TIM_CLEARINPUTPRESCALER_DIV4 TIM_ETRPRESCALER_DIV4 /*!< Prescaler for External ETR pin: Capture performed once every 4 events. */ -#define TIM_CLEARINPUTPRESCALER_DIV8 TIM_ETRPRESCALER_DIV8 /*!< Prescaler for External ETR pin: Capture performed once every 8 events. */ -/** - * @} - */ - -/** @defgroup TIM_OSSR_Off_State_Selection_for_Run_mode_state TIM OSSR OffState Selection for Run mode state - * @{ - */ -#define TIM_OSSR_ENABLE (TIM_BDTR_OSSR) -#define TIM_OSSR_DISABLE ((uint32_t)0x0000) -/** - * @} - */ - -/** @defgroup TIM_OSSI_Off_State_Selection_for_Idle_mode_state TIM OSSI OffState Selection for Idle mode state - * @{ - */ -#define TIM_OSSI_ENABLE (TIM_BDTR_OSSI) -#define TIM_OSSI_DISABLE ((uint32_t)0x0000) -/** - * @} - */ - -/** @defgroup TIM_Lock_level TIM Lock level - * @{ - */ -#define TIM_LOCKLEVEL_OFF ((uint32_t)0x0000) -#define TIM_LOCKLEVEL_1 (TIM_BDTR_LOCK_0) -#define TIM_LOCKLEVEL_2 (TIM_BDTR_LOCK_1) -#define TIM_LOCKLEVEL_3 (TIM_BDTR_LOCK) -/** - * @} - */ -/** @defgroup TIM_Break_Input_enable_disable TIM Break Input State - * @{ - */ -#define TIM_BREAK_ENABLE (TIM_BDTR_BKE) -#define TIM_BREAK_DISABLE ((uint32_t)0x0000) -/** - * @} - */ - -/** @defgroup TIM_Break_Polarity TIM Break Polarity - * @{ - */ -#define TIM_BREAKPOLARITY_LOW ((uint32_t)0x0000) -#define TIM_BREAKPOLARITY_HIGH (TIM_BDTR_BKP) -/** - * @} - */ - -/** @defgroup TIM_AOE_Bit_Set_Reset TIM AOE Bit State - * @{ - */ -#define TIM_AUTOMATICOUTPUT_ENABLE (TIM_BDTR_AOE) -#define TIM_AUTOMATICOUTPUT_DISABLE ((uint32_t)0x0000) -/** - * @} - */ - -/** @defgroup TIM_Master_Mode_Selection TIM Master Mode Selection - * @{ - */ -#define TIM_TRGO_RESET ((uint32_t)0x0000) -#define TIM_TRGO_ENABLE (TIM_CR2_MMS_0) -#define TIM_TRGO_UPDATE (TIM_CR2_MMS_1) -#define TIM_TRGO_OC1 ((TIM_CR2_MMS_1 | TIM_CR2_MMS_0)) -#define TIM_TRGO_OC1REF (TIM_CR2_MMS_2) -#define TIM_TRGO_OC2REF ((TIM_CR2_MMS_2 | TIM_CR2_MMS_0)) -#define TIM_TRGO_OC3REF ((TIM_CR2_MMS_2 | TIM_CR2_MMS_1)) -#define TIM_TRGO_OC4REF ((TIM_CR2_MMS_2 | TIM_CR2_MMS_1 | TIM_CR2_MMS_0)) -/** - * @} - */ - -/** @defgroup TIM_Slave_Mode TIM Slave Mode - * @{ - */ -#define TIM_SLAVEMODE_DISABLE ((uint32_t)0x0000) -#define TIM_SLAVEMODE_RESET ((uint32_t)0x0004) -#define TIM_SLAVEMODE_GATED ((uint32_t)0x0005) -#define TIM_SLAVEMODE_TRIGGER ((uint32_t)0x0006) -#define TIM_SLAVEMODE_EXTERNAL1 ((uint32_t)0x0007) -/** - * @} - */ - -/** @defgroup TIM_Master_Slave_Mode TIM Master Slave Mode - * @{ - */ -#define TIM_MASTERSLAVEMODE_ENABLE ((uint32_t)0x0080) -#define TIM_MASTERSLAVEMODE_DISABLE ((uint32_t)0x0000) -/** - * @} - */ - -/** @defgroup TIM_Trigger_Selection TIM Trigger Selection - * @{ - */ -#define TIM_TS_ITR0 ((uint32_t)0x0000) -#define TIM_TS_ITR1 ((uint32_t)0x0010) -#define TIM_TS_ITR2 ((uint32_t)0x0020) -#define TIM_TS_ITR3 ((uint32_t)0x0030) -#define TIM_TS_TI1F_ED ((uint32_t)0x0040) -#define TIM_TS_TI1FP1 ((uint32_t)0x0050) -#define TIM_TS_TI2FP2 ((uint32_t)0x0060) -#define TIM_TS_ETRF ((uint32_t)0x0070) -#define TIM_TS_NONE ((uint32_t)0xFFFF) -/** - * @} - */ - -/** @defgroup TIM_Trigger_Polarity TIM Trigger Polarity - * @{ - */ -#define TIM_TRIGGERPOLARITY_INVERTED TIM_ETRPOLARITY_INVERTED /*!< Polarity for ETRx trigger sources */ -#define TIM_TRIGGERPOLARITY_NONINVERTED TIM_ETRPOLARITY_NONINVERTED /*!< Polarity for ETRx trigger sources */ -#define TIM_TRIGGERPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Polarity for TIxFPx or TI1_ED trigger sources */ -#define TIM_TRIGGERPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Polarity for TIxFPx or TI1_ED trigger sources */ -#define TIM_TRIGGERPOLARITY_BOTHEDGE TIM_INPUTCHANNELPOLARITY_BOTHEDGE /*!< Polarity for TIxFPx or TI1_ED trigger sources */ -/** - * @} - */ - -/** @defgroup TIM_Trigger_Prescaler TIM Trigger Prescaler - * @{ - */ -#define TIM_TRIGGERPRESCALER_DIV1 TIM_ETRPRESCALER_DIV1 /*!< No prescaler is used */ -#define TIM_TRIGGERPRESCALER_DIV2 TIM_ETRPRESCALER_DIV2 /*!< Prescaler for External ETR Trigger: Capture performed once every 2 events. */ -#define TIM_TRIGGERPRESCALER_DIV4 TIM_ETRPRESCALER_DIV4 /*!< Prescaler for External ETR Trigger: Capture performed once every 4 events. */ -#define TIM_TRIGGERPRESCALER_DIV8 TIM_ETRPRESCALER_DIV8 /*!< Prescaler for External ETR Trigger: Capture performed once every 8 events. */ -/** - * @} - */ - - -/** @defgroup TIM_TI1_Selection TIM TI1 Selection - * @{ - */ -#define TIM_TI1SELECTION_CH1 ((uint32_t)0x0000) -#define TIM_TI1SELECTION_XORCOMBINATION (TIM_CR2_TI1S) -/** - * @} - */ - -/** @defgroup TIM_DMA_Base_address TIM DMA Base address - * @{ - */ -#define TIM_DMABASE_CR1 (0x00000000) -#define TIM_DMABASE_CR2 (0x00000001) -#define TIM_DMABASE_SMCR (0x00000002) -#define TIM_DMABASE_DIER (0x00000003) -#define TIM_DMABASE_SR (0x00000004) -#define TIM_DMABASE_EGR (0x00000005) -#define TIM_DMABASE_CCMR1 (0x00000006) -#define TIM_DMABASE_CCMR2 (0x00000007) -#define TIM_DMABASE_CCER (0x00000008) -#define TIM_DMABASE_CNT (0x00000009) -#define TIM_DMABASE_PSC (0x0000000A) -#define TIM_DMABASE_ARR (0x0000000B) -#define TIM_DMABASE_RCR (0x0000000C) -#define TIM_DMABASE_CCR1 (0x0000000D) -#define TIM_DMABASE_CCR2 (0x0000000E) -#define TIM_DMABASE_CCR3 (0x0000000F) -#define TIM_DMABASE_CCR4 (0x00000010) -#define TIM_DMABASE_BDTR (0x00000011) -#define TIM_DMABASE_DCR (0x00000012) -#define TIM_DMABASE_OR (0x00000013) -/** - * @} - */ - -/** @defgroup TIM_DMA_Burst_Length TIM DMA Burst Length - * @{ - */ -#define TIM_DMABURSTLENGTH_1TRANSFER (0x00000000) -#define TIM_DMABURSTLENGTH_2TRANSFERS (0x00000100) -#define TIM_DMABURSTLENGTH_3TRANSFERS (0x00000200) -#define TIM_DMABURSTLENGTH_4TRANSFERS (0x00000300) -#define TIM_DMABURSTLENGTH_5TRANSFERS (0x00000400) -#define TIM_DMABURSTLENGTH_6TRANSFERS (0x00000500) -#define TIM_DMABURSTLENGTH_7TRANSFERS (0x00000600) -#define TIM_DMABURSTLENGTH_8TRANSFERS (0x00000700) -#define TIM_DMABURSTLENGTH_9TRANSFERS (0x00000800) -#define TIM_DMABURSTLENGTH_10TRANSFERS (0x00000900) -#define TIM_DMABURSTLENGTH_11TRANSFERS (0x00000A00) -#define TIM_DMABURSTLENGTH_12TRANSFERS (0x00000B00) -#define TIM_DMABURSTLENGTH_13TRANSFERS (0x00000C00) -#define TIM_DMABURSTLENGTH_14TRANSFERS (0x00000D00) -#define TIM_DMABURSTLENGTH_15TRANSFERS (0x00000E00) -#define TIM_DMABURSTLENGTH_16TRANSFERS (0x00000F00) -#define TIM_DMABURSTLENGTH_17TRANSFERS (0x00001000) -#define TIM_DMABURSTLENGTH_18TRANSFERS (0x00001100) -/** - * @} - */ - -/** @defgroup DMA_Handle_index DMA Handle index - * @{ - */ -#define TIM_DMA_ID_UPDATE ((uint16_t) 0x0) /*!< Index of the DMA handle used for Update DMA requests */ -#define TIM_DMA_ID_CC1 ((uint16_t) 0x1) /*!< Index of the DMA handle used for Capture/Compare 1 DMA requests */ -#define TIM_DMA_ID_CC2 ((uint16_t) 0x2) /*!< Index of the DMA handle used for Capture/Compare 2 DMA requests */ -#define TIM_DMA_ID_CC3 ((uint16_t) 0x3) /*!< Index of the DMA handle used for Capture/Compare 3 DMA requests */ -#define TIM_DMA_ID_CC4 ((uint16_t) 0x4) /*!< Index of the DMA handle used for Capture/Compare 4 DMA requests */ -#define TIM_DMA_ID_COMMUTATION ((uint16_t) 0x5) /*!< Index of the DMA handle used for Commutation DMA requests */ -#define TIM_DMA_ID_TRIGGER ((uint16_t) 0x6) /*!< Index of the DMA handle used for Trigger DMA requests */ -/** - * @} - */ - -/** @defgroup Channel_CC_State Channel CC State - * @{ - */ -#define TIM_CCx_ENABLE ((uint32_t)0x0001) -#define TIM_CCx_DISABLE ((uint32_t)0x0000) -#define TIM_CCxN_ENABLE ((uint32_t)0x0004) -#define TIM_CCxN_DISABLE ((uint32_t)0x0000) -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup TIM_Exported_Macros TIM Exported Macros - * @{ - */ -/** @brief Reset TIM handle state - * @param __HANDLE__: TIM handle - * @retval None - */ -#define __HAL_TIM_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_TIM_STATE_RESET) - -/** - * @brief Enable the TIM peripheral. - * @param __HANDLE__: TIM handle - * @retval None - */ -#define __HAL_TIM_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1|=(TIM_CR1_CEN)) - -/** - * @brief Enable the TIM main Output. - * @param __HANDLE__: TIM handle - * @retval None - */ -#define __HAL_TIM_MOE_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->BDTR|=(TIM_BDTR_MOE)) - - -/** - * @brief Disable the TIM peripheral. - * @param __HANDLE__: TIM handle - * @retval None - */ -#define __HAL_TIM_DISABLE(__HANDLE__) \ - do { \ - if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0) \ - { \ - if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0) \ - { \ - (__HANDLE__)->Instance->CR1 &= ~(TIM_CR1_CEN); \ - } \ - } \ - } while(0) - -/* The Main Output of a timer instance is disabled only if all the CCx and CCxN - channels have been disabled */ -/** - * @brief Disable the TIM main Output. - * @param __HANDLE__: TIM handle - * @retval None - */ -#define __HAL_TIM_MOE_DISABLE(__HANDLE__) \ - do { \ - if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0) \ - { \ - if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0) \ - { \ - (__HANDLE__)->Instance->BDTR &= ~(TIM_BDTR_MOE); \ - } \ - } \ - } while(0) - -#define __HAL_TIM_ENABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->DIER |= (__INTERRUPT__)) -#define __HAL_TIM_ENABLE_DMA(__HANDLE__, __DMA__) ((__HANDLE__)->Instance->DIER |= (__DMA__)) -#define __HAL_TIM_DISABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->DIER &= ~(__INTERRUPT__)) -#define __HAL_TIM_DISABLE_DMA(__HANDLE__, __DMA__) ((__HANDLE__)->Instance->DIER &= ~(__DMA__)) -#define __HAL_TIM_GET_FLAG(__HANDLE__, __FLAG__) (((__HANDLE__)->Instance->SR &(__FLAG__)) == (__FLAG__)) -#define __HAL_TIM_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->SR = ~(__FLAG__)) - -#define __HAL_TIM_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->DIER & (__INTERRUPT__)) == (__INTERRUPT__)) ? SET : RESET) -#define __HAL_TIM_CLEAR_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->SR = ~(__INTERRUPT__)) - -#define __HAL_TIM_IS_TIM_COUNTING_DOWN(__HANDLE__) (((__HANDLE__)->Instance->CR1 &(TIM_CR1_DIR)) == (TIM_CR1_DIR)) -#define __HAL_TIM_SET_PRESCALER(__HANDLE__, __PRESC__) ((__HANDLE__)->Instance->PSC = (__PRESC__)) - -#define TIM_SET_ICPRESCALERVALUE(__HANDLE__, __CHANNEL__, __ICPSC__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= (__ICPSC__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= ((__ICPSC__) << 8)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= (__ICPSC__)) :\ - ((__HANDLE__)->Instance->CCMR2 |= ((__ICPSC__) << 8))) - -#define TIM_RESET_ICPRESCALERVALUE(__HANDLE__, __CHANNEL__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= (uint16_t)~TIM_CCMR1_IC1PSC) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= (uint16_t)~TIM_CCMR1_IC2PSC) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= (uint16_t)~TIM_CCMR2_IC3PSC) :\ - ((__HANDLE__)->Instance->CCMR2 &= (uint16_t)~TIM_CCMR2_IC4PSC)) - -#define TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER |= (__POLARITY__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 4)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 8)) :\ - ((__HANDLE__)->Instance->CCER |= (((__POLARITY__) << 12) & TIM_CCER_CC4P))) - -#define TIM_RESET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER &= (uint16_t)~(TIM_CCER_CC1P | TIM_CCER_CC1NP)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER &= (uint16_t)~(TIM_CCER_CC2P | TIM_CCER_CC2NP)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER &= (uint16_t)~(TIM_CCER_CC3P | TIM_CCER_CC3NP)) :\ - ((__HANDLE__)->Instance->CCER &= (uint16_t)~TIM_CCER_CC4P)) - -/** - * @brief Sets the TIM Capture Compare Register value on runtime without - * calling another time ConfigChannel function. - * @param __HANDLE__: TIM handle. - * @param __CHANNEL__ : TIM Channels to be configured. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @param __COMPARE__: specifies the Capture Compare register new value. - * @retval None - */ -#define __HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__) \ -(*(__IO uint32_t *)(&((__HANDLE__)->Instance->CCR1) + ((__CHANNEL__) >> 2)) = (__COMPARE__)) - -/** - * @brief Gets the TIM Capture Compare Register value on runtime - * @param __HANDLE__: TIM handle. - * @param __CHANNEL__ : TIM Channel associated with the capture compare register - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: get capture/compare 1 register value - * @arg TIM_CHANNEL_2: get capture/compare 2 register value - * @arg TIM_CHANNEL_3: get capture/compare 3 register value - * @arg TIM_CHANNEL_4: get capture/compare 4 register value - * @retval None - */ -#define __HAL_TIM_GET_COMPARE(__HANDLE__, __CHANNEL__) \ - (*(__IO uint32_t *)(&((__HANDLE__)->Instance->CCR1) + ((__CHANNEL__) >> 2))) - -/** - * @brief Sets the TIM Counter Register value on runtime. - * @param __HANDLE__: TIM handle. - * @param __COUNTER__: specifies the Counter register new value. - * @retval None - */ -#define __HAL_TIM_SET_COUNTER(__HANDLE__, __COUNTER__) ((__HANDLE__)->Instance->CNT = (__COUNTER__)) - -/** - * @brief Gets the TIM Counter Register value on runtime. - * @param __HANDLE__: TIM handle. - * @retval None - */ -#define __HAL_TIM_GET_COUNTER(__HANDLE__) ((__HANDLE__)->Instance->CNT) - -/** - * @brief Sets the TIM Autoreload Register value on runtime without calling - * another time any Init function. - * @param __HANDLE__: TIM handle. - * @param __AUTORELOAD__: specifies the Counter register new value. - * @retval None - */ -#define __HAL_TIM_SET_AUTORELOAD(__HANDLE__, __AUTORELOAD__) \ - do{ \ - (__HANDLE__)->Instance->ARR = (__AUTORELOAD__); \ - (__HANDLE__)->Init.Period = (__AUTORELOAD__); \ - } while(0) -/** - * @brief Gets the TIM Autoreload Register value on runtime - * @param __HANDLE__: TIM handle. - * @retval None - */ -#define __HAL_TIM_GET_AUTORELOAD(__HANDLE__) ((__HANDLE__)->Instance->ARR) - -/** - * @brief Sets the TIM Clock Division value on runtime without calling - * another time any Init function. - * @param __HANDLE__: TIM handle. - * @param __CKD__: specifies the clock division value. - * This parameter can be one of the following value: - * @arg TIM_CLOCKDIVISION_DIV1 - * @arg TIM_CLOCKDIVISION_DIV2 - * @arg TIM_CLOCKDIVISION_DIV4 - * @retval None - */ -#define __HAL_TIM_SET_CLOCKDIVISION(__HANDLE__, __CKD__) \ - do{ \ - (__HANDLE__)->Instance->CR1 &= (uint16_t)(~TIM_CR1_CKD); \ - (__HANDLE__)->Instance->CR1 |= (__CKD__); \ - (__HANDLE__)->Init.ClockDivision = (__CKD__); \ - } while(0) -/** - * @brief Gets the TIM Clock Division value on runtime - * @param __HANDLE__: TIM handle. - * @retval None - */ -#define __HAL_TIM_GET_CLOCKDIVISION(__HANDLE__) ((__HANDLE__)->Instance->CR1 & TIM_CR1_CKD) - -/** - * @brief Sets the TIM Input Capture prescaler on runtime without calling - * another time HAL_TIM_IC_ConfigChannel() function. - * @param __HANDLE__: TIM handle. - * @param __CHANNEL__ : TIM Channels to be configured. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @param __ICPSC__: specifies the Input Capture4 prescaler new value. - * This parameter can be one of the following values: - * @arg TIM_ICPSC_DIV1: no prescaler - * @arg TIM_ICPSC_DIV2: capture is done once every 2 events - * @arg TIM_ICPSC_DIV4: capture is done once every 4 events - * @arg TIM_ICPSC_DIV8: capture is done once every 8 events - * @retval None - */ -#define __HAL_TIM_SET_ICPRESCALER(__HANDLE__, __CHANNEL__, __ICPSC__) \ - do{ \ - TIM_RESET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__)); \ - TIM_SET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__), (__ICPSC__)); \ - } while(0) - -/** - * @brief Gets the TIM Input Capture prescaler on runtime - * @param __HANDLE__: TIM handle. - * @param __CHANNEL__ : TIM Channels to be configured. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: get input capture 1 prescaler value - * @arg TIM_CHANNEL_2: get input capture 2 prescaler value - * @arg TIM_CHANNEL_3: get input capture 3 prescaler value - * @arg TIM_CHANNEL_4: get input capture 4 prescaler value - * @retval None - */ -#define __HAL_TIM_GET_ICPRESCALER(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 & TIM_CCMR1_IC1PSC) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? (((__HANDLE__)->Instance->CCMR1 & TIM_CCMR1_IC2PSC) >> 8) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 & TIM_CCMR2_IC3PSC) :\ - (((__HANDLE__)->Instance->CCMR2 & TIM_CCMR2_IC4PSC)) >> 8) - -/** - * @brief Set the Update Request Source (URS) bit of the TIMx_CR1 register - * @param __HANDLE__: TIM handle. - * @note When the USR bit of the TIMx_CR1 register is set, only counter - * overflow/underflow generates an update interrupt or DMA request (if - * enabled) - * @retval None - */ -#define __HAL_TIM_URS_ENABLE(__HANDLE__) \ - ((__HANDLE__)->Instance->CR1|= (TIM_CR1_URS)) - -/** - * @brief Reset the Update Request Source (URS) bit of the TIMx_CR1 register - * @param __HANDLE__: TIM handle. - * @note When the USR bit of the TIMx_CR1 register is reset, any of the - * following events generate an update interrupt or DMA request (if - * enabled): - * _ Counter overflow/underflow - * _ Setting the UG bit - * _ Update generation through the slave mode controller - * @retval None - */ -#define __HAL_TIM_URS_DISABLE(__HANDLE__) \ - ((__HANDLE__)->Instance->CR1&=~(TIM_CR1_URS)) - -/** - * @brief Sets the TIM Capture x input polarity on runtime. - * @param __HANDLE__: TIM handle. - * @param __CHANNEL__: TIM Channels to be configured. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @param __POLARITY__: Polarity for TIx source - * @arg TIM_INPUTCHANNELPOLARITY_RISING: Rising Edge - * @arg TIM_INPUTCHANNELPOLARITY_FALLING: Falling Edge - * @arg TIM_INPUTCHANNELPOLARITY_BOTHEDGE: Rising and Falling Edge - * @note The polarity TIM_INPUTCHANNELPOLARITY_BOTHEDGE is not authorized for TIM Channel 4. - * @retval None - */ -#define __HAL_TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \ - do{ \ - TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__)); \ - TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \ - }while(0) -/** - * @} - */ - -/* Include TIM HAL Extension module */ -#include "stm32f2xx_hal_tim_ex.h" - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup TIM_Exported_Functions - * @{ - */ - -/** @addtogroup TIM_Exported_Functions_Group1 - * @{ - */ - -/* Time Base functions ********************************************************/ -HAL_StatusTypeDef HAL_TIM_Base_Init(TIM_HandleTypeDef *htim); -HAL_StatusTypeDef HAL_TIM_Base_DeInit(TIM_HandleTypeDef *htim); -void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim); -void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef *htim); -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim); -HAL_StatusTypeDef HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim); -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim); -HAL_StatusTypeDef HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim); -/* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIM_Base_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pData, uint16_t Length); -HAL_StatusTypeDef HAL_TIM_Base_Stop_DMA(TIM_HandleTypeDef *htim); -/** - * @} - */ - -/** @addtogroup TIM_Exported_Functions_Group2 - * @{ - */ -/* Timer Output Compare functions **********************************************/ -HAL_StatusTypeDef HAL_TIM_OC_Init(TIM_HandleTypeDef *htim); -HAL_StatusTypeDef HAL_TIM_OC_DeInit(TIM_HandleTypeDef *htim); -void HAL_TIM_OC_MspInit(TIM_HandleTypeDef *htim); -void HAL_TIM_OC_MspDeInit(TIM_HandleTypeDef *htim); -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIM_OC_Start(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_OC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIM_OC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_OC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIM_OC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length); -HAL_StatusTypeDef HAL_TIM_OC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); - -/** - * @} - */ - -/** @addtogroup TIM_Exported_Functions_Group3 - * @{ - */ -/* Timer PWM functions *********************************************************/ -HAL_StatusTypeDef HAL_TIM_PWM_Init(TIM_HandleTypeDef *htim); -HAL_StatusTypeDef HAL_TIM_PWM_DeInit(TIM_HandleTypeDef *htim); -void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim); -void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef *htim); -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_PWM_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIM_PWM_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_PWM_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIM_PWM_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length); -HAL_StatusTypeDef HAL_TIM_PWM_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); - -/** - * @} - */ - -/** @addtogroup TIM_Exported_Functions_Group4 - * @{ - */ -/* Timer Input Capture functions ***********************************************/ -HAL_StatusTypeDef HAL_TIM_IC_Init(TIM_HandleTypeDef *htim); -HAL_StatusTypeDef HAL_TIM_IC_DeInit(TIM_HandleTypeDef *htim); -void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim); -void HAL_TIM_IC_MspDeInit(TIM_HandleTypeDef *htim); -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIM_IC_Start(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_IC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIM_IC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_IC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIM_IC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length); -HAL_StatusTypeDef HAL_TIM_IC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); - -/** - * @} - */ - -/** @addtogroup TIM_Exported_Functions_Group5 - * @{ - */ -/* Timer One Pulse functions ***************************************************/ -HAL_StatusTypeDef HAL_TIM_OnePulse_Init(TIM_HandleTypeDef *htim, uint32_t OnePulseMode); -HAL_StatusTypeDef HAL_TIM_OnePulse_DeInit(TIM_HandleTypeDef *htim); -void HAL_TIM_OnePulse_MspInit(TIM_HandleTypeDef *htim); -void HAL_TIM_OnePulse_MspDeInit(TIM_HandleTypeDef *htim); -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIM_OnePulse_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel); -HAL_StatusTypeDef HAL_TIM_OnePulse_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel); - -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIM_OnePulse_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel); -HAL_StatusTypeDef HAL_TIM_OnePulse_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel); - -/** - * @} - */ - -/** @addtogroup TIM_Exported_Functions_Group6 - * @{ - */ -/* Timer Encoder functions *****************************************************/ -HAL_StatusTypeDef HAL_TIM_Encoder_Init(TIM_HandleTypeDef *htim, TIM_Encoder_InitTypeDef* sConfig); -HAL_StatusTypeDef HAL_TIM_Encoder_DeInit(TIM_HandleTypeDef *htim); -void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef *htim); -void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef *htim); - /* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); -/* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, uint32_t *pData2, uint16_t Length); -HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); - -/** - * @} - */ - -/** @addtogroup TIM_Exported_Functions_Group7 - * @{ - */ -/* Interrupt Handler functions **********************************************/ -void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim); - -/** - * @} - */ - -/** @addtogroup TIM_Exported_Functions_Group8 - * @{ - */ -/* Control functions *********************************************************/ -HAL_StatusTypeDef HAL_TIM_OC_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef* sConfig, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef* sConfig, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_IC_ConfigChannel(TIM_HandleTypeDef *htim, TIM_IC_InitTypeDef* sConfig, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef* sConfig, uint32_t OutputChannel, uint32_t InputChannel); -HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim, TIM_ClearInputConfigTypeDef * sClearInputConfig, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_ConfigClockSource(TIM_HandleTypeDef *htim, TIM_ClockConfigTypeDef * sClockSourceConfig); -HAL_StatusTypeDef HAL_TIM_ConfigTI1Input(TIM_HandleTypeDef *htim, uint32_t TI1_Selection); -HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchronization(TIM_HandleTypeDef *htim, TIM_SlaveConfigTypeDef * sSlaveConfig); -HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchronization_IT(TIM_HandleTypeDef *htim, TIM_SlaveConfigTypeDef * sSlaveConfig); -HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, uint32_t BurstRequestSrc, \ - uint32_t *BurstBuffer, uint32_t BurstLength); -HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc); -HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, uint32_t BurstRequestSrc, \ - uint32_t *BurstBuffer, uint32_t BurstLength); -HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc); -HAL_StatusTypeDef HAL_TIM_GenerateEvent(TIM_HandleTypeDef *htim, uint32_t EventSource); -uint32_t HAL_TIM_ReadCapturedValue(TIM_HandleTypeDef *htim, uint32_t Channel); - -/** - * @} - */ - -/** @addtogroup TIM_Exported_Functions_Group9 - * @{ - */ -/* Callback in non blocking modes (Interrupt and DMA) *************************/ -void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_TriggerCallback(TIM_HandleTypeDef *htim); -void HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim); - -/** - * @} - */ - -/** @addtogroup TIM_Exported_Functions_Group10 - * @{ - */ -/* Peripheral State functions **************************************************/ -HAL_TIM_StateTypeDef HAL_TIM_Base_GetState(TIM_HandleTypeDef *htim); -HAL_TIM_StateTypeDef HAL_TIM_OC_GetState(TIM_HandleTypeDef *htim); -HAL_TIM_StateTypeDef HAL_TIM_PWM_GetState(TIM_HandleTypeDef *htim); -HAL_TIM_StateTypeDef HAL_TIM_IC_GetState(TIM_HandleTypeDef *htim); -HAL_TIM_StateTypeDef HAL_TIM_OnePulse_GetState(TIM_HandleTypeDef *htim); -HAL_TIM_StateTypeDef HAL_TIM_Encoder_GetState(TIM_HandleTypeDef *htim); - -/** - * @} - */ - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup TIM_Private_Macros TIM Private Macros - * @{ - */ - -/** @defgroup TIM_IS_TIM_Definitions TIM Private macros to check input parameters - * @{ - */ -#define IS_TIM_COUNTER_MODE(MODE) (((MODE) == TIM_COUNTERMODE_UP) || \ - ((MODE) == TIM_COUNTERMODE_DOWN) || \ - ((MODE) == TIM_COUNTERMODE_CENTERALIGNED1) || \ - ((MODE) == TIM_COUNTERMODE_CENTERALIGNED2) || \ - ((MODE) == TIM_COUNTERMODE_CENTERALIGNED3)) - -#define IS_TIM_CLOCKDIVISION_DIV(DIV) (((DIV) == TIM_CLOCKDIVISION_DIV1) || \ - ((DIV) == TIM_CLOCKDIVISION_DIV2) || \ - ((DIV) == TIM_CLOCKDIVISION_DIV4)) - -#define IS_TIM_PWM_MODE(MODE) (((MODE) == TIM_OCMODE_PWM1) || \ - ((MODE) == TIM_OCMODE_PWM2)) - -#define IS_TIM_OC_MODE(MODE) (((MODE) == TIM_OCMODE_TIMING) || \ - ((MODE) == TIM_OCMODE_ACTIVE) || \ - ((MODE) == TIM_OCMODE_INACTIVE) || \ - ((MODE) == TIM_OCMODE_TOGGLE) || \ - ((MODE) == TIM_OCMODE_FORCED_ACTIVE) || \ - ((MODE) == TIM_OCMODE_FORCED_INACTIVE)) - -#define IS_TIM_FAST_STATE(STATE) (((STATE) == TIM_OCFAST_DISABLE) || \ - ((STATE) == TIM_OCFAST_ENABLE)) - -#define IS_TIM_OC_POLARITY(POLARITY) (((POLARITY) == TIM_OCPOLARITY_HIGH) || \ - ((POLARITY) == TIM_OCPOLARITY_LOW)) - -#define IS_TIM_OCN_POLARITY(POLARITY) (((POLARITY) == TIM_OCNPOLARITY_HIGH) || \ - ((POLARITY) == TIM_OCNPOLARITY_LOW)) - -#define IS_TIM_OCIDLE_STATE(STATE) (((STATE) == TIM_OCIDLESTATE_SET) || \ - ((STATE) == TIM_OCIDLESTATE_RESET)) - -#define IS_TIM_OCNIDLE_STATE(STATE) (((STATE) == TIM_OCNIDLESTATE_SET) || \ - ((STATE) == TIM_OCNIDLESTATE_RESET)) - -#define IS_TIM_CHANNELS(CHANNEL) (((CHANNEL) == TIM_CHANNEL_1) || \ - ((CHANNEL) == TIM_CHANNEL_2) || \ - ((CHANNEL) == TIM_CHANNEL_3) || \ - ((CHANNEL) == TIM_CHANNEL_4) || \ - ((CHANNEL) == TIM_CHANNEL_ALL)) - -#define IS_TIM_OPM_CHANNELS(CHANNEL) (((CHANNEL) == TIM_CHANNEL_1) || \ - ((CHANNEL) == TIM_CHANNEL_2)) - -#define IS_TIM_COMPLEMENTARY_CHANNELS(CHANNEL) (((CHANNEL) == TIM_CHANNEL_1) || \ - ((CHANNEL) == TIM_CHANNEL_2) || \ - ((CHANNEL) == TIM_CHANNEL_3)) - -#define IS_TIM_IC_POLARITY(POLARITY) (((POLARITY) == TIM_ICPOLARITY_RISING) || \ - ((POLARITY) == TIM_ICPOLARITY_FALLING) || \ - ((POLARITY) == TIM_ICPOLARITY_BOTHEDGE)) - -#define IS_TIM_IC_SELECTION(SELECTION) (((SELECTION) == TIM_ICSELECTION_DIRECTTI) || \ - ((SELECTION) == TIM_ICSELECTION_INDIRECTTI) || \ - ((SELECTION) == TIM_ICSELECTION_TRC)) - -#define IS_TIM_IC_PRESCALER(PRESCALER) (((PRESCALER) == TIM_ICPSC_DIV1) || \ - ((PRESCALER) == TIM_ICPSC_DIV2) || \ - ((PRESCALER) == TIM_ICPSC_DIV4) || \ - ((PRESCALER) == TIM_ICPSC_DIV8)) - -#define IS_TIM_OPM_MODE(MODE) (((MODE) == TIM_OPMODE_SINGLE) || \ - ((MODE) == TIM_OPMODE_REPETITIVE)) - -#define IS_TIM_DMA_SOURCE(SOURCE) ((((SOURCE) & 0xFFFF80FF) == 0x00000000) && ((SOURCE) != 0x00000000)) - -#define IS_TIM_ENCODER_MODE(MODE) (((MODE) == TIM_ENCODERMODE_TI1) || \ - ((MODE) == TIM_ENCODERMODE_TI2) || \ - ((MODE) == TIM_ENCODERMODE_TI12)) - -#define IS_TIM_EVENT_SOURCE(SOURCE) ((((SOURCE) & 0xFFFFFF00) == 0x00000000) && ((SOURCE) != 0x00000000)) - -#define IS_TIM_CLOCKSOURCE(CLOCK) (((CLOCK) == TIM_CLOCKSOURCE_INTERNAL) || \ - ((CLOCK) == TIM_CLOCKSOURCE_ETRMODE2) || \ - ((CLOCK) == TIM_CLOCKSOURCE_ITR0) || \ - ((CLOCK) == TIM_CLOCKSOURCE_ITR1) || \ - ((CLOCK) == TIM_CLOCKSOURCE_ITR2) || \ - ((CLOCK) == TIM_CLOCKSOURCE_ITR3) || \ - ((CLOCK) == TIM_CLOCKSOURCE_TI1ED) || \ - ((CLOCK) == TIM_CLOCKSOURCE_TI1) || \ - ((CLOCK) == TIM_CLOCKSOURCE_TI2) || \ - ((CLOCK) == TIM_CLOCKSOURCE_ETRMODE1)) - -#define IS_TIM_CLOCKPOLARITY(POLARITY) (((POLARITY) == TIM_CLOCKPOLARITY_INVERTED) || \ - ((POLARITY) == TIM_CLOCKPOLARITY_NONINVERTED) || \ - ((POLARITY) == TIM_CLOCKPOLARITY_RISING) || \ - ((POLARITY) == TIM_CLOCKPOLARITY_FALLING) || \ - ((POLARITY) == TIM_CLOCKPOLARITY_BOTHEDGE)) - -#define IS_TIM_CLOCKPRESCALER(PRESCALER) (((PRESCALER) == TIM_CLOCKPRESCALER_DIV1) || \ - ((PRESCALER) == TIM_CLOCKPRESCALER_DIV2) || \ - ((PRESCALER) == TIM_CLOCKPRESCALER_DIV4) || \ - ((PRESCALER) == TIM_CLOCKPRESCALER_DIV8)) - -#define IS_TIM_CLOCKFILTER(ICFILTER) ((ICFILTER) <= 0xF) - -#define IS_TIM_CLEARINPUT_SOURCE(SOURCE) (((SOURCE) == TIM_CLEARINPUTSOURCE_NONE) || \ - ((SOURCE) == TIM_CLEARINPUTSOURCE_ETR)) - -#define IS_TIM_CLEARINPUT_POLARITY(POLARITY) (((POLARITY) == TIM_CLEARINPUTPOLARITY_INVERTED) || \ - ((POLARITY) == TIM_CLEARINPUTPOLARITY_NONINVERTED)) - -#define IS_TIM_CLEARINPUT_PRESCALER(PRESCALER) (((PRESCALER) == TIM_CLEARINPUTPRESCALER_DIV1) || \ - ((PRESCALER) == TIM_CLEARINPUTPRESCALER_DIV2) || \ - ((PRESCALER) == TIM_CLEARINPUTPRESCALER_DIV4) || \ - ((PRESCALER) == TIM_CLEARINPUTPRESCALER_DIV8)) - -#define IS_TIM_CLEARINPUT_FILTER(ICFILTER) ((ICFILTER) <= 0xF) - -#define IS_TIM_OSSR_STATE(STATE) (((STATE) == TIM_OSSR_ENABLE) || \ - ((STATE) == TIM_OSSR_DISABLE)) - -#define IS_TIM_OSSI_STATE(STATE) (((STATE) == TIM_OSSI_ENABLE) || \ - ((STATE) == TIM_OSSI_DISABLE)) - -#define IS_TIM_LOCK_LEVEL(LEVEL) (((LEVEL) == TIM_LOCKLEVEL_OFF) || \ - ((LEVEL) == TIM_LOCKLEVEL_1) || \ - ((LEVEL) == TIM_LOCKLEVEL_2) || \ - ((LEVEL) == TIM_LOCKLEVEL_3)) - -#define IS_TIM_BREAK_STATE(STATE) (((STATE) == TIM_BREAK_ENABLE) || \ - ((STATE) == TIM_BREAK_DISABLE)) - -#define IS_TIM_BREAK_POLARITY(POLARITY) (((POLARITY) == TIM_BREAKPOLARITY_LOW) || \ - ((POLARITY) == TIM_BREAKPOLARITY_HIGH)) - -#define IS_TIM_AUTOMATIC_OUTPUT_STATE(STATE) (((STATE) == TIM_AUTOMATICOUTPUT_ENABLE) || \ - ((STATE) == TIM_AUTOMATICOUTPUT_DISABLE)) - -#define IS_TIM_TRGO_SOURCE(SOURCE) (((SOURCE) == TIM_TRGO_RESET) || \ - ((SOURCE) == TIM_TRGO_ENABLE) || \ - ((SOURCE) == TIM_TRGO_UPDATE) || \ - ((SOURCE) == TIM_TRGO_OC1) || \ - ((SOURCE) == TIM_TRGO_OC1REF) || \ - ((SOURCE) == TIM_TRGO_OC2REF) || \ - ((SOURCE) == TIM_TRGO_OC3REF) || \ - ((SOURCE) == TIM_TRGO_OC4REF)) - -#define IS_TIM_SLAVE_MODE(MODE) (((MODE) == TIM_SLAVEMODE_DISABLE) || \ - ((MODE) == TIM_SLAVEMODE_GATED) || \ - ((MODE) == TIM_SLAVEMODE_RESET) || \ - ((MODE) == TIM_SLAVEMODE_TRIGGER) || \ - ((MODE) == TIM_SLAVEMODE_EXTERNAL1)) - -#define IS_TIM_MSM_STATE(STATE) (((STATE) == TIM_MASTERSLAVEMODE_ENABLE) || \ - ((STATE) == TIM_MASTERSLAVEMODE_DISABLE)) - -#define IS_TIM_TRIGGER_SELECTION(SELECTION) (((SELECTION) == TIM_TS_ITR0) || \ - ((SELECTION) == TIM_TS_ITR1) || \ - ((SELECTION) == TIM_TS_ITR2) || \ - ((SELECTION) == TIM_TS_ITR3) || \ - ((SELECTION) == TIM_TS_TI1F_ED) || \ - ((SELECTION) == TIM_TS_TI1FP1) || \ - ((SELECTION) == TIM_TS_TI2FP2) || \ - ((SELECTION) == TIM_TS_ETRF)) - -#define IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(SELECTION) (((SELECTION) == TIM_TS_ITR0) || \ - ((SELECTION) == TIM_TS_ITR1) || \ - ((SELECTION) == TIM_TS_ITR2) || \ - ((SELECTION) == TIM_TS_ITR3) || \ - ((SELECTION) == TIM_TS_NONE)) - -#define IS_TIM_TRIGGERPOLARITY(POLARITY) (((POLARITY) == TIM_TRIGGERPOLARITY_INVERTED ) || \ - ((POLARITY) == TIM_TRIGGERPOLARITY_NONINVERTED) || \ - ((POLARITY) == TIM_TRIGGERPOLARITY_RISING ) || \ - ((POLARITY) == TIM_TRIGGERPOLARITY_FALLING ) || \ - ((POLARITY) == TIM_TRIGGERPOLARITY_BOTHEDGE )) - -#define IS_TIM_TRIGGERPRESCALER(PRESCALER) (((PRESCALER) == TIM_TRIGGERPRESCALER_DIV1) || \ - ((PRESCALER) == TIM_TRIGGERPRESCALER_DIV2) || \ - ((PRESCALER) == TIM_TRIGGERPRESCALER_DIV4) || \ - ((PRESCALER) == TIM_TRIGGERPRESCALER_DIV8)) - -#define IS_TIM_TRIGGERFILTER(ICFILTER) ((ICFILTER) <= 0xF) - -#define IS_TIM_TI1SELECTION(TI1SELECTION) (((TI1SELECTION) == TIM_TI1SELECTION_CH1) || \ - ((TI1SELECTION) == TIM_TI1SELECTION_XORCOMBINATION)) - -#define IS_TIM_DMA_BASE(BASE) (((BASE) == TIM_DMABASE_CR1) || \ - ((BASE) == TIM_DMABASE_CR2) || \ - ((BASE) == TIM_DMABASE_SMCR) || \ - ((BASE) == TIM_DMABASE_DIER) || \ - ((BASE) == TIM_DMABASE_SR) || \ - ((BASE) == TIM_DMABASE_EGR) || \ - ((BASE) == TIM_DMABASE_CCMR1) || \ - ((BASE) == TIM_DMABASE_CCMR2) || \ - ((BASE) == TIM_DMABASE_CCER) || \ - ((BASE) == TIM_DMABASE_CNT) || \ - ((BASE) == TIM_DMABASE_PSC) || \ - ((BASE) == TIM_DMABASE_ARR) || \ - ((BASE) == TIM_DMABASE_RCR) || \ - ((BASE) == TIM_DMABASE_CCR1) || \ - ((BASE) == TIM_DMABASE_CCR2) || \ - ((BASE) == TIM_DMABASE_CCR3) || \ - ((BASE) == TIM_DMABASE_CCR4) || \ - ((BASE) == TIM_DMABASE_BDTR) || \ - ((BASE) == TIM_DMABASE_DCR) || \ - ((BASE) == TIM_DMABASE_OR)) - -#define IS_TIM_DMA_LENGTH(LENGTH) (((LENGTH) == TIM_DMABURSTLENGTH_1TRANSFER) || \ - ((LENGTH) == TIM_DMABURSTLENGTH_2TRANSFERS) || \ - ((LENGTH) == TIM_DMABURSTLENGTH_3TRANSFERS) || \ - ((LENGTH) == TIM_DMABURSTLENGTH_4TRANSFERS) || \ - ((LENGTH) == TIM_DMABURSTLENGTH_5TRANSFERS) || \ - ((LENGTH) == TIM_DMABURSTLENGTH_6TRANSFERS) || \ - ((LENGTH) == TIM_DMABURSTLENGTH_7TRANSFERS) || \ - ((LENGTH) == TIM_DMABURSTLENGTH_8TRANSFERS) || \ - ((LENGTH) == TIM_DMABURSTLENGTH_9TRANSFERS) || \ - ((LENGTH) == TIM_DMABURSTLENGTH_10TRANSFERS) || \ - ((LENGTH) == TIM_DMABURSTLENGTH_11TRANSFERS) || \ - ((LENGTH) == TIM_DMABURSTLENGTH_12TRANSFERS) || \ - ((LENGTH) == TIM_DMABURSTLENGTH_13TRANSFERS) || \ - ((LENGTH) == TIM_DMABURSTLENGTH_14TRANSFERS) || \ - ((LENGTH) == TIM_DMABURSTLENGTH_15TRANSFERS) || \ - ((LENGTH) == TIM_DMABURSTLENGTH_16TRANSFERS) || \ - ((LENGTH) == TIM_DMABURSTLENGTH_17TRANSFERS) || \ - ((LENGTH) == TIM_DMABURSTLENGTH_18TRANSFERS)) - -#define IS_TIM_IC_FILTER(ICFILTER) ((ICFILTER) <= 0xF) -/** - * @} - */ - -/** @defgroup TIM_Mask_Definitions TIM Mask Definition - * @{ - */ -/* The counter of a timer instance is disabled only if all the CCx and CCxN - channels have been disabled */ -#define TIM_CCER_CCxE_MASK ((uint32_t)(TIM_CCER_CC1E | TIM_CCER_CC2E | TIM_CCER_CC3E | TIM_CCER_CC4E)) -#define TIM_CCER_CCxNE_MASK ((uint32_t)(TIM_CCER_CC1NE | TIM_CCER_CC2NE | TIM_CCER_CC3NE)) -/** - * @} - */ - -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup TIM_Private_Functions TIM Private Functions - * @{ - */ -void TIM_Base_SetConfig(TIM_TypeDef *TIMx, TIM_Base_InitTypeDef *Structure); -void TIM_TI1_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, uint32_t TIM_ICFilter); -void TIM_OC2_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config); -void TIM_DMADelayPulseCplt(DMA_HandleTypeDef *hdma); -void TIM_DMAError(DMA_HandleTypeDef *hdma); -void TIM_DMACaptureCplt(DMA_HandleTypeDef *hdma); -void TIM_CCxChannelCmd(TIM_TypeDef* TIMx, uint32_t Channel, uint32_t ChannelState); -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F2xx_HAL_TIM_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_tim_ex.h b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_tim_ex.h deleted file mode 100755 index 3f1a87c0..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_tim_ex.h +++ /dev/null @@ -1,307 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_hal_tim_ex.h - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief Header file of TIM HAL Extension module. - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F2xx_HAL_TIM_EX_H -#define __STM32F2xx_HAL_TIM_EX_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal_def.h" - -/** @addtogroup STM32F2xx_HAL_Driver - * @{ - */ - -/** @addtogroup TIMEx - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup TIMEx_Exported_Types TIM Exported Types - * @{ - */ - -/** - * @brief TIM Hall sensor Configuration Structure definition - */ - -typedef struct -{ - - uint32_t IC1Polarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Input_Capture_Polarity */ - - uint32_t IC1Prescaler; /*!< Specifies the Input Capture Prescaler. - This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ - - uint32_t IC1Filter; /*!< Specifies the input capture filter. - This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ - uint32_t Commutation_Delay; /*!< Specifies the pulse value to be loaded into the Capture Compare Register. - This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */ -} TIM_HallSensor_InitTypeDef; - -/** - * @brief TIM Master configuration Structure definition - */ -typedef struct { - uint32_t MasterOutputTrigger; /*!< Trigger output (TRGO) selection. - This parameter can be a value of @ref TIM_Master_Mode_Selection */ - uint32_t MasterSlaveMode; /*!< Master/slave mode selection. - This parameter can be a value of @ref TIM_Master_Slave_Mode */ -}TIM_MasterConfigTypeDef; - -/** - * @brief TIM Break and Dead time configuration Structure definition - */ -typedef struct -{ - uint32_t OffStateRunMode; /*!< TIM off state in run mode. - This parameter can be a value of @ref TIM_OSSR_Off_State_Selection_for_Run_mode_state */ - uint32_t OffStateIDLEMode; /*!< TIM off state in IDLE mode. - This parameter can be a value of @ref TIM_OSSI_Off_State_Selection_for_Idle_mode_state */ - uint32_t LockLevel; /*!< TIM Lock level. - This parameter can be a value of @ref TIM_Lock_level */ - uint32_t DeadTime; /*!< TIM dead Time. - This parameter can be a number between Min_Data = 0x00 and Max_Data = 0xFF */ - uint32_t BreakState; /*!< TIM Break State. - This parameter can be a value of @ref TIM_Break_Input_enable_disable */ - uint32_t BreakPolarity; /*!< TIM Break input polarity. - This parameter can be a value of @ref TIM_Break_Polarity */ - uint32_t AutomaticOutput; /*!< TIM Automatic Output Enable state. - This parameter can be a value of @ref TIM_AOE_Bit_Set_Reset */ -}TIM_BreakDeadTimeConfigTypeDef; -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup TIMEx_Exported_Constants TIM Exported Constants - * @{ - */ - -/** @defgroup TIMEx_Remap TIM Remap - * @{ - */ -#define TIM_TIM2_TIM8_TRGO (0x00000000) -#define TIM_TIM2_ETH_PTP (0x00000400) -#define TIM_TIM2_USBFS_SOF (0x00000800) -#define TIM_TIM2_USBHS_SOF (0x00000C00) -#define TIM_TIM5_GPIO (0x00000000) -#define TIM_TIM5_LSI (0x00000040) -#define TIM_TIM5_LSE (0x00000080) -#define TIM_TIM5_RTC (0x000000C0) -#define TIM_TIM11_GPIO (0x00000000) -#define TIM_TIM11_HSE (0x00000002) - -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup TIMEx_Exported_Functions - * @{ - */ - -/** @addtogroup TIMEx_Exported_Functions_Group1 - * @{ - */ -/* Timer Hall Sensor functions **********************************************/ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Init(TIM_HandleTypeDef* htim, TIM_HallSensor_InitTypeDef* sConfig); -HAL_StatusTypeDef HAL_TIMEx_HallSensor_DeInit(TIM_HandleTypeDef* htim); - -void HAL_TIMEx_HallSensor_MspInit(TIM_HandleTypeDef* htim); -void HAL_TIMEx_HallSensor_MspDeInit(TIM_HandleTypeDef* htim); - - /* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start(TIM_HandleTypeDef* htim); -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop(TIM_HandleTypeDef* htim); -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_IT(TIM_HandleTypeDef* htim); -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_IT(TIM_HandleTypeDef* htim); -/* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_DMA(TIM_HandleTypeDef* htim, uint32_t *pData, uint16_t Length); -HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_DMA(TIM_HandleTypeDef* htim); -/** - * @} - */ - -/** @addtogroup TIMEx_Exported_Functions_Group2 - * @{ - */ -/* Timer Complementary Output Compare functions *****************************/ -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIMEx_OCN_Start(TIM_HandleTypeDef* htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIMEx_OCN_Stop(TIM_HandleTypeDef* htim, uint32_t Channel); - -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIMEx_OCN_Start_IT(TIM_HandleTypeDef* htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_IT(TIM_HandleTypeDef* htim, uint32_t Channel); - -/* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIMEx_OCN_Start_DMA(TIM_HandleTypeDef* htim, uint32_t Channel, uint32_t *pData, uint16_t Length); -HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_DMA(TIM_HandleTypeDef* htim, uint32_t Channel); -/** - * @} - */ - -/** @addtogroup TIMEx_Exported_Functions_Group3 - * @{ - */ -/* Timer Complementary PWM functions ****************************************/ -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIMEx_PWMN_Start(TIM_HandleTypeDef* htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop(TIM_HandleTypeDef* htim, uint32_t Channel); - -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_IT(TIM_HandleTypeDef* htim, uint32_t Channel); -HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_IT(TIM_HandleTypeDef* htim, uint32_t Channel); -/* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_DMA(TIM_HandleTypeDef* htim, uint32_t Channel, uint32_t *pData, uint16_t Length); -HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_DMA(TIM_HandleTypeDef* htim, uint32_t Channel); -/** - * @} - */ - -/** @addtogroup TIMEx_Exported_Functions_Group4 - * @{ - */ -/* Timer Complementary One Pulse functions **********************************/ -/* Blocking mode: Polling */ -HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start(TIM_HandleTypeDef* htim, uint32_t OutputChannel); -HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop(TIM_HandleTypeDef* htim, uint32_t OutputChannel); - -/* Non-Blocking mode: Interrupt */ -HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start_IT(TIM_HandleTypeDef* htim, uint32_t OutputChannel); -HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop_IT(TIM_HandleTypeDef* htim, uint32_t OutputChannel); -/** - * @} - */ - -/** @addtogroup TIMEx_Exported_Functions_Group5 - * @{ - */ -/* Extension Control functions ************************************************/ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutationEvent(TIM_HandleTypeDef* htim, uint32_t InputTrigger, uint32_t CommutationSource); -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutationEvent_IT(TIM_HandleTypeDef* htim, uint32_t InputTrigger, uint32_t CommutationSource); -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutationEvent_DMA(TIM_HandleTypeDef* htim, uint32_t InputTrigger, uint32_t CommutationSource); -HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef* htim, TIM_MasterConfigTypeDef * sMasterConfig); -HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef* htim, TIM_BreakDeadTimeConfigTypeDef *sBreakDeadTimeConfig); -HAL_StatusTypeDef HAL_TIMEx_RemapConfig(TIM_HandleTypeDef* htim, uint32_t Remap); -/** - * @} - */ - -/** @addtogroup TIMEx_Exported_Functions_Group6 - * @{ - */ -/* Extension Callback *********************************************************/ -void HAL_TIMEx_CommutationCallback(TIM_HandleTypeDef* htim); -void HAL_TIMEx_BreakCallback(TIM_HandleTypeDef* htim); -void TIMEx_DMACommutationCplt(DMA_HandleTypeDef *hdma); -/** - * @} - */ - -/** @addtogroup TIMEx_Exported_Functions_Group7 - * @{ - */ -/* Extension Peripheral State functions **************************************/ -HAL_TIM_StateTypeDef HAL_TIMEx_HallSensor_GetState(TIM_HandleTypeDef* htim); -/** - * @} - */ - -/** - * @} - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -/** @defgroup TIMEx_Private_Macros TIM Private Macros - * @{ - */ -#define IS_TIM_REMAP(TIM_REMAP) (((TIM_REMAP) == TIM_TIM2_TIM8_TRGO)||\ - ((TIM_REMAP) == TIM_TIM2_ETH_PTP)||\ - ((TIM_REMAP) == TIM_TIM2_USBFS_SOF)||\ - ((TIM_REMAP) == TIM_TIM2_USBHS_SOF)||\ - ((TIM_REMAP) == TIM_TIM5_GPIO)||\ - ((TIM_REMAP) == TIM_TIM5_LSI)||\ - ((TIM_REMAP) == TIM_TIM5_LSE)||\ - ((TIM_REMAP) == TIM_TIM5_RTC)||\ - ((TIM_REMAP) == TIM_TIM11_GPIO)||\ - ((TIM_REMAP) == TIM_TIM11_HSE)) - -#define IS_TIM_DEADTIME(DEADTIME) ((DEADTIME) <= 0xFF) -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup TIMEx_Private_Functions TIM Private Functions - * @{ - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F2xx_HAL_TIM_EX_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_usart.h b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_usart.h deleted file mode 100755 index f18e30b8..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_usart.h +++ /dev/null @@ -1,587 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_hal_usart.h - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief Header file of USART HAL module. - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F2xx_HAL_USART_H -#define __STM32F2xx_HAL_USART_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal_def.h" - -/** @addtogroup STM32F2xx_HAL_Driver - * @{ - */ - -/** @addtogroup USART - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup USART_Exported_Types USART Exported Types - * @{ - */ - -/** - * @brief USART Init Structure definition - */ -typedef struct -{ - uint32_t BaudRate; /*!< This member configures the Usart communication baud rate. - The baud rate is computed using the following formula: - - IntegerDivider = ((PCLKx) / (8 * (husart->Init.BaudRate))) - - FractionalDivider = ((IntegerDivider - ((uint32_t) IntegerDivider)) * 8) + 0.5 */ - - uint32_t WordLength; /*!< Specifies the number of data bits transmitted or received in a frame. - This parameter can be a value of @ref USART_Word_Length */ - - uint32_t StopBits; /*!< Specifies the number of stop bits transmitted. - This parameter can be a value of @ref USART_Stop_Bits */ - - uint32_t Parity; /*!< Specifies the parity mode. - This parameter can be a value of @ref USART_Parity - @note When parity is enabled, the computed parity is inserted - at the MSB position of the transmitted data (9th bit when - the word length is set to 9 data bits; 8th bit when the - word length is set to 8 data bits). */ - - uint32_t Mode; /*!< Specifies whether the Receive or Transmit mode is enabled or disabled. - This parameter can be a value of @ref USART_Mode */ - - uint32_t CLKPolarity; /*!< Specifies the steady state of the serial clock. - This parameter can be a value of @ref USART_Clock_Polarity */ - - uint32_t CLKPhase; /*!< Specifies the clock transition on which the bit capture is made. - This parameter can be a value of @ref USART_Clock_Phase */ - - uint32_t CLKLastBit; /*!< Specifies whether the clock pulse corresponding to the last transmitted - data bit (MSB) has to be output on the SCLK pin in synchronous mode. - This parameter can be a value of @ref USART_Last_Bit */ -}USART_InitTypeDef; - -/** - * @brief HAL State structures definition - */ -typedef enum -{ - HAL_USART_STATE_RESET = 0x00, /*!< Peripheral is not yet Initialized */ - HAL_USART_STATE_READY = 0x01, /*!< Peripheral Initialized and ready for use */ - HAL_USART_STATE_BUSY = 0x02, /*!< an internal process is ongoing */ - HAL_USART_STATE_BUSY_TX = 0x12, /*!< Data Transmission process is ongoing */ - HAL_USART_STATE_BUSY_RX = 0x22, /*!< Data Reception process is ongoing */ - HAL_USART_STATE_BUSY_TX_RX = 0x32, /*!< Data Transmission Reception process is ongoing */ - HAL_USART_STATE_TIMEOUT = 0x03, /*!< Timeout state */ - HAL_USART_STATE_ERROR = 0x04 /*!< Error */ -}HAL_USART_StateTypeDef; - -/** - * @brief USART handle Structure definition - */ -typedef struct -{ - USART_TypeDef *Instance; /* USART registers base address */ - - USART_InitTypeDef Init; /* Usart communication parameters */ - - uint8_t *pTxBuffPtr; /* Pointer to Usart Tx transfer Buffer */ - - uint16_t TxXferSize; /* Usart Tx Transfer size */ - - __IO uint16_t TxXferCount; /* Usart Tx Transfer Counter */ - - uint8_t *pRxBuffPtr; /* Pointer to Usart Rx transfer Buffer */ - - uint16_t RxXferSize; /* Usart Rx Transfer size */ - - __IO uint16_t RxXferCount; /* Usart Rx Transfer Counter */ - - DMA_HandleTypeDef *hdmatx; /* Usart Tx DMA Handle parameters */ - - DMA_HandleTypeDef *hdmarx; /* Usart Rx DMA Handle parameters */ - - HAL_LockTypeDef Lock; /* Locking object */ - - __IO HAL_USART_StateTypeDef State; /* Usart communication state */ - - __IO uint32_t ErrorCode; /* USART Error code */ - -}USART_HandleTypeDef; -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup USART_Exported_Constants USART Exported Constants - * @{ - */ - -/** @defgroup USART_Error_Code USART Error Code - * @brief USART Error Code - * @{ - */ -#define HAL_USART_ERROR_NONE ((uint32_t)0x00000000) /*!< No error */ -#define HAL_USART_ERROR_PE ((uint32_t)0x00000001) /*!< Parity error */ -#define HAL_USART_ERROR_NE ((uint32_t)0x00000002) /*!< Noise error */ -#define HAL_USART_ERROR_FE ((uint32_t)0x00000004) /*!< Frame error */ -#define HAL_USART_ERROR_ORE ((uint32_t)0x00000008) /*!< Overrun error */ -#define HAL_USART_ERROR_DMA ((uint32_t)0x00000010) /*!< DMA transfer error */ -/** - * @} - */ - -/** @defgroup USART_Word_Length USART Word Length - * @{ - */ -#define USART_WORDLENGTH_8B ((uint32_t)0x00000000) -#define USART_WORDLENGTH_9B ((uint32_t)USART_CR1_M) -/** - * @} - */ - -/** @defgroup USART_Stop_Bits USART Number of Stop Bits - * @{ - */ -#define USART_STOPBITS_1 ((uint32_t)0x00000000) -#define USART_STOPBITS_0_5 ((uint32_t)USART_CR2_STOP_0) -#define USART_STOPBITS_2 ((uint32_t)USART_CR2_STOP_1) -#define USART_STOPBITS_1_5 ((uint32_t)(USART_CR2_STOP_0 | USART_CR2_STOP_1)) -/** - * @} - */ - -/** @defgroup USART_Parity USART Parity - * @{ - */ -#define USART_PARITY_NONE ((uint32_t)0x00000000) -#define USART_PARITY_EVEN ((uint32_t)USART_CR1_PCE) -#define USART_PARITY_ODD ((uint32_t)(USART_CR1_PCE | USART_CR1_PS)) -/** - * @} - */ - -/** @defgroup USART_Mode USART Mode - * @{ - */ -#define USART_MODE_RX ((uint32_t)USART_CR1_RE) -#define USART_MODE_TX ((uint32_t)USART_CR1_TE) -#define USART_MODE_TX_RX ((uint32_t)(USART_CR1_TE |USART_CR1_RE)) -/** - * @} - */ - -/** @defgroup USART_Clock USART Clock - * @{ - */ -#define USART_CLOCK_DISABLE ((uint32_t)0x00000000) -#define USART_CLOCK_ENABLE ((uint32_t)USART_CR2_CLKEN) -/** - * @} - */ - -/** @defgroup USART_Clock_Polarity USART Clock Polarity - * @{ - */ -#define USART_POLARITY_LOW ((uint32_t)0x00000000) -#define USART_POLARITY_HIGH ((uint32_t)USART_CR2_CPOL) -/** - * @} - */ - -/** @defgroup USART_Clock_Phase USART Clock Phase - * @{ - */ -#define USART_PHASE_1EDGE ((uint32_t)0x00000000) -#define USART_PHASE_2EDGE ((uint32_t)USART_CR2_CPHA) -/** - * @} - */ - -/** @defgroup USART_Last_Bit USART Last Bit - * @{ - */ -#define USART_LASTBIT_DISABLE ((uint32_t)0x00000000) -#define USART_LASTBIT_ENABLE ((uint32_t)USART_CR2_LBCL) -/** - * @} - */ - -/** @defgroup USART_NACK_State USART NACK State - * @{ - */ -#define USART_NACK_ENABLE ((uint32_t)USART_CR3_NACK) -#define USART_NACK_DISABLE ((uint32_t)0x00000000) -/** - * @} - */ - -/** @defgroup USART_Flags USART Flags - * Elements values convention: 0xXXXX - * - 0xXXXX : Flag mask in the SR register - * @{ - */ -#define USART_FLAG_TXE ((uint32_t)0x00000080) -#define USART_FLAG_TC ((uint32_t)0x00000040) -#define USART_FLAG_RXNE ((uint32_t)0x00000020) -#define USART_FLAG_IDLE ((uint32_t)0x00000010) -#define USART_FLAG_ORE ((uint32_t)0x00000008) -#define USART_FLAG_NE ((uint32_t)0x00000004) -#define USART_FLAG_FE ((uint32_t)0x00000002) -#define USART_FLAG_PE ((uint32_t)0x00000001) -/** - * @} - */ - -/** @defgroup USART_Interrupt_definition USART Interrupts Definition - * Elements values convention: 0xY000XXXX - * - XXXX : Interrupt mask in the XX register - * - Y : Interrupt source register (2bits) - * - 01: CR1 register - * - 10: CR2 register - * - 11: CR3 register - * - * @{ - */ -#define USART_IT_PE ((uint32_t)(USART_CR1_REG_INDEX << 28 | USART_CR1_PEIE)) -#define USART_IT_TXE ((uint32_t)(USART_CR1_REG_INDEX << 28 | USART_CR1_TXEIE)) -#define USART_IT_TC ((uint32_t)(USART_CR1_REG_INDEX << 28 | USART_CR1_TCIE)) -#define USART_IT_RXNE ((uint32_t)(USART_CR1_REG_INDEX << 28 | USART_CR1_RXNEIE)) -#define USART_IT_IDLE ((uint32_t)(USART_CR1_REG_INDEX << 28 | USART_CR1_IDLEIE)) - -#define USART_IT_LBD ((uint32_t)(USART_CR2_REG_INDEX << 28 | USART_CR2_LBDIE)) - -#define USART_IT_CTS ((uint32_t)(USART_CR3_REG_INDEX << 28 | USART_CR3_CTSIE)) -#define USART_IT_ERR ((uint32_t)(USART_CR3_REG_INDEX << 28 | USART_CR3_EIE)) -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup USART_Exported_Macros USART Exported Macros - * @{ - */ - -/** @brief Reset USART handle state - * @param __HANDLE__: specifies the USART Handle. - * This parameter can be USARTx where x: 1, 2, 3 or 6 to select the USART peripheral. - * @retval None - */ -#define __HAL_USART_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_USART_STATE_RESET) - -/** @brief Checks whether the specified Smartcard flag is set or not. - * @param __HANDLE__: specifies the USART Handle. - * This parameter can be USARTx where x: 1, 2, 3 or 6 to select the USART peripheral. - * @param __FLAG__: specifies the flag to check. - * This parameter can be one of the following values: - * @arg USART_FLAG_TXE: Transmit data register empty flag - * @arg USART_FLAG_TC: Transmission Complete flag - * @arg USART_FLAG_RXNE: Receive data register not empty flag - * @arg USART_FLAG_IDLE: Idle Line detection flag - * @arg USART_FLAG_ORE: Overrun Error flag - * @arg USART_FLAG_NE: Noise Error flag - * @arg USART_FLAG_FE: Framing Error flag - * @arg USART_FLAG_PE: Parity Error flag - * @retval The new state of __FLAG__ (TRUE or FALSE). - */ -#define __HAL_USART_GET_FLAG(__HANDLE__, __FLAG__) (((__HANDLE__)->Instance->SR & (__FLAG__)) == (__FLAG__)) - -/** @brief Clears the specified Smartcard pending flags. - * @param __HANDLE__: specifies the USART Handle. - * This parameter can be USARTx where x: 1, 2, 3 or 6 to select the USART peripheral. - * @param __FLAG__: specifies the flag to check. - * This parameter can be any combination of the following values: - * @arg USART_FLAG_TC: Transmission Complete flag. - * @arg USART_FLAG_RXNE: Receive data register not empty flag. - * - * @note PE (Parity error), FE (Framing error), NE (Noise error), ORE (Overrun - * error) and IDLE (Idle line detected) flags are cleared by software - * sequence: a read operation to USART_SR register followed by a read - * operation to USART_DR register. - * @note RXNE flag can be also cleared by a read to the USART_DR register. - * @note TC flag can be also cleared by software sequence: a read operation to - * USART_SR register followed by a write operation to USART_DR register. - * @note TXE flag is cleared only by a write to the USART_DR register. - * - * @retval None - */ -#define __HAL_USART_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->SR = ~(__FLAG__)) - -/** @brief Clear the USART PE pending flag. - * @param __HANDLE__: specifies the USART Handle. - * This parameter can be USARTx where x: 1, 2, 3 or 6 to select the USART peripheral. - * @retval None - */ -#define __HAL_USART_CLEAR_PEFLAG(__HANDLE__) \ - do{ \ - __IO uint32_t tmpreg; \ - tmpreg = (__HANDLE__)->Instance->SR; \ - tmpreg = (__HANDLE__)->Instance->DR; \ - UNUSED(tmpreg); \ - } while(0) - -/** @brief Clear the USART FE pending flag. - * @param __HANDLE__: specifies the USART Handle. - * This parameter can be USARTx where x: 1, 2, 3 or 6 to select the USART peripheral. - * @retval None - */ -#define __HAL_USART_CLEAR_FEFLAG(__HANDLE__) __HAL_USART_CLEAR_PEFLAG(__HANDLE__) - -/** @brief Clear the USART NE pending flag. - * @param __HANDLE__: specifies the USART Handle. - * This parameter can be USARTx where x: 1, 2, 3 or 6 to select the USART peripheral. - * @retval None - */ -#define __HAL_USART_CLEAR_NEFLAG(__HANDLE__) __HAL_USART_CLEAR_PEFLAG(__HANDLE__) - -/** @brief Clear the UART ORE pending flag. - * @param __HANDLE__: specifies the USART Handle. - * This parameter can be USARTx where x: 1, 2, 3 or 6 to select the USART peripheral. - * @retval None - */ -#define __HAL_USART_CLEAR_OREFLAG(__HANDLE__) __HAL_USART_CLEAR_PEFLAG(__HANDLE__) - -/** @brief Clear the USART IDLE pending flag. - * @param __HANDLE__: specifies the USART Handle. - * This parameter can be USARTx where x: 1, 2, 3 or 6 to select the USART peripheral. - * @retval None - */ -#define __HAL_USART_CLEAR_IDLEFLAG(__HANDLE__) __HAL_USART_CLEAR_PEFLAG(__HANDLE__) - -/** @brief Enables or disables the specified USART interrupts. - * @param __HANDLE__: specifies the USART Handle. - * This parameter can be USARTx where x: 1, 2, 3 or 6 to select the USART peripheral. - * @param __INTERRUPT__: specifies the USART interrupt source to check. - * This parameter can be one of the following values: - * @arg USART_IT_TXE: Transmit Data Register empty interrupt - * @arg USART_IT_TC: Transmission complete interrupt - * @arg USART_IT_RXNE: Receive Data register not empty interrupt - * @arg USART_IT_IDLE: Idle line detection interrupt - * @arg USART_IT_PE: Parity Error interrupt - * @arg USART_IT_ERR: Error interrupt(Frame error, noise error, overrun error) - * This parameter can be: ENABLE or DISABLE. - * @retval None - */ -#define __HAL_USART_ENABLE_IT(__HANDLE__, __INTERRUPT__) ((((__INTERRUPT__) >> 28) == 1)? ((__HANDLE__)->Instance->CR1 |= ((__INTERRUPT__) & USART_IT_MASK)): \ - (((__INTERRUPT__) >> 28) == 2)? ((__HANDLE__)->Instance->CR2 |= ((__INTERRUPT__) & USART_IT_MASK)): \ - ((__HANDLE__)->Instance->CR3 |= ((__INTERRUPT__) & USART_IT_MASK))) -#define __HAL_USART_DISABLE_IT(__HANDLE__, __INTERRUPT__) ((((__INTERRUPT__) >> 28) == 1)? ((__HANDLE__)->Instance->CR1 &= ~((__INTERRUPT__) & USART_IT_MASK)): \ - (((__INTERRUPT__) >> 28) == 2)? ((__HANDLE__)->Instance->CR2 &= ~((__INTERRUPT__) & USART_IT_MASK)): \ - ((__HANDLE__)->Instance->CR3 &= ~ ((__INTERRUPT__) & USART_IT_MASK))) - -/** @brief Checks whether the specified USART interrupt has occurred or not. - * @param __HANDLE__: specifies the USART Handle. - * This parameter can be USARTx where x: 1, 2, 3 or 6 to select the USART peripheral. - * @param __IT__: specifies the USART interrupt source to check. - * This parameter can be one of the following values: - * @arg USART_IT_TXE: Transmit Data Register empty interrupt - * @arg USART_IT_TC: Transmission complete interrupt - * @arg USART_IT_RXNE: Receive Data register not empty interrupt - * @arg USART_IT_IDLE: Idle line detection interrupt - * @arg USART_IT_ERR: Error interrupt - * @arg USART_IT_PE: Parity Error interrupt - * @retval The new state of __IT__ (TRUE or FALSE). - */ -#define __HAL_USART_GET_IT_SOURCE(__HANDLE__, __IT__) (((((__IT__) >> 28) == 1)? (__HANDLE__)->Instance->CR1:(((((uint32_t)(__IT__)) >> 28) == 2)? \ - (__HANDLE__)->Instance->CR2 : (__HANDLE__)->Instance->CR3)) & (((uint32_t)(__IT__)) & USART_IT_MASK)) - -/** @brief Macro to enable the USART's one bit sample method - * @param __HANDLE__: specifies the USART Handle. - * @retval None - */ -#define __HAL_USART_ONE_BIT_SAMPLE_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR3|= USART_CR3_ONEBIT) - -/** @brief Macro to disable the USART's one bit sample method - * @param __HANDLE__: specifies the USART Handle. - * @retval None - */ -#define __HAL_USART_ONE_BIT_SAMPLE_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR3 &= (uint16_t)~((uint16_t)USART_CR3_ONEBIT)) - -/** @brief Enable USART - * @param __HANDLE__: specifies the USART Handle. - * USART Handle selects the USARTx peripheral (USART availability and x value depending on device). - * @retval None - */ -#define __HAL_USART_ENABLE(__HANDLE__) ( (__HANDLE__)->Instance->CR1 |= USART_CR1_UE) - -/** @brief Disable USART - * @param __HANDLE__: specifies the USART Handle. - * USART Handle selects the USARTx peripheral (USART availability and x value depending on device). - * @retval None - */ -#define __HAL_USART_DISABLE(__HANDLE__) ( (__HANDLE__)->Instance->CR1 &= ~USART_CR1_UE) - -/** - * @} - */ -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup USART_Exported_Functions - * @{ - */ - -/** @addtogroup USART_Exported_Functions_Group1 - * @{ - */ -/* Initialization/de-initialization functions **********************************/ -HAL_StatusTypeDef HAL_USART_Init(USART_HandleTypeDef *husart); -HAL_StatusTypeDef HAL_USART_DeInit(USART_HandleTypeDef *husart); -void HAL_USART_MspInit(USART_HandleTypeDef *husart); -void HAL_USART_MspDeInit(USART_HandleTypeDef *husart); -/** - * @} - */ - -/** @addtogroup USART_Exported_Functions_Group2 - * @{ - */ -/* IO operation functions *******************************************************/ -HAL_StatusTypeDef HAL_USART_Transmit(USART_HandleTypeDef *husart, uint8_t *pTxData, uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_USART_Receive(USART_HandleTypeDef *husart, uint8_t *pRxData, uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_USART_TransmitReceive(USART_HandleTypeDef *husart, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout); -HAL_StatusTypeDef HAL_USART_Transmit_IT(USART_HandleTypeDef *husart, uint8_t *pTxData, uint16_t Size); -HAL_StatusTypeDef HAL_USART_Receive_IT(USART_HandleTypeDef *husart, uint8_t *pRxData, uint16_t Size); -HAL_StatusTypeDef HAL_USART_TransmitReceive_IT(USART_HandleTypeDef *husart, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size); -HAL_StatusTypeDef HAL_USART_Transmit_DMA(USART_HandleTypeDef *husart, uint8_t *pTxData, uint16_t Size); -HAL_StatusTypeDef HAL_USART_Receive_DMA(USART_HandleTypeDef *husart, uint8_t *pRxData, uint16_t Size); -HAL_StatusTypeDef HAL_USART_TransmitReceive_DMA(USART_HandleTypeDef *husart, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size); -HAL_StatusTypeDef HAL_USART_DMAPause(USART_HandleTypeDef *husart); -HAL_StatusTypeDef HAL_USART_DMAResume(USART_HandleTypeDef *husart); -HAL_StatusTypeDef HAL_USART_DMAStop(USART_HandleTypeDef *husart); -void HAL_USART_IRQHandler(USART_HandleTypeDef *husart); -void HAL_USART_TxCpltCallback(USART_HandleTypeDef *husart); -void HAL_USART_TxHalfCpltCallback(USART_HandleTypeDef *husart); -void HAL_USART_RxCpltCallback(USART_HandleTypeDef *husart); -void HAL_USART_RxHalfCpltCallback(USART_HandleTypeDef *husart); -void HAL_USART_TxRxCpltCallback(USART_HandleTypeDef *husart); -void HAL_USART_ErrorCallback(USART_HandleTypeDef *husart); -/** - * @} - */ - -/** @addtogroup USART_Exported_Functions_Group3 - * @{ - */ -/* Peripheral State functions ************************************************/ -HAL_USART_StateTypeDef HAL_USART_GetState(USART_HandleTypeDef *husart); -uint32_t HAL_USART_GetError(USART_HandleTypeDef *husart); -/** - * @} - */ - -/** - * @} - */ -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup USART_Private_Constants USART Private Constants - * @{ - */ -/** @brief USART interruptions flag mask - * - */ -#define USART_IT_MASK ((uint32_t) USART_CR1_PEIE | USART_CR1_TXEIE | USART_CR1_TCIE | USART_CR1_RXNEIE | \ - USART_CR1_IDLEIE | USART_CR2_LBDIE | USART_CR3_CTSIE | USART_CR3_EIE ) - -#define USART_CR1_REG_INDEX 1 -#define USART_CR2_REG_INDEX 2 -#define USART_CR3_REG_INDEX 3 -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup USART_Private_Macros USART Private Macros - * @{ - */ -#define IS_USART_NACK_STATE(NACK) (((NACK) == USART_NACK_ENABLE) || \ - ((NACK) == USART_NACK_DISABLE)) -#define IS_USART_LASTBIT(LASTBIT) (((LASTBIT) == USART_LASTBIT_DISABLE) || \ - ((LASTBIT) == USART_LASTBIT_ENABLE)) -#define IS_USART_PHASE(CPHA) (((CPHA) == USART_PHASE_1EDGE) || ((CPHA) == USART_PHASE_2EDGE)) -#define IS_USART_POLARITY(CPOL) (((CPOL) == USART_POLARITY_LOW) || ((CPOL) == USART_POLARITY_HIGH)) -#define IS_USART_CLOCK(CLOCK) (((CLOCK) == USART_CLOCK_DISABLE) || \ - ((CLOCK) == USART_CLOCK_ENABLE)) -#define IS_USART_WORD_LENGTH(LENGTH) (((LENGTH) == USART_WORDLENGTH_8B) || \ - ((LENGTH) == USART_WORDLENGTH_9B)) -#define IS_USART_STOPBITS(STOPBITS) (((STOPBITS) == USART_STOPBITS_1) || \ - ((STOPBITS) == USART_STOPBITS_0_5) || \ - ((STOPBITS) == USART_STOPBITS_1_5) || \ - ((STOPBITS) == USART_STOPBITS_2)) -#define IS_USART_PARITY(PARITY) (((PARITY) == USART_PARITY_NONE) || \ - ((PARITY) == USART_PARITY_EVEN) || \ - ((PARITY) == USART_PARITY_ODD)) -#define IS_USART_MODE(MODE) ((((MODE) & (uint32_t)0xFFF3) == 0x00) && ((MODE) != (uint32_t)0x00)) - -#define IS_USART_BAUDRATE(BAUDRATE) ((BAUDRATE) < 7500001) -#define USART_DIV(_PCLK_, _BAUD_) (((_PCLK_)*25)/(2*(_BAUD_))) -#define USART_DIVMANT(_PCLK_, _BAUD_) (USART_DIV((_PCLK_), (_BAUD_))/100) -#define USART_DIVFRAQ(_PCLK_, _BAUD_) (((USART_DIV((_PCLK_), (_BAUD_)) - (USART_DIVMANT((_PCLK_), (_BAUD_)) * 100)) * 16 + 50) / 100) -#define USART_BRR(_PCLK_, _BAUD_) ((USART_DIVMANT((_PCLK_), (_BAUD_)) << 4)|(USART_DIVFRAQ((_PCLK_), (_BAUD_)) & 0x0F)) -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup USART_Private_Functions USART Private Functions - * @{ - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F2xx_HAL_USART_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_wwdg.h b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_wwdg.h deleted file mode 100755 index 14d826b3..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_wwdg.h +++ /dev/null @@ -1,349 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_hal_wwdg.h - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief Header file of WWDG HAL module. - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F2xx_HAL_WWDG_H -#define __STM32F2xx_HAL_WWDG_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal_def.h" - -/** @addtogroup STM32F2xx_HAL_Driver - * @{ - */ - -/** @addtogroup WWDG - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup WWDG_Exported_Types WWDG Exported Types - * @{ - */ - -/** - * @brief WWDG HAL State Structure definition - */ -typedef enum -{ - HAL_WWDG_STATE_RESET = 0x00, /*!< WWDG not yet initialized or disabled */ - HAL_WWDG_STATE_READY = 0x01, /*!< WWDG initialized and ready for use */ - HAL_WWDG_STATE_BUSY = 0x02, /*!< WWDG internal process is ongoing */ - HAL_WWDG_STATE_TIMEOUT = 0x03, /*!< WWDG timeout state */ - HAL_WWDG_STATE_ERROR = 0x04 /*!< WWDG error state */ -}HAL_WWDG_StateTypeDef; - -/** - * @brief WWDG Init structure definition - */ -typedef struct -{ - uint32_t Prescaler; /*!< Specifies the prescaler value of the WWDG. - This parameter can be a value of @ref WWDG_Prescaler */ - - uint32_t Window; /*!< Specifies the WWDG window value to be compared to the downcounter. - This parameter must be a number lower than Max_Data = 0x80 */ - - uint32_t Counter; /*!< Specifies the WWDG free-running downcounter value. - This parameter must be a number between Min_Data = 0x40 and Max_Data = 0x7F */ - -}WWDG_InitTypeDef; - -/** - * @brief WWDG handle Structure definition - */ -typedef struct -{ - WWDG_TypeDef *Instance; /*!< Register base address */ - - WWDG_InitTypeDef Init; /*!< WWDG required parameters */ - - HAL_LockTypeDef Lock; /*!< WWDG locking object */ - - __IO HAL_WWDG_StateTypeDef State; /*!< WWDG communication state */ - -}WWDG_HandleTypeDef; -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup WWDG_Exported_Constants WWDG Exported Constants - * @{ - */ - -/** @defgroup WWDG_Interrupt_definition WWDG Interrupt definition - * @{ - */ -#define WWDG_IT_EWI WWDG_CFR_EWI /*!< Early wakeup interrupt */ -/** - * @} - */ - -/** @defgroup WWDG_Flag_definition WWDG Flag definition - * @brief WWDG Flag definition - * @{ - */ -#define WWDG_FLAG_EWIF WWDG_SR_EWIF /*!< Early wakeup interrupt flag */ -/** - * @} - */ - -/** @defgroup WWDG_Prescaler WWDG Prescaler - * @{ - */ -#define WWDG_PRESCALER_1 ((uint32_t)0x00000000) /*!< WWDG counter clock = (PCLK1/4096)/1 */ -#define WWDG_PRESCALER_2 WWDG_CFR_WDGTB0 /*!< WWDG counter clock = (PCLK1/4096)/2 */ -#define WWDG_PRESCALER_4 WWDG_CFR_WDGTB1 /*!< WWDG counter clock = (PCLK1/4096)/4 */ -#define WWDG_PRESCALER_8 WWDG_CFR_WDGTB /*!< WWDG counter clock = (PCLK1/4096)/8 */ -/** - * @} - */ - -/** - * @} - */ - -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup WWDG_Exported_Macros WWDG Exported Macros - * @{ - */ - -/** @brief Reset WWDG handle state - * @param __HANDLE__: WWDG handle - * @retval None - */ -#define __HAL_WWDG_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_WWDG_STATE_RESET) - -/** - * @brief Enables the WWDG peripheral. - * @param __HANDLE__: WWDG handle - * @retval None - */ -#define __HAL_WWDG_ENABLE(__HANDLE__) SET_BIT((__HANDLE__)->Instance->CR, WWDG_CR_WDGA) - -/** - * @brief Disables the WWDG peripheral. - * @param __HANDLE__: WWDG handle - * @note WARNING: This is a dummy macro for HAL code alignment. - * Once enable, WWDG Peripheral cannot be disabled except by a system reset. - * @retval None - */ -#define __HAL_WWDG_DISABLE(__HANDLE__) /* dummy macro */ - -/** - * @brief Gets the selected WWDG's it status. - * @param __HANDLE__: WWDG handle - * @param __INTERRUPT__: specifies the it to check. - * This parameter can be one of the following values: - * @arg WWDG_FLAG_EWIF: Early wakeup interrupt IT - * @retval The new state of WWDG_FLAG (SET or RESET). - */ -#define __HAL_WWDG_GET_IT(__HANDLE__, __INTERRUPT__) __HAL_WWDG_GET_FLAG((__HANDLE__),(__INTERRUPT__)) - -/** @brief Clear the WWDG's interrupt pending bits - * bits to clear the selected interrupt pending bits. - * @param __HANDLE__: WWDG handle - * @param __INTERRUPT__: specifies the interrupt pending bit to clear. - * This parameter can be one of the following values: - * @arg WWDG_FLAG_EWIF: Early wakeup interrupt flag - */ -#define __HAL_WWDG_CLEAR_IT(__HANDLE__, __INTERRUPT__) __HAL_WWDG_CLEAR_FLAG((__HANDLE__), (__INTERRUPT__)) - -/** - * @brief Enables the WWDG early wakeup interrupt. - * @param __HANDLE__: WWDG handle - * @param __INTERRUPT__: specifies the interrupt to enable. - * This parameter can be one of the following values: - * @arg WWDG_IT_EWI: Early wakeup interrupt - * @note Once enabled this interrupt cannot be disabled except by a system reset. - * @retval None - */ -#define __HAL_WWDG_ENABLE_IT(__HANDLE__, __INTERRUPT__) SET_BIT((__HANDLE__)->Instance->CFR, (__INTERRUPT__)) - -/** - * @brief Disables the WWDG early wakeup interrupt. - * @param __HANDLE__: WWDG handle - * @param __INTERRUPT__: specifies the interrupt to disable. - * This parameter can be one of the following values: - * @arg WWDG_IT_EWI: Early wakeup interrupt - * @note WARNING: This is a dummy macro for HAL code alignment. - * Once enabled this interrupt cannot be disabled except by a system reset. - * @retval None - */ -#define __HAL_WWDG_DISABLE_IT(__HANDLE__, __INTERRUPT__) /* dummy macro */ - -/** - * @brief Gets the selected WWDG's flag status. - * @param __HANDLE__: WWDG handle - * @param __FLAG__: specifies the flag to check. - * This parameter can be one of the following values: - * @arg WWDG_FLAG_EWIF: Early wakeup interrupt flag - * @retval The new state of WWDG_FLAG (SET or RESET). - */ -#define __HAL_WWDG_GET_FLAG(__HANDLE__, __FLAG__) (((__HANDLE__)->Instance->SR & (__FLAG__)) == (__FLAG__)) - -/** - * @brief Clears the WWDG's pending flags. - * @param __HANDLE__: WWDG handle - * @param __FLAG__: specifies the flag to clear. - * This parameter can be one of the following values: - * @arg WWDG_FLAG_EWIF: Early wakeup interrupt flag - * @retval None - */ -#define __HAL_WWDG_CLEAR_FLAG(__HANDLE__, __FLAG__) (((__HANDLE__)->Instance->SR) = ~(__FLAG__)) - -/** @brief Checks if the specified WWDG interrupt source is enabled or disabled. - * @param __HANDLE__: WWDG Handle. - * @param __INTERRUPT__: specifies the WWDG interrupt source to check. - * This parameter can be one of the following values: - * @arg WWDG_IT_EWI: Early Wakeup Interrupt - * @retval state of __INTERRUPT__ (TRUE or FALSE). - */ -#define __HAL_WWDG_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) (((__HANDLE__)->Instance->CFR & (__INTERRUPT__)) == (__INTERRUPT__)) - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup WWDG_Exported_Functions - * @{ - */ - -/** @addtogroup WWDG_Exported_Functions_Group1 - * @{ - */ -/* Initialization/de-initialization functions **********************************/ -HAL_StatusTypeDef HAL_WWDG_Init(WWDG_HandleTypeDef *hwwdg); -HAL_StatusTypeDef HAL_WWDG_DeInit(WWDG_HandleTypeDef *hwwdg); -void HAL_WWDG_MspInit(WWDG_HandleTypeDef *hwwdg); -void HAL_WWDG_MspDeInit(WWDG_HandleTypeDef *hwwdg); -void HAL_WWDG_WakeupCallback(WWDG_HandleTypeDef* hwwdg); -/** - * @} - */ - -/** @addtogroup WWDG_Exported_Functions_Group2 - * @{ - */ -/* I/O operation functions ******************************************************/ -HAL_StatusTypeDef HAL_WWDG_Start(WWDG_HandleTypeDef *hwwdg); -HAL_StatusTypeDef HAL_WWDG_Start_IT(WWDG_HandleTypeDef *hwwdg); -HAL_StatusTypeDef HAL_WWDG_Refresh(WWDG_HandleTypeDef *hwwdg, uint32_t Counter); -void HAL_WWDG_IRQHandler(WWDG_HandleTypeDef *hwwdg); -/** - * @} - */ - -/** @addtogroup WWDG_Exported_Functions_Group3 - * @{ - */ -/* Peripheral State functions **************************************************/ -HAL_WWDG_StateTypeDef HAL_WWDG_GetState(WWDG_HandleTypeDef *hwwdg); -/** - * @} - */ - -/** - * @} - */ - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @defgroup WWDG_Private_Constants WWDG Private Constants - * @{ - */ -/** @defgroup WWDG_BitAddress_AliasRegion WWDG BitAddress - * @brief WWDG registers bit address in the alias region - * @{ - */ - -/* --- CFR Register ---*/ -/* Alias word address of EWI bit */ -#define WWDG_CFR_BASE (uint32_t)(WWDG_BASE + 0x04) - -/** - * @} - */ - -/** - * @} - */ - -/* Private macros ------------------------------------------------------------*/ -/** @defgroup WWDG_Private_Macros WWDG Private Macros - * @{ - */ -#define IS_WWDG_PRESCALER(__PRESCALER__) (((__PRESCALER__) == WWDG_PRESCALER_1) || \ - ((__PRESCALER__) == WWDG_PRESCALER_2) || \ - ((__PRESCALER__) == WWDG_PRESCALER_4) || \ - ((__PRESCALER__) == WWDG_PRESCALER_8)) -#define IS_WWDG_WINDOW(__WINDOW__) ((__WINDOW__) <= 0x7F) -#define IS_WWDG_COUNTER(__COUNTER__) (((__COUNTER__) >= 0x40) && ((__COUNTER__) <= 0x7F)) -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @defgroup WWDG_Private_Functions WWDG Private Functions - * @{ - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F2xx_HAL_WWDG_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_sdmmc.h b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_sdmmc.h deleted file mode 100755 index 83df9db2..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_sdmmc.h +++ /dev/null @@ -1,907 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_ll_sdmmc.h - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief Header file of SDMMC HAL module. - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F2xx_LL_SDMMC_H -#define __STM32F2xx_LL_SDMMC_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal_def.h" - -/** @addtogroup STM32F2xx_Driver - * @{ - */ - -/** @addtogroup SDMMC_LL - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup SDMMC_LL_Exported_Types SDMMC_LL Exported Types - * @{ - */ - -/** - * @brief SDMMC Configuration Structure definition - */ -typedef struct -{ - uint32_t ClockEdge; /*!< Specifies the clock transition on which the bit capture is made. - This parameter can be a value of @ref SDIO_Clock_Edge */ - - uint32_t ClockBypass; /*!< Specifies whether the SDIO Clock divider bypass is - enabled or disabled. - This parameter can be a value of @ref SDIO_Clock_Bypass */ - - uint32_t ClockPowerSave; /*!< Specifies whether SDIO Clock output is enabled or - disabled when the bus is idle. - This parameter can be a value of @ref SDIO_Clock_Power_Save */ - - uint32_t BusWide; /*!< Specifies the SDIO bus width. - This parameter can be a value of @ref SDIO_Bus_Wide */ - - uint32_t HardwareFlowControl; /*!< Specifies whether the SDIO hardware flow control is enabled or disabled. - This parameter can be a value of @ref SDIO_Hardware_Flow_Control */ - - uint32_t ClockDiv; /*!< Specifies the clock frequency of the SDIO controller. - This parameter can be a value between Min_Data = 0 and Max_Data = 255 */ - -}SDIO_InitTypeDef; - - -/** - * @brief SDIO Command Control structure - */ -typedef struct -{ - uint32_t Argument; /*!< Specifies the SDIO command argument which is sent - to a card as part of a command message. If a command - contains an argument, it must be loaded into this register - before writing the command to the command register. */ - - uint32_t CmdIndex; /*!< Specifies the SDIO command index. It must be Min_Data = 0 and - Max_Data = 64 */ - - uint32_t Response; /*!< Specifies the SDIO response type. - This parameter can be a value of @ref SDIO_Response_Type */ - - uint32_t WaitForInterrupt; /*!< Specifies whether SDIO wait for interrupt request is - enabled or disabled. - This parameter can be a value of @ref SDIO_Wait_Interrupt_State */ - - uint32_t CPSM; /*!< Specifies whether SDIO Command path state machine (CPSM) - is enabled or disabled. - This parameter can be a value of @ref SDIO_CPSM_State */ -}SDIO_CmdInitTypeDef; - - -/** - * @brief SDIO Data Control structure - */ -typedef struct -{ - uint32_t DataTimeOut; /*!< Specifies the data timeout period in card bus clock periods. */ - - uint32_t DataLength; /*!< Specifies the number of data bytes to be transferred. */ - - uint32_t DataBlockSize; /*!< Specifies the data block size for block transfer. - This parameter can be a value of @ref SDIO_Data_Block_Size */ - - uint32_t TransferDir; /*!< Specifies the data transfer direction, whether the transfer - is a read or write. - This parameter can be a value of @ref SDIO_Transfer_Direction */ - - uint32_t TransferMode; /*!< Specifies whether data transfer is in stream or block mode. - This parameter can be a value of @ref SDIO_Transfer_Type */ - - uint32_t DPSM; /*!< Specifies whether SDIO Data path state machine (DPSM) - is enabled or disabled. - This parameter can be a value of @ref SDIO_DPSM_State */ -}SDIO_DataInitTypeDef; - -/** - * @} - */ - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup SDMMC_LL_Exported_Constants SDMMC_LL Exported Constants - * @{ - */ - -/** @defgroup SDIO_Clock_Edge Clock Edge - * @{ - */ -#define SDIO_CLOCK_EDGE_RISING ((uint32_t)0x00000000) -#define SDIO_CLOCK_EDGE_FALLING SDIO_CLKCR_NEGEDGE - -#define IS_SDIO_CLOCK_EDGE(EDGE) (((EDGE) == SDIO_CLOCK_EDGE_RISING) || \ - ((EDGE) == SDIO_CLOCK_EDGE_FALLING)) -/** - * @} - */ - -/** @defgroup SDIO_Clock_Bypass Clock Bypass - * @{ - */ -#define SDIO_CLOCK_BYPASS_DISABLE ((uint32_t)0x00000000) -#define SDIO_CLOCK_BYPASS_ENABLE SDIO_CLKCR_BYPASS - -#define IS_SDIO_CLOCK_BYPASS(BYPASS) (((BYPASS) == SDIO_CLOCK_BYPASS_DISABLE) || \ - ((BYPASS) == SDIO_CLOCK_BYPASS_ENABLE)) -/** - * @} - */ - -/** @defgroup SDIO_Clock_Power_Save Clock Power Saving - * @{ - */ -#define SDIO_CLOCK_POWER_SAVE_DISABLE ((uint32_t)0x00000000) -#define SDIO_CLOCK_POWER_SAVE_ENABLE SDIO_CLKCR_PWRSAV - -#define IS_SDIO_CLOCK_POWER_SAVE(SAVE) (((SAVE) == SDIO_CLOCK_POWER_SAVE_DISABLE) || \ - ((SAVE) == SDIO_CLOCK_POWER_SAVE_ENABLE)) -/** - * @} - */ - -/** @defgroup SDIO_Bus_Wide Bus Width - * @{ - */ -#define SDIO_BUS_WIDE_1B ((uint32_t)0x00000000) -#define SDIO_BUS_WIDE_4B SDIO_CLKCR_WIDBUS_0 -#define SDIO_BUS_WIDE_8B SDIO_CLKCR_WIDBUS_1 - -#define IS_SDIO_BUS_WIDE(WIDE) (((WIDE) == SDIO_BUS_WIDE_1B) || \ - ((WIDE) == SDIO_BUS_WIDE_4B) || \ - ((WIDE) == SDIO_BUS_WIDE_8B)) -/** - * @} - */ - -/** @defgroup SDIO_Hardware_Flow_Control Hardware Flow Control - * @{ - */ -#define SDIO_HARDWARE_FLOW_CONTROL_DISABLE ((uint32_t)0x00000000) -#define SDIO_HARDWARE_FLOW_CONTROL_ENABLE SDIO_CLKCR_HWFC_EN - -#define IS_SDIO_HARDWARE_FLOW_CONTROL(CONTROL) (((CONTROL) == SDIO_HARDWARE_FLOW_CONTROL_DISABLE) || \ - ((CONTROL) == SDIO_HARDWARE_FLOW_CONTROL_ENABLE)) -/** - * @} - */ - -/** @defgroup SDIO_Clock_Division Clock Division - * @{ - */ -#define IS_SDIO_CLKDIV(DIV) ((DIV) <= 0xFF) -/** - * @} - */ - -/** @defgroup SDIO_Command_Index Command Index - * @{ - */ -#define IS_SDIO_CMD_INDEX(INDEX) ((INDEX) < 0x40) -/** - * @} - */ - -/** @defgroup SDIO_Response_Type Response Type - * @{ - */ -#define SDIO_RESPONSE_NO ((uint32_t)0x00000000) -#define SDIO_RESPONSE_SHORT SDIO_CMD_WAITRESP_0 -#define SDIO_RESPONSE_LONG SDIO_CMD_WAITRESP - -#define IS_SDIO_RESPONSE(RESPONSE) (((RESPONSE) == SDIO_RESPONSE_NO) || \ - ((RESPONSE) == SDIO_RESPONSE_SHORT) || \ - ((RESPONSE) == SDIO_RESPONSE_LONG)) -/** - * @} - */ - -/** @defgroup SDIO_Wait_Interrupt_State Wait Interrupt - * @{ - */ -#define SDIO_WAIT_NO ((uint32_t)0x00000000) -#define SDIO_WAIT_IT SDIO_CMD_WAITINT -#define SDIO_WAIT_PEND SDIO_CMD_WAITPEND - -#define IS_SDIO_WAIT(WAIT) (((WAIT) == SDIO_WAIT_NO) || \ - ((WAIT) == SDIO_WAIT_IT) || \ - ((WAIT) == SDIO_WAIT_PEND)) -/** - * @} - */ - -/** @defgroup SDIO_CPSM_State CPSM State - * @{ - */ -#define SDIO_CPSM_DISABLE ((uint32_t)0x00000000) -#define SDIO_CPSM_ENABLE SDIO_CMD_CPSMEN - -#define IS_SDIO_CPSM(CPSM) (((CPSM) == SDIO_CPSM_DISABLE) || \ - ((CPSM) == SDIO_CPSM_ENABLE)) -/** - * @} - */ - -/** @defgroup SDIO_Response_Registers Response Register - * @{ - */ -#define SDIO_RESP1 ((uint32_t)0x00000000) -#define SDIO_RESP2 ((uint32_t)0x00000004) -#define SDIO_RESP3 ((uint32_t)0x00000008) -#define SDIO_RESP4 ((uint32_t)0x0000000C) - -#define IS_SDIO_RESP(RESP) (((RESP) == SDIO_RESP1) || \ - ((RESP) == SDIO_RESP2) || \ - ((RESP) == SDIO_RESP3) || \ - ((RESP) == SDIO_RESP4)) -/** - * @} - */ - -/** @defgroup SDIO_Data_Length Data Lenght - * @{ - */ -#define IS_SDIO_DATA_LENGTH(LENGTH) ((LENGTH) <= 0x01FFFFFF) -/** - * @} - */ - -/** @defgroup SDIO_Data_Block_Size Data Block Size - * @{ - */ -#define SDIO_DATABLOCK_SIZE_1B ((uint32_t)0x00000000) -#define SDIO_DATABLOCK_SIZE_2B SDIO_DCTRL_DBLOCKSIZE_0 -#define SDIO_DATABLOCK_SIZE_4B SDIO_DCTRL_DBLOCKSIZE_1 -#define SDIO_DATABLOCK_SIZE_8B ((uint32_t)0x00000030) -#define SDIO_DATABLOCK_SIZE_16B SDIO_DCTRL_DBLOCKSIZE_2 -#define SDIO_DATABLOCK_SIZE_32B ((uint32_t)0x00000050) -#define SDIO_DATABLOCK_SIZE_64B ((uint32_t)0x00000060) -#define SDIO_DATABLOCK_SIZE_128B ((uint32_t)0x00000070) -#define SDIO_DATABLOCK_SIZE_256B SDIO_DCTRL_DBLOCKSIZE_3 -#define SDIO_DATABLOCK_SIZE_512B ((uint32_t)0x00000090) -#define SDIO_DATABLOCK_SIZE_1024B ((uint32_t)0x000000A0) -#define SDIO_DATABLOCK_SIZE_2048B ((uint32_t)0x000000B0) -#define SDIO_DATABLOCK_SIZE_4096B ((uint32_t)0x000000C0) -#define SDIO_DATABLOCK_SIZE_8192B ((uint32_t)0x000000D0) -#define SDIO_DATABLOCK_SIZE_16384B ((uint32_t)0x000000E0) - -#define IS_SDIO_BLOCK_SIZE(SIZE) (((SIZE) == SDIO_DATABLOCK_SIZE_1B) || \ - ((SIZE) == SDIO_DATABLOCK_SIZE_2B) || \ - ((SIZE) == SDIO_DATABLOCK_SIZE_4B) || \ - ((SIZE) == SDIO_DATABLOCK_SIZE_8B) || \ - ((SIZE) == SDIO_DATABLOCK_SIZE_16B) || \ - ((SIZE) == SDIO_DATABLOCK_SIZE_32B) || \ - ((SIZE) == SDIO_DATABLOCK_SIZE_64B) || \ - ((SIZE) == SDIO_DATABLOCK_SIZE_128B) || \ - ((SIZE) == SDIO_DATABLOCK_SIZE_256B) || \ - ((SIZE) == SDIO_DATABLOCK_SIZE_512B) || \ - ((SIZE) == SDIO_DATABLOCK_SIZE_1024B) || \ - ((SIZE) == SDIO_DATABLOCK_SIZE_2048B) || \ - ((SIZE) == SDIO_DATABLOCK_SIZE_4096B) || \ - ((SIZE) == SDIO_DATABLOCK_SIZE_8192B) || \ - ((SIZE) == SDIO_DATABLOCK_SIZE_16384B)) -/** - * @} - */ - -/** @defgroup SDIO_Transfer_Direction Transfer Direction - * @{ - */ -#define SDIO_TRANSFER_DIR_TO_CARD ((uint32_t)0x00000000) -#define SDIO_TRANSFER_DIR_TO_SDIO SDIO_DCTRL_DTDIR - -#define IS_SDIO_TRANSFER_DIR(DIR) (((DIR) == SDIO_TRANSFER_DIR_TO_CARD) || \ - ((DIR) == SDIO_TRANSFER_DIR_TO_SDIO)) -/** - * @} - */ - -/** @defgroup SDIO_Transfer_Type Transfer Type - * @{ - */ -#define SDIO_TRANSFER_MODE_BLOCK ((uint32_t)0x00000000) -#define SDIO_TRANSFER_MODE_STREAM SDIO_DCTRL_DTMODE - -#define IS_SDIO_TRANSFER_MODE(MODE) (((MODE) == SDIO_TRANSFER_MODE_BLOCK) || \ - ((MODE) == SDIO_TRANSFER_MODE_STREAM)) -/** - * @} - */ - -/** @defgroup SDIO_DPSM_State DPSM State - * @{ - */ -#define SDIO_DPSM_DISABLE ((uint32_t)0x00000000) -#define SDIO_DPSM_ENABLE SDIO_DCTRL_DTEN - -#define IS_SDIO_DPSM(DPSM) (((DPSM) == SDIO_DPSM_DISABLE) ||\ - ((DPSM) == SDIO_DPSM_ENABLE)) -/** - * @} - */ - -/** @defgroup SDIO_Read_Wait_Mode Read Wait Mode - * @{ - */ -#define SDIO_READ_WAIT_MODE_DATA2 ((uint32_t)0x00000000) -#define SDIO_READ_WAIT_MODE_CLK ((uint32_t)0x00000001) - -#define IS_SDIO_READWAIT_MODE(MODE) (((MODE) == SDIO_READ_WAIT_MODE_CLK) || \ - ((MODE) == SDIO_READ_WAIT_MODE_DATA2)) -/** - * @} - */ - -/** @defgroup SDIO_Interrupt_sources Interrupt Sources - * @{ - */ -#define SDIO_IT_CCRCFAIL SDIO_STA_CCRCFAIL -#define SDIO_IT_DCRCFAIL SDIO_STA_DCRCFAIL -#define SDIO_IT_CTIMEOUT SDIO_STA_CTIMEOUT -#define SDIO_IT_DTIMEOUT SDIO_STA_DTIMEOUT -#define SDIO_IT_TXUNDERR SDIO_STA_TXUNDERR -#define SDIO_IT_RXOVERR SDIO_STA_RXOVERR -#define SDIO_IT_CMDREND SDIO_STA_CMDREND -#define SDIO_IT_CMDSENT SDIO_STA_CMDSENT -#define SDIO_IT_DATAEND SDIO_STA_DATAEND -#define SDIO_IT_STBITERR SDIO_STA_STBITERR -#define SDIO_IT_DBCKEND SDIO_STA_DBCKEND -#define SDIO_IT_CMDACT SDIO_STA_CMDACT -#define SDIO_IT_TXACT SDIO_STA_TXACT -#define SDIO_IT_RXACT SDIO_STA_RXACT -#define SDIO_IT_TXFIFOHE SDIO_STA_TXFIFOHE -#define SDIO_IT_RXFIFOHF SDIO_STA_RXFIFOHF -#define SDIO_IT_TXFIFOF SDIO_STA_TXFIFOF -#define SDIO_IT_RXFIFOF SDIO_STA_RXFIFOF -#define SDIO_IT_TXFIFOE SDIO_STA_TXFIFOE -#define SDIO_IT_RXFIFOE SDIO_STA_RXFIFOE -#define SDIO_IT_TXDAVL SDIO_STA_TXDAVL -#define SDIO_IT_RXDAVL SDIO_STA_RXDAVL -#define SDIO_IT_SDIOIT SDIO_STA_SDIOIT -#define SDIO_IT_CEATAEND SDIO_STA_CEATAEND -/** - * @} - */ - -/** @defgroup SDIO_Flags Flags - * @{ - */ -#define SDIO_FLAG_CCRCFAIL SDIO_STA_CCRCFAIL -#define SDIO_FLAG_DCRCFAIL SDIO_STA_DCRCFAIL -#define SDIO_FLAG_CTIMEOUT SDIO_STA_CTIMEOUT -#define SDIO_FLAG_DTIMEOUT SDIO_STA_DTIMEOUT -#define SDIO_FLAG_TXUNDERR SDIO_STA_TXUNDERR -#define SDIO_FLAG_RXOVERR SDIO_STA_RXOVERR -#define SDIO_FLAG_CMDREND SDIO_STA_CMDREND -#define SDIO_FLAG_CMDSENT SDIO_STA_CMDSENT -#define SDIO_FLAG_DATAEND SDIO_STA_DATAEND -#define SDIO_FLAG_STBITERR SDIO_STA_STBITERR -#define SDIO_FLAG_DBCKEND SDIO_STA_DBCKEND -#define SDIO_FLAG_CMDACT SDIO_STA_CMDACT -#define SDIO_FLAG_TXACT SDIO_STA_TXACT -#define SDIO_FLAG_RXACT SDIO_STA_RXACT -#define SDIO_FLAG_TXFIFOHE SDIO_STA_TXFIFOHE -#define SDIO_FLAG_RXFIFOHF SDIO_STA_RXFIFOHF -#define SDIO_FLAG_TXFIFOF SDIO_STA_TXFIFOF -#define SDIO_FLAG_RXFIFOF SDIO_STA_RXFIFOF -#define SDIO_FLAG_TXFIFOE SDIO_STA_TXFIFOE -#define SDIO_FLAG_RXFIFOE SDIO_STA_RXFIFOE -#define SDIO_FLAG_TXDAVL SDIO_STA_TXDAVL -#define SDIO_FLAG_RXDAVL SDIO_STA_RXDAVL -#define SDIO_FLAG_SDIOIT SDIO_STA_SDIOIT -#define SDIO_FLAG_CEATAEND SDIO_STA_CEATAEND -/** - * @} - */ - -/** - * @} - */ -/* Exported macro ------------------------------------------------------------*/ -/** @defgroup SDMMC_LL_Exported_macros SDMMC_LL Exported Macros - * @{ - */ - -/** @defgroup SDMMC_LL_Alias_Region Bit Address in the alias region - * @{ - */ -/* ------------ SDIO registers bit address in the alias region -------------- */ -#define SDIO_OFFSET (SDIO_BASE - PERIPH_BASE) - -/* --- CLKCR Register ---*/ -/* Alias word address of CLKEN bit */ -#define CLKCR_OFFSET (SDIO_OFFSET + 0x04) -#define CLKEN_BITNUMBER 0x08 -#define CLKCR_CLKEN_BB (PERIPH_BB_BASE + (CLKCR_OFFSET * 32) + (CLKEN_BITNUMBER * 4)) - -/* --- CMD Register ---*/ -/* Alias word address of SDIOSUSPEND bit */ -#define CMD_OFFSET (SDIO_OFFSET + 0x0C) -#define SDIOSUSPEND_BITNUMBER 0x0B -#define CMD_SDIOSUSPEND_BB (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (SDIOSUSPEND_BITNUMBER * 4)) - -/* Alias word address of ENCMDCOMPL bit */ -#define ENCMDCOMPL_BITNUMBER 0x0C -#define CMD_ENCMDCOMPL_BB (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (ENCMDCOMPL_BITNUMBER * 4)) - -/* Alias word address of NIEN bit */ -#define NIEN_BITNUMBER 0x0D -#define CMD_NIEN_BB (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (NIEN_BITNUMBER * 4)) - -/* Alias word address of ATACMD bit */ -#define ATACMD_BITNUMBER 0x0E -#define CMD_ATACMD_BB (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (ATACMD_BITNUMBER * 4)) - -/* --- DCTRL Register ---*/ -/* Alias word address of DMAEN bit */ -#define DCTRL_OFFSET (SDIO_OFFSET + 0x2C) -#define DMAEN_BITNUMBER 0x03 -#define DCTRL_DMAEN_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (DMAEN_BITNUMBER * 4)) - -/* Alias word address of RWSTART bit */ -#define RWSTART_BITNUMBER 0x08 -#define DCTRL_RWSTART_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (RWSTART_BITNUMBER * 4)) - -/* Alias word address of RWSTOP bit */ -#define RWSTOP_BITNUMBER 0x09 -#define DCTRL_RWSTOP_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (RWSTOP_BITNUMBER * 4)) - -/* Alias word address of RWMOD bit */ -#define RWMOD_BITNUMBER 0x0A -#define DCTRL_RWMOD_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (RWMOD_BITNUMBER * 4)) - -/* Alias word address of SDIOEN bit */ -#define SDIOEN_BITNUMBER 0x0B -#define DCTRL_SDIOEN_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (SDIOEN_BITNUMBER * 4)) -/** - * @} - */ - -/** @defgroup SDMMC_LL_Register Bits And Addresses Definitions - * @brief SDMMC_LL registers bit address in the alias region - * @{ - */ - -/* ---------------------- SDIO registers bit mask --------------------------- */ -/* --- CLKCR Register ---*/ -/* CLKCR register clear mask */ -#define CLKCR_CLEAR_MASK ((uint32_t)(SDIO_CLKCR_CLKDIV | SDIO_CLKCR_PWRSAV |\ - SDIO_CLKCR_BYPASS | SDIO_CLKCR_WIDBUS |\ - SDIO_CLKCR_NEGEDGE | SDIO_CLKCR_HWFC_EN)) - -/* --- PWRCTRL Register ---*/ -/* --- DCTRL Register ---*/ -/* SDIO DCTRL Clear Mask */ -#define DCTRL_CLEAR_MASK ((uint32_t)(SDIO_DCTRL_DTEN | SDIO_DCTRL_DTDIR |\ - SDIO_DCTRL_DTMODE | SDIO_DCTRL_DBLOCKSIZE)) - -/* --- CMD Register ---*/ -/* CMD Register clear mask */ -#define CMD_CLEAR_MASK ((uint32_t)(SDIO_CMD_CMDINDEX | SDIO_CMD_WAITRESP |\ - SDIO_CMD_WAITINT | SDIO_CMD_WAITPEND |\ - SDIO_CMD_CPSMEN | SDIO_CMD_SDIOSUSPEND)) - -/* SDIO RESP Registers Address */ -#define SDIO_RESP_ADDR ((uint32_t)(SDIO_BASE + 0x14)) - -/* SDIO Initialization Frequency (400KHz max) */ -#define SDIO_INIT_CLK_DIV ((uint8_t)0x76) - -/* SDIO Data Transfer Frequency (25MHz max) */ -#define SDIO_TRANSFER_CLK_DIV ((uint8_t)0x0) -/** - * @} - */ - -/** @defgroup SDMMC_LL_Interrupt_Clock Interrupt And Clock Configuration - * @brief macros to handle interrupts and specific clock configurations - * @{ - */ - -/** - * @brief Enable the SDIO device. - * @retval None - */ -#define __SDIO_ENABLE() (*(__IO uint32_t *)CLKCR_CLKEN_BB = ENABLE) - -/** - * @brief Disable the SDIO device. - * @retval None - */ -#define __SDIO_DISABLE() (*(__IO uint32_t *)CLKCR_CLKEN_BB = DISABLE) - -/** - * @brief Enable the SDIO DMA transfer. - * @retval None - */ -#define __SDIO_DMA_ENABLE() (*(__IO uint32_t *)DCTRL_DMAEN_BB = ENABLE) - -/** - * @brief Disable the SDIO DMA transfer. - * @retval None - */ -#define __SDIO_DMA_DISABLE() (*(__IO uint32_t *)DCTRL_DMAEN_BB = DISABLE) - -/** - * @brief Enable the SDIO device interrupt. - * @param __INSTANCE__ : Pointer to SDIO register base - * @param __INTERRUPT__ : specifies the SDIO interrupt sources to be enabled. - * This parameter can be one or a combination of the following values: - * @arg SDIO_IT_CCRCFAIL: Command response received (CRC check failed) interrupt - * @arg SDIO_IT_DCRCFAIL: Data block sent/received (CRC check failed) interrupt - * @arg SDIO_IT_CTIMEOUT: Command response timeout interrupt - * @arg SDIO_IT_DTIMEOUT: Data timeout interrupt - * @arg SDIO_IT_TXUNDERR: Transmit FIFO underrun error interrupt - * @arg SDIO_IT_RXOVERR: Received FIFO overrun error interrupt - * @arg SDIO_IT_CMDREND: Command response received (CRC check passed) interrupt - * @arg SDIO_IT_CMDSENT: Command sent (no response required) interrupt - * @arg SDIO_IT_DATAEND: Data end (data counter, SDIDCOUNT, is zero) interrupt - * @arg SDIO_IT_STBITERR: Start bit not detected on all data signals in wide - * bus mode interrupt - * @arg SDIO_IT_DBCKEND: Data block sent/received (CRC check passed) interrupt - * @arg SDIO_IT_CMDACT: Command transfer in progress interrupt - * @arg SDIO_IT_TXACT: Data transmit in progress interrupt - * @arg SDIO_IT_RXACT: Data receive in progress interrupt - * @arg SDIO_IT_TXFIFOHE: Transmit FIFO Half Empty interrupt - * @arg SDIO_IT_RXFIFOHF: Receive FIFO Half Full interrupt - * @arg SDIO_IT_TXFIFOF: Transmit FIFO full interrupt - * @arg SDIO_IT_RXFIFOF: Receive FIFO full interrupt - * @arg SDIO_IT_TXFIFOE: Transmit FIFO empty interrupt - * @arg SDIO_IT_RXFIFOE: Receive FIFO empty interrupt - * @arg SDIO_IT_TXDAVL: Data available in transmit FIFO interrupt - * @arg SDIO_IT_RXDAVL: Data available in receive FIFO interrupt - * @arg SDIO_IT_SDIOIT: SD I/O interrupt received interrupt - * @arg SDIO_IT_CEATAEND: CE-ATA command completion signal received for CMD61 interrupt - * @retval None - */ -#define __SDIO_ENABLE_IT(__INSTANCE__, __INTERRUPT__) ((__INSTANCE__)->MASK |= (__INTERRUPT__)) - -/** - * @brief Disable the SDIO device interrupt. - * @param __INSTANCE__ : Pointer to SDIO register base - * @param __INTERRUPT__ : specifies the SDIO interrupt sources to be disabled. - * This parameter can be one or a combination of the following values: - * @arg SDIO_IT_CCRCFAIL: Command response received (CRC check failed) interrupt - * @arg SDIO_IT_DCRCFAIL: Data block sent/received (CRC check failed) interrupt - * @arg SDIO_IT_CTIMEOUT: Command response timeout interrupt - * @arg SDIO_IT_DTIMEOUT: Data timeout interrupt - * @arg SDIO_IT_TXUNDERR: Transmit FIFO underrun error interrupt - * @arg SDIO_IT_RXOVERR: Received FIFO overrun error interrupt - * @arg SDIO_IT_CMDREND: Command response received (CRC check passed) interrupt - * @arg SDIO_IT_CMDSENT: Command sent (no response required) interrupt - * @arg SDIO_IT_DATAEND: Data end (data counter, SDIDCOUNT, is zero) interrupt - * @arg SDIO_IT_STBITERR: Start bit not detected on all data signals in wide - * bus mode interrupt - * @arg SDIO_IT_DBCKEND: Data block sent/received (CRC check passed) interrupt - * @arg SDIO_IT_CMDACT: Command transfer in progress interrupt - * @arg SDIO_IT_TXACT: Data transmit in progress interrupt - * @arg SDIO_IT_RXACT: Data receive in progress interrupt - * @arg SDIO_IT_TXFIFOHE: Transmit FIFO Half Empty interrupt - * @arg SDIO_IT_RXFIFOHF: Receive FIFO Half Full interrupt - * @arg SDIO_IT_TXFIFOF: Transmit FIFO full interrupt - * @arg SDIO_IT_RXFIFOF: Receive FIFO full interrupt - * @arg SDIO_IT_TXFIFOE: Transmit FIFO empty interrupt - * @arg SDIO_IT_RXFIFOE: Receive FIFO empty interrupt - * @arg SDIO_IT_TXDAVL: Data available in transmit FIFO interrupt - * @arg SDIO_IT_RXDAVL: Data available in receive FIFO interrupt - * @arg SDIO_IT_SDIOIT: SD I/O interrupt received interrupt - * @arg SDIO_IT_CEATAEND: CE-ATA command completion signal received for CMD61 interrupt - * @retval None - */ -#define __SDIO_DISABLE_IT(__INSTANCE__, __INTERRUPT__) ((__INSTANCE__)->MASK &= ~(__INTERRUPT__)) - -/** - * @brief Checks whether the specified SDIO flag is set or not. - * @param __INSTANCE__ : Pointer to SDIO register base - * @param __FLAG__: specifies the flag to check. - * This parameter can be one of the following values: - * @arg SDIO_FLAG_CCRCFAIL: Command response received (CRC check failed) - * @arg SDIO_FLAG_DCRCFAIL: Data block sent/received (CRC check failed) - * @arg SDIO_FLAG_CTIMEOUT: Command response timeout - * @arg SDIO_FLAG_DTIMEOUT: Data timeout - * @arg SDIO_FLAG_TXUNDERR: Transmit FIFO underrun error - * @arg SDIO_FLAG_RXOVERR: Received FIFO overrun error - * @arg SDIO_FLAG_CMDREND: Command response received (CRC check passed) - * @arg SDIO_FLAG_CMDSENT: Command sent (no response required) - * @arg SDIO_FLAG_DATAEND: Data end (data counter, SDIDCOUNT, is zero) - * @arg SDIO_FLAG_STBITERR: Start bit not detected on all data signals in wide bus mode. - * @arg SDIO_FLAG_DBCKEND: Data block sent/received (CRC check passed) - * @arg SDIO_FLAG_CMDACT: Command transfer in progress - * @arg SDIO_FLAG_TXACT: Data transmit in progress - * @arg SDIO_FLAG_RXACT: Data receive in progress - * @arg SDIO_FLAG_TXFIFOHE: Transmit FIFO Half Empty - * @arg SDIO_FLAG_RXFIFOHF: Receive FIFO Half Full - * @arg SDIO_FLAG_TXFIFOF: Transmit FIFO full - * @arg SDIO_FLAG_RXFIFOF: Receive FIFO full - * @arg SDIO_FLAG_TXFIFOE: Transmit FIFO empty - * @arg SDIO_FLAG_RXFIFOE: Receive FIFO empty - * @arg SDIO_FLAG_TXDAVL: Data available in transmit FIFO - * @arg SDIO_FLAG_RXDAVL: Data available in receive FIFO - * @arg SDIO_FLAG_SDIOIT: SD I/O interrupt received - * @arg SDIO_FLAG_CEATAEND: CE-ATA command completion signal received for CMD61 - * @retval The new state of SDIO_FLAG (SET or RESET). - */ -#define __SDIO_GET_FLAG(__INSTANCE__, __FLAG__) (((__INSTANCE__)->STA &(__FLAG__)) != RESET) - - -/** - * @brief Clears the SDIO pending flags. - * @param __INSTANCE__ : Pointer to SDIO register base - * @param __FLAG__: specifies the flag to clear. - * This parameter can be one or a combination of the following values: - * @arg SDIO_FLAG_CCRCFAIL: Command response received (CRC check failed) - * @arg SDIO_FLAG_DCRCFAIL: Data block sent/received (CRC check failed) - * @arg SDIO_FLAG_CTIMEOUT: Command response timeout - * @arg SDIO_FLAG_DTIMEOUT: Data timeout - * @arg SDIO_FLAG_TXUNDERR: Transmit FIFO underrun error - * @arg SDIO_FLAG_RXOVERR: Received FIFO overrun error - * @arg SDIO_FLAG_CMDREND: Command response received (CRC check passed) - * @arg SDIO_FLAG_CMDSENT: Command sent (no response required) - * @arg SDIO_FLAG_DATAEND: Data end (data counter, SDIDCOUNT, is zero) - * @arg SDIO_FLAG_STBITERR: Start bit not detected on all data signals in wide bus mode - * @arg SDIO_FLAG_DBCKEND: Data block sent/received (CRC check passed) - * @arg SDIO_FLAG_SDIOIT: SD I/O interrupt received - * @arg SDIO_FLAG_CEATAEND: CE-ATA command completion signal received for CMD61 - * @retval None - */ -#define __SDIO_CLEAR_FLAG(__INSTANCE__, __FLAG__) ((__INSTANCE__)->ICR = (__FLAG__)) - -/** - * @brief Checks whether the specified SDIO interrupt has occurred or not. - * @param __INSTANCE__ : Pointer to SDIO register base - * @param __INTERRUPT__: specifies the SDIO interrupt source to check. - * This parameter can be one of the following values: - * @arg SDIO_IT_CCRCFAIL: Command response received (CRC check failed) interrupt - * @arg SDIO_IT_DCRCFAIL: Data block sent/received (CRC check failed) interrupt - * @arg SDIO_IT_CTIMEOUT: Command response timeout interrupt - * @arg SDIO_IT_DTIMEOUT: Data timeout interrupt - * @arg SDIO_IT_TXUNDERR: Transmit FIFO underrun error interrupt - * @arg SDIO_IT_RXOVERR: Received FIFO overrun error interrupt - * @arg SDIO_IT_CMDREND: Command response received (CRC check passed) interrupt - * @arg SDIO_IT_CMDSENT: Command sent (no response required) interrupt - * @arg SDIO_IT_DATAEND: Data end (data counter, SDIDCOUNT, is zero) interrupt - * @arg SDIO_IT_STBITERR: Start bit not detected on all data signals in wide - * bus mode interrupt - * @arg SDIO_IT_DBCKEND: Data block sent/received (CRC check passed) interrupt - * @arg SDIO_IT_CMDACT: Command transfer in progress interrupt - * @arg SDIO_IT_TXACT: Data transmit in progress interrupt - * @arg SDIO_IT_RXACT: Data receive in progress interrupt - * @arg SDIO_IT_TXFIFOHE: Transmit FIFO Half Empty interrupt - * @arg SDIO_IT_RXFIFOHF: Receive FIFO Half Full interrupt - * @arg SDIO_IT_TXFIFOF: Transmit FIFO full interrupt - * @arg SDIO_IT_RXFIFOF: Receive FIFO full interrupt - * @arg SDIO_IT_TXFIFOE: Transmit FIFO empty interrupt - * @arg SDIO_IT_RXFIFOE: Receive FIFO empty interrupt - * @arg SDIO_IT_TXDAVL: Data available in transmit FIFO interrupt - * @arg SDIO_IT_RXDAVL: Data available in receive FIFO interrupt - * @arg SDIO_IT_SDIOIT: SD I/O interrupt received interrupt - * @arg SDIO_IT_CEATAEND: CE-ATA command completion signal received for CMD61 interrupt - * @retval The new state of SDIO_IT (SET or RESET). - */ -#define __SDIO_GET_IT (__INSTANCE__, __INTERRUPT__) (((__INSTANCE__)->STA &(__INTERRUPT__)) == (__INTERRUPT__)) - -/** - * @brief Clears the SDIO's interrupt pending bits. - * @param __INSTANCE__ : Pointer to SDIO register base - * @param __INTERRUPT__: specifies the interrupt pending bit to clear. - * This parameter can be one or a combination of the following values: - * @arg SDIO_IT_CCRCFAIL: Command response received (CRC check failed) interrupt - * @arg SDIO_IT_DCRCFAIL: Data block sent/received (CRC check failed) interrupt - * @arg SDIO_IT_CTIMEOUT: Command response timeout interrupt - * @arg SDIO_IT_DTIMEOUT: Data timeout interrupt - * @arg SDIO_IT_TXUNDERR: Transmit FIFO underrun error interrupt - * @arg SDIO_IT_RXOVERR: Received FIFO overrun error interrupt - * @arg SDIO_IT_CMDREND: Command response received (CRC check passed) interrupt - * @arg SDIO_IT_CMDSENT: Command sent (no response required) interrupt - * @arg SDIO_IT_DATAEND: Data end (data counter, SDIO_DCOUNT, is zero) interrupt - * @arg SDIO_IT_STBITERR: Start bit not detected on all data signals in wide - * bus mode interrupt - * @arg SDIO_IT_SDIOIT: SD I/O interrupt received interrupt - * @arg SDIO_IT_CEATAEND: CE-ATA command completion signal received for CMD61 - * @retval None - */ -#define __SDIO_CLEAR_IT(__INSTANCE__, __INTERRUPT__) ((__INSTANCE__)->ICR = (__INTERRUPT__)) - -/** - * @brief Enable Start the SD I/O Read Wait operation. - * @retval None - */ -#define __SDIO_START_READWAIT_ENABLE() (*(__IO uint32_t *) DCTRL_RWSTART_BB = ENABLE) - -/** - * @brief Disable Start the SD I/O Read Wait operations. - * @retval None - */ -#define __SDIO_START_READWAIT_DISABLE() (*(__IO uint32_t *) DCTRL_RWSTART_BB = DISABLE) - -/** - * @brief Enable Start the SD I/O Read Wait operation. - * @retval None - */ -#define __SDIO_STOP_READWAIT_ENABLE() (*(__IO uint32_t *) DCTRL_RWSTOP_BB = ENABLE) - -/** - * @brief Disable Stop the SD I/O Read Wait operations. - * @retval None - */ -#define __SDIO_STOP_READWAIT_DISABLE() (*(__IO uint32_t *) DCTRL_RWSTOP_BB = DISABLE) - -/** - * @brief Enable the SD I/O Mode Operation. - * @retval None - */ -#define __SDIO_OPERATION_ENABLE() (*(__IO uint32_t *) DCTRL_SDIOEN_BB = ENABLE) - -/** - * @brief Disable the SD I/O Mode Operation. - * @retval None - */ -#define __SDIO_OPERATION_DISABLE() (*(__IO uint32_t *) DCTRL_SDIOEN_BB = DISABLE) - -/** - * @brief Enable the SD I/O Suspend command sending. - * @retval None - */ -#define __SDIO_SUSPEND_CMD_ENABLE() (*(__IO uint32_t *) CMD_SDIOSUSPEND_BB = ENABLE) - -/** - * @brief Disable the SD I/O Suspend command sending. - * @retval None - */ -#define __SDIO_SUSPEND_CMD_DISABLE() (*(__IO uint32_t *) CMD_SDIOSUSPEND_BB = DISABLE) - -/** - * @brief Enable the command completion signal. - * @retval None - */ -#define __SDIO_CEATA_CMD_COMPLETION_ENABLE() (*(__IO uint32_t *) CMD_ENCMDCOMPL_BB = ENABLE) - -/** - * @brief Disable the command completion signal. - * @retval None - */ -#define __SDIO_CEATA_CMD_COMPLETION_DISABLE() (*(__IO uint32_t *) CMD_ENCMDCOMPL_BB = DISABLE) - -/** - * @brief Enable the CE-ATA interrupt. - * @retval None - */ -#define __SDIO_CEATA_ENABLE_IT() (*(__IO uint32_t *) CMD_NIEN_BB = (uint32_t)0) - -/** - * @brief Disable the CE-ATA interrupt. - * @retval None - */ -#define __SDIO_CEATA_DISABLE_IT() (*(__IO uint32_t *) CMD_NIEN_BB = (uint32_t)1) - -/** - * @brief Enable send CE-ATA command (CMD61). - * @retval None - */ -#define __SDIO_CEATA_SENDCMD_ENABLE() (*(__IO uint32_t *) CMD_ATACMD_BB = ENABLE) - -/** - * @brief Disable send CE-ATA command (CMD61). - * @retval None - */ -#define __SDIO_CEATA_SENDCMD_DISABLE() (*(__IO uint32_t *) CMD_ATACMD_BB = DISABLE) - -/** - * @} - */ - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup SDMMC_LL_Exported_Functions - * @{ - */ - -/* Initialization/de-initialization functions **********************************/ -/** @addtogroup HAL_SDMMC_LL_Group1 - * @{ - */ -HAL_StatusTypeDef SDIO_Init(SDIO_TypeDef *SDIOx, SDIO_InitTypeDef Init); -/** - * @} - */ - -/* I/O operation functions *****************************************************/ -/** @addtogroup HAL_SDMMC_LL_Group2 - * @{ - */ -/* Blocking mode: Polling */ -uint32_t SDIO_ReadFIFO(SDIO_TypeDef *SDIOx); -HAL_StatusTypeDef SDIO_WriteFIFO(SDIO_TypeDef *SDIOx, uint32_t *pWriteData); -/** - * @} - */ - -/* Peripheral Control functions ************************************************/ -/** @addtogroup HAL_SDMMC_LL_Group3 - * @{ - */ -HAL_StatusTypeDef SDIO_PowerState_ON(SDIO_TypeDef *SDIOx); -HAL_StatusTypeDef SDIO_PowerState_OFF(SDIO_TypeDef *SDIOx); -uint32_t SDIO_GetPowerState(SDIO_TypeDef *SDIOx); - -/* Command path state machine (CPSM) management functions */ -HAL_StatusTypeDef SDIO_SendCommand(SDIO_TypeDef *SDIOx, SDIO_CmdInitTypeDef *SDIO_CmdInitStruct); -uint8_t SDIO_GetCommandResponse(SDIO_TypeDef *SDIOx); -uint32_t SDIO_GetResponse(uint32_t SDIO_RESP); - -/* Data path state machine (DPSM) management functions */ -HAL_StatusTypeDef SDIO_DataConfig(SDIO_TypeDef *SDIOx, SDIO_DataInitTypeDef* SDIO_DataInitStruct); -uint32_t SDIO_GetDataCounter(SDIO_TypeDef *SDIOx); -uint32_t SDIO_GetFIFOCount(SDIO_TypeDef *SDIOx); - -/* SDIO IO Cards mode management functions */ -HAL_StatusTypeDef SDIO_SetSDIOReadWaitMode(uint32_t SDIO_ReadWaitMode); - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F2xx_LL_SDMMC_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_usb.h b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_usb.h deleted file mode 100755 index e081a907..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_usb.h +++ /dev/null @@ -1,461 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_ll_usb.h - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief Header file of USB Core HAL module. - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F2xx_LL_USB_H -#define __STM32F2xx_LL_USB_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal_def.h" - -/** @addtogroup STM32F2xx_HAL - * @{ - */ - -/** @addtogroup USB_Core - * @{ - */ - -/* Exported types ------------------------------------------------------------*/ - -/** - * @brief USB Mode definition - */ -typedef enum -{ - USB_OTG_DEVICE_MODE = 0, - USB_OTG_HOST_MODE = 1, - USB_OTG_DRD_MODE = 2 - -}USB_OTG_ModeTypeDef; - -/** - * @brief URB States definition - */ -typedef enum { - URB_IDLE = 0, - URB_DONE, - URB_NOTREADY, - URB_NYET, - URB_ERROR, - URB_STALL - -}USB_OTG_URBStateTypeDef; - -/** - * @brief Host channel States definition - */ -typedef enum { - HC_IDLE = 0, - HC_XFRC, - HC_HALTED, - HC_NAK, - HC_NYET, - HC_STALL, - HC_XACTERR, - HC_BBLERR, - HC_DATATGLERR - -}USB_OTG_HCStateTypeDef; - -/** - * @brief PCD Initialization Structure definition - */ -typedef struct -{ - uint32_t dev_endpoints; /*!< Device Endpoints number. - This parameter depends on the used USB core. - This parameter must be a number between Min_Data = 1 and Max_Data = 15 */ - - uint32_t Host_channels; /*!< Host Channels number. - This parameter Depends on the used USB core. - This parameter must be a number between Min_Data = 1 and Max_Data = 15 */ - - uint32_t speed; /*!< USB Core speed. - This parameter can be any value of @ref USB_Core_Speed_ */ - - uint32_t dma_enable; /*!< Enable or disable of the USB embedded DMA. */ - - uint32_t ep0_mps; /*!< Set the Endpoint 0 Max Packet size. - This parameter can be any value of @ref USB_EP0_MPS_ */ - - uint32_t phy_itface; /*!< Select the used PHY interface. - This parameter can be any value of @ref USB_Core_PHY_ */ - - uint32_t Sof_enable; /*!< Enable or disable the output of the SOF signal. */ - - uint32_t low_power_enable; /*!< Enable or disable the low power mode. */ - - uint32_t vbus_sensing_enable; /*!< Enable or disable the VBUS Sensing feature. */ - - uint32_t use_dedicated_ep1; /*!< Enable or disable the use of the dedicated EP1 interrupt. */ - - uint32_t use_external_vbus; /*!< Enable or disable the use of the external VBUS. */ - -}USB_OTG_CfgTypeDef; - -typedef struct -{ - uint8_t num; /*!< Endpoint number - This parameter must be a number between Min_Data = 1 and Max_Data = 15 */ - - uint8_t is_in; /*!< Endpoint direction - This parameter must be a number between Min_Data = 0 and Max_Data = 1 */ - - uint8_t is_stall; /*!< Endpoint stall condition - This parameter must be a number between Min_Data = 0 and Max_Data = 1 */ - - uint8_t type; /*!< Endpoint type - This parameter can be any value of @ref USB_EP_Type_ */ - - uint8_t data_pid_start; /*!< Initial data PID - This parameter must be a number between Min_Data = 0 and Max_Data = 1 */ - - uint8_t even_odd_frame; /*!< IFrame parity - This parameter must be a number between Min_Data = 0 and Max_Data = 1 */ - - uint16_t tx_fifo_num; /*!< Transmission FIFO number - This parameter must be a number between Min_Data = 1 and Max_Data = 15 */ - - uint32_t maxpacket; /*!< Endpoint Max packet size - This parameter must be a number between Min_Data = 0 and Max_Data = 64KB */ - - uint8_t *xfer_buff; /*!< Pointer to transfer buffer */ - - uint32_t dma_addr; /*!< 32 bits aligned transfer buffer address */ - - uint32_t xfer_len; /*!< Current transfer length */ - - uint32_t xfer_count; /*!< Partial transfer length in case of multi packet transfer */ - -}USB_OTG_EPTypeDef; - -typedef struct -{ - uint8_t dev_addr ; /*!< USB device address. - This parameter must be a number between Min_Data = 1 and Max_Data = 255 */ - - uint8_t ch_num; /*!< Host channel number. - This parameter must be a number between Min_Data = 1 and Max_Data = 15 */ - - uint8_t ep_num; /*!< Endpoint number. - This parameter must be a number between Min_Data = 1 and Max_Data = 15 */ - - uint8_t ep_is_in; /*!< Endpoint direction - This parameter must be a number between Min_Data = 0 and Max_Data = 1 */ - - uint8_t speed; /*!< USB Host speed. - This parameter can be any value of @ref USB_Core_Speed_ */ - - uint8_t do_ping; /*!< Enable or disable the use of the PING protocol for HS mode. */ - - uint8_t process_ping; /*!< Execute the PING protocol for HS mode. */ - - uint8_t ep_type; /*!< Endpoint Type. - This parameter can be any value of @ref USB_EP_Type_ */ - - uint16_t max_packet; /*!< Endpoint Max packet size. - This parameter must be a number between Min_Data = 0 and Max_Data = 64KB */ - - uint8_t data_pid; /*!< Initial data PID. - This parameter must be a number between Min_Data = 0 and Max_Data = 1 */ - - uint8_t *xfer_buff; /*!< Pointer to transfer buffer. */ - - uint32_t xfer_len; /*!< Current transfer length. */ - - uint32_t xfer_count; /*!< Partial transfer length in case of multi packet transfer. */ - - uint8_t toggle_in; /*!< IN transfer current toggle flag. - This parameter must be a number between Min_Data = 0 and Max_Data = 1 */ - - uint8_t toggle_out; /*!< OUT transfer current toggle flag - This parameter must be a number between Min_Data = 0 and Max_Data = 1 */ - - uint32_t dma_addr; /*!< 32 bits aligned transfer buffer address. */ - - uint32_t ErrCnt; /*!< Host channel error count.*/ - - USB_OTG_URBStateTypeDef urb_state; /*!< URB state. - This parameter can be any value of @ref USB_OTG_URBStateTypeDef */ - - USB_OTG_HCStateTypeDef state; /*!< Host Channel state. - This parameter can be any value of @ref USB_OTG_HCStateTypeDef */ - -}USB_OTG_HCTypeDef; - -/* Exported constants --------------------------------------------------------*/ - -/** @defgroup PCD_Exported_Constants PCD Exported Constants - * @{ - */ - -/** @defgroup USB_Core_Mode_ USB Core Mode - * @{ - */ -#define USB_OTG_MODE_DEVICE 0 -#define USB_OTG_MODE_HOST 1 -#define USB_OTG_MODE_DRD 2 -/** - * @} - */ - -/** @defgroup USB_Core_Speed_ USB Core Speed - * @{ - */ -#define USB_OTG_SPEED_HIGH 0 -#define USB_OTG_SPEED_HIGH_IN_FULL 1 -#define USB_OTG_SPEED_LOW 2 -#define USB_OTG_SPEED_FULL 3 -/** - * @} - */ - -/** @defgroup USB_Core_PHY_ USB Core PHY - * @{ - */ -#define USB_OTG_ULPI_PHY 1 -#define USB_OTG_EMBEDDED_PHY 2 -/** - * @} - */ - -/** @defgroup USB_Core_MPS_ USB Core MPS - * @{ - */ -#define USB_OTG_HS_MAX_PACKET_SIZE 512 -#define USB_OTG_FS_MAX_PACKET_SIZE 64 -#define USB_OTG_MAX_EP0_SIZE 64 -/** - * @} - */ - -/** @defgroup USB_Core_Phy_Frequency_ USB Core Phy Frequency - * @{ - */ -#define DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ (0 << 1) -#define DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ (1 << 1) -#define DSTS_ENUMSPD_LS_PHY_6MHZ (2 << 1) -#define DSTS_ENUMSPD_FS_PHY_48MHZ (3 << 1) -/** - * @} - */ - -/** @defgroup USB_CORE_Frame_Interval_ USB CORE Frame Interval - * @{ - */ -#define DCFG_FRAME_INTERVAL_80 0 -#define DCFG_FRAME_INTERVAL_85 1 -#define DCFG_FRAME_INTERVAL_90 2 -#define DCFG_FRAME_INTERVAL_95 3 -/** - * @} - */ - -/** @defgroup USB_EP0_MPS_ USB EP0 MPS - * @{ - */ -#define DEP0CTL_MPS_64 0 -#define DEP0CTL_MPS_32 1 -#define DEP0CTL_MPS_16 2 -#define DEP0CTL_MPS_8 3 -/** - * @} - */ - -/** @defgroup USB_EP_Speed_ USB EP Speed - * @{ - */ -#define EP_SPEED_LOW 0 -#define EP_SPEED_FULL 1 -#define EP_SPEED_HIGH 2 -/** - * @} - */ - -/** @defgroup USB_EP_Type_ USB EP Type - * @{ - */ -#define EP_TYPE_CTRL 0 -#define EP_TYPE_ISOC 1 -#define EP_TYPE_BULK 2 -#define EP_TYPE_INTR 3 -#define EP_TYPE_MSK 3 -/** - * @} - */ - -/** @defgroup USB_STS_Defines_ USB STS Defines - * @{ - */ -#define STS_GOUT_NAK 1 -#define STS_DATA_UPDT 2 -#define STS_XFER_COMP 3 -#define STS_SETUP_COMP 4 -#define STS_SETUP_UPDT 6 -/** - * @} - */ - -/** @defgroup HCFG_SPEED_Defines_ HCFG SPEED Defines - * @{ - */ -#define HCFG_30_60_MHZ 0 -#define HCFG_48_MHZ 1 -#define HCFG_6_MHZ 2 -/** - * @} - */ - -/** @defgroup HPRT0_PRTSPD_SPEED_Defines_ HPRT0 PRTSPD SPEED Defines - * @{ - */ -#define HPRT0_PRTSPD_HIGH_SPEED 0 -#define HPRT0_PRTSPD_FULL_SPEED 1 -#define HPRT0_PRTSPD_LOW_SPEED 2 -/** - * @} - */ - -#define HCCHAR_CTRL 0 -#define HCCHAR_ISOC 1 -#define HCCHAR_BULK 2 -#define HCCHAR_INTR 3 - -#define HC_PID_DATA0 0 -#define HC_PID_DATA2 1 -#define HC_PID_DATA1 2 -#define HC_PID_SETUP 3 - -#define GRXSTS_PKTSTS_IN 2 -#define GRXSTS_PKTSTS_IN_XFER_COMP 3 -#define GRXSTS_PKTSTS_DATA_TOGGLE_ERR 5 -#define GRXSTS_PKTSTS_CH_HALTED 7 - -#define USBx_PCGCCTL *(__IO uint32_t *)((uint32_t)USBx + USB_OTG_PCGCCTL_BASE) -#define USBx_HPRT0 *(__IO uint32_t *)((uint32_t)USBx + USB_OTG_HOST_PORT_BASE) - -#define USBx_DEVICE ((USB_OTG_DeviceTypeDef *)((uint32_t )USBx + USB_OTG_DEVICE_BASE)) -#define USBx_INEP(i) ((USB_OTG_INEndpointTypeDef *)((uint32_t)USBx + USB_OTG_IN_ENDPOINT_BASE + (i)*USB_OTG_EP_REG_SIZE)) -#define USBx_OUTEP(i) ((USB_OTG_OUTEndpointTypeDef *)((uint32_t)USBx + USB_OTG_OUT_ENDPOINT_BASE + (i)*USB_OTG_EP_REG_SIZE)) -#define USBx_DFIFO(i) *(__IO uint32_t *)((uint32_t)USBx + USB_OTG_FIFO_BASE + (i) * USB_OTG_FIFO_SIZE) - -#define USBx_HOST ((USB_OTG_HostTypeDef *)((uint32_t )USBx + USB_OTG_HOST_BASE)) -#define USBx_HC(i) ((USB_OTG_HostChannelTypeDef *)((uint32_t)USBx + USB_OTG_HOST_CHANNEL_BASE + (i)*USB_OTG_HOST_CHANNEL_SIZE)) -/** - * @} - */ -/* Exported macro ------------------------------------------------------------*/ -#define USB_MASK_INTERRUPT(__INSTANCE__, __INTERRUPT__) ((__INSTANCE__)->GINTMSK &= ~(__INTERRUPT__)) -#define USB_UNMASK_INTERRUPT(__INSTANCE__, __INTERRUPT__) ((__INSTANCE__)->GINTMSK |= (__INTERRUPT__)) - -#define CLEAR_IN_EP_INTR(__EPNUM__, __INTERRUPT__) (USBx_INEP(__EPNUM__)->DIEPINT = (__INTERRUPT__)) -#define CLEAR_OUT_EP_INTR(__EPNUM__, __INTERRUPT__) (USBx_OUTEP(__EPNUM__)->DOEPINT = (__INTERRUPT__)) - -/* Exported functions --------------------------------------------------------*/ -HAL_StatusTypeDef USB_CoreInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef Init); -HAL_StatusTypeDef USB_DevInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef Init); -HAL_StatusTypeDef USB_EnableGlobalInt(USB_OTG_GlobalTypeDef *USBx); -HAL_StatusTypeDef USB_DisableGlobalInt(USB_OTG_GlobalTypeDef *USBx); -HAL_StatusTypeDef USB_SetCurrentMode(USB_OTG_GlobalTypeDef *USBx , USB_OTG_ModeTypeDef mode); -HAL_StatusTypeDef USB_SetDevSpeed(USB_OTG_GlobalTypeDef *USBx , uint8_t speed); -HAL_StatusTypeDef USB_FlushRxFifo (USB_OTG_GlobalTypeDef *USBx); -HAL_StatusTypeDef USB_FlushTxFifo (USB_OTG_GlobalTypeDef *USBx, uint32_t num ); -HAL_StatusTypeDef USB_ActivateEndpoint(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep); -HAL_StatusTypeDef USB_DeactivateEndpoint(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep); -HAL_StatusTypeDef USB_ActivateDedicatedEndpoint(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep); -HAL_StatusTypeDef USB_DeactivateDedicatedEndpoint(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep); -HAL_StatusTypeDef USB_EPStartXfer(USB_OTG_GlobalTypeDef *USBx , USB_OTG_EPTypeDef *ep, uint8_t dma); -HAL_StatusTypeDef USB_EP0StartXfer(USB_OTG_GlobalTypeDef *USBx , USB_OTG_EPTypeDef *ep, uint8_t dma); -HAL_StatusTypeDef USB_WritePacket(USB_OTG_GlobalTypeDef *USBx, uint8_t *src, uint8_t ch_ep_num, uint16_t len, uint8_t dma); -void * USB_ReadPacket(USB_OTG_GlobalTypeDef *USBx, uint8_t *dest, uint16_t len); -HAL_StatusTypeDef USB_EPSetStall(USB_OTG_GlobalTypeDef *USBx , USB_OTG_EPTypeDef *ep); -HAL_StatusTypeDef USB_EPClearStall(USB_OTG_GlobalTypeDef *USBx , USB_OTG_EPTypeDef *ep); -HAL_StatusTypeDef USB_SetDevAddress (USB_OTG_GlobalTypeDef *USBx, uint8_t address); -HAL_StatusTypeDef USB_DevConnect (USB_OTG_GlobalTypeDef *USBx); -HAL_StatusTypeDef USB_DevDisconnect (USB_OTG_GlobalTypeDef *USBx); -HAL_StatusTypeDef USB_StopDevice(USB_OTG_GlobalTypeDef *USBx); -HAL_StatusTypeDef USB_ActivateSetup (USB_OTG_GlobalTypeDef *USBx); -HAL_StatusTypeDef USB_EP0_OutStart(USB_OTG_GlobalTypeDef *USBx, uint8_t dma, uint8_t *psetup); -uint8_t USB_GetDevSpeed(USB_OTG_GlobalTypeDef *USBx); -uint32_t USB_GetMode(USB_OTG_GlobalTypeDef *USBx); -uint32_t USB_ReadInterrupts (USB_OTG_GlobalTypeDef *USBx); -uint32_t USB_ReadDevAllOutEpInterrupt (USB_OTG_GlobalTypeDef *USBx); -uint32_t USB_ReadDevOutEPInterrupt (USB_OTG_GlobalTypeDef *USBx , uint8_t epnum); -uint32_t USB_ReadDevAllInEpInterrupt (USB_OTG_GlobalTypeDef *USBx); -uint32_t USB_ReadDevInEPInterrupt (USB_OTG_GlobalTypeDef *USBx , uint8_t epnum); -void USB_ClearInterrupts (USB_OTG_GlobalTypeDef *USBx, uint32_t interrupt); - -HAL_StatusTypeDef USB_HostInit (USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cfg); -HAL_StatusTypeDef USB_InitFSLSPClkSel(USB_OTG_GlobalTypeDef *USBx , uint8_t freq); -HAL_StatusTypeDef USB_ResetPort(USB_OTG_GlobalTypeDef *USBx); -HAL_StatusTypeDef USB_DriveVbus (USB_OTG_GlobalTypeDef *USBx, uint8_t state); -uint32_t USB_GetHostSpeed (USB_OTG_GlobalTypeDef *USBx); -uint32_t USB_GetCurrentFrame (USB_OTG_GlobalTypeDef *USBx); -HAL_StatusTypeDef USB_HC_Init(USB_OTG_GlobalTypeDef *USBx, - uint8_t ch_num, - uint8_t epnum, - uint8_t dev_address, - uint8_t speed, - uint8_t ep_type, - uint16_t mps); -HAL_StatusTypeDef USB_HC_StartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_HCTypeDef *hc, uint8_t dma); -uint32_t USB_HC_ReadInterrupt (USB_OTG_GlobalTypeDef *USBx); -HAL_StatusTypeDef USB_HC_Halt(USB_OTG_GlobalTypeDef *USBx , uint8_t hc_num); -HAL_StatusTypeDef USB_DoPing(USB_OTG_GlobalTypeDef *USBx , uint8_t ch_num); -HAL_StatusTypeDef USB_StopHost(USB_OTG_GlobalTypeDef *USBx); - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - - -#endif /* __STM32F2xx_LL_USB_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_can.c b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_can.c deleted file mode 100755 index 59ea6c5d..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_can.c +++ /dev/null @@ -1,1433 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_hal_can.c - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief This file provides firmware functions to manage the following - * functionalities of the Controller Area Network (CAN) peripheral: - * + Initialization and de-initialization functions - * + IO operation functions - * + Peripheral Control functions - * + Peripheral State and Error functions - * - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - (#) Enable the CAN controller interface clock using - __HAL_RCC_CAN1_CLK_ENABLE() for CAN1 and __HAL_RCC_CAN2_CLK_ENABLE() for CAN2 - -@- In case you are using CAN2 only, you have to enable the CAN1 clock. - - (#) CAN pins configuration - (++) Enable the clock for the CAN GPIOs using the following function: - __GPIOx_CLK_ENABLE() - (++) Connect and configure the involved CAN pins to AF9 using the - following function HAL_GPIO_Init() - - (#) Initialize and configure the CAN using CAN_Init() function. - - (#) Transmit the desired CAN frame using HAL_CAN_Transmit() function. - - (#) Receive a CAN frame using HAL_CAN_Receive() function. - - *** Polling mode IO operation *** - ================================= - [..] - (+) Start the CAN peripheral transmission and wait the end of this operation - using HAL_CAN_Transmit(), at this stage user can specify the value of timeout - according to his end application - (+) Start the CAN peripheral reception and wait the end of this operation - using HAL_CAN_Receive(), at this stage user can specify the value of timeout - according to his end application - - *** Interrupt mode IO operation *** - =================================== - [..] - (+) Start the CAN peripheral transmission using HAL_CAN_Transmit_IT() - (+) Start the CAN peripheral reception using HAL_CAN_Receive_IT() - (+) Use HAL_CAN_IRQHandler() called under the used CAN Interrupt subroutine - (+) At CAN end of transmission HAL_CAN_TxCpltCallback() function is executed and user can - add his own code by customization of function pointer HAL_CAN_TxCpltCallback - (+) In case of CAN Error, HAL_CAN_ErrorCallback() function is executed and user can - add his own code by customization of function pointer HAL_CAN_ErrorCallback - - *** CAN HAL driver macros list *** - ============================================= - [..] - Below the list of most used macros in CAN HAL driver. - - (+) __HAL_CAN_ENABLE_IT: Enable the specified CAN interrupts - (+) __HAL_CAN_DISABLE_IT: Disable the specified CAN interrupts - (+) __HAL_CAN_GET_IT_SOURCE: Check if the specified CAN interrupt source is enabled or disabled - (+) __HAL_CAN_CLEAR_FLAG: Clear the CAN's pending flags - (+) __HAL_CAN_GET_FLAG: Get the selected CAN's flag status - - [..] - (@) You can refer to the CAN HAL driver header file for more useful macros - - @endverbatim - - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal.h" - -/** @addtogroup STM32F2xx_HAL_Driver - * @{ - */ - -/** @defgroup CAN CAN - * @brief CAN driver modules - * @{ - */ - -#ifdef HAL_CAN_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @addtogroup CAN_Private_Constants - * @{ - */ -#define CAN_TIMEOUT_VALUE 10 -/** - * @} - */ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/** @addtogroup CAN_Private_Functions - * @{ - */ -static HAL_StatusTypeDef CAN_Receive_IT(CAN_HandleTypeDef* hcan, uint8_t FIFONumber); -static HAL_StatusTypeDef CAN_Transmit_IT(CAN_HandleTypeDef* hcan); -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup CAN_Exported_Functions CAN Exported Functions - * @{ - */ - -/** @defgroup CAN_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * -@verbatim - ============================================================================== - ##### Initialization and de-initialization functions ##### - ============================================================================== - [..] This section provides functions allowing to: - (+) Initialize and configure the CAN. - (+) De-initialize the CAN. - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the CAN peripheral according to the specified - * parameters in the CAN_InitStruct. - * @param hcan: pointer to a CAN_HandleTypeDef structure that contains - * the configuration information for the specified CAN. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CAN_Init(CAN_HandleTypeDef* hcan) -{ - uint32_t InitStatus = 3; - uint32_t tickstart = 0; - - /* Check CAN handle */ - if(hcan == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_CAN_ALL_INSTANCE(hcan->Instance)); - assert_param(IS_FUNCTIONAL_STATE(hcan->Init.TTCM)); - assert_param(IS_FUNCTIONAL_STATE(hcan->Init.ABOM)); - assert_param(IS_FUNCTIONAL_STATE(hcan->Init.AWUM)); - assert_param(IS_FUNCTIONAL_STATE(hcan->Init.NART)); - assert_param(IS_FUNCTIONAL_STATE(hcan->Init.RFLM)); - assert_param(IS_FUNCTIONAL_STATE(hcan->Init.TXFP)); - assert_param(IS_CAN_MODE(hcan->Init.Mode)); - assert_param(IS_CAN_SJW(hcan->Init.SJW)); - assert_param(IS_CAN_BS1(hcan->Init.BS1)); - assert_param(IS_CAN_BS2(hcan->Init.BS2)); - assert_param(IS_CAN_PRESCALER(hcan->Init.Prescaler)); - - - if(hcan->State == HAL_CAN_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - hcan->Lock = HAL_UNLOCKED; - /* Init the low level hardware */ - HAL_CAN_MspInit(hcan); - } - - /* Initialize the CAN state*/ - hcan->State = HAL_CAN_STATE_BUSY; - - /* Exit from sleep mode */ - hcan->Instance->MCR &= (~(uint32_t)CAN_MCR_SLEEP); - - /* Request initialisation */ - hcan->Instance->MCR |= CAN_MCR_INRQ ; - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait the acknowledge */ - while((hcan->Instance->MSR & CAN_MSR_INAK) != CAN_MSR_INAK) - { - if((HAL_GetTick() - tickstart ) > CAN_TIMEOUT_VALUE) - { - hcan->State= HAL_CAN_STATE_TIMEOUT; - /* Process unlocked */ - __HAL_UNLOCK(hcan); - return HAL_TIMEOUT; - } - } - - /* Check acknowledge */ - if ((hcan->Instance->MSR & CAN_MSR_INAK) != CAN_MSR_INAK) - { - InitStatus = CAN_INITSTATUS_FAILED; - } - else - { - /* Set the time triggered communication mode */ - if (hcan->Init.TTCM == ENABLE) - { - hcan->Instance->MCR |= CAN_MCR_TTCM; - } - else - { - hcan->Instance->MCR &= ~(uint32_t)CAN_MCR_TTCM; - } - - /* Set the automatic bus-off management */ - if (hcan->Init.ABOM == ENABLE) - { - hcan->Instance->MCR |= CAN_MCR_ABOM; - } - else - { - hcan->Instance->MCR &= ~(uint32_t)CAN_MCR_ABOM; - } - - /* Set the automatic wake-up mode */ - if (hcan->Init.AWUM == ENABLE) - { - hcan->Instance->MCR |= CAN_MCR_AWUM; - } - else - { - hcan->Instance->MCR &= ~(uint32_t)CAN_MCR_AWUM; - } - - /* Set the no automatic retransmission */ - if (hcan->Init.NART == ENABLE) - { - hcan->Instance->MCR |= CAN_MCR_NART; - } - else - { - hcan->Instance->MCR &= ~(uint32_t)CAN_MCR_NART; - } - - /* Set the receive FIFO locked mode */ - if (hcan->Init.RFLM == ENABLE) - { - hcan->Instance->MCR |= CAN_MCR_RFLM; - } - else - { - hcan->Instance->MCR &= ~(uint32_t)CAN_MCR_RFLM; - } - - /* Set the transmit FIFO priority */ - if (hcan->Init.TXFP == ENABLE) - { - hcan->Instance->MCR |= CAN_MCR_TXFP; - } - else - { - hcan->Instance->MCR &= ~(uint32_t)CAN_MCR_TXFP; - } - - /* Set the bit timing register */ - hcan->Instance->BTR = (uint32_t)((uint32_t)hcan->Init.Mode) | \ - ((uint32_t)hcan->Init.SJW) | \ - ((uint32_t)hcan->Init.BS1) | \ - ((uint32_t)hcan->Init.BS2) | \ - ((uint32_t)hcan->Init.Prescaler - 1); - - /* Request leave initialisation */ - hcan->Instance->MCR &= ~(uint32_t)CAN_MCR_INRQ; - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait the acknowledge */ - while((hcan->Instance->MSR & CAN_MSR_INAK) == CAN_MSR_INAK) - { - if((HAL_GetTick() - tickstart ) > CAN_TIMEOUT_VALUE) - { - hcan->State= HAL_CAN_STATE_TIMEOUT; - /* Process unlocked */ - __HAL_UNLOCK(hcan); - return HAL_TIMEOUT; - } - } - - /* Check acknowledged */ - if ((hcan->Instance->MSR & CAN_MSR_INAK) == CAN_MSR_INAK) - { - InitStatus = CAN_INITSTATUS_FAILED; - } - else - { - InitStatus = CAN_INITSTATUS_SUCCESS; - } - } - - if(InitStatus == CAN_INITSTATUS_SUCCESS) - { - /* Set CAN error code to none */ - hcan->ErrorCode = HAL_CAN_ERROR_NONE; - - /* Initialize the CAN state */ - hcan->State = HAL_CAN_STATE_READY; - - /* Return function status */ - return HAL_OK; - } - else - { - /* Initialize the CAN state */ - hcan->State = HAL_CAN_STATE_ERROR; - - /* Return function status */ - return HAL_ERROR; - } -} - -/** - * @brief Configures the CAN reception filter according to the specified - * parameters in the CAN_FilterInitStruct. - * @param hcan: pointer to a CAN_HandleTypeDef structure that contains - * the configuration information for the specified CAN. - * @param sFilterConfig: pointer to a CAN_FilterConfTypeDef structure that - * contains the filter configuration information. - * @retval None - */ -HAL_StatusTypeDef HAL_CAN_ConfigFilter(CAN_HandleTypeDef* hcan, CAN_FilterConfTypeDef* sFilterConfig) -{ - uint32_t filternbrbitpos = 0; - - /* Check the parameters */ - assert_param(IS_CAN_FILTER_NUMBER(sFilterConfig->FilterNumber)); - assert_param(IS_CAN_FILTER_MODE(sFilterConfig->FilterMode)); - assert_param(IS_CAN_FILTER_SCALE(sFilterConfig->FilterScale)); - assert_param(IS_CAN_FILTER_FIFO(sFilterConfig->FilterFIFOAssignment)); - assert_param(IS_FUNCTIONAL_STATE(sFilterConfig->FilterActivation)); - assert_param(IS_CAN_BANKNUMBER(sFilterConfig->BankNumber)); - - filternbrbitpos = ((uint32_t)1) << sFilterConfig->FilterNumber; - - /* Initialisation mode for the filter */ - CAN1->FMR |= (uint32_t)CAN_FMR_FINIT; - - /* Select the start slave bank */ - CAN1->FMR &= ~((uint32_t)CAN_FMR_CAN2SB); - CAN1->FMR |= (uint32_t)(sFilterConfig->BankNumber << 8); - - /* Filter Deactivation */ - CAN1->FA1R &= ~(uint32_t)filternbrbitpos; - - /* Filter Scale */ - if (sFilterConfig->FilterScale == CAN_FILTERSCALE_16BIT) - { - /* 16-bit scale for the filter */ - CAN1->FS1R &= ~(uint32_t)filternbrbitpos; - - /* First 16-bit identifier and First 16-bit mask */ - /* Or First 16-bit identifier and Second 16-bit identifier */ - CAN1->sFilterRegister[sFilterConfig->FilterNumber].FR1 = - ((0x0000FFFF & (uint32_t)sFilterConfig->FilterMaskIdLow) << 16) | - (0x0000FFFF & (uint32_t)sFilterConfig->FilterIdLow); - - /* Second 16-bit identifier and Second 16-bit mask */ - /* Or Third 16-bit identifier and Fourth 16-bit identifier */ - CAN1->sFilterRegister[sFilterConfig->FilterNumber].FR2 = - ((0x0000FFFF & (uint32_t)sFilterConfig->FilterMaskIdHigh) << 16) | - (0x0000FFFF & (uint32_t)sFilterConfig->FilterIdHigh); - } - - if (sFilterConfig->FilterScale == CAN_FILTERSCALE_32BIT) - { - /* 32-bit scale for the filter */ - CAN1->FS1R |= filternbrbitpos; - /* 32-bit identifier or First 32-bit identifier */ - CAN1->sFilterRegister[sFilterConfig->FilterNumber].FR1 = - ((0x0000FFFF & (uint32_t)sFilterConfig->FilterIdHigh) << 16) | - (0x0000FFFF & (uint32_t)sFilterConfig->FilterIdLow); - /* 32-bit mask or Second 32-bit identifier */ - CAN1->sFilterRegister[sFilterConfig->FilterNumber].FR2 = - ((0x0000FFFF & (uint32_t)sFilterConfig->FilterMaskIdHigh) << 16) | - (0x0000FFFF & (uint32_t)sFilterConfig->FilterMaskIdLow); - } - - /* Filter Mode */ - if (sFilterConfig->FilterMode == CAN_FILTERMODE_IDMASK) - { - /*Id/Mask mode for the filter*/ - CAN1->FM1R &= ~(uint32_t)filternbrbitpos; - } - else /* CAN_FilterInitStruct->CAN_FilterMode == CAN_FilterMode_IdList */ - { - /*Identifier list mode for the filter*/ - CAN1->FM1R |= (uint32_t)filternbrbitpos; - } - - /* Filter FIFO assignment */ - if (sFilterConfig->FilterFIFOAssignment == CAN_FILTER_FIFO0) - { - /* FIFO 0 assignation for the filter */ - CAN1->FFA1R &= ~(uint32_t)filternbrbitpos; - } - - if (sFilterConfig->FilterFIFOAssignment == CAN_FILTER_FIFO1) - { - /* FIFO 1 assignation for the filter */ - CAN1->FFA1R |= (uint32_t)filternbrbitpos; - } - - /* Filter activation */ - if (sFilterConfig->FilterActivation == ENABLE) - { - CAN1->FA1R |= filternbrbitpos; - } - - /* Leave the initialisation mode for the filter */ - CAN1->FMR &= ~((uint32_t)CAN_FMR_FINIT); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Deinitializes the CANx peripheral registers to their default reset values. - * @param hcan: pointer to a CAN_HandleTypeDef structure that contains - * the configuration information for the specified CAN. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CAN_DeInit(CAN_HandleTypeDef* hcan) -{ - /* Check CAN handle */ - if(hcan == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_CAN_ALL_INSTANCE(hcan->Instance)); - - /* Change CAN state */ - hcan->State = HAL_CAN_STATE_BUSY; - - /* DeInit the low level hardware */ - HAL_CAN_MspDeInit(hcan); - - /* Change CAN state */ - hcan->State = HAL_CAN_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(hcan); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Initializes the CAN MSP. - * @param hcan: pointer to a CAN_HandleTypeDef structure that contains - * the configuration information for the specified CAN. - * @retval None - */ -__weak void HAL_CAN_MspInit(CAN_HandleTypeDef* hcan) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_CAN_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes the CAN MSP. - * @param hcan: pointer to a CAN_HandleTypeDef structure that contains - * the configuration information for the specified CAN. - * @retval None - */ -__weak void HAL_CAN_MspDeInit(CAN_HandleTypeDef* hcan) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_CAN_MspDeInit could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup CAN_Exported_Functions_Group2 IO operation functions - * @brief IO operation functions - * -@verbatim - ============================================================================== - ##### IO operation functions ##### - ============================================================================== - [..] This section provides functions allowing to: - (+) Transmit a CAN frame message. - (+) Receive a CAN frame message. - (+) Enter CAN peripheral in sleep mode. - (+) Wake up the CAN peripheral from sleep mode. - -@endverbatim - * @{ - */ - -/** - * @brief Initiates and transmits a CAN frame message. - * @param hcan: pointer to a CAN_HandleTypeDef structure that contains - * the configuration information for the specified CAN. - * @param Timeout: Specify Timeout value - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CAN_Transmit(CAN_HandleTypeDef* hcan, uint32_t Timeout) -{ - uint32_t transmitmailbox = 5; - uint32_t tickstart = 0; - - /* Check the parameters */ - assert_param(IS_CAN_IDTYPE(hcan->pTxMsg->IDE)); - assert_param(IS_CAN_RTR(hcan->pTxMsg->RTR)); - assert_param(IS_CAN_DLC(hcan->pTxMsg->DLC)); - - /* Process locked */ - __HAL_LOCK(hcan); - - if(hcan->State == HAL_CAN_STATE_BUSY_RX) - { - /* Change CAN state */ - hcan->State = HAL_CAN_STATE_BUSY_TX_RX; - } - else - { - /* Change CAN state */ - hcan->State = HAL_CAN_STATE_BUSY_TX; - } - - /* Select one empty transmit mailbox */ - if ((hcan->Instance->TSR&CAN_TSR_TME0) == CAN_TSR_TME0) - { - transmitmailbox = 0; - } - else if ((hcan->Instance->TSR&CAN_TSR_TME1) == CAN_TSR_TME1) - { - transmitmailbox = 1; - } - else if ((hcan->Instance->TSR&CAN_TSR_TME2) == CAN_TSR_TME2) - { - transmitmailbox = 2; - } - else - { - transmitmailbox = CAN_TXSTATUS_NOMAILBOX; - } - - if (transmitmailbox != CAN_TXSTATUS_NOMAILBOX) - { - /* Set up the Id */ - hcan->Instance->sTxMailBox[transmitmailbox].TIR &= CAN_TI0R_TXRQ; - if (hcan->pTxMsg->IDE == CAN_ID_STD) - { - assert_param(IS_CAN_STDID(hcan->pTxMsg->StdId)); - hcan->Instance->sTxMailBox[transmitmailbox].TIR |= ((hcan->pTxMsg->StdId << 21) | \ - hcan->pTxMsg->RTR); - } - else - { - assert_param(IS_CAN_EXTID(hcan->pTxMsg->ExtId)); - hcan->Instance->sTxMailBox[transmitmailbox].TIR |= ((hcan->pTxMsg->ExtId << 3) | \ - hcan->pTxMsg->IDE | \ - hcan->pTxMsg->RTR); - } - - /* Set up the DLC */ - hcan->pTxMsg->DLC &= (uint8_t)0x0000000F; - hcan->Instance->sTxMailBox[transmitmailbox].TDTR &= (uint32_t)0xFFFFFFF0; - hcan->Instance->sTxMailBox[transmitmailbox].TDTR |= hcan->pTxMsg->DLC; - - /* Set up the data field */ - hcan->Instance->sTxMailBox[transmitmailbox].TDLR = (((uint32_t)hcan->pTxMsg->Data[3] << 24) | - ((uint32_t)hcan->pTxMsg->Data[2] << 16) | - ((uint32_t)hcan->pTxMsg->Data[1] << 8) | - ((uint32_t)hcan->pTxMsg->Data[0])); - hcan->Instance->sTxMailBox[transmitmailbox].TDHR = (((uint32_t)hcan->pTxMsg->Data[7] << 24) | - ((uint32_t)hcan->pTxMsg->Data[6] << 16) | - ((uint32_t)hcan->pTxMsg->Data[5] << 8) | - ((uint32_t)hcan->pTxMsg->Data[4])); - /* Request transmission */ - hcan->Instance->sTxMailBox[transmitmailbox].TIR |= CAN_TI0R_TXRQ; - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Check End of transmission flag */ - while(!(__HAL_CAN_TRANSMIT_STATUS(hcan, transmitmailbox))) - { - /* Check for the Timeout */ - if(Timeout != HAL_MAX_DELAY) - { - if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout)) - { - hcan->State = HAL_CAN_STATE_TIMEOUT; - /* Process unlocked */ - __HAL_UNLOCK(hcan); - return HAL_TIMEOUT; - } - } - } - if(hcan->State == HAL_CAN_STATE_BUSY_TX_RX) - { - /* Change CAN state */ - hcan->State = HAL_CAN_STATE_BUSY_RX; - - /* Process unlocked */ - __HAL_UNLOCK(hcan); - } - else - { - /* Change CAN state */ - hcan->State = HAL_CAN_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hcan); - } - - /* Return function status */ - return HAL_OK; - } - else - { - /* Change CAN state */ - hcan->State = HAL_CAN_STATE_ERROR; - - /* Process unlocked */ - __HAL_UNLOCK(hcan); - - /* Return function status */ - return HAL_ERROR; - } -} - -/** - * @brief Initiates and transmits a CAN frame message. - * @param hcan: pointer to a CAN_HandleTypeDef structure that contains - * the configuration information for the specified CAN. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CAN_Transmit_IT(CAN_HandleTypeDef* hcan) -{ - uint32_t transmitmailbox = 5; - uint32_t tmp = 0; - - /* Check the parameters */ - assert_param(IS_CAN_IDTYPE(hcan->pTxMsg->IDE)); - assert_param(IS_CAN_RTR(hcan->pTxMsg->RTR)); - assert_param(IS_CAN_DLC(hcan->pTxMsg->DLC)); - - tmp = hcan->State; - if((tmp == HAL_CAN_STATE_READY) || (tmp == HAL_CAN_STATE_BUSY_RX)) - { - /* Process Locked */ - __HAL_LOCK(hcan); - - /* Select one empty transmit mailbox */ - if((hcan->Instance->TSR&CAN_TSR_TME0) == CAN_TSR_TME0) - { - transmitmailbox = 0; - } - else if((hcan->Instance->TSR&CAN_TSR_TME1) == CAN_TSR_TME1) - { - transmitmailbox = 1; - } - else if((hcan->Instance->TSR&CAN_TSR_TME2) == CAN_TSR_TME2) - { - transmitmailbox = 2; - } - else - { - transmitmailbox = CAN_TXSTATUS_NOMAILBOX; - } - - if(transmitmailbox != CAN_TXSTATUS_NOMAILBOX) - { - /* Set up the Id */ - hcan->Instance->sTxMailBox[transmitmailbox].TIR &= CAN_TI0R_TXRQ; - if(hcan->pTxMsg->IDE == CAN_ID_STD) - { - assert_param(IS_CAN_STDID(hcan->pTxMsg->StdId)); - hcan->Instance->sTxMailBox[transmitmailbox].TIR |= ((hcan->pTxMsg->StdId << 21) | \ - hcan->pTxMsg->RTR); - } - else - { - assert_param(IS_CAN_EXTID(hcan->pTxMsg->ExtId)); - hcan->Instance->sTxMailBox[transmitmailbox].TIR |= ((hcan->pTxMsg->ExtId << 3) | \ - hcan->pTxMsg->IDE | \ - hcan->pTxMsg->RTR); - } - - /* Set up the DLC */ - hcan->pTxMsg->DLC &= (uint8_t)0x0000000F; - hcan->Instance->sTxMailBox[transmitmailbox].TDTR &= (uint32_t)0xFFFFFFF0; - hcan->Instance->sTxMailBox[transmitmailbox].TDTR |= hcan->pTxMsg->DLC; - - /* Set up the data field */ - hcan->Instance->sTxMailBox[transmitmailbox].TDLR = (((uint32_t)hcan->pTxMsg->Data[3] << 24) | - ((uint32_t)hcan->pTxMsg->Data[2] << 16) | - ((uint32_t)hcan->pTxMsg->Data[1] << 8) | - ((uint32_t)hcan->pTxMsg->Data[0])); - hcan->Instance->sTxMailBox[transmitmailbox].TDHR = (((uint32_t)hcan->pTxMsg->Data[7] << 24) | - ((uint32_t)hcan->pTxMsg->Data[6] << 16) | - ((uint32_t)hcan->pTxMsg->Data[5] << 8) | - ((uint32_t)hcan->pTxMsg->Data[4])); - - if(hcan->State == HAL_CAN_STATE_BUSY_RX) - { - /* Change CAN state */ - hcan->State = HAL_CAN_STATE_BUSY_TX_RX; - } - else - { - /* Change CAN state */ - hcan->State = HAL_CAN_STATE_BUSY_TX; - } - - /* Set CAN error code to none */ - hcan->ErrorCode = HAL_CAN_ERROR_NONE; - - /* Process Unlocked */ - __HAL_UNLOCK(hcan); - - /* Enable Error warning Interrupt */ - __HAL_CAN_ENABLE_IT(hcan, CAN_IT_EWG); - - /* Enable Error passive Interrupt */ - __HAL_CAN_ENABLE_IT(hcan, CAN_IT_EPV); - - /* Enable Bus-off Interrupt */ - __HAL_CAN_ENABLE_IT(hcan, CAN_IT_BOF); - - /* Enable Last error code Interrupt */ - __HAL_CAN_ENABLE_IT(hcan, CAN_IT_LEC); - - /* Enable Error Interrupt */ - __HAL_CAN_ENABLE_IT(hcan, CAN_IT_ERR); - - /* Enable Transmit mailbox empty Interrupt */ - __HAL_CAN_ENABLE_IT(hcan, CAN_IT_TME); - - /* Request transmission */ - hcan->Instance->sTxMailBox[transmitmailbox].TIR |= CAN_TI0R_TXRQ; - } - } - else - { - return HAL_BUSY; - } - - return HAL_OK; -} - -/** - * @brief Receives a correct CAN frame. - * @param hcan: pointer to a CAN_HandleTypeDef structure that contains - * the configuration information for the specified CAN. - * @param FIFONumber: FIFO Number value - * @param Timeout: Specify Timeout value - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CAN_Receive(CAN_HandleTypeDef* hcan, uint8_t FIFONumber, uint32_t Timeout) -{ - uint32_t tickstart = 0; - - /* Check the parameters */ - assert_param(IS_CAN_FIFO(FIFONumber)); - - /* Process locked */ - __HAL_LOCK(hcan); - - if(hcan->State == HAL_CAN_STATE_BUSY_TX) - { - /* Change CAN state */ - hcan->State = HAL_CAN_STATE_BUSY_TX_RX; - } - else - { - /* Change CAN state */ - hcan->State = HAL_CAN_STATE_BUSY_RX; - } - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Check pending message */ - while(__HAL_CAN_MSG_PENDING(hcan, FIFONumber) == 0) - { - /* Check for the Timeout */ - if(Timeout != HAL_MAX_DELAY) - { - if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout)) - { - hcan->State = HAL_CAN_STATE_TIMEOUT; - /* Process unlocked */ - __HAL_UNLOCK(hcan); - return HAL_TIMEOUT; - } - } - } - - /* Get the Id */ - hcan->pRxMsg->IDE = (uint8_t)0x04 & hcan->Instance->sFIFOMailBox[FIFONumber].RIR; - if (hcan->pRxMsg->IDE == CAN_ID_STD) - { - hcan->pRxMsg->StdId = (uint32_t)0x000007FF & (hcan->Instance->sFIFOMailBox[FIFONumber].RIR >> 21); - } - else - { - hcan->pRxMsg->ExtId = (uint32_t)0x1FFFFFFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RIR >> 3); - } - - hcan->pRxMsg->RTR = (uint8_t)0x02 & hcan->Instance->sFIFOMailBox[FIFONumber].RIR; - /* Get the DLC */ - hcan->pRxMsg->DLC = (uint8_t)0x0F & hcan->Instance->sFIFOMailBox[FIFONumber].RDTR; - /* Get the FMI */ - hcan->pRxMsg->FMI = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDTR >> 8); - /* Get the data field */ - hcan->pRxMsg->Data[0] = (uint8_t)0xFF & hcan->Instance->sFIFOMailBox[FIFONumber].RDLR; - hcan->pRxMsg->Data[1] = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDLR >> 8); - hcan->pRxMsg->Data[2] = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDLR >> 16); - hcan->pRxMsg->Data[3] = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDLR >> 24); - hcan->pRxMsg->Data[4] = (uint8_t)0xFF & hcan->Instance->sFIFOMailBox[FIFONumber].RDHR; - hcan->pRxMsg->Data[5] = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDHR >> 8); - hcan->pRxMsg->Data[6] = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDHR >> 16); - hcan->pRxMsg->Data[7] = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDHR >> 24); - - /* Release the FIFO */ - if(FIFONumber == CAN_FIFO0) - { - /* Release FIFO0 */ - __HAL_CAN_FIFO_RELEASE(hcan, CAN_FIFO0); - } - else /* FIFONumber == CAN_FIFO1 */ - { - /* Release FIFO1 */ - __HAL_CAN_FIFO_RELEASE(hcan, CAN_FIFO1); - } - - if(hcan->State == HAL_CAN_STATE_BUSY_TX_RX) - { - /* Change CAN state */ - hcan->State = HAL_CAN_STATE_BUSY_TX; - - /* Process unlocked */ - __HAL_UNLOCK(hcan); - } - else - { - /* Change CAN state */ - hcan->State = HAL_CAN_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hcan); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Receives a correct CAN frame. - * @param hcan: Pointer to a CAN_HandleTypeDef structure that contains - * the configuration information for the specified CAN. - * @param FIFONumber: Specify the FIFO number - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CAN_Receive_IT(CAN_HandleTypeDef* hcan, uint8_t FIFONumber) -{ - uint32_t tmp = 0; - - /* Check the parameters */ - assert_param(IS_CAN_FIFO(FIFONumber)); - - tmp = hcan->State; - if((tmp == HAL_CAN_STATE_READY) || (tmp == HAL_CAN_STATE_BUSY_TX)) - { - /* Process locked */ - __HAL_LOCK(hcan); - - if(hcan->State == HAL_CAN_STATE_BUSY_TX) - { - /* Change CAN state */ - hcan->State = HAL_CAN_STATE_BUSY_TX_RX; - } - else - { - /* Change CAN state */ - hcan->State = HAL_CAN_STATE_BUSY_RX; - } - - /* Set CAN error code to none */ - hcan->ErrorCode = HAL_CAN_ERROR_NONE; - - /* Enable Error warning Interrupt */ - __HAL_CAN_ENABLE_IT(hcan, CAN_IT_EWG); - - /* Enable Error passive Interrupt */ - __HAL_CAN_ENABLE_IT(hcan, CAN_IT_EPV); - - /* Enable Bus-off Interrupt */ - __HAL_CAN_ENABLE_IT(hcan, CAN_IT_BOF); - - /* Enable Last error code Interrupt */ - __HAL_CAN_ENABLE_IT(hcan, CAN_IT_LEC); - - /* Enable Error Interrupt */ - __HAL_CAN_ENABLE_IT(hcan, CAN_IT_ERR); - - /* Process unlocked */ - __HAL_UNLOCK(hcan); - - if(FIFONumber == CAN_FIFO0) - { - /* Enable FIFO 0 message pending Interrupt */ - __HAL_CAN_ENABLE_IT(hcan, CAN_IT_FMP0); - } - else - { - /* Enable FIFO 1 message pending Interrupt */ - __HAL_CAN_ENABLE_IT(hcan, CAN_IT_FMP1); - } - - } - else - { - return HAL_BUSY; - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Enters the Sleep (low power) mode. - * @param hcan: pointer to a CAN_HandleTypeDef structure that contains - * the configuration information for the specified CAN. - * @retval HAL status. - */ -HAL_StatusTypeDef HAL_CAN_Sleep(CAN_HandleTypeDef* hcan) -{ - uint32_t tickstart = 0; - - /* Process locked */ - __HAL_LOCK(hcan); - - /* Change CAN state */ - hcan->State = HAL_CAN_STATE_BUSY; - - /* Request Sleep mode */ - hcan->Instance->MCR = (((hcan->Instance->MCR) & (uint32_t)(~(uint32_t)CAN_MCR_INRQ)) | CAN_MCR_SLEEP); - - /* Sleep mode status */ - if ((hcan->Instance->MSR & (CAN_MSR_SLAK|CAN_MSR_INAK)) != CAN_MSR_SLAK) - { - /* Process unlocked */ - __HAL_UNLOCK(hcan); - - /* Return function status */ - return HAL_ERROR; - } - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait the acknowledge */ - while((hcan->Instance->MSR & (CAN_MSR_SLAK|CAN_MSR_INAK)) != CAN_MSR_SLAK) - { - if((HAL_GetTick() - tickstart) > CAN_TIMEOUT_VALUE) - { - hcan->State = HAL_CAN_STATE_TIMEOUT; - /* Process unlocked */ - __HAL_UNLOCK(hcan); - return HAL_TIMEOUT; - } - } - - /* Change CAN state */ - hcan->State = HAL_CAN_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hcan); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Wakes up the CAN peripheral from sleep mode, after that the CAN peripheral - * is in the normal mode. - * @param hcan: pointer to a CAN_HandleTypeDef structure that contains - * the configuration information for the specified CAN. - * @retval HAL status. - */ -HAL_StatusTypeDef HAL_CAN_WakeUp(CAN_HandleTypeDef* hcan) -{ - uint32_t tickstart = 0; - - /* Process locked */ - __HAL_LOCK(hcan); - - /* Change CAN state */ - hcan->State = HAL_CAN_STATE_BUSY; - - /* Wake up request */ - hcan->Instance->MCR &= ~(uint32_t)CAN_MCR_SLEEP; - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Sleep mode status */ - while((hcan->Instance->MSR & CAN_MSR_SLAK) == CAN_MSR_SLAK) - { - if((HAL_GetTick() - tickstart) > CAN_TIMEOUT_VALUE) - { - hcan->State= HAL_CAN_STATE_TIMEOUT; - /* Process unlocked */ - __HAL_UNLOCK(hcan); - return HAL_TIMEOUT; - } - } - if((hcan->Instance->MSR & CAN_MSR_SLAK) == CAN_MSR_SLAK) - { - /* Process unlocked */ - __HAL_UNLOCK(hcan); - - /* Return function status */ - return HAL_ERROR; - } - - /* Change CAN state */ - hcan->State = HAL_CAN_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hcan); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Handles CAN interrupt request - * @param hcan: pointer to a CAN_HandleTypeDef structure that contains - * the configuration information for the specified CAN. - * @retval None - */ -void HAL_CAN_IRQHandler(CAN_HandleTypeDef* hcan) -{ - uint32_t tmp1 = 0, tmp2 = 0, tmp3 = 0; - - /* Check End of transmission flag */ - if(__HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_TME)) - { - tmp1 = __HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_0); - tmp2 = __HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_1); - tmp3 = __HAL_CAN_TRANSMIT_STATUS(hcan, CAN_TXMAILBOX_2); - if(tmp1 || tmp2 || tmp3) - { - /* Call transmit function */ - CAN_Transmit_IT(hcan); - } - } - - tmp1 = __HAL_CAN_MSG_PENDING(hcan, CAN_FIFO0); - tmp2 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_FMP0); - /* Check End of reception flag for FIFO0 */ - if((tmp1 != 0) && tmp2) - { - /* Call receive function */ - CAN_Receive_IT(hcan, CAN_FIFO0); - } - - tmp1 = __HAL_CAN_MSG_PENDING(hcan, CAN_FIFO1); - tmp2 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_FMP1); - /* Check End of reception flag for FIFO1 */ - if((tmp1 != 0) && tmp2) - { - /* Call receive function */ - CAN_Receive_IT(hcan, CAN_FIFO1); - } - - tmp1 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_EWG); - tmp2 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_EWG); - tmp3 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_ERR); - /* Check Error Warning Flag */ - if(tmp1 && tmp2 && tmp3) - { - /* Set CAN error code to EWG error */ - hcan->ErrorCode |= HAL_CAN_ERROR_EWG; - /* Clear Error Warning Flag */ - __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_EWG); - } - - tmp1 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_EPV); - tmp2 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_EPV); - tmp3 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_ERR); - /* Check Error Passive Flag */ - if(tmp1 && tmp2 && tmp3) - { - /* Set CAN error code to EPV error */ - hcan->ErrorCode |= HAL_CAN_ERROR_EPV; - /* Clear Error Passive Flag */ - __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_EPV); - } - - tmp1 = __HAL_CAN_GET_FLAG(hcan, CAN_FLAG_BOF); - tmp2 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_BOF); - tmp3 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_ERR); - /* Check Bus-Off Flag */ - if(tmp1 && tmp2 && tmp3) - { - /* Set CAN error code to BOF error */ - hcan->ErrorCode |= HAL_CAN_ERROR_BOF; - /* Clear Bus-Off Flag */ - __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_BOF); - } - - tmp1 = HAL_IS_BIT_CLR(hcan->Instance->ESR, CAN_ESR_LEC); - tmp2 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_LEC); - tmp3 = __HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_ERR); - /* Check Last error code Flag */ - if((!tmp1) && tmp2 && tmp3) - { - tmp1 = (hcan->Instance->ESR) & CAN_ESR_LEC; - switch(tmp1) - { - case(CAN_ESR_LEC_0): - /* Set CAN error code to STF error */ - hcan->ErrorCode |= HAL_CAN_ERROR_STF; - break; - case(CAN_ESR_LEC_1): - /* Set CAN error code to FOR error */ - hcan->ErrorCode |= HAL_CAN_ERROR_FOR; - break; - case(CAN_ESR_LEC_1 | CAN_ESR_LEC_0): - /* Set CAN error code to ACK error */ - hcan->ErrorCode |= HAL_CAN_ERROR_ACK; - break; - case(CAN_ESR_LEC_2): - /* Set CAN error code to BR error */ - hcan->ErrorCode |= HAL_CAN_ERROR_BR; - break; - case(CAN_ESR_LEC_2 | CAN_ESR_LEC_0): - /* Set CAN error code to BD error */ - hcan->ErrorCode |= HAL_CAN_ERROR_BD; - break; - case(CAN_ESR_LEC_2 | CAN_ESR_LEC_1): - /* Set CAN error code to CRC error */ - hcan->ErrorCode |= HAL_CAN_ERROR_CRC; - break; - default: - break; - } - - /* Clear Last error code Flag */ - hcan->Instance->ESR &= ~(CAN_ESR_LEC); - } - - /* Call the Error call Back in case of Errors */ - if(hcan->ErrorCode != HAL_CAN_ERROR_NONE) - { - /* Set the CAN state ready to be able to start again the process */ - hcan->State = HAL_CAN_STATE_READY; - /* Call Error callback function */ - HAL_CAN_ErrorCallback(hcan); - } -} - -/** - * @brief Transmission complete callback in non blocking mode - * @param hcan: pointer to a CAN_HandleTypeDef structure that contains - * the configuration information for the specified CAN. - * @retval None - */ -__weak void HAL_CAN_TxCpltCallback(CAN_HandleTypeDef* hcan) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_CAN_TxCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Transmission complete callback in non blocking mode - * @param hcan: pointer to a CAN_HandleTypeDef structure that contains - * the configuration information for the specified CAN. - * @retval None - */ -__weak void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef* hcan) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_CAN_RxCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Error CAN callback. - * @param hcan: pointer to a CAN_HandleTypeDef structure that contains - * the configuration information for the specified CAN. - * @retval None - */ -__weak void HAL_CAN_ErrorCallback(CAN_HandleTypeDef *hcan) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_CAN_ErrorCallback could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup CAN_Exported_Functions_Group3 Peripheral State and Error functions - * @brief CAN Peripheral State functions - * -@verbatim - ============================================================================== - ##### Peripheral State and Error functions ##### - ============================================================================== - [..] - This subsection provides functions allowing to : - (+) Check the CAN state. - (+) Check CAN Errors detected during interrupt process - -@endverbatim - * @{ - */ - -/** - * @brief return the CAN state - * @param hcan: pointer to a CAN_HandleTypeDef structure that contains - * the configuration information for the specified CAN. - * @retval HAL state - */ -HAL_CAN_StateTypeDef HAL_CAN_GetState(CAN_HandleTypeDef* hcan) -{ - /* Return CAN state */ - return hcan->State; -} - -/** - * @brief Return the CAN error code - * @param hcan: pointer to a CAN_HandleTypeDef structure that contains - * the configuration information for the specified CAN. - * @retval CAN Error Code - */ -uint32_t HAL_CAN_GetError(CAN_HandleTypeDef *hcan) -{ - return hcan->ErrorCode; -} - -/** - * @} - */ -/** - * @brief Initiates and transmits a CAN frame message. - * @param hcan: pointer to a CAN_HandleTypeDef structure that contains - * the configuration information for the specified CAN. - * @retval HAL status - */ -static HAL_StatusTypeDef CAN_Transmit_IT(CAN_HandleTypeDef* hcan) -{ - /* Disable Transmit mailbox empty Interrupt */ - __HAL_CAN_DISABLE_IT(hcan, CAN_IT_TME); - - if(hcan->State == HAL_CAN_STATE_BUSY_TX) - { - /* Disable Error warning Interrupt */ - __HAL_CAN_DISABLE_IT(hcan, CAN_IT_EWG); - - /* Disable Error passive Interrupt */ - __HAL_CAN_DISABLE_IT(hcan, CAN_IT_EPV); - - /* Disable Bus-off Interrupt */ - __HAL_CAN_DISABLE_IT(hcan, CAN_IT_BOF); - - /* Disable Last error code Interrupt */ - __HAL_CAN_DISABLE_IT(hcan, CAN_IT_LEC); - - /* Disable Error Interrupt */ - __HAL_CAN_DISABLE_IT(hcan, CAN_IT_ERR); - } - - if(hcan->State == HAL_CAN_STATE_BUSY_TX_RX) - { - /* Change CAN state */ - hcan->State = HAL_CAN_STATE_BUSY_RX; - } - else - { - /* Change CAN state */ - hcan->State = HAL_CAN_STATE_READY; - } - - /* Transmission complete callback */ - HAL_CAN_TxCpltCallback(hcan); - - return HAL_OK; -} - -/** - * @brief Receives a correct CAN frame. - * @param hcan: Pointer to a CAN_HandleTypeDef structure that contains - * the configuration information for the specified CAN. - * @param FIFONumber: Specify the FIFO number - * @retval HAL status - * @retval None - */ -static HAL_StatusTypeDef CAN_Receive_IT(CAN_HandleTypeDef* hcan, uint8_t FIFONumber) -{ - /* Get the Id */ - hcan->pRxMsg->IDE = (uint8_t)0x04 & hcan->Instance->sFIFOMailBox[FIFONumber].RIR; - if (hcan->pRxMsg->IDE == CAN_ID_STD) - { - hcan->pRxMsg->StdId = (uint32_t)0x000007FF & (hcan->Instance->sFIFOMailBox[FIFONumber].RIR >> 21); - } - else - { - hcan->pRxMsg->ExtId = (uint32_t)0x1FFFFFFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RIR >> 3); - } - - hcan->pRxMsg->RTR = (uint8_t)0x02 & hcan->Instance->sFIFOMailBox[FIFONumber].RIR; - /* Get the DLC */ - hcan->pRxMsg->DLC = (uint8_t)0x0F & hcan->Instance->sFIFOMailBox[FIFONumber].RDTR; - /* Get the FMI */ - hcan->pRxMsg->FMI = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDTR >> 8); - /* Get the data field */ - hcan->pRxMsg->Data[0] = (uint8_t)0xFF & hcan->Instance->sFIFOMailBox[FIFONumber].RDLR; - hcan->pRxMsg->Data[1] = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDLR >> 8); - hcan->pRxMsg->Data[2] = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDLR >> 16); - hcan->pRxMsg->Data[3] = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDLR >> 24); - hcan->pRxMsg->Data[4] = (uint8_t)0xFF & hcan->Instance->sFIFOMailBox[FIFONumber].RDHR; - hcan->pRxMsg->Data[5] = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDHR >> 8); - hcan->pRxMsg->Data[6] = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDHR >> 16); - hcan->pRxMsg->Data[7] = (uint8_t)0xFF & (hcan->Instance->sFIFOMailBox[FIFONumber].RDHR >> 24); - /* Release the FIFO */ - /* Release FIFO0 */ - if (FIFONumber == CAN_FIFO0) - { - __HAL_CAN_FIFO_RELEASE(hcan, CAN_FIFO0); - - /* Disable FIFO 0 message pending Interrupt */ - __HAL_CAN_DISABLE_IT(hcan, CAN_IT_FMP0); - } - /* Release FIFO1 */ - else /* FIFONumber == CAN_FIFO1 */ - { - __HAL_CAN_FIFO_RELEASE(hcan, CAN_FIFO1); - - /* Disable FIFO 1 message pending Interrupt */ - __HAL_CAN_DISABLE_IT(hcan, CAN_IT_FMP1); - } - - if(hcan->State == HAL_CAN_STATE_BUSY_RX) - { - /* Disable Error warning Interrupt */ - __HAL_CAN_DISABLE_IT(hcan, CAN_IT_EWG); - - /* Disable Error passive Interrupt */ - __HAL_CAN_DISABLE_IT(hcan, CAN_IT_EPV); - - /* Disable Bus-off Interrupt */ - __HAL_CAN_DISABLE_IT(hcan, CAN_IT_BOF); - - /* Disable Last error code Interrupt */ - __HAL_CAN_DISABLE_IT(hcan, CAN_IT_LEC); - - /* Disable Error Interrupt */ - __HAL_CAN_DISABLE_IT(hcan, CAN_IT_ERR); - } - - if(hcan->State == HAL_CAN_STATE_BUSY_TX_RX) - { - /* Disable CAN state */ - hcan->State = HAL_CAN_STATE_BUSY_TX; - } - else - { - /* Change CAN state */ - hcan->State = HAL_CAN_STATE_READY; - } - - /* Receive complete callback */ - HAL_CAN_RxCpltCallback(hcan); - - /* Return function status */ - return HAL_OK; -} - -/** - * @} - */ - -#endif /* HAL_CAN_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_crc.c b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_crc.c deleted file mode 100755 index 087080e1..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_crc.c +++ /dev/null @@ -1,342 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_hal_crc.c - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief CRC HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the Cyclic Redundancy Check (CRC) peripheral: - * + Initialization and de-initialization functions - * + Peripheral Control functions - * + Peripheral State functions - * - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - The CRC HAL driver can be used as follows: - - (#) Enable CRC AHB clock using __HAL_RCC_CRC_CLK_ENABLE(); - - (#) Use HAL_CRC_Accumulate() function to compute the CRC value of - a 32-bit data buffer using combination of the previous CRC value - and the new one. - - (#) Use HAL_CRC_Calculate() function to compute the CRC Value of - a new 32-bit data buffer. This function resets the CRC computation - unit before starting the computation to avoid getting wrong CRC values. - - @endverbatim - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal.h" - -/** @addtogroup STM32F2xx_HAL_Driver - * @{ - */ - -/** @addtogroup CRC - * @{ - */ - -#ifdef HAL_CRC_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ - -/** @addtogroup CRC_Exported_Functions - * @{ - */ - -/** @addtogroup CRC_Exported_Functions_Group1 - * @brief Initialization and de-initialization functions - * -@verbatim - ============================================================================== - ##### Initialization and de-initialization functions ##### - ============================================================================== - [..] This section provides functions allowing to: - (+) Initialize the CRC according to the specified parameters - in the CRC_InitTypeDef and create the associated handle - (+) DeInitialize the CRC peripheral - (+) Initialize the CRC MSP - (+) DeInitialize CRC MSP - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the CRC according to the specified - * parameters in the CRC_InitTypeDef and creates the associated handle. - * @param hcrc: pointer to a CRC_HandleTypeDef structure that contains - * the configuration information for CRC - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CRC_Init(CRC_HandleTypeDef *hcrc) -{ - /* Check the CRC handle allocation */ - if(hcrc == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_CRC_ALL_INSTANCE(hcrc->Instance)); - - if(hcrc->State == HAL_CRC_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - hcrc->Lock = HAL_UNLOCKED; - /* Init the low level hardware */ - HAL_CRC_MspInit(hcrc); - } - - /* Change CRC peripheral state */ - hcrc->State = HAL_CRC_STATE_BUSY; - - /* Change CRC peripheral state */ - hcrc->State = HAL_CRC_STATE_READY; - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief DeInitializes the CRC peripheral. - * @param hcrc: pointer to a CRC_HandleTypeDef structure that contains - * the configuration information for CRC - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CRC_DeInit(CRC_HandleTypeDef *hcrc) -{ - /* Check the CRC handle allocation */ - if(hcrc == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_CRC_ALL_INSTANCE(hcrc->Instance)); - - /* Change CRC peripheral state */ - hcrc->State = HAL_CRC_STATE_BUSY; - - /* DeInit the low level hardware */ - HAL_CRC_MspDeInit(hcrc); - - /* Change CRC peripheral state */ - hcrc->State = HAL_CRC_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(hcrc); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Initializes the CRC MSP. - * @param hcrc: pointer to a CRC_HandleTypeDef structure that contains - * the configuration information for CRC - * @retval None - */ -__weak void HAL_CRC_MspInit(CRC_HandleTypeDef *hcrc) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_CRC_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes the CRC MSP. - * @param hcrc: pointer to a CRC_HandleTypeDef structure that contains - * the configuration information for CRC - * @retval None - */ -__weak void HAL_CRC_MspDeInit(CRC_HandleTypeDef *hcrc) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_CRC_MspDeInit could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @addtogroup CRC_Exported_Functions_Group2 - * @brief Peripheral Control functions - * -@verbatim - ============================================================================== - ##### Peripheral Control functions ##### - ============================================================================== - [..] This section provides functions allowing to: - (+) Compute the 32-bit CRC value of 32-bit data buffer, - using combination of the previous CRC value and the new one. - (+) Compute the 32-bit CRC value of 32-bit data buffer, - independently of the previous CRC value. - -@endverbatim - * @{ - */ - -/** - * @brief Computes the 32-bit CRC of 32-bit data buffer using combination - * of the previous CRC value and the new one. - * @param hcrc: pointer to a CRC_HandleTypeDef structure that contains - * the configuration information for CRC - * @param pBuffer: pointer to the buffer containing the data to be computed - * @param BufferLength: length of the buffer to be computed - * @retval 32-bit CRC - */ -uint32_t HAL_CRC_Accumulate(CRC_HandleTypeDef *hcrc, uint32_t pBuffer[], uint32_t BufferLength) -{ - uint32_t index = 0; - - /* Process Locked */ - __HAL_LOCK(hcrc); - - /* Change CRC peripheral state */ - hcrc->State = HAL_CRC_STATE_BUSY; - - /* Enter Data to the CRC calculator */ - for(index = 0; index < BufferLength; index++) - { - hcrc->Instance->DR = pBuffer[index]; - } - - /* Change CRC peripheral state */ - hcrc->State = HAL_CRC_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hcrc); - - /* Return the CRC computed value */ - return hcrc->Instance->DR; -} - -/** - * @brief Computes the 32-bit CRC of 32-bit data buffer independently - * of the previous CRC value. - * @param hcrc: pointer to a CRC_HandleTypeDef structure that contains - * the configuration information for CRC - * @param pBuffer: Pointer to the buffer containing the data to be computed - * @param BufferLength: Length of the buffer to be computed - * @retval 32-bit CRC - */ -uint32_t HAL_CRC_Calculate(CRC_HandleTypeDef *hcrc, uint32_t pBuffer[], uint32_t BufferLength) -{ - uint32_t index = 0; - - /* Process Locked */ - __HAL_LOCK(hcrc); - - /* Change CRC peripheral state */ - hcrc->State = HAL_CRC_STATE_BUSY; - - /* Reset CRC Calculation Unit */ - __HAL_CRC_DR_RESET(hcrc); - - /* Enter Data to the CRC calculator */ - for(index = 0; index < BufferLength; index++) - { - hcrc->Instance->DR = pBuffer[index]; - } - - /* Change CRC peripheral state */ - hcrc->State = HAL_CRC_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hcrc); - - /* Return the CRC computed value */ - return hcrc->Instance->DR; -} - -/** - * @} - */ - - -/** @addtogroup CRC_Exported_Functions_Group3 - * @brief Peripheral State functions - * -@verbatim - ============================================================================== - ##### Peripheral State functions ##### - ============================================================================== - [..] - This subsection permits to get in run-time the status of the peripheral - and the data flow. - -@endverbatim - * @{ - */ - -/** - * @brief Returns the CRC state. - * @param hcrc: pointer to a CRC_HandleTypeDef structure that contains - * the configuration information for CRC - * @retval HAL state - */ -HAL_CRC_StateTypeDef HAL_CRC_GetState(CRC_HandleTypeDef *hcrc) -{ - return hcrc->State; -} - -/** - * @} - */ - -/** - * @} - */ - -#endif /* HAL_CRC_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_cryp.c b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_cryp.c deleted file mode 100755 index b4957729..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_cryp.c +++ /dev/null @@ -1,3812 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_hal_cryp.c - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief CRYP HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the Cryptography (CRYP) peripheral: - * + Initialization and de-initialization functions - * + AES processing functions - * + DES processing functions - * + TDES processing functions - * + DMA callback functions - * + CRYP IRQ handler management - * + Peripheral State functions - * - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - The CRYP HAL driver can be used as follows: - - (#)Initialize the CRYP low level resources by implementing the HAL_CRYP_MspInit(): - (##) Enable the CRYP interface clock using __HAL_RCC_CRYP_CLK_ENABLE() - (##) In case of using interrupts (e.g. HAL_CRYP_AESECB_Encrypt_IT()) - (+++) Configure the CRYP interrupt priority using HAL_NVIC_SetPriority() - (+++) Enable the CRYP IRQ handler using HAL_NVIC_EnableIRQ() - (+++) In CRYP IRQ handler, call HAL_CRYP_IRQHandler() - (##) In case of using DMA to control data transfer (e.g. HAL_CRYP_AESECB_Encrypt_DMA()) - (+++) Enable the DMAx interface clock using __DMAx_CLK_ENABLE() - (+++) Configure and enable two DMA streams one for managing data transfer from - memory to peripheral (input stream) and another stream for managing data - transfer from peripheral to memory (output stream) - (+++) Associate the initialized DMA handle to the CRYP DMA handle - using __HAL_LINKDMA() - (+++) Configure the priority and enable the NVIC for the transfer complete - interrupt on the two DMA Streams. The output stream should have higher - priority than the input stream HAL_NVIC_SetPriority() and HAL_NVIC_EnableIRQ() - - (#)Initialize the CRYP HAL using HAL_CRYP_Init(). This function configures mainly: - (##) The data type: 1-bit, 8-bit, 16-bit and 32-bit - (##) The key size: 128, 192 and 256. This parameter is relevant only for AES - (##) The encryption/decryption key. It's size depends on the algorithm - used for encryption/decryption - (##) The initialization vector (counter). It is not used ECB mode. - - (#)Three processing (encryption/decryption) functions are available: - (##) Polling mode: encryption and decryption APIs are blocking functions - i.e. they process the data and wait till the processing is finished, - e.g. HAL_CRYP_AESCBC_Encrypt() - (##) Interrupt mode: encryption and decryption APIs are not blocking functions - i.e. they process the data under interrupt, - e.g. HAL_CRYP_AESCBC_Encrypt_IT() - (##) DMA mode: encryption and decryption APIs are not blocking functions - i.e. the data transfer is ensured by DMA, - e.g. HAL_CRYP_AESCBC_Encrypt_DMA() - - (#)When the processing function is called at first time after HAL_CRYP_Init() - the CRYP peripheral is initialized and processes the buffer in input. - At second call, the processing function performs an append of the already - processed buffer. - When a new data block is to be processed, call HAL_CRYP_Init() then the - processing function. - - (#)Call HAL_CRYP_DeInit() to deinitialize the CRYP peripheral. - - @endverbatim - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal.h" - -/** @addtogroup STM32F2xx_HAL_Driver - * @{ - */ - -/** @defgroup CRYP CRYP - * @brief CRYP HAL module driver. - * @{ - */ - -#ifdef HAL_CRYP_MODULE_ENABLED - -#if defined(STM32F215xx) || defined(STM32F217xx) - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @defgroup CRYP_Private_define CRYP Private define - * @{ - */ -#define CRYP_TIMEOUT_VALUE 1 -/** - * @} - */ - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/** @defgroup CRYP_Private_Functions_prototypes CRYP Private Functions prototypes - * @{ - */ -static void CRYP_SetInitVector(CRYP_HandleTypeDef *hcryp, uint8_t *InitVector, uint32_t IVSize); -static void CRYP_SetKey(CRYP_HandleTypeDef *hcryp, uint8_t *Key, uint32_t KeySize); -static HAL_StatusTypeDef CRYP_ProcessData(CRYP_HandleTypeDef *hcryp, uint8_t* Input, uint16_t Ilength, uint8_t* Output, uint32_t Timeout); -static HAL_StatusTypeDef CRYP_ProcessData2Words(CRYP_HandleTypeDef *hcryp, uint8_t* Input, uint16_t Ilength, uint8_t* Output, uint32_t Timeout); -static void CRYP_DMAInCplt(DMA_HandleTypeDef *hdma); -static void CRYP_DMAOutCplt(DMA_HandleTypeDef *hdma); -static void CRYP_DMAError(DMA_HandleTypeDef *hdma); -static void CRYP_SetDMAConfig(CRYP_HandleTypeDef *hcryp, uint32_t inputaddr, uint16_t Size, uint32_t outputaddr); -static void CRYP_SetTDESECBMode(CRYP_HandleTypeDef *hcryp, uint32_t Direction); -static void CRYP_SetTDESCBCMode(CRYP_HandleTypeDef *hcryp, uint32_t Direction); -static void CRYP_SetDESECBMode(CRYP_HandleTypeDef *hcryp, uint32_t Direction); -static void CRYP_SetDESCBCMode(CRYP_HandleTypeDef *hcryp, uint32_t Direction); -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ - -/** @addtogroup CRYP_Private_Functions - * @{ - */ - - -/** - * @brief DMA CRYP Input Data process complete callback. - * @param hdma: DMA handle - * @retval None - */ -static void CRYP_DMAInCplt(DMA_HandleTypeDef *hdma) -{ - CRYP_HandleTypeDef* hcryp = (CRYP_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent; - - /* Disable the DMA transfer for input FIFO request by resetting the DIEN bit - in the DMACR register */ - hcryp->Instance->DMACR &= (uint32_t)(~CRYP_DMACR_DIEN); - - /* Call input data transfer complete callback */ - HAL_CRYP_InCpltCallback(hcryp); -} - -/** - * @brief DMA CRYP Output Data process complete callback. - * @param hdma: DMA handle - * @retval None - */ -static void CRYP_DMAOutCplt(DMA_HandleTypeDef *hdma) -{ - CRYP_HandleTypeDef* hcryp = (CRYP_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent; - - /* Disable the DMA transfer for output FIFO request by resetting the DOEN bit - in the DMACR register */ - hcryp->Instance->DMACR &= (uint32_t)(~CRYP_DMACR_DOEN); - - /* Disable CRYP */ - __HAL_CRYP_DISABLE(hcryp); - - /* Change the CRYP state to ready */ - hcryp->State = HAL_CRYP_STATE_READY; - - /* Call output data transfer complete callback */ - HAL_CRYP_OutCpltCallback(hcryp); -} - -/** - * @brief DMA CRYP communication error callback. - * @param hdma: DMA handle - * @retval None - */ -static void CRYP_DMAError(DMA_HandleTypeDef *hdma) -{ - CRYP_HandleTypeDef* hcryp = (CRYP_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent; - hcryp->State= HAL_CRYP_STATE_READY; - HAL_CRYP_ErrorCallback(hcryp); -} - -/** - * @brief Writes the Key in Key registers. - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param Key: Pointer to Key buffer - * @param KeySize: Size of Key - * @retval None - */ -static void CRYP_SetKey(CRYP_HandleTypeDef *hcryp, uint8_t *Key, uint32_t KeySize) -{ - uint32_t keyaddr = (uint32_t)Key; - - switch(KeySize) - { - case CRYP_KEYSIZE_256B: - /* Key Initialisation */ - hcryp->Instance->K0LR = __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; - hcryp->Instance->K0RR = __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; - hcryp->Instance->K1LR = __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; - hcryp->Instance->K1RR = __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; - hcryp->Instance->K2LR = __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; - hcryp->Instance->K2RR = __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; - hcryp->Instance->K3LR = __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; - hcryp->Instance->K3RR = __REV(*(uint32_t*)(keyaddr)); - break; - case CRYP_KEYSIZE_192B: - hcryp->Instance->K1LR = __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; - hcryp->Instance->K1RR = __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; - hcryp->Instance->K2LR = __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; - hcryp->Instance->K2RR = __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; - hcryp->Instance->K3LR = __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; - hcryp->Instance->K3RR = __REV(*(uint32_t*)(keyaddr)); - break; - case CRYP_KEYSIZE_128B: - hcryp->Instance->K2LR = __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; - hcryp->Instance->K2RR = __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; - hcryp->Instance->K3LR = __REV(*(uint32_t*)(keyaddr)); - keyaddr+=4; - hcryp->Instance->K3RR = __REV(*(uint32_t*)(keyaddr)); - break; - default: - break; - } -} - -/** - * @brief Writes the InitVector/InitCounter in IV registers. - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param InitVector: Pointer to InitVector/InitCounter buffer - * @param IVSize: Size of the InitVector/InitCounter - * @retval None - */ -static void CRYP_SetInitVector(CRYP_HandleTypeDef *hcryp, uint8_t *InitVector, uint32_t IVSize) -{ - uint32_t ivaddr = (uint32_t)InitVector; - - switch(IVSize) - { - case CRYP_KEYSIZE_128B: - hcryp->Instance->IV0LR = __REV(*(uint32_t*)(ivaddr)); - ivaddr+=4; - hcryp->Instance->IV0RR = __REV(*(uint32_t*)(ivaddr)); - ivaddr+=4; - hcryp->Instance->IV1LR = __REV(*(uint32_t*)(ivaddr)); - ivaddr+=4; - hcryp->Instance->IV1RR = __REV(*(uint32_t*)(ivaddr)); - break; - /* Whatever key size 192 or 256, Init vector is written in IV0LR and IV0RR */ - case CRYP_KEYSIZE_192B: - hcryp->Instance->IV0LR = __REV(*(uint32_t*)(ivaddr)); - ivaddr+=4; - hcryp->Instance->IV0RR = __REV(*(uint32_t*)(ivaddr)); - break; - case CRYP_KEYSIZE_256B: - hcryp->Instance->IV0LR = __REV(*(uint32_t*)(ivaddr)); - ivaddr+=4; - hcryp->Instance->IV0RR = __REV(*(uint32_t*)(ivaddr)); - break; - default: - break; - } -} - -/** - * @brief Process Data: Writes Input data in polling mode and read the output data - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param Input: Pointer to the Input buffer - * @param Ilength: Length of the Input buffer, must be a multiple of 16. - * @param Output: Pointer to the returned buffer - * @param Timeout: Timeout value - * * @retval None - */ -static HAL_StatusTypeDef CRYP_ProcessData(CRYP_HandleTypeDef *hcryp, uint8_t* Input, uint16_t Ilength, uint8_t* Output, uint32_t Timeout) -{ - uint32_t tickstart = 0; - - uint32_t i = 0; - uint32_t inputaddr = (uint32_t)Input; - uint32_t outputaddr = (uint32_t)Output; - - for(i=0; (i < Ilength); i+=16) - { - /* Write the Input block in the IN FIFO */ - hcryp->Instance->DR = *(uint32_t*)(inputaddr); - inputaddr+=4; - hcryp->Instance->DR = *(uint32_t*)(inputaddr); - inputaddr+=4; - hcryp->Instance->DR = *(uint32_t*)(inputaddr); - inputaddr+=4; - hcryp->Instance->DR = *(uint32_t*)(inputaddr); - inputaddr+=4; - - /* Get tick */ - tickstart = HAL_GetTick(); - - while(HAL_IS_BIT_CLR(hcryp->Instance->SR, CRYP_FLAG_OFNE)) - { - /* Check for the Timeout */ - if(Timeout != HAL_MAX_DELAY) - { - if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout)) - { - /* Change state */ - hcryp->State = HAL_CRYP_STATE_TIMEOUT; - - /* Process Unlocked */ - __HAL_UNLOCK(hcryp); - - return HAL_TIMEOUT; - } - } - } - /* Read the Output block from the Output FIFO */ - *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT; - outputaddr+=4; - *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT; - outputaddr+=4; - *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT; - outputaddr+=4; - *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT; - outputaddr+=4; - } - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Process Data: Write Input data in polling mode. - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param Input: Pointer to the Input buffer - * @param Ilength: Length of the Input buffer, must be a multiple of 8 - * @param Output: Pointer to the returned buffer - * @param Timeout: Specify Timeout value - * @retval None - */ -static HAL_StatusTypeDef CRYP_ProcessData2Words(CRYP_HandleTypeDef *hcryp, uint8_t* Input, uint16_t Ilength, uint8_t* Output, uint32_t Timeout) -{ - uint32_t tickstart = 0; - - uint32_t i = 0; - uint32_t inputaddr = (uint32_t)Input; - uint32_t outputaddr = (uint32_t)Output; - - for(i=0; (i < Ilength); i+=8) - { - /* Write the Input block in the IN FIFO */ - hcryp->Instance->DR = *(uint32_t*)(inputaddr); - inputaddr+=4; - hcryp->Instance->DR = *(uint32_t*)(inputaddr); - inputaddr+=4; - - /* Get tick */ - tickstart = HAL_GetTick(); - - while(HAL_IS_BIT_CLR(hcryp->Instance->SR, CRYP_FLAG_OFNE)) - { - /* Check for the Timeout */ - if(Timeout != HAL_MAX_DELAY) - { - if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout)) - { - /* Change state */ - hcryp->State = HAL_CRYP_STATE_TIMEOUT; - - /* Process Unlocked */ - __HAL_UNLOCK(hcryp); - - return HAL_TIMEOUT; - } - } - } - /* Read the Output block from the Output FIFO */ - *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT; - outputaddr+=4; - *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT; - outputaddr+=4; - } - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Set the DMA configuration and start the DMA transfer - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param inputaddr: address of the Input buffer - * @param Size: Size of the Input buffer, must be a multiple of 16. - * @param outputaddr: address of the Output buffer - * @retval None - */ -static void CRYP_SetDMAConfig(CRYP_HandleTypeDef *hcryp, uint32_t inputaddr, uint16_t Size, uint32_t outputaddr) -{ - /* Set the CRYP DMA transfer complete callback */ - hcryp->hdmain->XferCpltCallback = CRYP_DMAInCplt; - /* Set the DMA error callback */ - hcryp->hdmain->XferErrorCallback = CRYP_DMAError; - - /* Set the CRYP DMA transfer complete callback */ - hcryp->hdmaout->XferCpltCallback = CRYP_DMAOutCplt; - /* Set the DMA error callback */ - hcryp->hdmaout->XferErrorCallback = CRYP_DMAError; - - /* Enable CRYP */ - __HAL_CRYP_ENABLE(hcryp); - - /* Enable the DMA In DMA Stream */ - HAL_DMA_Start_IT(hcryp->hdmain, inputaddr, (uint32_t)&hcryp->Instance->DR, Size/4); - - /* Enable In DMA request */ - hcryp->Instance->DMACR = (CRYP_DMACR_DIEN); - - /* Enable the DMA Out DMA Stream */ - HAL_DMA_Start_IT(hcryp->hdmaout, (uint32_t)&hcryp->Instance->DOUT, outputaddr, Size/4); - - /* Enable Out DMA request */ - hcryp->Instance->DMACR |= CRYP_DMACR_DOEN; - -} - -/** - * @brief Sets the CRYP peripheral in DES ECB mode. - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param Direction: Encryption or decryption - * @retval None - */ -static void CRYP_SetDESECBMode(CRYP_HandleTypeDef *hcryp, uint32_t Direction) -{ - /* Check if initialization phase has already been performed */ - if(hcryp->Phase == HAL_CRYP_PHASE_READY) - { - /* Set the CRYP peripheral in AES ECB mode */ - __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_DES_ECB | Direction); - - /* Set the key */ - hcryp->Instance->K1LR = __REV(*(uint32_t*)(hcryp->Init.pKey)); - hcryp->Instance->K1RR = __REV(*(uint32_t*)(hcryp->Init.pKey+4)); - - /* Flush FIFO */ - __HAL_CRYP_FIFO_FLUSH(hcryp); - - /* Set the phase */ - hcryp->Phase = HAL_CRYP_PHASE_PROCESS; - } -} - -/** - * @brief Sets the CRYP peripheral in DES CBC mode. - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param Direction: Encryption or decryption - * @retval None - */ -static void CRYP_SetDESCBCMode(CRYP_HandleTypeDef *hcryp, uint32_t Direction) -{ - /* Check if initialization phase has already been performed */ - if(hcryp->Phase == HAL_CRYP_PHASE_READY) - { - /* Set the CRYP peripheral in AES ECB mode */ - __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_DES_CBC | Direction); - - /* Set the key */ - hcryp->Instance->K1LR = __REV(*(uint32_t*)(hcryp->Init.pKey)); - hcryp->Instance->K1RR = __REV(*(uint32_t*)(hcryp->Init.pKey+4)); - - /* Set the Initialization Vector */ - CRYP_SetInitVector(hcryp, hcryp->Init.pInitVect, CRYP_KEYSIZE_256B); - - /* Flush FIFO */ - __HAL_CRYP_FIFO_FLUSH(hcryp); - - /* Set the phase */ - hcryp->Phase = HAL_CRYP_PHASE_PROCESS; - } -} - -/** - * @brief Sets the CRYP peripheral in TDES ECB mode. - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param Direction: Encryption or decryption - * @retval None - */ -static void CRYP_SetTDESECBMode(CRYP_HandleTypeDef *hcryp, uint32_t Direction) -{ - /* Check if initialization phase has already been performed */ - if(hcryp->Phase == HAL_CRYP_PHASE_READY) - { - /* Set the CRYP peripheral in AES ECB mode */ - __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_TDES_ECB | Direction); - - /* Set the key */ - CRYP_SetKey(hcryp, hcryp->Init.pKey, CRYP_KEYSIZE_192B); - - /* Flush FIFO */ - __HAL_CRYP_FIFO_FLUSH(hcryp); - - /* Set the phase */ - hcryp->Phase = HAL_CRYP_PHASE_PROCESS; - } -} - -/** - * @brief Sets the CRYP peripheral in TDES CBC mode - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param Direction: Encryption or decryption - * @retval None - */ -static void CRYP_SetTDESCBCMode(CRYP_HandleTypeDef *hcryp, uint32_t Direction) -{ - /* Check if initialization phase has already been performed */ - if(hcryp->Phase == HAL_CRYP_PHASE_READY) - { - /* Set the CRYP peripheral in AES CBC mode */ - __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_TDES_CBC | Direction); - - /* Set the key */ - CRYP_SetKey(hcryp, hcryp->Init.pKey, CRYP_KEYSIZE_192B); - - /* Set the Initialization Vector */ - CRYP_SetInitVector(hcryp, hcryp->Init.pInitVect, CRYP_KEYSIZE_256B); - - /* Flush FIFO */ - __HAL_CRYP_FIFO_FLUSH(hcryp); - - /* Set the phase */ - hcryp->Phase = HAL_CRYP_PHASE_PROCESS; - } -} - -/** - * @} - */ - - /* Exported functions --------------------------------------------------------*/ -/** @addtogroup CRYP_Exported_Functions - * @{ - */ - -/** @defgroup CRYP_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions. - * -@verbatim - ============================================================================== - ##### Initialization and de-initialization functions ##### - ============================================================================== - [..] This section provides functions allowing to: - (+) Initialize the CRYP according to the specified parameters - in the CRYP_InitTypeDef and creates the associated handle - (+) DeInitialize the CRYP peripheral - (+) Initialize the CRYP MSP - (+) DeInitialize CRYP MSP - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the CRYP according to the specified - * parameters in the CRYP_InitTypeDef and creates the associated handle. - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CRYP_Init(CRYP_HandleTypeDef *hcryp) -{ - /* Check the CRYP handle allocation */ - if(hcryp == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_CRYP_KEYSIZE(hcryp->Init.KeySize)); - assert_param(IS_CRYP_DATATYPE(hcryp->Init.DataType)); - - if(hcryp->State == HAL_CRYP_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - hcryp->Lock = HAL_UNLOCKED; - /* Init the low level hardware */ - HAL_CRYP_MspInit(hcryp); - } - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_BUSY; - - /* Set the key size and data type*/ - CRYP->CR = (uint32_t) (hcryp->Init.KeySize | hcryp->Init.DataType); - - /* Reset CrypInCount and CrypOutCount */ - hcryp->CrypInCount = 0; - hcryp->CrypOutCount = 0; - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_READY; - - /* Set the default CRYP phase */ - hcryp->Phase = HAL_CRYP_PHASE_READY; - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief DeInitializes the CRYP peripheral. - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CRYP_DeInit(CRYP_HandleTypeDef *hcryp) -{ - /* Check the CRYP handle allocation */ - if(hcryp == NULL) - { - return HAL_ERROR; - } - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_BUSY; - - /* Set the default CRYP phase */ - hcryp->Phase = HAL_CRYP_PHASE_READY; - - /* Reset CrypInCount and CrypOutCount */ - hcryp->CrypInCount = 0; - hcryp->CrypOutCount = 0; - - /* Disable the CRYP Peripheral Clock */ - __HAL_CRYP_DISABLE(hcryp); - - /* DeInit the low level hardware: CLOCK, NVIC.*/ - HAL_CRYP_MspDeInit(hcryp); - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(hcryp); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Initializes the CRYP MSP. - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @retval None - */ -__weak void HAL_CRYP_MspInit(CRYP_HandleTypeDef *hcryp) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_CRYP_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes CRYP MSP. - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @retval None - */ -__weak void HAL_CRYP_MspDeInit(CRYP_HandleTypeDef *hcryp) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_CRYP_MspDeInit could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup CRYP_Exported_Functions_Group2 AES processing functions - * @brief processing functions. - * -@verbatim - ============================================================================== - ##### AES processing functions ##### - ============================================================================== - [..] This section provides functions allowing to: - (+) Encrypt plaintext using AES-128/192/256 using chaining modes - (+) Decrypt cyphertext using AES-128/192/256 using chaining modes - [..] Three processing functions are available: - (+) Polling mode - (+) Interrupt mode - (+) DMA mode - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the CRYP peripheral in AES ECB encryption mode - * then encrypt pPlainData. The cypher data are available in pCypherData - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param pPlainData: Pointer to the plaintext buffer - * @param Size: Length of the plaintext buffer, must be a multiple of 16. - * @param pCypherData: Pointer to the cyphertext buffer - * @param Timeout: Specify Timeout value - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CRYP_AESECB_Encrypt(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData, uint32_t Timeout) -{ - /* Process Locked */ - __HAL_LOCK(hcryp); - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_BUSY; - - /* Check if initialization phase has already been performed */ - if(hcryp->Phase == HAL_CRYP_PHASE_READY) - { - /* Set the key */ - CRYP_SetKey(hcryp, hcryp->Init.pKey, hcryp->Init.KeySize); - - /* Set the CRYP peripheral in AES ECB mode */ - __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_AES_ECB); - - /* Flush FIFO */ - __HAL_CRYP_FIFO_FLUSH(hcryp); - - /* Enable CRYP */ - __HAL_CRYP_ENABLE(hcryp); - - /* Set the phase */ - hcryp->Phase = HAL_CRYP_PHASE_PROCESS; - } - - /* Write Plain Data and Get Cypher Data */ - if(CRYP_ProcessData(hcryp, pPlainData, Size, pCypherData, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hcryp); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Initializes the CRYP peripheral in AES CBC encryption mode - * then encrypt pPlainData. The cypher data are available in pCypherData - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param pPlainData: Pointer to the plaintext buffer - * @param Size: Length of the plaintext buffer, must be a multiple of 16. - * @param pCypherData: Pointer to the cyphertext buffer - * @param Timeout: Specify Timeout value - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CRYP_AESCBC_Encrypt(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData, uint32_t Timeout) -{ - /* Process Locked */ - __HAL_LOCK(hcryp); - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_BUSY; - - /* Check if initialization phase has already been performed */ - if(hcryp->Phase == HAL_CRYP_PHASE_READY) - { - /* Set the key */ - CRYP_SetKey(hcryp, hcryp->Init.pKey, hcryp->Init.KeySize); - - /* Set the CRYP peripheral in AES ECB mode */ - __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_AES_CBC); - - /* Set the Initialization Vector */ - CRYP_SetInitVector(hcryp, hcryp->Init.pInitVect, CRYP_KEYSIZE_128B); - - /* Flush FIFO */ - __HAL_CRYP_FIFO_FLUSH(hcryp); - - /* Enable CRYP */ - __HAL_CRYP_ENABLE(hcryp); - - /* Set the phase */ - hcryp->Phase = HAL_CRYP_PHASE_PROCESS; - } - - /* Write Plain Data and Get Cypher Data */ - if(CRYP_ProcessData(hcryp,pPlainData, Size, pCypherData, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hcryp); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Initializes the CRYP peripheral in AES CTR encryption mode - * then encrypt pPlainData. The cypher data are available in pCypherData - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param pPlainData: Pointer to the plaintext buffer - * @param Size: Length of the plaintext buffer, must be a multiple of 16. - * @param pCypherData: Pointer to the cyphertext buffer - * @param Timeout: Specify Timeout value - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CRYP_AESCTR_Encrypt(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData, uint32_t Timeout) -{ - /* Process Locked */ - __HAL_LOCK(hcryp); - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_BUSY; - - /* Check if initialization phase has already been performed */ - if(hcryp->Phase == HAL_CRYP_PHASE_READY) - { - /* Set the key */ - CRYP_SetKey(hcryp, hcryp->Init.pKey, hcryp->Init.KeySize); - - /* Set the CRYP peripheral in AES ECB mode */ - __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_AES_CTR); - - /* Set the Initialization Vector */ - CRYP_SetInitVector(hcryp, hcryp->Init.pInitVect, CRYP_KEYSIZE_128B); - - /* Flush FIFO */ - __HAL_CRYP_FIFO_FLUSH(hcryp); - - /* Enable CRYP */ - __HAL_CRYP_ENABLE(hcryp); - - /* Set the phase */ - hcryp->Phase = HAL_CRYP_PHASE_PROCESS; - } - - /* Write Plain Data and Get Cypher Data */ - if(CRYP_ProcessData(hcryp, pPlainData, Size, pCypherData, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hcryp); - - /* Return function status */ - return HAL_OK; -} - - - -/** - * @brief Initializes the CRYP peripheral in AES ECB decryption mode - * then decrypted pCypherData. The cypher data are available in pPlainData - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param pCypherData: Pointer to the cyphertext buffer - * @param Size: Length of the plaintext buffer, must be a multiple of 16. - * @param pPlainData: Pointer to the plaintext buffer - * @param Timeout: Specify Timeout value - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CRYP_AESECB_Decrypt(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData, uint32_t Timeout) -{ - uint32_t tickstart = 0; - - /* Process Locked */ - __HAL_LOCK(hcryp); - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_BUSY; - - /* Check if initialization phase has already been performed */ - if(hcryp->Phase == HAL_CRYP_PHASE_READY) - { - /* Set the key */ - CRYP_SetKey(hcryp, hcryp->Init.pKey, hcryp->Init.KeySize); - - /* Set the CRYP peripheral in AES Key mode */ - __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_AES_KEY | CRYP_CR_ALGODIR); - - /* Enable CRYP */ - __HAL_CRYP_ENABLE(hcryp); - - /* Get tick */ - tickstart = HAL_GetTick(); - - while(HAL_IS_BIT_SET(hcryp->Instance->SR, CRYP_FLAG_BUSY)) - { - /* Check for the Timeout */ - if(Timeout != HAL_MAX_DELAY) - { - if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout)) - { - /* Change state */ - hcryp->State = HAL_CRYP_STATE_TIMEOUT; - - /* Process Unlocked */ - __HAL_UNLOCK(hcryp); - - return HAL_TIMEOUT; - } - } - } - - /* Disable CRYP */ - __HAL_CRYP_DISABLE(hcryp); - - /* Reset the ALGOMODE bits*/ - CRYP->CR &= (uint32_t)(~CRYP_CR_ALGOMODE); - - /* Set the CRYP peripheral in AES ECB decryption mode */ - __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_AES_ECB | CRYP_CR_ALGODIR); - /* Flush FIFO */ - __HAL_CRYP_FIFO_FLUSH(hcryp); - - /* Enable CRYP */ - __HAL_CRYP_ENABLE(hcryp); - - /* Set the phase */ - hcryp->Phase = HAL_CRYP_PHASE_PROCESS; - } - - /* Write Plain Data and Get Cypher Data */ - if(CRYP_ProcessData(hcryp, pCypherData, Size, pPlainData, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hcryp); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Initializes the CRYP peripheral in AES ECB decryption mode - * then decrypted pCypherData. The cypher data are available in pPlainData - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param pCypherData: Pointer to the cyphertext buffer - * @param Size: Length of the plaintext buffer, must be a multiple of 16. - * @param pPlainData: Pointer to the plaintext buffer - * @param Timeout: Specify Timeout value - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CRYP_AESCBC_Decrypt(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData, uint32_t Timeout) -{ - uint32_t tickstart = 0; - - /* Process Locked */ - __HAL_LOCK(hcryp); - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_BUSY; - - /* Check if initialization phase has already been performed */ - if(hcryp->Phase == HAL_CRYP_PHASE_READY) - { - /* Set the key */ - CRYP_SetKey(hcryp, hcryp->Init.pKey, hcryp->Init.KeySize); - - /* Set the CRYP peripheral in AES Key mode */ - __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_AES_KEY | CRYP_CR_ALGODIR); - - /* Enable CRYP */ - __HAL_CRYP_ENABLE(hcryp); - - /* Get tick */ - tickstart = HAL_GetTick(); - - while(HAL_IS_BIT_SET(hcryp->Instance->SR, CRYP_FLAG_BUSY)) - { - /* Check for the Timeout */ - if(Timeout != HAL_MAX_DELAY) - { - if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout)) - { - /* Change state */ - hcryp->State = HAL_CRYP_STATE_TIMEOUT; - - /* Process Unlocked */ - __HAL_UNLOCK(hcryp); - - return HAL_TIMEOUT; - } - } - } - - /* Reset the ALGOMODE bits*/ - CRYP->CR &= (uint32_t)(~CRYP_CR_ALGOMODE); - - /* Set the CRYP peripheral in AES CBC decryption mode */ - __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_AES_CBC | CRYP_CR_ALGODIR); - - /* Set the Initialization Vector */ - CRYP_SetInitVector(hcryp, hcryp->Init.pInitVect, CRYP_KEYSIZE_128B); - - /* Flush FIFO */ - __HAL_CRYP_FIFO_FLUSH(hcryp); - - /* Enable CRYP */ - __HAL_CRYP_ENABLE(hcryp); - - /* Set the phase */ - hcryp->Phase = HAL_CRYP_PHASE_PROCESS; - } - - /* Write Plain Data and Get Cypher Data */ - if(CRYP_ProcessData(hcryp, pCypherData, Size, pPlainData, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hcryp); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Initializes the CRYP peripheral in AES CTR decryption mode - * then decrypted pCypherData. The cypher data are available in pPlainData - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param pCypherData: Pointer to the cyphertext buffer - * @param Size: Length of the plaintext buffer, must be a multiple of 16. - * @param pPlainData: Pointer to the plaintext buffer - * @param Timeout: Specify Timeout value - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CRYP_AESCTR_Decrypt(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData, uint32_t Timeout) -{ - /* Process Locked */ - __HAL_LOCK(hcryp); - - /* Check if initialization phase has already been performed */ - if(hcryp->Phase == HAL_CRYP_PHASE_READY) - { - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_BUSY; - - /* Set the key */ - CRYP_SetKey(hcryp, hcryp->Init.pKey, hcryp->Init.KeySize); - - /* Set the CRYP peripheral in AES CTR mode */ - __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_AES_CTR | CRYP_CR_ALGODIR); - - /* Set the Initialization Vector */ - CRYP_SetInitVector(hcryp, hcryp->Init.pInitVect, CRYP_KEYSIZE_128B); - - /* Flush FIFO */ - __HAL_CRYP_FIFO_FLUSH(hcryp); - - /* Enable CRYP */ - __HAL_CRYP_ENABLE(hcryp); - - /* Set the phase */ - hcryp->Phase = HAL_CRYP_PHASE_PROCESS; - } - - /* Write Plain Data and Get Cypher Data */ - if(CRYP_ProcessData(hcryp, pCypherData, Size, pPlainData, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hcryp); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Initializes the CRYP peripheral in AES ECB encryption mode using Interrupt. - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param pPlainData: Pointer to the plaintext buffer - * @param Size: Length of the plaintext buffer, must be a multiple of 16 bytes - * @param pCypherData: Pointer to the cyphertext buffer - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CRYP_AESECB_Encrypt_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData) -{ - uint32_t inputaddr; - uint32_t outputaddr; - - if(hcryp->State == HAL_CRYP_STATE_READY) - { - /* Process Locked */ - __HAL_LOCK(hcryp); - - hcryp->CrypInCount = Size; - hcryp->pCrypInBuffPtr = pPlainData; - hcryp->pCrypOutBuffPtr = pCypherData; - hcryp->CrypOutCount = Size; - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_BUSY; - - /* Check if initialization phase has already been performed */ - if(hcryp->Phase == HAL_CRYP_PHASE_READY) - { - /* Set the key */ - CRYP_SetKey(hcryp, hcryp->Init.pKey, hcryp->Init.KeySize); - - /* Set the CRYP peripheral in AES ECB mode */ - __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_AES_ECB); - - /* Flush FIFO */ - __HAL_CRYP_FIFO_FLUSH(hcryp); - - /* Set the phase */ - hcryp->Phase = HAL_CRYP_PHASE_PROCESS; - } - - /* Enable Interrupts */ - __HAL_CRYP_ENABLE_IT(hcryp, CRYP_IT_INI | CRYP_IT_OUTI); - - /* Enable CRYP */ - __HAL_CRYP_ENABLE(hcryp); - - /* Return function status */ - return HAL_OK; - } - else if(__HAL_CRYP_GET_IT(hcryp, CRYP_IT_INI)) - { - inputaddr = (uint32_t)hcryp->pCrypInBuffPtr; - /* Write the Input block in the IN FIFO */ - hcryp->Instance->DR = *(uint32_t*)(inputaddr); - inputaddr+=4; - hcryp->Instance->DR = *(uint32_t*)(inputaddr); - inputaddr+=4; - hcryp->Instance->DR = *(uint32_t*)(inputaddr); - inputaddr+=4; - hcryp->Instance->DR = *(uint32_t*)(inputaddr); - hcryp->pCrypInBuffPtr += 16; - hcryp->CrypInCount -= 16; - if(hcryp->CrypInCount == 0) - { - __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_INI); - /* Call the Input data transfer complete callback */ - HAL_CRYP_InCpltCallback(hcryp); - } - } - else if(__HAL_CRYP_GET_IT(hcryp, CRYP_IT_OUTI)) - { - outputaddr = (uint32_t)hcryp->pCrypOutBuffPtr; - /* Read the Output block from the Output FIFO */ - *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT; - outputaddr+=4; - *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT; - outputaddr+=4; - *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT; - outputaddr+=4; - *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT; - hcryp->pCrypOutBuffPtr += 16; - hcryp->CrypOutCount -= 16; - if(hcryp->CrypOutCount == 0) - { - __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_OUTI); - /* Process Locked */ - __HAL_UNLOCK(hcryp); - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_READY; - /* Call Input transfer complete callback */ - HAL_CRYP_OutCpltCallback(hcryp); - } - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Initializes the CRYP peripheral in AES CBC encryption mode using Interrupt. - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param pPlainData: Pointer to the plaintext buffer - * @param Size: Length of the plaintext buffer, must be a multiple of 16 bytes - * @param pCypherData: Pointer to the cyphertext buffer - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CRYP_AESCBC_Encrypt_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData) -{ - uint32_t inputaddr; - uint32_t outputaddr; - - if(hcryp->State == HAL_CRYP_STATE_READY) - { - /* Process Locked */ - __HAL_LOCK(hcryp); - - hcryp->CrypInCount = Size; - hcryp->pCrypInBuffPtr = pPlainData; - hcryp->pCrypOutBuffPtr = pCypherData; - hcryp->CrypOutCount = Size; - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_BUSY; - - /* Check if initialization phase has already been performed */ - if(hcryp->Phase == HAL_CRYP_PHASE_READY) - { - /* Set the key */ - CRYP_SetKey(hcryp, hcryp->Init.pKey, hcryp->Init.KeySize); - - /* Set the CRYP peripheral in AES CBC mode */ - __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_AES_CBC); - - /* Set the Initialization Vector */ - CRYP_SetInitVector(hcryp, hcryp->Init.pInitVect, CRYP_KEYSIZE_128B); - - /* Flush FIFO */ - __HAL_CRYP_FIFO_FLUSH(hcryp); - - /* Set the phase */ - hcryp->Phase = HAL_CRYP_PHASE_PROCESS; - } - /* Enable Interrupts */ - __HAL_CRYP_ENABLE_IT(hcryp, CRYP_IT_INI | CRYP_IT_OUTI); - - /* Enable CRYP */ - __HAL_CRYP_ENABLE(hcryp); - - /* Return function status */ - return HAL_OK; - } - else if(__HAL_CRYP_GET_IT(hcryp, CRYP_IT_INI)) - { - inputaddr = (uint32_t)hcryp->pCrypInBuffPtr; - /* Write the Input block in the IN FIFO */ - hcryp->Instance->DR = *(uint32_t*)(inputaddr); - inputaddr+=4; - hcryp->Instance->DR = *(uint32_t*)(inputaddr); - inputaddr+=4; - hcryp->Instance->DR = *(uint32_t*)(inputaddr); - inputaddr+=4; - hcryp->Instance->DR = *(uint32_t*)(inputaddr); - hcryp->pCrypInBuffPtr += 16; - hcryp->CrypInCount -= 16; - if(hcryp->CrypInCount == 0) - { - __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_INI); - /* Call the Input data transfer complete callback */ - HAL_CRYP_InCpltCallback(hcryp); - } - } - else if(__HAL_CRYP_GET_IT(hcryp, CRYP_IT_OUTI)) - { - outputaddr = (uint32_t)hcryp->pCrypOutBuffPtr; - /* Read the Output block from the Output FIFO */ - *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT; - outputaddr+=4; - *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT; - outputaddr+=4; - *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT; - outputaddr+=4; - *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT; - hcryp->pCrypOutBuffPtr += 16; - hcryp->CrypOutCount -= 16; - if(hcryp->CrypOutCount == 0) - { - __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_OUTI); - /* Process Locked */ - __HAL_UNLOCK(hcryp); - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_READY; - /* Call Input transfer complete callback */ - HAL_CRYP_OutCpltCallback(hcryp); - } - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Initializes the CRYP peripheral in AES CTR encryption mode using Interrupt. - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param pPlainData: Pointer to the plaintext buffer - * @param Size: Length of the plaintext buffer, must be a multiple of 16 bytes - * @param pCypherData: Pointer to the cyphertext buffer - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CRYP_AESCTR_Encrypt_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData) -{ - uint32_t inputaddr; - uint32_t outputaddr; - - if(hcryp->State == HAL_CRYP_STATE_READY) - { - /* Process Locked */ - __HAL_LOCK(hcryp); - - hcryp->CrypInCount = Size; - hcryp->pCrypInBuffPtr = pPlainData; - hcryp->pCrypOutBuffPtr = pCypherData; - hcryp->CrypOutCount = Size; - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_BUSY; - - /* Check if initialization phase has already been performed */ - if(hcryp->Phase == HAL_CRYP_PHASE_READY) - { - /* Set the key */ - CRYP_SetKey(hcryp, hcryp->Init.pKey, hcryp->Init.KeySize); - - /* Set the CRYP peripheral in AES CTR mode */ - __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_AES_CTR); - - /* Set the Initialization Vector */ - CRYP_SetInitVector(hcryp, hcryp->Init.pInitVect, CRYP_KEYSIZE_128B); - - /* Flush FIFO */ - __HAL_CRYP_FIFO_FLUSH(hcryp); - - /* Set the phase */ - hcryp->Phase = HAL_CRYP_PHASE_PROCESS; - } - /* Enable Interrupts */ - __HAL_CRYP_ENABLE_IT(hcryp, CRYP_IT_INI | CRYP_IT_OUTI); - - /* Enable CRYP */ - __HAL_CRYP_ENABLE(hcryp); - - /* Return function status */ - return HAL_OK; - } - else if(__HAL_CRYP_GET_IT(hcryp, CRYP_IT_INI)) - { - inputaddr = (uint32_t)hcryp->pCrypInBuffPtr; - /* Write the Input block in the IN FIFO */ - hcryp->Instance->DR = *(uint32_t*)(inputaddr); - inputaddr+=4; - hcryp->Instance->DR = *(uint32_t*)(inputaddr); - inputaddr+=4; - hcryp->Instance->DR = *(uint32_t*)(inputaddr); - inputaddr+=4; - hcryp->Instance->DR = *(uint32_t*)(inputaddr); - hcryp->pCrypInBuffPtr += 16; - hcryp->CrypInCount -= 16; - if(hcryp->CrypInCount == 0) - { - __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_INI); - /* Call the Input data transfer complete callback */ - HAL_CRYP_InCpltCallback(hcryp); - } - } - else if(__HAL_CRYP_GET_IT(hcryp, CRYP_IT_OUTI)) - { - outputaddr = (uint32_t)hcryp->pCrypOutBuffPtr; - /* Read the Output block from the Output FIFO */ - *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT; - outputaddr+=4; - *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT; - outputaddr+=4; - *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT; - outputaddr+=4; - *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT; - hcryp->pCrypOutBuffPtr += 16; - hcryp->CrypOutCount -= 16; - if(hcryp->CrypOutCount == 0) - { - __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_OUTI); - /* Process Unlocked */ - __HAL_UNLOCK(hcryp); - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_READY; - /* Call Input transfer complete callback */ - HAL_CRYP_OutCpltCallback(hcryp); - } - } - - /* Return function status */ - return HAL_OK; -} - - -/** - * @brief Initializes the CRYP peripheral in AES ECB decryption mode using Interrupt. - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param pCypherData: Pointer to the cyphertext buffer - * @param Size: Length of the plaintext buffer, must be a multiple of 16. - * @param pPlainData: Pointer to the plaintext buffer - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CRYP_AESECB_Decrypt_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData) -{ - uint32_t tickstart = 0; - - uint32_t inputaddr; - uint32_t outputaddr; - - if(hcryp->State == HAL_CRYP_STATE_READY) - { - /* Process Locked */ - __HAL_LOCK(hcryp); - - hcryp->CrypInCount = Size; - hcryp->pCrypInBuffPtr = pCypherData; - hcryp->pCrypOutBuffPtr = pPlainData; - hcryp->CrypOutCount = Size; - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_BUSY; - - /* Check if initialization phase has already been performed */ - if(hcryp->Phase == HAL_CRYP_PHASE_READY) - { - /* Set the key */ - CRYP_SetKey(hcryp, hcryp->Init.pKey, hcryp->Init.KeySize); - - /* Set the CRYP peripheral in AES Key mode */ - __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_AES_KEY | CRYP_CR_ALGODIR); - /* Enable CRYP */ - __HAL_CRYP_ENABLE(hcryp); - - /* Get tick */ - tickstart = HAL_GetTick(); - - while(HAL_IS_BIT_SET(hcryp->Instance->SR, CRYP_FLAG_BUSY)) - { - /* Check for the Timeout */ - if((HAL_GetTick() - tickstart ) > CRYP_TIMEOUT_VALUE) - { - /* Change state */ - hcryp->State = HAL_CRYP_STATE_TIMEOUT; - - /* Process Unlocked */ - __HAL_UNLOCK(hcryp); - - return HAL_TIMEOUT; - } - } - - /* Reset the ALGOMODE bits*/ - CRYP->CR &= (uint32_t)(~CRYP_CR_ALGOMODE); - - /* Set the CRYP peripheral in AES ECB decryption mode */ - __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_AES_ECB | CRYP_CR_ALGODIR); - - /* Flush FIFO */ - __HAL_CRYP_FIFO_FLUSH(hcryp); - - /* Set the phase */ - hcryp->Phase = HAL_CRYP_PHASE_PROCESS; - } - - /* Enable Interrupts */ - __HAL_CRYP_ENABLE_IT(hcryp, CRYP_IT_INI | CRYP_IT_OUTI); - - /* Enable CRYP */ - __HAL_CRYP_ENABLE(hcryp); - - /* Return function status */ - return HAL_OK; - } - else if(__HAL_CRYP_GET_IT(hcryp, CRYP_IT_INI)) - { - inputaddr = (uint32_t)hcryp->pCrypInBuffPtr; - /* Write the Input block in the IN FIFO */ - hcryp->Instance->DR = *(uint32_t*)(inputaddr); - inputaddr+=4; - hcryp->Instance->DR = *(uint32_t*)(inputaddr); - inputaddr+=4; - hcryp->Instance->DR = *(uint32_t*)(inputaddr); - inputaddr+=4; - hcryp->Instance->DR = *(uint32_t*)(inputaddr); - hcryp->pCrypInBuffPtr += 16; - hcryp->CrypInCount -= 16; - if(hcryp->CrypInCount == 0) - { - __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_INI); - /* Call the Input data transfer complete callback */ - HAL_CRYP_InCpltCallback(hcryp); - } - } - else if(__HAL_CRYP_GET_IT(hcryp, CRYP_IT_OUTI)) - { - outputaddr = (uint32_t)hcryp->pCrypOutBuffPtr; - /* Read the Output block from the Output FIFO */ - *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT; - outputaddr+=4; - *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT; - outputaddr+=4; - *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT; - outputaddr+=4; - *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT; - hcryp->pCrypOutBuffPtr += 16; - hcryp->CrypOutCount -= 16; - if(hcryp->CrypOutCount == 0) - { - __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_OUTI); - /* Process Unlocked */ - __HAL_UNLOCK(hcryp); - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_READY; - /* Call Input transfer complete callback */ - HAL_CRYP_OutCpltCallback(hcryp); - } - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Initializes the CRYP peripheral in AES CBC decryption mode using IT. - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param pCypherData: Pointer to the cyphertext buffer - * @param Size: Length of the plaintext buffer, must be a multiple of 16 - * @param pPlainData: Pointer to the plaintext buffer - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CRYP_AESCBC_Decrypt_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData) -{ - - uint32_t tickstart = 0; - uint32_t inputaddr; - uint32_t outputaddr; - - if(hcryp->State == HAL_CRYP_STATE_READY) - { - /* Process Locked */ - __HAL_LOCK(hcryp); - - /* Get the buffer addresses and sizes */ - hcryp->CrypInCount = Size; - hcryp->pCrypInBuffPtr = pCypherData; - hcryp->pCrypOutBuffPtr = pPlainData; - hcryp->CrypOutCount = Size; - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_BUSY; - - /* Check if initialization phase has already been performed */ - if(hcryp->Phase == HAL_CRYP_PHASE_READY) - { - /* Set the key */ - CRYP_SetKey(hcryp, hcryp->Init.pKey, hcryp->Init.KeySize); - - /* Set the CRYP peripheral in AES Key mode */ - __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_AES_KEY | CRYP_CR_ALGODIR); - - /* Enable CRYP */ - __HAL_CRYP_ENABLE(hcryp); - - /* Get tick */ - tickstart = HAL_GetTick(); - - while(HAL_IS_BIT_SET(hcryp->Instance->SR, CRYP_FLAG_BUSY)) - { - /* Check for the Timeout */ - if((HAL_GetTick() - tickstart ) > CRYP_TIMEOUT_VALUE) - { - /* Change state */ - hcryp->State = HAL_CRYP_STATE_TIMEOUT; - - /* Process Unlocked */ - __HAL_UNLOCK(hcryp); - - return HAL_TIMEOUT; - } - } - - /* Reset the ALGOMODE bits*/ - CRYP->CR &= (uint32_t)(~CRYP_CR_ALGOMODE); - - /* Set the CRYP peripheral in AES CBC decryption mode */ - __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_AES_CBC | CRYP_CR_ALGODIR); - - /* Set the Initialization Vector */ - CRYP_SetInitVector(hcryp, hcryp->Init.pInitVect, CRYP_KEYSIZE_128B); - - /* Flush FIFO */ - __HAL_CRYP_FIFO_FLUSH(hcryp); - - /* Enable CRYP */ - __HAL_CRYP_ENABLE(hcryp); - - /* Set the phase */ - hcryp->Phase = HAL_CRYP_PHASE_PROCESS; - } - - /* Enable Interrupts */ - __HAL_CRYP_ENABLE_IT(hcryp, CRYP_IT_INI | CRYP_IT_OUTI); - - /* Enable CRYP */ - __HAL_CRYP_ENABLE(hcryp); - - /* Return function status */ - return HAL_OK; - } - else if(__HAL_CRYP_GET_IT(hcryp, CRYP_IT_INI)) - { - inputaddr = (uint32_t)hcryp->pCrypInBuffPtr; - /* Write the Input block in the IN FIFO */ - hcryp->Instance->DR = *(uint32_t*)(inputaddr); - inputaddr+=4; - hcryp->Instance->DR = *(uint32_t*)(inputaddr); - inputaddr+=4; - hcryp->Instance->DR = *(uint32_t*)(inputaddr); - inputaddr+=4; - hcryp->Instance->DR = *(uint32_t*)(inputaddr); - hcryp->pCrypInBuffPtr += 16; - hcryp->CrypInCount -= 16; - if(hcryp->CrypInCount == 0) - { - __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_INI); - /* Call the Input data transfer complete callback */ - HAL_CRYP_InCpltCallback(hcryp); - } - } - else if(__HAL_CRYP_GET_IT(hcryp, CRYP_IT_OUTI)) - { - outputaddr = (uint32_t)hcryp->pCrypOutBuffPtr; - /* Read the Output block from the Output FIFO */ - *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT; - outputaddr+=4; - *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT; - outputaddr+=4; - *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT; - outputaddr+=4; - *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT; - hcryp->pCrypOutBuffPtr += 16; - hcryp->CrypOutCount -= 16; - if(hcryp->CrypOutCount == 0) - { - __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_OUTI); - /* Process Unlocked */ - __HAL_UNLOCK(hcryp); - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_READY; - /* Call Input transfer complete callback */ - HAL_CRYP_OutCpltCallback(hcryp); - } - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Initializes the CRYP peripheral in AES CTR decryption mode using Interrupt. - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param pCypherData: Pointer to the cyphertext buffer - * @param Size: Length of the plaintext buffer, must be a multiple of 16 - * @param pPlainData: Pointer to the plaintext buffer - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CRYP_AESCTR_Decrypt_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData) -{ - uint32_t inputaddr; - uint32_t outputaddr; - - if(hcryp->State == HAL_CRYP_STATE_READY) - { - /* Process Locked */ - __HAL_LOCK(hcryp); - - /* Get the buffer addresses and sizes */ - hcryp->CrypInCount = Size; - hcryp->pCrypInBuffPtr = pCypherData; - hcryp->pCrypOutBuffPtr = pPlainData; - hcryp->CrypOutCount = Size; - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_BUSY; - - /* Check if initialization phase has already been performed */ - if(hcryp->Phase == HAL_CRYP_PHASE_READY) - { - /* Set the key */ - CRYP_SetKey(hcryp, hcryp->Init.pKey, hcryp->Init.KeySize); - - /* Set the CRYP peripheral in AES CTR mode */ - __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_AES_CTR | CRYP_CR_ALGODIR); - - /* Set the Initialization Vector */ - CRYP_SetInitVector(hcryp, hcryp->Init.pInitVect, CRYP_KEYSIZE_128B); - - /* Flush FIFO */ - __HAL_CRYP_FIFO_FLUSH(hcryp); - - /* Set the phase */ - hcryp->Phase = HAL_CRYP_PHASE_PROCESS; - } - - /* Enable Interrupts */ - __HAL_CRYP_ENABLE_IT(hcryp, CRYP_IT_INI | CRYP_IT_OUTI); - - /* Enable CRYP */ - __HAL_CRYP_ENABLE(hcryp); - - /* Return function status */ - return HAL_OK; - } - else if(__HAL_CRYP_GET_IT(hcryp, CRYP_IT_INI)) - { - inputaddr = (uint32_t)hcryp->pCrypInBuffPtr; - /* Write the Input block in the IN FIFO */ - hcryp->Instance->DR = *(uint32_t*)(inputaddr); - inputaddr+=4; - hcryp->Instance->DR = *(uint32_t*)(inputaddr); - inputaddr+=4; - hcryp->Instance->DR = *(uint32_t*)(inputaddr); - inputaddr+=4; - hcryp->Instance->DR = *(uint32_t*)(inputaddr); - hcryp->pCrypInBuffPtr += 16; - hcryp->CrypInCount -= 16; - if(hcryp->CrypInCount == 0) - { - __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_INI); - /* Call the Input data transfer complete callback */ - HAL_CRYP_InCpltCallback(hcryp); - } - } - else if(__HAL_CRYP_GET_IT(hcryp, CRYP_IT_OUTI)) - { - outputaddr = (uint32_t)hcryp->pCrypOutBuffPtr; - /* Read the Output block from the Output FIFO */ - *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT; - outputaddr+=4; - *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT; - outputaddr+=4; - *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT; - outputaddr+=4; - *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT; - hcryp->pCrypOutBuffPtr += 16; - hcryp->CrypOutCount -= 16; - if(hcryp->CrypOutCount == 0) - { - __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_OUTI); - /* Process Unlocked */ - __HAL_UNLOCK(hcryp); - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_READY; - /* Call Input transfer complete callback */ - HAL_CRYP_OutCpltCallback(hcryp); - } - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Initializes the CRYP peripheral in AES ECB encryption mode using DMA. - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param pPlainData: Pointer to the plaintext buffer - * @param Size: Length of the plaintext buffer, must be a multiple of 16 bytes - * @param pCypherData: Pointer to the cyphertext buffer - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CRYP_AESECB_Encrypt_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData) -{ - uint32_t inputaddr; - uint32_t outputaddr; - - if((hcryp->State == HAL_CRYP_STATE_READY) || (hcryp->Phase == HAL_CRYP_PHASE_PROCESS)) - { - /* Process Locked */ - __HAL_LOCK(hcryp); - - inputaddr = (uint32_t)pPlainData; - outputaddr = (uint32_t)pCypherData; - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_BUSY; - - /* Check if initialization phase has already been performed */ - if(hcryp->Phase == HAL_CRYP_PHASE_READY) - { - /* Set the key */ - CRYP_SetKey(hcryp, hcryp->Init.pKey, hcryp->Init.KeySize); - - /* Set the CRYP peripheral in AES ECB mode */ - __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_AES_ECB); - - /* Flush FIFO */ - __HAL_CRYP_FIFO_FLUSH(hcryp); - - /* Set the phase */ - hcryp->Phase = HAL_CRYP_PHASE_PROCESS; - } - /* Set the input and output addresses and start DMA transfer */ - CRYP_SetDMAConfig(hcryp, inputaddr, Size, outputaddr); - - /* Process Unlocked */ - __HAL_UNLOCK(hcryp); - - /* Return function status */ - return HAL_OK; - } - else - { - return HAL_ERROR; - } -} - -/** - * @brief Initializes the CRYP peripheral in AES CBC encryption mode using DMA. - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param pPlainData: Pointer to the plaintext buffer - * @param Size: Length of the plaintext buffer, must be a multiple of 16. - * @param pCypherData: Pointer to the cyphertext buffer - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CRYP_AESCBC_Encrypt_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData) -{ - uint32_t inputaddr; - uint32_t outputaddr; - - if((hcryp->State == HAL_CRYP_STATE_READY) || (hcryp->Phase == HAL_CRYP_PHASE_PROCESS)) - { - /* Process Locked */ - __HAL_LOCK(hcryp); - - inputaddr = (uint32_t)pPlainData; - outputaddr = (uint32_t)pCypherData; - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_BUSY; - - /* Check if initialization phase has already been performed */ - if(hcryp->Phase == HAL_CRYP_PHASE_READY) - { - /* Set the key */ - CRYP_SetKey(hcryp, hcryp->Init.pKey, hcryp->Init.KeySize); - - /* Set the CRYP peripheral in AES ECB mode */ - __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_AES_CBC); - - /* Set the Initialization Vector */ - CRYP_SetInitVector(hcryp, hcryp->Init.pInitVect, CRYP_KEYSIZE_128B); - - /* Flush FIFO */ - __HAL_CRYP_FIFO_FLUSH(hcryp); - - /* Set the phase */ - hcryp->Phase = HAL_CRYP_PHASE_PROCESS; - } - /* Set the input and output addresses and start DMA transfer */ - CRYP_SetDMAConfig(hcryp, inputaddr, Size, outputaddr); - - /* Process Unlocked */ - __HAL_UNLOCK(hcryp); - - /* Return function status */ - return HAL_OK; - } - else - { - return HAL_ERROR; - } -} - -/** - * @brief Initializes the CRYP peripheral in AES CTR encryption mode using DMA. - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param pPlainData: Pointer to the plaintext buffer - * @param Size: Length of the plaintext buffer, must be a multiple of 16. - * @param pCypherData: Pointer to the cyphertext buffer - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CRYP_AESCTR_Encrypt_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData) -{ - uint32_t inputaddr; - uint32_t outputaddr; - - if((hcryp->State == HAL_CRYP_STATE_READY) || (hcryp->Phase == HAL_CRYP_PHASE_PROCESS)) - { - /* Process Locked */ - __HAL_LOCK(hcryp); - - inputaddr = (uint32_t)pPlainData; - outputaddr = (uint32_t)pCypherData; - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_BUSY; - - /* Check if initialization phase has already been performed */ - if(hcryp->Phase == HAL_CRYP_PHASE_READY) - { - /* Set the key */ - CRYP_SetKey(hcryp, hcryp->Init.pKey, hcryp->Init.KeySize); - - /* Set the CRYP peripheral in AES ECB mode */ - __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_AES_CTR); - - /* Set the Initialization Vector */ - CRYP_SetInitVector(hcryp, hcryp->Init.pInitVect, CRYP_KEYSIZE_128B); - - /* Flush FIFO */ - __HAL_CRYP_FIFO_FLUSH(hcryp); - - /* Set the phase */ - hcryp->Phase = HAL_CRYP_PHASE_PROCESS; - } - - /* Set the input and output addresses and start DMA transfer */ - CRYP_SetDMAConfig(hcryp, inputaddr, Size, outputaddr); - - /* Process Unlocked */ - __HAL_UNLOCK(hcryp); - - /* Return function status */ - return HAL_OK; - } - else - { - return HAL_ERROR; - } -} - -/** - * @brief Initializes the CRYP peripheral in AES ECB decryption mode using DMA. - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param pCypherData: Pointer to the cyphertext buffer - * @param Size: Length of the plaintext buffer, must be a multiple of 16 bytes - * @param pPlainData: Pointer to the plaintext buffer - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CRYP_AESECB_Decrypt_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData) -{ - uint32_t tickstart = 0; - uint32_t inputaddr; - uint32_t outputaddr; - - if((hcryp->State == HAL_CRYP_STATE_READY) || (hcryp->Phase == HAL_CRYP_PHASE_PROCESS)) - { - /* Process Locked */ - __HAL_LOCK(hcryp); - - inputaddr = (uint32_t)pCypherData; - outputaddr = (uint32_t)pPlainData; - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_BUSY; - - /* Check if initialization phase has already been performed */ - if(hcryp->Phase == HAL_CRYP_PHASE_READY) - { - /* Set the key */ - CRYP_SetKey(hcryp, hcryp->Init.pKey, hcryp->Init.KeySize); - - /* Set the CRYP peripheral in AES Key mode */ - __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_AES_KEY | CRYP_CR_ALGODIR); - - /* Enable CRYP */ - __HAL_CRYP_ENABLE(hcryp); - - /* Get tick */ - tickstart = HAL_GetTick(); - - while(HAL_IS_BIT_SET(hcryp->Instance->SR, CRYP_FLAG_BUSY)) - { - /* Check for the Timeout */ - if((HAL_GetTick() - tickstart ) > CRYP_TIMEOUT_VALUE) - { - /* Change state */ - hcryp->State = HAL_CRYP_STATE_TIMEOUT; - - /* Process Unlocked */ - __HAL_UNLOCK(hcryp); - - return HAL_TIMEOUT; - } - } - - /* Reset the ALGOMODE bits*/ - CRYP->CR &= (uint32_t)(~CRYP_CR_ALGOMODE); - - /* Set the CRYP peripheral in AES ECB decryption mode */ - __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_AES_ECB | CRYP_CR_ALGODIR); - - /* Flush FIFO */ - __HAL_CRYP_FIFO_FLUSH(hcryp); - - /* Set the phase */ - hcryp->Phase = HAL_CRYP_PHASE_PROCESS; - } - - /* Set the input and output addresses and start DMA transfer */ - CRYP_SetDMAConfig(hcryp, inputaddr, Size, outputaddr); - - /* Process Unlocked */ - __HAL_UNLOCK(hcryp); - - /* Return function status */ - return HAL_OK; - } - else - { - return HAL_ERROR; - } -} - -/** - * @brief Initializes the CRYP peripheral in AES CBC encryption mode using DMA. - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param pCypherData: Pointer to the cyphertext buffer - * @param Size: Length of the plaintext buffer, must be a multiple of 16 bytes - * @param pPlainData: Pointer to the plaintext buffer - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CRYP_AESCBC_Decrypt_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData) -{ - uint32_t tickstart = 0; - uint32_t inputaddr; - uint32_t outputaddr; - - if((hcryp->State == HAL_CRYP_STATE_READY) || (hcryp->Phase == HAL_CRYP_PHASE_PROCESS)) - { - /* Process Locked */ - __HAL_LOCK(hcryp); - - inputaddr = (uint32_t)pCypherData; - outputaddr = (uint32_t)pPlainData; - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_BUSY; - - /* Check if initialization phase has already been performed */ - if(hcryp->Phase == HAL_CRYP_PHASE_READY) - { - /* Set the key */ - CRYP_SetKey(hcryp, hcryp->Init.pKey, hcryp->Init.KeySize); - - /* Set the CRYP peripheral in AES Key mode */ - __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_AES_KEY | CRYP_CR_ALGODIR); - - /* Enable CRYP */ - __HAL_CRYP_ENABLE(hcryp); - - /* Get tick */ - tickstart = HAL_GetTick(); - - while(HAL_IS_BIT_SET(hcryp->Instance->SR, CRYP_FLAG_BUSY)) - { - /* Check for the Timeout */ - if((HAL_GetTick() - tickstart ) > CRYP_TIMEOUT_VALUE) - { - /* Change state */ - hcryp->State = HAL_CRYP_STATE_TIMEOUT; - - /* Process Unlocked */ - __HAL_UNLOCK(hcryp); - - return HAL_TIMEOUT; - } - } - - /* Reset the ALGOMODE bits*/ - CRYP->CR &= (uint32_t)(~CRYP_CR_ALGOMODE); - - /* Set the CRYP peripheral in AES CBC decryption mode */ - __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_AES_CBC | CRYP_CR_ALGODIR); - - /* Set the Initialization Vector */ - CRYP_SetInitVector(hcryp, hcryp->Init.pInitVect, CRYP_KEYSIZE_128B); - - /* Flush FIFO */ - __HAL_CRYP_FIFO_FLUSH(hcryp); - - /* Set the phase */ - hcryp->Phase = HAL_CRYP_PHASE_PROCESS; - } - - /* Set the input and output addresses and start DMA transfer */ - CRYP_SetDMAConfig(hcryp, inputaddr, Size, outputaddr); - - /* Process Unlocked */ - __HAL_UNLOCK(hcryp); - - /* Return function status */ - return HAL_OK; - } - else - { - return HAL_ERROR; - } -} - -/** - * @brief Initializes the CRYP peripheral in AES CTR decryption mode using DMA. - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param pCypherData: Pointer to the cyphertext buffer - * @param Size: Length of the plaintext buffer, must be a multiple of 16 - * @param pPlainData: Pointer to the plaintext buffer - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CRYP_AESCTR_Decrypt_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData) -{ - uint32_t inputaddr; - uint32_t outputaddr; - - if((hcryp->State == HAL_CRYP_STATE_READY) || (hcryp->Phase == HAL_CRYP_PHASE_PROCESS)) - { - /* Process Locked */ - __HAL_LOCK(hcryp); - - inputaddr = (uint32_t)pCypherData; - outputaddr = (uint32_t)pPlainData; - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_BUSY; - - /* Check if initialization phase has already been performed */ - if(hcryp->Phase == HAL_CRYP_PHASE_READY) - { - /* Set the key */ - CRYP_SetKey(hcryp, hcryp->Init.pKey, hcryp->Init.KeySize); - - /* Set the CRYP peripheral in AES CTR mode */ - __HAL_CRYP_SET_MODE(hcryp, CRYP_CR_ALGOMODE_AES_CTR | CRYP_CR_ALGODIR); - - /* Set the Initialization Vector */ - CRYP_SetInitVector(hcryp, hcryp->Init.pInitVect, CRYP_KEYSIZE_128B); - - /* Flush FIFO */ - __HAL_CRYP_FIFO_FLUSH(hcryp); - - /* Set the phase */ - hcryp->Phase = HAL_CRYP_PHASE_PROCESS; - } - - /* Set the input and output addresses and start DMA transfer */ - CRYP_SetDMAConfig(hcryp, inputaddr, Size, outputaddr); - - /* Process Unlocked */ - __HAL_UNLOCK(hcryp); - - /* Return function status */ - return HAL_OK; - } - else - { - return HAL_ERROR; - } -} - - -/** - * @} - */ - -/** @defgroup CRYP_Exported_Functions_Group3 DES processing functions - * @brief processing functions. - * -@verbatim - ============================================================================== - ##### DES processing functions ##### - ============================================================================== - [..] This section provides functions allowing to: - (+) Encrypt plaintext using DES using ECB or CBC chaining modes - (+) Decrypt cyphertext using ECB or CBC chaining modes - [..] Three processing functions are available: - (+) Polling mode - (+) Interrupt mode - (+) DMA mode - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the CRYP peripheral in DES ECB encryption mode. - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param pPlainData: Pointer to the plaintext buffer - * @param Size: Length of the plaintext buffer, must be a multiple of 8 - * @param pCypherData: Pointer to the cyphertext buffer - * @param Timeout: Specify Timeout value - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CRYP_DESECB_Encrypt(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData, uint32_t Timeout) -{ - /* Process Locked */ - __HAL_LOCK(hcryp); - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_BUSY; - - /* Set CRYP peripheral in DES ECB encryption mode */ - CRYP_SetDESECBMode(hcryp, 0); - - /* Enable CRYP */ - __HAL_CRYP_ENABLE(hcryp); - - /* Write Plain Data and Get Cypher Data */ - if(CRYP_ProcessData2Words(hcryp, pPlainData, Size, pCypherData, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hcryp); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Initializes the CRYP peripheral in DES ECB decryption mode. - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param pPlainData: Pointer to the plaintext buffer - * @param Size: Length of the plaintext buffer, must be a multiple of 8 - * @param pCypherData: Pointer to the cyphertext buffer - * @param Timeout: Specify Timeout value - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CRYP_DESECB_Decrypt(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData, uint32_t Timeout) -{ - /* Process Locked */ - __HAL_LOCK(hcryp); - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_BUSY; - - /* Set CRYP peripheral in DES ECB decryption mode */ - CRYP_SetDESECBMode(hcryp, CRYP_CR_ALGODIR); - - /* Enable CRYP */ - __HAL_CRYP_ENABLE(hcryp); - - /* Write Plain Data and Get Cypher Data */ - if(CRYP_ProcessData2Words(hcryp, pPlainData, Size, pCypherData, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hcryp); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Initializes the CRYP peripheral in DES CBC encryption mode. - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param pPlainData: Pointer to the plaintext buffer - * @param Size: Length of the plaintext buffer, must be a multiple of 8 - * @param pCypherData: Pointer to the cyphertext buffer - * @param Timeout: Specify Timeout value - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CRYP_DESCBC_Encrypt(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData, uint32_t Timeout) -{ - /* Process Locked */ - __HAL_LOCK(hcryp); - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_BUSY; - - /* Set CRYP peripheral in DES CBC encryption mode */ - CRYP_SetDESCBCMode(hcryp, 0); - - /* Enable CRYP */ - __HAL_CRYP_ENABLE(hcryp); - - /* Write Plain Data and Get Cypher Data */ - if(CRYP_ProcessData2Words(hcryp, pPlainData, Size, pCypherData, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hcryp); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Initializes the CRYP peripheral in DES ECB decryption mode. - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param pPlainData: Pointer to the plaintext buffer - * @param Size: Length of the plaintext buffer, must be a multiple of 8 - * @param pCypherData: Pointer to the cyphertext buffer - * @param Timeout: Specify Timeout value - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CRYP_DESCBC_Decrypt(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData, uint32_t Timeout) -{ - /* Process Locked */ - __HAL_LOCK(hcryp); - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_BUSY; - - /* Set CRYP peripheral in DES CBC decryption mode */ - CRYP_SetDESCBCMode(hcryp, CRYP_CR_ALGODIR); - - /* Enable CRYP */ - __HAL_CRYP_ENABLE(hcryp); - - /* Write Plain Data and Get Cypher Data */ - if(CRYP_ProcessData2Words(hcryp, pPlainData, Size, pCypherData, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hcryp); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Initializes the CRYP peripheral in DES ECB encryption mode using IT. - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param pPlainData: Pointer to the plaintext buffer - * @param Size: Length of the plaintext buffer, must be a multiple of 8 - * @param pCypherData: Pointer to the cyphertext buffer - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CRYP_DESECB_Encrypt_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData) -{ - uint32_t inputaddr; - uint32_t outputaddr; - - if(hcryp->State == HAL_CRYP_STATE_READY) - { - /* Process Locked */ - __HAL_LOCK(hcryp); - - hcryp->CrypInCount = Size; - hcryp->pCrypInBuffPtr = pPlainData; - hcryp->pCrypOutBuffPtr = pCypherData; - hcryp->CrypOutCount = Size; - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_BUSY; - - /* Set CRYP peripheral in DES ECB encryption mode */ - CRYP_SetDESECBMode(hcryp, 0); - - /* Enable Interrupts */ - __HAL_CRYP_ENABLE_IT(hcryp, CRYP_IT_INI | CRYP_IT_OUTI); - - /* Enable CRYP */ - __HAL_CRYP_ENABLE(hcryp); - - /* Return function status */ - return HAL_OK; - } - else if(__HAL_CRYP_GET_IT(hcryp, CRYP_IT_INI)) - { - inputaddr = (uint32_t)hcryp->pCrypInBuffPtr; - /* Write the Input block in the IN FIFO */ - hcryp->Instance->DR = *(uint32_t*)(inputaddr); - inputaddr+=4; - hcryp->Instance->DR = *(uint32_t*)(inputaddr); - - hcryp->pCrypInBuffPtr += 8; - hcryp->CrypInCount -= 8; - if(hcryp->CrypInCount == 0) - { - __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_INI); - /* Call the Input data transfer complete callback */ - HAL_CRYP_InCpltCallback(hcryp); - } - } - else if(__HAL_CRYP_GET_IT(hcryp, CRYP_IT_OUTI)) - { - outputaddr = (uint32_t)hcryp->pCrypOutBuffPtr; - /* Read the Output block from the Output FIFO */ - *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT; - outputaddr+=4; - *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT; - - hcryp->pCrypOutBuffPtr += 8; - hcryp->CrypOutCount -= 8; - if(hcryp->CrypOutCount == 0) - { - /* Disable IT */ - __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_OUTI); - /* Disable CRYP */ - __HAL_CRYP_DISABLE(hcryp); - /* Process Unlocked */ - __HAL_UNLOCK(hcryp); - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_READY; - /* Call Input transfer complete callback */ - HAL_CRYP_OutCpltCallback(hcryp); - } - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Initializes the CRYP peripheral in DES CBC encryption mode using interrupt. - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param pPlainData: Pointer to the plaintext buffer - * @param Size: Length of the plaintext buffer, must be a multiple of 8 - * @param pCypherData: Pointer to the cyphertext buffer - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CRYP_DESCBC_Encrypt_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData) -{ - uint32_t inputaddr; - uint32_t outputaddr; - - if(hcryp->State == HAL_CRYP_STATE_READY) - { - /* Process Locked */ - __HAL_LOCK(hcryp); - - hcryp->CrypInCount = Size; - hcryp->pCrypInBuffPtr = pPlainData; - hcryp->pCrypOutBuffPtr = pCypherData; - hcryp->CrypOutCount = Size; - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_BUSY; - - /* Set CRYP peripheral in DES CBC encryption mode */ - CRYP_SetDESCBCMode(hcryp, 0); - - /* Enable Interrupts */ - __HAL_CRYP_ENABLE_IT(hcryp, CRYP_IT_INI | CRYP_IT_OUTI); - - /* Enable CRYP */ - __HAL_CRYP_ENABLE(hcryp); - - /* Return function status */ - return HAL_OK; - } - - else if(__HAL_CRYP_GET_IT(hcryp, CRYP_IT_INI)) - { - inputaddr = (uint32_t)hcryp->pCrypInBuffPtr; - /* Write the Input block in the IN FIFO */ - hcryp->Instance->DR = *(uint32_t*)(inputaddr); - inputaddr+=4; - hcryp->Instance->DR = *(uint32_t*)(inputaddr); - - hcryp->pCrypInBuffPtr += 8; - hcryp->CrypInCount -= 8; - if(hcryp->CrypInCount == 0) - { - __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_INI); - /* Call the Input data transfer complete callback */ - HAL_CRYP_InCpltCallback(hcryp); - } - } - else if(__HAL_CRYP_GET_IT(hcryp, CRYP_IT_OUTI)) - { - outputaddr = (uint32_t)hcryp->pCrypOutBuffPtr; - /* Read the Output block from the Output FIFO */ - *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT; - outputaddr+=4; - *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT; - - hcryp->pCrypOutBuffPtr += 8; - hcryp->CrypOutCount -= 8; - if(hcryp->CrypOutCount == 0) - { - /* Disable IT */ - __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_OUTI); - /* Disable CRYP */ - __HAL_CRYP_DISABLE(hcryp); - /* Process Unlocked */ - __HAL_UNLOCK(hcryp); - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_READY; - /* Call Input transfer complete callback */ - HAL_CRYP_OutCpltCallback(hcryp); - } - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Initializes the CRYP peripheral in DES ECB decryption mode using IT. - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param pPlainData: Pointer to the plaintext buffer - * @param Size: Length of the plaintext buffer, must be a multiple of 8 - * @param pCypherData: Pointer to the cyphertext buffer - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CRYP_DESECB_Decrypt_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData) -{ - uint32_t inputaddr; - uint32_t outputaddr; - - if(hcryp->State == HAL_CRYP_STATE_READY) - { - /* Process Locked */ - __HAL_LOCK(hcryp); - - hcryp->CrypInCount = Size; - hcryp->pCrypInBuffPtr = pCypherData; - hcryp->pCrypOutBuffPtr = pPlainData; - hcryp->CrypOutCount = Size; - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_BUSY; - - /* Set CRYP peripheral in DES ECB decryption mode */ - CRYP_SetDESECBMode(hcryp, CRYP_CR_ALGODIR); - - /* Enable Interrupts */ - __HAL_CRYP_ENABLE_IT(hcryp, CRYP_IT_INI | CRYP_IT_OUTI); - - /* Enable CRYP */ - __HAL_CRYP_ENABLE(hcryp); - - /* Return function status */ - return HAL_OK; - } - else if(__HAL_CRYP_GET_IT(hcryp, CRYP_IT_INI)) - { - inputaddr = (uint32_t)hcryp->pCrypInBuffPtr; - /* Write the Input block in the IN FIFO */ - hcryp->Instance->DR = *(uint32_t*)(inputaddr); - inputaddr+=4; - hcryp->Instance->DR = *(uint32_t*)(inputaddr); - - hcryp->pCrypInBuffPtr += 8; - hcryp->CrypInCount -= 8; - if(hcryp->CrypInCount == 0) - { - __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_INI); - /* Call the Input data transfer complete callback */ - HAL_CRYP_InCpltCallback(hcryp); - } - } - else if(__HAL_CRYP_GET_IT(hcryp, CRYP_IT_OUTI)) - { - outputaddr = (uint32_t)hcryp->pCrypOutBuffPtr; - /* Read the Output block from the Output FIFO */ - *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT; - outputaddr+=4; - *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT; - - hcryp->pCrypOutBuffPtr += 8; - hcryp->CrypOutCount -= 8; - if(hcryp->CrypOutCount == 0) - { - /* Disable IT */ - __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_OUTI); - /* Disable CRYP */ - __HAL_CRYP_DISABLE(hcryp); - /* Process Unlocked */ - __HAL_UNLOCK(hcryp); - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_READY; - /* Call Input transfer complete callback */ - HAL_CRYP_OutCpltCallback(hcryp); - } - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Initializes the CRYP peripheral in DES ECB decryption mode using interrupt. - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param pPlainData: Pointer to the plaintext buffer - * @param Size: Length of the plaintext buffer, must be a multiple of 8 - * @param pCypherData: Pointer to the cyphertext buffer - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CRYP_DESCBC_Decrypt_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData) -{ - uint32_t inputaddr; - uint32_t outputaddr; - - if(hcryp->State == HAL_CRYP_STATE_READY) - { - /* Process Locked */ - __HAL_LOCK(hcryp); - - hcryp->CrypInCount = Size; - hcryp->pCrypInBuffPtr = pCypherData; - hcryp->pCrypOutBuffPtr = pPlainData; - hcryp->CrypOutCount = Size; - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_BUSY; - - /* Set CRYP peripheral in DES CBC decryption mode */ - CRYP_SetDESCBCMode(hcryp, CRYP_CR_ALGODIR); - - /* Enable Interrupts */ - __HAL_CRYP_ENABLE_IT(hcryp, CRYP_IT_INI | CRYP_IT_OUTI); - - /* Enable CRYP */ - __HAL_CRYP_ENABLE(hcryp); - - /* Return function status */ - return HAL_OK; - } - else if(__HAL_CRYP_GET_IT(hcryp, CRYP_IT_INI)) - { - inputaddr = (uint32_t)hcryp->pCrypInBuffPtr; - /* Write the Input block in the IN FIFO */ - hcryp->Instance->DR = *(uint32_t*)(inputaddr); - inputaddr+=4; - hcryp->Instance->DR = *(uint32_t*)(inputaddr); - - hcryp->pCrypInBuffPtr += 8; - hcryp->CrypInCount -= 8; - if(hcryp->CrypInCount == 0) - { - __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_INI); - /* Call the Input data transfer complete callback */ - HAL_CRYP_InCpltCallback(hcryp); - } - } - else if(__HAL_CRYP_GET_IT(hcryp, CRYP_IT_OUTI)) - { - outputaddr = (uint32_t)hcryp->pCrypOutBuffPtr; - /* Read the Output block from the Output FIFO */ - *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT; - outputaddr+=4; - *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT; - - hcryp->pCrypOutBuffPtr += 8; - hcryp->CrypOutCount -= 8; - if(hcryp->CrypOutCount == 0) - { - /* Disable IT */ - __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_OUTI); - /* Disable CRYP */ - __HAL_CRYP_DISABLE(hcryp); - /* Process Unlocked */ - __HAL_UNLOCK(hcryp); - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_READY; - /* Call Input transfer complete callback */ - HAL_CRYP_OutCpltCallback(hcryp); - } - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Initializes the CRYP peripheral in DES ECB encryption mode using DMA. - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param pPlainData: Pointer to the plaintext buffer - * @param Size: Length of the plaintext buffer, must be a multiple of 8 - * @param pCypherData: Pointer to the cyphertext buffer - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CRYP_DESECB_Encrypt_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData) -{ - uint32_t inputaddr; - uint32_t outputaddr; - - if((hcryp->State == HAL_CRYP_STATE_READY) || (hcryp->Phase == HAL_CRYP_PHASE_PROCESS)) - { - /* Process Locked */ - __HAL_LOCK(hcryp); - - inputaddr = (uint32_t)pPlainData; - outputaddr = (uint32_t)pCypherData; - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_BUSY; - - /* Set CRYP peripheral in DES ECB encryption mode */ - CRYP_SetDESECBMode(hcryp, 0); - - /* Set the input and output addresses and start DMA transfer */ - CRYP_SetDMAConfig(hcryp, inputaddr, Size, outputaddr); - - /* Process Unlocked */ - __HAL_UNLOCK(hcryp); - - /* Return function status */ - return HAL_OK; - } - else - { - return HAL_ERROR; - } -} - -/** - * @brief Initializes the CRYP peripheral in DES CBC encryption mode using DMA. - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param pPlainData: Pointer to the plaintext buffer - * @param Size: Length of the plaintext buffer, must be a multiple of 8 - * @param pCypherData: Pointer to the cyphertext buffer - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CRYP_DESCBC_Encrypt_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData) -{ - uint32_t inputaddr; - uint32_t outputaddr; - - if((hcryp->State == HAL_CRYP_STATE_READY) || (hcryp->Phase == HAL_CRYP_PHASE_PROCESS)) - { - /* Process Locked */ - __HAL_LOCK(hcryp); - - inputaddr = (uint32_t)pPlainData; - outputaddr = (uint32_t)pCypherData; - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_BUSY; - - /* Set CRYP peripheral in DES CBC encryption mode */ - CRYP_SetDESCBCMode(hcryp, 0); - - /* Set the input and output addresses and start DMA transfer */ - CRYP_SetDMAConfig(hcryp, inputaddr, Size, outputaddr); - - /* Process Unlocked */ - __HAL_UNLOCK(hcryp); - - /* Return function status */ - return HAL_OK; - } - else - { - return HAL_ERROR; - } -} - -/** - * @brief Initializes the CRYP peripheral in DES ECB decryption mode using DMA. - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param pPlainData: Pointer to the plaintext buffer - * @param Size: Length of the plaintext buffer, must be a multiple of 8 - * @param pCypherData: Pointer to the cyphertext buffer - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CRYP_DESECB_Decrypt_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData) -{ - uint32_t inputaddr; - uint32_t outputaddr; - - if((hcryp->State == HAL_CRYP_STATE_READY) || (hcryp->Phase == HAL_CRYP_PHASE_PROCESS)) - { - /* Process Locked */ - __HAL_LOCK(hcryp); - - inputaddr = (uint32_t)pCypherData; - outputaddr = (uint32_t)pPlainData; - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_BUSY; - - /* Set CRYP peripheral in DES ECB decryption mode */ - CRYP_SetDESECBMode(hcryp, CRYP_CR_ALGODIR); - - /* Set the input and output addresses and start DMA transfer */ - CRYP_SetDMAConfig(hcryp, inputaddr, Size, outputaddr); - - /* Process Unlocked */ - __HAL_UNLOCK(hcryp); - - /* Return function status */ - return HAL_OK; - } - else - { - return HAL_ERROR; - } -} - -/** - * @brief Initializes the CRYP peripheral in DES ECB decryption mode using DMA. - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param pPlainData: Pointer to the plaintext buffer - * @param Size: Length of the plaintext buffer, must be a multiple of 8 - * @param pCypherData: Pointer to the cyphertext buffer - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CRYP_DESCBC_Decrypt_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData) -{ - uint32_t inputaddr; - uint32_t outputaddr; - - if((hcryp->State == HAL_CRYP_STATE_READY) || (hcryp->Phase == HAL_CRYP_PHASE_PROCESS)) - { - /* Process Locked */ - __HAL_LOCK(hcryp); - - inputaddr = (uint32_t)pCypherData; - outputaddr = (uint32_t)pPlainData; - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_BUSY; - - /* Set CRYP peripheral in DES CBC decryption mode */ - CRYP_SetDESCBCMode(hcryp, CRYP_CR_ALGODIR); - - /* Set the input and output addresses and start DMA transfer */ - CRYP_SetDMAConfig(hcryp, inputaddr, Size, outputaddr); - - /* Process Unlocked */ - __HAL_UNLOCK(hcryp); - - /* Return function status */ - return HAL_OK; - } - else - { - return HAL_ERROR; - } -} - -/** - * @} - */ - -/** @defgroup CRYP_Exported_Functions_Group4 TDES processing functions - * @brief processing functions. - * -@verbatim - ============================================================================== - ##### TDES processing functions ##### - ============================================================================== - [..] This section provides functions allowing to: - (+) Encrypt plaintext using TDES based on ECB or CBC chaining modes - (+) Decrypt cyphertext using TDES based on ECB or CBC chaining modes - [..] Three processing functions are available: - (+) Polling mode - (+) Interrupt mode - (+) DMA mode - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the CRYP peripheral in TDES ECB encryption mode - * then encrypt pPlainData. The cypher data are available in pCypherData - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param pPlainData: Pointer to the plaintext buffer - * @param Size: Length of the plaintext buffer, must be a multiple of 8 - * @param pCypherData: Pointer to the cyphertext buffer - * @param Timeout: Specify Timeout value - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CRYP_TDESECB_Encrypt(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData, uint32_t Timeout) -{ - /* Process Locked */ - __HAL_LOCK(hcryp); - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_BUSY; - - /* Set CRYP peripheral in TDES ECB encryption mode */ - CRYP_SetTDESECBMode(hcryp, 0); - - /* Enable CRYP */ - __HAL_CRYP_ENABLE(hcryp); - - /* Write Plain Data and Get Cypher Data */ - if(CRYP_ProcessData2Words(hcryp, pPlainData, Size, pCypherData, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hcryp); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Initializes the CRYP peripheral in TDES ECB decryption mode - * then decrypted pCypherData. The cypher data are available in pPlainData - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param pPlainData: Pointer to the plaintext buffer - * @param Size: Length of the plaintext buffer, must be a multiple of 8 - * @param pCypherData: Pointer to the cyphertext buffer - * @param Timeout: Specify Timeout value - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CRYP_TDESECB_Decrypt(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData, uint32_t Timeout) -{ - /* Process Locked */ - __HAL_LOCK(hcryp); - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_BUSY; - - /* Set CRYP peripheral in TDES ECB decryption mode */ - CRYP_SetTDESECBMode(hcryp, CRYP_CR_ALGODIR); - - /* Enable CRYP */ - __HAL_CRYP_ENABLE(hcryp); - - /* Write Cypher Data and Get Plain Data */ - if(CRYP_ProcessData2Words(hcryp, pCypherData, Size, pPlainData, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hcryp); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Initializes the CRYP peripheral in TDES CBC encryption mode - * then encrypt pPlainData. The cypher data are available in pCypherData - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param pPlainData: Pointer to the plaintext buffer - * @param Size: Length of the plaintext buffer, must be a multiple of 8 - * @param pCypherData: Pointer to the cyphertext buffer - * @param Timeout: Specify Timeout value - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CRYP_TDESCBC_Encrypt(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData, uint32_t Timeout) -{ - /* Process Locked */ - __HAL_LOCK(hcryp); - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_BUSY; - - /* Set CRYP peripheral in TDES CBC encryption mode */ - CRYP_SetTDESCBCMode(hcryp, 0); - - /* Enable CRYP */ - __HAL_CRYP_ENABLE(hcryp); - - /* Write Plain Data and Get Cypher Data */ - if(CRYP_ProcessData2Words(hcryp, pPlainData, Size, pCypherData, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hcryp); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Initializes the CRYP peripheral in TDES CBC decryption mode - * then decrypted pCypherData. The cypher data are available in pPlainData - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param pCypherData: Pointer to the cyphertext buffer - * @param Size: Length of the plaintext buffer, must be a multiple of 8 - * @param pPlainData: Pointer to the plaintext buffer - * @param Timeout: Specify Timeout value - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CRYP_TDESCBC_Decrypt(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData, uint32_t Timeout) -{ - /* Process Locked */ - __HAL_LOCK(hcryp); - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_BUSY; - - /* Set CRYP peripheral in TDES CBC decryption mode */ - CRYP_SetTDESCBCMode(hcryp, CRYP_CR_ALGODIR); - - /* Enable CRYP */ - __HAL_CRYP_ENABLE(hcryp); - - /* Write Cypher Data and Get Plain Data */ - if(CRYP_ProcessData2Words(hcryp, pCypherData, Size, pPlainData, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hcryp); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Initializes the CRYP peripheral in TDES ECB encryption mode using interrupt. - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param pPlainData: Pointer to the plaintext buffer - * @param Size: Length of the plaintext buffer, must be a multiple of 8 - * @param pCypherData: Pointer to the cyphertext buffer - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CRYP_TDESECB_Encrypt_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData) -{ - uint32_t inputaddr; - uint32_t outputaddr; - - if(hcryp->State == HAL_CRYP_STATE_READY) - { - /* Process Locked */ - __HAL_LOCK(hcryp); - - hcryp->CrypInCount = Size; - hcryp->pCrypInBuffPtr = pPlainData; - hcryp->pCrypOutBuffPtr = pCypherData; - hcryp->CrypOutCount = Size; - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_BUSY; - - /* Set CRYP peripheral in TDES ECB encryption mode */ - CRYP_SetTDESECBMode(hcryp, 0); - - /* Enable Interrupts */ - __HAL_CRYP_ENABLE_IT(hcryp, CRYP_IT_INI | CRYP_IT_OUTI); - - /* Enable CRYP */ - __HAL_CRYP_ENABLE(hcryp); - - /* Return function status */ - return HAL_OK; - } - else if(__HAL_CRYP_GET_IT(hcryp, CRYP_IT_INI)) - { - inputaddr = (uint32_t)hcryp->pCrypInBuffPtr; - /* Write the Input block in the IN FIFO */ - hcryp->Instance->DR = *(uint32_t*)(inputaddr); - inputaddr+=4; - hcryp->Instance->DR = *(uint32_t*)(inputaddr); - - hcryp->pCrypInBuffPtr += 8; - hcryp->CrypInCount -= 8; - if(hcryp->CrypInCount == 0) - { - __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_INI); - /* Call the Input data transfer complete callback */ - HAL_CRYP_InCpltCallback(hcryp); - } - } - else if(__HAL_CRYP_GET_IT(hcryp, CRYP_IT_OUTI)) - { - outputaddr = (uint32_t)hcryp->pCrypOutBuffPtr; - /* Read the Output block from the Output FIFO */ - *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT; - outputaddr+=4; - *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT; - - hcryp->pCrypOutBuffPtr += 8; - hcryp->CrypOutCount -= 8; - if(hcryp->CrypOutCount == 0) - { - /* Disable IT */ - __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_OUTI); - /* Disable CRYP */ - __HAL_CRYP_DISABLE(hcryp); - /* Process Unlocked */ - __HAL_UNLOCK(hcryp); - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_READY; - /* Call the Output data transfer complete callback */ - HAL_CRYP_OutCpltCallback(hcryp); - } - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Initializes the CRYP peripheral in TDES CBC encryption mode. - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param pPlainData: Pointer to the plaintext buffer - * @param Size: Length of the plaintext buffer, must be a multiple of 8 - * @param pCypherData: Pointer to the cyphertext buffer - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CRYP_TDESCBC_Encrypt_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData) -{ - uint32_t inputaddr; - uint32_t outputaddr; - - if(hcryp->State == HAL_CRYP_STATE_READY) - { - /* Process Locked */ - __HAL_LOCK(hcryp); - - hcryp->CrypInCount = Size; - hcryp->pCrypInBuffPtr = pPlainData; - hcryp->pCrypOutBuffPtr = pCypherData; - hcryp->CrypOutCount = Size; - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_BUSY; - - /* Set CRYP peripheral in TDES CBC encryption mode */ - CRYP_SetTDESCBCMode(hcryp, 0); - - /* Enable Interrupts */ - __HAL_CRYP_ENABLE_IT(hcryp, CRYP_IT_INI | CRYP_IT_OUTI); - - /* Enable CRYP */ - __HAL_CRYP_ENABLE(hcryp); - - /* Return function status */ - return HAL_OK; - } - else if(__HAL_CRYP_GET_IT(hcryp, CRYP_IT_INI)) - { - inputaddr = (uint32_t)hcryp->pCrypInBuffPtr; - /* Write the Input block in the IN FIFO */ - hcryp->Instance->DR = *(uint32_t*)(inputaddr); - inputaddr+=4; - hcryp->Instance->DR = *(uint32_t*)(inputaddr); - - hcryp->pCrypInBuffPtr += 8; - hcryp->CrypInCount -= 8; - if(hcryp->CrypInCount == 0) - { - __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_INI); - /* Call the Input data transfer complete callback */ - HAL_CRYP_InCpltCallback(hcryp); - } - } - else if(__HAL_CRYP_GET_IT(hcryp, CRYP_IT_OUTI)) - { - outputaddr = (uint32_t)hcryp->pCrypOutBuffPtr; - /* Read the Output block from the Output FIFO */ - *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT; - outputaddr+=4; - *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT; - - hcryp->pCrypOutBuffPtr += 8; - hcryp->CrypOutCount -= 8; - if(hcryp->CrypOutCount == 0) - { - __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_OUTI); - /* Disable CRYP */ - __HAL_CRYP_DISABLE(hcryp); - /* Process Unlocked */ - __HAL_UNLOCK(hcryp); - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_READY; - /* Call Input transfer complete callback */ - HAL_CRYP_OutCpltCallback(hcryp); - } - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Initializes the CRYP peripheral in TDES ECB decryption mode. - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param pPlainData: Pointer to the plaintext buffer - * @param Size: Length of the plaintext buffer, must be a multiple of 8 - * @param pCypherData: Pointer to the cyphertext buffer - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CRYP_TDESECB_Decrypt_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData) -{ - uint32_t inputaddr; - uint32_t outputaddr; - - if(hcryp->State == HAL_CRYP_STATE_READY) - { - /* Process Locked */ - __HAL_LOCK(hcryp); - - hcryp->CrypInCount = Size; - hcryp->pCrypInBuffPtr = pCypherData; - hcryp->pCrypOutBuffPtr = pPlainData; - hcryp->CrypOutCount = Size; - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_BUSY; - - /* Set CRYP peripheral in TDES ECB decryption mode */ - CRYP_SetTDESECBMode(hcryp, CRYP_CR_ALGODIR); - - /* Enable Interrupts */ - __HAL_CRYP_ENABLE_IT(hcryp, CRYP_IT_INI | CRYP_IT_OUTI); - - /* Enable CRYP */ - __HAL_CRYP_ENABLE(hcryp); - - /* Return function status */ - return HAL_OK; - } - else if(__HAL_CRYP_GET_IT(hcryp, CRYP_IT_INI)) - { - inputaddr = (uint32_t)hcryp->pCrypInBuffPtr; - /* Write the Input block in the IN FIFO */ - hcryp->Instance->DR = *(uint32_t*)(inputaddr); - inputaddr+=4; - hcryp->Instance->DR = *(uint32_t*)(inputaddr); - - hcryp->pCrypInBuffPtr += 8; - hcryp->CrypInCount -= 8; - if(hcryp->CrypInCount == 0) - { - __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_INI); - /* Call the Input data transfer complete callback */ - HAL_CRYP_InCpltCallback(hcryp); - } - } - else if(__HAL_CRYP_GET_IT(hcryp, CRYP_IT_OUTI)) - { - outputaddr = (uint32_t)hcryp->pCrypOutBuffPtr; - /* Read the Output block from the Output FIFO */ - *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT; - outputaddr+=4; - *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT; - - hcryp->pCrypOutBuffPtr += 8; - hcryp->CrypOutCount -= 8; - if(hcryp->CrypOutCount == 0) - { - __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_OUTI); - /* Disable CRYP */ - __HAL_CRYP_DISABLE(hcryp); - /* Process Unlocked */ - __HAL_UNLOCK(hcryp); - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_READY; - /* Call Input transfer complete callback */ - HAL_CRYP_OutCpltCallback(hcryp); - } - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Initializes the CRYP peripheral in TDES CBC decryption mode. - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param pCypherData: Pointer to the cyphertext buffer - * @param Size: Length of the plaintext buffer, must be a multiple of 8 - * @param pPlainData: Pointer to the plaintext buffer - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CRYP_TDESCBC_Decrypt_IT(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData) -{ - uint32_t inputaddr; - uint32_t outputaddr; - - if(hcryp->State == HAL_CRYP_STATE_READY) - { - /* Process Locked */ - __HAL_LOCK(hcryp); - - hcryp->CrypInCount = Size; - hcryp->pCrypInBuffPtr = pCypherData; - hcryp->pCrypOutBuffPtr = pPlainData; - hcryp->CrypOutCount = Size; - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_BUSY; - - /* Set CRYP peripheral in TDES CBC decryption mode */ - CRYP_SetTDESCBCMode(hcryp, CRYP_CR_ALGODIR); - - /* Enable Interrupts */ - __HAL_CRYP_ENABLE_IT(hcryp, CRYP_IT_INI | CRYP_IT_OUTI); - - /* Enable CRYP */ - __HAL_CRYP_ENABLE(hcryp); - - /* Return function status */ - return HAL_OK; - } - else if(__HAL_CRYP_GET_IT(hcryp, CRYP_IT_INI)) - { - inputaddr = (uint32_t)hcryp->pCrypInBuffPtr; - /* Write the Input block in the IN FIFO */ - hcryp->Instance->DR = *(uint32_t*)(inputaddr); - inputaddr+=4; - hcryp->Instance->DR = *(uint32_t*)(inputaddr); - - hcryp->pCrypInBuffPtr += 8; - hcryp->CrypInCount -= 8; - if(hcryp->CrypInCount == 0) - { - __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_INI); - /* Call the Input data transfer complete callback */ - HAL_CRYP_InCpltCallback(hcryp); - } - } - else if(__HAL_CRYP_GET_IT(hcryp, CRYP_IT_OUTI)) - { - outputaddr = (uint32_t)hcryp->pCrypOutBuffPtr; - /* Read the Output block from the Output FIFO */ - *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT; - outputaddr+=4; - *(uint32_t*)(outputaddr) = hcryp->Instance->DOUT; - - hcryp->pCrypOutBuffPtr += 8; - hcryp->CrypOutCount -= 8; - if(hcryp->CrypOutCount == 0) - { - __HAL_CRYP_DISABLE_IT(hcryp, CRYP_IT_OUTI); - /* Disable CRYP */ - __HAL_CRYP_DISABLE(hcryp); - /* Process Unlocked */ - __HAL_UNLOCK(hcryp); - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_READY; - /* Call Input transfer complete callback */ - HAL_CRYP_OutCpltCallback(hcryp); - } - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Initializes the CRYP peripheral in TDES ECB encryption mode using DMA. - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param pPlainData: Pointer to the plaintext buffer - * @param Size: Length of the plaintext buffer, must be a multiple of 8 - * @param pCypherData: Pointer to the cyphertext buffer - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CRYP_TDESECB_Encrypt_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData) -{ - uint32_t inputaddr; - uint32_t outputaddr; - - if((hcryp->State == HAL_CRYP_STATE_READY) || (hcryp->Phase == HAL_CRYP_PHASE_PROCESS)) - { - /* Process Locked */ - __HAL_LOCK(hcryp); - - inputaddr = (uint32_t)pPlainData; - outputaddr = (uint32_t)pCypherData; - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_BUSY; - - /* Set CRYP peripheral in TDES ECB encryption mode */ - CRYP_SetTDESECBMode(hcryp, 0); - - /* Set the input and output addresses and start DMA transfer */ - CRYP_SetDMAConfig(hcryp, inputaddr, Size, outputaddr); - - /* Process Unlocked */ - __HAL_UNLOCK(hcryp); - - /* Return function status */ - return HAL_OK; - } - else - { - return HAL_ERROR; - } -} - -/** - * @brief Initializes the CRYP peripheral in TDES CBC encryption mode using DMA. - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param pPlainData: Pointer to the plaintext buffer - * @param Size: Length of the plaintext buffer, must be a multiple of 8 - * @param pCypherData: Pointer to the cyphertext buffer - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CRYP_TDESCBC_Encrypt_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pPlainData, uint16_t Size, uint8_t *pCypherData) -{ - uint32_t inputaddr; - uint32_t outputaddr; - - if((hcryp->State == HAL_CRYP_STATE_READY) || (hcryp->Phase == HAL_CRYP_PHASE_PROCESS)) - { - /* Process Locked */ - __HAL_LOCK(hcryp); - - inputaddr = (uint32_t)pPlainData; - outputaddr = (uint32_t)pCypherData; - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_BUSY; - - /* Set CRYP peripheral in TDES CBC encryption mode */ - CRYP_SetTDESCBCMode(hcryp, 0); - - /* Set the input and output addresses and start DMA transfer */ - CRYP_SetDMAConfig(hcryp, inputaddr, Size, outputaddr); - - /* Process Unlocked */ - __HAL_UNLOCK(hcryp); - - /* Return function status */ - return HAL_OK; - } - else - { - return HAL_ERROR; - } -} - -/** - * @brief Initializes the CRYP peripheral in TDES ECB decryption mode using DMA. - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param pPlainData: Pointer to the plaintext buffer - * @param Size: Length of the plaintext buffer, must be a multiple of 8 - * @param pCypherData: Pointer to the cyphertext buffer - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CRYP_TDESECB_Decrypt_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData) -{ - uint32_t inputaddr; - uint32_t outputaddr; - - if((hcryp->State == HAL_CRYP_STATE_READY) || (hcryp->Phase == HAL_CRYP_PHASE_PROCESS)) - { - /* Process Locked */ - __HAL_LOCK(hcryp); - - inputaddr = (uint32_t)pCypherData; - outputaddr = (uint32_t)pPlainData; - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_BUSY; - - /* Set CRYP peripheral in TDES ECB decryption mode */ - CRYP_SetTDESECBMode(hcryp, CRYP_CR_ALGODIR); - - /* Set the input and output addresses and start DMA transfer */ - CRYP_SetDMAConfig(hcryp, inputaddr, Size, outputaddr); - - /* Process Unlocked */ - __HAL_UNLOCK(hcryp); - - /* Return function status */ - return HAL_OK; - } - else - { - return HAL_ERROR; - } -} - -/** - * @brief Initializes the CRYP peripheral in TDES CBC decryption mode using DMA. - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @param pCypherData: Pointer to the cyphertext buffer - * @param Size: Length of the plaintext buffer, must be a multiple of 8 - * @param pPlainData: Pointer to the plaintext buffer - * @retval HAL status - */ -HAL_StatusTypeDef HAL_CRYP_TDESCBC_Decrypt_DMA(CRYP_HandleTypeDef *hcryp, uint8_t *pCypherData, uint16_t Size, uint8_t *pPlainData) -{ - uint32_t inputaddr; - uint32_t outputaddr; - - if((hcryp->State == HAL_CRYP_STATE_READY) || (hcryp->Phase == HAL_CRYP_PHASE_PROCESS)) - { - /* Process Locked */ - __HAL_LOCK(hcryp); - - inputaddr = (uint32_t)pCypherData; - outputaddr = (uint32_t)pPlainData; - - /* Change the CRYP state */ - hcryp->State = HAL_CRYP_STATE_BUSY; - - /* Set CRYP peripheral in TDES CBC decryption mode */ - CRYP_SetTDESCBCMode(hcryp, CRYP_CR_ALGODIR); - - /* Set the input and output addresses and start DMA transfer */ - CRYP_SetDMAConfig(hcryp, inputaddr, Size, outputaddr); - - /* Process Unlocked */ - __HAL_UNLOCK(hcryp); - - /* Return function status */ - return HAL_OK; - } - else - { - return HAL_ERROR; - } -} - -/** - * @} - */ - -/** @defgroup CRYP_Exported_Functions_Group5 DMA callback functions - * @brief DMA callback functions. - * -@verbatim - ============================================================================== - ##### DMA callback functions ##### - ============================================================================== - [..] This section provides DMA callback functions: - (+) DMA Input data transfer complete - (+) DMA Output data transfer complete - (+) DMA error - -@endverbatim - * @{ - */ - -/** - * @brief Input FIFO transfer completed callbacks. - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @retval None - */ -__weak void HAL_CRYP_InCpltCallback(CRYP_HandleTypeDef *hcryp) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_CRYP_InCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Output FIFO transfer completed callbacks. - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @retval None - */ -__weak void HAL_CRYP_OutCpltCallback(CRYP_HandleTypeDef *hcryp) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_CRYP_OutCpltCallback could be implemented in the user file - */ -} - -/** - * @brief CRYP error callbacks. - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @retval None - */ - __weak void HAL_CRYP_ErrorCallback(CRYP_HandleTypeDef *hcryp) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_CRYP_ErrorCallback could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup CRYP_Exported_Functions_Group6 CRYP IRQ handler management - * @brief CRYP IRQ handler. - * -@verbatim - ============================================================================== - ##### CRYP IRQ handler management ##### - ============================================================================== -[..] This section provides CRYP IRQ handler function. - -@endverbatim - * @{ - */ - -/** - * @brief This function handles CRYP interrupt request. - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @retval None - */ -void HAL_CRYP_IRQHandler(CRYP_HandleTypeDef *hcryp) -{ - switch(CRYP->CR & CRYP_CR_ALGOMODE_DIRECTION) - { - case CRYP_CR_ALGOMODE_TDES_ECB_ENCRYPT: - HAL_CRYP_TDESECB_Encrypt_IT(hcryp, NULL, 0, NULL); - break; - - case CRYP_CR_ALGOMODE_TDES_ECB_DECRYPT: - HAL_CRYP_TDESECB_Decrypt_IT(hcryp, NULL, 0, NULL); - break; - - case CRYP_CR_ALGOMODE_TDES_CBC_ENCRYPT: - HAL_CRYP_TDESCBC_Encrypt_IT(hcryp, NULL, 0, NULL); - break; - - case CRYP_CR_ALGOMODE_TDES_CBC_DECRYPT: - HAL_CRYP_TDESCBC_Decrypt_IT(hcryp, NULL, 0, NULL); - break; - - case CRYP_CR_ALGOMODE_DES_ECB_ENCRYPT: - HAL_CRYP_DESECB_Encrypt_IT(hcryp, NULL, 0, NULL); - break; - - case CRYP_CR_ALGOMODE_DES_ECB_DECRYPT: - HAL_CRYP_DESECB_Decrypt_IT(hcryp, NULL, 0, NULL); - break; - - case CRYP_CR_ALGOMODE_DES_CBC_ENCRYPT: - HAL_CRYP_DESCBC_Encrypt_IT(hcryp, NULL, 0, NULL); - break; - - case CRYP_CR_ALGOMODE_DES_CBC_DECRYPT: - HAL_CRYP_DESCBC_Decrypt_IT(hcryp, NULL, 0, NULL); - break; - - case CRYP_CR_ALGOMODE_AES_ECB_ENCRYPT: - HAL_CRYP_AESECB_Encrypt_IT(hcryp, NULL, 0, NULL); - break; - - case CRYP_CR_ALGOMODE_AES_ECB_DECRYPT: - HAL_CRYP_AESECB_Decrypt_IT(hcryp, NULL, 0, NULL); - break; - - case CRYP_CR_ALGOMODE_AES_CBC_ENCRYPT: - HAL_CRYP_AESCBC_Encrypt_IT(hcryp, NULL, 0, NULL); - break; - - case CRYP_CR_ALGOMODE_AES_CBC_DECRYPT: - HAL_CRYP_AESCBC_Decrypt_IT(hcryp, NULL, 0, NULL); - break; - - case CRYP_CR_ALGOMODE_AES_CTR_ENCRYPT: - HAL_CRYP_AESCTR_Encrypt_IT(hcryp, NULL, 0, NULL); - break; - - case CRYP_CR_ALGOMODE_AES_CTR_DECRYPT: - HAL_CRYP_AESCTR_Decrypt_IT(hcryp, NULL, 0, NULL); - break; - - default: - break; - } -} - -/** - * @} - */ - -/** @defgroup CRYP_Exported_Functions_Group7 Peripheral State functions - * @brief Peripheral State functions. - * -@verbatim - ============================================================================== - ##### Peripheral State functions ##### - ============================================================================== - [..] - This subsection permits to get in run-time the status of the peripheral. - -@endverbatim - * @{ - */ - -/** - * @brief Returns the CRYP state. - * @param hcryp: pointer to a CRYP_HandleTypeDef structure that contains - * the configuration information for CRYP module - * @retval HAL state - */ -HAL_CRYP_STATETypeDef HAL_CRYP_GetState(CRYP_HandleTypeDef *hcryp) -{ - return hcryp->State; -} - -/** - * @} - */ - - -/** - * @} - */ - -#endif /* STM32F215xx || STM32F217xx */ - -#endif /* HAL_CRYP_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_dac.c b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_dac.c deleted file mode 100755 index 02b655da..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_dac.c +++ /dev/null @@ -1,947 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_hal_dac.c - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief DAC HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the Digital to Analog Converter (DAC) peripheral: - * + Initialization and de-initialization functions - * + IO operation functions - * + Peripheral Control functions - * + Peripheral State and Errors functions - * - * - @verbatim - ============================================================================== - ##### DAC Peripheral features ##### - ============================================================================== - [..] - *** DAC Channels *** - ==================== - [..] - The device integrates two 12-bit Digital Analog Converters that can - be used independently or simultaneously (dual mode): - (#) DAC channel1 with DAC_OUT1 (PA4) as output - (#) DAC channel2 with DAC_OUT2 (PA5) as output - - *** DAC Triggers *** - ==================== - [..] - Digital to Analog conversion can be non-triggered using DAC_TRIGGER_NONE - and DAC_OUT1/DAC_OUT2 is available once writing to DHRx register. - [..] - Digital to Analog conversion can be triggered by: - (#) External event: EXTI Line 9 (any GPIOx_Pin9) using DAC_TRIGGER_EXT_IT9. - The used pin (GPIOx_Pin9) must be configured in input mode. - - (#) Timers TRGO: TIM2, TIM4, TIM5, TIM6, TIM7 and TIM8 - (DAC_TRIGGER_T2_TRGO, DAC_TRIGGER_T4_TRGO...) - - (#) Software using DAC_TRIGGER_SOFTWARE - - *** DAC Buffer mode feature *** - =============================== - [..] - Each DAC channel integrates an output buffer that can be used to - reduce the output impedance, and to drive external loads directly - without having to add an external operational amplifier. - To enable, the output buffer use - sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE; - [..] - (@) Refer to the device datasheet for more details about output - impedance value with and without output buffer. - - *** DAC wave generation feature *** - =================================== - [..] - Both DAC channels can be used to generate - (#) Noise wave - (#) Triangle wave - - *** DAC data format *** - ======================= - [..] - The DAC data format can be: - (#) 8-bit right alignment using DAC_ALIGN_8B_R - (#) 12-bit left alignment using DAC_ALIGN_12B_L - (#) 12-bit right alignment using DAC_ALIGN_12B_R - - *** DAC data value to voltage correspondence *** - ================================================ - [..] - The analog output voltage on each DAC channel pin is determined - by the following equation: - DAC_OUTx = VREF+ * DOR / 4095 - with DOR is the Data Output Register - VEF+ is the input voltage reference (refer to the device datasheet) - e.g. To set DAC_OUT1 to 0.7V, use - Assuming that VREF+ = 3.3V, DAC_OUT1 = (3.3 * 868) / 4095 = 0.7V - - *** DMA requests *** - ===================== - [..] - A DMA1 request can be generated when an external trigger (but not - a software trigger) occurs if DMA1 requests are enabled using - HAL_DAC_Start_DMA() - [..] - DMA1 requests are mapped as following: - (#) DAC channel1 : mapped on DMA1 Stream5 channel7 which must be - already configured - (#) DAC channel2 : mapped on DMA1 Stream6 channel7 which must be - already configured - - -@- For Dual mode and specific signal (Triangle and noise) generation please - refer to Extension Features Driver description - - - ##### How to use this driver ##### - ============================================================================== - [..] - (+) DAC APB clock must be enabled to get write access to DAC - registers using HAL_DAC_Init() - (+) Configure DAC_OUTx (DAC_OUT1: PA4, DAC_OUT2: PA5) in analog mode. - (+) Configure the DAC channel using HAL_DAC_ConfigChannel() function. - (+) Enable the DAC channel using HAL_DAC_Start() or HAL_DAC_Start_DMA functions - - *** Polling mode IO operation *** - ================================= - [..] - (+) Start the DAC peripheral using HAL_DAC_Start() - (+) To read the DAC last data output value, use the HAL_DAC_GetValue() function. - (+) Stop the DAC peripheral using HAL_DAC_Stop() - - *** DMA mode IO operation *** - ============================== - [..] - (+) Start the DAC peripheral using HAL_DAC_Start_DMA(), at this stage the user specify the length - of data to be transferred at each end of conversion - (+) At The end of data transfer HAL_DAC_ConvCpltCallbackCh1()or HAL_DAC_ConvCpltCallbackCh2() - function is executed and user can add his own code by customization of function pointer - HAL_DAC_ConvCpltCallbackCh1 or HAL_DAC_ConvCpltCallbackCh2 - (+) In case of transfer Error, HAL_DAC_ErrorCallbackCh1() function is executed and user can - add his own code by customization of function pointer HAL_DAC_ErrorCallbackCh1 - (+) Stop the DAC peripheral using HAL_DAC_Stop_DMA() - - *** DAC HAL driver macros list *** - ============================================= - [..] - Below the list of most used macros in DAC HAL driver. - - (+) __HAL_DAC_ENABLE : Enable the DAC peripheral - (+) __HAL_DAC_DISABLE : Disable the DAC peripheral - (+) __HAL_DAC_CLEAR_FLAG: Clear the DAC's pending flags - (+) __HAL_DAC_GET_FLAG: Get the selected DAC's flag status - - [..] - (@) You can refer to the DAC HAL driver header file for more useful macros - - @endverbatim - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal.h" - -/** @addtogroup STM32F2xx_HAL_Driver - * @{ - */ - -/** @defgroup DAC DAC - * @brief DAC driver modules - * @{ - */ - -#ifdef HAL_DAC_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/** @addtogroup DAC_Private_Functions - * @{ - */ -/* Private function prototypes -----------------------------------------------*/ -static void DAC_DMAConvCpltCh1(DMA_HandleTypeDef *hdma); -static void DAC_DMAErrorCh1(DMA_HandleTypeDef *hdma); -static void DAC_DMAHalfConvCpltCh1(DMA_HandleTypeDef *hdma); -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup DAC_Exported_Functions DAC Exported Functions - * @{ - */ - -/** @defgroup DAC_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * -@verbatim - ============================================================================== - ##### Initialization and de-initialization functions ##### - ============================================================================== - [..] This section provides functions allowing to: - (+) Initialize and configure the DAC. - (+) De-initialize the DAC. - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the DAC peripheral according to the specified parameters - * in the DAC_InitStruct. - * @param hdac: pointer to a DAC_HandleTypeDef structure that contains - * the configuration information for the specified DAC. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DAC_Init(DAC_HandleTypeDef* hdac) -{ - /* Check DAC handle */ - if(hdac == NULL) - { - return HAL_ERROR; - } - /* Check the parameters */ - assert_param(IS_DAC_ALL_INSTANCE(hdac->Instance)); - - if(hdac->State == HAL_DAC_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - hdac->Lock = HAL_UNLOCKED; - /* Init the low level hardware */ - HAL_DAC_MspInit(hdac); - } - - /* Initialize the DAC state*/ - hdac->State = HAL_DAC_STATE_BUSY; - - /* Set DAC error code to none */ - hdac->ErrorCode = HAL_DAC_ERROR_NONE; - - /* Initialize the DAC state*/ - hdac->State = HAL_DAC_STATE_READY; - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Deinitializes the DAC peripheral registers to their default reset values. - * @param hdac: pointer to a DAC_HandleTypeDef structure that contains - * the configuration information for the specified DAC. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DAC_DeInit(DAC_HandleTypeDef* hdac) -{ - /* Check DAC handle */ - if(hdac == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_DAC_ALL_INSTANCE(hdac->Instance)); - - /* Change DAC state */ - hdac->State = HAL_DAC_STATE_BUSY; - - /* DeInit the low level hardware */ - HAL_DAC_MspDeInit(hdac); - - /* Set DAC error code to none */ - hdac->ErrorCode = HAL_DAC_ERROR_NONE; - - /* Change DAC state */ - hdac->State = HAL_DAC_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(hdac); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Initializes the DAC MSP. - * @param hdac: pointer to a DAC_HandleTypeDef structure that contains - * the configuration information for the specified DAC. - * @retval None - */ -__weak void HAL_DAC_MspInit(DAC_HandleTypeDef* hdac) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_DAC_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes the DAC MSP. - * @param hdac: pointer to a DAC_HandleTypeDef structure that contains - * the configuration information for the specified DAC. - * @retval None - */ -__weak void HAL_DAC_MspDeInit(DAC_HandleTypeDef* hdac) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_DAC_MspDeInit could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup DAC_Exported_Functions_Group2 IO operation functions - * @brief IO operation functions - * -@verbatim - ============================================================================== - ##### IO operation functions ##### - ============================================================================== - [..] This section provides functions allowing to: - (+) Start conversion. - (+) Stop conversion. - (+) Start conversion and enable DMA transfer. - (+) Stop conversion and disable DMA transfer. - (+) Get result of conversion. - -@endverbatim - * @{ - */ - -/** - * @brief Enables DAC and starts conversion of channel. - * @param hdac: pointer to a DAC_HandleTypeDef structure that contains - * the configuration information for the specified DAC. - * @param Channel: The selected DAC channel. - * This parameter can be one of the following values: - * @arg DAC_CHANNEL_1: DAC Channel1 selected - * @arg DAC_CHANNEL_2: DAC Channel2 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DAC_Start(DAC_HandleTypeDef* hdac, uint32_t Channel) -{ - uint32_t tmp1 = 0, tmp2 = 0; - - /* Check the parameters */ - assert_param(IS_DAC_CHANNEL(Channel)); - - /* Process locked */ - __HAL_LOCK(hdac); - - /* Change DAC state */ - hdac->State = HAL_DAC_STATE_BUSY; - - /* Enable the Peripheral */ - __HAL_DAC_ENABLE(hdac, Channel); - - if(Channel == DAC_CHANNEL_1) - { - tmp1 = hdac->Instance->CR & DAC_CR_TEN1; - tmp2 = hdac->Instance->CR & DAC_CR_TSEL1; - /* Check if software trigger enabled */ - if((tmp1 == DAC_CR_TEN1) && (tmp2 == DAC_CR_TSEL1)) - { - /* Enable the selected DAC software conversion */ - hdac->Instance->SWTRIGR |= (uint32_t)DAC_SWTRIGR_SWTRIG1; - } - } - else - { - tmp1 = hdac->Instance->CR & DAC_CR_TEN2; - tmp2 = hdac->Instance->CR & DAC_CR_TSEL2; - /* Check if software trigger enabled */ - if((tmp1 == DAC_CR_TEN2) && (tmp2 == DAC_CR_TSEL2)) - { - /* Enable the selected DAC software conversion*/ - hdac->Instance->SWTRIGR |= (uint32_t)DAC_SWTRIGR_SWTRIG2; - } - } - - /* Change DAC state */ - hdac->State = HAL_DAC_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hdac); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Disables DAC and stop conversion of channel. - * @param hdac: pointer to a DAC_HandleTypeDef structure that contains - * the configuration information for the specified DAC. - * @param Channel: The selected DAC channel. - * This parameter can be one of the following values: - * @arg DAC_CHANNEL_1: DAC Channel1 selected - * @arg DAC_CHANNEL_2: DAC Channel2 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DAC_Stop(DAC_HandleTypeDef* hdac, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_DAC_CHANNEL(Channel)); - - /* Disable the Peripheral */ - __HAL_DAC_DISABLE(hdac, Channel); - - /* Change DAC state */ - hdac->State = HAL_DAC_STATE_READY; - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Enables DAC and starts conversion of channel. - * @param hdac: pointer to a DAC_HandleTypeDef structure that contains - * the configuration information for the specified DAC. - * @param Channel: The selected DAC channel. - * This parameter can be one of the following values: - * @arg DAC_CHANNEL_1: DAC Channel1 selected - * @arg DAC_CHANNEL_2: DAC Channel2 selected - * @param pData: The destination peripheral Buffer address. - * @param Length: The length of data to be transferred from memory to DAC peripheral - * @param Alignment: Specifies the data alignment for DAC channel. - * This parameter can be one of the following values: - * @arg DAC_ALIGN_8B_R: 8bit right data alignment selected - * @arg DAC_ALIGN_12B_L: 12bit left data alignment selected - * @arg DAC_ALIGN_12B_R: 12bit right data alignment selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DAC_Start_DMA(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t* pData, uint32_t Length, uint32_t Alignment) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_DAC_CHANNEL(Channel)); - assert_param(IS_DAC_ALIGN(Alignment)); - - /* Process locked */ - __HAL_LOCK(hdac); - - /* Change DAC state */ - hdac->State = HAL_DAC_STATE_BUSY; - - if(Channel == DAC_CHANNEL_1) - { - /* Set the DMA transfer complete callback for channel1 */ - hdac->DMA_Handle1->XferCpltCallback = DAC_DMAConvCpltCh1; - - /* Set the DMA half transfer complete callback for channel1 */ - hdac->DMA_Handle1->XferHalfCpltCallback = DAC_DMAHalfConvCpltCh1; - - /* Set the DMA error callback for channel1 */ - hdac->DMA_Handle1->XferErrorCallback = DAC_DMAErrorCh1; - - /* Enable the selected DAC channel1 DMA request */ - hdac->Instance->CR |= DAC_CR_DMAEN1; - - /* Case of use of channel 1 */ - switch(Alignment) - { - case DAC_ALIGN_12B_R: - /* Get DHR12R1 address */ - tmpreg = (uint32_t)&hdac->Instance->DHR12R1; - break; - case DAC_ALIGN_12B_L: - /* Get DHR12L1 address */ - tmpreg = (uint32_t)&hdac->Instance->DHR12L1; - break; - case DAC_ALIGN_8B_R: - /* Get DHR8R1 address */ - tmpreg = (uint32_t)&hdac->Instance->DHR8R1; - break; - default: - break; - } - } - else - { - /* Set the DMA transfer complete callback for channel2 */ - hdac->DMA_Handle2->XferCpltCallback = DAC_DMAConvCpltCh2; - - /* Set the DMA half transfer complete callback for channel2 */ - hdac->DMA_Handle2->XferHalfCpltCallback = DAC_DMAHalfConvCpltCh2; - - /* Set the DMA error callback for channel2 */ - hdac->DMA_Handle2->XferErrorCallback = DAC_DMAErrorCh2; - - /* Enable the selected DAC channel2 DMA request */ - hdac->Instance->CR |= DAC_CR_DMAEN2; - - /* Case of use of channel 2 */ - switch(Alignment) - { - case DAC_ALIGN_12B_R: - /* Get DHR12R2 address */ - tmpreg = (uint32_t)&hdac->Instance->DHR12R2; - break; - case DAC_ALIGN_12B_L: - /* Get DHR12L2 address */ - tmpreg = (uint32_t)&hdac->Instance->DHR12L2; - break; - case DAC_ALIGN_8B_R: - /* Get DHR8R2 address */ - tmpreg = (uint32_t)&hdac->Instance->DHR8R2; - break; - default: - break; - } - } - - /* Enable the DMA Stream */ - if(Channel == DAC_CHANNEL_1) - { - /* Enable the DAC DMA underrun interrupt */ - __HAL_DAC_ENABLE_IT(hdac, DAC_IT_DMAUDR1); - - /* Enable the DMA Stream */ - HAL_DMA_Start_IT(hdac->DMA_Handle1, (uint32_t)pData, tmpreg, Length); - } - else - { - /* Enable the DAC DMA underrun interrupt */ - __HAL_DAC_ENABLE_IT(hdac, DAC_IT_DMAUDR2); - - /* Enable the DMA Stream */ - HAL_DMA_Start_IT(hdac->DMA_Handle2, (uint32_t)pData, tmpreg, Length); - } - - /* Enable the Peripheral */ - __HAL_DAC_ENABLE(hdac, Channel); - - /* Process Unlocked */ - __HAL_UNLOCK(hdac); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Disables DAC and stop conversion of channel. - * @param hdac: pointer to a DAC_HandleTypeDef structure that contains - * the configuration information for the specified DAC. - * @param Channel: The selected DAC channel. - * This parameter can be one of the following values: - * @arg DAC_CHANNEL_1: DAC Channel1 selected - * @arg DAC_CHANNEL_2: DAC Channel2 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DAC_Stop_DMA(DAC_HandleTypeDef* hdac, uint32_t Channel) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the parameters */ - assert_param(IS_DAC_CHANNEL(Channel)); - - /* Disable the selected DAC channel DMA request */ - hdac->Instance->CR &= ~(DAC_CR_DMAEN1 << Channel); - - /* Disable the Peripheral */ - __HAL_DAC_DISABLE(hdac, Channel); - - /* Disable the DMA Channel */ - /* Channel1 is used */ - if(Channel == DAC_CHANNEL_1) - { - status = HAL_DMA_Abort(hdac->DMA_Handle1); - } - else /* Channel2 is used for */ - { - status = HAL_DMA_Abort(hdac->DMA_Handle2); - } - - /* Check if DMA Channel effectively disabled */ - if(status != HAL_OK) - { - /* Update DAC state machine to error */ - hdac->State = HAL_DAC_STATE_ERROR; - } - else - { - /* Change DAC state */ - hdac->State = HAL_DAC_STATE_READY; - } - - /* Return function status */ - return status; -} - -/** - * @brief Returns the last data output value of the selected DAC channel. - * @param hdac: pointer to a DAC_HandleTypeDef structure that contains - * the configuration information for the specified DAC. - * @param Channel: The selected DAC channel. - * This parameter can be one of the following values: - * @arg DAC_CHANNEL_1: DAC Channel1 selected - * @arg DAC_CHANNEL_2: DAC Channel2 selected - * @retval The selected DAC channel data output value. - */ -uint32_t HAL_DAC_GetValue(DAC_HandleTypeDef* hdac, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_DAC_CHANNEL(Channel)); - - /* Returns the DAC channel data output register value */ - if(Channel == DAC_CHANNEL_1) - { - return hdac->Instance->DOR1; - } - else - { - return hdac->Instance->DOR2; - } -} - -/** - * @brief Handles DAC interrupt request - * @param hdac: pointer to a DAC_HandleTypeDef structure that contains - * the configuration information for the specified DAC. - * @retval None - */ -void HAL_DAC_IRQHandler(DAC_HandleTypeDef* hdac) -{ - /* Check underrun channel 1 flag */ - if(__HAL_DAC_GET_FLAG(hdac, DAC_FLAG_DMAUDR1)) - { - /* Change DAC state to error state */ - hdac->State = HAL_DAC_STATE_ERROR; - - /* Set DAC error code to channel1 DMA underrun error */ - hdac->ErrorCode |= HAL_DAC_ERROR_DMAUNDERRUNCH1; - - /* Clear the underrun flag */ - __HAL_DAC_CLEAR_FLAG(hdac,DAC_FLAG_DMAUDR1); - - /* Disable the selected DAC channel1 DMA request */ - hdac->Instance->CR &= ~DAC_CR_DMAEN1; - - /* Error callback */ - HAL_DAC_DMAUnderrunCallbackCh1(hdac); - } - /* Check underrun channel 2 flag */ - if(__HAL_DAC_GET_FLAG(hdac, DAC_FLAG_DMAUDR2)) - { - /* Change DAC state to error state */ - hdac->State = HAL_DAC_STATE_ERROR; - - /* Set DAC error code to channel2 DMA underrun error */ - hdac->ErrorCode |= HAL_DAC_ERROR_DMAUNDERRUNCH2; - - /* Clear the underrun flag */ - __HAL_DAC_CLEAR_FLAG(hdac,DAC_FLAG_DMAUDR2); - - /* Disable the selected DAC channel1 DMA request */ - hdac->Instance->CR &= ~DAC_CR_DMAEN2; - - /* Error callback */ - HAL_DACEx_DMAUnderrunCallbackCh2(hdac); - } -} - -/** - * @brief Conversion complete callback in non blocking mode for Channel1 - * @param hdac: pointer to a DAC_HandleTypeDef structure that contains - * the configuration information for the specified DAC. - * @retval None - */ -__weak void HAL_DAC_ConvCpltCallbackCh1(DAC_HandleTypeDef* hdac) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_DAC_ConvCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Conversion half DMA transfer callback in non blocking mode for Channel1 - * @param hdac: pointer to a DAC_HandleTypeDef structure that contains - * the configuration information for the specified DAC. - * @retval None - */ -__weak void HAL_DAC_ConvHalfCpltCallbackCh1(DAC_HandleTypeDef* hdac) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_DAC_ConvHalfCpltCallbackCh1 could be implemented in the user file - */ -} - -/** - * @brief Error DAC callback for Channel1. - * @param hdac: pointer to a DAC_HandleTypeDef structure that contains - * the configuration information for the specified DAC. - * @retval None - */ -__weak void HAL_DAC_ErrorCallbackCh1(DAC_HandleTypeDef *hdac) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_DAC_ErrorCallbackCh1 could be implemented in the user file - */ -} - -/** - * @brief DMA underrun DAC callback for channel1. - * @param hdac: pointer to a DAC_HandleTypeDef structure that contains - * the configuration information for the specified DAC. - * @retval None - */ -__weak void HAL_DAC_DMAUnderrunCallbackCh1(DAC_HandleTypeDef *hdac) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_DAC_DMAUnderrunCallbackCh1 could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup DAC_Exported_Functions_Group3 Peripheral Control functions - * @brief Peripheral Control functions - * -@verbatim - ============================================================================== - ##### Peripheral Control functions ##### - ============================================================================== - [..] This section provides functions allowing to: - (+) Configure channels. - (+) Set the specified data holding register value for DAC channel. - -@endverbatim - * @{ - */ - -/** - * @brief Configures the selected DAC channel. - * @param hdac: pointer to a DAC_HandleTypeDef structure that contains - * the configuration information for the specified DAC. - * @param sConfig: DAC configuration structure. - * @param Channel: The selected DAC channel. - * This parameter can be one of the following values: - * @arg DAC_CHANNEL_1: DAC Channel1 selected - * @arg DAC_CHANNEL_2: DAC Channel2 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DAC_ConfigChannel(DAC_HandleTypeDef* hdac, DAC_ChannelConfTypeDef* sConfig, uint32_t Channel) -{ - uint32_t tmpreg1 = 0, tmpreg2 = 0; - - /* Check the DAC parameters */ - assert_param(IS_DAC_TRIGGER(sConfig->DAC_Trigger)); - assert_param(IS_DAC_OUTPUT_BUFFER_STATE(sConfig->DAC_OutputBuffer)); - assert_param(IS_DAC_CHANNEL(Channel)); - - /* Process locked */ - __HAL_LOCK(hdac); - - /* Change DAC state */ - hdac->State = HAL_DAC_STATE_BUSY; - - /* Get the DAC CR value */ - tmpreg1 = hdac->Instance->CR; - /* Clear BOFFx, TENx, TSELx, WAVEx and MAMPx bits */ - tmpreg1 &= ~(((uint32_t)(DAC_CR_MAMP1 | DAC_CR_WAVE1 | DAC_CR_TSEL1 | DAC_CR_TEN1 | DAC_CR_BOFF1)) << Channel); - /* Configure for the selected DAC channel: buffer output, trigger */ - /* Set TSELx and TENx bits according to DAC_Trigger value */ - /* Set BOFFx bit according to DAC_OutputBuffer value */ - tmpreg2 = (sConfig->DAC_Trigger | sConfig->DAC_OutputBuffer); - /* Calculate CR register value depending on DAC_Channel */ - tmpreg1 |= tmpreg2 << Channel; - /* Write to DAC CR */ - hdac->Instance->CR = tmpreg1; - /* Disable wave generation */ - hdac->Instance->CR &= ~(DAC_CR_WAVE1 << Channel); - - /* Change DAC state */ - hdac->State = HAL_DAC_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hdac); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Set the specified data holding register value for DAC channel. - * @param hdac: pointer to a DAC_HandleTypeDef structure that contains - * the configuration information for the specified DAC. - * @param Channel: The selected DAC channel. - * This parameter can be one of the following values: - * @arg DAC_CHANNEL_1: DAC Channel1 selected - * @arg DAC_CHANNEL_2: DAC Channel2 selected - * @param Alignment: Specifies the data alignment. - * This parameter can be one of the following values: - * @arg DAC_ALIGN_8B_R: 8bit right data alignment selected - * @arg DAC_ALIGN_12B_L: 12bit left data alignment selected - * @arg DAC_ALIGN_12B_R: 12bit right data alignment selected - * @param Data: Data to be loaded in the selected data holding register. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DAC_SetValue(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t Alignment, uint32_t Data) -{ - __IO uint32_t tmp = 0; - - /* Check the parameters */ - assert_param(IS_DAC_CHANNEL(Channel)); - assert_param(IS_DAC_ALIGN(Alignment)); - assert_param(IS_DAC_DATA(Data)); - - tmp = (uint32_t)hdac->Instance; - if(Channel == DAC_CHANNEL_1) - { - tmp += DAC_DHR12R1_ALIGNMENT(Alignment); - } - else - { - tmp += DAC_DHR12R2_ALIGNMENT(Alignment); - } - - /* Set the DAC channel1 selected data holding register */ - *(__IO uint32_t *) tmp = Data; - - /* Return function status */ - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup DAC_Exported_Functions_Group4 Peripheral State and Errors functions - * @brief Peripheral State and Errors functions - * -@verbatim - ============================================================================== - ##### Peripheral State and Errors functions ##### - ============================================================================== - [..] - This subsection provides functions allowing to - (+) Check the DAC state. - (+) Check the DAC Errors. - -@endverbatim - * @{ - */ - -/** - * @brief return the DAC state - * @param hdac: pointer to a DAC_HandleTypeDef structure that contains - * the configuration information for the specified DAC. - * @retval HAL state - */ -HAL_DAC_StateTypeDef HAL_DAC_GetState(DAC_HandleTypeDef* hdac) -{ - /* Return DAC state */ - return hdac->State; -} - - -/** - * @brief Return the DAC error code - * @param hdac: pointer to a DAC_HandleTypeDef structure that contains - * the configuration information for the specified DAC. - * @retval DAC Error Code - */ -uint32_t HAL_DAC_GetError(DAC_HandleTypeDef *hdac) -{ - return hdac->ErrorCode; -} - -/** - * @} - */ - -/** - * @brief DMA conversion complete callback. - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void DAC_DMAConvCpltCh1(DMA_HandleTypeDef *hdma) -{ - DAC_HandleTypeDef* hdac = ( DAC_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; - - HAL_DAC_ConvCpltCallbackCh1(hdac); - - hdac->State= HAL_DAC_STATE_READY; -} - -/** - * @brief DMA half transfer complete callback. - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void DAC_DMAHalfConvCpltCh1(DMA_HandleTypeDef *hdma) -{ - DAC_HandleTypeDef* hdac = ( DAC_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; - /* Conversion complete callback */ - HAL_DAC_ConvHalfCpltCallbackCh1(hdac); -} - -/** - * @brief DMA error callback - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void DAC_DMAErrorCh1(DMA_HandleTypeDef *hdma) -{ - DAC_HandleTypeDef* hdac = ( DAC_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; - - /* Set DAC error code to DMA error */ - hdac->ErrorCode |= HAL_DAC_ERROR_DMA; - - HAL_DAC_ErrorCallbackCh1(hdac); - - hdac->State= HAL_DAC_STATE_READY; -} - -/** - * @} - */ - -#endif /* HAL_DAC_MODULE_ENABLED */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_dcmi.c b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_dcmi.c deleted file mode 100755 index e71900c1..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_dcmi.c +++ /dev/null @@ -1,826 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_hal_dcmi.c - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief DCMI HAL module driver - * This file provides firmware functions to manage the following - * functionalities of the Digital Camera Interface (DCMI) peripheral: - * + Initialization and de-initialization functions - * + IO operation functions - * + Peripheral Control functions - * + Peripheral State and Error functions - * - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - The sequence below describes how to use this driver to capture image - from a camera module connected to the DCMI Interface. - This sequence does not take into account the configuration of the - camera module, which should be made before to configure and enable - the DCMI to capture images. - - (#) Program the required configuration through following parameters: - horizontal and vertical polarity, pixel clock polarity, Capture Rate, - Synchronization Mode, code of the frame delimiter and data width - using HAL_DCMI_Init() function. - - (#) Configure the DMA2_Stream1 channel1 to transfer Data from DCMI DR - register to the destination memory buffer. - - (#) Program the required configuration through following parameters: - DCMI mode, destination memory Buffer address and the data length - and enable capture using HAL_DCMI_Start_DMA() function. - - (#) Optionally, configure and Enable the CROP feature to select a rectangular - window from the received image using HAL_DCMI_ConfigCrop() - and HAL_DCMI_EnableCROP() functions - - (#) The capture can be stopped using HAL_DCMI_Stop() function. - - (#) To control DCMI state you can use the function HAL_DCMI_GetState(). - - *** DCMI HAL driver macros list *** - ============================================= - [..] - Below the list of most used macros in DCMI HAL driver. - - (+) __HAL_DCMI_ENABLE: Enable the DCMI peripheral. - (+) __HAL_DCMI_DISABLE: Disable the DCMI peripheral. - (+) __HAL_DCMI_GET_FLAG: Get the DCMI pending flags. - (+) __HAL_DCMI_CLEAR_FLAG: Clear the DCMI pending flags. - (+) __HAL_DCMI_ENABLE_IT: Enable the specified DCMI interrupts. - (+) __HAL_DCMI_DISABLE_IT: Disable the specified DCMI interrupts. - (+) __HAL_DCMI_GET_IT_SOURCE: Check whether the specified DCMI interrupt has occurred or not. - - [..] - (@) You can refer to the DCMI HAL driver header file for more useful macros - - @endverbatim - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal.h" - -/** @addtogroup STM32F2xx_HAL_Driver - * @{ - */ -/** @defgroup DCMI DCMI - * @brief DCMI HAL module driver - * @{ - */ - -#ifdef HAL_DCMI_MODULE_ENABLED - -#if defined(STM32F207xx) || defined(STM32F217xx) -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -#define HAL_TIMEOUT_DCMI_STOP ((uint32_t)1000) /* 1s */ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -static void DCMI_DMAConvCplt(DMA_HandleTypeDef *hdma); -static void DCMI_DMAError(DMA_HandleTypeDef *hdma); - -/* Exported functions --------------------------------------------------------*/ - -/** @defgroup DCMI_Exported_Functions DCMI Exported Functions - * @{ - */ - -/** @defgroup DCMI_Exported_Functions_Group1 Initialization and Configuration functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - ##### Initialization and Configuration functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Initialize and configure the DCMI - (+) De-initialize the DCMI - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the DCMI according to the specified - * parameters in the DCMI_InitTypeDef and create the associated handle. - * @param hdcmi: pointer to a DCMI_HandleTypeDef structure that contains - * the configuration information for DCMI. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DCMI_Init(DCMI_HandleTypeDef *hdcmi) -{ - /* Check the DCMI peripheral state */ - if(hdcmi == NULL) - { - return HAL_ERROR; - } - - /* Check function parameters */ - assert_param(IS_DCMI_ALL_INSTANCE(hdcmi->Instance)); - assert_param(IS_DCMI_PCKPOLARITY(hdcmi->Init.PCKPolarity)); - assert_param(IS_DCMI_VSPOLARITY(hdcmi->Init.VSPolarity)); - assert_param(IS_DCMI_HSPOLARITY(hdcmi->Init.HSPolarity)); - assert_param(IS_DCMI_SYNCHRO(hdcmi->Init.SynchroMode)); - assert_param(IS_DCMI_CAPTURE_RATE(hdcmi->Init.CaptureRate)); - assert_param(IS_DCMI_EXTENDED_DATA(hdcmi->Init.ExtendedDataMode)); - assert_param(IS_DCMI_MODE_JPEG(hdcmi->Init.JPEGMode)); - - if(hdcmi->State == HAL_DCMI_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - hdcmi->Lock = HAL_UNLOCKED; - /* Init the low level hardware */ - HAL_DCMI_MspInit(hdcmi); - } - - /* Change the DCMI state */ - hdcmi->State = HAL_DCMI_STATE_BUSY; - /* Configures the HS, VS, DE and PC polarity */ - hdcmi->Instance->CR &= ~(DCMI_CR_PCKPOL | DCMI_CR_HSPOL | DCMI_CR_VSPOL | DCMI_CR_EDM_0 | - DCMI_CR_EDM_1 | DCMI_CR_FCRC_0 | DCMI_CR_FCRC_1 | DCMI_CR_JPEG | - DCMI_CR_ESS); - hdcmi->Instance->CR |= (uint32_t)(hdcmi->Init.SynchroMode | hdcmi->Init.CaptureRate | \ - hdcmi->Init.VSPolarity | hdcmi->Init.HSPolarity | \ - hdcmi->Init.PCKPolarity | hdcmi->Init.ExtendedDataMode | \ - hdcmi->Init.JPEGMode); - - if(hdcmi->Init.SynchroMode == DCMI_SYNCHRO_EMBEDDED) - { - DCMI->ESCR = (((uint32_t)hdcmi->Init.SyncroCode.FrameStartCode) | - ((uint32_t)hdcmi->Init.SyncroCode.LineStartCode << 8)| - ((uint32_t)hdcmi->Init.SyncroCode.LineEndCode << 16) | - ((uint32_t)hdcmi->Init.SyncroCode.FrameEndCode << 24)); - - } - - /* Enable the Line interrupt */ - __HAL_DCMI_ENABLE_IT(hdcmi, DCMI_IT_LINE); - - /* Enable the VSYNC interrupt */ - __HAL_DCMI_ENABLE_IT(hdcmi, DCMI_IT_VSYNC); - - /* Enable the Frame capture complete interrupt */ - __HAL_DCMI_ENABLE_IT(hdcmi, DCMI_IT_FRAME); - - /* Enable the Synchronization error interrupt */ - __HAL_DCMI_ENABLE_IT(hdcmi, DCMI_IT_ERR); - - /* Enable the Overflow interrupt */ - __HAL_DCMI_ENABLE_IT(hdcmi, DCMI_IT_OVF); - - /* Enable DCMI by setting DCMIEN bit */ - __HAL_DCMI_ENABLE(hdcmi); - - /* Update error code */ - hdcmi->ErrorCode = HAL_DCMI_ERROR_NONE; - - /* Initialize the DCMI state*/ - hdcmi->State = HAL_DCMI_STATE_READY; - - return HAL_OK; -} - -/** - * @brief Deinitializes the DCMI peripheral registers to their default reset - * values. - * @param hdcmi: pointer to a DCMI_HandleTypeDef structure that contains - * the configuration information for DCMI. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DCMI_DeInit(DCMI_HandleTypeDef *hdcmi) -{ - /* DeInit the low level hardware */ - HAL_DCMI_MspDeInit(hdcmi); - - /* Update error code */ - hdcmi->ErrorCode = HAL_DCMI_ERROR_NONE; - - /* Initialize the DCMI state*/ - hdcmi->State = HAL_DCMI_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(hdcmi); - - return HAL_OK; -} - -/** - * @brief Initializes the DCMI MSP. - * @param hdcmi: pointer to a DCMI_HandleTypeDef structure that contains - * the configuration information for DCMI. - * @retval None - */ -__weak void HAL_DCMI_MspInit(DCMI_HandleTypeDef* hdcmi) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_DCMI_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes the DCMI MSP. - * @param hdcmi: pointer to a DCMI_HandleTypeDef structure that contains - * the configuration information for DCMI. - * @retval None - */ -__weak void HAL_DCMI_MspDeInit(DCMI_HandleTypeDef* hdcmi) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_DCMI_MspDeInit could be implemented in the user file - */ -} - -/** - * @} - */ -/** @defgroup DCMI_Exported_Functions_Group2 IO operation functions - * @brief IO operation functions - * -@verbatim - =============================================================================== - ##### IO operation functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Configure destination address and data length and - Enables DCMI DMA request and enables DCMI capture - (+) Stop the DCMI capture. - (+) Handles DCMI interrupt request. - -@endverbatim - * @{ - */ - -/** - * @brief Enables DCMI DMA request and enables DCMI capture - * @param hdcmi: pointer to a DCMI_HandleTypeDef structure that contains - * the configuration information for DCMI. - * @param DCMI_Mode: DCMI capture mode snapshot or continuous grab. - * @param pData: The destination memory Buffer address (LCD Frame buffer). - * @param Length: The length of capture to be transferred. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DCMI_Start_DMA(DCMI_HandleTypeDef* hdcmi, uint32_t DCMI_Mode, uint32_t pData, uint32_t Length) -{ - /* Initialize the second memory address */ - uint32_t SecondMemAddress = 0; - - /* Check function parameters */ - assert_param(IS_DCMI_CAPTURE_MODE(DCMI_Mode)); - - /* Process Locked */ - __HAL_LOCK(hdcmi); - - /* Lock the DCMI peripheral state */ - hdcmi->State = HAL_DCMI_STATE_BUSY; - - /* Check the parameters */ - assert_param(IS_DCMI_CAPTURE_MODE(DCMI_Mode)); - - /* Configure the DCMI Mode */ - hdcmi->Instance->CR &= ~(DCMI_CR_CM); - hdcmi->Instance->CR |= (uint32_t)(DCMI_Mode); - - /* Set the DMA memory0 conversion complete callback */ - hdcmi->DMA_Handle->XferCpltCallback = DCMI_DMAConvCplt; - - /* Set the DMA error callback */ - hdcmi->DMA_Handle->XferErrorCallback = DCMI_DMAError; - - if(Length <= 0xFFFF) - { - /* Enable the DMA Stream */ - HAL_DMA_Start_IT(hdcmi->DMA_Handle, (uint32_t)&hdcmi->Instance->DR, (uint32_t)pData, Length); - } - else /* DCMI_DOUBLE_BUFFER Mode */ - { - /* Set the DMA memory1 conversion complete callback */ - hdcmi->DMA_Handle->XferM1CpltCallback = DCMI_DMAConvCplt; - - /* Initialize transfer parameters */ - hdcmi->XferCount = 1; - hdcmi->XferSize = Length; - hdcmi->pBuffPtr = pData; - - /* Get the number of buffer */ - while(hdcmi->XferSize > 0xFFFF) - { - hdcmi->XferSize = (hdcmi->XferSize/2); - hdcmi->XferCount = hdcmi->XferCount*2; - } - - /* Update DCMI counter and transfer number*/ - hdcmi->XferCount = (hdcmi->XferCount - 2); - hdcmi->XferTransferNumber = hdcmi->XferCount; - - /* Update second memory address */ - SecondMemAddress = (uint32_t)(pData + (4*hdcmi->XferSize)); - - /* Start DMA multi buffer transfer */ - HAL_DMAEx_MultiBufferStart_IT(hdcmi->DMA_Handle, (uint32_t)&hdcmi->Instance->DR, (uint32_t)pData, SecondMemAddress, hdcmi->XferSize); - } - - /* Enable Capture */ - DCMI->CR |= DCMI_CR_CAPTURE; - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Disable DCMI DMA request and Disable DCMI capture - * @param hdcmi: pointer to a DCMI_HandleTypeDef structure that contains - * the configuration information for DCMI. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DCMI_Stop(DCMI_HandleTypeDef* hdcmi) -{ - uint32_t tickstart = 0; - - /* Lock the DCMI peripheral state */ - hdcmi->State = HAL_DCMI_STATE_BUSY; - - __HAL_DCMI_DISABLE(hdcmi); - - /* Disable Capture */ - DCMI->CR &= ~(DCMI_CR_CAPTURE); - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Check if the DCMI capture effectively disabled */ - while((hdcmi->Instance->CR & DCMI_CR_CAPTURE) != 0) - { - if((HAL_GetTick() - tickstart ) > HAL_TIMEOUT_DCMI_STOP) - { - /* Process Unlocked */ - __HAL_UNLOCK(hdcmi); - - /* Update error code */ - hdcmi->ErrorCode |= HAL_DCMI_ERROR_TIMEOUT; - - /* Change DCMI state */ - hdcmi->State = HAL_DCMI_STATE_TIMEOUT; - - return HAL_TIMEOUT; - } - } - - /* Disable the DMA */ - HAL_DMA_Abort(hdcmi->DMA_Handle); - - /* Update error code */ - hdcmi->ErrorCode |= HAL_DCMI_ERROR_NONE; - - /* Change DCMI state */ - hdcmi->State = HAL_DCMI_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hdcmi); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Handles DCMI interrupt request. - * @param hdcmi: pointer to a DCMI_HandleTypeDef structure that contains - * the configuration information for the DCMI. - * @retval None - */ -void HAL_DCMI_IRQHandler(DCMI_HandleTypeDef *hdcmi) -{ - /* Synchronization error interrupt management *******************************/ - if(__HAL_DCMI_GET_FLAG(hdcmi, DCMI_FLAG_ERRRI) != RESET) - { - if(__HAL_DCMI_GET_IT_SOURCE(hdcmi, DCMI_IT_ERR) != RESET) - { - /* Disable the Synchronization error interrupt */ - __HAL_DCMI_DISABLE_IT(hdcmi, DCMI_IT_ERR); - - /* Clear the Synchronization error flag */ - __HAL_DCMI_CLEAR_FLAG(hdcmi, DCMI_FLAG_ERRRI); - - /* Update error code */ - hdcmi->ErrorCode |= HAL_DCMI_ERROR_SYNC; - - /* Change DCMI state */ - hdcmi->State = HAL_DCMI_STATE_ERROR; - - /* Process Unlocked */ - __HAL_UNLOCK(hdcmi); - - /* Abort the DMA Transfer */ - HAL_DMA_Abort(hdcmi->DMA_Handle); - - /* Synchronization error Callback */ - HAL_DCMI_ErrorCallback(hdcmi); - } - } - /* Overflow interrupt management ********************************************/ - if(__HAL_DCMI_GET_FLAG(hdcmi, DCMI_FLAG_OVFRI) != RESET) - { - if(__HAL_DCMI_GET_IT_SOURCE(hdcmi, DCMI_IT_OVF) != RESET) - { - /* Disable the Overflow interrupt */ - __HAL_DCMI_DISABLE_IT(hdcmi, DCMI_IT_OVF); - - /* Clear the Overflow flag */ - __HAL_DCMI_CLEAR_FLAG(hdcmi, DCMI_FLAG_OVFRI); - - /* Update error code */ - hdcmi->ErrorCode |= HAL_DCMI_ERROR_OVF; - - /* Change DCMI state */ - hdcmi->State = HAL_DCMI_STATE_ERROR; - - /* Process Unlocked */ - __HAL_UNLOCK(hdcmi); - - /* Abort the DMA Transfer */ - HAL_DMA_Abort(hdcmi->DMA_Handle); - - /* Overflow Callback */ - HAL_DCMI_ErrorCallback(hdcmi); - } - } - /* Line Interrupt management ************************************************/ - if(__HAL_DCMI_GET_FLAG(hdcmi, DCMI_FLAG_LINERI) != RESET) - { - if(__HAL_DCMI_GET_IT_SOURCE(hdcmi, DCMI_IT_LINE) != RESET) - { - /* Clear the Line interrupt flag */ - __HAL_DCMI_CLEAR_FLAG(hdcmi, DCMI_FLAG_LINERI); - - /* Process Unlocked */ - __HAL_UNLOCK(hdcmi); - - /* Line interrupt Callback */ - HAL_DCMI_LineEventCallback(hdcmi); - } - } - /* VSYNC interrupt management ***********************************************/ - if(__HAL_DCMI_GET_FLAG(hdcmi, DCMI_FLAG_VSYNCRI) != RESET) - { - if(__HAL_DCMI_GET_IT_SOURCE(hdcmi, DCMI_IT_VSYNC) != RESET) - { - /* Disable the VSYNC interrupt */ - __HAL_DCMI_DISABLE_IT(hdcmi, DCMI_IT_VSYNC); - - /* Clear the VSYNC flag */ - __HAL_DCMI_CLEAR_FLAG(hdcmi, DCMI_FLAG_VSYNCRI); - - /* Process Unlocked */ - __HAL_UNLOCK(hdcmi); - - /* VSYNC Callback */ - HAL_DCMI_VsyncEventCallback(hdcmi); - } - } - /* End of Frame interrupt management ****************************************/ - if(__HAL_DCMI_GET_FLAG(hdcmi, DCMI_FLAG_FRAMERI) != RESET) - { - if(__HAL_DCMI_GET_IT_SOURCE(hdcmi, DCMI_IT_FRAME) != RESET) - { - /* Disable the End of Frame interrupt */ - __HAL_DCMI_DISABLE_IT(hdcmi, DCMI_IT_FRAME); - - /* Clear the End of Frame flag */ - __HAL_DCMI_CLEAR_FLAG(hdcmi, DCMI_FLAG_FRAMERI); - - /* Process Unlocked */ - __HAL_UNLOCK(hdcmi); - - /* End of Frame Callback */ - HAL_DCMI_FrameEventCallback(hdcmi); - } - } -} - -/** - * @brief Error DCMI callback. - * @param hdcmi: pointer to a DCMI_HandleTypeDef structure that contains - * the configuration information for DCMI. - * @retval None - */ -__weak void HAL_DCMI_ErrorCallback(DCMI_HandleTypeDef *hdcmi) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_DCMI_ErrorCallback could be implemented in the user file - */ -} - -/** - * @brief Line Event callback. - * @param hdcmi: pointer to a DCMI_HandleTypeDef structure that contains - * the configuration information for DCMI. - * @retval None - */ -__weak void HAL_DCMI_LineEventCallback(DCMI_HandleTypeDef *hdcmi) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_DCMI_LineEventCallback could be implemented in the user file - */ -} - -/** - * @brief VSYNC Event callback. - * @param hdcmi: pointer to a DCMI_HandleTypeDef structure that contains - * the configuration information for DCMI. - * @retval None - */ -__weak void HAL_DCMI_VsyncEventCallback(DCMI_HandleTypeDef *hdcmi) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_DCMI_VsyncEventCallback could be implemented in the user file - */ -} - -/** - * @brief Frame Event callback. - * @param hdcmi: pointer to a DCMI_HandleTypeDef structure that contains - * the configuration information for DCMI. - * @retval None - */ -__weak void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_DCMI_FrameEventCallback could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup DCMI_Exported_Functions_Group3 Peripheral Control functions - * @brief Peripheral Control functions - * -@verbatim - =============================================================================== - ##### Peripheral Control functions ##### - =============================================================================== -[..] This section provides functions allowing to: - (+) Configure the CROP feature. - (+) Enable/Disable the CROP feature. - -@endverbatim - * @{ - */ - -/** - * @brief Configure the DCMI CROP coordinate. - * @param hdcmi: pointer to a DCMI_HandleTypeDef structure that contains - * the configuration information for DCMI. - * @param X0: DCMI window X offset - * @param Y0: DCMI window Y offset - * @param XSize: DCMI Pixel per line - * @param YSize: DCMI Line number - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DCMI_ConfigCROP(DCMI_HandleTypeDef *hdcmi, uint32_t X0, uint32_t Y0, uint32_t XSize, uint32_t YSize) -{ - /* Process Locked */ - __HAL_LOCK(hdcmi); - - /* Lock the DCMI peripheral state */ - hdcmi->State = HAL_DCMI_STATE_BUSY; - - /* Check the parameters */ - assert_param(IS_DCMI_WINDOW_COORDINATE(X0)); - assert_param(IS_DCMI_WINDOW_COORDINATE(YSize)); - assert_param(IS_DCMI_WINDOW_COORDINATE(XSize)); - assert_param(IS_DCMI_WINDOW_HEIGHT(Y0)); - - /* Configure CROP */ - DCMI->CWSIZER = (XSize | (YSize << 16)); - DCMI->CWSTRTR = (X0 | (Y0 << 16)); - - /* Initialize the DCMI state*/ - hdcmi->State = HAL_DCMI_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hdcmi); - - return HAL_OK; -} - -/** - * @brief Disable the Crop feature. - * @param hdcmi: pointer to a DCMI_HandleTypeDef structure that contains - * the configuration information for DCMI. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DCMI_DisableCROP(DCMI_HandleTypeDef *hdcmi) -{ - /* Process Locked */ - __HAL_LOCK(hdcmi); - - /* Lock the DCMI peripheral state */ - hdcmi->State = HAL_DCMI_STATE_BUSY; - - /* Disable DCMI Crop feature */ - DCMI->CR &= ~(uint32_t)DCMI_CR_CROP; - - /* Change the DCMI state*/ - hdcmi->State = HAL_DCMI_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hdcmi); - - return HAL_OK; -} - -/** - * @brief Enable the Crop feature. - * @param hdcmi: pointer to a DCMI_HandleTypeDef structure that contains - * the configuration information for DCMI. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_DCMI_EnableCROP(DCMI_HandleTypeDef *hdcmi) -{ - /* Process Locked */ - __HAL_LOCK(hdcmi); - - /* Lock the DCMI peripheral state */ - hdcmi->State = HAL_DCMI_STATE_BUSY; - - /* Enable DCMI Crop feature */ - DCMI->CR |= (uint32_t)DCMI_CR_CROP; - - /* Change the DCMI state*/ - hdcmi->State = HAL_DCMI_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hdcmi); - - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup DCMI_Exported_Functions_Group4 Peripheral State functions - * @brief Peripheral State functions - * -@verbatim - =============================================================================== - ##### Peripheral State and Errors functions ##### - =============================================================================== - [..] - This subsection provides functions allowing to - (+) Check the DCMI state. - (+) Get the specific DCMI error flag. - -@endverbatim - * @{ - */ - -/** - * @brief Return the DCMI state - * @param hdcmi: pointer to a DCMI_HandleTypeDef structure that contains - * the configuration information for DCMI. - * @retval HAL state - */ -HAL_DCMI_StateTypeDef HAL_DCMI_GetState(DCMI_HandleTypeDef *hdcmi) -{ - return hdcmi->State; -} - -/** - * @brief Return the DCMI error code - * @param hdcmi : pointer to a DCMI_HandleTypeDef structure that contains - * the configuration information for DCMI. - * @retval DCMI Error Code - */ -uint32_t HAL_DCMI_GetError(DCMI_HandleTypeDef *hdcmi) -{ - return hdcmi->ErrorCode; -} - -/** - * @} - */ -/* Private functions ---------------------------------------------------------*/ -/** @defgroup DCMI_Private_Functions DCMI Private Functions - * @{ - */ - - /** - * @brief DMA conversion complete callback. - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void DCMI_DMAConvCplt(DMA_HandleTypeDef *hdma) -{ - uint32_t tmp = 0; - - DCMI_HandleTypeDef* hdcmi = ( DCMI_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; - hdcmi->State= HAL_DCMI_STATE_READY; - - if(hdcmi->XferCount != 0) - { - /* Update memory 0 address location */ - tmp = ((hdcmi->DMA_Handle->Instance->CR) & DMA_SxCR_CT); - if(((hdcmi->XferCount % 2) == 0) && (tmp != 0)) - { - tmp = hdcmi->DMA_Handle->Instance->M0AR; - HAL_DMAEx_ChangeMemory(hdcmi->DMA_Handle, (tmp + (8*hdcmi->XferSize)), MEMORY0); - hdcmi->XferCount--; - } - /* Update memory 1 address location */ - else if((hdcmi->DMA_Handle->Instance->CR & DMA_SxCR_CT) == 0) - { - tmp = hdcmi->DMA_Handle->Instance->M1AR; - HAL_DMAEx_ChangeMemory(hdcmi->DMA_Handle, (tmp + (8*hdcmi->XferSize)), MEMORY1); - hdcmi->XferCount--; - } - } - /* Update memory 0 address location */ - else if((hdcmi->DMA_Handle->Instance->CR & DMA_SxCR_CT) != 0) - { - hdcmi->DMA_Handle->Instance->M0AR = hdcmi->pBuffPtr; - } - /* Update memory 1 address location */ - else if((hdcmi->DMA_Handle->Instance->CR & DMA_SxCR_CT) == 0) - { - tmp = hdcmi->pBuffPtr; - hdcmi->DMA_Handle->Instance->M1AR = (tmp + (4*hdcmi->XferSize)); - hdcmi->XferCount = hdcmi->XferTransferNumber; - } - - if(__HAL_DCMI_GET_FLAG(hdcmi, DCMI_FLAG_FRAMERI) != RESET) - { - /* Process Unlocked */ - __HAL_UNLOCK(hdcmi); - - /* FRAME Callback */ - HAL_DCMI_FrameEventCallback(hdcmi); - } -} - -/** - * @brief DMA error callback - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void DCMI_DMAError(DMA_HandleTypeDef *hdma) -{ - DCMI_HandleTypeDef* hdcmi = ( DCMI_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; - hdcmi->State= HAL_DCMI_STATE_READY; - HAL_DCMI_ErrorCallback(hdcmi); -} -/** - * @} - */ - -/** - * @} - */ -#endif /* STM32F207xx || STM32F217xx */ -#endif /* HAL_DCMI_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_hash.c b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_hash.c deleted file mode 100755 index 3b728ea9..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_hash.c +++ /dev/null @@ -1,1851 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_hal_hash.c - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief HASH HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the HASH peripheral: - * + Initialization and de-initialization functions - * + HASH/HMAC Processing functions by algorithm using polling mode - * + HASH/HMAC functions by algorithm using interrupt mode - * + HASH/HMAC functions by algorithm using DMA mode - * + Peripheral State functions - * - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - The HASH HAL driver can be used as follows: - (#)Initialize the HASH low level resources by implementing the HAL_HASH_MspInit(): - (##) Enable the HASH interface clock using __HAL_RCC_HASH_CLK_ENABLE() - (##) In case of using processing APIs based on interrupts (e.g. HAL_HMAC_SHA1_Start_IT()) - (+++) Configure the HASH interrupt priority using HAL_NVIC_SetPriority() - (+++) Enable the HASH IRQ handler using HAL_NVIC_EnableIRQ() - (+++) In HASH IRQ handler, call HAL_HASH_IRQHandler() - (##) In case of using DMA to control data transfer (e.g. HAL_HMAC_SHA1_Start_DMA()) - (+++) Enable the DMAx interface clock using __DMAx_CLK_ENABLE() - (+++) Configure and enable one DMA stream one for managing data transfer from - memory to peripheral (input stream). Managing data transfer from - peripheral to memory can be performed only using CPU - (+++) Associate the initialized DMA handle to the HASH DMA handle - using __HAL_LINKDMA() - (+++) Configure the priority and enable the NVIC for the transfer complete - interrupt on the DMA Stream using HAL_NVIC_SetPriority() and HAL_NVIC_EnableIRQ() - (#)Initialize the HASH HAL using HAL_HASH_Init(). This function configures mainly: - (##) The data type: 1-bit, 8-bit, 16-bit and 32-bit. - (##) For HMAC, the encryption key. - (##) For HMAC, the key size used for encryption. - (#)Three processing functions are available: - (##) Polling mode: processing APIs are blocking functions - i.e. they process the data and wait till the digest computation is finished - e.g. HAL_HASH_SHA1_Start() - (##) Interrupt mode: encryption and decryption APIs are not blocking functions - i.e. they process the data under interrupt - e.g. HAL_HASH_SHA1_Start_IT() - (##) DMA mode: processing APIs are not blocking functions and the CPU is - not used for data transfer i.e. the data transfer is ensured by DMA - e.g. HAL_HASH_SHA1_Start_DMA() - (#)When the processing function is called at first time after HAL_HASH_Init() - the HASH peripheral is initialized and processes the buffer in input. - After that, the digest computation is started. - When processing multi-buffer use the accumulate function to write the - data in the peripheral without starting the digest computation. In last - buffer use the start function to input the last buffer ans start the digest - computation. - (##) e.g. HAL_HASH_SHA1_Accumulate() : write 1st data buffer in the peripheral without starting the digest computation - (##) write (n-1)th data buffer in the peripheral without starting the digest computation - (##) HAL_HASH_SHA1_Start() : write (n)th data buffer in the peripheral and start the digest computation - (#)In HMAC mode, there is no Accumulate API. Only Start API is available. - (#)In case of using DMA, call the DMA start processing e.g. HAL_HASH_SHA1_Start_DMA(). - After that, call the finish function in order to get the digest value - e.g. HAL_HASH_SHA1_Finish() - (#)Call HAL_HASH_DeInit() to deinitialize the HASH peripheral. - - @endverbatim - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal.h" - -/** @addtogroup STM32F2xx_HAL_Driver - * @{ - */ - -/** @defgroup HASH HASH - * @brief HASH HAL module driver. - * @{ - */ - -#ifdef HAL_HASH_MODULE_ENABLED - -#if defined(STM32F215xx) || defined(STM32F217xx) - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/** @defgroup HASH_Private_Functions HASH Private Functions - * @{ - */ -static void HASH_DMAXferCplt(DMA_HandleTypeDef *hdma); -static void HASH_DMAError(DMA_HandleTypeDef *hdma); -static void HASH_GetDigest(uint8_t *pMsgDigest, uint8_t Size); -static void HASH_WriteData(uint8_t *pInBuffer, uint32_t Size); -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @addtogroup HASH_Private_Functions - * @{ - */ - -/** - * @brief DMA HASH Input Data complete callback. - * @param hdma: DMA handle - * @retval None - */ -static void HASH_DMAXferCplt(DMA_HandleTypeDef *hdma) -{ - HASH_HandleTypeDef* hhash = ( HASH_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; - uint32_t inputaddr = 0; - uint32_t buffersize = 0; - - if((HASH->CR & HASH_CR_MODE) != HASH_CR_MODE) - { - /* Disable the DMA transfer */ - HASH->CR &= (uint32_t)(~HASH_CR_DMAE); - - /* Change HASH peripheral state */ - hhash->State = HAL_HASH_STATE_READY; - - /* Call Input data transfer complete callback */ - HAL_HASH_InCpltCallback(hhash); - } - else - { - /* Increment Interrupt counter */ - hhash->HashInCount++; - /* Disable the DMA transfer before starting the next transfer */ - HASH->CR &= (uint32_t)(~HASH_CR_DMAE); - - if(hhash->HashInCount <= 2) - { - /* In case HashInCount = 1, set the DMA to transfer data to HASH DIN register */ - if(hhash->HashInCount == 1) - { - inputaddr = (uint32_t)hhash->pHashInBuffPtr; - buffersize = hhash->HashBuffSize; - } - /* In case HashInCount = 2, set the DMA to transfer key to HASH DIN register */ - else if(hhash->HashInCount == 2) - { - inputaddr = (uint32_t)hhash->Init.pKey; - buffersize = hhash->Init.KeySize; - } - /* Configure the number of valid bits in last word of the message */ - MODIFY_REG(HASH->STR, HASH_STR_NBLW, 8 * (buffersize % 4)); - - /* Set the HASH DMA transfer complete */ - hhash->hdmain->XferCpltCallback = HASH_DMAXferCplt; - - /* Enable the DMA In DMA Stream */ - HAL_DMA_Start_IT(hhash->hdmain, inputaddr, (uint32_t)&HASH->DIN, (buffersize%4 ? (buffersize+3)/4:buffersize/4)); - - /* Enable DMA requests */ - HASH->CR |= (HASH_CR_DMAE); - } - else - { - /* Disable the DMA transfer */ - HASH->CR &= (uint32_t)(~HASH_CR_DMAE); - - /* Reset the InCount */ - hhash->HashInCount = 0; - - /* Change HASH peripheral state */ - hhash->State = HAL_HASH_STATE_READY; - - /* Call Input data transfer complete callback */ - HAL_HASH_InCpltCallback(hhash); - } - } -} - -/** - * @brief DMA HASH communication error callback. - * @param hdma: DMA handle - * @retval None - */ -static void HASH_DMAError(DMA_HandleTypeDef *hdma) -{ - HASH_HandleTypeDef* hhash = ( HASH_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; - hhash->State= HAL_HASH_STATE_READY; - HAL_HASH_ErrorCallback(hhash); -} - -/** - * @brief Writes the input buffer in data register. - * @param pInBuffer: Pointer to input buffer - * @param Size: The size of input buffer - * @retval None - */ -static void HASH_WriteData(uint8_t *pInBuffer, uint32_t Size) -{ - uint32_t buffercounter; - uint32_t inputaddr = (uint32_t) pInBuffer; - - for(buffercounter = 0; buffercounter < Size; buffercounter+=4) - { - HASH->DIN = *(uint32_t*)inputaddr; - inputaddr+=4; - } -} - -/** - * @brief Provides the message digest result. - * @param pMsgDigest: Pointer to the message digest - * @param Size: The size of the message digest in bytes - * @retval None - */ -static void HASH_GetDigest(uint8_t *pMsgDigest, uint8_t Size) -{ - uint32_t msgdigest = (uint32_t)pMsgDigest; - - switch(Size) - { - case 16: - /* Read the message digest */ - *(uint32_t*)(msgdigest) = __REV(HASH->HR[0]); - msgdigest+=4; - *(uint32_t*)(msgdigest) = __REV(HASH->HR[1]); - msgdigest+=4; - *(uint32_t*)(msgdigest) = __REV(HASH->HR[2]); - msgdigest+=4; - *(uint32_t*)(msgdigest) = __REV(HASH->HR[3]); - break; - case 20: - /* Read the message digest */ - *(uint32_t*)(msgdigest) = __REV(HASH->HR[0]); - msgdigest+=4; - *(uint32_t*)(msgdigest) = __REV(HASH->HR[1]); - msgdigest+=4; - *(uint32_t*)(msgdigest) = __REV(HASH->HR[2]); - msgdigest+=4; - *(uint32_t*)(msgdigest) = __REV(HASH->HR[3]); - msgdigest+=4; - *(uint32_t*)(msgdigest) = __REV(HASH->HR[4]); - break; - case 28: - /* Read the message digest */ - *(uint32_t*)(msgdigest) = __REV(HASH->HR[0]); - msgdigest+=4; - *(uint32_t*)(msgdigest) = __REV(HASH->HR[1]); - msgdigest+=4; - *(uint32_t*)(msgdigest) = __REV(HASH->HR[2]); - msgdigest+=4; - *(uint32_t*)(msgdigest) = __REV(HASH->HR[3]); - msgdigest+=4; - *(uint32_t*)(msgdigest) = __REV(HASH->HR[4]); - break; - case 32: - /* Read the message digest */ - *(uint32_t*)(msgdigest) = __REV(HASH->HR[0]); - msgdigest+=4; - *(uint32_t*)(msgdigest) = __REV(HASH->HR[1]); - msgdigest+=4; - *(uint32_t*)(msgdigest) = __REV(HASH->HR[2]); - msgdigest+=4; - *(uint32_t*)(msgdigest) = __REV(HASH->HR[3]); - msgdigest+=4; - *(uint32_t*)(msgdigest) = __REV(HASH->HR[4]); - break; - default: - break; - } -} - -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup HASH_Exported_Functions - * @{ - */ - - -/** @addtogroup HASH_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions. - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Initialize the HASH according to the specified parameters - in the HASH_InitTypeDef and creates the associated handle. - (+) DeInitialize the HASH peripheral. - (+) Initialize the HASH MSP. - (+) DeInitialize HASH MSP. - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the HASH according to the specified parameters in the - HASH_HandleTypeDef and creates the associated handle. - * @param hhash: pointer to a HASH_HandleTypeDef structure that contains - * the configuration information for HASH module - * @retval HAL status - */ -HAL_StatusTypeDef HAL_HASH_Init(HASH_HandleTypeDef *hhash) -{ - /* Check the hash handle allocation */ - if(hhash == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_HASH_DATATYPE(hhash->Init.DataType)); - - if(hhash->State == HAL_HASH_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - hhash->Lock = HAL_UNLOCKED; - /* Init the low level hardware */ - HAL_HASH_MspInit(hhash); - } - - /* Change the HASH state */ - hhash->State = HAL_HASH_STATE_BUSY; - - /* Reset HashInCount, HashBuffSize and HashITCounter */ - hhash->HashInCount = 0; - hhash->HashBuffSize = 0; - hhash->HashITCounter = 0; - - /* Set the data type */ - HASH->CR |= (uint32_t) (hhash->Init.DataType); - - /* Change the HASH state */ - hhash->State = HAL_HASH_STATE_READY; - - /* Set the default HASH phase */ - hhash->Phase = HAL_HASH_PHASE_READY; - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief DeInitializes the HASH peripheral. - * @note This API must be called before starting a new processing. - * @param hhash: pointer to a HASH_HandleTypeDef structure that contains - * the configuration information for HASH module - * @retval HAL status - */ -HAL_StatusTypeDef HAL_HASH_DeInit(HASH_HandleTypeDef *hhash) -{ - /* Check the HASH handle allocation */ - if(hhash == NULL) - { - return HAL_ERROR; - } - - /* Change the HASH state */ - hhash->State = HAL_HASH_STATE_BUSY; - - /* Set the default HASH phase */ - hhash->Phase = HAL_HASH_PHASE_READY; - - /* Reset HashInCount, HashBuffSize and HashITCounter */ - hhash->HashInCount = 0; - hhash->HashBuffSize = 0; - hhash->HashITCounter = 0; - - /* DeInit the low level hardware */ - HAL_HASH_MspDeInit(hhash); - - /* Change the HASH state */ - hhash->State = HAL_HASH_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(hhash); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Initializes the HASH MSP. - * @param hhash: pointer to a HASH_HandleTypeDef structure that contains - * the configuration information for HASH module - * @retval None - */ -__weak void HAL_HASH_MspInit(HASH_HandleTypeDef *hhash) -{ - /* NOTE: This function Should not be modified, when the callback is needed, - the HAL_HASH_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes HASH MSP. - * @param hhash: pointer to a HASH_HandleTypeDef structure that contains - * the configuration information for HASH module - * @retval None - */ -__weak void HAL_HASH_MspDeInit(HASH_HandleTypeDef *hhash) -{ - /* NOTE: This function Should not be modified, when the callback is needed, - the HAL_HASH_MspDeInit could be implemented in the user file - */ -} - -/** - * @brief Input data transfer complete callback. - * @param hhash: pointer to a HASH_HandleTypeDef structure that contains - * the configuration information for HASH module - * @retval None - */ - __weak void HAL_HASH_InCpltCallback(HASH_HandleTypeDef *hhash) -{ - /* NOTE: This function Should not be modified, when the callback is needed, - the HAL_HASH_InCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Data transfer Error callback. - * @param hhash: pointer to a HASH_HandleTypeDef structure that contains - * the configuration information for HASH module - * @retval None - */ - __weak void HAL_HASH_ErrorCallback(HASH_HandleTypeDef *hhash) -{ - /* NOTE: This function Should not be modified, when the callback is needed, - the HAL_HASH_ErrorCallback could be implemented in the user file - */ -} - -/** - * @brief Digest computation complete callback. It is used only with interrupt. - * @note This callback is not relevant with DMA. - * @param hhash: pointer to a HASH_HandleTypeDef structure that contains - * the configuration information for HASH module - * @retval None - */ - __weak void HAL_HASH_DgstCpltCallback(HASH_HandleTypeDef *hhash) -{ - /* NOTE: This function Should not be modified, when the callback is needed, - the HAL_HASH_DgstCpltCallback could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup HASH_Exported_Functions_Group2 HASH processing functions using polling mode - * @brief processing functions using polling mode - * -@verbatim - =============================================================================== - ##### HASH processing using polling mode functions##### - =============================================================================== - [..] This section provides functions allowing to calculate in polling mode - the hash value using one of the following algorithms: - (+) MD5 - (+) SHA1 - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the HASH peripheral in MD5 mode then processes pInBuffer. - The digest is available in pOutBuffer. - * @param hhash: pointer to a HASH_HandleTypeDef structure that contains - * the configuration information for HASH module - * @param pInBuffer: Pointer to the input buffer (buffer to be hashed). - * @param Size: Length of the input buffer in bytes. - * If the Size is multiple of 64 bytes, appending the input buffer is possible. - * If the Size is not multiple of 64 bytes, the padding is managed by hardware - * and appending the input buffer is no more possible. - * @param pOutBuffer: Pointer to the computed digest. Its size must be 16 bytes. - * @param Timeout: Timeout value - * @retval HAL status - */ -HAL_StatusTypeDef HAL_HASH_MD5_Start(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size, uint8_t* pOutBuffer, uint32_t Timeout) -{ - uint32_t tickstart = 0; - - /* Process Locked */ - __HAL_LOCK(hhash); - - /* Change the HASH state */ - hhash->State = HAL_HASH_STATE_BUSY; - - /* Check if initialization phase has already been performed */ - if(hhash->Phase == HAL_HASH_PHASE_READY) - { - /* Select the MD5 mode and reset the HASH processor core, so that the HASH will be ready to compute - the message digest of a new message */ - HASH->CR |= HASH_ALGOSELECTION_MD5 | HASH_CR_INIT; - } - - /* Set the phase */ - hhash->Phase = HAL_HASH_PHASE_PROCESS; - - /* Configure the number of valid bits in last word of the message */ - __HAL_HASH_SET_NBVALIDBITS(Size); - - /* Write input buffer in data register */ - HASH_WriteData(pInBuffer, Size); - - /* Start the digest calculation */ - __HAL_HASH_START_DIGEST(); - - /* Get tick */ - tickstart = HAL_GetTick(); - - while(HAL_IS_BIT_SET(HASH->SR, HASH_FLAG_BUSY)) - { - /* Check for the Timeout */ - if(Timeout != HAL_MAX_DELAY) - { - if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout)) - { - /* Change state */ - hhash->State = HAL_HASH_STATE_TIMEOUT; - - /* Process Unlocked */ - __HAL_UNLOCK(hhash); - - return HAL_TIMEOUT; - } - } - } - - /* Read the message digest */ - HASH_GetDigest(pOutBuffer, 16); - - /* Change the HASH state */ - hhash->State = HAL_HASH_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hhash); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Initializes the HASH peripheral in MD5 mode then writes the pInBuffer. - * @param hhash: pointer to a HASH_HandleTypeDef structure that contains - * the configuration information for HASH module - * @param pInBuffer: Pointer to the input buffer (buffer to be hashed). - * @param Size: Length of the input buffer in bytes. - * If the Size is multiple of 64 bytes, appending the input buffer is possible. - * If the Size is not multiple of 64 bytes, the padding is managed by hardware - * and appending the input buffer is no more possible. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_HASH_MD5_Accumulate(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size) -{ - /* Process Locked */ - __HAL_LOCK(hhash); - - /* Change the HASH state */ - hhash->State = HAL_HASH_STATE_BUSY; - - /* Check if initialization phase has already been performed */ - if(hhash->Phase == HAL_HASH_PHASE_READY) - { - /* Select the MD5 mode and reset the HASH processor core, so that the HASH will be ready to compute - the message digest of a new message */ - HASH->CR |= HASH_ALGOSELECTION_MD5 | HASH_CR_INIT; - } - - /* Set the phase */ - hhash->Phase = HAL_HASH_PHASE_PROCESS; - - /* Configure the number of valid bits in last word of the message */ - __HAL_HASH_SET_NBVALIDBITS(Size); - - /* Write input buffer in data register */ - HASH_WriteData(pInBuffer, Size); - - /* Change the HASH state */ - hhash->State = HAL_HASH_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hhash); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Initializes the HASH peripheral in SHA1 mode then processes pInBuffer. - The digest is available in pOutBuffer. - * @param hhash: pointer to a HASH_HandleTypeDef structure that contains - * the configuration information for HASH module - * @param pInBuffer: Pointer to the input buffer (buffer to be hashed). - * @param Size: Length of the input buffer in bytes. - * If the Size is not multiple of 64 bytes, the padding is managed by hardware. - * @param pOutBuffer: Pointer to the computed digest. Its size must be 20 bytes. - * @param Timeout: Timeout value - * @retval HAL status - */ -HAL_StatusTypeDef HAL_HASH_SHA1_Start(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size, uint8_t* pOutBuffer, uint32_t Timeout) -{ - uint32_t tickstart = 0; - - /* Process Locked */ - __HAL_LOCK(hhash); - - /* Change the HASH state */ - hhash->State = HAL_HASH_STATE_BUSY; - - /* Check if initialization phase has already been performed */ - if(hhash->Phase == HAL_HASH_PHASE_READY) - { - /* Select the SHA1 mode and reset the HASH processor core, so that the HASH will be ready to compute - the message digest of a new message */ - HASH->CR |= HASH_ALGOSELECTION_SHA1 | HASH_CR_INIT; - } - - /* Set the phase */ - hhash->Phase = HAL_HASH_PHASE_PROCESS; - - /* Configure the number of valid bits in last word of the message */ - __HAL_HASH_SET_NBVALIDBITS(Size); - - /* Write input buffer in data register */ - HASH_WriteData(pInBuffer, Size); - - /* Start the digest calculation */ - __HAL_HASH_START_DIGEST(); - - /* Get tick */ - tickstart = HAL_GetTick(); - - while(HAL_IS_BIT_SET(HASH->SR, HASH_FLAG_BUSY)) - { - /* Check for the Timeout */ - if(Timeout != HAL_MAX_DELAY) - { - if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout)) - { - /* Change state */ - hhash->State = HAL_HASH_STATE_TIMEOUT; - - /* Process Unlocked */ - __HAL_UNLOCK(hhash); - - return HAL_TIMEOUT; - } - } - } - - /* Read the message digest */ - HASH_GetDigest(pOutBuffer, 20); - - /* Change the HASH state */ - hhash->State = HAL_HASH_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hhash); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Initializes the HASH peripheral in SHA1 mode then processes pInBuffer. - * @param hhash: pointer to a HASH_HandleTypeDef structure that contains - * the configuration information for HASH module - * @param pInBuffer: Pointer to the input buffer (buffer to be hashed). - * @param Size: Length of the input buffer in bytes. - * If the Size is not multiple of 64 bytes, the padding is managed by hardware. - * @note Input buffer size in bytes must be a multiple of 4 otherwise the digest computation is corrupted. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_HASH_SHA1_Accumulate(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size) -{ - - /* Check the parameters */ - assert_param(IS_HASH_SHA1_BUFFER_SIZE(Size)); - - /* Process Locked */ - __HAL_LOCK(hhash); - - /* Change the HASH state */ - hhash->State = HAL_HASH_STATE_BUSY; - - /* Check if initialization phase has already been performed */ - if(hhash->Phase == HAL_HASH_PHASE_READY) - { - /* Select the SHA1 mode and reset the HASH processor core, so that the HASH will be ready to compute - the message digest of a new message */ - HASH->CR |= HASH_ALGOSELECTION_SHA1 | HASH_CR_INIT; - } - - /* Set the phase */ - hhash->Phase = HAL_HASH_PHASE_PROCESS; - - /* Configure the number of valid bits in last word of the message */ - __HAL_HASH_SET_NBVALIDBITS(Size); - - /* Write input buffer in data register */ - HASH_WriteData(pInBuffer, Size); - - /* Change the HASH state */ - hhash->State = HAL_HASH_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hhash); - - /* Return function status */ - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup HASH_Exported_Functions_Group3 HASH processing functions using interrupt mode - * @brief processing functions using interrupt mode. - * -@verbatim - =============================================================================== - ##### HASH processing using interrupt mode functions ##### - =============================================================================== - [..] This section provides functions allowing to calculate in interrupt mode - the hash value using one of the following algorithms: - (+) MD5 - (+) SHA1 - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the HASH peripheral in MD5 mode then processes pInBuffer. - * The digest is available in pOutBuffer. - * @param hhash: pointer to a HASH_HandleTypeDef structure that contains - * the configuration information for HASH module - * @param pInBuffer: Pointer to the input buffer (buffer to be hashed). - * @param Size: Length of the input buffer in bytes. - * If the Size is not multiple of 64 bytes, the padding is managed by hardware. - * @param pOutBuffer: Pointer to the computed digest. Its size must be 16 bytes. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_HASH_MD5_Start_IT(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size, uint8_t* pOutBuffer) -{ - uint32_t inputaddr; - uint32_t outputaddr; - uint32_t buffercounter; - uint32_t inputcounter; - - /* Process Locked */ - __HAL_LOCK(hhash); - - if(hhash->State == HAL_HASH_STATE_READY) - { - /* Change the HASH state */ - hhash->State = HAL_HASH_STATE_BUSY; - - hhash->HashInCount = Size; - hhash->pHashInBuffPtr = pInBuffer; - hhash->pHashOutBuffPtr = pOutBuffer; - - /* Check if initialization phase has already been performed */ - if(hhash->Phase == HAL_HASH_PHASE_READY) - { - /* Select the SHA1 mode */ - HASH->CR |= HASH_ALGOSELECTION_MD5; - /* Reset the HASH processor core, so that the HASH will be ready to compute - the message digest of a new message */ - HASH->CR |= HASH_CR_INIT; - } - /* Reset interrupt counter */ - hhash->HashITCounter = 0; - - /* Set the phase */ - hhash->Phase = HAL_HASH_PHASE_PROCESS; - - /* Process Unlocked */ - __HAL_UNLOCK(hhash); - - /* Enable Interrupts */ - HASH->IMR = (HASH_IT_DINI | HASH_IT_DCI); - - /* Return function status */ - return HAL_OK; - } - if(__HAL_HASH_GET_FLAG(HASH_FLAG_DCIS)) - { - outputaddr = (uint32_t)hhash->pHashOutBuffPtr; - /* Read the Output block from the Output FIFO */ - *(uint32_t*)(outputaddr) = __REV(HASH->HR[0]); - outputaddr+=4; - *(uint32_t*)(outputaddr) = __REV(HASH->HR[1]); - outputaddr+=4; - *(uint32_t*)(outputaddr) = __REV(HASH->HR[2]); - outputaddr+=4; - *(uint32_t*)(outputaddr) = __REV(HASH->HR[3]); - - if(hhash->HashInCount == 0) - { - /* Disable Interrupts */ - HASH->IMR = 0; - /* Change the HASH state */ - hhash->State = HAL_HASH_STATE_READY; - /* Call digest computation complete callback */ - HAL_HASH_DgstCpltCallback(hhash); - - /* Process Unlocked */ - __HAL_UNLOCK(hhash); - - /* Return function status */ - return HAL_OK; - } - } - if(__HAL_HASH_GET_FLAG(HASH_FLAG_DINIS)) - { - if(hhash->HashInCount >= 68) - { - inputaddr = (uint32_t)hhash->pHashInBuffPtr; - /* Write the Input block in the Data IN register */ - for(buffercounter = 0; buffercounter < 64; buffercounter+=4) - { - HASH->DIN = *(uint32_t*)inputaddr; - inputaddr+=4; - } - if(hhash->HashITCounter == 0) - { - HASH->DIN = *(uint32_t*)inputaddr; - - if(hhash->HashInCount >= 68) - { - /* Decrement buffer counter */ - hhash->HashInCount -= 68; - hhash->pHashInBuffPtr+= 68; - } - else - { - hhash->HashInCount = 0; - hhash->pHashInBuffPtr+= hhash->HashInCount; - } - /* Set Interrupt counter */ - hhash->HashITCounter = 1; - } - else - { - /* Decrement buffer counter */ - hhash->HashInCount -= 64; - hhash->pHashInBuffPtr+= 64; - } - } - else - { - /* Get the buffer address */ - inputaddr = (uint32_t)hhash->pHashInBuffPtr; - /* Get the buffer counter */ - inputcounter = hhash->HashInCount; - /* Disable Interrupts */ - HASH->IMR &= ~(HASH_IT_DINI); - /* Configure the number of valid bits in last word of the message */ - __HAL_HASH_SET_NBVALIDBITS(inputcounter); - - if((inputcounter > 4) && (inputcounter%4)) - { - inputcounter = (inputcounter+4-inputcounter%4); - } - else if ((inputcounter < 4) && (inputcounter != 0)) - { - inputcounter = 4; - } - /* Write the Input block in the Data IN register */ - for(buffercounter = 0; buffercounter < inputcounter/4; buffercounter++) - { - HASH->DIN = *(uint32_t*)inputaddr; - inputaddr+=4; - } - /* Start the digest calculation */ - __HAL_HASH_START_DIGEST(); - /* Reset buffer counter */ - hhash->HashInCount = 0; - - /* Call Input data transfer complete callback */ - HAL_HASH_InCpltCallback(hhash); - } - } - - /* Process Unlocked */ - __HAL_UNLOCK(hhash); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Initializes the HASH peripheral in SHA1 mode then processes pInBuffer. - * The digest is available in pOutBuffer. - * @param hhash: pointer to a HASH_HandleTypeDef structure that contains - * the configuration information for HASH module - * @param pInBuffer: Pointer to the input buffer (buffer to be hashed). - * @param Size: Length of the input buffer in bytes. - * If the Size is not multiple of 64 bytes, the padding is managed by hardware. - * @param pOutBuffer: Pointer to the computed digest. Its size must be 20 bytes. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_HASH_SHA1_Start_IT(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size, uint8_t* pOutBuffer) -{ - uint32_t inputaddr; - uint32_t outputaddr; - uint32_t buffercounter; - uint32_t inputcounter; - - /* Process Locked */ - __HAL_LOCK(hhash); - - if(hhash->State == HAL_HASH_STATE_READY) - { - /* Change the HASH state */ - hhash->State = HAL_HASH_STATE_BUSY; - - hhash->HashInCount = Size; - hhash->pHashInBuffPtr = pInBuffer; - hhash->pHashOutBuffPtr = pOutBuffer; - - /* Check if initialization phase has already been performed */ - if(hhash->Phase == HAL_HASH_PHASE_READY) - { - /* Select the SHA1 mode */ - HASH->CR |= HASH_ALGOSELECTION_SHA1; - /* Reset the HASH processor core, so that the HASH will be ready to compute - the message digest of a new message */ - HASH->CR |= HASH_CR_INIT; - } - - /* Reset interrupt counter */ - hhash->HashITCounter = 0; - - /* Set the phase */ - hhash->Phase = HAL_HASH_PHASE_PROCESS; - - /* Process Unlocked */ - __HAL_UNLOCK(hhash); - - /* Enable Interrupts */ - HASH->IMR = (HASH_IT_DINI | HASH_IT_DCI); - - /* Return function status */ - return HAL_OK; - } - if(__HAL_HASH_GET_FLAG(HASH_FLAG_DCIS)) - { - outputaddr = (uint32_t)hhash->pHashOutBuffPtr; - /* Read the Output block from the Output FIFO */ - *(uint32_t*)(outputaddr) = __REV(HASH->HR[0]); - outputaddr+=4; - *(uint32_t*)(outputaddr) = __REV(HASH->HR[1]); - outputaddr+=4; - *(uint32_t*)(outputaddr) = __REV(HASH->HR[2]); - outputaddr+=4; - *(uint32_t*)(outputaddr) = __REV(HASH->HR[3]); - outputaddr+=4; - *(uint32_t*)(outputaddr) = __REV(HASH->HR[4]); - if(hhash->HashInCount == 0) - { - /* Disable Interrupts */ - HASH->IMR = 0; - /* Change the HASH state */ - hhash->State = HAL_HASH_STATE_READY; - /* Call digest computation complete callback */ - HAL_HASH_DgstCpltCallback(hhash); - - /* Process Unlocked */ - __HAL_UNLOCK(hhash); - - /* Return function status */ - return HAL_OK; - } - } - if(__HAL_HASH_GET_FLAG(HASH_FLAG_DINIS)) - { - if(hhash->HashInCount >= 68) - { - inputaddr = (uint32_t)hhash->pHashInBuffPtr; - /* Write the Input block in the Data IN register */ - for(buffercounter = 0; buffercounter < 64; buffercounter+=4) - { - HASH->DIN = *(uint32_t*)inputaddr; - inputaddr+=4; - } - if(hhash->HashITCounter == 0) - { - HASH->DIN = *(uint32_t*)inputaddr; - if(hhash->HashInCount >= 68) - { - /* Decrement buffer counter */ - hhash->HashInCount -= 68; - hhash->pHashInBuffPtr+= 68; - } - else - { - hhash->HashInCount = 0; - hhash->pHashInBuffPtr+= hhash->HashInCount; - } - /* Set Interrupt counter */ - hhash->HashITCounter = 1; - } - else - { - /* Decrement buffer counter */ - hhash->HashInCount -= 64; - hhash->pHashInBuffPtr+= 64; - } - } - else - { - /* Get the buffer address */ - inputaddr = (uint32_t)hhash->pHashInBuffPtr; - /* Get the buffer counter */ - inputcounter = hhash->HashInCount; - /* Disable Interrupts */ - HASH->IMR &= ~(HASH_IT_DINI); - /* Configure the number of valid bits in last word of the message */ - __HAL_HASH_SET_NBVALIDBITS(inputcounter); - - if((inputcounter > 4) && (inputcounter%4)) - { - inputcounter = (inputcounter+4-inputcounter%4); - } - else if ((inputcounter < 4) && (inputcounter != 0)) - { - inputcounter = 4; - } - /* Write the Input block in the Data IN register */ - for(buffercounter = 0; buffercounter < inputcounter/4; buffercounter++) - { - HASH->DIN = *(uint32_t*)inputaddr; - inputaddr+=4; - } - /* Start the digest calculation */ - __HAL_HASH_START_DIGEST(); - /* Reset buffer counter */ - hhash->HashInCount = 0; - - /* Call Input data transfer complete callback */ - HAL_HASH_InCpltCallback(hhash); - } - } - - /* Process Unlocked */ - __HAL_UNLOCK(hhash); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief This function handles HASH interrupt request. - * @param hhash: pointer to a HASH_HandleTypeDef structure that contains - * the configuration information for HASH module - * @retval None - */ -void HAL_HASH_IRQHandler(HASH_HandleTypeDef *hhash) -{ - switch(HASH->CR & HASH_CR_ALGO) - { - case HASH_ALGOSELECTION_MD5: - HAL_HASH_MD5_Start_IT(hhash, NULL, 0, NULL); - break; - - case HASH_ALGOSELECTION_SHA1: - HAL_HASH_SHA1_Start_IT(hhash, NULL, 0, NULL); - break; - - default: - break; - } -} - -/** - * @} - */ - -/** @defgroup HASH_Exported_Functions_Group4 HASH processing functions using DMA mode - * @brief processing functions using DMA mode. - * -@verbatim - =============================================================================== - ##### HASH processing using DMA mode functions ##### - =============================================================================== - [..] This section provides functions allowing to calculate in DMA mode - the hash value using one of the following algorithms: - (+) MD5 - (+) SHA1 - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the HASH peripheral in MD5 mode then enables DMA to - control data transfer. Use HAL_HASH_MD5_Finish() to get the digest. - * @param hhash: pointer to a HASH_HandleTypeDef structure that contains - * the configuration information for HASH module - * @param pInBuffer: Pointer to the input buffer (buffer to be hashed). - * @param Size: Length of the input buffer in bytes. - * If the Size is not multiple of 64 bytes, the padding is managed by hardware. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_HASH_MD5_Start_DMA(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size) -{ - uint32_t inputaddr = (uint32_t)pInBuffer; - - /* Process Locked */ - __HAL_LOCK(hhash); - - /* Change the HASH state */ - hhash->State = HAL_HASH_STATE_BUSY; - - /* Check if initialization phase has already been performed */ - if(hhash->Phase == HAL_HASH_PHASE_READY) - { - /* Select the MD5 mode and reset the HASH processor core, so that the HASH will be ready to compute - the message digest of a new message */ - HASH->CR |= HASH_ALGOSELECTION_MD5 | HASH_CR_INIT; - } - - /* Configure the number of valid bits in last word of the message */ - __HAL_HASH_SET_NBVALIDBITS(Size); - - /* Set the phase */ - hhash->Phase = HAL_HASH_PHASE_PROCESS; - - /* Set the HASH DMA transfer complete callback */ - hhash->hdmain->XferCpltCallback = HASH_DMAXferCplt; - /* Set the DMA error callback */ - hhash->hdmain->XferErrorCallback = HASH_DMAError; - - /* Enable the DMA In DMA Stream */ - HAL_DMA_Start_IT(hhash->hdmain, inputaddr, (uint32_t)&HASH->DIN, (Size%4 ? (Size+3)/4:Size/4)); - - /* Enable DMA requests */ - HASH->CR |= (HASH_CR_DMAE); - - /* Process Unlocked */ - __HAL_UNLOCK(hhash); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Returns the computed digest in MD5 mode - * @param hhash: pointer to a HASH_HandleTypeDef structure that contains - * the configuration information for HASH module - * @param pOutBuffer: Pointer to the computed digest. Its size must be 16 bytes. - * @param Timeout: Timeout value - * @retval HAL status - */ -HAL_StatusTypeDef HAL_HASH_MD5_Finish(HASH_HandleTypeDef *hhash, uint8_t* pOutBuffer, uint32_t Timeout) -{ - uint32_t tickstart = 0; - - /* Process Locked */ - __HAL_LOCK(hhash); - - /* Change HASH peripheral state */ - hhash->State = HAL_HASH_STATE_BUSY; - - /* Get tick */ - tickstart = HAL_GetTick(); - - while(HAL_IS_BIT_CLR(HASH->SR, HASH_FLAG_DCIS)) - { - /* Check for the Timeout */ - if(Timeout != HAL_MAX_DELAY) - { - if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout)) - { - /* Change state */ - hhash->State = HAL_HASH_STATE_TIMEOUT; - - /* Process Unlocked */ - __HAL_UNLOCK(hhash); - - return HAL_TIMEOUT; - } - } - } - - /* Read the message digest */ - HASH_GetDigest(pOutBuffer, 16); - - /* Change HASH peripheral state */ - hhash->State = HAL_HASH_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hhash); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Initializes the HASH peripheral in SHA1 mode then enables DMA to - control data transfer. Use HAL_HASH_SHA1_Finish() to get the digest. - * @param hhash: pointer to a HASH_HandleTypeDef structure that contains - * the configuration information for HASH module - * @param pInBuffer: Pointer to the input buffer (buffer to be hashed). - * @param Size: Length of the input buffer in bytes. - * If the Size is not multiple of 64 bytes, the padding is managed by hardware. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_HASH_SHA1_Start_DMA(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size) -{ - uint32_t inputaddr = (uint32_t)pInBuffer; - - /* Process Locked */ - __HAL_LOCK(hhash); - - /* Change the HASH state */ - hhash->State = HAL_HASH_STATE_BUSY; - - /* Check if initialization phase has already been performed */ - if(hhash->Phase == HAL_HASH_PHASE_READY) - { - /* Select the SHA1 mode and reset the HASH processor core, so that the HASH will be ready to compute - the message digest of a new message */ - HASH->CR |= HASH_ALGOSELECTION_SHA1; - HASH->CR |= HASH_CR_INIT; - } - - /* Configure the number of valid bits in last word of the message */ - __HAL_HASH_SET_NBVALIDBITS(Size); - - /* Set the phase */ - hhash->Phase = HAL_HASH_PHASE_PROCESS; - - /* Set the HASH DMA transfer complete callback */ - hhash->hdmain->XferCpltCallback = HASH_DMAXferCplt; - /* Set the DMA error callback */ - hhash->hdmain->XferErrorCallback = HASH_DMAError; - - /* Enable the DMA In DMA Stream */ - HAL_DMA_Start_IT(hhash->hdmain, inputaddr, (uint32_t)&HASH->DIN, (Size%4 ? (Size+3)/4:Size/4)); - - /* Enable DMA requests */ - HASH->CR |= (HASH_CR_DMAE); - - /* Process Unlocked */ - __HAL_UNLOCK(hhash); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Returns the computed digest in SHA1 mode. - * @param hhash: pointer to a HASH_HandleTypeDef structure that contains - * the configuration information for HASH module - * @param pOutBuffer: Pointer to the computed digest. Its size must be 20 bytes. - * @param Timeout: Timeout value - * @retval HAL status - */ -HAL_StatusTypeDef HAL_HASH_SHA1_Finish(HASH_HandleTypeDef *hhash, uint8_t* pOutBuffer, uint32_t Timeout) -{ - uint32_t tickstart = 0; - - /* Process Locked */ - __HAL_LOCK(hhash); - - /* Change HASH peripheral state */ - hhash->State = HAL_HASH_STATE_BUSY; - - /* Get tick */ - tickstart = HAL_GetTick(); - while(HAL_IS_BIT_CLR(HASH->SR, HASH_FLAG_DCIS)) - { - /* Check for the Timeout */ - if(Timeout != HAL_MAX_DELAY) - { - if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout)) - { - /* Change state */ - hhash->State = HAL_HASH_STATE_TIMEOUT; - - /* Process Unlocked */ - __HAL_UNLOCK(hhash); - - return HAL_TIMEOUT; - } - } - } - - /* Read the message digest */ - HASH_GetDigest(pOutBuffer, 20); - - /* Change HASH peripheral state */ - hhash->State = HAL_HASH_STATE_READY; - - /* Process UnLock */ - __HAL_UNLOCK(hhash); - - /* Return function status */ - return HAL_OK; -} - - -/** - * @} - */ - -/** @defgroup HASH_Exported_Functions_Group5 HASH-MAC (HMAC) processing functions using polling mode - * @brief HMAC processing functions using polling mode . - * -@verbatim - =============================================================================== - ##### HMAC processing using polling mode functions ##### - =============================================================================== - [..] This section provides functions allowing to calculate in polling mode - the HMAC value using one of the following algorithms: - (+) MD5 - (+) SHA1 - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the HASH peripheral in HMAC MD5 mode - * then processes pInBuffer. The digest is available in pOutBuffer - * @param hhash: pointer to a HASH_HandleTypeDef structure that contains - * the configuration information for HASH module - * @param pInBuffer: Pointer to the input buffer (buffer to be hashed). - * @param Size: Length of the input buffer in bytes. - * If the Size is not multiple of 64 bytes, the padding is managed by hardware. - * @param pOutBuffer: Pointer to the computed digest. Its size must be 20 bytes. - * @param Timeout: Timeout value - * @retval HAL status - */ -HAL_StatusTypeDef HAL_HMAC_MD5_Start(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size, uint8_t* pOutBuffer, uint32_t Timeout) -{ - uint32_t tickstart = 0; - - /* Process Locked */ - __HAL_LOCK(hhash); - - /* Change the HASH state */ - hhash->State = HAL_HASH_STATE_BUSY; - - /* Check if initialization phase has already been performed */ - if(hhash->Phase == HAL_HASH_PHASE_READY) - { - /* Check if key size is greater than 64 bytes */ - if(hhash->Init.KeySize > 64) - { - /* Select the HMAC MD5 mode */ - HASH->CR |= (HASH_ALGOSELECTION_MD5 | HASH_ALGOMODE_HMAC | HASH_HMAC_KEYTYPE_LONGKEY | HASH_CR_INIT); - } - else - { - /* Select the HMAC MD5 mode */ - HASH->CR |= (HASH_ALGOSELECTION_MD5 | HASH_ALGOMODE_HMAC | HASH_CR_INIT); - } - } - - /* Set the phase */ - hhash->Phase = HAL_HASH_PHASE_PROCESS; - - /************************** STEP 1 ******************************************/ - /* Configure the number of valid bits in last word of the message */ - __HAL_HASH_SET_NBVALIDBITS(hhash->Init.KeySize); - - /* Write input buffer in data register */ - HASH_WriteData(hhash->Init.pKey, hhash->Init.KeySize); - - /* Start the digest calculation */ - __HAL_HASH_START_DIGEST(); - - /* Get tick */ - tickstart = HAL_GetTick(); - - while(HAL_IS_BIT_SET(HASH->SR, HASH_FLAG_BUSY)) - { - /* Check for the Timeout */ - if(Timeout != HAL_MAX_DELAY) - { - if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout)) - { - /* Change state */ - hhash->State = HAL_HASH_STATE_TIMEOUT; - - /* Process Unlocked */ - __HAL_UNLOCK(hhash); - - return HAL_TIMEOUT; - } - } - } - /************************** STEP 2 ******************************************/ - /* Configure the number of valid bits in last word of the message */ - __HAL_HASH_SET_NBVALIDBITS(Size); - - /* Write input buffer in data register */ - HASH_WriteData(pInBuffer, Size); - - /* Start the digest calculation */ - __HAL_HASH_START_DIGEST(); - - /* Get tick */ - tickstart = HAL_GetTick(); - - while(HAL_IS_BIT_SET(HASH->SR, HASH_FLAG_BUSY)) - { - /* Check for the Timeout */ - if(Timeout != HAL_MAX_DELAY) - { - if((HAL_GetTick() - tickstart ) > Timeout) - { - /* Change state */ - hhash->State = HAL_HASH_STATE_TIMEOUT; - - /* Process Unlocked */ - __HAL_UNLOCK(hhash); - - return HAL_TIMEOUT; - } - } - } - /************************** STEP 3 ******************************************/ - /* Configure the number of valid bits in last word of the message */ - __HAL_HASH_SET_NBVALIDBITS(hhash->Init.KeySize); - - /* Write input buffer in data register */ - HASH_WriteData(hhash->Init.pKey, hhash->Init.KeySize); - - /* Start the digest calculation */ - __HAL_HASH_START_DIGEST(); - - /* Get tick */ - tickstart = HAL_GetTick(); - - while(HAL_IS_BIT_SET(HASH->SR, HASH_FLAG_BUSY)) - { - /* Check for the Timeout */ - if(Timeout != HAL_MAX_DELAY) - { - if((HAL_GetTick() - tickstart ) > Timeout) - { - /* Change state */ - hhash->State = HAL_HASH_STATE_TIMEOUT; - - /* Process Unlocked */ - __HAL_UNLOCK(hhash); - - return HAL_TIMEOUT; - } - } - } - - /* Read the message digest */ - HASH_GetDigest(pOutBuffer, 16); - - /* Change the HASH state */ - hhash->State = HAL_HASH_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hhash); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Initializes the HASH peripheral in HMAC SHA1 mode - * then processes pInBuffer. The digest is available in pOutBuffer. - * @param hhash: pointer to a HASH_HandleTypeDef structure that contains - * the configuration information for HASH module - * @param pInBuffer: Pointer to the input buffer (buffer to be hashed). - * @param Size: Length of the input buffer in bytes. - * If the Size is not multiple of 64 bytes, the padding is managed by hardware. - * @param pOutBuffer: Pointer to the computed digest. Its size must be 20 bytes. - * @param Timeout: Timeout value - * @retval HAL status - */ -HAL_StatusTypeDef HAL_HMAC_SHA1_Start(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size, uint8_t* pOutBuffer, uint32_t Timeout) -{ - uint32_t tickstart = 0; - - /* Process Locked */ - __HAL_LOCK(hhash); - - /* Change the HASH state */ - hhash->State = HAL_HASH_STATE_BUSY; - - /* Check if initialization phase has already been performed */ - if(hhash->Phase == HAL_HASH_PHASE_READY) - { - /* Check if key size is greater than 64 bytes */ - if(hhash->Init.KeySize > 64) - { - /* Select the HMAC SHA1 mode */ - HASH->CR |= (HASH_ALGOSELECTION_SHA1 | HASH_ALGOMODE_HMAC | HASH_HMAC_KEYTYPE_LONGKEY | HASH_CR_INIT); - } - else - { - /* Select the HMAC SHA1 mode */ - HASH->CR |= (HASH_ALGOSELECTION_SHA1 | HASH_ALGOMODE_HMAC | HASH_CR_INIT); - } - } - - /* Set the phase */ - hhash->Phase = HAL_HASH_PHASE_PROCESS; - - /************************** STEP 1 ******************************************/ - /* Configure the number of valid bits in last word of the message */ - __HAL_HASH_SET_NBVALIDBITS(hhash->Init.KeySize); - - /* Write input buffer in data register */ - HASH_WriteData(hhash->Init.pKey, hhash->Init.KeySize); - - /* Start the digest calculation */ - __HAL_HASH_START_DIGEST(); - - /* Get tick */ - tickstart = HAL_GetTick(); - - while(HAL_IS_BIT_SET(HASH->SR, HASH_FLAG_BUSY)) - { - /* Check for the Timeout */ - if(Timeout != HAL_MAX_DELAY) - { - if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout)) - { - /* Change state */ - hhash->State = HAL_HASH_STATE_TIMEOUT; - - /* Process Unlocked */ - __HAL_UNLOCK(hhash); - - return HAL_TIMEOUT; - } - } - } - /************************** STEP 2 ******************************************/ - /* Configure the number of valid bits in last word of the message */ - __HAL_HASH_SET_NBVALIDBITS(Size); - - /* Write input buffer in data register */ - HASH_WriteData(pInBuffer, Size); - - /* Start the digest calculation */ - __HAL_HASH_START_DIGEST(); - - /* Get tick */ - tickstart = HAL_GetTick(); - - while(HAL_IS_BIT_SET(HASH->SR, HASH_FLAG_BUSY)) - { - /* Check for the Timeout */ - if(Timeout != HAL_MAX_DELAY) - { - if((HAL_GetTick() - tickstart ) > Timeout) - { - /* Change state */ - hhash->State = HAL_HASH_STATE_TIMEOUT; - - /* Process Unlocked */ - __HAL_UNLOCK(hhash); - - return HAL_TIMEOUT; - } - } - } - /************************** STEP 3 ******************************************/ - /* Configure the number of valid bits in last word of the message */ - __HAL_HASH_SET_NBVALIDBITS(hhash->Init.KeySize); - - /* Write input buffer in data register */ - HASH_WriteData(hhash->Init.pKey, hhash->Init.KeySize); - - /* Start the digest calculation */ - __HAL_HASH_START_DIGEST(); - - /* Get tick */ - tickstart = HAL_GetTick(); - - while(HAL_IS_BIT_SET(HASH->SR, HASH_FLAG_BUSY)) - { - /* Check for the Timeout */ - if(Timeout != HAL_MAX_DELAY) - { - if((HAL_GetTick() - tickstart ) > Timeout) - { - /* Change state */ - hhash->State = HAL_HASH_STATE_TIMEOUT; - - /* Process Unlocked */ - __HAL_UNLOCK(hhash); - - return HAL_TIMEOUT; - } - } - } - /* Read the message digest */ - HASH_GetDigest(pOutBuffer, 20); - - /* Change the HASH state */ - hhash->State = HAL_HASH_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hhash); - - /* Return function status */ - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup HASH_Exported_Functions_Group6 HASH-MAC (HMAC) processing functions using DMA mode - * @brief HMAC processing functions using DMA mode . - * -@verbatim - =============================================================================== - ##### HMAC processing using DMA mode functions ##### - =============================================================================== - [..] This section provides functions allowing to calculate in DMA mode - the HMAC value using one of the following algorithms: - (+) MD5 - (+) SHA1 - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the HASH peripheral in HMAC MD5 mode - * then enables DMA to control data transfer. - * @param hhash: pointer to a HASH_HandleTypeDef structure that contains - * the configuration information for HASH module - * @param pInBuffer: Pointer to the input buffer (buffer to be hashed). - * @param Size: Length of the input buffer in bytes. - * If the Size is not multiple of 64 bytes, the padding is managed by hardware. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_HMAC_MD5_Start_DMA(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size) -{ - uint32_t inputaddr = 0; - - /* Process Locked */ - __HAL_LOCK(hhash); - - /* Change the HASH state */ - hhash->State = HAL_HASH_STATE_BUSY; - - /* Save buffer pointer and size in handle */ - hhash->pHashInBuffPtr = pInBuffer; - hhash->HashBuffSize = Size; - hhash->HashInCount = 0; - - /* Check if initialization phase has already been performed */ - if(hhash->Phase == HAL_HASH_PHASE_READY) - { - /* Check if key size is greater than 64 bytes */ - if(hhash->Init.KeySize > 64) - { - /* Select the HMAC MD5 mode */ - HASH->CR |= (HASH_ALGOSELECTION_MD5 | HASH_ALGOMODE_HMAC | HASH_HMAC_KEYTYPE_LONGKEY | HASH_CR_INIT); - } - else - { - /* Select the HMAC MD5 mode */ - HASH->CR |= (HASH_ALGOSELECTION_MD5 | HASH_ALGOMODE_HMAC | HASH_CR_INIT); - } - } - - /* Set the phase */ - hhash->Phase = HAL_HASH_PHASE_PROCESS; - - /* Configure the number of valid bits in last word of the message */ - __HAL_HASH_SET_NBVALIDBITS(hhash->Init.KeySize); - - /* Get the key address */ - inputaddr = (uint32_t)(hhash->Init.pKey); - - /* Set the HASH DMA transfer complete callback */ - hhash->hdmain->XferCpltCallback = HASH_DMAXferCplt; - /* Set the DMA error callback */ - hhash->hdmain->XferErrorCallback = HASH_DMAError; - - /* Enable the DMA In DMA Stream */ - HAL_DMA_Start_IT(hhash->hdmain, inputaddr, (uint32_t)&HASH->DIN, (hhash->Init.KeySize%4 ? (hhash->Init.KeySize+3)/4:hhash->Init.KeySize/4)); - /* Enable DMA requests */ - HASH->CR |= (HASH_CR_DMAE); - - /* Process Unlocked */ - __HAL_UNLOCK(hhash); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Initializes the HASH peripheral in HMAC SHA1 mode - * then enables DMA to control data transfer. - * @param hhash: pointer to a HASH_HandleTypeDef structure that contains - * the configuration information for HASH module - * @param pInBuffer: Pointer to the input buffer (buffer to be hashed). - * @param Size: Length of the input buffer in bytes. - * If the Size is not multiple of 64 bytes, the padding is managed by hardware. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_HMAC_SHA1_Start_DMA(HASH_HandleTypeDef *hhash, uint8_t *pInBuffer, uint32_t Size) -{ - uint32_t inputaddr = 0; - - /* Process Locked */ - __HAL_LOCK(hhash); - - /* Change the HASH state */ - hhash->State = HAL_HASH_STATE_BUSY; - - /* Save buffer pointer and size in handle */ - hhash->pHashInBuffPtr = pInBuffer; - hhash->HashBuffSize = Size; - hhash->HashInCount = 0; - - /* Check if initialization phase has already been performed */ - if(hhash->Phase == HAL_HASH_PHASE_READY) - { - /* Check if key size is greater than 64 bytes */ - if(hhash->Init.KeySize > 64) - { - /* Select the HMAC SHA1 mode */ - HASH->CR |= (HASH_ALGOSELECTION_SHA1 | HASH_ALGOMODE_HMAC | HASH_HMAC_KEYTYPE_LONGKEY | HASH_CR_INIT); - } - else - { - /* Select the HMAC SHA1 mode */ - HASH->CR |= (HASH_ALGOSELECTION_SHA1 | HASH_ALGOMODE_HMAC | HASH_CR_INIT); - } - } - - /* Set the phase */ - hhash->Phase = HAL_HASH_PHASE_PROCESS; - - /* Configure the number of valid bits in last word of the message */ - __HAL_HASH_SET_NBVALIDBITS(hhash->Init.KeySize); - - /* Get the key address */ - inputaddr = (uint32_t)(hhash->Init.pKey); - - /* Set the HASH DMA transfer complete callback */ - hhash->hdmain->XferCpltCallback = HASH_DMAXferCplt; - /* Set the DMA error callback */ - hhash->hdmain->XferErrorCallback = HASH_DMAError; - - /* Enable the DMA In DMA Stream */ - HAL_DMA_Start_IT(hhash->hdmain, inputaddr, (uint32_t)&HASH->DIN, (hhash->Init.KeySize%4 ? (hhash->Init.KeySize+3)/4:hhash->Init.KeySize/4)); - /* Enable DMA requests */ - HASH->CR |= (HASH_CR_DMAE); - - /* Process Unlocked */ - __HAL_UNLOCK(hhash); - - /* Return function status */ - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup HASH_Exported_Functions_Group7 Peripheral State functions - * @brief Peripheral State functions. - * -@verbatim - =============================================================================== - ##### Peripheral State functions ##### - =============================================================================== - [..] - This subsection permits to get in run-time the status of the peripheral. - -@endverbatim - * @{ - */ - -/** - * @brief return the HASH state - * @param hhash: pointer to a HASH_HandleTypeDef structure that contains - * the configuration information for HASH module - * @retval HAL state - */ -HAL_HASH_STATETypeDef HAL_HASH_GetState(HASH_HandleTypeDef *hhash) -{ - return hhash->State; -} - -/** - * @} - */ - -/** - * @} - */ -#endif /* STM32F215xx || STM32F217xx */ -#endif /* HAL_HASH_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_hcd.c b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_hcd.c deleted file mode 100755 index 41f82123..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_hcd.c +++ /dev/null @@ -1,1215 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_hal_hcd.c - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief HCD HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the USB Peripheral Controller: - * + Initialization and de-initialization functions - * + IO operation functions - * + Peripheral Control functions - * + Peripheral State functions - * - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - (#)Declare a HCD_HandleTypeDef handle structure, for example: - HCD_HandleTypeDef hhcd; - - (#)Fill parameters of Init structure in HCD handle - - (#)Call HAL_HCD_Init() API to initialize the HCD peripheral (Core, Host core, ...) - - (#)Initialize the HCD low level resources through the HAL_HCD_MspInit() API: - (##) Enable the HCD/USB Low Level interface clock using the following macros - (+++) __HAL_RCC_USB_OTG_FS_CLK_ENABLE(); - (+++) __HAL_RCC_USB_OTG_HS_CLK_ENABLE(); (For High Speed Mode) - (+++) __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE(); (For High Speed Mode) - - (##) Initialize the related GPIO clocks - (##) Configure HCD pin-out - (##) Configure HCD NVIC interrupt - - (#)Associate the Upper USB Host stack to the HAL HCD Driver: - (##) hhcd.pData = phost; - - (#)Enable HCD transmission and reception: - (##) HAL_HCD_Start(); - - @endverbatim - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal.h" - -/** @addtogroup STM32F2xx_HAL_Driver - * @{ - */ - -/** @defgroup HCD HCD - * @brief HCD HAL module driver - * @{ - */ - -#ifdef HAL_HCD_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/** @defgroup HCD_Private_Functions HCD Private Functions - * @{ - */ -static void HCD_HC_IN_IRQHandler(HCD_HandleTypeDef *hhcd, uint8_t chnum); -static void HCD_HC_OUT_IRQHandler(HCD_HandleTypeDef *hhcd, uint8_t chnum); -static void HCD_RXQLVL_IRQHandler(HCD_HandleTypeDef *hhcd); -static void HCD_Port_IRQHandler(HCD_HandleTypeDef *hhcd); -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup HCD_Exported_Functions HCD Exported Functions - * @{ - */ - -/** @defgroup HCD_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] This section provides functions allowing to: - -@endverbatim - * @{ - */ - -/** - * @brief Initialize the host driver. - * @param hhcd: HCD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_HCD_Init(HCD_HandleTypeDef *hhcd) -{ - /* Check the HCD handle allocation */ - if(hhcd == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_HCD_ALL_INSTANCE(hhcd->Instance)); - - hhcd->State = HAL_HCD_STATE_BUSY; - - /* Init the low level hardware : GPIO, CLOCK, NVIC... */ - HAL_HCD_MspInit(hhcd); - - /* Disable the Interrupts */ - __HAL_HCD_DISABLE(hhcd); - - /* Init the Core (common init.) */ - USB_CoreInit(hhcd->Instance, hhcd->Init); - - /* Force Host Mode*/ - USB_SetCurrentMode(hhcd->Instance , USB_OTG_HOST_MODE); - - /* Init Host */ - USB_HostInit(hhcd->Instance, hhcd->Init); - - hhcd->State= HAL_HCD_STATE_READY; - - return HAL_OK; -} - -/** - * @brief Initialize a host channel. - * @param hhcd: HCD handle - * @param ch_num: Channel number. - * This parameter can be a value from 1 to 15 - * @param epnum: Endpoint number. - * This parameter can be a value from 1 to 15 - * @param dev_address : Current device address - * This parameter can be a value from 0 to 255 - * @param speed: Current device speed. - * This parameter can be one of these values: - * HCD_SPEED_HIGH: High speed mode, - * HCD_SPEED_FULL: Full speed mode, - * HCD_SPEED_LOW: Low speed mode - * @param ep_type: Endpoint Type. - * This parameter can be one of these values: - * EP_TYPE_CTRL: Control type, - * EP_TYPE_ISOC: Isochronous type, - * EP_TYPE_BULK: Bulk type, - * EP_TYPE_INTR: Interrupt type - * @param mps: Max Packet Size. - * This parameter can be a value from 0 to32K - * @retval HAL status - */ -HAL_StatusTypeDef HAL_HCD_HC_Init(HCD_HandleTypeDef *hhcd, - uint8_t ch_num, - uint8_t epnum, - uint8_t dev_address, - uint8_t speed, - uint8_t ep_type, - uint16_t mps) -{ - HAL_StatusTypeDef status = HAL_OK; - - __HAL_LOCK(hhcd); - - hhcd->hc[ch_num].dev_addr = dev_address; - hhcd->hc[ch_num].max_packet = mps; - hhcd->hc[ch_num].ch_num = ch_num; - hhcd->hc[ch_num].ep_type = ep_type; - hhcd->hc[ch_num].ep_num = epnum & 0x7F; - hhcd->hc[ch_num].ep_is_in = ((epnum & 0x80) == 0x80); - hhcd->hc[ch_num].speed = speed; - - status = USB_HC_Init(hhcd->Instance, - ch_num, - epnum, - dev_address, - speed, - ep_type, - mps); - __HAL_UNLOCK(hhcd); - - return status; -} - -/** - * @brief Halt a host channel. - * @param hhcd: HCD handle - * @param ch_num: Channel number. - * This parameter can be a value from 1 to 15 - * @retval HAL status - */ -HAL_StatusTypeDef HAL_HCD_HC_Halt(HCD_HandleTypeDef *hhcd, uint8_t ch_num) -{ - HAL_StatusTypeDef status = HAL_OK; - - __HAL_LOCK(hhcd); - USB_HC_Halt(hhcd->Instance, ch_num); - __HAL_UNLOCK(hhcd); - - return status; -} - -/** - * @brief DeInitialize the host driver. - * @param hhcd: HCD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_HCD_DeInit(HCD_HandleTypeDef *hhcd) -{ - /* Check the HCD handle allocation */ - if(hhcd == NULL) - { - return HAL_ERROR; - } - - hhcd->State = HAL_HCD_STATE_BUSY; - - /* DeInit the low level hardware */ - HAL_HCD_MspDeInit(hhcd); - - __HAL_HCD_DISABLE(hhcd); - - hhcd->State = HAL_HCD_STATE_RESET; - - return HAL_OK; -} - -/** - * @brief Initialize the HCD MSP. - * @param hhcd: HCD handle - * @retval None - */ -__weak void HAL_HCD_MspInit(HCD_HandleTypeDef *hhcd) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_PCD_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitialize the HCD MSP. - * @param hhcd: HCD handle - * @retval None - */ -__weak void HAL_HCD_MspDeInit(HCD_HandleTypeDef *hhcd) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_PCD_MspDeInit could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup HCD_Exported_Functions_Group2 Input and Output operation functions - * @brief HCD IO operation functions - * -@verbatim - =============================================================================== - ##### IO operation functions ##### - =============================================================================== - [..] This subsection provides a set of functions allowing to manage the USB Host Data - Transfer - -@endverbatim - * @{ - */ - -/** - * @brief Submit a new URB for processing. - * @param hhcd: HCD handle - * @param ch_num: Channel number. - * This parameter can be a value from 1 to 15 - * @param direction: Channel number. - * This parameter can be one of these values: - * 0 : Output / 1 : Input - * @param ep_type: Endpoint Type. - * This parameter can be one of these values: - * EP_TYPE_CTRL: Control type/ - * EP_TYPE_ISOC: Isochronous type/ - * EP_TYPE_BULK: Bulk type/ - * EP_TYPE_INTR: Interrupt type/ - * @param token: Endpoint Type. - * This parameter can be one of these values: - * 0: HC_PID_SETUP / 1: HC_PID_DATA1 - * @param pbuff: pointer to URB data - * @param length: Length of URB data - * @param do_ping: activate do ping protocol (for high speed only). - * This parameter can be one of these values: - * 0 : do ping inactive / 1 : do ping active - * @retval HAL status - */ -HAL_StatusTypeDef HAL_HCD_HC_SubmitRequest(HCD_HandleTypeDef *hhcd, - uint8_t ch_num, - uint8_t direction, - uint8_t ep_type, - uint8_t token, - uint8_t* pbuff, - uint16_t length, - uint8_t do_ping) -{ - hhcd->hc[ch_num].ep_is_in = direction; - hhcd->hc[ch_num].ep_type = ep_type; - - if(token == 0) - { - hhcd->hc[ch_num].data_pid = HC_PID_SETUP; - } - else - { - hhcd->hc[ch_num].data_pid = HC_PID_DATA1; - } - - /* Manage Data Toggle */ - switch(ep_type) - { - case EP_TYPE_CTRL: - if((token == 1) && (direction == 0)) /*send data */ - { - if ( length == 0 ) - { /* For Status OUT stage, Length==0, Status Out PID = 1 */ - hhcd->hc[ch_num].toggle_out = 1; - } - - /* Set the Data Toggle bit as per the Flag */ - if ( hhcd->hc[ch_num].toggle_out == 0) - { /* Put the PID 0 */ - hhcd->hc[ch_num].data_pid = HC_PID_DATA0; - } - else - { /* Put the PID 1 */ - hhcd->hc[ch_num].data_pid = HC_PID_DATA1; - } - if(hhcd->hc[ch_num].urb_state != URB_NOTREADY) - { - hhcd->hc[ch_num].do_ping = do_ping; - } - } - break; - - case EP_TYPE_BULK: - if(direction == 0) - { - /* Set the Data Toggle bit as per the Flag */ - if ( hhcd->hc[ch_num].toggle_out == 0) - { /* Put the PID 0 */ - hhcd->hc[ch_num].data_pid = HC_PID_DATA0; - } - else - { /* Put the PID 1 */ - hhcd->hc[ch_num].data_pid = HC_PID_DATA1; - } - if(hhcd->hc[ch_num].urb_state != URB_NOTREADY) - { - hhcd->hc[ch_num].do_ping = do_ping; - } - } - else - { - if( hhcd->hc[ch_num].toggle_in == 0) - { - hhcd->hc[ch_num].data_pid = HC_PID_DATA0; - } - else - { - hhcd->hc[ch_num].data_pid = HC_PID_DATA1; - } - } - - break; - case EP_TYPE_INTR: - if(direction == 0) - { - /* Set the Data Toggle bit as per the Flag */ - if ( hhcd->hc[ch_num].toggle_out == 0) - { /* Put the PID 0 */ - hhcd->hc[ch_num].data_pid = HC_PID_DATA0; - } - else - { /* Put the PID 1 */ - hhcd->hc[ch_num].data_pid = HC_PID_DATA1; - } - } - else - { - if( hhcd->hc[ch_num].toggle_in == 0) - { - hhcd->hc[ch_num].data_pid = HC_PID_DATA0; - } - else - { - hhcd->hc[ch_num].data_pid = HC_PID_DATA1; - } - } - break; - - case EP_TYPE_ISOC: - hhcd->hc[ch_num].data_pid = HC_PID_DATA0; - break; - } - - hhcd->hc[ch_num].xfer_buff = pbuff; - hhcd->hc[ch_num].xfer_len = length; - hhcd->hc[ch_num].urb_state = URB_IDLE; - hhcd->hc[ch_num].xfer_count = 0; - hhcd->hc[ch_num].ch_num = ch_num; - hhcd->hc[ch_num].state = HC_IDLE; - - return USB_HC_StartXfer(hhcd->Instance, &(hhcd->hc[ch_num]), hhcd->Init.dma_enable); -} - -/** - * @brief Handle HCD interrupt request. - * @param hhcd: HCD handle - * @retval None - */ -void HAL_HCD_IRQHandler(HCD_HandleTypeDef *hhcd) -{ - USB_OTG_GlobalTypeDef *USBx = hhcd->Instance; - uint32_t i = 0 , interrupt = 0; - - /* Ensure that we are in device mode */ - if (USB_GetMode(hhcd->Instance) == USB_OTG_MODE_HOST) - { - /* Avoid spurious interrupt */ - if(__HAL_HCD_IS_INVALID_INTERRUPT(hhcd)) - { - return; - } - - if(__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_PXFR_INCOMPISOOUT)) - { - /* Incorrect mode, acknowledge the interrupt */ - __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_PXFR_INCOMPISOOUT); - } - - if(__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_IISOIXFR)) - { - /* Incorrect mode, acknowledge the interrupt */ - __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_IISOIXFR); - } - - if(__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_PTXFE)) - { - /* Incorrect mode, acknowledge the interrupt */ - __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_PTXFE); - } - - if(__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_MMIS)) - { - /* Incorrect mode, acknowledge the interrupt */ - __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_MMIS); - } - - /* Handle Host Disconnect Interrupts */ - if(__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_DISCINT)) - { - - /* Cleanup HPRT */ - USBx_HPRT0 &= ~(USB_OTG_HPRT_PENA | USB_OTG_HPRT_PCDET |\ - USB_OTG_HPRT_PENCHNG | USB_OTG_HPRT_POCCHNG ); - - /* Handle Host Port Interrupts */ - HAL_HCD_Disconnect_Callback(hhcd); - USB_InitFSLSPClkSel(hhcd->Instance ,HCFG_48_MHZ ); - __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_DISCINT); - } - - /* Handle Host Port Interrupts */ - if(__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_HPRTINT)) - { - HCD_Port_IRQHandler (hhcd); - } - - /* Handle Host SOF Interrupts */ - if(__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_SOF)) - { - HAL_HCD_SOF_Callback(hhcd); - __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_SOF); - } - - /* Handle Host channel Interrupts */ - if(__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_HCINT)) - { - interrupt = USB_HC_ReadInterrupt(hhcd->Instance); - for (i = 0; i < hhcd->Init.Host_channels; i++) - { - if (interrupt & (1 << i)) - { - if ((USBx_HC(i)->HCCHAR) & USB_OTG_HCCHAR_EPDIR) - { - HCD_HC_IN_IRQHandler(hhcd, i); - } - else - { - HCD_HC_OUT_IRQHandler (hhcd, i); - } - } - } - __HAL_HCD_CLEAR_FLAG(hhcd, USB_OTG_GINTSTS_HCINT); - } - - /* Handle Rx Queue Level Interrupts */ - if(__HAL_HCD_GET_FLAG(hhcd, USB_OTG_GINTSTS_RXFLVL)) - { - USB_MASK_INTERRUPT(hhcd->Instance, USB_OTG_GINTSTS_RXFLVL); - - HCD_RXQLVL_IRQHandler (hhcd); - - USB_UNMASK_INTERRUPT(hhcd->Instance, USB_OTG_GINTSTS_RXFLVL); - } - } -} - -/** - * @brief SOF callback. - * @param hhcd: HCD handle - * @retval None - */ -__weak void HAL_HCD_SOF_Callback(HCD_HandleTypeDef *hhcd) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_HCD_SOF_Callback could be implemented in the user file - */ -} - -/** - * @brief Connection Event callback. - * @param hhcd: HCD handle - * @retval None - */ -__weak void HAL_HCD_Connect_Callback(HCD_HandleTypeDef *hhcd) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_HCD_Connect_Callback could be implemented in the user file - */ -} - -/** - * @brief Disconnection Event callback. - * @param hhcd: HCD handle - * @retval None - */ -__weak void HAL_HCD_Disconnect_Callback(HCD_HandleTypeDef *hhcd) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_HCD_Disconnect_Callback could be implemented in the user file - */ -} - -/** - * @brief Notify URB state change callback. - * @param hhcd: HCD handle - * @param chnum: Channel number. - * This parameter can be a value from 1 to 15 - * @param urb_state: - * This parameter can be one of these values: - * URB_IDLE/ - * URB_DONE/ - * URB_NOTREADY/ - * URB_NYET/ - * URB_ERROR/ - * URB_STALL/ - * @retval None - */ -__weak void HAL_HCD_HC_NotifyURBChange_Callback(HCD_HandleTypeDef *hhcd, uint8_t chnum, HCD_URBStateTypeDef urb_state) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_HCD_HC_NotifyURBChange_Callback could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup HCD_Exported_Functions_Group3 Peripheral Control functions - * @brief Management functions - * -@verbatim - =============================================================================== - ##### Peripheral Control functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to control the HCD data - transfers. - -@endverbatim - * @{ - */ - -/** - * @brief Start the host driver. - * @param hhcd: HCD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_HCD_Start(HCD_HandleTypeDef *hhcd) -{ - __HAL_LOCK(hhcd); - __HAL_HCD_ENABLE(hhcd); - USB_DriveVbus(hhcd->Instance, 1); - __HAL_UNLOCK(hhcd); - return HAL_OK; -} - -/** - * @brief Stop the host driver. - * @param hhcd: HCD handle - * @retval HAL status - */ - -HAL_StatusTypeDef HAL_HCD_Stop(HCD_HandleTypeDef *hhcd) -{ - __HAL_LOCK(hhcd); - USB_StopHost(hhcd->Instance); - __HAL_UNLOCK(hhcd); - return HAL_OK; -} - -/** - * @brief Reset the host port. - * @param hhcd: HCD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_HCD_ResetPort(HCD_HandleTypeDef *hhcd) -{ - return (USB_ResetPort(hhcd->Instance)); -} - -/** - * @} - */ - -/** @defgroup HCD_Exported_Functions_Group4 Peripheral State functions - * @brief Peripheral State functions - * -@verbatim - =============================================================================== - ##### Peripheral State functions ##### - =============================================================================== - [..] - This subsection permits to get in run-time the status of the peripheral - and the data flow. - -@endverbatim - * @{ - */ - -/** - * @brief Return the HCD handle state. - * @param hhcd: HCD handle - * @retval HAL state - */ -HCD_StateTypeDef HAL_HCD_GetState(HCD_HandleTypeDef *hhcd) -{ - return hhcd->State; -} - -/** - * @brief Return URB state for a channel. - * @param hhcd: HCD handle - * @param chnum: Channel number. - * This parameter can be a value from 1 to 15 - * @retval URB state. - * This parameter can be one of these values: - * URB_IDLE/ - * URB_DONE/ - * URB_NOTREADY/ - * URB_NYET/ - * URB_ERROR/ - * URB_STALL - */ -HCD_URBStateTypeDef HAL_HCD_HC_GetURBState(HCD_HandleTypeDef *hhcd, uint8_t chnum) -{ - return hhcd->hc[chnum].urb_state; -} - - -/** - * @brief Return the last host transfer size. - * @param hhcd: HCD handle - * @param chnum: Channel number. - * This parameter can be a value from 1 to 15 - * @retval last transfer size in byte - */ -uint32_t HAL_HCD_HC_GetXferCount(HCD_HandleTypeDef *hhcd, uint8_t chnum) -{ - return hhcd->hc[chnum].xfer_count; -} - -/** - * @brief Return the Host Channel state. - * @param hhcd: HCD handle - * @param chnum: Channel number. - * This parameter can be a value from 1 to 15 - * @retval Host channel state - * This parameter can be one of these values: - * HC_IDLE/ - * HC_XFRC/ - * HC_HALTED/ - * HC_NYET/ - * HC_NAK/ - * HC_STALL/ - * HC_XACTERR/ - * HC_BBLERR/ - * HC_DATATGLERR - */ -HCD_HCStateTypeDef HAL_HCD_HC_GetState(HCD_HandleTypeDef *hhcd, uint8_t chnum) -{ - return hhcd->hc[chnum].state; -} - -/** - * @brief Return the current Host frame number. - * @param hhcd: HCD handle - * @retval Current Host frame number - */ -uint32_t HAL_HCD_GetCurrentFrame(HCD_HandleTypeDef *hhcd) -{ - return (USB_GetCurrentFrame(hhcd->Instance)); -} - -/** - * @brief Return the Host enumeration speed. - * @param hhcd: HCD handle - * @retval Enumeration speed - */ -uint32_t HAL_HCD_GetCurrentSpeed(HCD_HandleTypeDef *hhcd) -{ - return (USB_GetHostSpeed(hhcd->Instance)); -} - -/** - * @} - */ - -/** - * @} - */ - -/** @addtogroup HCD_Private_Functions - * @{ - */ -/** - * @brief Handle Host Channel IN interrupt requests. - * @param hhcd: HCD handle - * @param chnum: Channel number. - * This parameter can be a value from 1 to 15 - * @retval None - */ -static void HCD_HC_IN_IRQHandler(HCD_HandleTypeDef *hhcd, uint8_t chnum) -{ - USB_OTG_GlobalTypeDef *USBx = hhcd->Instance; - uint32_t tmpreg = 0; - - if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_AHBERR) - { - __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_AHBERR); - __HAL_HCD_UNMASK_HALT_HC_INT(chnum); - } - else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_ACK) - { - __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_ACK); - } - - else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_STALL) - { - __HAL_HCD_UNMASK_HALT_HC_INT(chnum); - hhcd->hc[chnum].state = HC_STALL; - __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_NAK); - __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_STALL); - USB_HC_Halt(hhcd->Instance, chnum); - } - else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_DTERR) - { - __HAL_HCD_UNMASK_HALT_HC_INT(chnum); - USB_HC_Halt(hhcd->Instance, chnum); - __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_NAK); - hhcd->hc[chnum].state = HC_DATATGLERR; - __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_DTERR); - } - - if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_FRMOR) - { - __HAL_HCD_UNMASK_HALT_HC_INT(chnum); - USB_HC_Halt(hhcd->Instance, chnum); - __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_FRMOR); - } - - else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_XFRC) - { - - if (hhcd->Init.dma_enable) - { - hhcd->hc[chnum].xfer_count = hhcd->hc[chnum].xfer_len - \ - (USBx_HC(chnum)->HCTSIZ & USB_OTG_HCTSIZ_XFRSIZ); - } - - hhcd->hc[chnum].state = HC_XFRC; - hhcd->hc[chnum].ErrCnt = 0; - __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_XFRC); - - - if ((hhcd->hc[chnum].ep_type == EP_TYPE_CTRL)|| - (hhcd->hc[chnum].ep_type == EP_TYPE_BULK)) - { - __HAL_HCD_UNMASK_HALT_HC_INT(chnum); - USB_HC_Halt(hhcd->Instance, chnum); - __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_NAK); - - } - else if(hhcd->hc[chnum].ep_type == EP_TYPE_INTR) - { - USBx_HC(chnum)->HCCHAR |= USB_OTG_HCCHAR_ODDFRM; - hhcd->hc[chnum].urb_state = URB_DONE; - HAL_HCD_HC_NotifyURBChange_Callback(hhcd, chnum, hhcd->hc[chnum].urb_state); - } - hhcd->hc[chnum].toggle_in ^= 1; - - } - else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_CHH) - { - __HAL_HCD_MASK_HALT_HC_INT(chnum); - - if(hhcd->hc[chnum].state == HC_XFRC) - { - hhcd->hc[chnum].urb_state = URB_DONE; - } - - else if (hhcd->hc[chnum].state == HC_STALL) - { - hhcd->hc[chnum].urb_state = URB_STALL; - } - - else if((hhcd->hc[chnum].state == HC_XACTERR) || - (hhcd->hc[chnum].state == HC_DATATGLERR)) - { - if(hhcd->hc[chnum].ErrCnt++ > 3) - { - hhcd->hc[chnum].ErrCnt = 0; - hhcd->hc[chnum].urb_state = URB_ERROR; - } - else - { - hhcd->hc[chnum].urb_state = URB_NOTREADY; - } - - /* re-activate the channel */ - tmpreg = USBx_HC(chnum)->HCCHAR; - tmpreg &= ~USB_OTG_HCCHAR_CHDIS; - tmpreg |= USB_OTG_HCCHAR_CHENA; - USBx_HC(chnum)->HCCHAR = tmpreg; - } - __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_CHH); - HAL_HCD_HC_NotifyURBChange_Callback(hhcd, chnum, hhcd->hc[chnum].urb_state); - } - - else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_TXERR) - { - __HAL_HCD_UNMASK_HALT_HC_INT(chnum); - hhcd->hc[chnum].ErrCnt++; - hhcd->hc[chnum].state = HC_XACTERR; - USB_HC_Halt(hhcd->Instance, chnum); - __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_TXERR); - } - else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_NAK) - { - if(hhcd->hc[chnum].ep_type == EP_TYPE_INTR) - { - __HAL_HCD_UNMASK_HALT_HC_INT(chnum); - USB_HC_Halt(hhcd->Instance, chnum); - } - else if ((hhcd->hc[chnum].ep_type == EP_TYPE_CTRL)|| - (hhcd->hc[chnum].ep_type == EP_TYPE_BULK)) - { - /* re-activate the channel */ - tmpreg = USBx_HC(chnum)->HCCHAR; - tmpreg &= ~USB_OTG_HCCHAR_CHDIS; - tmpreg |= USB_OTG_HCCHAR_CHENA; - USBx_HC(chnum)->HCCHAR = tmpreg; - } - hhcd->hc[chnum].state = HC_NAK; - __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_NAK); - } -} - -/** - * @brief Handle Host Channel OUT interrupt requests. - * @param hhcd: HCD handle - * @param chnum: Channel number. - * This parameter can be a value from 1 to 15 - * @retval None - */ -static void HCD_HC_OUT_IRQHandler (HCD_HandleTypeDef *hhcd, uint8_t chnum) -{ - USB_OTG_GlobalTypeDef *USBx = hhcd->Instance; - uint32_t tmpreg = 0; - - if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_AHBERR) - { - __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_AHBERR); - __HAL_HCD_UNMASK_HALT_HC_INT(chnum); - } - else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_ACK) - { - __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_ACK); - - if( hhcd->hc[chnum].do_ping == 1) - { - hhcd->hc[chnum].state = HC_NYET; - __HAL_HCD_UNMASK_HALT_HC_INT(chnum); - USB_HC_Halt(hhcd->Instance, chnum); - hhcd->hc[chnum].urb_state = URB_NOTREADY; - } - } - - else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_NYET) - { - hhcd->hc[chnum].state = HC_NYET; - hhcd->hc[chnum].ErrCnt= 0; - __HAL_HCD_UNMASK_HALT_HC_INT(chnum); - USB_HC_Halt(hhcd->Instance, chnum); - __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_NYET); - - } - - else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_FRMOR) - { - __HAL_HCD_UNMASK_HALT_HC_INT(chnum); - USB_HC_Halt(hhcd->Instance, chnum); - __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_FRMOR); - } - - else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_XFRC) - { - hhcd->hc[chnum].ErrCnt = 0; - __HAL_HCD_UNMASK_HALT_HC_INT(chnum); - USB_HC_Halt(hhcd->Instance, chnum); - __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_XFRC); - hhcd->hc[chnum].state = HC_XFRC; - - } - - else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_STALL) - { - __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_STALL); - __HAL_HCD_UNMASK_HALT_HC_INT(chnum); - USB_HC_Halt(hhcd->Instance, chnum); - hhcd->hc[chnum].state = HC_STALL; - } - - else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_NAK) - { - hhcd->hc[chnum].ErrCnt = 0; - __HAL_HCD_UNMASK_HALT_HC_INT(chnum); - USB_HC_Halt(hhcd->Instance, chnum); - hhcd->hc[chnum].state = HC_NAK; - __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_NAK); - } - - else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_TXERR) - { - __HAL_HCD_UNMASK_HALT_HC_INT(chnum); - USB_HC_Halt(hhcd->Instance, chnum); - hhcd->hc[chnum].state = HC_XACTERR; - __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_TXERR); - } - - else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_DTERR) - { - __HAL_HCD_UNMASK_HALT_HC_INT(chnum); - USB_HC_Halt(hhcd->Instance, chnum); - __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_NAK); - __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_DTERR); - hhcd->hc[chnum].state = HC_DATATGLERR; - } - - - else if ((USBx_HC(chnum)->HCINT) & USB_OTG_HCINT_CHH) - { - __HAL_HCD_MASK_HALT_HC_INT(chnum); - - if(hhcd->hc[chnum].state == HC_XFRC) - { - hhcd->hc[chnum].urb_state = URB_DONE; - if (hhcd->hc[chnum].ep_type == EP_TYPE_BULK) - { - hhcd->hc[chnum].toggle_out ^= 1; - } - } - else if (hhcd->hc[chnum].state == HC_NAK) - { - hhcd->hc[chnum].urb_state = URB_NOTREADY; - } - - else if (hhcd->hc[chnum].state == HC_NYET) - { - hhcd->hc[chnum].urb_state = URB_NOTREADY; - hhcd->hc[chnum].do_ping = 0; - } - - else if (hhcd->hc[chnum].state == HC_STALL) - { - hhcd->hc[chnum].urb_state = URB_STALL; - } - - else if((hhcd->hc[chnum].state == HC_XACTERR) || - (hhcd->hc[chnum].state == HC_DATATGLERR)) - { - if(hhcd->hc[chnum].ErrCnt++ > 3) - { - hhcd->hc[chnum].ErrCnt = 0; - hhcd->hc[chnum].urb_state = URB_ERROR; - } - else - { - hhcd->hc[chnum].urb_state = URB_NOTREADY; - } - - /* re-activate the channel */ - tmpreg = USBx_HC(chnum)->HCCHAR; - tmpreg &= ~USB_OTG_HCCHAR_CHDIS; - tmpreg |= USB_OTG_HCCHAR_CHENA; - USBx_HC(chnum)->HCCHAR = tmpreg; - } - - __HAL_HCD_CLEAR_HC_INT(chnum, USB_OTG_HCINT_CHH); - HAL_HCD_HC_NotifyURBChange_Callback(hhcd, chnum, hhcd->hc[chnum].urb_state); - } -} - -/** - * @brief Handle Rx Queue Level interrupt requests. - * @param hhcd: HCD handle - * @retval None - */ -static void HCD_RXQLVL_IRQHandler(HCD_HandleTypeDef *hhcd) -{ - USB_OTG_GlobalTypeDef *USBx = hhcd->Instance; - uint8_t channelnum = 0; - uint32_t pktsts; - uint32_t pktcnt; - uint32_t temp = 0; - uint32_t tmpreg = 0; - - temp = hhcd->Instance->GRXSTSP; - channelnum = temp & USB_OTG_GRXSTSP_EPNUM; - pktsts = (temp & USB_OTG_GRXSTSP_PKTSTS) >> 17; - pktcnt = (temp & USB_OTG_GRXSTSP_BCNT) >> 4; - - switch (pktsts) - { - case GRXSTS_PKTSTS_IN: - /* Read the data into the host buffer. */ - if ((pktcnt > 0) && (hhcd->hc[channelnum].xfer_buff != (void *)0)) - { - - USB_ReadPacket(hhcd->Instance, hhcd->hc[channelnum].xfer_buff, pktcnt); - - /*manage multiple Xfer */ - hhcd->hc[channelnum].xfer_buff += pktcnt; - hhcd->hc[channelnum].xfer_count += pktcnt; - - if((USBx_HC(channelnum)->HCTSIZ & USB_OTG_HCTSIZ_PKTCNT) > 0) - { - /* re-activate the channel when more packets are expected */ - tmpreg = USBx_HC(channelnum)->HCCHAR; - tmpreg &= ~USB_OTG_HCCHAR_CHDIS; - tmpreg |= USB_OTG_HCCHAR_CHENA; - USBx_HC(channelnum)->HCCHAR = tmpreg; - hhcd->hc[channelnum].toggle_in ^= 1; - } - } - break; - - case GRXSTS_PKTSTS_DATA_TOGGLE_ERR: - break; - case GRXSTS_PKTSTS_IN_XFER_COMP: - case GRXSTS_PKTSTS_CH_HALTED: - default: - break; - } -} - -/** - * @brief Handle Host Port interrupt requests. - * @param hhcd: HCD handle - * @retval None - */ -static void HCD_Port_IRQHandler (HCD_HandleTypeDef *hhcd) -{ - USB_OTG_GlobalTypeDef *USBx = hhcd->Instance; - __IO uint32_t hprt0, hprt0_dup; - - /* Handle Host Port Interrupts */ - hprt0 = USBx_HPRT0; - hprt0_dup = USBx_HPRT0; - - hprt0_dup &= ~(USB_OTG_HPRT_PENA | USB_OTG_HPRT_PCDET |\ - USB_OTG_HPRT_PENCHNG | USB_OTG_HPRT_POCCHNG ); - - /* Check whether Port Connect Detected */ - if((hprt0 & USB_OTG_HPRT_PCDET) == USB_OTG_HPRT_PCDET) - { - if((hprt0 & USB_OTG_HPRT_PCSTS) == USB_OTG_HPRT_PCSTS) - { - USB_MASK_INTERRUPT(hhcd->Instance, USB_OTG_GINTSTS_DISCINT); - HAL_HCD_Connect_Callback(hhcd); - } - hprt0_dup |= USB_OTG_HPRT_PCDET; - - } - - /* Check whether Port Enable Changed */ - if((hprt0 & USB_OTG_HPRT_PENCHNG) == USB_OTG_HPRT_PENCHNG) - { - hprt0_dup |= USB_OTG_HPRT_PENCHNG; - - if((hprt0 & USB_OTG_HPRT_PENA) == USB_OTG_HPRT_PENA) - { - if(hhcd->Init.phy_itface == USB_OTG_EMBEDDED_PHY) - { - if ((hprt0 & USB_OTG_HPRT_PSPD) == (HPRT0_PRTSPD_LOW_SPEED << 17)) - { - USB_InitFSLSPClkSel(hhcd->Instance ,HCFG_6_MHZ ); - } - else - { - USB_InitFSLSPClkSel(hhcd->Instance ,HCFG_48_MHZ ); - } - } - else - { - if(hhcd->Init.speed == HCD_SPEED_FULL) - { - USBx_HOST->HFIR = (uint32_t)60000; - } - } - HAL_HCD_Connect_Callback(hhcd); - - if(hhcd->Init.speed == HCD_SPEED_HIGH) - { - USB_UNMASK_INTERRUPT(hhcd->Instance, USB_OTG_GINTSTS_DISCINT); - } - } - else - { - /* Cleanup HPRT */ - USBx_HPRT0 &= ~(USB_OTG_HPRT_PENA | USB_OTG_HPRT_PCDET |\ - USB_OTG_HPRT_PENCHNG | USB_OTG_HPRT_POCCHNG ); - - USB_UNMASK_INTERRUPT(hhcd->Instance, USB_OTG_GINTSTS_DISCINT); - } - } - - /* Check for an overcurrent */ - if((hprt0 & USB_OTG_HPRT_POCCHNG) == USB_OTG_HPRT_POCCHNG) - { - hprt0_dup |= USB_OTG_HPRT_POCCHNG; - } - - /* Clear Port Interrupts */ - USBx_HPRT0 = hprt0_dup; -} - -/** - * @} - */ - -/** - * @} - */ - -#endif /* HAL_HCD_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_i2c.c b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_i2c.c deleted file mode 100755 index 6748afab..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_i2c.c +++ /dev/null @@ -1,3649 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_hal_i2c.c - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief I2C HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the Inter Integrated Circuit (I2C) peripheral: - * + Initialization and de-initialization functions - * + IO operation functions - * + Peripheral Control functions - * + Peripheral State functions - * - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - The I2C HAL driver can be used as follows: - - (#) Declare a I2C_HandleTypeDef handle structure, for example: - I2C_HandleTypeDef hi2c; - - (#)Initialize the I2C low level resources by implement the HAL_I2C_MspInit() API: - (##) Enable the I2Cx interface clock - (##) I2C pins configuration - (+++) Enable the clock for the I2C GPIOs - (+++) Configure I2C pins as alternate function open-drain - (##) NVIC configuration if you need to use interrupt process - (+++) Configure the I2Cx interrupt priority - (+++) Enable the NVIC I2C IRQ Channel - (##) DMA Configuration if you need to use DMA process - (+++) Declare a DMA_HandleTypeDef handle structure for the transmit or receive stream - (+++) Enable the DMAx interface clock using - (+++) Configure the DMA handle parameters - (+++) Configure the DMA Tx or Rx Stream - (+++) Associate the initialized DMA handle to the hi2c DMA Tx or Rx handle - (+++) Configure the priority and enable the NVIC for the transfer complete interrupt on - the DMA Tx or Rx Stream - - (#) Configure the Communication Speed, Duty cycle, Addressing mode, Own Address1, - Dual Addressing mode, Own Address2, General call and Nostretch mode in the hi2c Init structure. - - (#) Initialize the I2C registers by calling the HAL_I2C_Init(), configures also the low level Hardware - (GPIO, CLOCK, NVIC...etc) by calling the customized HAL_I2C_MspInit(&hi2c) API. - - (#) To check if target device is ready for communication, use the function HAL_I2C_IsDeviceReady() - - (#) For I2C IO and IO MEM operations, three operation modes are available within this driver : - - *** Polling mode IO operation *** - ================================= - [..] - (+) Transmit in master mode an amount of data in blocking mode using HAL_I2C_Master_Transmit() - (+) Receive in master mode an amount of data in blocking mode using HAL_I2C_Master_Receive() - (+) Transmit in slave mode an amount of data in blocking mode using HAL_I2C_Slave_Transmit() - (+) Receive in slave mode an amount of data in blocking mode using HAL_I2C_Slave_Receive() - - *** Polling mode IO MEM operation *** - ===================================== - [..] - (+) Write an amount of data in blocking mode to a specific memory address using HAL_I2C_Mem_Write() - (+) Read an amount of data in blocking mode from a specific memory address using HAL_I2C_Mem_Read() - - - *** Interrupt mode IO operation *** - =================================== - [..] - (+) Transmit in master mode an amount of data in non blocking mode using HAL_I2C_Master_Transmit_IT() - (+) At transmission end of transfer HAL_I2C_MasterTxCpltCallback is executed and user can - add his own code by customization of function pointer HAL_I2C_MasterTxCpltCallback - (+) Receive in master mode an amount of data in non blocking mode using HAL_I2C_Master_Receive_IT() - (+) At reception end of transfer HAL_I2C_MasterRxCpltCallback is executed and user can - add his own code by customization of function pointer HAL_I2C_MasterRxCpltCallback - (+) Transmit in slave mode an amount of data in non blocking mode using HAL_I2C_Slave_Transmit_IT() - (+) At transmission end of transfer HAL_I2C_SlaveTxCpltCallback is executed and user can - add his own code by customization of function pointer HAL_I2C_SlaveTxCpltCallback - (+) Receive in slave mode an amount of data in non blocking mode using HAL_I2C_Slave_Receive_IT() - (+) At reception end of transfer HAL_I2C_SlaveRxCpltCallback is executed and user can - add his own code by customization of function pointer HAL_I2C_SlaveRxCpltCallback - (+) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and user can - add his own code by customization of function pointer HAL_I2C_ErrorCallback - - *** Interrupt mode IO MEM operation *** - ======================================= - [..] - (+) Write an amount of data in no-blocking mode with Interrupt to a specific memory address using - HAL_I2C_Mem_Write_IT() - (+) At MEM end of write transfer HAL_I2C_MemTxCpltCallback is executed and user can - add his own code by customization of function pointer HAL_I2C_MemTxCpltCallback - (+) Read an amount of data in no-blocking mode with Interrupt from a specific memory address using - HAL_I2C_Mem_Read_IT() - (+) At MEM end of read transfer HAL_I2C_MemRxCpltCallback is executed and user can - add his own code by customization of function pointer HAL_I2C_MemRxCpltCallback - (+) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and user can - add his own code by customization of function pointer HAL_I2C_ErrorCallback - - *** DMA mode IO operation *** - ============================== - [..] - (+) Transmit in master mode an amount of data in non blocking mode (DMA) using - HAL_I2C_Master_Transmit_DMA() - (+) At transmission end of transfer HAL_I2C_MasterTxCpltCallback is executed and user can - add his own code by customization of function pointer HAL_I2C_MasterTxCpltCallback - (+) Receive in master mode an amount of data in non blocking mode (DMA) using - HAL_I2C_Master_Receive_DMA() - (+) At reception end of transfer HAL_I2C_MasterRxCpltCallback is executed and user can - add his own code by customization of function pointer HAL_I2C_MasterRxCpltCallback - (+) Transmit in slave mode an amount of data in non blocking mode (DMA) using - HAL_I2C_Slave_Transmit_DMA() - (+) At transmission end of transfer HAL_I2C_SlaveTxCpltCallback is executed and user can - add his own code by customization of function pointer HAL_I2C_SlaveTxCpltCallback - (+) Receive in slave mode an amount of data in non blocking mode (DMA) using - HAL_I2C_Slave_Receive_DMA() - (+) At reception end of transfer HAL_I2C_SlaveRxCpltCallback is executed and user can - add his own code by customization of function pointer HAL_I2C_SlaveRxCpltCallback - (+) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and user can - add his own code by customization of function pointer HAL_I2C_ErrorCallback - - *** DMA mode IO MEM operation *** - ================================= - [..] - (+) Write an amount of data in no-blocking mode with DMA to a specific memory address using - HAL_I2C_Mem_Write_DMA() - (+) At MEM end of write transfer HAL_I2C_MemTxCpltCallback is executed and user can - add his own code by customization of function pointer HAL_I2C_MemTxCpltCallback - (+) Read an amount of data in no-blocking mode with DMA from a specific memory address using - HAL_I2C_Mem_Read_DMA() - (+) At MEM end of read transfer HAL_I2C_MemRxCpltCallback is executed and user can - add his own code by customization of function pointer HAL_I2C_MemRxCpltCallback - (+) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and user can - add his own code by customization of function pointer HAL_I2C_ErrorCallback - - - *** I2C HAL driver macros list *** - ================================== - [..] - Below the list of most used macros in I2C HAL driver. - - (+) __HAL_I2C_ENABLE: Enable the I2C peripheral - (+) __HAL_I2C_DISABLE: Disable the I2C peripheral - (+) __HAL_I2C_GET_FLAG : Checks whether the specified I2C flag is set or not - (+) __HAL_I2C_CLEAR_FLAG : Clear the specified I2C pending flag - (+) __HAL_I2C_ENABLE_IT: Enable the specified I2C interrupt - (+) __HAL_I2C_DISABLE_IT: Disable the specified I2C interrupt - - [..] - (@) You can refer to the I2C HAL driver header file for more useful macros - - - @endverbatim - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal.h" - -/** @addtogroup STM32F2xx_HAL_Driver - * @{ - */ - -/** @defgroup I2C I2C - * @brief I2C HAL module driver - * @{ - */ - -#ifdef HAL_I2C_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @addtogroup I2C_Private_Constants - * @{ - */ -#define I2C_TIMEOUT_FLAG ((uint32_t)35) /* 35 ms */ -#define I2C_TIMEOUT_ADDR_SLAVE ((uint32_t)10000) /* 10 s */ -#define I2C_TIMEOUT_BUSY_FLAG ((uint32_t)10000) /* 10 s */ -/** - * @} - */ - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/** @addtogroup I2C_Private_Functions - * @{ - */ -static void I2C_DMAMasterTransmitCplt(DMA_HandleTypeDef *hdma); -static void I2C_DMAMasterReceiveCplt(DMA_HandleTypeDef *hdma); -static void I2C_DMASlaveTransmitCplt(DMA_HandleTypeDef *hdma); -static void I2C_DMASlaveReceiveCplt(DMA_HandleTypeDef *hdma); -static void I2C_DMAMemTransmitCplt(DMA_HandleTypeDef *hdma); -static void I2C_DMAMemReceiveCplt(DMA_HandleTypeDef *hdma); -static void I2C_DMAError(DMA_HandleTypeDef *hdma); - -static HAL_StatusTypeDef I2C_MasterRequestWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Timeout); -static HAL_StatusTypeDef I2C_MasterRequestRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Timeout); -static HAL_StatusTypeDef I2C_RequestMemoryWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout); -static HAL_StatusTypeDef I2C_RequestMemoryRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout); -static HAL_StatusTypeDef I2C_WaitOnFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, FlagStatus Status, uint32_t Timeout); -static HAL_StatusTypeDef I2C_WaitOnMasterAddressFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, uint32_t Timeout); - -static HAL_StatusTypeDef I2C_MasterTransmit_TXE(I2C_HandleTypeDef *hi2c); -static HAL_StatusTypeDef I2C_MasterTransmit_BTF(I2C_HandleTypeDef *hi2c); -static HAL_StatusTypeDef I2C_MasterReceive_RXNE(I2C_HandleTypeDef *hi2c); -static HAL_StatusTypeDef I2C_MasterReceive_BTF(I2C_HandleTypeDef *hi2c); - -static HAL_StatusTypeDef I2C_SlaveTransmit_TXE(I2C_HandleTypeDef *hi2c); -static HAL_StatusTypeDef I2C_SlaveTransmit_BTF(I2C_HandleTypeDef *hi2c); -static HAL_StatusTypeDef I2C_SlaveReceive_RXNE(I2C_HandleTypeDef *hi2c); -static HAL_StatusTypeDef I2C_SlaveReceive_BTF(I2C_HandleTypeDef *hi2c); -static HAL_StatusTypeDef I2C_Slave_ADDR(I2C_HandleTypeDef *hi2c); -static HAL_StatusTypeDef I2C_Slave_STOPF(I2C_HandleTypeDef *hi2c); -static HAL_StatusTypeDef I2C_Slave_AF(I2C_HandleTypeDef *hi2c); -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup I2C_Exported_Functions I2C Exported Functions - * @{ - */ - -/** @defgroup I2C_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] This subsection provides a set of functions allowing to initialize and - de-initialize the I2Cx peripheral: - - (+) User must Implement HAL_I2C_MspInit() function in which he configures - all related peripherals resources (CLOCK, GPIO, DMA, IT and NVIC). - - (+) Call the function HAL_I2C_Init() to configure the selected device with - the selected configuration: - (++) Communication Speed - (++) Duty cycle - (++) Addressing mode - (++) Own Address 1 - (++) Dual Addressing mode - (++) Own Address 2 - (++) General call mode - (++) Nostretch mode - - (+) Call the function HAL_I2C_DeInit() to restore the default configuration - of the selected I2Cx peripheral. - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the I2C according to the specified parameters - * in the I2C_InitTypeDef and create the associated handle. - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Init(I2C_HandleTypeDef *hi2c) -{ - uint32_t freqrange = 0; - uint32_t pclk1 = 0; - - /* Check the I2C handle allocation */ - if(hi2c == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance)); - assert_param(IS_I2C_CLOCK_SPEED(hi2c->Init.ClockSpeed)); - assert_param(IS_I2C_DUTY_CYCLE(hi2c->Init.DutyCycle)); - assert_param(IS_I2C_OWN_ADDRESS1(hi2c->Init.OwnAddress1)); - assert_param(IS_I2C_ADDRESSING_MODE(hi2c->Init.AddressingMode)); - assert_param(IS_I2C_DUAL_ADDRESS(hi2c->Init.DualAddressMode)); - assert_param(IS_I2C_OWN_ADDRESS2(hi2c->Init.OwnAddress2)); - assert_param(IS_I2C_GENERAL_CALL(hi2c->Init.GeneralCallMode)); - assert_param(IS_I2C_NO_STRETCH(hi2c->Init.NoStretchMode)); - - if(hi2c->State == HAL_I2C_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - hi2c->Lock = HAL_UNLOCKED; - /* Init the low level hardware : GPIO, CLOCK, NVIC */ - HAL_I2C_MspInit(hi2c); - } - - hi2c->State = HAL_I2C_STATE_BUSY; - - /* Disable the selected I2C peripheral */ - __HAL_I2C_DISABLE(hi2c); - - /* Get PCLK1 frequency */ - pclk1 = HAL_RCC_GetPCLK1Freq(); - - /* Calculate frequency range */ - freqrange = I2C_FREQRANGE(pclk1); - - /*---------------------------- I2Cx CR2 Configuration ----------------------*/ - /* Configure I2Cx: Frequency range */ - hi2c->Instance->CR2 = freqrange; - - /*---------------------------- I2Cx TRISE Configuration --------------------*/ - /* Configure I2Cx: Rise Time */ - hi2c->Instance->TRISE = I2C_RISE_TIME(freqrange, hi2c->Init.ClockSpeed); - - /*---------------------------- I2Cx CCR Configuration ----------------------*/ - /* Configure I2Cx: Speed */ - hi2c->Instance->CCR = I2C_SPEED(pclk1, hi2c->Init.ClockSpeed, hi2c->Init.DutyCycle); - - /*---------------------------- I2Cx CR1 Configuration ----------------------*/ - /* Configure I2Cx: Generalcall and NoStretch mode */ - hi2c->Instance->CR1 = (hi2c->Init.GeneralCallMode | hi2c->Init.NoStretchMode); - - /*---------------------------- I2Cx OAR1 Configuration ---------------------*/ - /* Configure I2Cx: Own Address1 and addressing mode */ - hi2c->Instance->OAR1 = (hi2c->Init.AddressingMode | hi2c->Init.OwnAddress1); - - /*---------------------------- I2Cx OAR2 Configuration ---------------------*/ - /* Configure I2Cx: Dual mode and Own Address2 */ - hi2c->Instance->OAR2 = (hi2c->Init.DualAddressMode | hi2c->Init.OwnAddress2); - - /* Enable the selected I2C peripheral */ - __HAL_I2C_ENABLE(hi2c); - - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - hi2c->State = HAL_I2C_STATE_READY; - - return HAL_OK; -} - -/** - * @brief DeInitializes the I2C peripheral. - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_DeInit(I2C_HandleTypeDef *hi2c) -{ - /* Check the I2C handle allocation */ - if(hi2c == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance)); - - hi2c->State = HAL_I2C_STATE_BUSY; - - /* Disable the I2C Peripheral Clock */ - __HAL_I2C_DISABLE(hi2c); - - /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ - HAL_I2C_MspDeInit(hi2c); - - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - hi2c->State = HAL_I2C_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(hi2c); - - return HAL_OK; -} - -/** - * @brief I2C MSP Init. - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ - __weak void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_I2C_MspInit could be implemented in the user file - */ -} - -/** - * @brief I2C MSP DeInit - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ - __weak void HAL_I2C_MspDeInit(I2C_HandleTypeDef *hi2c) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_I2C_MspDeInit could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup I2C_Exported_Functions_Group2 IO operation functions - * @brief Data transfers functions - * -@verbatim - =============================================================================== - ##### IO operation functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to manage the I2C data - transfers. - - (#) There are two modes of transfer: - (++) Blocking mode : The communication is performed in the polling mode. - The status of all data processing is returned by the same function - after finishing transfer. - (++) No-Blocking mode : The communication is performed using Interrupts - or DMA. These functions return the status of the transfer startup. - The end of the data processing will be indicated through the - dedicated I2C IRQ when using Interrupt mode or the DMA IRQ when - using DMA mode. - - (#) Blocking mode functions are : - (++) HAL_I2C_Master_Transmit() - (++) HAL_I2C_Master_Receive() - (++) HAL_I2C_Slave_Transmit() - (++) HAL_I2C_Slave_Receive() - (++) HAL_I2C_Mem_Write() - (++) HAL_I2C_Mem_Read() - (++) HAL_I2C_IsDeviceReady() - - (#) No-Blocking mode functions with Interrupt are : - (++) HAL_I2C_Master_Transmit_IT() - (++) HAL_I2C_Master_Receive_IT() - (++) HAL_I2C_Slave_Transmit_IT() - (++) HAL_I2C_Slave_Receive_IT() - (++) HAL_I2C_Mem_Write_IT() - (++) HAL_I2C_Mem_Read_IT() - - (#) No-Blocking mode functions with DMA are : - (++) HAL_I2C_Master_Transmit_DMA() - (++) HAL_I2C_Master_Receive_DMA() - (++) HAL_I2C_Slave_Transmit_DMA() - (++) HAL_I2C_Slave_Receive_DMA() - (++) HAL_I2C_Mem_Write_DMA() - (++) HAL_I2C_Mem_Read_DMA() - - (#) A set of Transfer Complete Callbacks are provided in non Blocking mode: - (++) HAL_I2C_MemTxCpltCallback() - (++) HAL_I2C_MemRxCpltCallback() - (++) HAL_I2C_MasterTxCpltCallback() - (++) HAL_I2C_MasterRxCpltCallback() - (++) HAL_I2C_SlaveTxCpltCallback() - (++) HAL_I2C_SlaveRxCpltCallback() - (++) HAL_I2C_ErrorCallback() - -@endverbatim - * @{ - */ - -/** - * @brief Transmits in master mode an amount of data in blocking mode. - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @param DevAddress: Target device address - * @param pData: Pointer to data buffer - * @param Size: Amount of data to be sent - * @param Timeout: Timeout duration - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout) -{ - if(hi2c->State == HAL_I2C_STATE_READY) - { - if((pData == NULL) || (Size == 0)) - { - return HAL_ERROR; - } - - /* Wait until BUSY flag is reset */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG) != HAL_OK) - { - return HAL_BUSY; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Disable Pos */ - hi2c->Instance->CR1 &= ~I2C_CR1_POS; - - hi2c->State = HAL_I2C_STATE_BUSY_TX; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Send Slave Address */ - if(I2C_MasterRequestWrite(hi2c, DevAddress, Timeout) != HAL_OK) - { - if(hi2c->ErrorCode == HAL_I2C_ERROR_AF) - { - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - return HAL_ERROR; - } - else - { - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - return HAL_TIMEOUT; - } - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - while(Size > 0) - { - /* Wait until TXE flag is set */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TXE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Write data to DR */ - hi2c->Instance->DR = (*pData++); - Size--; - - if((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (Size != 0)) - { - /* Write data to DR */ - hi2c->Instance->DR = (*pData++); - Size--; - } - } - - /* Wait until TXE flag is set */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TXE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Generate Stop */ - hi2c->Instance->CR1 |= I2C_CR1_STOP; - - hi2c->State = HAL_I2C_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Receives in master mode an amount of data in blocking mode. - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @param DevAddress: Target device address - * @param pData: Pointer to data buffer - * @param Size: Amount of data to be sent - * @param Timeout: Timeout duration - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout) -{ - if(hi2c->State == HAL_I2C_STATE_READY) - { - if((pData == NULL) || (Size == 0)) - { - return HAL_ERROR; - } - - /* Wait until BUSY flag is reset */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG) != HAL_OK) - { - return HAL_BUSY; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Disable Pos */ - hi2c->Instance->CR1 &= ~I2C_CR1_POS; - - hi2c->State = HAL_I2C_STATE_BUSY_RX; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Send Slave Address */ - if(I2C_MasterRequestRead(hi2c, DevAddress, Timeout) != HAL_OK) - { - if(hi2c->ErrorCode == HAL_I2C_ERROR_AF) - { - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - return HAL_ERROR; - } - else - { - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - return HAL_TIMEOUT; - } - } - - if(Size == 1) - { - /* Disable Acknowledge */ - hi2c->Instance->CR1 &= ~I2C_CR1_ACK; - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Generate Stop */ - hi2c->Instance->CR1 |= I2C_CR1_STOP; - } - else if(Size == 2) - { - /* Disable Acknowledge */ - hi2c->Instance->CR1 &= ~I2C_CR1_ACK; - - /* Enable Pos */ - hi2c->Instance->CR1 |= I2C_CR1_POS; - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - } - else - { - /* Enable Acknowledge */ - hi2c->Instance->CR1 |= I2C_CR1_ACK; - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - } - - while(Size > 0) - { - if(Size <= 3) - { - /* One byte */ - if(Size == 1) - { - /* Wait until RXNE flag is set */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_RXNE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Read data from DR */ - (*pData++) = hi2c->Instance->DR; - Size--; - } - /* Two bytes */ - else if(Size == 2) - { - /* Wait until BTF flag is set */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Generate Stop */ - hi2c->Instance->CR1 |= I2C_CR1_STOP; - - /* Read data from DR */ - (*pData++) = hi2c->Instance->DR; - Size--; - - /* Read data from DR */ - (*pData++) = hi2c->Instance->DR; - Size--; - } - /* 3 Last bytes */ - else - { - /* Wait until BTF flag is set */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Disable Acknowledge */ - hi2c->Instance->CR1 &= ~I2C_CR1_ACK; - - /* Read data from DR */ - (*pData++) = hi2c->Instance->DR; - Size--; - - /* Wait until BTF flag is set */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Generate Stop */ - hi2c->Instance->CR1 |= I2C_CR1_STOP; - - /* Read data from DR */ - (*pData++) = hi2c->Instance->DR; - Size--; - - /* Read data from DR */ - (*pData++) = hi2c->Instance->DR; - Size--; - } - } - else - { - /* Wait until RXNE flag is set */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_RXNE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Read data from DR */ - (*pData++) = hi2c->Instance->DR; - Size--; - - if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) - { - /* Read data from DR */ - (*pData++) = hi2c->Instance->DR; - Size--; - } - } - } - - hi2c->State = HAL_I2C_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Transmits in slave mode an amount of data in blocking mode. - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @param pData: Pointer to data buffer - * @param Size: Amount of data to be sent - * @param Timeout: Timeout duration - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Slave_Transmit(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout) -{ - if(hi2c->State == HAL_I2C_STATE_READY) - { - if((pData == NULL) || (Size == 0)) - { - return HAL_ERROR; - } - - /* Wait until BUSY flag is reset */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG) != HAL_OK) - { - return HAL_BUSY; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Disable Pos */ - hi2c->Instance->CR1 &= ~I2C_CR1_POS; - - hi2c->State = HAL_I2C_STATE_BUSY_TX; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Enable Address Acknowledge */ - hi2c->Instance->CR1 |= I2C_CR1_ACK; - - /* Wait until ADDR flag is set */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* If 10bit addressing mode is selected */ - if(hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_10BIT) - { - /* Wait until ADDR flag is set */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - } - - while(Size > 0) - { - /* Wait until TXE flag is set */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TXE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Write data to DR */ - hi2c->Instance->DR = (*pData++); - Size--; - - if((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (Size != 0)) - { - /* Write data to DR */ - hi2c->Instance->DR = (*pData++); - Size--; - } - } - - /* Wait until AF flag is set */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_AF, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Clear AF flag */ - __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); - - /* Disable Address Acknowledge */ - hi2c->Instance->CR1 &= ~I2C_CR1_ACK; - - hi2c->State = HAL_I2C_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Receive in slave mode an amount of data in blocking mode - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @param pData: Pointer to data buffer - * @param Size: Amount of data to be sent - * @param Timeout: Timeout duration - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Slave_Receive(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout) -{ - if(hi2c->State == HAL_I2C_STATE_READY) - { - if((pData == NULL) || (Size == 0)) - { - return HAL_ERROR; - } - - /* Wait until BUSY flag is reset */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG) != HAL_OK) - { - return HAL_BUSY; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Disable Pos */ - hi2c->Instance->CR1 &= ~I2C_CR1_POS; - - hi2c->State = HAL_I2C_STATE_BUSY_RX; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Enable Address Acknowledge */ - hi2c->Instance->CR1 |= I2C_CR1_ACK; - - /* Wait until ADDR flag is set */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - while(Size > 0) - { - /* Wait until RXNE flag is set */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_RXNE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Read data from DR */ - (*pData++) = hi2c->Instance->DR; - Size--; - - if((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (Size != 0)) - { - /* Read data from DR */ - (*pData++) = hi2c->Instance->DR; - Size--; - } - } - - /* Wait until STOP flag is set */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_STOPF, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Clear STOP flag */ - __HAL_I2C_CLEAR_STOPFLAG(hi2c); - - /* Disable Address Acknowledge */ - hi2c->Instance->CR1 &= ~I2C_CR1_ACK; - - hi2c->State = HAL_I2C_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Transmit in master mode an amount of data in no-blocking mode with Interrupt - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @param DevAddress: Target device address - * @param pData: Pointer to data buffer - * @param Size: Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Master_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size) -{ - if(hi2c->State == HAL_I2C_STATE_READY) - { - if((pData == NULL) || (Size == 0)) - { - return HAL_ERROR; - } - - /* Wait until BUSY flag is reset */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG) != HAL_OK) - { - return HAL_BUSY; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Disable Pos */ - hi2c->Instance->CR1 &= ~I2C_CR1_POS; - - hi2c->State = HAL_I2C_STATE_BUSY_TX; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - hi2c->pBuffPtr = pData; - hi2c->XferSize = Size; - hi2c->XferCount = Size; - - /* Send Slave Address */ - if(I2C_MasterRequestWrite(hi2c, DevAddress, I2C_TIMEOUT_FLAG) != HAL_OK) - { - if(hi2c->ErrorCode == HAL_I2C_ERROR_AF) - { - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - return HAL_ERROR; - } - else - { - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - return HAL_TIMEOUT; - } - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable EVT, BUF and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Receive in master mode an amount of data in no-blocking mode with Interrupt - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @param DevAddress: Target device address - * @param pData: Pointer to data buffer - * @param Size: Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Master_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size) -{ - if(hi2c->State == HAL_I2C_STATE_READY) - { - if((pData == NULL) || (Size == 0)) - { - return HAL_ERROR; - } - - /* Wait until BUSY flag is reset */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG) != HAL_OK) - { - return HAL_BUSY; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Disable Pos */ - hi2c->Instance->CR1 &= ~I2C_CR1_POS; - - hi2c->State = HAL_I2C_STATE_BUSY_RX; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - hi2c->pBuffPtr = pData; - hi2c->XferSize = Size; - hi2c->XferCount = Size; - - /* Send Slave Address */ - if(I2C_MasterRequestRead(hi2c, DevAddress, I2C_TIMEOUT_FLAG) != HAL_OK) - { - if(hi2c->ErrorCode == HAL_I2C_ERROR_AF) - { - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - return HAL_ERROR; - } - else - { - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - return HAL_TIMEOUT; - } - } - - if(hi2c->XferCount == 1) - { - /* Disable Acknowledge */ - hi2c->Instance->CR1 &= ~I2C_CR1_ACK; - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Generate Stop */ - hi2c->Instance->CR1 |= I2C_CR1_STOP; - } - else if(hi2c->XferCount == 2) - { - /* Disable Acknowledge */ - hi2c->Instance->CR1 &= ~I2C_CR1_ACK; - - /* Enable Pos */ - hi2c->Instance->CR1 |= I2C_CR1_POS; - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - } - else - { - /* Enable Acknowledge */ - hi2c->Instance->CR1 |= I2C_CR1_ACK; - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - } - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable EVT, BUF and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Transmit in slave mode an amount of data in no-blocking mode with Interrupt - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @param pData: Pointer to data buffer - * @param Size: Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Slave_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size) -{ - if(hi2c->State == HAL_I2C_STATE_READY) - { - if((pData == NULL) || (Size == 0)) - { - return HAL_ERROR; - } - - /* Wait until BUSY flag is reset */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG) != HAL_OK) - { - return HAL_BUSY; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Disable Pos */ - hi2c->Instance->CR1 &= ~I2C_CR1_POS; - - hi2c->State = HAL_I2C_STATE_BUSY_TX; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - hi2c->pBuffPtr = pData; - hi2c->XferSize = Size; - hi2c->XferCount = Size; - - /* Enable Address Acknowledge */ - hi2c->Instance->CR1 |= I2C_CR1_ACK; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable EVT, BUF and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Receive in slave mode an amount of data in no-blocking mode with Interrupt - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @param pData: Pointer to data buffer - * @param Size: Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Slave_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size) -{ - if(hi2c->State == HAL_I2C_STATE_READY) - { - if((pData == NULL) || (Size == 0)) - { - return HAL_ERROR; - } - - /* Wait until BUSY flag is reset */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG) != HAL_OK) - { - return HAL_BUSY; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Disable Pos */ - hi2c->Instance->CR1 &= ~I2C_CR1_POS; - - hi2c->State = HAL_I2C_STATE_BUSY_RX; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - hi2c->pBuffPtr = pData; - hi2c->XferSize = Size; - hi2c->XferCount = Size; - - /* Enable Address Acknowledge */ - hi2c->Instance->CR1 |= I2C_CR1_ACK; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable EVT, BUF and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Transmit in master mode an amount of data in no-blocking mode with DMA - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @param DevAddress: Target device address - * @param pData: Pointer to data buffer - * @param Size: Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Master_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size) -{ - if(hi2c->State == HAL_I2C_STATE_READY) - { - if((pData == NULL) || (Size == 0)) - { - return HAL_ERROR; - } - - /* Wait until BUSY flag is reset */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG) != HAL_OK) - { - return HAL_BUSY; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Disable Pos */ - hi2c->Instance->CR1 &= ~I2C_CR1_POS; - - hi2c->State = HAL_I2C_STATE_BUSY_TX; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - hi2c->pBuffPtr = pData; - hi2c->XferSize = Size; - hi2c->XferCount = Size; - - /* Set the I2C DMA transfer complete callback */ - hi2c->hdmatx->XferCpltCallback = I2C_DMAMasterTransmitCplt; - - /* Set the DMA error callback */ - hi2c->hdmatx->XferErrorCallback = I2C_DMAError; - - /* Enable the DMA Stream */ - HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)pData, (uint32_t)&hi2c->Instance->DR, Size); - - /* Send Slave Address */ - if(I2C_MasterRequestWrite(hi2c, DevAddress, I2C_TIMEOUT_FLAG) != HAL_OK) - { - if(hi2c->ErrorCode == HAL_I2C_ERROR_AF) - { - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - return HAL_ERROR; - } - else - { - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - return HAL_TIMEOUT; - } - } - - /* Enable DMA Request */ - hi2c->Instance->CR2 |= I2C_CR2_DMAEN; - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Receive in master mode an amount of data in no-blocking mode with DMA - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @param DevAddress: Target device address - * @param pData: Pointer to data buffer - * @param Size: Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Master_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size) -{ - if(hi2c->State == HAL_I2C_STATE_READY) - { - if((pData == NULL) || (Size == 0)) - { - return HAL_ERROR; - } - - /* Wait until BUSY flag is reset */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG) != HAL_OK) - { - return HAL_BUSY; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Disable Pos */ - hi2c->Instance->CR1 &= ~I2C_CR1_POS; - - hi2c->State = HAL_I2C_STATE_BUSY_RX; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - hi2c->pBuffPtr = pData; - hi2c->XferSize = Size; - hi2c->XferCount = Size; - - /* Set the I2C DMA transfer complete callback */ - hi2c->hdmarx->XferCpltCallback = I2C_DMAMasterReceiveCplt; - - /* Set the DMA error callback */ - hi2c->hdmarx->XferErrorCallback = I2C_DMAError; - - /* Enable the DMA Stream */ - HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->DR, (uint32_t)pData, Size); - - /* Send Slave Address */ - if(I2C_MasterRequestRead(hi2c, DevAddress, I2C_TIMEOUT_FLAG) != HAL_OK) - { - if(hi2c->ErrorCode == HAL_I2C_ERROR_AF) - { - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - return HAL_ERROR; - } - else - { - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - return HAL_TIMEOUT; - } - } - - if(Size == 1) - { - /* Disable Acknowledge */ - hi2c->Instance->CR1 &= ~I2C_CR1_ACK; - } - else - { - /* Enable Last DMA bit */ - hi2c->Instance->CR2 |= I2C_CR2_LAST; - } - - /* Enable DMA Request */ - hi2c->Instance->CR2 |= I2C_CR2_DMAEN; - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Transmit in slave mode an amount of data in no-blocking mode with DMA - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @param pData: Pointer to data buffer - * @param Size: Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Slave_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size) -{ - if(hi2c->State == HAL_I2C_STATE_READY) - { - if((pData == NULL) || (Size == 0)) - { - return HAL_ERROR; - } - - /* Wait until BUSY flag is reset */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG) != HAL_OK) - { - return HAL_BUSY; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Disable Pos */ - hi2c->Instance->CR1 &= ~I2C_CR1_POS; - - hi2c->State = HAL_I2C_STATE_BUSY_TX; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - hi2c->pBuffPtr = pData; - hi2c->XferSize = Size; - hi2c->XferCount = Size; - - /* Set the I2C DMA transfer complete callback */ - hi2c->hdmatx->XferCpltCallback = I2C_DMASlaveTransmitCplt; - - /* Set the DMA error callback */ - hi2c->hdmatx->XferErrorCallback = I2C_DMAError; - - /* Enable the DMA Stream */ - HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)pData, (uint32_t)&hi2c->Instance->DR, Size); - - /* Enable DMA Request */ - hi2c->Instance->CR2 |= I2C_CR2_DMAEN; - - /* Enable Address Acknowledge */ - hi2c->Instance->CR1 |= I2C_CR1_ACK; - - /* Wait until ADDR flag is set */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, I2C_TIMEOUT_ADDR_SLAVE) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* If 7bit addressing mode is selected */ - if(hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT) - { - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - } - else - { - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Wait until ADDR flag is set */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, I2C_TIMEOUT_ADDR_SLAVE) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - } - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Receive in slave mode an amount of data in no-blocking mode with DMA - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @param pData: Pointer to data buffer - * @param Size: Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Slave_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size) -{ - if(hi2c->State == HAL_I2C_STATE_READY) - { - if((pData == NULL) || (Size == 0)) - { - return HAL_ERROR; - } - - /* Wait until BUSY flag is reset */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG) != HAL_OK) - { - return HAL_BUSY; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Disable Pos */ - hi2c->Instance->CR1 &= ~I2C_CR1_POS; - - hi2c->State = HAL_I2C_STATE_BUSY_RX; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - hi2c->pBuffPtr = pData; - hi2c->XferSize = Size; - hi2c->XferCount = Size; - - /* Set the I2C DMA transfer complete callback */ - hi2c->hdmarx->XferCpltCallback = I2C_DMASlaveReceiveCplt; - - /* Set the DMA error callback */ - hi2c->hdmarx->XferErrorCallback = I2C_DMAError; - - /* Enable the DMA Stream */ - HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->DR, (uint32_t)pData, Size); - - /* Enable DMA Request */ - hi2c->Instance->CR2 |= I2C_CR2_DMAEN; - - /* Enable Address Acknowledge */ - hi2c->Instance->CR1 |= I2C_CR1_ACK; - - /* Wait until ADDR flag is set */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, I2C_TIMEOUT_ADDR_SLAVE) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} -/** - * @brief Write an amount of data in blocking mode to a specific memory address - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @param DevAddress: Target device address - * @param MemAddress: Internal memory address - * @param MemAddSize: Size of internal memory address - * @param pData: Pointer to data buffer - * @param Size: Amount of data to be sent - * @param Timeout: Timeout duration - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout) -{ - /* Check the parameters */ - assert_param(IS_I2C_MEMADD_SIZE(MemAddSize)); - - if(hi2c->State == HAL_I2C_STATE_READY) - { - if((pData == NULL) || (Size == 0)) - { - return HAL_ERROR; - } - - /* Wait until BUSY flag is reset */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG) != HAL_OK) - { - return HAL_BUSY; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Disable Pos */ - hi2c->Instance->CR1 &= ~I2C_CR1_POS; - - hi2c->State = HAL_I2C_STATE_MEM_BUSY_TX; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Send Slave Address and Memory Address */ - if(I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, Timeout) != HAL_OK) - { - if(hi2c->ErrorCode == HAL_I2C_ERROR_AF) - { - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - return HAL_ERROR; - } - else - { - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - return HAL_TIMEOUT; - } - } - - while(Size > 0) - { - /* Wait until TXE flag is set */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TXE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Write data to DR */ - hi2c->Instance->DR = (*pData++); - Size--; - - if((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) && (Size != 0)) - { - /* Write data to DR */ - hi2c->Instance->DR = (*pData++); - Size--; - } - } - - /* Wait until TXE flag is set */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TXE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Generate Stop */ - hi2c->Instance->CR1 |= I2C_CR1_STOP; - - hi2c->State = HAL_I2C_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Read an amount of data in blocking mode from a specific memory address - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @param DevAddress: Target device address - * @param MemAddress: Internal memory address - * @param MemAddSize: Size of internal memory address - * @param pData: Pointer to data buffer - * @param Size: Amount of data to be sent - * @param Timeout: Timeout duration - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout) -{ - /* Check the parameters */ - assert_param(IS_I2C_MEMADD_SIZE(MemAddSize)); - - if(hi2c->State == HAL_I2C_STATE_READY) - { - if((pData == NULL) || (Size == 0)) - { - return HAL_ERROR; - } - - /* Wait until BUSY flag is reset */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG) != HAL_OK) - { - return HAL_BUSY; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Disable Pos */ - hi2c->Instance->CR1 &= ~I2C_CR1_POS; - - hi2c->State = HAL_I2C_STATE_MEM_BUSY_RX; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - /* Send Slave Address and Memory Address */ - if(I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, Timeout) != HAL_OK) - { - if(hi2c->ErrorCode == HAL_I2C_ERROR_AF) - { - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - return HAL_ERROR; - } - else - { - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - return HAL_TIMEOUT; - } - } - - if(Size == 1) - { - /* Disable Acknowledge */ - hi2c->Instance->CR1 &= ~I2C_CR1_ACK; - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Generate Stop */ - hi2c->Instance->CR1 |= I2C_CR1_STOP; - } - else if(Size == 2) - { - /* Disable Acknowledge */ - hi2c->Instance->CR1 &= ~I2C_CR1_ACK; - - /* Enable Pos */ - hi2c->Instance->CR1 |= I2C_CR1_POS; - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - } - else - { - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - } - - while(Size > 0) - { - if(Size <= 3) - { - /* One byte */ - if(Size== 1) - { - /* Wait until RXNE flag is set */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_RXNE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Read data from DR */ - (*pData++) = hi2c->Instance->DR; - Size--; - } - /* Two bytes */ - else if(Size == 2) - { - /* Wait until BTF flag is set */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Generate Stop */ - hi2c->Instance->CR1 |= I2C_CR1_STOP; - - /* Read data from DR */ - (*pData++) = hi2c->Instance->DR; - Size--; - - /* Read data from DR */ - (*pData++) = hi2c->Instance->DR; - Size--; - } - /* 3 Last bytes */ - else - { - /* Wait until BTF flag is set */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Disable Acknowledge */ - hi2c->Instance->CR1 &= ~I2C_CR1_ACK; - - /* Read data from DR */ - (*pData++) = hi2c->Instance->DR; - Size--; - - /* Wait until BTF flag is set */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Generate Stop */ - hi2c->Instance->CR1 |= I2C_CR1_STOP; - - /* Read data from DR */ - (*pData++) = hi2c->Instance->DR; - Size--; - - /* Read data from DR */ - (*pData++) = hi2c->Instance->DR; - Size--; - } - } - else - { - /* Wait until RXNE flag is set */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_RXNE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Read data from DR */ - (*pData++) = hi2c->Instance->DR; - Size--; - - if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) - { - /* Read data from DR */ - (*pData++) = hi2c->Instance->DR; - Size--; - } - } - } - - hi2c->State = HAL_I2C_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} -/** - * @brief Write an amount of data in no-blocking mode with Interrupt to a specific memory address - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @param DevAddress: Target device address - * @param MemAddress: Internal memory address - * @param MemAddSize: Size of internal memory address - * @param pData: Pointer to data buffer - * @param Size: Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Mem_Write_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size) -{ - /* Check the parameters */ - assert_param(IS_I2C_MEMADD_SIZE(MemAddSize)); - - if(hi2c->State == HAL_I2C_STATE_READY) - { - if((pData == NULL) || (Size == 0)) - { - return HAL_ERROR; - } - - /* Wait until BUSY flag is reset */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG) != HAL_OK) - { - return HAL_BUSY; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Disable Pos */ - hi2c->Instance->CR1 &= ~I2C_CR1_POS; - - hi2c->State = HAL_I2C_STATE_MEM_BUSY_TX; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - hi2c->pBuffPtr = pData; - hi2c->XferSize = Size; - hi2c->XferCount = Size; - - /* Send Slave Address and Memory Address */ - if(I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG) != HAL_OK) - { - if(hi2c->ErrorCode == HAL_I2C_ERROR_AF) - { - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - return HAL_ERROR; - } - else - { - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - return HAL_TIMEOUT; - } - } - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable EVT, BUF and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Read an amount of data in no-blocking mode with Interrupt from a specific memory address - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @param DevAddress: Target device address - * @param MemAddress: Internal memory address - * @param MemAddSize: Size of internal memory address - * @param pData: Pointer to data buffer - * @param Size: Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Mem_Read_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size) -{ - /* Check the parameters */ - assert_param(IS_I2C_MEMADD_SIZE(MemAddSize)); - - if(hi2c->State == HAL_I2C_STATE_READY) - { - if((pData == NULL) || (Size == 0)) - { - return HAL_ERROR; - } - - /* Wait until BUSY flag is reset */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG) != HAL_OK) - { - return HAL_BUSY; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Disable Pos */ - hi2c->Instance->CR1 &= ~I2C_CR1_POS; - - hi2c->State = HAL_I2C_STATE_MEM_BUSY_RX; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - hi2c->pBuffPtr = pData; - hi2c->XferSize = Size; - hi2c->XferCount = Size; - - /* Send Slave Address and Memory Address */ - if(I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG) != HAL_OK) - { - if(hi2c->ErrorCode == HAL_I2C_ERROR_AF) - { - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - return HAL_ERROR; - } - else - { - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - return HAL_TIMEOUT; - } - } - - if(hi2c->XferCount == 1) - { - /* Disable Acknowledge */ - hi2c->Instance->CR1 &= ~I2C_CR1_ACK; - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Generate Stop */ - hi2c->Instance->CR1 |= I2C_CR1_STOP; - } - else if(hi2c->XferCount == 2) - { - /* Disable Acknowledge */ - hi2c->Instance->CR1 &= ~I2C_CR1_ACK; - - /* Enable Pos */ - hi2c->Instance->CR1 |= I2C_CR1_POS; - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - } - else - { - /* Enable Acknowledge */ - hi2c->Instance->CR1 |= I2C_CR1_ACK; - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - } - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - /* Note : The I2C interrupts must be enabled after unlocking current process - to avoid the risk of I2C interrupt handle execution before current - process unlock */ - - /* Enable EVT, BUF and ERR interrupt */ - __HAL_I2C_ENABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} -/** - * @brief Write an amount of data in no-blocking mode with DMA to a specific memory address - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @param DevAddress: Target device address - * @param MemAddress: Internal memory address - * @param MemAddSize: Size of internal memory address - * @param pData: Pointer to data buffer - * @param Size: Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Mem_Write_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size) -{ - /* Check the parameters */ - assert_param(IS_I2C_MEMADD_SIZE(MemAddSize)); - - if(hi2c->State == HAL_I2C_STATE_READY) - { - if((pData == NULL) || (Size == 0)) - { - return HAL_ERROR; - } - - /* Wait until BUSY flag is reset */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG) != HAL_OK) - { - return HAL_BUSY; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Disable Pos */ - hi2c->Instance->CR1 &= ~I2C_CR1_POS; - - hi2c->State = HAL_I2C_STATE_MEM_BUSY_TX; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - hi2c->pBuffPtr = pData; - hi2c->XferSize = Size; - hi2c->XferCount = Size; - - /* Set the I2C DMA transfer complete callback */ - hi2c->hdmatx->XferCpltCallback = I2C_DMAMemTransmitCplt; - - /* Set the DMA error callback */ - hi2c->hdmatx->XferErrorCallback = I2C_DMAError; - - /* Enable the DMA Stream */ - HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)pData, (uint32_t)&hi2c->Instance->DR, Size); - - /* Send Slave Address and Memory Address */ - if(I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG) != HAL_OK) - { - if(hi2c->ErrorCode == HAL_I2C_ERROR_AF) - { - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - return HAL_ERROR; - } - else - { - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - return HAL_TIMEOUT; - } - } - - /* Enable DMA Request */ - hi2c->Instance->CR2 |= I2C_CR2_DMAEN; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Reads an amount of data in no-blocking mode with DMA from a specific memory address. - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @param DevAddress: Target device address - * @param MemAddress: Internal memory address - * @param MemAddSize: Size of internal memory address - * @param pData: Pointer to data buffer - * @param Size: Amount of data to be read - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_Mem_Read_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size) -{ - /* Check the parameters */ - assert_param(IS_I2C_MEMADD_SIZE(MemAddSize)); - - if(hi2c->State == HAL_I2C_STATE_READY) - { - if((pData == NULL) || (Size == 0)) - { - return HAL_ERROR; - } - - /* Wait until BUSY flag is reset */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG) != HAL_OK) - { - return HAL_BUSY; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Disable Pos */ - hi2c->Instance->CR1 &= ~I2C_CR1_POS; - - hi2c->State = HAL_I2C_STATE_MEM_BUSY_RX; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - hi2c->pBuffPtr = pData; - hi2c->XferSize = Size; - hi2c->XferCount = Size; - - /* Set the I2C DMA transfer complete callback */ - hi2c->hdmarx->XferCpltCallback = I2C_DMAMemReceiveCplt; - - /* Set the DMA error callback */ - hi2c->hdmarx->XferErrorCallback = I2C_DMAError; - - /* Enable the DMA Stream */ - HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->DR, (uint32_t)pData, Size); - - /* Send Slave Address and Memory Address */ - if(I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG) != HAL_OK) - { - if(hi2c->ErrorCode == HAL_I2C_ERROR_AF) - { - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - return HAL_ERROR; - } - else - { - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - return HAL_TIMEOUT; - } - } - - if(Size == 1) - { - /* Disable Acknowledge */ - hi2c->Instance->CR1 &= ~I2C_CR1_ACK; - } - else - { - /* Enable Last DMA bit */ - hi2c->Instance->CR2 |= I2C_CR2_LAST; - } - - /* Enable DMA Request */ - hi2c->Instance->CR2 |= I2C_CR2_DMAEN; - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Checks if target device is ready for communication. - * @note This function is used with Memory devices - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @param DevAddress: Target device address - * @param Trials: Number of trials - * @param Timeout: Timeout duration - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2C_IsDeviceReady(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Trials, uint32_t Timeout) -{ - uint32_t tickstart = 0, tmp1 = 0, tmp2 = 0, tmp3 = 0, I2C_Trials = 1; - - if(hi2c->State == HAL_I2C_STATE_READY) - { - /* Wait until BUSY flag is reset */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG) != HAL_OK) - { - return HAL_BUSY; - } - - /* Process Locked */ - __HAL_LOCK(hi2c); - - /* Disable Pos */ - hi2c->Instance->CR1 &= ~I2C_CR1_POS; - - hi2c->State = HAL_I2C_STATE_BUSY; - hi2c->ErrorCode = HAL_I2C_ERROR_NONE; - - do - { - /* Generate Start */ - hi2c->Instance->CR1 |= I2C_CR1_START; - - /* Wait until SB flag is set */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Send slave address */ - hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress); - - /* Wait until ADDR or AF flag are set */ - /* Get tick */ - tickstart = HAL_GetTick(); - - tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR); - tmp2 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF); - tmp3 = hi2c->State; - while((tmp1 == RESET) && (tmp2 == RESET) && (tmp3 != HAL_I2C_STATE_TIMEOUT)) - { - if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout)) - { - hi2c->State = HAL_I2C_STATE_TIMEOUT; - } - tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR); - tmp2 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF); - tmp3 = hi2c->State; - } - - hi2c->State = HAL_I2C_STATE_READY; - - /* Check if the ADDR flag has been set */ - if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR) == SET) - { - /* Generate Stop */ - hi2c->Instance->CR1 |= I2C_CR1_STOP; - - /* Clear ADDR Flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Wait until BUSY flag is reset */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG) != HAL_OK) - { - return HAL_TIMEOUT; - } - - hi2c->State = HAL_I2C_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_OK; - } - else - { - /* Generate Stop */ - hi2c->Instance->CR1 |= I2C_CR1_STOP; - - /* Clear AF Flag */ - __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); - - /* Wait until BUSY flag is reset */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG) != HAL_OK) - { - return HAL_TIMEOUT; - } - - } - }while(I2C_Trials++ < Trials); - - hi2c->State = HAL_I2C_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief This function handles I2C event interrupt request. - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval HAL status - */ -void HAL_I2C_EV_IRQHandler(I2C_HandleTypeDef *hi2c) -{ - uint32_t tmp1 = 0, tmp2 = 0, tmp3 = 0, tmp4 = 0; - /* Master mode selected */ - if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_MSL) == SET) - { - /* I2C in mode Transmitter -----------------------------------------------*/ - if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TRA) == SET) - { - tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXE); - tmp2 = __HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_BUF); - tmp3 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF); - tmp4 = __HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_EVT); - /* TXE set and BTF reset -----------------------------------------------*/ - if((tmp1 == SET) && (tmp2 == SET) && (tmp3 == RESET)) - { - I2C_MasterTransmit_TXE(hi2c); - } - /* BTF set -------------------------------------------------------------*/ - else if((tmp3 == SET) && (tmp4 == SET)) - { - I2C_MasterTransmit_BTF(hi2c); - } - } - /* I2C in mode Receiver --------------------------------------------------*/ - else - { - tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE); - tmp2 = __HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_BUF); - tmp3 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF); - tmp4 = __HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_EVT); - /* RXNE set and BTF reset -----------------------------------------------*/ - if((tmp1 == SET) && (tmp2 == SET) && (tmp3 == RESET)) - { - I2C_MasterReceive_RXNE(hi2c); - } - /* BTF set -------------------------------------------------------------*/ - else if((tmp3 == SET) && (tmp4 == SET)) - { - I2C_MasterReceive_BTF(hi2c); - } - } - } - /* Slave mode selected */ - else - { - tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR); - tmp2 = __HAL_I2C_GET_IT_SOURCE(hi2c, (I2C_IT_EVT)); - tmp3 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF); - tmp4 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TRA); - /* ADDR set --------------------------------------------------------------*/ - if((tmp1 == SET) && (tmp2 == SET)) - { - I2C_Slave_ADDR(hi2c); - } - /* STOPF set --------------------------------------------------------------*/ - else if((tmp3 == SET) && (tmp2 == SET)) - { - I2C_Slave_STOPF(hi2c); - } - /* I2C in mode Transmitter -----------------------------------------------*/ - else if(tmp4 == SET) - { - tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXE); - tmp2 = __HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_BUF); - tmp3 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF); - tmp4 = __HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_EVT); - /* TXE set and BTF reset -----------------------------------------------*/ - if((tmp1 == SET) && (tmp2 == SET) && (tmp3 == RESET)) - { - I2C_SlaveTransmit_TXE(hi2c); - } - /* BTF set -------------------------------------------------------------*/ - else if((tmp3 == SET) && (tmp4 == SET)) - { - I2C_SlaveTransmit_BTF(hi2c); - } - } - /* I2C in mode Receiver --------------------------------------------------*/ - else - { - tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE); - tmp2 = __HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_BUF); - tmp3 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF); - tmp4 = __HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_EVT); - /* RXNE set and BTF reset ----------------------------------------------*/ - if((tmp1 == SET) && (tmp2 == SET) && (tmp3 == RESET)) - { - I2C_SlaveReceive_RXNE(hi2c); - } - /* BTF set -------------------------------------------------------------*/ - else if((tmp3 == SET) && (tmp4 == SET)) - { - I2C_SlaveReceive_BTF(hi2c); - } - } - } -} - -/** - * @brief This function handles I2C error interrupt request. - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval HAL status - */ -void HAL_I2C_ER_IRQHandler(I2C_HandleTypeDef *hi2c) -{ - uint32_t tmp1 = 0, tmp2 = 0, tmp3 = 0; - - tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BERR); - tmp2 = __HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_ERR); - /* I2C Bus error interrupt occurred ----------------------------------------*/ - if((tmp1 == SET) && (tmp2 == SET)) - { - hi2c->ErrorCode |= HAL_I2C_ERROR_BERR; - - /* Clear BERR flag */ - __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_BERR); - } - - tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ARLO); - tmp2 = __HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_ERR); - /* I2C Arbitration Loss error interrupt occurred ---------------------------*/ - if((tmp1 == SET) && (tmp2 == SET)) - { - hi2c->ErrorCode |= HAL_I2C_ERROR_ARLO; - - /* Clear ARLO flag */ - __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ARLO); - } - - tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF); - tmp2 = __HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_ERR); - /* I2C Acknowledge failure error interrupt occurred ------------------------*/ - if((tmp1 == SET) && (tmp2 == SET)) - { - tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_MSL); - tmp2 = hi2c->XferCount; - tmp3 = hi2c->State; - if((tmp1 == RESET) && (tmp2 == 0) && (tmp3 == HAL_I2C_STATE_BUSY_TX)) - { - I2C_Slave_AF(hi2c); - } - else - { - hi2c->ErrorCode |= HAL_I2C_ERROR_AF; - /* Clear AF flag */ - __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); - } - } - - tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_OVR); - tmp2 = __HAL_I2C_GET_IT_SOURCE(hi2c, I2C_IT_ERR); - /* I2C Over-Run/Under-Run interrupt occurred -------------------------------*/ - if((tmp1 == SET) && (tmp2 == SET)) - { - hi2c->ErrorCode |= HAL_I2C_ERROR_OVR; - /* Clear OVR flag */ - __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_OVR); - } - - if(hi2c->ErrorCode != HAL_I2C_ERROR_NONE) - { - hi2c->State = HAL_I2C_STATE_READY; - - /* Disable Pos bit in I2C CR1 when error occurred in Master/Mem Receive IT Process */ - hi2c->Instance->CR1 &= ~I2C_CR1_POS; - - HAL_I2C_ErrorCallback(hi2c); - } -} - -/** - * @brief Master Tx Transfer completed callbacks. - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ - __weak void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_I2C_TxCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Master Rx Transfer completed callbacks. - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ -__weak void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_I2C_TxCpltCallback could be implemented in the user file - */ -} - -/** @brief Slave Tx Transfer completed callbacks. - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ - __weak void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *hi2c) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_I2C_TxCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Slave Rx Transfer completed callbacks. - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ -__weak void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_I2C_TxCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Memory Tx Transfer completed callbacks. - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ - __weak void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_I2C_TxCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Memory Rx Transfer completed callbacks. - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ -__weak void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_I2C_TxCpltCallback could be implemented in the user file - */ -} - -/** - * @brief I2C error callbacks. - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval None - */ - __weak void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_I2C_ErrorCallback could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup I2C_Exported_Functions_Group3 Peripheral State and Errors functions - * @brief Peripheral State and Errors functions - * -@verbatim - =============================================================================== - ##### Peripheral State and Errors functions ##### - =============================================================================== - [..] - This subsection permits to get in run-time the status of the peripheral - and the data flow. - -@endverbatim - * @{ - */ - -/** - * @brief Returns the I2C state. - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval HAL state - */ -HAL_I2C_StateTypeDef HAL_I2C_GetState(I2C_HandleTypeDef *hi2c) -{ - return hi2c->State; -} - -/** - * @brief Return the I2C error code - * @param hi2c : pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for the specified I2C. -* @retval I2C Error Code -*/ -uint32_t HAL_I2C_GetError(I2C_HandleTypeDef *hi2c) -{ - return hi2c->ErrorCode; -} - -/** - * @} - */ - -/** - * @brief Handle TXE flag for Master - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_MasterTransmit_TXE(I2C_HandleTypeDef *hi2c) -{ - /* Write data to DR */ - hi2c->Instance->DR = (*hi2c->pBuffPtr++); - hi2c->XferCount--; - - if(hi2c->XferCount == 0) - { - /* Disable BUF interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF); - } - - return HAL_OK; -} - -/** - * @brief Handle BTF flag for Master transmitter - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_MasterTransmit_BTF(I2C_HandleTypeDef *hi2c) -{ - if(hi2c->XferCount != 0) - { - /* Write data to DR */ - hi2c->Instance->DR = (*hi2c->pBuffPtr++); - hi2c->XferCount--; - } - else - { - /* Disable EVT, BUF and ERR interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - /* Generate Stop */ - hi2c->Instance->CR1 |= I2C_CR1_STOP; - - if(hi2c->State == HAL_I2C_STATE_MEM_BUSY_TX) - { - hi2c->State = HAL_I2C_STATE_READY; - - HAL_I2C_MemTxCpltCallback(hi2c); - } - else - { - hi2c->State = HAL_I2C_STATE_READY; - - HAL_I2C_MasterTxCpltCallback(hi2c); - } - } - return HAL_OK; -} - -/** - * @brief Handle RXNE flag for Master - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_MasterReceive_RXNE(I2C_HandleTypeDef *hi2c) -{ - uint32_t tmp = 0; - - tmp = hi2c->XferCount; - if(tmp > 3) - { - /* Read data from DR */ - (*hi2c->pBuffPtr++) = hi2c->Instance->DR; - hi2c->XferCount--; - } - else if((tmp == 2) || (tmp == 3)) - { - /* Disable BUF interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_BUF); - } - else - { - /* Disable EVT, BUF and ERR interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - /* Read data from DR */ - (*hi2c->pBuffPtr++) = hi2c->Instance->DR; - hi2c->XferCount--; - - if(hi2c->State == HAL_I2C_STATE_MEM_BUSY_RX) - { - hi2c->State = HAL_I2C_STATE_READY; - - HAL_I2C_MemRxCpltCallback(hi2c); - } - else - { - hi2c->State = HAL_I2C_STATE_READY; - - HAL_I2C_MasterRxCpltCallback(hi2c); - } - } - return HAL_OK; -} - -/** - * @brief Handle BTF flag for Master receiver - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_MasterReceive_BTF(I2C_HandleTypeDef *hi2c) -{ - if(hi2c->XferCount == 3) - { - /* Disable Acknowledge */ - hi2c->Instance->CR1 &= ~I2C_CR1_ACK; - - /* Read data from DR */ - (*hi2c->pBuffPtr++) = hi2c->Instance->DR; - hi2c->XferCount--; - } - else if(hi2c->XferCount == 2) - { - /* Generate Stop */ - hi2c->Instance->CR1 |= I2C_CR1_STOP; - - /* Read data from DR */ - (*hi2c->pBuffPtr++) = hi2c->Instance->DR; - hi2c->XferCount--; - - /* Read data from DR */ - (*hi2c->pBuffPtr++) = hi2c->Instance->DR; - hi2c->XferCount--; - - /* Disable EVT and ERR interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_ERR); - - if(hi2c->State == HAL_I2C_STATE_MEM_BUSY_RX) - { - hi2c->State = HAL_I2C_STATE_READY; - - HAL_I2C_MemRxCpltCallback(hi2c); - } - else - { - hi2c->State = HAL_I2C_STATE_READY; - - HAL_I2C_MasterRxCpltCallback(hi2c); - } - } - else - { - /* Read data from DR */ - (*hi2c->pBuffPtr++) = hi2c->Instance->DR; - hi2c->XferCount--; - } - return HAL_OK; -} - -/** - * @brief Handle TXE flag for Slave - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_SlaveTransmit_TXE(I2C_HandleTypeDef *hi2c) -{ - if(hi2c->XferCount != 0) - { - /* Write data to DR */ - hi2c->Instance->DR = (*hi2c->pBuffPtr++); - hi2c->XferCount--; - } - return HAL_OK; -} - -/** - * @brief Handle BTF flag for Slave transmitter - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_SlaveTransmit_BTF(I2C_HandleTypeDef *hi2c) -{ - if(hi2c->XferCount != 0) - { - /* Write data to DR */ - hi2c->Instance->DR = (*hi2c->pBuffPtr++); - hi2c->XferCount--; - } - return HAL_OK; -} - -/** - * @brief Handle RXNE flag for Slave - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_SlaveReceive_RXNE(I2C_HandleTypeDef *hi2c) -{ - if(hi2c->XferCount != 0) - { - /* Read data from DR */ - (*hi2c->pBuffPtr++) = hi2c->Instance->DR; - hi2c->XferCount--; - } - return HAL_OK; -} - -/** - * @brief Handle BTF flag for Slave receiver - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_SlaveReceive_BTF(I2C_HandleTypeDef *hi2c) -{ - if(hi2c->XferCount != 0) - { - /* Read data from DR */ - (*hi2c->pBuffPtr++) = hi2c->Instance->DR; - hi2c->XferCount--; - } - return HAL_OK; -} - -/** - * @brief Handle ADD flag for Slave - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_Slave_ADDR(I2C_HandleTypeDef *hi2c) -{ - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - return HAL_OK; -} - -/** - * @brief Handle STOPF flag for Slave - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_Slave_STOPF(I2C_HandleTypeDef *hi2c) -{ - /* Disable EVT, BUF and ERR interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - /* Clear STOPF flag */ - __HAL_I2C_CLEAR_STOPFLAG(hi2c); - - /* Disable Acknowledge */ - hi2c->Instance->CR1 &= ~I2C_CR1_ACK; - - hi2c->State = HAL_I2C_STATE_READY; - - HAL_I2C_SlaveRxCpltCallback(hi2c); - - return HAL_OK; -} - -/** - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_Slave_AF(I2C_HandleTypeDef *hi2c) -{ - /* Disable EVT, BUF and ERR interrupt */ - __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR); - - /* Clear AF flag */ - __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); - - /* Disable Acknowledge */ - hi2c->Instance->CR1 &= ~I2C_CR1_ACK; - - hi2c->State = HAL_I2C_STATE_READY; - - HAL_I2C_SlaveTxCpltCallback(hi2c); - - return HAL_OK; -} - -/** - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @param DevAddress: Target device address - * @param Timeout: Timeout duration - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_MasterRequestWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Timeout) -{ - /* Generate Start */ - hi2c->Instance->CR1 |= I2C_CR1_START; - - /* Wait until SB flag is set */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - if(hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT) - { - /* Send slave address */ - hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress); - } - else - { - /* Send header of slave address */ - hi2c->Instance->DR = I2C_10BIT_HEADER_WRITE(DevAddress); - - /* Wait until ADD10 flag is set */ - if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADD10, Timeout) != HAL_OK) - { - if(hi2c->ErrorCode == HAL_I2C_ERROR_AF) - { - return HAL_ERROR; - } - else - { - return HAL_TIMEOUT; - } - } - - /* Send slave address */ - hi2c->Instance->DR = I2C_10BIT_ADDRESS(DevAddress); - } - - /* Wait until ADDR flag is set */ - if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout) != HAL_OK) - { - if(hi2c->ErrorCode == HAL_I2C_ERROR_AF) - { - return HAL_ERROR; - } - else - { - return HAL_TIMEOUT; - } - } - - return HAL_OK; -} - -/** - * @brief Master sends target device address for read request. - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @param DevAddress: Target device address - * @param Timeout: Timeout duration - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_MasterRequestRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Timeout) -{ - /* Enable Acknowledge */ - hi2c->Instance->CR1 |= I2C_CR1_ACK; - - /* Generate Start */ - hi2c->Instance->CR1 |= I2C_CR1_START; - - /* Wait until SB flag is set */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - if(hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT) - { - /* Send slave address */ - hi2c->Instance->DR = I2C_7BIT_ADD_READ(DevAddress); - } - else - { - /* Send header of slave address */ - hi2c->Instance->DR = I2C_10BIT_HEADER_WRITE(DevAddress); - - /* Wait until ADD10 flag is set */ - if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADD10, Timeout) != HAL_OK) - { - if(hi2c->ErrorCode == HAL_I2C_ERROR_AF) - { - return HAL_ERROR; - } - else - { - return HAL_TIMEOUT; - } - } - - /* Send slave address */ - hi2c->Instance->DR = I2C_10BIT_ADDRESS(DevAddress); - - /* Wait until ADDR flag is set */ - if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout) != HAL_OK) - { - if(hi2c->ErrorCode == HAL_I2C_ERROR_AF) - { - return HAL_ERROR; - } - else - { - return HAL_TIMEOUT; - } - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Generate Restart */ - hi2c->Instance->CR1 |= I2C_CR1_START; - - /* Wait until SB flag is set */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Send header of slave address */ - hi2c->Instance->DR = I2C_10BIT_HEADER_READ(DevAddress); - } - - /* Wait until ADDR flag is set */ - if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout) != HAL_OK) - { - if(hi2c->ErrorCode == HAL_I2C_ERROR_AF) - { - return HAL_ERROR; - } - else - { - return HAL_TIMEOUT; - } - } - - return HAL_OK; -} - -/** - * @brief Master sends target device address followed by internal memory address for write request. - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @param DevAddress: Target device address - * @param MemAddress: Internal memory address - * @param MemAddSize: Size of internal memory address - * @param Timeout: Timeout duration - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_RequestMemoryWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout) -{ - /* Generate Start */ - hi2c->Instance->CR1 |= I2C_CR1_START; - - /* Wait until SB flag is set */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Send slave address */ - hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress); - - /* Wait until ADDR flag is set */ - if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout) != HAL_OK) - { - if(hi2c->ErrorCode == HAL_I2C_ERROR_AF) - { - return HAL_ERROR; - } - else - { - return HAL_TIMEOUT; - } - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Wait until TXE flag is set */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TXE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* If Memory address size is 8Bit */ - if(MemAddSize == I2C_MEMADD_SIZE_8BIT) - { - /* Send Memory Address */ - hi2c->Instance->DR = I2C_MEM_ADD_LSB(MemAddress); - } - /* If Memory address size is 16Bit */ - else - { - /* Send MSB of Memory Address */ - hi2c->Instance->DR = I2C_MEM_ADD_MSB(MemAddress); - - /* Wait until TXE flag is set */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TXE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Send LSB of Memory Address */ - hi2c->Instance->DR = I2C_MEM_ADD_LSB(MemAddress); - } - - return HAL_OK; -} - -/** - * @brief Master sends target device address followed by internal memory address for read request. - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @param DevAddress: Target device address - * @param MemAddress: Internal memory address - * @param MemAddSize: Size of internal memory address - * @param Timeout: Timeout duration - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_RequestMemoryRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout) -{ - /* Enable Acknowledge */ - hi2c->Instance->CR1 |= I2C_CR1_ACK; - - /* Generate Start */ - hi2c->Instance->CR1 |= I2C_CR1_START; - - /* Wait until SB flag is set */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Send slave address */ - hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress); - - /* Wait until ADDR flag is set */ - if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout) != HAL_OK) - { - if(hi2c->ErrorCode == HAL_I2C_ERROR_AF) - { - return HAL_ERROR; - } - else - { - return HAL_TIMEOUT; - } - } - - /* Clear ADDR flag */ - __HAL_I2C_CLEAR_ADDRFLAG(hi2c); - - /* Wait until TXE flag is set */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TXE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* If Memory address size is 8Bit */ - if(MemAddSize == I2C_MEMADD_SIZE_8BIT) - { - /* Send Memory Address */ - hi2c->Instance->DR = I2C_MEM_ADD_LSB(MemAddress); - } - /* If Memory address size is 16Bit */ - else - { - /* Send MSB of Memory Address */ - hi2c->Instance->DR = I2C_MEM_ADD_MSB(MemAddress); - - /* Wait until TXE flag is set */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TXE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Send LSB of Memory Address */ - hi2c->Instance->DR = I2C_MEM_ADD_LSB(MemAddress); - } - - /* Wait until TXE flag is set */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TXE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Generate Restart */ - hi2c->Instance->CR1 |= I2C_CR1_START; - - /* Wait until SB flag is set */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Send slave address */ - hi2c->Instance->DR = I2C_7BIT_ADD_READ(DevAddress); - - /* Wait until ADDR flag is set */ - if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout) != HAL_OK) - { - if(hi2c->ErrorCode == HAL_I2C_ERROR_AF) - { - return HAL_ERROR; - } - else - { - return HAL_TIMEOUT; - } - } - - return HAL_OK; -} - -/** - * @brief DMA I2C master transmit process complete callback. - * @param hdma: DMA handle - * @retval None - */ -static void I2C_DMAMasterTransmitCplt(DMA_HandleTypeDef *hdma) -{ - I2C_HandleTypeDef* hi2c = (I2C_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent; - - /* Wait until BTF flag is reset */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, I2C_TIMEOUT_FLAG) != HAL_OK) - { - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - } - - /* Generate Stop */ - hi2c->Instance->CR1 |= I2C_CR1_STOP; - - /* Disable DMA Request */ - hi2c->Instance->CR2 &= ~I2C_CR2_DMAEN; - - hi2c->XferCount = 0; - - hi2c->State = HAL_I2C_STATE_READY; - - /* Check if Errors has been detected during transfer */ - if(hi2c->ErrorCode != HAL_I2C_ERROR_NONE) - { - HAL_I2C_ErrorCallback(hi2c); - } - else - { - HAL_I2C_MasterTxCpltCallback(hi2c); - } -} - -/** - * @brief DMA I2C slave transmit process complete callback. - * @param hdma: DMA handle - * @retval None - */ -static void I2C_DMASlaveTransmitCplt(DMA_HandleTypeDef *hdma) -{ - I2C_HandleTypeDef* hi2c = (I2C_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent; - - /* Wait until AF flag is reset */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_AF, RESET, I2C_TIMEOUT_FLAG) != HAL_OK) - { - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - } - - /* Clear AF flag */ - __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); - - /* Disable Address Acknowledge */ - hi2c->Instance->CR1 &= ~I2C_CR1_ACK; - - /* Disable DMA Request */ - hi2c->Instance->CR2 &= ~I2C_CR2_DMAEN; - - hi2c->XferCount = 0; - - hi2c->State = HAL_I2C_STATE_READY; - - /* Check if Errors has been detected during transfer */ - if(hi2c->ErrorCode != HAL_I2C_ERROR_NONE) - { - HAL_I2C_ErrorCallback(hi2c); - } - else - { - HAL_I2C_SlaveTxCpltCallback(hi2c); - } -} - -/** - * @brief DMA I2C master receive process complete callback - * @param hdma: DMA handle - * @retval None - */ -static void I2C_DMAMasterReceiveCplt(DMA_HandleTypeDef *hdma) -{ - I2C_HandleTypeDef* hi2c = (I2C_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent; - - /* Disable Acknowledge */ - hi2c->Instance->CR1 &= ~I2C_CR1_ACK; - - /* Generate Stop */ - hi2c->Instance->CR1 |= I2C_CR1_STOP; - - /* Disable Last DMA */ - hi2c->Instance->CR2 &= ~I2C_CR2_LAST; - - /* Disable DMA Request */ - hi2c->Instance->CR2 &= ~I2C_CR2_DMAEN; - - hi2c->XferCount = 0; - - hi2c->State = HAL_I2C_STATE_READY; - - /* Check if Errors has been detected during transfer */ - if(hi2c->ErrorCode != HAL_I2C_ERROR_NONE) - { - HAL_I2C_ErrorCallback(hi2c); - } - else - { - HAL_I2C_MasterRxCpltCallback(hi2c); - } -} - -/** - * @brief DMA I2C slave receive process complete callback. - * @param hdma: DMA handle - * @retval None - */ -static void I2C_DMASlaveReceiveCplt(DMA_HandleTypeDef *hdma) -{ - I2C_HandleTypeDef* hi2c = (I2C_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent; - - /* Wait until STOPF flag is reset */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_STOPF, RESET, I2C_TIMEOUT_FLAG) != HAL_OK) - { - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - } - - /* Clear STOPF flag */ - __HAL_I2C_CLEAR_STOPFLAG(hi2c); - - /* Disable Address Acknowledge */ - hi2c->Instance->CR1 &= ~I2C_CR1_ACK; - - /* Disable DMA Request */ - hi2c->Instance->CR2 &= ~I2C_CR2_DMAEN; - - hi2c->XferCount = 0; - - hi2c->State = HAL_I2C_STATE_READY; - - /* Check if Errors has been detected during transfer */ - if(hi2c->ErrorCode != HAL_I2C_ERROR_NONE) - { - HAL_I2C_ErrorCallback(hi2c); - } - else - { - HAL_I2C_SlaveRxCpltCallback(hi2c); - } -} - -/** - * @brief DMA I2C Memory Write process complete callback - * @param hdma: DMA handle - * @retval None - */ -static void I2C_DMAMemTransmitCplt(DMA_HandleTypeDef *hdma) -{ - I2C_HandleTypeDef* hi2c = (I2C_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent; - - /* Wait until BTF flag is reset */ - if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BTF, RESET, I2C_TIMEOUT_FLAG) != HAL_OK) - { - hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; - } - - /* Generate Stop */ - hi2c->Instance->CR1 |= I2C_CR1_STOP; - - /* Disable DMA Request */ - hi2c->Instance->CR2 &= ~I2C_CR2_DMAEN; - - hi2c->XferCount = 0; - - hi2c->State = HAL_I2C_STATE_READY; - - /* Check if Errors has been detected during transfer */ - if(hi2c->ErrorCode != HAL_I2C_ERROR_NONE) - { - HAL_I2C_ErrorCallback(hi2c); - } - else - { - HAL_I2C_MemTxCpltCallback(hi2c); - } -} - -/** - * @brief DMA I2C Memory Read process complete callback - * @param hdma: DMA handle - * @retval None - */ -static void I2C_DMAMemReceiveCplt(DMA_HandleTypeDef *hdma) -{ - I2C_HandleTypeDef* hi2c = (I2C_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent; - - /* Disable Acknowledge */ - hi2c->Instance->CR1 &= ~I2C_CR1_ACK; - - /* Generate Stop */ - hi2c->Instance->CR1 |= I2C_CR1_STOP; - - /* Disable Last DMA */ - hi2c->Instance->CR2 &= ~I2C_CR2_LAST; - - /* Disable DMA Request */ - hi2c->Instance->CR2 &= ~I2C_CR2_DMAEN; - - hi2c->XferCount = 0; - - hi2c->State = HAL_I2C_STATE_READY; - - /* Check if Errors has been detected during transfer */ - if(hi2c->ErrorCode != HAL_I2C_ERROR_NONE) - { - HAL_I2C_ErrorCallback(hi2c); - } - else - { - HAL_I2C_MemRxCpltCallback(hi2c); - } -} - -/** - * @brief DMA I2C communication error callback. - * @param hdma: DMA handle - * @retval None - */ -static void I2C_DMAError(DMA_HandleTypeDef *hdma) -{ - I2C_HandleTypeDef* hi2c = (I2C_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent; - - /* Disable Acknowledge */ - hi2c->Instance->CR1 &= ~I2C_CR1_ACK; - - hi2c->XferCount = 0; - - hi2c->State = HAL_I2C_STATE_READY; - - hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; - - HAL_I2C_ErrorCallback(hi2c); -} - -/** - * @brief This function handles I2C Communication Timeout. - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @param Flag: specifies the I2C flag to check. - * @param Status: The new Flag status (SET or RESET). - * @param Timeout: Timeout duration - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_WaitOnFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, FlagStatus Status, uint32_t Timeout) -{ - uint32_t tickstart = 0; - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait until flag is set */ - if(Status == RESET) - { - while(__HAL_I2C_GET_FLAG(hi2c, Flag) == RESET) - { - /* Check for the Timeout */ - if(Timeout != HAL_MAX_DELAY) - { - if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout)) - { - hi2c->State= HAL_I2C_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_TIMEOUT; - } - } - } - } - else - { - while(__HAL_I2C_GET_FLAG(hi2c, Flag) != RESET) - { - /* Check for the Timeout */ - if(Timeout != HAL_MAX_DELAY) - { - if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout)) - { - hi2c->State= HAL_I2C_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_TIMEOUT; - } - } - } - } - return HAL_OK; -} - -/** - * @brief This function handles I2C Communication Timeout for Master addressing phase. - * @param hi2c: pointer to a I2C_HandleTypeDef structure that contains - * the configuration information for I2C module - * @param Flag: specifies the I2C flag to check. - * @param Timeout: Timeout duration - * @retval HAL status - */ -static HAL_StatusTypeDef I2C_WaitOnMasterAddressFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, uint32_t Timeout) -{ - uint32_t tickstart = 0; - - /* Get tick */ - tickstart = HAL_GetTick(); - - while(__HAL_I2C_GET_FLAG(hi2c, Flag) == RESET) - { - if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) == SET) - { - /* Generate Stop */ - hi2c->Instance->CR1 |= I2C_CR1_STOP; - - /* Clear AF Flag */ - __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); - - hi2c->ErrorCode = HAL_I2C_ERROR_AF; - hi2c->State= HAL_I2C_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_ERROR; - } - - /* Check for the Timeout */ - if(Timeout != HAL_MAX_DELAY) - { - if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout)) - { - hi2c->State= HAL_I2C_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2c); - - return HAL_TIMEOUT; - } - } - } - return HAL_OK; -} - -/** - * @} - */ - -#endif /* HAL_I2C_MODULE_ENABLED */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_i2s.c b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_i2s.c deleted file mode 100755 index 1159b7b2..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_i2s.c +++ /dev/null @@ -1,1498 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_hal_i2s.c - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief I2S HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the Integrated Interchip Sound (I2S) peripheral: - * + Initialization and de-initialization functions - * + IO operation functions - * + Peripheral State and Errors functions - @verbatim - =============================================================================== - ##### How to use this driver ##### - =============================================================================== - [..] - The I2S HAL driver can be used as follow: - - (#) Declare a I2S_HandleTypeDef handle structure. - (#) Initialize the I2S low level resources by implement the HAL_I2S_MspInit() API: - (##) Enable the SPIx interface clock. - (##) I2S pins configuration: - (+++) Enable the clock for the I2S GPIOs. - (+++) Configure these I2S pins as alternate function pull-up. - (##) NVIC configuration if you need to use interrupt process (HAL_I2S_Transmit_IT() - and HAL_I2S_Receive_IT() APIs). - (+++) Configure the I2Sx interrupt priority. - (+++) Enable the NVIC I2S IRQ handle. - (##) DMA Configuration if you need to use DMA process (HAL_I2S_Transmit_DMA() - and HAL_I2S_Receive_DMA() APIs: - (+++) Declare a DMA handle structure for the Tx/Rx stream. - (+++) Enable the DMAx interface clock. - (+++) Configure the declared DMA handle structure with the required Tx/Rx parameters. - (+++) Configure the DMA Tx/Rx Stream. - (+++) Associate the initialized DMA handle to the I2S DMA Tx/Rx handle. - (+++) Configure the priority and enable the NVIC for the transfer complete interrupt on the - DMA Tx/Rx Stream. - - (#) Program the Mode, Standard, Data Format, MCLK Output, Audio frequency and Polarity - using HAL_I2S_Init() function. - - -@- The specific I2S interrupts (Transmission complete interrupt, - RXNE interrupt and Error Interrupts) will be managed using the macros - __I2S_ENABLE_IT() and __I2S_DISABLE_IT() inside the transmit and receive process. - -@- Make sure that either: - (+@) I2S PLL is configured or - (+@) External clock source is configured after setting correctly - the define constant EXTERNAL_CLOCK_VALUE in the stm32f2xx_hal_conf.h file. - - (#) Three operation modes are available within this driver : - - *** Polling mode IO operation *** - ================================= - [..] - (+) Send an amount of data in blocking mode using HAL_I2S_Transmit() - (+) Receive an amount of data in blocking mode using HAL_I2S_Receive() - - *** Interrupt mode IO operation *** - =================================== - [..] - (+) Send an amount of data in non blocking mode using HAL_I2S_Transmit_IT() - (+) At transmission end of half transfer HAL_I2S_TxHalfCpltCallback is executed and user can - add his own code by customization of function pointer HAL_I2S_TxHalfCpltCallback - (+) At transmission end of transfer HAL_I2S_TxCpltCallback is executed and user can - add his own code by customization of function pointer HAL_I2S_TxCpltCallback - (+) Receive an amount of data in non blocking mode using HAL_I2S_Receive_IT() - (+) At reception end of half transfer HAL_I2S_RxHalfCpltCallback is executed and user can - add his own code by customization of function pointer HAL_I2S_RxHalfCpltCallback - (+) At reception end of transfer HAL_I2S_RxCpltCallback is executed and user can - add his own code by customization of function pointer HAL_I2S_RxCpltCallback - (+) In case of transfer Error, HAL_I2S_ErrorCallback() function is executed and user can - add his own code by customization of function pointer HAL_I2S_ErrorCallback - - *** DMA mode IO operation *** - ============================== - [..] - (+) Send an amount of data in non blocking mode (DMA) using HAL_I2S_Transmit_DMA() - (+) At transmission end of half transfer HAL_I2S_TxHalfCpltCallback is executed and user can - add his own code by customization of function pointer HAL_I2S_TxHalfCpltCallback - (+) At transmission end of transfer HAL_I2S_TxCpltCallback is executed and user can - add his own code by customization of function pointer HAL_I2S_TxCpltCallback - (+) Receive an amount of data in non blocking mode (DMA) using HAL_I2S_Receive_DMA() - (+) At reception end of half transfer HAL_I2S_RxHalfCpltCallback is executed and user can - add his own code by customization of function pointer HAL_I2S_RxHalfCpltCallback - (+) At reception end of transfer HAL_I2S_RxCpltCallback is executed and user can - add his own code by customization of function pointer HAL_I2S_RxCpltCallback - (+) In case of transfer Error, HAL_I2S_ErrorCallback() function is executed and user can - add his own code by customization of function pointer HAL_I2S_ErrorCallback - (+) Pause the DMA Transfer using HAL_I2S_DMAPause() - (+) Resume the DMA Transfer using HAL_I2S_DMAResume() - (+) Stop the DMA Transfer using HAL_I2S_DMAStop() - - *** I2S HAL driver macros list *** - ============================================= - [..] - Below the list of most used macros in USART HAL driver. - - (+) __HAL_I2S_ENABLE: Enable the specified SPI peripheral (in I2S mode) - (+) __HAL_I2S_DISABLE: Disable the specified SPI peripheral (in I2S mode) - (+) __HAL_I2S_ENABLE_IT : Enable the specified I2S interrupts - (+) __HAL_I2S_DISABLE_IT : Disable the specified I2S interrupts - (+) __HAL_I2S_GET_FLAG: Check whether the specified I2S flag is set or not - - [..] - (@) You can refer to the I2S HAL driver header file for more useful macros - - @endverbatim - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal.h" - -/** @addtogroup STM32F2xx_HAL_Driver - * @{ - */ - -/** @defgroup I2S I2S - * @brief I2S HAL module driver - * @{ - */ - -#ifdef HAL_I2S_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/** @addtogroup I2S_Private_Functions - * @{ - */ -static void I2S_DMATxCplt(DMA_HandleTypeDef *hdma); -static void I2S_DMATxHalfCplt(DMA_HandleTypeDef *hdma); -static void I2S_DMARxCplt(DMA_HandleTypeDef *hdma); -static void I2S_DMARxHalfCplt(DMA_HandleTypeDef *hdma); -static void I2S_DMAError(DMA_HandleTypeDef *hdma); -static HAL_StatusTypeDef I2S_WaitFlagStateUntilTimeout(I2S_HandleTypeDef *hi2s, uint32_t Flag, uint32_t Status, uint32_t Timeout); -static HAL_StatusTypeDef I2S_Transmit_IT(I2S_HandleTypeDef *hi2s); -static HAL_StatusTypeDef I2S_Receive_IT(I2S_HandleTypeDef *hi2s); -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup I2S_Exported_Functions I2S Exported Functions - * @{ - */ - -/** @defgroup I2S_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] This subsection provides a set of functions allowing to initialize and - de-initialize the I2Sx peripheral in simplex mode: - - (+) User must Implement HAL_I2S_MspInit() function in which he configures - all related peripherals resources (CLOCK, GPIO, DMA, IT and NVIC ). - - (+) Call the function HAL_I2S_Init() to configure the selected device with - the selected configuration: - (++) Mode - (++) Standard - (++) Data Format - (++) MCLK Output - (++) Audio frequency - (++) Polarity - - (+) Call the function HAL_I2S_DeInit() to restore the default configuration - of the selected I2Sx peripheral. -@endverbatim - * @{ - */ - -/** - * @brief Initializes the I2S according to the specified parameters - * in the I2S_InitTypeDef and create the associated handle. - * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains - * the configuration information for I2S module - * @retval HAL status - */ -__weak HAL_StatusTypeDef HAL_I2S_Init(I2S_HandleTypeDef *hi2s) -{ - uint32_t tmpreg = 0, i2sdiv = 2, i2sodd = 0, packetlength = 1; - uint32_t tmp = 0, i2sclk = 0; - - /* Check the I2S handle allocation */ - if(hi2s == NULL) - { - return HAL_ERROR; - } - - /* Check the I2S parameters */ - assert_param(IS_I2S_ALL_INSTANCE(hi2s->Instance)); - assert_param(IS_I2S_MODE(hi2s->Init.Mode)); - assert_param(IS_I2S_STANDARD(hi2s->Init.Standard)); - assert_param(IS_I2S_DATA_FORMAT(hi2s->Init.DataFormat)); - assert_param(IS_I2S_MCLK_OUTPUT(hi2s->Init.MCLKOutput)); - assert_param(IS_I2S_AUDIO_FREQ(hi2s->Init.AudioFreq)); - assert_param(IS_I2S_CPOL(hi2s->Init.CPOL)); - assert_param(IS_I2S_CLOCKSOURCE(hi2s->Init.ClockSource)); - - if(hi2s->State == HAL_I2S_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - hi2s->Lock = HAL_UNLOCKED; - /* Init the low level hardware : GPIO, CLOCK, CORTEX...etc */ - HAL_I2S_MspInit(hi2s); - } - - hi2s->State = HAL_I2S_STATE_BUSY; - - /*----------------------- SPIx I2SCFGR & I2SPR Configuration ---------------*/ - /* Clear I2SMOD, I2SE, I2SCFG, PCMSYNC, I2SSTD, CKPOL, DATLEN and CHLEN bits */ - hi2s->Instance->I2SCFGR &= ~(SPI_I2SCFGR_CHLEN | SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CKPOL | \ - SPI_I2SCFGR_I2SSTD | SPI_I2SCFGR_PCMSYNC | SPI_I2SCFGR_I2SCFG | \ - SPI_I2SCFGR_I2SE | SPI_I2SCFGR_I2SMOD); - hi2s->Instance->I2SPR = 0x0002; - - /* Get the I2SCFGR register value */ - tmpreg = hi2s->Instance->I2SCFGR; - - /* If the default frequency value has to be written, reinitialize i2sdiv and i2sodd */ - /* If the requested audio frequency is not the default, compute the prescaler */ - if(hi2s->Init.AudioFreq != I2S_AUDIOFREQ_DEFAULT) - { - /* Check the frame length (For the Prescaler computing) *******************/ - if(hi2s->Init.DataFormat != I2S_DATAFORMAT_16B) - { - /* Packet length is 32 bits */ - packetlength = 2; - } - - /* Get I2S source Clock frequency ****************************************/ - /* If an external I2S clock has to be used, the specific define should be set - in the project configuration or in the stm32f2xx_conf.h file */ - if(hi2s->Init.ClockSource == I2S_CLOCK_EXTERNAL) - { - /* Set external clock as I2S clock source */ - if((RCC->CFGR & RCC_CFGR_I2SSRC) == 0) - { - RCC->CFGR |= (uint32_t)RCC_CFGR_I2SSRC; - } - - /* Set the I2S clock to the external clock value */ - i2sclk = EXTERNAL_CLOCK_VALUE; - } - else - { - /* Check if PLLI2S is enabled or Not */ - if((RCC->CR & RCC_CR_PLLI2SON) != RCC_CR_PLLI2SON) - { - hi2s->State= HAL_I2S_STATE_READY; - - return HAL_ERROR; - } - - /* Set PLLI2S as I2S clock source */ - if((RCC->CFGR & RCC_CFGR_I2SSRC) != 0) - { - RCC->CFGR &= ~(uint32_t)RCC_CFGR_I2SSRC; - } - - /* Get the PLLM value */ - if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) - { - /* Get the I2S source clock value */ - i2sclk = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - else - { - /* Get the I2S source clock value */ - i2sclk = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); - } - i2sclk *= (uint32_t)(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6) & (RCC_PLLI2SCFGR_PLLI2SN >> 6)); - i2sclk /= (uint32_t)(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28) & (RCC_PLLI2SCFGR_PLLI2SR >> 28)); - } - - /* Compute the Real divider depending on the MCLK output state, with a floating point */ - if(hi2s->Init.MCLKOutput == I2S_MCLKOUTPUT_ENABLE) - { - /* MCLK output is enabled */ - tmp = (uint32_t)(((((i2sclk / 256) * 10) / hi2s->Init.AudioFreq)) + 5); - } - else - { - /* MCLK output is disabled */ - tmp = (uint32_t)(((((i2sclk / (32 * packetlength)) *10 ) / hi2s->Init.AudioFreq)) + 5); - } - - /* Remove the flatting point */ - tmp = tmp / 10; - - /* Check the parity of the divider */ - i2sodd = (uint32_t)(tmp & (uint32_t)1); - - /* Compute the i2sdiv prescaler */ - i2sdiv = (uint32_t)((tmp - i2sodd) / 2); - - /* Get the Mask for the Odd bit (SPI_I2SPR[8]) register */ - i2sodd = (uint32_t) (i2sodd << 8); - } - - /* Test if the divider is 1 or 0 or greater than 0xFF */ - if((i2sdiv < 2) || (i2sdiv > 0xFF)) - { - /* Set the default values */ - i2sdiv = 2; - i2sodd = 0; - } - - /* Write to SPIx I2SPR register the computed value */ - hi2s->Instance->I2SPR = (uint32_t)((uint32_t)i2sdiv | (uint32_t)(i2sodd | (uint32_t)hi2s->Init.MCLKOutput)); - - /* Configure the I2S with the I2S_InitStruct values */ - tmpreg |= (uint32_t)(SPI_I2SCFGR_I2SMOD | hi2s->Init.Mode | hi2s->Init.Standard | hi2s->Init.DataFormat | hi2s->Init.CPOL); - - /* Write to SPIx I2SCFGR */ - hi2s->Instance->I2SCFGR = tmpreg; - hi2s->ErrorCode = HAL_I2S_ERROR_NONE; - hi2s->State= HAL_I2S_STATE_READY; - - return HAL_OK; -} - -/** - * @brief DeInitializes the I2S peripheral - * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains - * the configuration information for I2S module - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2S_DeInit(I2S_HandleTypeDef *hi2s) -{ - /* Check the I2S handle allocation */ - if(hi2s == NULL) - { - return HAL_ERROR; - } - - hi2s->State = HAL_I2S_STATE_BUSY; - - /* DeInit the low level hardware: GPIO, CLOCK, NVIC... */ - HAL_I2S_MspDeInit(hi2s); - - hi2s->ErrorCode = HAL_I2S_ERROR_NONE; - hi2s->State = HAL_I2S_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(hi2s); - - return HAL_OK; -} - -/** - * @brief I2S MSP Init - * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains - * the configuration information for I2S module - * @retval None - */ - __weak void HAL_I2S_MspInit(I2S_HandleTypeDef *hi2s) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_I2S_MspInit could be implemented in the user file - */ -} - -/** - * @brief I2S MSP DeInit - * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains - * the configuration information for I2S module - * @retval None - */ - __weak void HAL_I2S_MspDeInit(I2S_HandleTypeDef *hi2s) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_I2S_MspDeInit could be implemented in the user file - */ -} -/** - * @} - */ - -/** @defgroup I2S_Exported_Functions_Group2 IO operation functions - * @brief Data transfers functions - * -@verbatim - =============================================================================== - ##### IO operation functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to manage the I2S data - transfers. - - (#) There are two modes of transfer: - (++) Blocking mode : The communication is performed in the polling mode. - The status of all data processing is returned by the same function - after finishing transfer. - (++) No-Blocking mode : The communication is performed using Interrupts - or DMA. These functions return the status of the transfer startup. - The end of the data processing will be indicated through the - dedicated I2S IRQ when using Interrupt mode or the DMA IRQ when - using DMA mode. - - (#) Blocking mode functions are : - (++) HAL_I2S_Transmit() - (++) HAL_I2S_Receive() - - (#) No-Blocking mode functions with Interrupt are : - (++) HAL_I2S_Transmit_IT() - (++) HAL_I2S_Receive_IT() - - (#) No-Blocking mode functions with DMA are : - (++) HAL_I2S_Transmit_DMA() - (++) HAL_I2S_Receive_DMA() - - (#) A set of Transfer Complete Callbacks are provided in non Blocking mode: - (++) HAL_I2S_TxCpltCallback() - (++) HAL_I2S_RxCpltCallback() - (++) HAL_I2S_ErrorCallback() - -@endverbatim - * @{ - */ - -/** - * @brief Transmit an amount of data in blocking mode - * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains - * the configuration information for I2S module - * @param pData: a 16-bit pointer to data buffer. - * @param Size: number of data sample to be sent: - * @note When a 16-bit data frame or a 16-bit data frame extended is selected during the I2S - * configuration phase, the Size parameter means the number of 16-bit data length - * in the transaction and when a 24-bit data frame or a 32-bit data frame is selected - * the Size parameter means the number of 16-bit data length. - * @param Timeout: Timeout duration - * @note The I2S is kept enabled at the end of transaction to avoid the clock de-synchronization - * between Master and Slave(example: audio streaming). - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2S_Transmit(I2S_HandleTypeDef *hi2s, uint16_t *pData, uint16_t Size, uint32_t Timeout) -{ - uint32_t tmp1 = 0; - if((pData == NULL ) || (Size == 0)) - { - return HAL_ERROR; - } - - if(hi2s->State == HAL_I2S_STATE_READY) - { - tmp1 = hi2s->Instance->I2SCFGR & (SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN); - - if((tmp1 == I2S_DATAFORMAT_24B) || (tmp1 == I2S_DATAFORMAT_32B)) - { - hi2s->TxXferSize = Size*2; - hi2s->TxXferCount = Size*2; - } - else - { - hi2s->TxXferSize = Size; - hi2s->TxXferCount = Size; - } - - /* Process Locked */ - __HAL_LOCK(hi2s); - - hi2s->State = HAL_I2S_STATE_BUSY_TX; - - /* Check if the I2S is already enabled */ - if((hi2s->Instance->I2SCFGR &SPI_I2SCFGR_I2SE) != SPI_I2SCFGR_I2SE) - { - /* Enable I2S peripheral */ - __HAL_I2S_ENABLE(hi2s); - } - - while(hi2s->TxXferCount > 0) - { - hi2s->Instance->DR = (*pData++); - hi2s->TxXferCount--; - /* Wait until TXE flag is set */ - if (I2S_WaitFlagStateUntilTimeout(hi2s, I2S_FLAG_TXE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - } - - /* Check if Slave mode is selected */ - if(((hi2s->Instance->I2SCFGR & SPI_I2SCFGR_I2SCFG) == I2S_MODE_SLAVE_TX) || ((hi2s->Instance->I2SCFGR & SPI_I2SCFGR_I2SCFG) == I2S_MODE_SLAVE_RX)) - { - /* Wait until Busy flag is reset */ - if (I2S_WaitFlagStateUntilTimeout(hi2s, I2S_FLAG_BSY, SET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - } - - hi2s->State = HAL_I2S_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2s); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Receive an amount of data in blocking mode - * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains - * the configuration information for I2S module - * @param pData: a 16-bit pointer to data buffer. - * @param Size: number of data sample to be sent: - * @note When a 16-bit data frame or a 16-bit data frame extended is selected during the I2S - * configuration phase, the Size parameter means the number of 16-bit data length - * in the transaction and when a 24-bit data frame or a 32-bit data frame is selected - * the Size parameter means the number of 16-bit data length. - * @param Timeout: Timeout duration - * @note The I2S is kept enabled at the end of transaction to avoid the clock de-synchronization - * between Master and Slave(example: audio streaming). - * @note In I2S Master Receiver mode, just after enabling the peripheral the clock will be generate - * in continuous way and as the I2S is not disabled at the end of the I2S transaction. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2S_Receive(I2S_HandleTypeDef *hi2s, uint16_t *pData, uint16_t Size, uint32_t Timeout) -{ - uint32_t tmp1 = 0; - if((pData == NULL ) || (Size == 0)) - { - return HAL_ERROR; - } - - if(hi2s->State == HAL_I2S_STATE_READY) - { - tmp1 = hi2s->Instance->I2SCFGR & (SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN); - - if((tmp1 == I2S_DATAFORMAT_24B) || (tmp1 == I2S_DATAFORMAT_32B)) - { - hi2s->RxXferSize = Size*2; - hi2s->RxXferCount = Size*2; - } - else - { - hi2s->RxXferSize = Size; - hi2s->RxXferCount = Size; - } - /* Process Locked */ - __HAL_LOCK(hi2s); - - hi2s->State = HAL_I2S_STATE_BUSY_RX; - - /* Check if the I2S is already enabled */ - if((hi2s->Instance->I2SCFGR & SPI_I2SCFGR_I2SE) != SPI_I2SCFGR_I2SE) - { - /* Enable I2S peripheral */ - __HAL_I2S_ENABLE(hi2s); - } - - /* Check if Master Receiver mode is selected */ - if((hi2s->Instance->I2SCFGR & SPI_I2SCFGR_I2SCFG) == I2S_MODE_MASTER_RX) - { - /* Clear the Overrun Flag by a read operation on the SPI_DR register followed by a read - access to the SPI_SR register. */ - __HAL_I2S_CLEAR_OVRFLAG(hi2s); - } - - /* Receive data */ - while(hi2s->RxXferCount > 0) - { - /* Wait until RXNE flag is set */ - if (I2S_WaitFlagStateUntilTimeout(hi2s, I2S_FLAG_RXNE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - (*pData++) = hi2s->Instance->DR; - hi2s->RxXferCount--; - } - - hi2s->State = HAL_I2S_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2s); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Transmit an amount of data in non-blocking mode with Interrupt - * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains - * the configuration information for I2S module - * @param pData: a 16-bit pointer to data buffer. - * @param Size: number of data sample to be sent: - * @note When a 16-bit data frame or a 16-bit data frame extended is selected during the I2S - * configuration phase, the Size parameter means the number of 16-bit data length - * in the transaction and when a 24-bit data frame or a 32-bit data frame is selected - * the Size parameter means the number of 16-bit data length. - * @note The I2S is kept enabled at the end of transaction to avoid the clock de-synchronization - * between Master and Slave(example: audio streaming). - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2S_Transmit_IT(I2S_HandleTypeDef *hi2s, uint16_t *pData, uint16_t Size) -{ - uint32_t tmp1 = 0; - if(hi2s->State == HAL_I2S_STATE_READY) - { - if((pData == NULL) || (Size == 0)) - { - return HAL_ERROR; - } - - hi2s->pTxBuffPtr = pData; - tmp1 = hi2s->Instance->I2SCFGR & (SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN); - - if((tmp1 == I2S_DATAFORMAT_24B) || (tmp1 == I2S_DATAFORMAT_32B)) - { - hi2s->TxXferSize = Size*2; - hi2s->TxXferCount = Size*2; - } - else - { - hi2s->TxXferSize = Size; - hi2s->TxXferCount = Size; - } - - /* Process Locked */ - __HAL_LOCK(hi2s); - - hi2s->State = HAL_I2S_STATE_BUSY_TX; - hi2s->ErrorCode = HAL_I2S_ERROR_NONE; - - /* Enable TXE and ERR interrupt */ - __HAL_I2S_ENABLE_IT(hi2s, (I2S_IT_TXE | I2S_IT_ERR)); - - /* Check if the I2S is already enabled */ - if((hi2s->Instance->I2SCFGR &SPI_I2SCFGR_I2SE) != SPI_I2SCFGR_I2SE) - { - /* Enable I2S peripheral */ - __HAL_I2S_ENABLE(hi2s); - } - - /* Process Unlocked */ - __HAL_UNLOCK(hi2s); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Receive an amount of data in non-blocking mode with Interrupt - * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains - * the configuration information for I2S module - * @param pData: a 16-bit pointer to the Receive data buffer. - * @param Size: number of data sample to be sent: - * @note When a 16-bit data frame or a 16-bit data frame extended is selected during the I2S - * configuration phase, the Size parameter means the number of 16-bit data length - * in the transaction and when a 24-bit data frame or a 32-bit data frame is selected - * the Size parameter means the number of 16-bit data length. - * @note The I2S is kept enabled at the end of transaction to avoid the clock de-synchronization - * between Master and Slave(example: audio streaming). - * @note It is recommended to use DMA for the I2S receiver to avoid de-synchronisation - * between Master and Slave otherwise the I2S interrupt should be optimized. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2S_Receive_IT(I2S_HandleTypeDef *hi2s, uint16_t *pData, uint16_t Size) -{ - uint32_t tmp1 = 0; - if(hi2s->State == HAL_I2S_STATE_READY) - { - if((pData == NULL) || (Size == 0)) - { - return HAL_ERROR; - } - - hi2s->pRxBuffPtr = pData; - tmp1 = hi2s->Instance->I2SCFGR & (SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN); - - if((tmp1 == I2S_DATAFORMAT_24B) || (tmp1 == I2S_DATAFORMAT_32B)) - { - hi2s->RxXferSize = Size*2; - hi2s->RxXferCount = Size*2; - } - else - { - hi2s->RxXferSize = Size; - hi2s->RxXferCount = Size; - } - /* Process Locked */ - __HAL_LOCK(hi2s); - - hi2s->State = HAL_I2S_STATE_BUSY_RX; - hi2s->ErrorCode = HAL_I2S_ERROR_NONE; - - /* Enable TXE and ERR interrupt */ - __HAL_I2S_ENABLE_IT(hi2s, (I2S_IT_RXNE | I2S_IT_ERR)); - - /* Check if the I2S is already enabled */ - if((hi2s->Instance->I2SCFGR &SPI_I2SCFGR_I2SE) != SPI_I2SCFGR_I2SE) - { - /* Enable I2S peripheral */ - __HAL_I2S_ENABLE(hi2s); - } - - /* Process Unlocked */ - __HAL_UNLOCK(hi2s); - - return HAL_OK; - } - - else - { - return HAL_BUSY; - } -} - -/** - * @brief Transmit an amount of data in non-blocking mode with DMA - * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains - * the configuration information for I2S module - * @param pData: a 16-bit pointer to the Transmit data buffer. - * @param Size: number of data sample to be sent: - * @note When a 16-bit data frame or a 16-bit data frame extended is selected during the I2S - * configuration phase, the Size parameter means the number of 16-bit data length - * in the transaction and when a 24-bit data frame or a 32-bit data frame is selected - * the Size parameter means the number of 16-bit data length. - * @note The I2S is kept enabled at the end of transaction to avoid the clock de-synchronization - * between Master and Slave(example: audio streaming). - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2S_Transmit_DMA(I2S_HandleTypeDef *hi2s, uint16_t *pData, uint16_t Size) -{ - uint32_t *tmp; - uint32_t tmp1 = 0; - - if((pData == NULL) || (Size == 0)) - { - return HAL_ERROR; - } - - if(hi2s->State == HAL_I2S_STATE_READY) - { - hi2s->pTxBuffPtr = pData; - tmp1 = hi2s->Instance->I2SCFGR & (SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN); - - if((tmp1 == I2S_DATAFORMAT_24B) || (tmp1 == I2S_DATAFORMAT_32B)) - { - hi2s->TxXferSize = Size*2; - hi2s->TxXferCount = Size*2; - } - else - { - hi2s->TxXferSize = Size; - hi2s->TxXferCount = Size; - } - - /* Process Locked */ - __HAL_LOCK(hi2s); - - hi2s->State = HAL_I2S_STATE_BUSY_TX; - hi2s->ErrorCode = HAL_I2S_ERROR_NONE; - - /* Set the I2S Tx DMA Half transfer complete callback */ - hi2s->hdmatx->XferHalfCpltCallback = I2S_DMATxHalfCplt; - - /* Set the I2S Tx DMA transfer complete callback */ - hi2s->hdmatx->XferCpltCallback = I2S_DMATxCplt; - - /* Set the DMA error callback */ - hi2s->hdmatx->XferErrorCallback = I2S_DMAError; - - /* Enable the Tx DMA Stream */ - tmp = (uint32_t*)&pData; - HAL_DMA_Start_IT(hi2s->hdmatx, *(uint32_t*)tmp, (uint32_t)&hi2s->Instance->DR, hi2s->TxXferSize); - - /* Check if the I2S is already enabled */ - if((hi2s->Instance->I2SCFGR &SPI_I2SCFGR_I2SE) != SPI_I2SCFGR_I2SE) - { - /* Enable I2S peripheral */ - __HAL_I2S_ENABLE(hi2s); - } - - /* Check if the I2S Tx request is already enabled */ - if((hi2s->Instance->CR2 & SPI_CR2_TXDMAEN) != SPI_CR2_TXDMAEN) - { - /* Enable Tx DMA Request */ - hi2s->Instance->CR2 |= SPI_CR2_TXDMAEN; - } - - /* Process Unlocked */ - __HAL_UNLOCK(hi2s); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Receive an amount of data in non-blocking mode with DMA - * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains - * the configuration information for I2S module - * @param pData: a 16-bit pointer to the Receive data buffer. - * @param Size: number of data sample to be sent: - * @note When a 16-bit data frame or a 16-bit data frame extended is selected during the I2S - * configuration phase, the Size parameter means the number of 16-bit data length - * in the transaction and when a 24-bit data frame or a 32-bit data frame is selected - * the Size parameter means the number of 16-bit data length. - * @note The I2S is kept enabled at the end of transaction to avoid the clock de-synchronization - * between Master and Slave(example: audio streaming). - * @retval HAL status - */ -HAL_StatusTypeDef HAL_I2S_Receive_DMA(I2S_HandleTypeDef *hi2s, uint16_t *pData, uint16_t Size) -{ - uint32_t *tmp; - uint32_t tmp1 = 0; - - if((pData == NULL) || (Size == 0)) - { - return HAL_ERROR; - } - - if(hi2s->State == HAL_I2S_STATE_READY) - { - hi2s->pRxBuffPtr = pData; - tmp1 = hi2s->Instance->I2SCFGR & (SPI_I2SCFGR_DATLEN | SPI_I2SCFGR_CHLEN); - if((tmp1 == I2S_DATAFORMAT_24B) || (tmp1 == I2S_DATAFORMAT_32B)) - { - hi2s->RxXferSize = Size*2; - hi2s->RxXferCount = Size*2; - } - else - { - hi2s->RxXferSize = Size; - hi2s->RxXferCount = Size; - } - /* Process Locked */ - __HAL_LOCK(hi2s); - - hi2s->State = HAL_I2S_STATE_BUSY_RX; - hi2s->ErrorCode = HAL_I2S_ERROR_NONE; - - /* Set the I2S Rx DMA Half transfer complete callback */ - hi2s->hdmarx->XferHalfCpltCallback = I2S_DMARxHalfCplt; - - /* Set the I2S Rx DMA transfer complete callback */ - hi2s->hdmarx->XferCpltCallback = I2S_DMARxCplt; - - /* Set the DMA error callback */ - hi2s->hdmarx->XferErrorCallback = I2S_DMAError; - - /* Check if Master Receiver mode is selected */ - if((hi2s->Instance->I2SCFGR & SPI_I2SCFGR_I2SCFG) == I2S_MODE_MASTER_RX) - { - /* Clear the Overrun Flag by a read operation to the SPI_DR register followed by a read - access to the SPI_SR register. */ - __HAL_I2S_CLEAR_OVRFLAG(hi2s); - } - - /* Enable the Rx DMA Stream */ - tmp = (uint32_t*)&pData; - HAL_DMA_Start_IT(hi2s->hdmarx, (uint32_t)&hi2s->Instance->DR, *(uint32_t*)tmp, hi2s->RxXferSize); - - /* Check if the I2S is already enabled */ - if((hi2s->Instance->I2SCFGR &SPI_I2SCFGR_I2SE) != SPI_I2SCFGR_I2SE) - { - /* Enable I2S peripheral */ - __HAL_I2S_ENABLE(hi2s); - } - - /* Check if the I2S Rx request is already enabled */ - if((hi2s->Instance->CR2 &SPI_CR2_RXDMAEN) != SPI_CR2_RXDMAEN) - { - /* Enable Rx DMA Request */ - hi2s->Instance->CR2 |= SPI_CR2_RXDMAEN; - } - - /* Process Unlocked */ - __HAL_UNLOCK(hi2s); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Pauses the audio stream playing from the Media. - * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains - * the configuration information for I2S module - * @retval HAL status - */ -__weak HAL_StatusTypeDef HAL_I2S_DMAPause(I2S_HandleTypeDef *hi2s) -{ - /* Process Locked */ - __HAL_LOCK(hi2s); - - if(hi2s->State == HAL_I2S_STATE_BUSY_TX) - { - /* Disable the I2S DMA Tx request */ - hi2s->Instance->CR2 &= (uint32_t)(~SPI_CR2_TXDMAEN); - } - else if(hi2s->State == HAL_I2S_STATE_BUSY_RX) - { - /* Disable the I2S DMA Rx request */ - hi2s->Instance->CR2 &= (uint32_t)(~SPI_CR2_RXDMAEN); - } - else if(hi2s->State == HAL_I2S_STATE_BUSY_TX_RX) - { - if((hi2s->Init.Mode == I2S_MODE_SLAVE_TX)||(hi2s->Init.Mode == I2S_MODE_MASTER_TX)) - { - /* Disable the I2S DMA Tx request */ - hi2s->Instance->CR2 &= (uint32_t)(~SPI_CR2_TXDMAEN); - } - else - { - /* Disable the I2S DMA Rx request */ - hi2s->Instance->CR2 &= (uint32_t)(~SPI_CR2_RXDMAEN); - } - } - - /* Process Unlocked */ - __HAL_UNLOCK(hi2s); - - return HAL_OK; -} - -/** - * @brief Resumes the audio stream playing from the Media. - * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains - * the configuration information for I2S module - * @retval HAL status - */ -__weak HAL_StatusTypeDef HAL_I2S_DMAResume(I2S_HandleTypeDef *hi2s) -{ - /* Process Locked */ - __HAL_LOCK(hi2s); - - if(hi2s->State == HAL_I2S_STATE_BUSY_TX) - { - /* Enable the I2S DMA Tx request */ - hi2s->Instance->CR2 |= SPI_CR2_TXDMAEN; - } - else if(hi2s->State == HAL_I2S_STATE_BUSY_RX) - { - /* Enable the I2S DMA Rx request */ - hi2s->Instance->CR2 |= SPI_CR2_RXDMAEN; - } - else if(hi2s->State == HAL_I2S_STATE_BUSY_TX_RX) - { - if((hi2s->Init.Mode == I2S_MODE_SLAVE_TX)||(hi2s->Init.Mode == I2S_MODE_MASTER_TX)) - { - /* Enable the I2S DMA Tx request */ - hi2s->Instance->CR2 |= SPI_CR2_TXDMAEN; - } - else - { - /* Enable the I2S DMA Rx request */ - hi2s->Instance->CR2 |= SPI_CR2_RXDMAEN; - } - } - - /* If the I2S peripheral is still not enabled, enable it */ - if ((hi2s->Instance->I2SCFGR & SPI_I2SCFGR_I2SE) == 0) - { - /* Enable I2S peripheral */ - __HAL_I2S_ENABLE(hi2s); - } - - /* Process Unlocked */ - __HAL_UNLOCK(hi2s); - - return HAL_OK; -} - -/** - * @brief Resumes the audio stream playing from the Media. - * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains - * the configuration information for I2S module - * @retval HAL status - */ -__weak HAL_StatusTypeDef HAL_I2S_DMAStop(I2S_HandleTypeDef *hi2s) -{ - /* Process Locked */ - __HAL_LOCK(hi2s); - - /* Disable the I2S Tx/Rx DMA requests */ - hi2s->Instance->CR2 &= ~SPI_CR2_TXDMAEN; - hi2s->Instance->CR2 &= ~SPI_CR2_RXDMAEN; - - /* Abort the I2S DMA Stream tx */ - if(hi2s->hdmatx != NULL) - { - HAL_DMA_Abort(hi2s->hdmatx); - } - /* Abort the I2S DMA Stream rx */ - if(hi2s->hdmarx != NULL) - { - HAL_DMA_Abort(hi2s->hdmarx); - } - - /* Disable I2S peripheral */ - __HAL_I2S_DISABLE(hi2s); - - hi2s->State = HAL_I2S_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2s); - - return HAL_OK; -} - -/** - * @brief This function handles I2S interrupt request. - * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains - * the configuration information for I2S module - * @retval None - */ -__weak void HAL_I2S_IRQHandler(I2S_HandleTypeDef *hi2s) -{ - uint32_t tmp1 = 0, tmp2 = 0; - - if(hi2s->State == HAL_I2S_STATE_BUSY_RX) - { - tmp1 = __HAL_I2S_GET_FLAG(hi2s, I2S_FLAG_RXNE); - tmp2 = __HAL_I2S_GET_IT_SOURCE(hi2s, I2S_IT_RXNE); - /* I2S in mode Receiver ------------------------------------------------*/ - if((tmp1 != RESET) && (tmp2 != RESET)) - { - I2S_Receive_IT(hi2s); - } - - tmp1 = __HAL_I2S_GET_FLAG(hi2s, I2S_FLAG_OVR); - tmp2 = __HAL_I2S_GET_IT_SOURCE(hi2s, I2S_IT_ERR); - /* I2S Overrun error interrupt occurred ---------------------------------*/ - if((tmp1 != RESET) && (tmp2 != RESET)) - { - __HAL_I2S_CLEAR_OVRFLAG(hi2s); - hi2s->ErrorCode |= HAL_I2S_ERROR_OVR; - } - } - - if(hi2s->State == HAL_I2S_STATE_BUSY_TX) - { - tmp1 = __HAL_I2S_GET_FLAG(hi2s, I2S_FLAG_TXE); - tmp2 = __HAL_I2S_GET_IT_SOURCE(hi2s, I2S_IT_TXE); - /* I2S in mode Transmitter -----------------------------------------------*/ - if((tmp1 != RESET) && (tmp2 != RESET)) - { - I2S_Transmit_IT(hi2s); - } - - tmp1 = __HAL_I2S_GET_FLAG(hi2s, I2S_FLAG_UDR); - tmp2 = __HAL_I2S_GET_IT_SOURCE(hi2s, I2S_IT_ERR); - /* I2S Underrun error interrupt occurred --------------------------------*/ - if((tmp1 != RESET) && (tmp2 != RESET)) - { - __HAL_I2S_CLEAR_UDRFLAG(hi2s); - hi2s->ErrorCode |= HAL_I2S_ERROR_UDR; - } - } - - /* Call the Error call Back in case of Errors */ - if(hi2s->ErrorCode != HAL_I2S_ERROR_NONE) - { - /* Set the I2S state ready to be able to start again the process */ - hi2s->State= HAL_I2S_STATE_READY; - HAL_I2S_ErrorCallback(hi2s); - } -} - -/** - * @brief Tx Transfer Half completed callbacks - * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains - * the configuration information for I2S module - * @retval None - */ - __weak void HAL_I2S_TxHalfCpltCallback(I2S_HandleTypeDef *hi2s) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_I2S_TxHalfCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Tx Transfer completed callbacks - * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains - * the configuration information for I2S module - * @retval None - */ - __weak void HAL_I2S_TxCpltCallback(I2S_HandleTypeDef *hi2s) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_I2S_TxCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Rx Transfer half completed callbacks - * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains - * the configuration information for I2S module - * @retval None - */ -__weak void HAL_I2S_RxHalfCpltCallback(I2S_HandleTypeDef *hi2s) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_I2S_RxCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Rx Transfer completed callbacks - * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains - * the configuration information for I2S module - * @retval None - */ -__weak void HAL_I2S_RxCpltCallback(I2S_HandleTypeDef *hi2s) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_I2S_RxCpltCallback could be implemented in the user file - */ -} - -/** - * @brief I2S error callbacks - * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains - * the configuration information for I2S module - * @retval None - */ - __weak void HAL_I2S_ErrorCallback(I2S_HandleTypeDef *hi2s) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_I2S_ErrorCallback could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup I2S_Exported_Functions_Group3 Peripheral State and Errors functions - * @brief Peripheral State functions -@verbatim - =============================================================================== - ##### Peripheral State and Errors functions ##### - =============================================================================== - [..] - This subsection permits to get in run-time the status of the peripheral - and the data flow. - -@endverbatim - * @{ - */ - -/** - * @brief Return the I2S state - * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains - * the configuration information for I2S module - * @retval HAL state - */ -HAL_I2S_StateTypeDef HAL_I2S_GetState(I2S_HandleTypeDef *hi2s) -{ - return hi2s->State; -} - -/** - * @brief Return the I2S error code - * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains - * the configuration information for I2S module - * @retval I2S Error Code - */ -uint32_t HAL_I2S_GetError(I2S_HandleTypeDef *hi2s) -{ - return hi2s->ErrorCode; -} -/** - * @} - */ - -/** - * @brief DMA I2S transmit process complete callback - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void I2S_DMATxCplt(DMA_HandleTypeDef *hdma) -{ - I2S_HandleTypeDef* hi2s = (I2S_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent; - - if((hdma->Instance->CR & DMA_SxCR_CIRC) == 0) - { - hi2s->TxXferCount = 0; - - /* Disable Tx DMA Request */ - hi2s->Instance->CR2 &= (uint32_t)(~SPI_CR2_TXDMAEN); - - if(hi2s->State == HAL_I2S_STATE_BUSY_TX_RX) - { - if(hi2s->RxXferCount == 0) - { - hi2s->State = HAL_I2S_STATE_READY; - } - } - else - { - hi2s->State = HAL_I2S_STATE_READY; - } - } - HAL_I2S_TxCpltCallback(hi2s); -} - -/** - * @brief DMA I2S transmit process half complete callback - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void I2S_DMATxHalfCplt(DMA_HandleTypeDef *hdma) -{ - I2S_HandleTypeDef* hi2s = (I2S_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent; - - HAL_I2S_TxHalfCpltCallback(hi2s); -} - -/** - * @brief DMA I2S receive process complete callback - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void I2S_DMARxCplt(DMA_HandleTypeDef *hdma) -{ - I2S_HandleTypeDef* hi2s = (I2S_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent; - - if((hdma->Instance->CR & DMA_SxCR_CIRC) == 0) - { - /* Disable Rx DMA Request */ - hi2s->Instance->CR2 &= (uint32_t)(~SPI_CR2_RXDMAEN); - hi2s->RxXferCount = 0; - if(hi2s->State == HAL_I2S_STATE_BUSY_TX_RX) - { - if(hi2s->TxXferCount == 0) - { - hi2s->State = HAL_I2S_STATE_READY; - } - } - else - { - hi2s->State = HAL_I2S_STATE_READY; - } - } - HAL_I2S_RxCpltCallback(hi2s); -} - -/** - * @brief DMA I2S receive process half complete callback - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void I2S_DMARxHalfCplt(DMA_HandleTypeDef *hdma) -{ - I2S_HandleTypeDef* hi2s = (I2S_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent; - - HAL_I2S_RxHalfCpltCallback(hi2s); -} - -/** - * @brief DMA I2S communication error callback - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void I2S_DMAError(DMA_HandleTypeDef *hdma) -{ - I2S_HandleTypeDef* hi2s = (I2S_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent; - - hi2s->TxXferCount = 0; - hi2s->RxXferCount = 0; - - hi2s->State= HAL_I2S_STATE_READY; - - hi2s->ErrorCode |= HAL_I2S_ERROR_DMA; - HAL_I2S_ErrorCallback(hi2s); -} - -/** - * @brief Transmit an amount of data in non-blocking mode with Interrupt - * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains - * the configuration information for I2S module - * @retval HAL status - */ -static HAL_StatusTypeDef I2S_Transmit_IT(I2S_HandleTypeDef *hi2s) -{ - if(hi2s->State == HAL_I2S_STATE_BUSY_TX) - { - /* Process Locked */ - __HAL_LOCK(hi2s); - - /* Transmit data */ - hi2s->Instance->DR = (*hi2s->pTxBuffPtr++); - - hi2s->TxXferCount--; - - if(hi2s->TxXferCount == 0) - { - /* Disable TXE and ERR interrupt */ - __HAL_I2S_DISABLE_IT(hi2s, (I2S_IT_TXE | I2S_IT_ERR)); - - hi2s->State = HAL_I2S_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2s); - HAL_I2S_TxCpltCallback(hi2s); - } - else - { - /* Process Unlocked */ - __HAL_UNLOCK(hi2s); - } - - return HAL_OK; - } - - else - { - return HAL_BUSY; - } -} - -/** - * @brief Receive an amount of data in non-blocking mode with Interrupt - * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains - * the configuration information for I2S module - * @retval HAL status - */ -static HAL_StatusTypeDef I2S_Receive_IT(I2S_HandleTypeDef *hi2s) -{ - if(hi2s->State == HAL_I2S_STATE_BUSY_RX) - { - /* Process Locked */ - __HAL_LOCK(hi2s); - - /* Receive data */ - (*hi2s->pRxBuffPtr++) = hi2s->Instance->DR; - - hi2s->RxXferCount--; - - /* Check if Master Receiver mode is selected */ - if((hi2s->Instance->I2SCFGR & SPI_I2SCFGR_I2SCFG) == I2S_MODE_MASTER_RX) - { - /* Clear the Overrun Flag by a read operation on the SPI_DR register followed by a read - access to the SPI_SR register. */ - __HAL_I2S_CLEAR_OVRFLAG(hi2s); - } - - if(hi2s->RxXferCount == 0) - { - /* Disable RXNE and ERR interrupt */ - __HAL_I2S_DISABLE_IT(hi2s, I2S_IT_RXNE | I2S_IT_ERR); - - hi2s->State = HAL_I2S_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2s); - - HAL_I2S_RxCpltCallback(hi2s); - } - else - { - /* Process Unlocked */ - __HAL_UNLOCK(hi2s); - } - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief This function handles I2S Communication Timeout. - * @param hi2s: pointer to a I2S_HandleTypeDef structure that contains - * the configuration information for I2S module - * @param Flag: Flag checked - * @param Status: Value of the flag expected - * @param Timeout: Duration of the timeout - * @retval HAL status - */ -static HAL_StatusTypeDef I2S_WaitFlagStateUntilTimeout(I2S_HandleTypeDef *hi2s, uint32_t Flag, uint32_t Status, uint32_t Timeout) -{ - uint32_t tickstart = 0; - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait until flag is set */ - if(Status == RESET) - { - while(__HAL_I2S_GET_FLAG(hi2s, Flag) == RESET) - { - if(Timeout != HAL_MAX_DELAY) - { - if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout)) - { - /* Set the I2S State ready */ - hi2s->State= HAL_I2S_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2s); - - return HAL_TIMEOUT; - } - } - } - } - else - { - while(__HAL_I2S_GET_FLAG(hi2s, Flag) != RESET) - { - if(Timeout != HAL_MAX_DELAY) - { - if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout)) - { - /* Set the I2S State ready */ - hi2s->State= HAL_I2S_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hi2s); - - return HAL_TIMEOUT; - } - } - } - } - return HAL_OK; -} - -/** - * @} - */ - -#endif /* HAL_I2S_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_irda.c b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_irda.c deleted file mode 100755 index d919ac01..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_irda.c +++ /dev/null @@ -1,1504 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_hal_irda.c - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief IRDA HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the IrDA SIR ENDEC block (IrDA): - * + Initialization and de-initialization methods - * + IO operation methods - * + Peripheral Control methods - * - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - The IRDA HAL driver can be used as follows: - - (#) Declare a IRDA_HandleTypeDef handle structure. - (#) Initialize the IRDA low level resources by implementing the HAL_IRDA_MspInit() API: - (##) Enable the USARTx interface clock. - (##) IRDA pins configuration: - (+++) Enable the clock for the IRDA GPIOs. - (+++) Configure these IRDA pins as alternate function pull-up. - (##) NVIC configuration if you need to use interrupt process (HAL_IRDA_Transmit_IT() - and HAL_IRDA_Receive_IT() APIs): - (+++) Configure the USARTx interrupt priority. - (+++) Enable the NVIC USART IRQ handle. - (##) DMA Configuration if you need to use DMA process (HAL_IRDA_Transmit_DMA() - and HAL_IRDA_Receive_DMA() APIs): - (+++) Declare a DMA handle structure for the Tx/Rx stream. - (+++) Enable the DMAx interface clock. - (+++) Configure the declared DMA handle structure with the required Tx/Rx parameters. - (+++) Configure the DMA Tx/Rx Stream. - (+++) Associate the initialized DMA handle to the IRDA DMA Tx/Rx handle. - (+++) Configure the priority and enable the NVIC for the transfer complete interrupt on the DMA Tx/Rx Stream. - - (#) Program the Baud Rate, Word Length, Parity, IrDA Mode, Prescaler - and Mode(Receiver/Transmitter) in the hirda Init structure. - - (#) Initialize the IRDA registers by calling the HAL_IRDA_Init() API: - (++) This API configures also the low level Hardware GPIO, CLOCK, CORTEX...etc) - by calling the customized HAL_IRDA_MspInit() API. - -@@- The specific IRDA interrupts (Transmission complete interrupt, - RXNE interrupt and Error Interrupts) will be managed using the macros - __HAL_IRDA_ENABLE_IT() and __HAL_IRDA_DISABLE_IT() inside the transmit and receive process. - - (#) Three operation modes are available within this driver : - - *** Polling mode IO operation *** - ================================= - [..] - (+) Send an amount of data in blocking mode using HAL_IRDA_Transmit() - (+) Receive an amount of data in blocking mode using HAL_IRDA_Receive() - - *** Interrupt mode IO operation *** - =================================== - [..] - (+) Send an amount of data in non blocking mode using HAL_IRDA_Transmit_IT() - (+) At transmission end of transfer HAL_IRDA_TxCpltCallback is executed and user can - add his own code by customization of function pointer HAL_IRDA_TxCpltCallback - (+) Receive an amount of data in non blocking mode using HAL_IRDA_Receive_IT() - (+) At reception end of transfer HAL_IRDA_RxCpltCallback is executed and user can - add his own code by customization of function pointer HAL_IRDA_RxCpltCallback - (+) In case of transfer Error, HAL_IRDA_ErrorCallback() function is executed and user can - add his own code by customization of function pointer HAL_IRDA_ErrorCallback - - *** DMA mode IO operation *** - ============================= - [..] - (+) Send an amount of data in non blocking mode (DMA) using HAL_IRDA_Transmit_DMA() - (+) At transmission end of transfer HAL_IRDA_TxCpltCallback is executed and user can - add his own code by customization of function pointer HAL_IRDA_TxCpltCallback - (+) Receive an amount of data in non blocking mode (DMA) using HAL_IRDA_Receive_DMA() - (+) At reception end of transfer HAL_IRDA_RxCpltCallback is executed and user can - add his own code by customization of function pointer HAL_IRDA_RxCpltCallback - (+) In case of transfer Error, HAL_IRDA_ErrorCallback() function is executed and user can - add his own code by customization of function pointer HAL_IRDA_ErrorCallback - - *** IRDA HAL driver macros list *** - =================================== - [..] - Below the list of most used macros in IRDA HAL driver. - - (+) __HAL_IRDA_ENABLE: Enable the IRDA peripheral - (+) __HAL_IRDA_DISABLE: Disable the IRDA peripheral - (+) __HAL_IRDA_GET_FLAG : Checks whether the specified IRDA flag is set or not - (+) __HAL_IRDA_CLEAR_FLAG : Clears the specified IRDA pending flag - (+) __HAL_IRDA_ENABLE_IT: Enables the specified IRDA interrupt - (+) __HAL_IRDA_DISABLE_IT: Disables the specified IRDA interrupt - - (@) You can refer to the IRDA HAL driver header file for more useful macros - - @endverbatim - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal.h" - -/** @addtogroup STM32F2xx_HAL_Driver - * @{ - */ - -/** @defgroup IRDA IRDA - * @brief HAL IRDA module driver - * @{ - */ - -#ifdef HAL_IRDA_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @addtogroup IRDA_Private_Constants - * @{ - */ -#define IRDA_TIMEOUT_VALUE 22000 -/** - * @} - */ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/** @addtogroup IRDA_Private_Functions - * @{ - */ -static void IRDA_SetConfig (IRDA_HandleTypeDef *hirda); -static HAL_StatusTypeDef IRDA_Transmit_IT(IRDA_HandleTypeDef *hirda); -static HAL_StatusTypeDef IRDA_EndTransmit_IT(IRDA_HandleTypeDef *hirda); -static HAL_StatusTypeDef IRDA_Receive_IT(IRDA_HandleTypeDef *hirda); -static void IRDA_DMATransmitCplt(DMA_HandleTypeDef *hdma); -static void IRDA_DMATransmitHalfCplt(DMA_HandleTypeDef *hdma); -static void IRDA_DMAReceiveCplt(DMA_HandleTypeDef *hdma); -static void IRDA_DMAReceiveHalfCplt(DMA_HandleTypeDef *hdma); -static void IRDA_DMAError(DMA_HandleTypeDef *hdma); -static HAL_StatusTypeDef IRDA_WaitOnFlagUntilTimeout(IRDA_HandleTypeDef *hirda, uint32_t Flag, FlagStatus Status, uint32_t Timeout); -/** - * @} - */ -/* Exported functions --------------------------------------------------------*/ -/** @defgroup IRDA_Exported_Functions IrDA Exported Functions - * @{ - */ - -/** @defgroup IRDA_Exported_Functions_Group1 IrDA Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * -@verbatim - -=============================================================================== - ##### Initialization and Configuration functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to initialize the USARTx or the UARTy - in IrDA mode. - (+) For the asynchronous mode only these parameters can be configured: - (++) BaudRate - (++) WordLength - (++) Parity: If the parity is enabled, then the MSB bit of the data written - in the data register is transmitted but is changed by the parity bit. - Depending on the frame length defined by the M bit (8-bits or 9-bits), - please refer to Reference manual for possible IRDA frame formats. - (++) Prescaler: A pulse of width less than two and greater than one PSC period(s) may or may - not be rejected. The receiver set up time should be managed by software. The IrDA physical layer - specification specifies a minimum of 10 ms delay between transmission and - reception (IrDA is a half duplex protocol). - (++) Mode: Receiver/transmitter modes - (++) IrDAMode: the IrDA can operate in the Normal mode or in the Low power mode. - [..] - The HAL_IRDA_Init() API follows IRDA configuration procedures (details for the procedures - are available in reference manual). - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the IRDA mode according to the specified - * parameters in the IRDA_InitTypeDef and create the associated handle. - * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains - * the configuration information for the specified IRDA module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_IRDA_Init(IRDA_HandleTypeDef *hirda) -{ - /* Check the IRDA handle allocation */ - if(hirda == NULL) - { - return HAL_ERROR; - } - - /* Check the IRDA instance parameters */ - assert_param(IS_IRDA_INSTANCE(hirda->Instance)); - /* Check the IRDA mode parameter in the IRDA handle */ - assert_param(IS_IRDA_POWERMODE(hirda->Init.IrDAMode)); - - if(hirda->State == HAL_IRDA_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - hirda->Lock = HAL_UNLOCKED; - /* Init the low level hardware : GPIO, CLOCK, CORTEX...etc */ - HAL_IRDA_MspInit(hirda); - } - - hirda->State = HAL_IRDA_STATE_BUSY; - - /* Disable the IRDA peripheral */ - __HAL_IRDA_DISABLE(hirda); - - /* Set the IRDA communication parameters */ - IRDA_SetConfig(hirda); - - /* In IrDA mode, the following bits must be kept cleared: - - LINEN, STOP and CLKEN bits in the USART_CR2 register, - - SCEN and HDSEL bits in the USART_CR3 register.*/ - hirda->Instance->CR2 &= ~(USART_CR2_LINEN | USART_CR2_STOP | USART_CR2_CLKEN); - hirda->Instance->CR3 &= ~(USART_CR3_SCEN | USART_CR3_HDSEL); - - /* Enable the IRDA peripheral */ - __HAL_IRDA_ENABLE(hirda); - - /* Set the prescaler */ - MODIFY_REG(hirda->Instance->GTPR, USART_GTPR_PSC, hirda->Init.Prescaler); - - /* Configure the IrDA mode */ - MODIFY_REG(hirda->Instance->CR3, USART_CR3_IRLP, hirda->Init.IrDAMode); - - /* Enable the IrDA mode by setting the IREN bit in the CR3 register */ - hirda->Instance->CR3 |= USART_CR3_IREN; - - /* Initialize the IRDA state*/ - hirda->ErrorCode = HAL_IRDA_ERROR_NONE; - hirda->State= HAL_IRDA_STATE_READY; - - return HAL_OK; -} - -/** - * @brief DeInitializes the IRDA peripheral - * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains - * the configuration information for the specified IRDA module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_IRDA_DeInit(IRDA_HandleTypeDef *hirda) -{ - /* Check the IRDA handle allocation */ - if(hirda == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_IRDA_INSTANCE(hirda->Instance)); - - hirda->State = HAL_IRDA_STATE_BUSY; - - /* Disable the Peripheral */ - __HAL_IRDA_DISABLE(hirda); - - /* DeInit the low level hardware */ - HAL_IRDA_MspDeInit(hirda); - - hirda->ErrorCode = HAL_IRDA_ERROR_NONE; - - hirda->State = HAL_IRDA_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(hirda); - - return HAL_OK; -} - -/** - * @brief IRDA MSP Init. - * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains - * the configuration information for the specified IRDA module. - * @retval None - */ - __weak void HAL_IRDA_MspInit(IRDA_HandleTypeDef *hirda) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_IRDA_MspInit could be implemented in the user file - */ -} - -/** - * @brief IRDA MSP DeInit. - * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains - * the configuration information for the specified IRDA module. - * @retval None - */ - __weak void HAL_IRDA_MspDeInit(IRDA_HandleTypeDef *hirda) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_IRDA_MspDeInit could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup IRDA_Exported_Functions_Group2 IO operation functions - * @brief IRDA Transmit/Receive functions - * -@verbatim - =============================================================================== - ##### IO operation functions ##### - =============================================================================== - This subsection provides a set of functions allowing to manage the IRDA data transfers. - [..] - IrDA is a half duplex communication protocol. If the Transmitter is busy, any data - on the IrDA receive line will be ignored by the IrDA decoder and if the Receiver - is busy, data on the TX from the USART to IrDA will not be encoded by IrDA. - While receiving data, transmission should be avoided as the data to be transmitted - could be corrupted. - - (#) There are two modes of transfer: - (++) Blocking mode: The communication is performed in polling mode. - The HAL status of all data processing is returned by the same function - after finishing transfer. - (++) No-Blocking mode: The communication is performed using Interrupts - or DMA, These APIs return the HAL status. - The end of the data processing will be indicated through the - dedicated IRDA IRQ when using Interrupt mode or the DMA IRQ when - using DMA mode. - The HAL_IRDA_TxCpltCallback(), HAL_IRDA_RxCpltCallback() user callbacks - will be executed respectively at the end of the transmit or Receive process - The HAL_IRDA_ErrorCallback() user callback will be executed when a communication error is detected - - (#) Blocking mode API's are : - (++) HAL_IRDA_Transmit() - (++) HAL_IRDA_Receive() - - (#) Non Blocking mode APIs with Interrupt are : - (++) HAL_IRDA_Transmit_IT() - (++) HAL_IRDA_Receive_IT() - (++) HAL_IRDA_IRQHandler() - - (#) Non Blocking mode functions with DMA are : - (++) HAL_IRDA_Transmit_DMA() - (++) HAL_IRDA_Receive_DMA() - - (#) A set of Transfer Complete Callbacks are provided in non Blocking mode: - (++) HAL_IRDA_TxCpltCallback() - (++) HAL_IRDA_RxCpltCallback() - (++) HAL_IRDA_ErrorCallback() - -@endverbatim - * @{ - */ - -/** - * @brief Sends an amount of data in blocking mode. - * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains - * the configuration information for the specified IRDA module. - * @param pData: Pointer to data buffer - * @param Size: Amount of data to be sent - * @param Timeout: Specify timeout value - * @retval HAL status - */ -HAL_StatusTypeDef HAL_IRDA_Transmit(IRDA_HandleTypeDef *hirda, uint8_t *pData, uint16_t Size, uint32_t Timeout) -{ - uint16_t* tmp; - uint32_t tmp1 = 0; - - tmp1 = hirda->State; - if((tmp1 == HAL_IRDA_STATE_READY) || (tmp1 == HAL_IRDA_STATE_BUSY_RX)) - { - if((pData == NULL) || (Size == 0)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hirda); - - hirda->ErrorCode = HAL_IRDA_ERROR_NONE; - if(hirda->State == HAL_IRDA_STATE_BUSY_RX) - { - hirda->State = HAL_IRDA_STATE_BUSY_TX_RX; - } - else - { - hirda->State = HAL_IRDA_STATE_BUSY_TX; - } - - hirda->TxXferSize = Size; - hirda->TxXferCount = Size; - while(hirda->TxXferCount > 0) - { - hirda->TxXferCount--; - if(hirda->Init.WordLength == IRDA_WORDLENGTH_9B) - { - if(IRDA_WaitOnFlagUntilTimeout(hirda, IRDA_FLAG_TXE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - tmp = (uint16_t*) pData; - hirda->Instance->DR = (*tmp & (uint16_t)0x01FF); - if(hirda->Init.Parity == IRDA_PARITY_NONE) - { - pData +=2; - } - else - { - pData +=1; - } - } - else - { - if(IRDA_WaitOnFlagUntilTimeout(hirda, IRDA_FLAG_TXE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - hirda->Instance->DR = (*pData++ & (uint8_t)0xFF); - } - } - - if(IRDA_WaitOnFlagUntilTimeout(hirda, IRDA_FLAG_TC, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - if(hirda->State == HAL_IRDA_STATE_BUSY_TX_RX) - { - hirda->State = HAL_IRDA_STATE_BUSY_RX; - } - else - { - hirda->State = HAL_IRDA_STATE_READY; - } - - /* Process Unlocked */ - __HAL_UNLOCK(hirda); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Receive an amount of data in blocking mode. - * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains - * the configuration information for the specified IRDA module. - * @param pData: Pointer to data buffer - * @param Size: Amount of data to be received - * @param Timeout: Specify timeout value - * @retval HAL status - */ -HAL_StatusTypeDef HAL_IRDA_Receive(IRDA_HandleTypeDef *hirda, uint8_t *pData, uint16_t Size, uint32_t Timeout) -{ - uint16_t* tmp; - uint32_t tmp1 = 0; - - tmp1 = hirda->State; - if((tmp1 == HAL_IRDA_STATE_READY) || (tmp1 == HAL_IRDA_STATE_BUSY_TX)) - { - if((pData == NULL) || (Size == 0)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hirda); - - hirda->ErrorCode = HAL_IRDA_ERROR_NONE; - if(hirda->State == HAL_IRDA_STATE_BUSY_TX) - { - hirda->State = HAL_IRDA_STATE_BUSY_TX_RX; - } - else - { - hirda->State = HAL_IRDA_STATE_BUSY_RX; - } - hirda->RxXferSize = Size; - hirda->RxXferCount = Size; - /* Check the remain data to be received */ - while(hirda->RxXferCount > 0) - { - hirda->RxXferCount--; - if(hirda->Init.WordLength == IRDA_WORDLENGTH_9B) - { - if(IRDA_WaitOnFlagUntilTimeout(hirda, IRDA_FLAG_RXNE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - tmp = (uint16_t*) pData ; - if(hirda->Init.Parity == IRDA_PARITY_NONE) - { - *tmp = (uint16_t)(hirda->Instance->DR & (uint16_t)0x01FF); - pData +=2; - } - else - { - *tmp = (uint16_t)(hirda->Instance->DR & (uint16_t)0x00FF); - pData +=1; - } - } - else - { - if(IRDA_WaitOnFlagUntilTimeout(hirda, IRDA_FLAG_RXNE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - if(hirda->Init.Parity == IRDA_PARITY_NONE) - { - *pData++ = (uint8_t)(hirda->Instance->DR & (uint8_t)0x00FF); - } - else - { - *pData++ = (uint8_t)(hirda->Instance->DR & (uint8_t)0x007F); - } - } - } - if(hirda->State == HAL_IRDA_STATE_BUSY_TX_RX) - { - hirda->State = HAL_IRDA_STATE_BUSY_TX; - } - else - { - hirda->State = HAL_IRDA_STATE_READY; - } - - /* Process Unlocked */ - __HAL_UNLOCK(hirda); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Send an amount of data in non blocking mode. - * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains - * the configuration information for the specified IRDA module. - * @param pData: Pointer to data buffer - * @param Size: Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_IRDA_Transmit_IT(IRDA_HandleTypeDef *hirda, uint8_t *pData, uint16_t Size) -{ - uint32_t tmp1 = 0; - - tmp1 = hirda->State; - if((tmp1 == HAL_IRDA_STATE_READY) || (tmp1 == HAL_IRDA_STATE_BUSY_RX)) - { - if((pData == NULL) || (Size == 0)) - { - return HAL_ERROR; - } - /* Process Locked */ - __HAL_LOCK(hirda); - - hirda->pTxBuffPtr = pData; - hirda->TxXferSize = Size; - hirda->TxXferCount = Size; - hirda->ErrorCode = HAL_IRDA_ERROR_NONE; - if(hirda->State == HAL_IRDA_STATE_BUSY_RX) - { - hirda->State = HAL_IRDA_STATE_BUSY_TX_RX; - } - else - { - hirda->State = HAL_IRDA_STATE_BUSY_TX; - } - - /* Process Unlocked */ - __HAL_UNLOCK(hirda); - - /* Enable the IRDA Error Interrupt: (Frame error, noise error, overrun error) */ - __HAL_IRDA_ENABLE_IT(hirda, IRDA_IT_ERR); - - /* Enable the IRDA Transmit Data Register Empty Interrupt */ - __HAL_IRDA_ENABLE_IT(hirda, IRDA_IT_TXE); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Receives an amount of data in non blocking mode. - * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains - * the configuration information for the specified IRDA module. - * @param pData: Pointer to data buffer - * @param Size: Amount of data to be received - * @retval HAL status - */ -HAL_StatusTypeDef HAL_IRDA_Receive_IT(IRDA_HandleTypeDef *hirda, uint8_t *pData, uint16_t Size) -{ - uint32_t tmp1 = 0; - - tmp1 = hirda->State; - if((tmp1 == HAL_IRDA_STATE_READY) || (tmp1 == HAL_IRDA_STATE_BUSY_TX)) - { - if((pData == NULL) || (Size == 0)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hirda); - - hirda->pRxBuffPtr = pData; - hirda->RxXferSize = Size; - hirda->RxXferCount = Size; - hirda->ErrorCode = HAL_IRDA_ERROR_NONE; - if(hirda->State == HAL_IRDA_STATE_BUSY_TX) - { - hirda->State = HAL_IRDA_STATE_BUSY_TX_RX; - } - else - { - hirda->State = HAL_IRDA_STATE_BUSY_RX; - } - - /* Process Unlocked */ - __HAL_UNLOCK(hirda); - - /* Enable the IRDA Data Register not empty Interrupt */ - __HAL_IRDA_ENABLE_IT(hirda, IRDA_IT_RXNE); - - /* Enable the IRDA Parity Error Interrupt */ - __HAL_IRDA_ENABLE_IT(hirda, IRDA_IT_PE); - - /* Enable the IRDA Error Interrupt: (Frame error, noise error, overrun error) */ - __HAL_IRDA_ENABLE_IT(hirda, IRDA_IT_ERR); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Sends an amount of data in non blocking mode. - * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains - * the configuration information for the specified IRDA module. - * @param pData: Pointer to data buffer - * @param Size: Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_IRDA_Transmit_DMA(IRDA_HandleTypeDef *hirda, uint8_t *pData, uint16_t Size) -{ - uint32_t *tmp; - uint32_t tmp1 = 0; - - tmp1 = hirda->State; - if((tmp1 == HAL_IRDA_STATE_READY) || (tmp1 == HAL_IRDA_STATE_BUSY_RX)) - { - if((pData == NULL) || (Size == 0)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hirda); - - hirda->pTxBuffPtr = pData; - hirda->TxXferSize = Size; - hirda->TxXferCount = Size; - hirda->ErrorCode = HAL_IRDA_ERROR_NONE; - - if(hirda->State == HAL_IRDA_STATE_BUSY_RX) - { - hirda->State = HAL_IRDA_STATE_BUSY_TX_RX; - } - else - { - hirda->State = HAL_IRDA_STATE_BUSY_TX; - } - - /* Set the IRDA DMA transfer complete callback */ - hirda->hdmatx->XferCpltCallback = IRDA_DMATransmitCplt; - - /* Set the IRDA DMA half transfer complete callback */ - hirda->hdmatx->XferHalfCpltCallback = IRDA_DMATransmitHalfCplt; - - /* Set the DMA error callback */ - hirda->hdmatx->XferErrorCallback = IRDA_DMAError; - - /* Enable the IRDA transmit DMA Stream */ - tmp = (uint32_t*)&pData; - HAL_DMA_Start_IT(hirda->hdmatx, *(uint32_t*)tmp, (uint32_t)&hirda->Instance->DR, Size); - - /* Clear the TC flag in the SR register by writing 0 to it */ - __HAL_IRDA_CLEAR_FLAG(hirda, IRDA_FLAG_TC); - - /* Enable the DMA transfer for transmit request by setting the DMAT bit - in the USART CR3 register */ - hirda->Instance->CR3 |= USART_CR3_DMAT; - - /* Process Unlocked */ - __HAL_UNLOCK(hirda); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Receives an amount of data in non blocking mode. - * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains - * the configuration information for the specified IRDA module. - * @param pData: Pointer to data buffer - * @param Size: Amount of data to be received - * @note When the IRDA parity is enabled (PCE = 1) the data received contain the parity bit. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_IRDA_Receive_DMA(IRDA_HandleTypeDef *hirda, uint8_t *pData, uint16_t Size) -{ - uint32_t *tmp; - uint32_t tmp1 = 0; - - tmp1 = hirda->State; - if((tmp1 == HAL_IRDA_STATE_READY) || (tmp1 == HAL_IRDA_STATE_BUSY_TX)) - { - if((pData == NULL) || (Size == 0)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hirda); - - hirda->pRxBuffPtr = pData; - hirda->RxXferSize = Size; - hirda->ErrorCode = HAL_IRDA_ERROR_NONE; - if(hirda->State == HAL_IRDA_STATE_BUSY_TX) - { - hirda->State = HAL_IRDA_STATE_BUSY_TX_RX; - } - else - { - hirda->State = HAL_IRDA_STATE_BUSY_RX; - } - - /* Set the IRDA DMA transfer complete callback */ - hirda->hdmarx->XferCpltCallback = IRDA_DMAReceiveCplt; - - /* Set the IRDA DMA half transfer complete callback */ - hirda->hdmarx->XferHalfCpltCallback = IRDA_DMAReceiveHalfCplt; - - /* Set the DMA error callback */ - hirda->hdmarx->XferErrorCallback = IRDA_DMAError; - - /* Enable the DMA Stream */ - tmp = (uint32_t*)&pData; - HAL_DMA_Start_IT(hirda->hdmarx, (uint32_t)&hirda->Instance->DR, *(uint32_t*)tmp, Size); - - /* Enable the DMA transfer for the receiver request by setting the DMAR bit - in the USART CR3 register */ - hirda->Instance->CR3 |= USART_CR3_DMAR; - - /* Process Unlocked */ - __HAL_UNLOCK(hirda); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Pauses the DMA Transfer. - * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains - * the configuration information for the specified IRDA module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_IRDA_DMAPause(IRDA_HandleTypeDef *hirda) -{ - /* Process Locked */ - __HAL_LOCK(hirda); - - if(hirda->State == HAL_IRDA_STATE_BUSY_TX) - { - /* Disable the UART DMA Tx request */ - hirda->Instance->CR3 &= (uint32_t)(~USART_CR3_DMAT); - } - else if(hirda->State == HAL_IRDA_STATE_BUSY_RX) - { - /* Disable the UART DMA Rx request */ - hirda->Instance->CR3 &= (uint32_t)(~USART_CR3_DMAR); - } - else if (hirda->State == HAL_IRDA_STATE_BUSY_TX_RX) - { - /* Disable the UART DMA Tx & Rx requests */ - hirda->Instance->CR3 &= (uint32_t)(~USART_CR3_DMAT); - hirda->Instance->CR3 &= (uint32_t)(~USART_CR3_DMAR); - } - else - { - /* Process Unlocked */ - __HAL_UNLOCK(hirda); - - return HAL_ERROR; - } - - /* Process Unlocked */ - __HAL_UNLOCK(hirda); - - return HAL_OK; -} - -/** - * @brief Resumes the DMA Transfer. - * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_IRDA_DMAResume(IRDA_HandleTypeDef *hirda) -{ - /* Process Locked */ - __HAL_LOCK(hirda); - - if(hirda->State == HAL_IRDA_STATE_BUSY_TX) - { - /* Enable the UART DMA Tx request */ - hirda->Instance->CR3 |= USART_CR3_DMAT; - } - else if(hirda->State == HAL_IRDA_STATE_BUSY_RX) - { - /* Clear the Overrun flag before resuming the Rx transfer */ - __HAL_IRDA_CLEAR_OREFLAG(hirda); - /* Enable the UART DMA Rx request */ - hirda->Instance->CR3 |= USART_CR3_DMAR; - } - else if(hirda->State == HAL_IRDA_STATE_BUSY_TX_RX) - { - /* Clear the Overrun flag before resuming the Rx transfer */ - __HAL_IRDA_CLEAR_OREFLAG(hirda); - /* Enable the UART DMA Tx & Rx request */ - hirda->Instance->CR3 |= USART_CR3_DMAT; - hirda->Instance->CR3 |= USART_CR3_DMAR; - } - else - { - /* Process Unlocked */ - __HAL_UNLOCK(hirda); - - return HAL_ERROR; - } - - /* Process Unlocked */ - __HAL_UNLOCK(hirda); - - return HAL_OK; -} - -/** - * @brief Stops the DMA Transfer. - * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_IRDA_DMAStop(IRDA_HandleTypeDef *hirda) -{ - /* The Lock is not implemented on this API to allow the user application - to call the HAL UART API under callbacks HAL_UART_TxCpltCallback() / HAL_UART_RxCpltCallback(): - when calling HAL_DMA_Abort() API the DMA TX/RX Transfer complete interrupt is generated - and the correspond call back is executed HAL_UART_TxCpltCallback() / HAL_UART_RxCpltCallback() - */ - - /* Disable the UART Tx/Rx DMA requests */ - hirda->Instance->CR3 &= ~USART_CR3_DMAT; - hirda->Instance->CR3 &= ~USART_CR3_DMAR; - - /* Abort the UART DMA tx Stream */ - if(hirda->hdmatx != NULL) - { - HAL_DMA_Abort(hirda->hdmatx); - } - /* Abort the UART DMA rx Stream */ - if(hirda->hdmarx != NULL) - { - HAL_DMA_Abort(hirda->hdmarx); - } - - hirda->State = HAL_IRDA_STATE_READY; - - return HAL_OK; -} - -/** - * @brief This function handles IRDA interrupt request. - * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains - * the configuration information for the specified IRDA module. - * @retval None - */ -void HAL_IRDA_IRQHandler(IRDA_HandleTypeDef *hirda) -{ - uint32_t tmp1 = 0, tmp2 =0; - - tmp1 = __HAL_IRDA_GET_FLAG(hirda, IRDA_FLAG_PE); - tmp2 = __HAL_IRDA_GET_IT_SOURCE(hirda, IRDA_IT_PE); - /* IRDA parity error interrupt occurred -------------------------------------*/ - if((tmp1 != RESET) && (tmp2 != RESET)) - { - __HAL_IRDA_CLEAR_PEFLAG(hirda); - hirda->ErrorCode |= HAL_IRDA_ERROR_PE; - } - - tmp1 = __HAL_IRDA_GET_FLAG(hirda, IRDA_FLAG_FE); - tmp2 = __HAL_IRDA_GET_IT_SOURCE(hirda, IRDA_IT_ERR); - /* IRDA frame error interrupt occurred --------------------------------------*/ - if((tmp1 != RESET) && (tmp2 != RESET)) - { - __HAL_IRDA_CLEAR_FEFLAG(hirda); - hirda->ErrorCode |= HAL_IRDA_ERROR_FE; - } - - tmp1 = __HAL_IRDA_GET_FLAG(hirda, IRDA_FLAG_NE); - tmp2 = __HAL_IRDA_GET_IT_SOURCE(hirda, IRDA_IT_ERR); - /* IRDA noise error interrupt occurred --------------------------------------*/ - if((tmp1 != RESET) && (tmp2 != RESET)) - { - __HAL_IRDA_CLEAR_NEFLAG(hirda); - hirda->ErrorCode |= HAL_IRDA_ERROR_NE; - } - - tmp1 = __HAL_IRDA_GET_FLAG(hirda, IRDA_FLAG_ORE); - tmp2 = __HAL_IRDA_GET_IT_SOURCE(hirda, IRDA_IT_ERR); - /* IRDA Over-Run interrupt occurred -----------------------------------------*/ - if((tmp1 != RESET) && (tmp2 != RESET)) - { - __HAL_IRDA_CLEAR_OREFLAG(hirda); - hirda->ErrorCode |= HAL_IRDA_ERROR_ORE; - } - - /* Call the Error call Back in case of Errors */ - if(hirda->ErrorCode != HAL_IRDA_ERROR_NONE) - { - /* Set the IRDA state ready to be able to start again the process */ - hirda->State = HAL_IRDA_STATE_READY; - HAL_IRDA_ErrorCallback(hirda); - } - - tmp1 = __HAL_IRDA_GET_FLAG(hirda, IRDA_FLAG_RXNE); - tmp2 = __HAL_IRDA_GET_IT_SOURCE(hirda, IRDA_IT_RXNE); - /* IRDA in mode Receiver ---------------------------------------------------*/ - if((tmp1 != RESET) && (tmp2 != RESET)) - { - IRDA_Receive_IT(hirda); - } - - tmp1 = __HAL_IRDA_GET_FLAG(hirda, IRDA_FLAG_TXE); - tmp2 = __HAL_IRDA_GET_IT_SOURCE(hirda, IRDA_IT_TXE); - /* IRDA in mode Transmitter ------------------------------------------------*/ - if((tmp1 != RESET) &&(tmp2 != RESET)) - { - IRDA_Transmit_IT(hirda); - } - - tmp1 = __HAL_IRDA_GET_FLAG(hirda, IRDA_FLAG_TC); - tmp2 = __HAL_IRDA_GET_IT_SOURCE(hirda, IRDA_IT_TC); - /* IRDA in mode Transmitter (transmission end) -----------------------------*/ - if((tmp1 != RESET) && (tmp2 != RESET)) - { - IRDA_EndTransmit_IT(hirda); - } -} - -/** - * @brief Tx Transfer complete callbacks. - * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains - * the configuration information for the specified IRDA module. - * @retval None - */ - __weak void HAL_IRDA_TxCpltCallback(IRDA_HandleTypeDef *hirda) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_IRDA_TxCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Tx Half Transfer completed callbacks. - * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains - * the configuration information for the specified USART module. - * @retval None - */ - __weak void HAL_IRDA_TxHalfCpltCallback(IRDA_HandleTypeDef *hirda) -{ - /* NOTE: This function Should not be modified, when the callback is needed, - the HAL_IRDA_TxHalfCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Rx Transfer complete callbacks. - * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains - * the configuration information for the specified IRDA module. - * @retval None - */ -__weak void HAL_IRDA_RxCpltCallback(IRDA_HandleTypeDef *hirda) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_IRDA_RxCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Rx Half Transfer complete callbacks. - * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains - * the configuration information for the specified IRDA module. - * @retval None - */ -__weak void HAL_IRDA_RxHalfCpltCallback(IRDA_HandleTypeDef *hirda) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_IRDA_RxHalfCpltCallback could be implemented in the user file - */ -} - -/** - * @brief IRDA error callbacks. - * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains - * the configuration information for the specified IRDA module. - * @retval None - */ - __weak void HAL_IRDA_ErrorCallback(IRDA_HandleTypeDef *hirda) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_IRDA_ErrorCallback could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup IRDA_Exported_Functions_Group3 Peripheral State and Errors functions - * @brief IRDA State and Errors functions - * -@verbatim - ============================================================================== - ##### Peripheral State and Errors functions ##### - ============================================================================== - [..] - This subsection provides a set of functions allowing to return the State of IrDA - communication process and also return Peripheral Errors occurred during communication process - (+) HAL_IRDA_GetState() API can be helpful to check in run-time the state of the IrDA peripheral. - (+) HAL_IRDA_GetError() check in run-time errors that could be occurred during communication. - -@endverbatim - * @{ - */ - -/** - * @brief Returns the IRDA state. - * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains - * the configuration information for the specified IRDA module. - * @retval HAL state - */ -HAL_IRDA_StateTypeDef HAL_IRDA_GetState(IRDA_HandleTypeDef *hirda) -{ - return hirda->State; -} - -/** - * @brief Return the IARDA error code - * @param hirda : pointer to a IRDA_HandleTypeDef structure that contains - * the configuration information for the specified IRDA. - * @retval IRDA Error Code - */ -uint32_t HAL_IRDA_GetError(IRDA_HandleTypeDef *hirda) -{ - return hirda->ErrorCode; -} - -/** - * @} - */ - -/** - * @brief DMA IRDA transmit process complete callback. - * @param hdma : DMA handle - * @retval None - */ -static void IRDA_DMATransmitCplt(DMA_HandleTypeDef *hdma) -{ - IRDA_HandleTypeDef* hirda = ( IRDA_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; - /* DMA Normal mode */ - if((hdma->Instance->CR & DMA_SxCR_CIRC) == 0) - { - hirda->TxXferCount = 0; - - /* Disable the DMA transfer for transmit request by setting the DMAT bit - in the IRDA CR3 register */ - hirda->Instance->CR3 &= (uint16_t)~((uint16_t)USART_CR3_DMAT); - - /* Enable the IRDA Transmit Complete Interrupt */ - __HAL_IRDA_ENABLE_IT(hirda, IRDA_IT_TC); - } - /* DMA Circular mode */ - else - { - HAL_IRDA_TxCpltCallback(hirda); - } -} - -/** - * @brief DMA IRDA receive process half complete callback - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void IRDA_DMATransmitHalfCplt(DMA_HandleTypeDef *hdma) -{ - IRDA_HandleTypeDef* hirda = ( IRDA_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; - - HAL_IRDA_TxHalfCpltCallback(hirda); -} - -/** - * @brief DMA IRDA receive process complete callback. - * @param hdma: DMA handle - * @retval None - */ -static void IRDA_DMAReceiveCplt(DMA_HandleTypeDef *hdma) -{ - IRDA_HandleTypeDef* hirda = ( IRDA_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; - /* DMA Normal mode */ - if((hdma->Instance->CR & DMA_SxCR_CIRC) == 0) - { - hirda->RxXferCount = 0; - - /* Disable the DMA transfer for the receiver request by setting the DMAR bit - in the IRDA CR3 register */ - hirda->Instance->CR3 &= (uint16_t)~((uint16_t)USART_CR3_DMAR); - - if(hirda->State == HAL_IRDA_STATE_BUSY_TX_RX) - { - hirda->State = HAL_IRDA_STATE_BUSY_TX; - } - else - { - hirda->State = HAL_IRDA_STATE_READY; - } - } - - HAL_IRDA_RxCpltCallback(hirda); -} - -/** - * @brief DMA IRDA receive process half complete callback - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void IRDA_DMAReceiveHalfCplt(DMA_HandleTypeDef *hdma) -{ - IRDA_HandleTypeDef* hirda = ( IRDA_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; - - HAL_IRDA_RxHalfCpltCallback(hirda); -} - -/** - * @brief DMA IRDA communication error callback. - * @param hdma: DMA handle - * @retval None - */ -static void IRDA_DMAError(DMA_HandleTypeDef *hdma) -{ - IRDA_HandleTypeDef* hirda = ( IRDA_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; - - hirda->RxXferCount = 0; - hirda->TxXferCount = 0; - hirda->ErrorCode |= HAL_IRDA_ERROR_DMA; - hirda->State= HAL_IRDA_STATE_READY; - - HAL_IRDA_ErrorCallback(hirda); -} - -/** - * @brief This function handles IRDA Communication Timeout. - * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains - * the configuration information for the specified IRDA module. - * @param Flag: specifies the IRDA flag to check. - * @param Status: The new Flag status (SET or RESET). - * @param Timeout: Timeout duration - * @retval HAL status - */ -static HAL_StatusTypeDef IRDA_WaitOnFlagUntilTimeout(IRDA_HandleTypeDef *hirda, uint32_t Flag, FlagStatus Status, uint32_t Timeout) -{ - uint32_t tickstart = 0; - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait until flag is set */ - if(Status == RESET) - { - while(__HAL_IRDA_GET_FLAG(hirda, Flag) == RESET) - { - /* Check for the Timeout */ - if(Timeout != HAL_MAX_DELAY) - { - if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout)) - { - /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */ - __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_TXE); - __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_RXNE); - __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_PE); - __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_ERR); - - hirda->State= HAL_IRDA_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hirda); - - return HAL_TIMEOUT; - } - } - } - } - else - { - while(__HAL_IRDA_GET_FLAG(hirda, Flag) != RESET) - { - /* Check for the Timeout */ - if(Timeout != HAL_MAX_DELAY) - { - if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout)) - { - /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */ - __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_TXE); - __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_RXNE); - __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_PE); - __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_ERR); - - hirda->State= HAL_IRDA_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hirda); - - return HAL_TIMEOUT; - } - } - } - } - return HAL_OK; -} - - /** - * @brief Send an amount of data in non blocking mode. - * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains - * the configuration information for the specified IRDA module. - * @retval HAL status - */ -static HAL_StatusTypeDef IRDA_Transmit_IT(IRDA_HandleTypeDef *hirda) -{ - uint16_t* tmp; - uint32_t tmp1 = 0; - - tmp1 = hirda->State; - if((tmp1 == HAL_IRDA_STATE_BUSY_TX) || (tmp1 == HAL_IRDA_STATE_BUSY_TX_RX)) - { - if(hirda->Init.WordLength == IRDA_WORDLENGTH_9B) - { - tmp = (uint16_t*) hirda->pTxBuffPtr; - hirda->Instance->DR = (uint16_t)(*tmp & (uint16_t)0x01FF); - if(hirda->Init.Parity == IRDA_PARITY_NONE) - { - hirda->pTxBuffPtr += 2; - } - else - { - hirda->pTxBuffPtr += 1; - } - } - else - { - hirda->Instance->DR = (uint8_t)(*hirda->pTxBuffPtr++ & (uint8_t)0x00FF); - } - - if(--hirda->TxXferCount == 0) - { - /* Disable the IRDA Transmit Data Register Empty Interrupt */ - __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_TXE); - - /* Enable the IRDA Transmit Complete Interrupt */ - __HAL_IRDA_ENABLE_IT(hirda, IRDA_IT_TC); - } - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Wraps up transmission in non blocking mode. - * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains - * the configuration information for the specified IRDA module. - * @retval HAL status - */ -static HAL_StatusTypeDef IRDA_EndTransmit_IT(IRDA_HandleTypeDef *hirda) -{ - /* Disable the IRDA Transmit Complete Interrupt */ - __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_TC); - - /* Check if a receive process is ongoing or not */ - if(hirda->State == HAL_IRDA_STATE_BUSY_TX_RX) - { - hirda->State = HAL_IRDA_STATE_BUSY_RX; - } - else - { - /* Disable the IRDA Error Interrupt: (Frame error, noise error, overrun error) */ - __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_ERR); - - hirda->State = HAL_IRDA_STATE_READY; - } - - HAL_IRDA_TxCpltCallback(hirda); - - return HAL_OK; -} - -/** - * @brief Receives an amount of data in non blocking mode. - * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains - * the configuration information for the specified IRDA module. - * @retval HAL status - */ -static HAL_StatusTypeDef IRDA_Receive_IT(IRDA_HandleTypeDef *hirda) -{ - uint16_t* tmp; - uint32_t tmp1 = 0; - - tmp1 = hirda->State; - if((tmp1 == HAL_IRDA_STATE_BUSY_RX) || (tmp1 == HAL_IRDA_STATE_BUSY_TX_RX)) - { - if(hirda->Init.WordLength == IRDA_WORDLENGTH_9B) - { - tmp = (uint16_t*) hirda->pRxBuffPtr; - if(hirda->Init.Parity == IRDA_PARITY_NONE) - { - *tmp = (uint16_t)(hirda->Instance->DR & (uint16_t)0x01FF); - hirda->pRxBuffPtr += 2; - } - else - { - *tmp = (uint16_t)(hirda->Instance->DR & (uint16_t)0x00FF); - hirda->pRxBuffPtr += 1; - } - } - else - { - if(hirda->Init.Parity == IRDA_PARITY_NONE) - { - *hirda->pRxBuffPtr++ = (uint8_t)(hirda->Instance->DR & (uint8_t)0x00FF); - } - else - { - *hirda->pRxBuffPtr++ = (uint8_t)(hirda->Instance->DR & (uint8_t)0x007F); - } - } - - if(--hirda->RxXferCount == 0) - { - - __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_RXNE); - - if(hirda->State == HAL_IRDA_STATE_BUSY_TX_RX) - { - hirda->State = HAL_IRDA_STATE_BUSY_TX; - } - else - { - /* Disable the IRDA Parity Error Interrupt */ - __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_PE); - - /* Disable the IRDA Error Interrupt: (Frame error, noise error, overrun error) */ - __HAL_IRDA_DISABLE_IT(hirda, IRDA_IT_ERR); - - hirda->State = HAL_IRDA_STATE_READY; - } - HAL_IRDA_RxCpltCallback(hirda); - - return HAL_OK; - } - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Configures the IRDA peripheral. - * @param hirda: pointer to a IRDA_HandleTypeDef structure that contains - * the configuration information for the specified IRDA module. - * @retval None - */ -static void IRDA_SetConfig(IRDA_HandleTypeDef *hirda) -{ - uint32_t tmpreg = 0x00; - - /* Check the parameters */ - assert_param(IS_IRDA_INSTANCE(hirda->Instance)); - assert_param(IS_IRDA_BAUDRATE(hirda->Init.BaudRate)); - assert_param(IS_IRDA_WORD_LENGTH(hirda->Init.WordLength)); - assert_param(IS_IRDA_PARITY(hirda->Init.Parity)); - assert_param(IS_IRDA_MODE(hirda->Init.Mode)); - - /*-------------------------- IRDA CR2 Configuration ------------------------*/ - /* Clear STOP[13:12] bits */ - hirda->Instance->CR2 &= (uint32_t)~((uint32_t)USART_CR2_STOP); - - /*-------------------------- USART CR1 Configuration -----------------------*/ - tmpreg = hirda->Instance->CR1; - - /* Clear M, PCE, PS, TE and RE bits */ - tmpreg &= (uint32_t)~((uint32_t)(USART_CR1_M | USART_CR1_PCE | USART_CR1_PS | USART_CR1_TE | \ - USART_CR1_RE)); - - /* Configure the USART Word Length, Parity and mode: - Set the M bits according to hirda->Init.WordLength value - Set PCE and PS bits according to hirda->Init.Parity value - Set TE and RE bits according to hirda->Init.Mode value */ - tmpreg |= (uint32_t)hirda->Init.WordLength | hirda->Init.Parity | hirda->Init.Mode; - - /* Write to USART CR1 */ - hirda->Instance->CR1 = (uint32_t)tmpreg; - - /*-------------------------- USART CR3 Configuration -----------------------*/ - /* Clear CTSE and RTSE bits */ - hirda->Instance->CR3 &= (uint32_t)~((uint32_t)(USART_CR3_RTSE | USART_CR3_CTSE)); - - /*-------------------------- USART BRR Configuration -----------------------*/ - if((hirda->Instance == USART1) || (hirda->Instance == USART6)) - { - hirda->Instance->BRR = IRDA_BRR(HAL_RCC_GetPCLK2Freq(), hirda->Init.BaudRate); - } - else - { - hirda->Instance->BRR = IRDA_BRR(HAL_RCC_GetPCLK1Freq(), hirda->Init.BaudRate); - } -} -/** - * @} - */ - -#endif /* HAL_IRDA_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_iwdg.c b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_iwdg.c deleted file mode 100755 index 33bdf533..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_iwdg.c +++ /dev/null @@ -1,361 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_hal_iwdg.c - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief IWDG HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the Independent Watchdog (IWDG) peripheral: - * + Initialization and Configuration functions - * + IO operation functions - * + Peripheral State functions - * - @verbatim - ============================================================================== - ##### IWDG Specific features ##### - ============================================================================== - [..] - (+) The IWDG can be started by either software or hardware (configurable - through option byte). - - (+) The IWDG is clocked by its own dedicated Low-Speed clock (LSI) and - thus stays active even if the main clock fails. - Once the IWDG is started, the LSI is forced ON and cannot be disabled - (LSI cannot be disabled too), and the counter starts counting down from - the reset value of 0xFFF. When it reaches the end of count value (0x000) - a system reset is generated. - - (+) The IWDG counter should be refreshed at regular intervals, otherwise the - watchdog generates an MCU reset when the counter reaches 0. - - (+) The IWDG is implemented in the VDD voltage domain that is still functional - in STOP and STANDBY mode (IWDG reset can wake-up from STANDBY). - IWDGRST flag in RCC_CSR register can be used to inform when an IWDG - reset occurs. - - (+) Min-max timeout value @32KHz (LSI): ~125us / ~32.7s - The IWDG timeout may vary due to LSI frequency dispersion. STM32F2xx - devices provide the capability to measure the LSI frequency (LSI clock - connected internally to TIM5 CH4 input capture). The measured value - can be used to have an IWDG timeout with an acceptable accuracy. - - - ##### How to use this driver ##### - ============================================================================== - [..] - If Window option is disabled - (+) Use IWDG using HAL_IWDG_Init() function to : - (++) Enable write access to IWDG_PR, IWDG_RLR. - (++) Configure the IWDG prescaler, counter reload value. - This reload value will be loaded in the IWDG counter each time the counter - is reloaded, then the IWDG will start counting down from this value. - [..] - (+) Use IWDG using HAL_IWDG_Start() function to: - (++) Reload IWDG counter with value defined in the IWDG_RLR register. - (++) Start the IWDG, when the IWDG is used in software mode (no need - to enable the LSI, it will be enabled by hardware). - (+) Then the application program must refresh the IWDG counter at regular - intervals during normal operation to prevent an MCU reset, using - HAL_IWDG_Refresh() function. - [..] - if Window option is enabled: - - (+) Use IWDG using HAL_IWDG_Start() function to enable IWDG downcounter - (+) Use IWDG using HAL_IWDG_Init() function to : - (++) Enable write access to IWDG_PR, IWDG_RLR and IWDG_WINR registers. - (++) Configure the IWDG prescaler, reload value and window value. - (+) Then the application program must refresh the IWDG counter at regular - intervals during normal operation to prevent an MCU reset, using - HAL_IWDG_Refresh() function. - - *** IWDG HAL driver macros list *** - ==================================== - [..] - Below the list of most used macros in IWDG HAL driver. - - (+) __HAL_IWDG_START: Enable the IWDG peripheral - (+) __HAL_IWDG_RELOAD_COUNTER: Reloads IWDG counter with value defined in the reload register - (+) __HAL_IWDG_GET_FLAG: Get the selected IWDG's flag status - - @endverbatim - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal.h" - -/** @addtogroup STM32F2xx_HAL_Driver - * @{ - */ - -/** @defgroup IWDG IWDG - * @brief IWDG HAL module driver. - * @{ - */ - -#ifdef HAL_IWDG_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ - /** @addtogroup IWDG_Private_Constants - * @{ - */ -#define IWDG_TIMEOUT_FLAG ((uint32_t)1000) /* 1 s */ -/** - * @} - */ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ -/** @defgroup IWDG_Exported_Functions IWDG Exported Functions - * @{ - */ - -/** @defgroup IWDG_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions. - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Initialize the IWDG according to the specified parameters - in the IWDG_InitTypeDef and create the associated handle - (+) Initialize the IWDG MSP - (+) DeInitialize IWDG MSP - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the IWDG according to the specified - * parameters in the IWDG_InitTypeDef and creates the associated handle. - * @param hiwdg: pointer to a IWDG_HandleTypeDef structure that contains - * the configuration information for the specified IWDG module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_IWDG_Init(IWDG_HandleTypeDef *hiwdg) -{ - /* Check the IWDG handle allocation */ - if(hiwdg == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_IWDG_ALL_INSTANCE(hiwdg->Instance)); - assert_param(IS_IWDG_PRESCALER(hiwdg->Init.Prescaler)); - assert_param(IS_IWDG_RELOAD(hiwdg->Init.Reload)); - - if(hiwdg->State == HAL_IWDG_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - hiwdg->Lock = HAL_UNLOCKED; - /* Init the low level hardware */ - HAL_IWDG_MspInit(hiwdg); - } - - /* Change IWDG peripheral state */ - hiwdg->State = HAL_IWDG_STATE_BUSY; - - /* Enable write access to IWDG_PR and IWDG_RLR registers */ - IWDG_ENABLE_WRITE_ACCESS(hiwdg); - - /* Write to IWDG registers the IWDG_Prescaler & IWDG_Reload values to work with */ - MODIFY_REG(hiwdg->Instance->PR, IWDG_PR_PR, hiwdg->Init.Prescaler); - MODIFY_REG(hiwdg->Instance->RLR, IWDG_RLR_RL, hiwdg->Init.Reload); - - /* Change IWDG peripheral state */ - hiwdg->State = HAL_IWDG_STATE_READY; - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Initializes the IWDG MSP. - * @param hiwdg: pointer to a IWDG_HandleTypeDef structure that contains - * the configuration information for the specified IWDG module. - * @retval None - */ -__weak void HAL_IWDG_MspInit(IWDG_HandleTypeDef *hiwdg) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_IWDG_MspInit could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup IWDG_Exported_Functions_Group2 IO operation functions - * @brief IO operation functions - * -@verbatim - =============================================================================== - ##### IO operation functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Start the IWDG. - (+) Refresh the IWDG. - -@endverbatim - * @{ - */ - -/** - * @brief Starts the IWDG. - * @param hiwdg: pointer to a IWDG_HandleTypeDef structure that contains - * the configuration information for the specified IWDG module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_IWDG_Start(IWDG_HandleTypeDef *hiwdg) -{ - /* Process Locked */ - __HAL_LOCK(hiwdg); - - /* Change IWDG peripheral state */ - hiwdg->State = HAL_IWDG_STATE_BUSY; - - /* Start the IWDG peripheral */ - __HAL_IWDG_START(hiwdg); - - /* Reload IWDG counter with value defined in the RLR register */ - __HAL_IWDG_RELOAD_COUNTER(hiwdg); - - /* Change IWDG peripheral state */ - hiwdg->State = HAL_IWDG_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hiwdg); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Refreshes the IWDG. - * @param hiwdg: pointer to a IWDG_HandleTypeDef structure that contains - * the configuration information for the specified IWDG module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg) -{ - uint32_t tickstart = 0; - - /* Process Locked */ - __HAL_LOCK(hiwdg); - - /* Change IWDG peripheral state */ - hiwdg->State = HAL_IWDG_STATE_BUSY; - - tickstart = HAL_GetTick(); - - /* Wait until RVU flag is RESET */ - while(__HAL_IWDG_GET_FLAG(hiwdg, IWDG_FLAG_RVU) != RESET) - { - if((HAL_GetTick() - tickstart ) > IWDG_TIMEOUT_FLAG) - { - /* Set IWDG state */ - hiwdg->State = HAL_IWDG_STATE_TIMEOUT; - - /* Process unlocked */ - __HAL_UNLOCK(hiwdg); - - return HAL_TIMEOUT; - } - } - - /* Reload IWDG counter with value defined in the reload register */ - __HAL_IWDG_RELOAD_COUNTER(hiwdg); - - /* Change IWDG peripheral state */ - hiwdg->State = HAL_IWDG_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hiwdg); - - /* Return function status */ - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup IWDG_Exported_Functions_Group3 Peripheral State functions - * @brief Peripheral State functions. - * -@verbatim - =============================================================================== - ##### Peripheral State functions ##### - =============================================================================== - [..] - This subsection permits to get in run-time the status of the peripheral - and the data flow. - -@endverbatim - * @{ - */ - -/** - * @brief Returns the IWDG state. - * @param hiwdg: pointer to a IWDG_HandleTypeDef structure that contains - * the configuration information for the specified IWDG module. - * @retval HAL state - */ -HAL_IWDG_StateTypeDef HAL_IWDG_GetState(IWDG_HandleTypeDef *hiwdg) -{ - return hiwdg->State; -} - -/** - * @} - */ - -/** - * @} - */ - -#endif /* HAL_IWDG_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_msp_template.c b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_msp_template.c deleted file mode 100755 index 1c816000..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_msp_template.c +++ /dev/null @@ -1,129 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_hal_msp_template.c - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief HAL MSP module. - * This file template is located in the HAL folder and should be copied - * to the user folder. - * - @verbatim - =============================================================================== - ##### How to use this driver ##### - =============================================================================== - [..] - This file is generated automatically by STM32CubeMX and eventually modified - by the user - - @endverbatim - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal.h" - -/** @addtogroup STM32F2xx_HAL_Driver - * @{ - */ - -/** @defgroup HAL_MSP HAL MSP - * @brief HAL MSP module. - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup HAL_MSP_Private_Functions HAL MSP Private Functions - * @{ - */ - -/** - * @brief Initializes the Global MSP. - * @retval None - */ -void HAL_MspInit(void) -{ - /* NOTE : This function is generated automatically by STM32CubeMX and eventually - modified by the user - */ -} - -/** - * @brief DeInitializes the Global MSP. - * @retval None - */ -void HAL_MspDeInit(void) -{ - /* NOTE : This function is generated automatically by STM32CubeMX and eventually - modified by the user - */ -} - -/** - * @brief Initializes the PPP MSP. - * @retval None - */ -void HAL_PPP_MspInit(void) -{ - /* NOTE : This function is generated automatically by STM32CubeMX and eventually - modified by the user - */ -} - -/** - * @brief DeInitializes the PPP MSP. - * @retval None - */ -void HAL_PPP_MspDeInit(void) -{ - /* NOTE : This function is generated automatically by STM32CubeMX and eventually - modified by the user - */ -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_nand.c b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_nand.c deleted file mode 100755 index 7adf41a5..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_nand.c +++ /dev/null @@ -1,1121 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_hal_nand.c - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief NAND HAL module driver. - * This file provides a generic firmware to drive NAND memories mounted - * as external device. - * - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - This driver is a generic layered driver which contains a set of APIs used to - control NAND flash memories. It uses the FSMC layer functions to interface - with NAND devices. This driver is used as follows: - - (+) NAND flash memory configuration sequence using the function HAL_NAND_Init() - with control and timing parameters for both common and attribute spaces. - - (+) Read NAND flash memory maker and device IDs using the function - HAL_NAND_Read_ID(). The read information is stored in the NAND_ID_TypeDef - structure declared by the function caller. - - (+) Access NAND flash memory by read/write operations using the functions - HAL_NAND_Read_Page()/HAL_NAND_Read_SpareArea(), HAL_NAND_Write_Page()/HAL_NAND_Write_SpareArea() - to read/write page(s)/spare area(s). These functions use specific device - information (Block, page size..) predefined by the user in the HAL_NAND_Info_TypeDef - structure. The read/write address information is contained by the Nand_Address_Typedef - structure passed as parameter. - - (+) Perform NAND flash Reset chip operation using the function HAL_NAND_Reset(). - - (+) Perform NAND flash erase block operation using the function HAL_NAND_Erase_Block(). - The erase block address information is contained in the Nand_Address_Typedef - structure passed as parameter. - - (+) Read the NAND flash status operation using the function HAL_NAND_Read_Status(). - - (+) You can also control the NAND device by calling the control APIs HAL_NAND_ECC_Enable()/ - HAL_NAND_ECC_Disable() to respectively enable/disable the ECC code correction - feature or the function HAL_NAND_GetECC() to get the ECC correction code. - - (+) You can monitor the NAND device HAL state by calling the function - HAL_NAND_GetState() - - [..] - (@) This driver is a set of generic APIs which handle standard NAND flash operations. - If a NAND flash device contains different operations and/or implementations, - it should be implemented separately. - - @endverbatim - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal.h" - -/** @addtogroup STM32F2xx_HAL_Driver - * @{ - */ - - -#ifdef HAL_NAND_MODULE_ENABLED - - -/** @defgroup NAND NAND - * @brief NAND HAL module driver - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @defgroup NAND_Private_Constants NAND Private Constants - * @{ - */ - -/** - * @} - */ - -/* Private macro -------------------------------------------------------------*/ -/** @defgroup NAND_Private_Macros NAND Private Macros - * @{ - */ - -/** - * @} - */ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ -/** @defgroup NAND_Exported_Functions NAND Exported Functions - * @{ - */ - -/** @defgroup NAND_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * - @verbatim - ============================================================================== - ##### NAND Initialization and de-initialization functions ##### - ============================================================================== - [..] - This section provides functions allowing to initialize/de-initialize - the NAND memory - -@endverbatim - * @{ - */ - -/** - * @brief Perform NAND memory Initialization sequence - * @param hnand: pointer to a NAND_HandleTypeDef structure that contains - * the configuration information for NAND module. - * @param ComSpace_Timing: pointer to Common space timing structure - * @param AttSpace_Timing: pointer to Attribute space timing structure - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NAND_Init(NAND_HandleTypeDef *hnand, FSMC_NAND_PCC_TimingTypeDef *ComSpace_Timing, FSMC_NAND_PCC_TimingTypeDef *AttSpace_Timing) -{ - /* Check the NAND handle state */ - if(hnand == NULL) - { - return HAL_ERROR; - } - - if(hnand->State == HAL_NAND_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - hnand->Lock = HAL_UNLOCKED; - /* Initialize the low level hardware (MSP) */ - HAL_NAND_MspInit(hnand); - } - - /* Initialize NAND control Interface */ - FSMC_NAND_Init(hnand->Instance, &(hnand->Init)); - - /* Initialize NAND common space timing Interface */ - FSMC_NAND_CommonSpace_Timing_Init(hnand->Instance, ComSpace_Timing, hnand->Init.NandBank); - - /* Initialize NAND attribute space timing Interface */ - FSMC_NAND_AttributeSpace_Timing_Init(hnand->Instance, AttSpace_Timing, hnand->Init.NandBank); - - /* Enable the NAND device */ - __FSMC_NAND_ENABLE(hnand->Instance, hnand->Init.NandBank); - - /* Update the NAND controller state */ - hnand->State = HAL_NAND_STATE_READY; - - return HAL_OK; -} - -/** - * @brief Perform NAND memory De-Initialization sequence - * @param hnand: pointer to a NAND_HandleTypeDef structure that contains - * the configuration information for NAND module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NAND_DeInit(NAND_HandleTypeDef *hnand) -{ - /* Initialize the low level hardware (MSP) */ - HAL_NAND_MspDeInit(hnand); - - /* Configure the NAND registers with their reset values */ - FSMC_NAND_DeInit(hnand->Instance, hnand->Init.NandBank); - - /* Reset the NAND controller state */ - hnand->State = HAL_NAND_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(hnand); - - return HAL_OK; -} - -/** - * @brief NAND MSP Init - * @param hnand: pointer to a NAND_HandleTypeDef structure that contains - * the configuration information for NAND module. - * @retval None - */ -__weak void HAL_NAND_MspInit(NAND_HandleTypeDef *hnand) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_NAND_MspInit could be implemented in the user file - */ -} - -/** - * @brief NAND MSP DeInit - * @param hnand: pointer to a NAND_HandleTypeDef structure that contains - * the configuration information for NAND module. - * @retval None - */ -__weak void HAL_NAND_MspDeInit(NAND_HandleTypeDef *hnand) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_NAND_MspDeInit could be implemented in the user file - */ -} - - -/** - * @brief This function handles NAND device interrupt request. - * @param hnand: pointer to a NAND_HandleTypeDef structure that contains - * the configuration information for NAND module. - * @retval HAL status -*/ -void HAL_NAND_IRQHandler(NAND_HandleTypeDef *hnand) -{ - /* Check NAND interrupt Rising edge flag */ - if(__FSMC_NAND_GET_FLAG(hnand->Instance, hnand->Init.NandBank, FSMC_FLAG_RISING_EDGE)) - { - /* NAND interrupt callback*/ - HAL_NAND_ITCallback(hnand); - - /* Clear NAND interrupt Rising edge pending bit */ - __FSMC_NAND_CLEAR_FLAG(hnand->Instance, hnand->Init.NandBank, FSMC_FLAG_RISING_EDGE); - } - - /* Check NAND interrupt Level flag */ - if(__FSMC_NAND_GET_FLAG(hnand->Instance, hnand->Init.NandBank, FSMC_FLAG_LEVEL)) - { - /* NAND interrupt callback*/ - HAL_NAND_ITCallback(hnand); - - /* Clear NAND interrupt Level pending bit */ - __FSMC_NAND_CLEAR_FLAG(hnand->Instance, hnand->Init.NandBank, FSMC_FLAG_LEVEL); - } - - /* Check NAND interrupt Falling edge flag */ - if(__FSMC_NAND_GET_FLAG(hnand->Instance, hnand->Init.NandBank, FSMC_FLAG_FALLING_EDGE)) - { - /* NAND interrupt callback*/ - HAL_NAND_ITCallback(hnand); - - /* Clear NAND interrupt Falling edge pending bit */ - __FSMC_NAND_CLEAR_FLAG(hnand->Instance, hnand->Init.NandBank, FSMC_FLAG_FALLING_EDGE); - } - - /* Check NAND interrupt FIFO empty flag */ - if(__FSMC_NAND_GET_FLAG(hnand->Instance, hnand->Init.NandBank, FSMC_FLAG_FEMPT)) - { - /* NAND interrupt callback*/ - HAL_NAND_ITCallback(hnand); - - /* Clear NAND interrupt FIFO empty pending bit */ - __FSMC_NAND_CLEAR_FLAG(hnand->Instance, hnand->Init.NandBank, FSMC_FLAG_FEMPT); - } - -} - -/** - * @brief NAND interrupt feature callback - * @param hnand: pointer to a NAND_HandleTypeDef structure that contains - * the configuration information for NAND module. - * @retval None - */ -__weak void HAL_NAND_ITCallback(NAND_HandleTypeDef *hnand) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_NAND_ITCallback could be implemented in the user file - */ -} - -/** - * @} - */ - - - - -/** @defgroup NAND_Exported_Functions_Group2 Input and Output functions - * @brief Input Output and memory control functions - * - @verbatim - ============================================================================== - ##### NAND Input and Output functions ##### - ============================================================================== - [..] - This section provides functions allowing to use and control the NAND - memory - -@endverbatim - * @{ - */ - -/** - * @brief Read the NAND memory electronic signature - * @param hnand: pointer to a NAND_HandleTypeDef structure that contains - * the configuration information for NAND module. - * @param pNAND_ID: NAND ID structure - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NAND_Read_ID(NAND_HandleTypeDef *hnand, NAND_IDTypeDef *pNAND_ID) -{ - __IO uint32_t data = 0; - uint32_t deviceaddress = 0; - - /* Process Locked */ - __HAL_LOCK(hnand); - - /* Check the NAND controller state */ - if(hnand->State == HAL_NAND_STATE_BUSY) - { - return HAL_BUSY; - } - - /* Identify the device address */ - if(hnand->Init.NandBank == FSMC_NAND_BANK2) - { - deviceaddress = NAND_DEVICE1; - } - else - { - deviceaddress = NAND_DEVICE2; - } - - /* Update the NAND controller state */ - hnand->State = HAL_NAND_STATE_BUSY; - - /* Send Read ID command sequence */ - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_READID; - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00; - - /* Read the electronic signature from NAND flash */ - data = *(__IO uint32_t *)deviceaddress; - - /* Return the data read */ - pNAND_ID->Maker_Id = ADDR_1ST_CYCLE(data); - pNAND_ID->Device_Id = ADDR_2ND_CYCLE(data); - pNAND_ID->Third_Id = ADDR_3RD_CYCLE(data); - pNAND_ID->Fourth_Id = ADDR_4TH_CYCLE(data); - - /* Update the NAND controller state */ - hnand->State = HAL_NAND_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hnand); - - return HAL_OK; -} - -/** - * @brief NAND memory reset - * @param hnand: pointer to a NAND_HandleTypeDef structure that contains - * the configuration information for NAND module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NAND_Reset(NAND_HandleTypeDef *hnand) -{ - uint32_t deviceaddress = 0; - - /* Process Locked */ - __HAL_LOCK(hnand); - - /* Check the NAND controller state */ - if(hnand->State == HAL_NAND_STATE_BUSY) - { - return HAL_BUSY; - } - - /* Identify the device address */ - if(hnand->Init.NandBank == FSMC_NAND_BANK2) - { - deviceaddress = NAND_DEVICE1; - } - else - { - deviceaddress = NAND_DEVICE2; - } - - /* Update the NAND controller state */ - hnand->State = HAL_NAND_STATE_BUSY; - - /* Send NAND reset command */ - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = 0xFF; - - - /* Update the NAND controller state */ - hnand->State = HAL_NAND_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hnand); - - return HAL_OK; - -} - -/** - * @brief Read Page(s) from NAND memory block - * @param hnand: pointer to a NAND_HandleTypeDef structure that contains - * the configuration information for NAND module. - * @param pAddress : pointer to NAND address structure - * @param pBuffer : pointer to destination read buffer - * @param NumPageToRead : number of pages to read from block - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NAND_Read_Page(NAND_HandleTypeDef *hnand, NAND_AddressTypeDef *pAddress, uint8_t *pBuffer, uint32_t NumPageToRead) -{ - __IO uint32_t index = 0; - uint32_t deviceaddress = 0, size = 0, numpagesread = 0, addressstatus = NAND_VALID_ADDRESS; - NAND_AddressTypeDef nandaddress; - uint32_t addressoffset = 0; - - /* Process Locked */ - __HAL_LOCK(hnand); - - /* Check the NAND controller state */ - if(hnand->State == HAL_NAND_STATE_BUSY) - { - return HAL_BUSY; - } - - /* Identify the device address */ - if(hnand->Init.NandBank == FSMC_NAND_BANK2) - { - deviceaddress = NAND_DEVICE1; - } - else - { - deviceaddress = NAND_DEVICE2; - } - - /* Update the NAND controller state */ - hnand->State = HAL_NAND_STATE_BUSY; - - /* Save the content of pAddress as it will be modified */ - nandaddress.Block = pAddress->Block; - nandaddress.Page = pAddress->Page; - nandaddress.Zone = pAddress->Zone; - - /* Page(s) read loop */ - while((NumPageToRead != 0) && (addressstatus == NAND_VALID_ADDRESS)) - { - /* update the buffer size */ - size = hnand->Info.PageSize + ((hnand->Info.PageSize) * numpagesread); - - /* Get the address offset */ - addressoffset = ARRAY_ADDRESS(&nandaddress, hnand); - - /* Send read page command sequence */ - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_A; - - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00; - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(addressoffset); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(addressoffset); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(addressoffset); - - /* for 512 and 1 GB devices, 4th cycle is required */ - if(hnand->Info.BlockNbr >= 1024) - { - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_4TH_CYCLE(addressoffset); - } - - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_TRUE1; - - /* Get Data into Buffer */ - for(index = size; index != 0; index--) - { - *(uint8_t *)pBuffer++ = *(uint8_t *)deviceaddress; - } - - /* Increment read pages number */ - numpagesread++; - - /* Decrement pages to read */ - NumPageToRead--; - - /* Increment the NAND address */ - addressstatus = HAL_NAND_Address_Inc(hnand, &nandaddress); - } - - /* Update the NAND controller state */ - hnand->State = HAL_NAND_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hnand); - - return HAL_OK; - -} - -/** - * @brief Write Page(s) to NAND memory block - * @param hnand: pointer to a NAND_HandleTypeDef structure that contains - * the configuration information for NAND module. - * @param pAddress : pointer to NAND address structure - * @param pBuffer : pointer to source buffer to write - * @param NumPageToWrite : number of pages to write to block - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NAND_Write_Page(NAND_HandleTypeDef *hnand, NAND_AddressTypeDef *pAddress, uint8_t *pBuffer, uint32_t NumPageToWrite) -{ - __IO uint32_t index = 0; - uint32_t tickstart = 0; - uint32_t deviceaddress = 0 , size = 0, numpageswritten = 0, addressstatus = NAND_VALID_ADDRESS; - NAND_AddressTypeDef nandaddress; - uint32_t addressoffset = 0; - - /* Process Locked */ - __HAL_LOCK(hnand); - - /* Check the NAND controller state */ - if(hnand->State == HAL_NAND_STATE_BUSY) - { - return HAL_BUSY; - } - - /* Identify the device address */ - if(hnand->Init.NandBank == FSMC_NAND_BANK2) - { - deviceaddress = NAND_DEVICE1; - } - else - { - deviceaddress = NAND_DEVICE2; - } - - /* Update the NAND controller state */ - hnand->State = HAL_NAND_STATE_BUSY; - - /* Save the content of pAddress as it will be modified */ - nandaddress.Block = pAddress->Block; - nandaddress.Page = pAddress->Page; - nandaddress.Zone = pAddress->Zone; - - /* Page(s) write loop */ - while((NumPageToWrite != 0) && (addressstatus == NAND_VALID_ADDRESS)) - { - /* update the buffer size */ - size = hnand->Info.PageSize + ((hnand->Info.PageSize) * numpageswritten); - - /* Get the address offset */ - addressoffset = ARRAY_ADDRESS(&nandaddress, hnand); - - /* Send write page command sequence */ - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_A; - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_WRITE0; - - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00; - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(addressoffset); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(addressoffset); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(addressoffset); - - /* for 512 and 1 GB devices, 4th cycle is required */ - if(hnand->Info.BlockNbr >= 1024) - { - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_4TH_CYCLE(addressoffset); - } - - /* Write data to memory */ - for(index = size; index != 0; index--) - { - *(__IO uint8_t *)deviceaddress = *(uint8_t *)pBuffer++; - } - - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_WRITE_TRUE1; - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Read status until NAND is ready */ - while(HAL_NAND_Read_Status(hnand) != NAND_READY) - { - if((HAL_GetTick() - tickstart ) > NAND_WRITE_TIMEOUT) - { - return HAL_TIMEOUT; - } - } - - /* Increment written pages number */ - numpageswritten++; - - /* Decrement pages to write */ - NumPageToWrite--; - - /* Increment the NAND address */ - addressstatus = HAL_NAND_Address_Inc(hnand, &nandaddress); - } - - /* Update the NAND controller state */ - hnand->State = HAL_NAND_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hnand); - - return HAL_OK; -} - -/** - * @brief Read Spare area(s) from NAND memory - * @param hnand: pointer to a NAND_HandleTypeDef structure that contains - * the configuration information for NAND module. - * @param pAddress : pointer to NAND address structure - * @param pBuffer: pointer to source buffer to write - * @param NumSpareAreaToRead: Number of spare area to read - * @retval HAL status -*/ -HAL_StatusTypeDef HAL_NAND_Read_SpareArea(NAND_HandleTypeDef *hnand, NAND_AddressTypeDef *pAddress, uint8_t *pBuffer, uint32_t NumSpareAreaToRead) -{ - __IO uint32_t index = 0; - uint32_t deviceaddress = 0, size = 0, num_spare_area_read = 0, addressstatus = NAND_VALID_ADDRESS; - NAND_AddressTypeDef nandaddress; - uint32_t addressoffset = 0; - - /* Process Locked */ - __HAL_LOCK(hnand); - - /* Check the NAND controller state */ - if(hnand->State == HAL_NAND_STATE_BUSY) - { - return HAL_BUSY; - } - - /* Identify the device address */ - if(hnand->Init.NandBank == FSMC_NAND_BANK2) - { - deviceaddress = NAND_DEVICE1; - } - else - { - deviceaddress = NAND_DEVICE2; - } - - /* Update the NAND controller state */ - hnand->State = HAL_NAND_STATE_BUSY; - - /* Save the content of pAddress as it will be modified */ - nandaddress.Block = pAddress->Block; - nandaddress.Page = pAddress->Page; - nandaddress.Zone = pAddress->Zone; - - /* Spare area(s) read loop */ - while((NumSpareAreaToRead != 0) && (addressstatus == NAND_VALID_ADDRESS)) - { - /* update the buffer size */ - size = (hnand->Info.SpareAreaSize) + ((hnand->Info.SpareAreaSize) * num_spare_area_read); - - /* Get the address offset */ - addressoffset = ARRAY_ADDRESS(&nandaddress, hnand); - - /* Send read spare area command sequence */ - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_C; - - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00; - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(addressoffset); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(addressoffset); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(addressoffset); - - /* for 512 and 1 GB devices, 4th cycle is required */ - if(hnand->Info.BlockNbr >= 1024) - { - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_4TH_CYCLE(addressoffset); - } - - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_TRUE1; - - /* Get Data into Buffer */ - for (index = size ;index != 0; index--) - { - *(uint8_t *)pBuffer++ = *(uint8_t *)deviceaddress; - } - - /* Increment read spare areas number */ - num_spare_area_read++; - - /* Decrement spare areas to read */ - NumSpareAreaToRead--; - - /* Increment the NAND address */ - addressstatus = HAL_NAND_Address_Inc(hnand, &nandaddress); - } - - /* Update the NAND controller state */ - hnand->State = HAL_NAND_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hnand); - - return HAL_OK; -} - -/** - * @brief Write Spare area(s) to NAND memory - * @param hnand: pointer to a NAND_HandleTypeDef structure that contains - * the configuration information for NAND module. - * @param pAddress : pointer to NAND address structure - * @param pBuffer : pointer to source buffer to write - * @param NumSpareAreaTowrite : number of spare areas to write to block - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NAND_Write_SpareArea(NAND_HandleTypeDef *hnand, NAND_AddressTypeDef *pAddress, uint8_t *pBuffer, uint32_t NumSpareAreaTowrite) -{ - __IO uint32_t index = 0; - uint32_t tickstart = 0; - uint32_t deviceaddress = 0, size = 0, num_spare_area_written = 0, addressstatus = NAND_VALID_ADDRESS; - NAND_AddressTypeDef nandaddress; - uint32_t addressoffset = 0; - - /* Process Locked */ - __HAL_LOCK(hnand); - - /* Check the NAND controller state */ - if(hnand->State == HAL_NAND_STATE_BUSY) - { - return HAL_BUSY; - } - - /* Identify the device address */ - if(hnand->Init.NandBank == FSMC_NAND_BANK2) - { - deviceaddress = NAND_DEVICE1; - } - else - { - deviceaddress = NAND_DEVICE2; - } - - /* Update the FSMC_NAND controller state */ - hnand->State = HAL_NAND_STATE_BUSY; - - /* Save the content of pAddress as it will be modified */ - nandaddress.Block = pAddress->Block; - nandaddress.Page = pAddress->Page; - nandaddress.Zone = pAddress->Zone; - - /* Spare area(s) write loop */ - while((NumSpareAreaTowrite != 0) && (addressstatus == NAND_VALID_ADDRESS)) - { - /* update the buffer size */ - size = (hnand->Info.SpareAreaSize) + ((hnand->Info.SpareAreaSize) * num_spare_area_written); - - /* Get the address offset */ - addressoffset = ARRAY_ADDRESS(&nandaddress, hnand); - - /* Send write Spare area command sequence */ - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_AREA_C; - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_WRITE0; - - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00; - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(addressoffset); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(addressoffset); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(addressoffset); - - /* for 512 and 1 GB devices, 4th cycle is required */ - if(hnand->Info.BlockNbr >= 1024) - { - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_4TH_CYCLE(addressoffset); - } - - /* Write data to memory */ - for(; index < size; index++) - { - *(__IO uint8_t *)deviceaddress = *(uint8_t *)pBuffer++; - } - - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_WRITE_TRUE1; - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Read status until NAND is ready */ - while(HAL_NAND_Read_Status(hnand) != NAND_READY) - { - if((HAL_GetTick() - tickstart ) > NAND_WRITE_TIMEOUT) - { - return HAL_TIMEOUT; - } - } - - /* Increment written spare areas number */ - num_spare_area_written++; - - /* Decrement spare areas to write */ - NumSpareAreaTowrite--; - - /* Increment the NAND address */ - addressstatus = HAL_NAND_Address_Inc(hnand, &nandaddress); - } - - /* Update the NAND controller state */ - hnand->State = HAL_NAND_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hnand); - - return HAL_OK; -} - -/** - * @brief NAND memory Block erase - * @param hnand: pointer to a NAND_HandleTypeDef structure that contains - * the configuration information for NAND module. - * @param pAddress : pointer to NAND address structure - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NAND_Erase_Block(NAND_HandleTypeDef *hnand, NAND_AddressTypeDef *pAddress) -{ - uint32_t deviceaddress = 0; - uint32_t tickstart = 0; - - /* Process Locked */ - __HAL_LOCK(hnand); - - /* Check the NAND controller state */ - if(hnand->State == HAL_NAND_STATE_BUSY) - { - return HAL_BUSY; - } - - /* Identify the device address */ - if(hnand->Init.NandBank == FSMC_NAND_BANK2) - { - deviceaddress = NAND_DEVICE1; - } - else - { - deviceaddress = NAND_DEVICE2; - } - - /* Update the NAND controller state */ - hnand->State = HAL_NAND_STATE_BUSY; - - /* Send Erase block command sequence */ - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_ERASE0; - - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_1ST_CYCLE(ARRAY_ADDRESS(pAddress, hnand)); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_2ND_CYCLE(ARRAY_ADDRESS(pAddress, hnand)); - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_3RD_CYCLE(ARRAY_ADDRESS(pAddress, hnand)); - - /* for 512 and 1 GB devices, 4th cycle is required */ - if(hnand->Info.BlockNbr >= 1024) - { - *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = ADDR_4TH_CYCLE(ARRAY_ADDRESS(pAddress, hnand)); - } - - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_ERASE1; - - /* Update the NAND controller state */ - hnand->State = HAL_NAND_STATE_READY; - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Read status until NAND is ready */ - while(HAL_NAND_Read_Status(hnand) != NAND_READY) - { - if((HAL_GetTick() - tickstart ) > NAND_WRITE_TIMEOUT) - { - /* Process unlocked */ - __HAL_UNLOCK(hnand); - - return HAL_TIMEOUT; - } - } - - /* Process unlocked */ - __HAL_UNLOCK(hnand); - - return HAL_OK; -} - -/** - * @brief NAND memory read status - * @param hnand: pointer to a NAND_HandleTypeDef structure that contains - * the configuration information for NAND module. - * @retval NAND status - */ -uint32_t HAL_NAND_Read_Status(NAND_HandleTypeDef *hnand) -{ - uint32_t data = 0; - uint32_t deviceaddress = 0; - - /* Identify the device address */ - if(hnand->Init.NandBank == FSMC_NAND_BANK2) - { - deviceaddress = NAND_DEVICE1; - } - else - { - deviceaddress = NAND_DEVICE2; - } - - /* Send Read status operation command */ - *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA)) = NAND_CMD_STATUS; - - /* Read status register data */ - data = *(__IO uint8_t *)deviceaddress; - - /* Return the status */ - if((data & NAND_ERROR) == NAND_ERROR) - { - return NAND_ERROR; - } - else if((data & NAND_READY) == NAND_READY) - { - return NAND_READY; - } - - return NAND_BUSY; -} - -/** - * @brief Increment the NAND memory address - * @param hnand: pointer to a NAND_HandleTypeDef structure that contains - * the configuration information for NAND module. - * @param pAddress: pointer to NAND address structure - * @retval The new status of the increment address operation. It can be: - * - NAND_VALID_ADDRESS: When the new address is valid address - * - NAND_INVALID_ADDRESS: When the new address is invalid address - */ -uint32_t HAL_NAND_Address_Inc(NAND_HandleTypeDef *hnand, NAND_AddressTypeDef *pAddress) -{ - uint32_t status = NAND_VALID_ADDRESS; - - /* Increment page address */ - pAddress->Page++; - - /* Check NAND address is valid */ - if(pAddress->Page == hnand->Info.BlockSize) - { - pAddress->Page = 0; - pAddress->Block++; - - if(pAddress->Block == hnand->Info.ZoneSize) - { - pAddress->Block = 0; - pAddress->Zone++; - - if(pAddress->Zone == (hnand->Info.ZoneSize/ hnand->Info.BlockNbr)) - { - status = NAND_INVALID_ADDRESS; - } - } - } - - return (status); -} -/** - * @} - */ - -/** @defgroup NAND_Exported_Functions_Group3 Peripheral Control functions - * @brief management functions - * -@verbatim - ============================================================================== - ##### NAND Control functions ##### - ============================================================================== - [..] - This subsection provides a set of functions allowing to control dynamically - the NAND interface. - -@endverbatim - * @{ - */ - - -/** - * @brief Enables dynamically NAND ECC feature. - * @param hnand: pointer to a NAND_HandleTypeDef structure that contains - * the configuration information for NAND module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NAND_ECC_Enable(NAND_HandleTypeDef *hnand) -{ - /* Check the NAND controller state */ - if(hnand->State == HAL_NAND_STATE_BUSY) - { - return HAL_BUSY; - } - - /* Update the NAND state */ - hnand->State = HAL_NAND_STATE_BUSY; - - /* Enable ECC feature */ - FSMC_NAND_ECC_Enable(hnand->Instance, hnand->Init.NandBank); - - /* Update the NAND state */ - hnand->State = HAL_NAND_STATE_READY; - - return HAL_OK; -} - -/** - * @brief Disables dynamically FSMC_NAND ECC feature. - * @param hnand: pointer to a NAND_HandleTypeDef structure that contains - * the configuration information for NAND module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NAND_ECC_Disable(NAND_HandleTypeDef *hnand) -{ - /* Check the NAND controller state */ - if(hnand->State == HAL_NAND_STATE_BUSY) - { - return HAL_BUSY; - } - - /* Update the NAND state */ - hnand->State = HAL_NAND_STATE_BUSY; - - /* Disable ECC feature */ - FSMC_NAND_ECC_Disable(hnand->Instance, hnand->Init.NandBank); - - /* Update the NAND state */ - hnand->State = HAL_NAND_STATE_READY; - - return HAL_OK; -} - -/** - * @brief Disables dynamically NAND ECC feature. - * @param hnand: pointer to a NAND_HandleTypeDef structure that contains - * the configuration information for NAND module. - * @param ECCval: pointer to ECC value - * @param Timeout: maximum timeout to wait - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NAND_GetECC(NAND_HandleTypeDef *hnand, uint32_t *ECCval, uint32_t Timeout) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Check the NAND controller state */ - if(hnand->State == HAL_NAND_STATE_BUSY) - { - return HAL_BUSY; - } - - /* Update the NAND state */ - hnand->State = HAL_NAND_STATE_BUSY; - - /* Get NAND ECC value */ - status = FSMC_NAND_GetECC(hnand->Instance, ECCval, hnand->Init.NandBank, Timeout); - - /* Update the NAND state */ - hnand->State = HAL_NAND_STATE_READY; - - return status; -} - -/** - * @} - */ - - -/** @defgroup NAND_Exported_Functions_Group4 Peripheral State functions - * @brief Peripheral State functions - * -@verbatim - ============================================================================== - ##### NAND State functions ##### - ============================================================================== - [..] - This subsection permits to get in run-time the status of the NAND controller - and the data flow. - -@endverbatim - * @{ - */ - -/** - * @brief return the NAND state - * @param hnand: pointer to a NAND_HandleTypeDef structure that contains - * the configuration information for NAND module. - * @retval HAL state - */ -HAL_NAND_StateTypeDef HAL_NAND_GetState(NAND_HandleTypeDef *hnand) -{ - return hnand->State; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#endif /* HAL_NAND_MODULE_ENABLED */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_nor.c b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_nor.c deleted file mode 100755 index 0eb21a28..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_nor.c +++ /dev/null @@ -1,1003 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_hal_nor.c - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief NOR HAL module driver. - * This file provides a generic firmware to drive NOR memories mounted - * as external device. - * - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - This driver is a generic layered driver which contains a set of APIs used to - control NOR flash memories. It uses the FSMC layer functions to interface - with NOR devices. This driver is used as follows: - - (+) NOR flash memory configuration sequence using the function HAL_NOR_Init() - with control and timing parameters for both normal and extended mode. - - (+) Read NOR flash memory manufacturer code and device IDs using the function - HAL_NOR_Read_ID(). The read information is stored in the NOR_ID_TypeDef - structure declared by the function caller. - - (+) Access NOR flash memory by read/write data unit operations using the functions - HAL_NOR_Read(), HAL_NOR_Program(). - - (+) Perform NOR flash erase block/chip operations using the functions - HAL_NOR_Erase_Block() and HAL_NOR_Erase_Chip(). - - (+) Read the NOR flash CFI (common flash interface) IDs using the function - HAL_NOR_Read_CFI(). The read information is stored in the NOR_CFI_TypeDef - structure declared by the function caller. - - (+) You can also control the NOR device by calling the control APIs HAL_NOR_WriteOperation_Enable()/ - HAL_NOR_WriteOperation_Disable() to respectively enable/disable the NOR write operation - - (+) You can monitor the NOR device HAL state by calling the function - HAL_NOR_GetState() - [..] - (@) This driver is a set of generic APIs which handle standard NOR flash operations. - If a NOR flash device contains different operations and/or implementations, - it should be implemented separately. - - *** NOR HAL driver macros list *** - ============================================= - [..] - Below the list of most used macros in NOR HAL driver. - - (+) NOR_WRITE : NOR memory write data to specified address - - @endverbatim - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal.h" - -/** @addtogroup STM32F2xx_HAL_Driver - * @{ - */ - -/** @defgroup NOR NOR - * @brief NOR driver modules - * @{ - */ -#ifdef HAL_NOR_MODULE_ENABLED -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ - -/** @defgroup NOR_Private_Defines NOR Private Defines - * @{ - */ - -/* Constants to define address to set to write a command */ -#define NOR_CMD_ADDRESS_FIRST (uint16_t)0x0555 -#define NOR_CMD_ADDRESS_FIRST_CFI (uint16_t)0x0055 -#define NOR_CMD_ADDRESS_SECOND (uint16_t)0x02AA -#define NOR_CMD_ADDRESS_THIRD (uint16_t)0x0555 -#define NOR_CMD_ADDRESS_FOURTH (uint16_t)0x0555 -#define NOR_CMD_ADDRESS_FIFTH (uint16_t)0x02AA -#define NOR_CMD_ADDRESS_SIXTH (uint16_t)0x0555 - -/* Constants to define data to program a command */ -#define NOR_CMD_DATA_READ_RESET (uint16_t)0x00F0 -#define NOR_CMD_DATA_FIRST (uint16_t)0x00AA -#define NOR_CMD_DATA_SECOND (uint16_t)0x0055 -#define NOR_CMD_DATA_AUTO_SELECT (uint16_t)0x0090 -#define NOR_CMD_DATA_PROGRAM (uint16_t)0x00A0 -#define NOR_CMD_DATA_CHIP_BLOCK_ERASE_THIRD (uint16_t)0x0080 -#define NOR_CMD_DATA_CHIP_BLOCK_ERASE_FOURTH (uint16_t)0x00AA -#define NOR_CMD_DATA_CHIP_BLOCK_ERASE_FIFTH (uint16_t)0x0055 -#define NOR_CMD_DATA_CHIP_ERASE (uint16_t)0x0010 -#define NOR_CMD_DATA_CFI (uint16_t)0x0098 - -#define NOR_CMD_DATA_BUFFER_AND_PROG (uint8_t)0x25 -#define NOR_CMD_DATA_BUFFER_AND_PROG_CONFIRM (uint8_t)0x29 -#define NOR_CMD_DATA_BLOCK_ERASE (uint8_t)0x30 - -/* Mask on NOR STATUS REGISTER */ -#define NOR_MASK_STATUS_DQ5 (uint16_t)0x0020 -#define NOR_MASK_STATUS_DQ6 (uint16_t)0x0040 - -/** - * @} - */ - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ -/** @defgroup NOR_Exported_Functions NOR Exported Functions - * @{ - */ - -/** @defgroup NOR_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * - @verbatim - ============================================================================== - ##### NOR Initialization and de_initialization functions ##### - ============================================================================== - [..] - This section provides functions allowing to initialize/de-initialize - the NOR memory - -@endverbatim - * @{ - */ - -/** - * @brief Perform the NOR memory Initialization sequence - * @param hnor: pointer to the NOR handle - * @param Timing: pointer to NOR control timing structure - * @param ExtTiming: pointer to NOR extended mode timing structure - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NOR_Init(NOR_HandleTypeDef *hnor, FSMC_NORSRAM_TimingTypeDef *Timing, FSMC_NORSRAM_TimingTypeDef *ExtTiming) -{ - /* Check the NOR handle parameter */ - if(hnor == NULL) - { - return HAL_ERROR; - } - - if(hnor->State == HAL_NOR_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - hnor->Lock = HAL_UNLOCKED; - /* Initialize the low level hardware (MSP) */ - HAL_NOR_MspInit(hnor); - } - - /* Initialize NOR control Interface */ - FSMC_NORSRAM_Init(hnor->Instance, &(hnor->Init)); - - /* Initialize NOR timing Interface */ - FSMC_NORSRAM_Timing_Init(hnor->Instance, Timing, hnor->Init.NSBank); - - /* Initialize NOR extended mode timing Interface */ - FSMC_NORSRAM_Extended_Timing_Init(hnor->Extended, ExtTiming, hnor->Init.NSBank, hnor->Init.ExtendedMode); - - /* Enable the NORSRAM device */ - __FSMC_NORSRAM_ENABLE(hnor->Instance, hnor->Init.NSBank); - - /* Check the NOR controller state */ - hnor->State = HAL_NOR_STATE_READY; - - return HAL_OK; -} - -/** - * @brief Perform NOR memory De-Initialization sequence - * @param hnor: pointer to a NOR_HandleTypeDef structure that contains - * the configuration information for NOR module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NOR_DeInit(NOR_HandleTypeDef *hnor) -{ - /* De-Initialize the low level hardware (MSP) */ - HAL_NOR_MspDeInit(hnor); - - /* Configure the NOR registers with their reset values */ - FSMC_NORSRAM_DeInit(hnor->Instance, hnor->Extended, hnor->Init.NSBank); - - /* Update the NOR controller state */ - hnor->State = HAL_NOR_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(hnor); - - return HAL_OK; -} - -/** - * @brief NOR MSP Init - * @param hnor: pointer to a NOR_HandleTypeDef structure that contains - * the configuration information for NOR module. - * @retval None - */ -__weak void HAL_NOR_MspInit(NOR_HandleTypeDef *hnor) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_NOR_MspInit could be implemented in the user file - */ -} - -/** - * @brief NOR MSP DeInit - * @param hnor: pointer to a NOR_HandleTypeDef structure that contains - * the configuration information for NOR module. - * @retval None - */ -__weak void HAL_NOR_MspDeInit(NOR_HandleTypeDef *hnor) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_NOR_MspDeInit could be implemented in the user file - */ -} - -/** - * @brief NOR BSP Wait for Ready/Busy signal - * @param hnor: pointer to a NOR_HandleTypeDef structure that contains - * the configuration information for NOR module. - * @param Timeout: Maximum timeout value - * @retval None - */ -__weak void HAL_NOR_MspWait(NOR_HandleTypeDef *hnor, uint32_t Timeout) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_NOR_BspWait could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup NOR_Exported_Functions_Group2 Input and Output functions - * @brief Input Output and memory control functions - * - @verbatim - ============================================================================== - ##### NOR Input and Output functions ##### - ============================================================================== - [..] - This section provides functions allowing to use and control the NOR memory - -@endverbatim - * @{ - */ - -/** - * @brief Read NOR flash IDs - * @param hnor: pointer to the NOR handle - * @param pNOR_ID : pointer to NOR ID structure - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NOR_Read_ID(NOR_HandleTypeDef *hnor, NOR_IDTypeDef *pNOR_ID) -{ - uint32_t deviceaddress = 0; - - /* Process Locked */ - __HAL_LOCK(hnor); - - /* Check the NOR controller state */ - if(hnor->State == HAL_NOR_STATE_BUSY) - { - return HAL_BUSY; - } - - /* Select the NOR device address */ - if (hnor->Init.NSBank == FSMC_NORSRAM_BANK1) - { - deviceaddress = NOR_MEMORY_ADRESS1; - } - else if (hnor->Init.NSBank == FSMC_NORSRAM_BANK2) - { - deviceaddress = NOR_MEMORY_ADRESS2; - } - else if (hnor->Init.NSBank == FSMC_NORSRAM_BANK3) - { - deviceaddress = NOR_MEMORY_ADRESS3; - } - else /* FSMC_NORSRAM_BANK4 */ - { - deviceaddress = NOR_MEMORY_ADRESS4; - } - - /* Update the NOR controller state */ - hnor->State = HAL_NOR_STATE_BUSY; - - /* Send read ID command */ - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_FIRST), NOR_CMD_DATA_FIRST); - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_SECOND), NOR_CMD_DATA_SECOND); - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_THIRD), NOR_CMD_DATA_AUTO_SELECT); - - /* Read the NOR IDs */ - pNOR_ID->Manufacturer_Code = *(__IO uint16_t *) NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, MC_ADDRESS); - pNOR_ID->Device_Code1 = *(__IO uint16_t *) NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, DEVICE_CODE1_ADDR); - pNOR_ID->Device_Code2 = *(__IO uint16_t *) NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, DEVICE_CODE2_ADDR); - pNOR_ID->Device_Code3 = *(__IO uint16_t *) NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, DEVICE_CODE3_ADDR); - - /* Check the NOR controller state */ - hnor->State = HAL_NOR_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hnor); - - return HAL_OK; -} - -/** - * @brief Returns the NOR memory to Read mode. - * @param hnor: pointer to the NOR handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NOR_ReturnToReadMode(NOR_HandleTypeDef *hnor) -{ - uint32_t deviceaddress = 0; - - /* Process Locked */ - __HAL_LOCK(hnor); - - /* Check the NOR controller state */ - if(hnor->State == HAL_NOR_STATE_BUSY) - { - return HAL_BUSY; - } - - /* Select the NOR device address */ - if (hnor->Init.NSBank == FSMC_NORSRAM_BANK1) - { - deviceaddress = NOR_MEMORY_ADRESS1; - } - else if (hnor->Init.NSBank == FSMC_NORSRAM_BANK2) - { - deviceaddress = NOR_MEMORY_ADRESS2; - } - else if (hnor->Init.NSBank == FSMC_NORSRAM_BANK3) - { - deviceaddress = NOR_MEMORY_ADRESS3; - } - else /* FSMC_NORSRAM_BANK4 */ - { - deviceaddress = NOR_MEMORY_ADRESS4; - } - - NOR_WRITE(deviceaddress, NOR_CMD_DATA_READ_RESET); - - /* Check the NOR controller state */ - hnor->State = HAL_NOR_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hnor); - - return HAL_OK; -} - -/** - * @brief Read data from NOR memory - * @param hnor: pointer to the NOR handle - * @param pAddress: pointer to Device address - * @param pData : pointer to read data - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NOR_Read(NOR_HandleTypeDef *hnor, uint32_t *pAddress, uint16_t *pData) -{ - uint32_t deviceaddress = 0; - - /* Process Locked */ - __HAL_LOCK(hnor); - - /* Check the NOR controller state */ - if(hnor->State == HAL_NOR_STATE_BUSY) - { - return HAL_BUSY; - } - - /* Select the NOR device address */ - if (hnor->Init.NSBank == FSMC_NORSRAM_BANK1) - { - deviceaddress = NOR_MEMORY_ADRESS1; - } - else if (hnor->Init.NSBank == FSMC_NORSRAM_BANK2) - { - deviceaddress = NOR_MEMORY_ADRESS2; - } - else if (hnor->Init.NSBank == FSMC_NORSRAM_BANK3) - { - deviceaddress = NOR_MEMORY_ADRESS3; - } - else /* FSMC_NORSRAM_BANK4 */ - { - deviceaddress = NOR_MEMORY_ADRESS4; - } - - /* Update the NOR controller state */ - hnor->State = HAL_NOR_STATE_BUSY; - - /* Send read data command */ - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_FIRST), NOR_CMD_DATA_FIRST); - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_SECOND), NOR_CMD_DATA_SECOND); - NOR_WRITE((uint32_t)pAddress, NOR_CMD_DATA_READ_RESET); - - /* Read the data */ - *pData = *(__IO uint32_t *)(uint32_t)pAddress; - - /* Check the NOR controller state */ - hnor->State = HAL_NOR_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hnor); - - return HAL_OK; -} - -/** - * @brief Program data to NOR memory - * @param hnor: pointer to the NOR handle - * @param pAddress: Device address - * @param pData : pointer to the data to write - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NOR_Program(NOR_HandleTypeDef *hnor, uint32_t *pAddress, uint16_t *pData) -{ - uint32_t deviceaddress = 0; - - /* Process Locked */ - __HAL_LOCK(hnor); - - /* Check the NOR controller state */ - if(hnor->State == HAL_NOR_STATE_BUSY) - { - return HAL_BUSY; - } - - /* Select the NOR device address */ - if (hnor->Init.NSBank == FSMC_NORSRAM_BANK1) - { - deviceaddress = NOR_MEMORY_ADRESS1; - } - else if (hnor->Init.NSBank == FSMC_NORSRAM_BANK2) - { - deviceaddress = NOR_MEMORY_ADRESS2; - } - else if (hnor->Init.NSBank == FSMC_NORSRAM_BANK3) - { - deviceaddress = NOR_MEMORY_ADRESS3; - } - else /* FSMC_NORSRAM_BANK4 */ - { - deviceaddress = NOR_MEMORY_ADRESS4; - } - - /* Update the NOR controller state */ - hnor->State = HAL_NOR_STATE_BUSY; - - /* Send program data command */ - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_FIRST), NOR_CMD_DATA_FIRST); - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_SECOND), NOR_CMD_DATA_SECOND); - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_THIRD), NOR_CMD_DATA_PROGRAM); - - /* Write the data */ - NOR_WRITE(pAddress, *pData); - - /* Check the NOR controller state */ - hnor->State = HAL_NOR_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hnor); - - return HAL_OK; -} - -/** - * @brief Reads a half-word buffer from the NOR memory. - * @param hnor: pointer to the NOR handle - * @param uwAddress: NOR memory internal address to read from. - * @param pData: pointer to the buffer that receives the data read from the - * NOR memory. - * @param uwBufferSize : number of Half word to read. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NOR_ReadBuffer(NOR_HandleTypeDef *hnor, uint32_t uwAddress, uint16_t *pData, uint32_t uwBufferSize) -{ - uint32_t deviceaddress = 0; - - /* Process Locked */ - __HAL_LOCK(hnor); - - /* Check the NOR controller state */ - if(hnor->State == HAL_NOR_STATE_BUSY) - { - return HAL_BUSY; - } - - /* Select the NOR device address */ - if (hnor->Init.NSBank == FSMC_NORSRAM_BANK1) - { - deviceaddress = NOR_MEMORY_ADRESS1; - } - else if (hnor->Init.NSBank == FSMC_NORSRAM_BANK2) - { - deviceaddress = NOR_MEMORY_ADRESS2; - } - else if (hnor->Init.NSBank == FSMC_NORSRAM_BANK3) - { - deviceaddress = NOR_MEMORY_ADRESS3; - } - else /* FSMC_NORSRAM_BANK4 */ - { - deviceaddress = NOR_MEMORY_ADRESS4; - } - - /* Update the NOR controller state */ - hnor->State = HAL_NOR_STATE_BUSY; - - /* Send read data command */ - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_FIRST), NOR_CMD_DATA_FIRST); - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_SECOND), NOR_CMD_DATA_SECOND); - NOR_WRITE(uwAddress, 0x00F0); - - /* Read buffer */ - while( uwBufferSize > 0) - { - *pData++ = *(__IO uint16_t *)uwAddress; - uwAddress += 2; - uwBufferSize--; - } - - /* Check the NOR controller state */ - hnor->State = HAL_NOR_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hnor); - - return HAL_OK; -} - -/** - * @brief Writes a half-word buffer to the NOR memory. This function must be used - only with S29GL128P NOR memory. - * @param hnor: pointer to the NOR handle - * @param uwAddress: NOR memory internal start write address - * @param pData: pointer to source data buffer. - * @param uwBufferSize: Size of the buffer to write - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NOR_ProgramBuffer(NOR_HandleTypeDef *hnor, uint32_t uwAddress, uint16_t *pData, uint32_t uwBufferSize) -{ - uint16_t * p_currentaddress = (uint16_t *)NULL; - uint16_t * p_endaddress = (uint16_t *)NULL; - uint32_t lastloadedaddress = 0, deviceaddress = 0; - - /* Process Locked */ - __HAL_LOCK(hnor); - - /* Check the NOR controller state */ - if(hnor->State == HAL_NOR_STATE_BUSY) - { - return HAL_BUSY; - } - - /* Select the NOR device address */ - if (hnor->Init.NSBank == FSMC_NORSRAM_BANK1) - { - deviceaddress = NOR_MEMORY_ADRESS1; - } - else if (hnor->Init.NSBank == FSMC_NORSRAM_BANK2) - { - deviceaddress = NOR_MEMORY_ADRESS2; - } - else if (hnor->Init.NSBank == FSMC_NORSRAM_BANK3) - { - deviceaddress = NOR_MEMORY_ADRESS3; - } - else /* FSMC_NORSRAM_BANK4 */ - { - deviceaddress = NOR_MEMORY_ADRESS4; - } - - /* Update the NOR controller state */ - hnor->State = HAL_NOR_STATE_BUSY; - - /* Initialize variables */ - p_currentaddress = (uint16_t*)((uint32_t)(uwAddress)); - p_endaddress = p_currentaddress + (uwBufferSize-1); - lastloadedaddress = (uint32_t)(uwAddress); - - /* Issue unlock command sequence */ - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_FIRST), NOR_CMD_DATA_FIRST); - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_SECOND), NOR_CMD_DATA_SECOND); - - /* Write Buffer Load Command */ - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, uwAddress), NOR_CMD_DATA_BUFFER_AND_PROG); - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, uwAddress), (uwBufferSize - 1)); - - /* Load Data into NOR Buffer */ - while(p_currentaddress <= p_endaddress) - { - /* Store last loaded address & data value (for polling) */ - lastloadedaddress = (uint32_t)p_currentaddress; - - NOR_WRITE(p_currentaddress, *pData++); - - p_currentaddress ++; - } - - NOR_WRITE((uint32_t)(lastloadedaddress), NOR_CMD_DATA_BUFFER_AND_PROG_CONFIRM); - - /* Check the NOR controller state */ - hnor->State = HAL_NOR_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hnor); - - return HAL_OK; - -} - -/** - * @brief Erase the specified block of the NOR memory - * @param hnor: pointer to the NOR handle - * @param BlockAddress : Block to erase address - * @param Address: Device address - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NOR_Erase_Block(NOR_HandleTypeDef *hnor, uint32_t BlockAddress, uint32_t Address) -{ - uint32_t deviceaddress = 0; - - /* Process Locked */ - __HAL_LOCK(hnor); - - /* Check the NOR controller state */ - if(hnor->State == HAL_NOR_STATE_BUSY) - { - return HAL_BUSY; - } - - /* Select the NOR device address */ - if (hnor->Init.NSBank == FSMC_NORSRAM_BANK1) - { - deviceaddress = NOR_MEMORY_ADRESS1; - } - else if (hnor->Init.NSBank == FSMC_NORSRAM_BANK2) - { - deviceaddress = NOR_MEMORY_ADRESS2; - } - else if (hnor->Init.NSBank == FSMC_NORSRAM_BANK3) - { - deviceaddress = NOR_MEMORY_ADRESS3; - } - else /* FSMC_NORSRAM_BANK4 */ - { - deviceaddress = NOR_MEMORY_ADRESS4; - } - - /* Update the NOR controller state */ - hnor->State = HAL_NOR_STATE_BUSY; - - /* Send block erase command sequence */ - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_FIRST), NOR_CMD_DATA_FIRST); - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_SECOND), NOR_CMD_DATA_SECOND); - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_THIRD), NOR_CMD_DATA_CHIP_BLOCK_ERASE_THIRD); - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_FOURTH), NOR_CMD_DATA_CHIP_BLOCK_ERASE_FOURTH); - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_FIFTH), NOR_CMD_DATA_CHIP_BLOCK_ERASE_FIFTH); - NOR_WRITE((uint32_t)(BlockAddress + Address), NOR_CMD_DATA_BLOCK_ERASE); - - /* Check the NOR memory status and update the controller state */ - hnor->State = HAL_NOR_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hnor); - - return HAL_OK; - -} - -/** - * @brief Erase the entire NOR chip. - * @param hnor: pointer to the NOR handle - * @param Address : Device address - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NOR_Erase_Chip(NOR_HandleTypeDef *hnor, uint32_t Address) -{ - uint32_t deviceaddress = 0; - - /* Process Locked */ - __HAL_LOCK(hnor); - - /* Check the NOR controller state */ - if(hnor->State == HAL_NOR_STATE_BUSY) - { - return HAL_BUSY; - } - - /* Select the NOR device address */ - if (hnor->Init.NSBank == FSMC_NORSRAM_BANK1) - { - deviceaddress = NOR_MEMORY_ADRESS1; - } - else if (hnor->Init.NSBank == FSMC_NORSRAM_BANK2) - { - deviceaddress = NOR_MEMORY_ADRESS2; - } - else if (hnor->Init.NSBank == FSMC_NORSRAM_BANK3) - { - deviceaddress = NOR_MEMORY_ADRESS3; - } - else /* FSMC_NORSRAM_BANK4 */ - { - deviceaddress = NOR_MEMORY_ADRESS4; - } - - /* Update the NOR controller state */ - hnor->State = HAL_NOR_STATE_BUSY; - - /* Send NOR chip erase command sequence */ - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_FIRST), NOR_CMD_DATA_FIRST); - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_SECOND), NOR_CMD_DATA_SECOND); - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_THIRD), NOR_CMD_DATA_CHIP_BLOCK_ERASE_THIRD); - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_FOURTH), NOR_CMD_DATA_CHIP_BLOCK_ERASE_FOURTH); - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_FIFTH), NOR_CMD_DATA_CHIP_BLOCK_ERASE_FIFTH); - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_SIXTH), NOR_CMD_DATA_CHIP_ERASE); - - /* Check the NOR memory status and update the controller state */ - hnor->State = HAL_NOR_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hnor); - - return HAL_OK; -} - -/** - * @brief Read NOR flash CFI IDs - * @param hnor: pointer to the NOR handle - * @param pNOR_CFI : pointer to NOR CFI IDs structure - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NOR_Read_CFI(NOR_HandleTypeDef *hnor, NOR_CFITypeDef *pNOR_CFI) -{ - uint32_t deviceaddress = 0; - - /* Process Locked */ - __HAL_LOCK(hnor); - - /* Check the NOR controller state */ - if(hnor->State == HAL_NOR_STATE_BUSY) - { - return HAL_BUSY; - } - - /* Select the NOR device address */ - if (hnor->Init.NSBank == FSMC_NORSRAM_BANK1) - { - deviceaddress = NOR_MEMORY_ADRESS1; - } - else if (hnor->Init.NSBank == FSMC_NORSRAM_BANK2) - { - deviceaddress = NOR_MEMORY_ADRESS2; - } - else if (hnor->Init.NSBank == FSMC_NORSRAM_BANK3) - { - deviceaddress = NOR_MEMORY_ADRESS3; - } - else /* FSMC_NORSRAM_BANK4 */ - { - deviceaddress = NOR_MEMORY_ADRESS4; - } - - /* Update the NOR controller state */ - hnor->State = HAL_NOR_STATE_BUSY; - - /* Send read CFI query command */ - NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_FIRST_CFI), NOR_CMD_DATA_CFI); - - /* read the NOR CFI information */ - pNOR_CFI->CFI_1 = *(__IO uint16_t *) NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, CFI1_ADDRESS); - pNOR_CFI->CFI_2 = *(__IO uint16_t *) NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, CFI2_ADDRESS); - pNOR_CFI->CFI_3 = *(__IO uint16_t *) NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, CFI3_ADDRESS); - pNOR_CFI->CFI_4 = *(__IO uint16_t *) NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, CFI4_ADDRESS); - - /* Check the NOR controller state */ - hnor->State = HAL_NOR_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hnor); - - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup NOR_Exported_Functions_Group3 Control functions - * @brief management functions - * -@verbatim - ============================================================================== - ##### NOR Control functions ##### - ============================================================================== - [..] - This subsection provides a set of functions allowing to control dynamically - the NOR interface. - -@endverbatim - * @{ - */ - -/** - * @brief Enables dynamically NOR write operation. - * @param hnor: pointer to the NOR handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NOR_WriteOperation_Enable(NOR_HandleTypeDef *hnor) -{ - /* Process Locked */ - __HAL_LOCK(hnor); - - /* Enable write operation */ - FSMC_NORSRAM_WriteOperation_Enable(hnor->Instance, hnor->Init.NSBank); - - /* Update the NOR controller state */ - hnor->State = HAL_NOR_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hnor); - - return HAL_OK; -} - -/** - * @brief Disables dynamically NOR write operation. - * @param hnor: pointer to the NOR handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_NOR_WriteOperation_Disable(NOR_HandleTypeDef *hnor) -{ - /* Process Locked */ - __HAL_LOCK(hnor); - - /* Update the SRAM controller state */ - hnor->State = HAL_NOR_STATE_BUSY; - - /* Disable write operation */ - FSMC_NORSRAM_WriteOperation_Disable(hnor->Instance, hnor->Init.NSBank); - - /* Update the NOR controller state */ - hnor->State = HAL_NOR_STATE_PROTECTED; - - /* Process unlocked */ - __HAL_UNLOCK(hnor); - - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup NOR_Exported_Functions_Group4 State functions - * @brief Peripheral State functions - * -@verbatim - ============================================================================== - ##### NOR State functions ##### - ============================================================================== - [..] - This subsection permits to get in run-time the status of the NOR controller - and the data flow. - -@endverbatim - * @{ - */ - -/** - * @brief return the NOR controller state - * @param hnor: pointer to the NOR handle - * @retval NOR controller state - */ -HAL_NOR_StateTypeDef HAL_NOR_GetState(NOR_HandleTypeDef *hnor) -{ - return hnor->State; -} - -/** - * @brief Returns the NOR operation status. - * @param hnor: pointer to the NOR handle - * @param Address: Device address - * @param Timeout: NOR programming Timeout - * @retval NOR_Status: The returned value can be: HAL_NOR_STATUS_SUCCESS, HAL_NOR_STATUS_ERROR - * or HAL_NOR_STATUS_TIMEOUT - */ -HAL_NOR_StatusTypeDef HAL_NOR_GetStatus(NOR_HandleTypeDef *hnor, uint32_t Address, uint32_t Timeout) -{ - HAL_NOR_StatusTypeDef status = HAL_NOR_STATUS_ONGOING; - uint16_t tmpSR1 = 0, tmpSR2 = 0; - uint32_t tickstart = 0; - - /* Poll on NOR memory Ready/Busy signal ------------------------------------*/ - HAL_NOR_MspWait(hnor, Timeout); - - /* Get the NOR memory operation status -------------------------------------*/ - - /* Get tick */ - tickstart = HAL_GetTick(); - while((status != HAL_NOR_STATUS_SUCCESS ) && (status != HAL_NOR_STATUS_TIMEOUT)) - { - /* Check for the Timeout */ - if(Timeout != HAL_MAX_DELAY) - { - if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout)) - { - status = HAL_NOR_STATUS_TIMEOUT; - } - } - - /* Read NOR status register (DQ6 and DQ5) */ - tmpSR1 = *(__IO uint16_t *)Address; - tmpSR2 = *(__IO uint16_t *)Address; - - /* If DQ6 did not toggle between the two reads then return HAL_NOR_STATUS_SUCCESS */ - if((tmpSR1 & NOR_MASK_STATUS_DQ6) == (tmpSR2 & NOR_MASK_STATUS_DQ6)) - { - return HAL_NOR_STATUS_SUCCESS ; - } - - if((tmpSR1 & NOR_MASK_STATUS_DQ5) == NOR_MASK_STATUS_DQ5) - { - status = HAL_NOR_STATUS_ONGOING; - } - - tmpSR1 = *(__IO uint16_t *)Address; - tmpSR2 = *(__IO uint16_t *)Address; - - /* If DQ6 did not toggle between the two reads then return HAL_NOR_STATUS_SUCCESS */ - if((tmpSR1 & NOR_MASK_STATUS_DQ6) == (tmpSR2 & NOR_MASK_STATUS_DQ6)) - { - return HAL_NOR_STATUS_SUCCESS; - } - if((tmpSR1 & NOR_MASK_STATUS_DQ5) == NOR_MASK_STATUS_DQ5) - { - return HAL_NOR_STATUS_ERROR; - } - } - - /* Return the operation status */ - return status; -} - -/** - * @} - */ - - -/** - * @} - */ - -#endif /* HAL_NOR_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_pcd.c b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_pcd.c deleted file mode 100755 index 69f309d6..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_pcd.c +++ /dev/null @@ -1,1172 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_hal_pcd.c - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief PCD HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the USB Peripheral Controller: - * + Initialization and de-initialization functions - * + IO operation functions - * + Peripheral Control functions - * + Peripheral State functions - * - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - The PCD HAL driver can be used as follows: - - (#) Declare a PCD_HandleTypeDef handle structure, for example: - PCD_HandleTypeDef hpcd; - - (#) Fill parameters of Init structure in HCD handle - - (#) Call HAL_PCD_Init() API to initialize the PCD peripheral (Core, Device core, ...) - - (#) Initialize the PCD low level resources through the HAL_PCD_MspInit() API: - (##) Enable the PCD/USB Low Level interface clock using - (+++) __HAL_RCC_USB_OTG_FS_CLK_ENABLE(); - (+++) __HAL_RCC_USB_OTG_HS_CLK_ENABLE(); (For High Speed Mode) - - (##) Initialize the related GPIO clocks - (##) Configure PCD pin-out - (##) Configure PCD NVIC interrupt - - (#)Associate the Upper USB device stack to the HAL PCD Driver: - (##) hpcd.pData = pdev; - - (#)Enable PCD transmission and reception: - (##) HAL_PCD_Start(); - - @endverbatim - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal.h" - -/** @addtogroup STM32F2xx_HAL_Driver - * @{ - */ - -/** @defgroup PCD PCD - * @brief PCD HAL module driver - * @{ - */ - -#ifdef HAL_PCD_MODULE_ENABLED - -/* Private types -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/* Private macros ------------------------------------------------------------*/ -/** @defgroup PCD_Private_Macros PCD Private Macros - * @{ - */ -#define PCD_MIN(a, b) (((a) < (b)) ? (a) : (b)) -#define PCD_MAX(a, b) (((a) > (b)) ? (a) : (b)) -/** - * @} - */ - -/* Private functions prototypes ----------------------------------------------*/ -/** @defgroup PCD_Private_Functions PCD Private Functions - * @{ - */ -static HAL_StatusTypeDef PCD_WriteEmptyTxFifo(PCD_HandleTypeDef *hpcd, uint32_t epnum); -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup PCD_Exported_Functions PCD Exported Functions - * @{ - */ - -/** @defgroup PCD_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] This section provides functions allowing to: - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the PCD according to the specified - * parameters in the PCD_InitTypeDef and initialize the associated handle. - * @param hpcd: PCD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_Init(PCD_HandleTypeDef *hpcd) -{ - uint32_t i = 0; - - /* Check the PCD handle allocation */ - if(hpcd == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_PCD_ALL_INSTANCE(hpcd->Instance)); - - hpcd->State = HAL_PCD_STATE_BUSY; - - /* Init the low level hardware : GPIO, CLOCK, NVIC... */ - HAL_PCD_MspInit(hpcd); - - /* Disable the Interrupts */ - __HAL_PCD_DISABLE(hpcd); - - /*Init the Core (common init.) */ - USB_CoreInit(hpcd->Instance, hpcd->Init); - - /* Force Device Mode*/ - USB_SetCurrentMode(hpcd->Instance , USB_OTG_DEVICE_MODE); - - /* Init endpoints structures */ - for (i = 0; i < 15 ; i++) - { - /* Init ep structure */ - hpcd->IN_ep[i].is_in = 1; - hpcd->IN_ep[i].num = i; - hpcd->IN_ep[i].tx_fifo_num = i; - /* Control until ep is activated */ - hpcd->IN_ep[i].type = EP_TYPE_CTRL; - hpcd->IN_ep[i].maxpacket = 0; - hpcd->IN_ep[i].xfer_buff = 0; - hpcd->IN_ep[i].xfer_len = 0; - } - - for (i = 0; i < 15 ; i++) - { - hpcd->OUT_ep[i].is_in = 0; - hpcd->OUT_ep[i].num = i; - hpcd->IN_ep[i].tx_fifo_num = i; - /* Control until ep is activated */ - hpcd->OUT_ep[i].type = EP_TYPE_CTRL; - hpcd->OUT_ep[i].maxpacket = 0; - hpcd->OUT_ep[i].xfer_buff = 0; - hpcd->OUT_ep[i].xfer_len = 0; - - hpcd->Instance->DIEPTXF[i] = 0; - } - - /* Init Device */ - USB_DevInit(hpcd->Instance, hpcd->Init); - - hpcd->State= HAL_PCD_STATE_READY; - - USB_DevDisconnect (hpcd->Instance); - return HAL_OK; -} - -/** - * @brief DeInitializes the PCD peripheral. - * @param hpcd: PCD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_DeInit(PCD_HandleTypeDef *hpcd) -{ - /* Check the PCD handle allocation */ - if(hpcd == NULL) - { - return HAL_ERROR; - } - - hpcd->State = HAL_PCD_STATE_BUSY; - - /* Stop Device */ - HAL_PCD_Stop(hpcd); - - /* DeInit the low level hardware */ - HAL_PCD_MspDeInit(hpcd); - - hpcd->State = HAL_PCD_STATE_RESET; - - return HAL_OK; -} - -/** - * @brief Initializes the PCD MSP. - * @param hpcd: PCD handle - * @retval None - */ -__weak void HAL_PCD_MspInit(PCD_HandleTypeDef *hpcd) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_PCD_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes PCD MSP. - * @param hpcd: PCD handle - * @retval None - */ -__weak void HAL_PCD_MspDeInit(PCD_HandleTypeDef *hpcd) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_PCD_MspDeInit could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup PCD_Exported_Functions_Group2 Input and Output operation functions - * @brief Data transfers functions - * -@verbatim - =============================================================================== - ##### IO operation functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to manage the PCD data - transfers. - -@endverbatim - * @{ - */ - -/** - * @brief Start The USB OTG Device. - * @param hpcd: PCD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_Start(PCD_HandleTypeDef *hpcd) -{ - __HAL_LOCK(hpcd); - USB_DevConnect (hpcd->Instance); - __HAL_PCD_ENABLE(hpcd); - __HAL_UNLOCK(hpcd); - return HAL_OK; -} - -/** - * @brief Stop The USB OTG Device. - * @param hpcd: PCD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_Stop(PCD_HandleTypeDef *hpcd) -{ - __HAL_LOCK(hpcd); - __HAL_PCD_DISABLE(hpcd); - USB_StopDevice(hpcd->Instance); - USB_DevDisconnect(hpcd->Instance); - __HAL_UNLOCK(hpcd); - return HAL_OK; -} - -/** - * @brief Handles PCD interrupt request. - * @param hpcd: PCD handle - * @retval HAL status - */ -void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) -{ - USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; - uint32_t i = 0, ep_intr = 0, epint = 0, epnum = 0; - uint32_t fifoemptymsk = 0, temp = 0; - USB_OTG_EPTypeDef *ep; - - /* ensure that we are in device mode */ - if (USB_GetMode(hpcd->Instance) == USB_OTG_MODE_DEVICE) - { - /* avoid spurious interrupt */ - if(__HAL_PCD_IS_INVALID_INTERRUPT(hpcd)) - { - return; - } - - if(__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_MMIS)) - { - /* incorrect mode, acknowledge the interrupt */ - __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_MMIS); - } - - if(__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_OEPINT)) - { - epnum = 0; - - /* Read in the device interrupt bits */ - ep_intr = USB_ReadDevAllOutEpInterrupt(hpcd->Instance); - - while ( ep_intr ) - { - if (ep_intr & 0x1) - { - epint = USB_ReadDevOutEPInterrupt(hpcd->Instance, epnum); - - if(( epint & USB_OTG_DOEPINT_XFRC) == USB_OTG_DOEPINT_XFRC) - { - CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_XFRC); - - if(hpcd->Init.dma_enable == 1) - { - hpcd->OUT_ep[epnum].xfer_count = hpcd->OUT_ep[epnum].maxpacket- (USBx_OUTEP(epnum)->DOEPTSIZ & USB_OTG_DOEPTSIZ_XFRSIZ); - hpcd->OUT_ep[epnum].xfer_buff += hpcd->OUT_ep[epnum].maxpacket; - } - - HAL_PCD_DataOutStageCallback(hpcd, epnum); - if(hpcd->Init.dma_enable == 1) - { - if((epnum == 0) && (hpcd->OUT_ep[epnum].xfer_len == 0)) - { - /* this is ZLP, so prepare EP0 for next setup */ - USB_EP0_OutStart(hpcd->Instance, 1, (uint8_t *)hpcd->Setup); - } - } - } - - if(( epint & USB_OTG_DOEPINT_STUP) == USB_OTG_DOEPINT_STUP) - { - /* Inform the upper layer that a setup packet is available */ - HAL_PCD_SetupStageCallback(hpcd); - CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STUP); - } - - if(( epint & USB_OTG_DOEPINT_OTEPDIS) == USB_OTG_DOEPINT_OTEPDIS) - { - CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_OTEPDIS); - } - } - epnum++; - ep_intr >>= 1; - } - } - - if(__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_IEPINT)) - { - /* Read in the device interrupt bits */ - ep_intr = USB_ReadDevAllInEpInterrupt(hpcd->Instance); - - epnum = 0; - - while ( ep_intr ) - { - if (ep_intr & 0x1) /* In ITR */ - { - epint = USB_ReadDevInEPInterrupt(hpcd->Instance, epnum); - - if(( epint & USB_OTG_DIEPINT_XFRC) == USB_OTG_DIEPINT_XFRC) - { - fifoemptymsk = 0x1 << epnum; - USBx_DEVICE->DIEPEMPMSK &= ~fifoemptymsk; - - CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_XFRC); - - if (hpcd->Init.dma_enable == 1) - { - hpcd->IN_ep[epnum].xfer_buff += hpcd->IN_ep[epnum].maxpacket; - } - - HAL_PCD_DataInStageCallback(hpcd, epnum); - - if (hpcd->Init.dma_enable == 1) - { - /* this is ZLP, so prepare EP0 for next setup */ - if((epnum == 0) && (hpcd->IN_ep[epnum].xfer_len == 0)) - { - /* prepare to rx more setup packets */ - USB_EP0_OutStart(hpcd->Instance, 1, (uint8_t *)hpcd->Setup); - } - } - } - if(( epint & USB_OTG_DIEPINT_TOC) == USB_OTG_DIEPINT_TOC) - { - CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_TOC); - } - if(( epint & USB_OTG_DIEPINT_ITTXFE) == USB_OTG_DIEPINT_ITTXFE) - { - CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_ITTXFE); - } - if(( epint & USB_OTG_DIEPINT_INEPNE) == USB_OTG_DIEPINT_INEPNE) - { - CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_INEPNE); - } - if(( epint & USB_OTG_DIEPINT_EPDISD) == USB_OTG_DIEPINT_EPDISD) - { - CLEAR_IN_EP_INTR(epnum, USB_OTG_DIEPINT_EPDISD); - } - if(( epint & USB_OTG_DIEPINT_TXFE) == USB_OTG_DIEPINT_TXFE) - { - PCD_WriteEmptyTxFifo(hpcd , epnum); - } - } - epnum++; - ep_intr >>= 1; - } - } - - /* Handle Resume Interrupt */ - if(__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_WKUINT)) - { - /* Clear the Remote Wake-up Signaling */ - USBx_DEVICE->DCTL &= ~USB_OTG_DCTL_RWUSIG; - - HAL_PCD_ResumeCallback(hpcd); - - __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_WKUINT); - } - - /* Handle Suspend Interrupt */ - if(__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_USBSUSP)) - { - if((USBx_DEVICE->DSTS & USB_OTG_DSTS_SUSPSTS) == USB_OTG_DSTS_SUSPSTS) - { - - HAL_PCD_SuspendCallback(hpcd); - } - __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_USBSUSP); - } - - /* Handle Reset Interrupt */ - if(__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_USBRST)) - { - USBx_DEVICE->DCTL &= ~USB_OTG_DCTL_RWUSIG; - USB_FlushTxFifo(hpcd->Instance , 0 ); - - for (i = 0; i < hpcd->Init.dev_endpoints ; i++) - { - USBx_INEP(i)->DIEPINT = 0xFF; - USBx_OUTEP(i)->DOEPINT = 0xFF; - } - USBx_DEVICE->DAINT = 0xFFFFFFFF; - USBx_DEVICE->DAINTMSK |= 0x10001; - - if(hpcd->Init.use_dedicated_ep1) - { - USBx_DEVICE->DOUTEP1MSK |= (USB_OTG_DOEPMSK_STUPM | USB_OTG_DOEPMSK_XFRCM | USB_OTG_DOEPMSK_EPDM); - USBx_DEVICE->DINEP1MSK |= (USB_OTG_DIEPMSK_TOM | USB_OTG_DIEPMSK_XFRCM | USB_OTG_DIEPMSK_EPDM); - } - else - { - USBx_DEVICE->DOEPMSK |= (USB_OTG_DOEPMSK_STUPM | USB_OTG_DOEPMSK_XFRCM | USB_OTG_DOEPMSK_EPDM); - USBx_DEVICE->DIEPMSK |= (USB_OTG_DIEPMSK_TOM | USB_OTG_DIEPMSK_XFRCM | USB_OTG_DIEPMSK_EPDM); - } - - /* Set Default Address to 0 */ - USBx_DEVICE->DCFG &= ~USB_OTG_DCFG_DAD; - - /* setup EP0 to receive SETUP packets */ - USB_EP0_OutStart(hpcd->Instance, hpcd->Init.dma_enable, (uint8_t *)hpcd->Setup); - - __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_USBRST); - } - - /* Handle Enumeration done Interrupt */ - if(__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_ENUMDNE)) - { - USB_ActivateSetup(hpcd->Instance); - hpcd->Instance->GUSBCFG &= ~USB_OTG_GUSBCFG_TRDT; - - if ( USB_GetDevSpeed(hpcd->Instance) == USB_OTG_SPEED_HIGH) - { - hpcd->Init.speed = USB_OTG_SPEED_HIGH; - hpcd->Init.ep0_mps = USB_OTG_HS_MAX_PACKET_SIZE ; - hpcd->Instance->GUSBCFG |= (uint32_t)((USBD_HS_TRDT_VALUE << 10) & USB_OTG_GUSBCFG_TRDT); - } - else - { - hpcd->Init.speed = USB_OTG_SPEED_FULL; - hpcd->Init.ep0_mps = USB_OTG_FS_MAX_PACKET_SIZE ; - hpcd->Instance->GUSBCFG |= (uint32_t)((USBD_FS_TRDT_VALUE << 10) & USB_OTG_GUSBCFG_TRDT); - } - - HAL_PCD_ResetCallback(hpcd); - - __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_ENUMDNE); - } - - /* Handle RxQLevel Interrupt */ - if(__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_RXFLVL)) - { - USB_MASK_INTERRUPT(hpcd->Instance, USB_OTG_GINTSTS_RXFLVL); - - temp = USBx->GRXSTSP; - - ep = &hpcd->OUT_ep[temp & USB_OTG_GRXSTSP_EPNUM]; - - if(((temp & USB_OTG_GRXSTSP_PKTSTS) >> 17) == STS_DATA_UPDT) - { - if((temp & USB_OTG_GRXSTSP_BCNT) != 0) - { - USB_ReadPacket(USBx, ep->xfer_buff, (temp & USB_OTG_GRXSTSP_BCNT) >> 4); - ep->xfer_buff += (temp & USB_OTG_GRXSTSP_BCNT) >> 4; - ep->xfer_count += (temp & USB_OTG_GRXSTSP_BCNT) >> 4; - } - } - else if (((temp & USB_OTG_GRXSTSP_PKTSTS) >> 17) == STS_SETUP_UPDT) - { - USB_ReadPacket(USBx, (uint8_t *)hpcd->Setup, 8); - ep->xfer_count += (temp & USB_OTG_GRXSTSP_BCNT) >> 4; - } - USB_UNMASK_INTERRUPT(hpcd->Instance, USB_OTG_GINTSTS_RXFLVL); - } - - /* Handle SOF Interrupt */ - if(__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_SOF)) - { - HAL_PCD_SOFCallback(hpcd); - __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_SOF); - } - - /* Handle Incomplete ISO IN Interrupt */ - if(__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_IISOIXFR)) - { - HAL_PCD_ISOINIncompleteCallback(hpcd, epnum); - __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_IISOIXFR); - } - - /* Handle Incomplete ISO OUT Interrupt */ - if(__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_PXFR_INCOMPISOOUT)) - { - HAL_PCD_ISOOUTIncompleteCallback(hpcd, epnum); - __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_PXFR_INCOMPISOOUT); - } - - /* Handle Connection event Interrupt */ - if(__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_SRQINT)) - { - HAL_PCD_ConnectCallback(hpcd); - __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_SRQINT); - } - - /* Handle Disconnection event Interrupt */ - if(__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_OTGINT)) - { - temp = hpcd->Instance->GOTGINT; - - if((temp & USB_OTG_GOTGINT_SEDET) == USB_OTG_GOTGINT_SEDET) - { - HAL_PCD_DisconnectCallback(hpcd); - } - hpcd->Instance->GOTGINT |= temp; - } - } -} - -/** - * @brief Data OUT stage callback. - * @param hpcd: PCD handle - * @param epnum: endpoint number - * @retval None - */ - __weak void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_PCD_DataOutStageCallback could be implemented in the user file - */ -} - -/** - * @brief Data IN stage callback. - * @param hpcd: PCD handle - * @param epnum: endpoint number - * @retval None - */ - __weak void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_PCD_DataInStageCallback could be implemented in the user file - */ -} -/** - * @brief Setup stage callback. - * @param hpcd: PCD handle - * @retval None - */ - __weak void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_PCD_SetupStageCallback could be implemented in the user file - */ -} - -/** - * @brief USB Start Of Frame callback. - * @param hpcd: PCD handle - * @retval None - */ - __weak void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_PCD_SOFCallback could be implemented in the user file - */ -} - -/** - * @brief USB Reset callback. - * @param hpcd: PCD handle - * @retval None - */ - __weak void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_PCD_ResetCallback could be implemented in the user file - */ -} - -/** - * @brief Suspend event callback. - * @param hpcd: PCD handle - * @retval None - */ - __weak void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_PCD_SuspendCallback could be implemented in the user file - */ -} - -/** - * @brief Resume event callback. - * @param hpcd: PCD handle - * @retval None - */ - __weak void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_PCD_ResumeCallback could be implemented in the user file - */ -} - -/** - * @brief Incomplete ISO OUT callback. - * @param hpcd: PCD handle - * @param epnum: endpoint number - * @retval None - */ - __weak void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_PCD_ISOOUTIncompleteCallback could be implemented in the user file - */ -} - -/** - * @brief Incomplete ISO IN callback. - * @param hpcd: PCD handle - * @param epnum: endpoint number - * @retval None - */ - __weak void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_PCD_ISOINIncompleteCallback could be implemented in the user file - */ -} - -/** - * @brief Connection event callback. - * @param hpcd: PCD handle - * @retval None - */ - __weak void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_PCD_ConnectCallback could be implemented in the user file - */ -} - -/** - * @brief Disconnection event callback. - * @param hpcd: PCD handle - * @retval None - */ - __weak void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_PCD_DisconnectCallback could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup PCD_Exported_Functions_Group3 Peripheral Control functions - * @brief management functions - * -@verbatim - =============================================================================== - ##### Peripheral Control functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to control the PCD data - transfers. - -@endverbatim - * @{ - */ - -/** - * @brief Connect the USB device. - * @param hpcd: PCD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_DevConnect(PCD_HandleTypeDef *hpcd) -{ - __HAL_LOCK(hpcd); - USB_DevConnect(hpcd->Instance); - __HAL_UNLOCK(hpcd); - return HAL_OK; -} - -/** - * @brief Disconnect the USB device. - * @param hpcd: PCD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_DevDisconnect(PCD_HandleTypeDef *hpcd) -{ - __HAL_LOCK(hpcd); - USB_DevDisconnect(hpcd->Instance); - __HAL_UNLOCK(hpcd); - return HAL_OK; -} - -/** - * @brief Set the USB Device address. - * @param hpcd: PCD handle - * @param address: new device address - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_SetAddress(PCD_HandleTypeDef *hpcd, uint8_t address) -{ - __HAL_LOCK(hpcd); - USB_SetDevAddress(hpcd->Instance, address); - __HAL_UNLOCK(hpcd); - return HAL_OK; -} -/** - * @brief Open and configure an endpoint. - * @param hpcd: PCD handle - * @param ep_addr: endpoint address - * @param ep_mps: endpoint max packet size - * @param ep_type: endpoint type - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_EP_Open(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint16_t ep_mps, uint8_t ep_type) -{ - HAL_StatusTypeDef ret = HAL_OK; - USB_OTG_EPTypeDef *ep; - - if ((ep_addr & 0x80) == 0x80) - { - ep = &hpcd->IN_ep[ep_addr & 0x7F]; - } - else - { - ep = &hpcd->OUT_ep[ep_addr & 0x7F]; - } - ep->num = ep_addr & 0x7F; - - ep->is_in = (0x80 & ep_addr) != 0; - ep->maxpacket = ep_mps; - ep->type = ep_type; - if (ep->is_in) - { - /* Assign a Tx FIFO */ - ep->tx_fifo_num = ep->num; - } - /* Set initial data PID. */ - if (ep_type == EP_TYPE_BULK ) - { - ep->data_pid_start = 0; - } - - __HAL_LOCK(hpcd); - USB_ActivateEndpoint(hpcd->Instance , ep); - __HAL_UNLOCK(hpcd); - return ret; -} - - -/** - * @brief Deactivate an endpoint. - * @param hpcd: PCD handle - * @param ep_addr: endpoint address - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_EP_Close(PCD_HandleTypeDef *hpcd, uint8_t ep_addr) -{ - USB_OTG_EPTypeDef *ep; - - if ((ep_addr & 0x80) == 0x80) - { - ep = &hpcd->IN_ep[ep_addr & 0x7F]; - } - else - { - ep = &hpcd->OUT_ep[ep_addr & 0x7F]; - } - ep->num = ep_addr & 0x7F; - - ep->is_in = (0x80 & ep_addr) != 0; - - __HAL_LOCK(hpcd); - USB_DeactivateEndpoint(hpcd->Instance , ep); - __HAL_UNLOCK(hpcd); - return HAL_OK; -} - - -/** - * @brief Receive an amount of data. - * @param hpcd: PCD handle - * @param ep_addr: endpoint address - * @param pBuf: pointer to the reception buffer - * @param len: amount of data to be received - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_EP_Receive(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len) -{ - USB_OTG_EPTypeDef *ep; - - ep = &hpcd->OUT_ep[ep_addr & 0x7F]; - - /*setup and start the Xfer */ - ep->xfer_buff = pBuf; - ep->xfer_len = len; - ep->xfer_count = 0; - ep->is_in = 0; - ep->num = ep_addr & 0x7F; - - if (hpcd->Init.dma_enable == 1) - { - ep->dma_addr = (uint32_t)pBuf; - } - - __HAL_LOCK(hpcd); - - if ((ep_addr & 0x7F) == 0 ) - { - USB_EP0StartXfer(hpcd->Instance , ep, hpcd->Init.dma_enable); - } - else - { - USB_EPStartXfer(hpcd->Instance , ep, hpcd->Init.dma_enable); - } - __HAL_UNLOCK(hpcd); - - return HAL_OK; -} - -/** - * @brief Get Received Data Size. - * @param hpcd: PCD handle - * @param ep_addr: endpoint address - * @retval Data Size - */ -uint16_t HAL_PCD_EP_GetRxCount(PCD_HandleTypeDef *hpcd, uint8_t ep_addr) -{ - return hpcd->OUT_ep[ep_addr & 0x7F].xfer_count; -} -/** - * @brief Send an amount of data. - * @param hpcd: PCD handle - * @param ep_addr: endpoint address - * @param pBuf: pointer to the transmission buffer - * @param len: amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_EP_Transmit(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len) -{ - USB_OTG_EPTypeDef *ep; - - ep = &hpcd->IN_ep[ep_addr & 0x7F]; - - /*setup and start the Xfer */ - ep->xfer_buff = pBuf; - ep->xfer_len = len; - ep->xfer_count = 0; - ep->is_in = 1; - ep->num = ep_addr & 0x7F; - - if (hpcd->Init.dma_enable == 1) - { - ep->dma_addr = (uint32_t)pBuf; - } - - __HAL_LOCK(hpcd); - - if ((ep_addr & 0x7F) == 0 ) - { - USB_EP0StartXfer(hpcd->Instance , ep, hpcd->Init.dma_enable); - } - else - { - USB_EPStartXfer(hpcd->Instance , ep, hpcd->Init.dma_enable); - } - - __HAL_UNLOCK(hpcd); - - return HAL_OK; -} - -/** - * @brief Set a STALL condition over an endpoint. - * @param hpcd: PCD handle - * @param ep_addr: endpoint address - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_EP_SetStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr) -{ - USB_OTG_EPTypeDef *ep; - - if ((0x80 & ep_addr) == 0x80) - { - ep = &hpcd->IN_ep[ep_addr & 0x7F]; - } - else - { - ep = &hpcd->OUT_ep[ep_addr]; - } - - ep->is_stall = 1; - ep->num = ep_addr & 0x7F; - ep->is_in = ((ep_addr & 0x80) == 0x80); - - - __HAL_LOCK(hpcd); - USB_EPSetStall(hpcd->Instance , ep); - if((ep_addr & 0x7F) == 0) - { - USB_EP0_OutStart(hpcd->Instance, hpcd->Init.dma_enable, (uint8_t *)hpcd->Setup); - } - __HAL_UNLOCK(hpcd); - - return HAL_OK; -} - -/** - * @brief Clear a STALL condition over in an endpoint. - * @param hpcd: PCD handle - * @param ep_addr: endpoint address - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_EP_ClrStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr) -{ - USB_OTG_EPTypeDef *ep; - - if ((0x80 & ep_addr) == 0x80) - { - ep = &hpcd->IN_ep[ep_addr & 0x7F]; - } - else - { - ep = &hpcd->OUT_ep[ep_addr]; - } - - ep->is_stall = 0; - ep->num = ep_addr & 0x7F; - ep->is_in = ((ep_addr & 0x80) == 0x80); - - __HAL_LOCK(hpcd); - USB_EPClearStall(hpcd->Instance , ep); - __HAL_UNLOCK(hpcd); - - return HAL_OK; -} - -/** - * @brief Flush an endpoint. - * @param hpcd: PCD handle - * @param ep_addr: endpoint address - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_EP_Flush(PCD_HandleTypeDef *hpcd, uint8_t ep_addr) -{ - __HAL_LOCK(hpcd); - - if ((ep_addr & 0x80) == 0x80) - { - USB_FlushTxFifo(hpcd->Instance, ep_addr & 0x7F); - } - else - { - USB_FlushRxFifo(hpcd->Instance); - } - - __HAL_UNLOCK(hpcd); - - return HAL_OK; -} - -/** - * @brief Activate remote wakeup signalling. - * @param hpcd: PCD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_ActivateRemoteWakeup(PCD_HandleTypeDef *hpcd) -{ - USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; - - if((USBx_DEVICE->DSTS & USB_OTG_DSTS_SUSPSTS) == USB_OTG_DSTS_SUSPSTS) - { - /* Activate Remote wakeup signaling */ - USBx_DEVICE->DCTL |= USB_OTG_DCTL_RWUSIG; - } - return HAL_OK; -} - -/** - * @brief De-activate remote wakeup signalling. - * @param hpcd: PCD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_PCD_DeActivateRemoteWakeup(PCD_HandleTypeDef *hpcd) -{ - USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; - - /* De-activate Remote wakeup signaling */ - USBx_DEVICE->DCTL &= ~(USB_OTG_DCTL_RWUSIG); - return HAL_OK; -} -/** - * @} - */ - -/** @defgroup PCD_Exported_Functions_Group4 Peripheral State functions - * @brief Peripheral State functions - * -@verbatim - =============================================================================== - ##### Peripheral State functions ##### - =============================================================================== - [..] - This subsection permits to get in run-time the status of the peripheral - and the data flow. - -@endverbatim - * @{ - */ - -/** - * @brief Return the PCD handle state. - * @param hpcd: PCD handle - * @retval HAL state - */ -PCD_StateTypeDef HAL_PCD_GetState(PCD_HandleTypeDef *hpcd) -{ - return hpcd->State; -} -/** - * @} - */ - -/** - * @} - */ - -/* Private functions ---------------------------------------------------------*/ -/** @addtogroup PCD_Private_Functions - * @{ - */ - -/** - * @brief Check FIFO for the next packet to be loaded. - * @param hpcd: PCD handle - * @param epnum : endpoint number - * @retval HAL status - */ -static HAL_StatusTypeDef PCD_WriteEmptyTxFifo(PCD_HandleTypeDef *hpcd, uint32_t epnum) -{ - USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; - USB_OTG_EPTypeDef *ep; - int32_t len = 0; - uint32_t len32b; - uint32_t fifoemptymsk = 0; - - ep = &hpcd->IN_ep[epnum]; - len = ep->xfer_len - ep->xfer_count; - - if (len > ep->maxpacket) - { - len = ep->maxpacket; - } - - - len32b = (len + 3) / 4; - - while ( (USBx_INEP(epnum)->DTXFSTS & USB_OTG_DTXFSTS_INEPTFSAV) > len32b && - ep->xfer_count < ep->xfer_len && - ep->xfer_len != 0) - { - /* Write the FIFO */ - len = ep->xfer_len - ep->xfer_count; - - if (len > ep->maxpacket) - { - len = ep->maxpacket; - } - len32b = (len + 3) / 4; - - USB_WritePacket(USBx, ep->xfer_buff, epnum, len, hpcd->Init.dma_enable); - - ep->xfer_buff += len; - ep->xfer_count += len; - } - - if(len <= 0) - { - fifoemptymsk = 0x1 << epnum; - USBx_DEVICE->DIEPEMPMSK &= ~fifoemptymsk; - - } - - return HAL_OK; -} - -/** - * @} - */ - -#endif /* HAL_PCD_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_rng.c b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_rng.c deleted file mode 100755 index ff629841..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_rng.c +++ /dev/null @@ -1,509 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_hal_rng.c - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief RNG HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the Random Number Generator (RNG) peripheral: - * + Initialization/de-initialization functions - * + Peripheral Control functions - * + Peripheral State functions - * - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - The RNG HAL driver can be used as follows: - - (#) Enable the RNG controller clock using __HAL_RCC_RNG_CLK_ENABLE() macro - in HAL_RNG_MspInit(). - (#) Activate the RNG peripheral using HAL_RNG_Init() function. - (#) Wait until the 32 bit Random Number Generator contains a valid - random data using (polling/interrupt) mode. - (#) Get the 32 bit random number using HAL_RNG_GenerateRandomNumber() function. - - @endverbatim - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal.h" - -/** @addtogroup STM32F2xx_HAL_Driver - * @{ - */ - -/** @addtogroup RNG - * @{ - */ - -#ifdef HAL_RNG_MODULE_ENABLED - - -/* Private types -------------------------------------------------------------*/ -/* Private defines -----------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private constants ---------------------------------------------------------*/ -/** @addtogroup RNG_Private_Constants - * @{ - */ -#define RNG_TIMEOUT_VALUE 2 -/** - * @} - */ -/* Private macros ------------------------------------------------------------*/ -/* Private functions prototypes ----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ - -/** @addtogroup RNG_Exported_Functions - * @{ - */ - -/** @addtogroup RNG_Exported_Functions_Group1 - * @brief Initialization and de-initialization functions - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Initialize the RNG according to the specified parameters - in the RNG_InitTypeDef and create the associated handle - (+) DeInitialize the RNG peripheral - (+) Initialize the RNG MSP - (+) DeInitialize RNG MSP - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the RNG peripheral and creates the associated handle. - * @param hrng: pointer to a RNG_HandleTypeDef structure that contains - * the configuration information for RNG. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RNG_Init(RNG_HandleTypeDef *hrng) -{ - /* Check the RNG handle allocation */ - if(hrng == NULL) - { - return HAL_ERROR; - } - - __HAL_LOCK(hrng); - - if(hrng->State == HAL_RNG_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - hrng->Lock = HAL_UNLOCKED; - /* Init the low level hardware */ - HAL_RNG_MspInit(hrng); - } - - /* Change RNG peripheral state */ - hrng->State = HAL_RNG_STATE_BUSY; - - /* Enable the RNG Peripheral */ - __HAL_RNG_ENABLE(hrng); - - /* Initialize the RNG state */ - hrng->State = HAL_RNG_STATE_READY; - - __HAL_UNLOCK(hrng); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief DeInitializes the RNG peripheral. - * @param hrng: pointer to a RNG_HandleTypeDef structure that contains - * the configuration information for RNG. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RNG_DeInit(RNG_HandleTypeDef *hrng) -{ - /* Check the RNG handle allocation */ - if(hrng == NULL) - { - return HAL_ERROR; - } - /* Disable the RNG Peripheral */ - CLEAR_BIT(hrng->Instance->CR, RNG_CR_IE | RNG_CR_RNGEN); - - /* Clear RNG interrupt status flags */ - CLEAR_BIT(hrng->Instance->SR, RNG_SR_CEIS | RNG_SR_SEIS); - - /* DeInit the low level hardware */ - HAL_RNG_MspDeInit(hrng); - - /* Update the RNG state */ - hrng->State = HAL_RNG_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(hrng); - - /* Return the function status */ - return HAL_OK; -} - -/** - * @brief Initializes the RNG MSP. - * @param hrng: pointer to a RNG_HandleTypeDef structure that contains - * the configuration information for RNG. - * @retval None - */ -__weak void HAL_RNG_MspInit(RNG_HandleTypeDef *hrng) -{ - /* NOTE : This function should not be modified. When the callback is needed, - function HAL_RNG_MspInit must be implemented in the user file. - */ -} - -/** - * @brief DeInitializes the RNG MSP. - * @param hrng: pointer to a RNG_HandleTypeDef structure that contains - * the configuration information for RNG. - * @retval None - */ -__weak void HAL_RNG_MspDeInit(RNG_HandleTypeDef *hrng) -{ - /* NOTE : This function should not be modified. When the callback is needed, - function HAL_RNG_MspDeInit must be implemented in the user file. - */ -} - -/** - * @} - */ - -/** @addtogroup RNG_Exported_Functions_Group2 - * @brief Peripheral Control functions - * -@verbatim - =============================================================================== - ##### Peripheral Control functions ##### - =============================================================================== - [..] This section provides functions allowing to: - (+) Get the 32 bit Random number - (+) Get the 32 bit Random number with interrupt enabled - (+) Handle RNG interrupt request - -@endverbatim - * @{ - */ - -/** - * @brief Generates a 32-bit random number. - * @note Each time the random number data is read the RNG_FLAG_DRDY flag - * is automatically cleared. - * @param hrng: pointer to a RNG_HandleTypeDef structure that contains - * the configuration information for RNG. - * @param random32bit: pointer to generated random number variable if successful. - * @retval HAL status - */ - -HAL_StatusTypeDef HAL_RNG_GenerateRandomNumber(RNG_HandleTypeDef *hrng, uint32_t *random32bit) -{ - uint32_t tickstart = 0; - HAL_StatusTypeDef status = HAL_OK; - - /* Process Locked */ - __HAL_LOCK(hrng); - - /* Check RNG peripheral state */ - if(hrng->State == HAL_RNG_STATE_READY) - { - /* Change RNG peripheral state */ - hrng->State = HAL_RNG_STATE_BUSY; - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Check if data register contains valid random data */ - while(__HAL_RNG_GET_FLAG(hrng, RNG_FLAG_DRDY) == RESET) - { - if((HAL_GetTick() - tickstart ) > RNG_TIMEOUT_VALUE) - { - hrng->State = HAL_RNG_STATE_ERROR; - - /* Process Unlocked */ - __HAL_UNLOCK(hrng); - - return HAL_TIMEOUT; - } - } - - /* Get a 32bit Random number */ - hrng->RandomNumber = hrng->Instance->DR; - *random32bit = hrng->RandomNumber; - - hrng->State = HAL_RNG_STATE_READY; - } - else - { - status = HAL_ERROR; - } - - /* Process Unlocked */ - __HAL_UNLOCK(hrng); - - return status; -} - -/** - * @brief Generates a 32-bit random number in interrupt mode. - * @param hrng: pointer to a RNG_HandleTypeDef structure that contains - * the configuration information for RNG. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_RNG_GenerateRandomNumber_IT(RNG_HandleTypeDef *hrng) -{ - HAL_StatusTypeDef status = HAL_OK; - - /* Process Locked */ - __HAL_LOCK(hrng); - - /* Check RNG peripheral state */ - if(hrng->State == HAL_RNG_STATE_READY) - { - /* Change RNG peripheral state */ - hrng->State = HAL_RNG_STATE_BUSY; - - /* Process Unlocked */ - __HAL_UNLOCK(hrng); - - /* Enable the RNG Interrupts: Data Ready, Clock error, Seed error */ - __HAL_RNG_ENABLE_IT(hrng); - } - else - { - /* Process Unlocked */ - __HAL_UNLOCK(hrng); - - status = HAL_ERROR; - } - - return status; -} - -/** - * @brief Handles RNG interrupt request. - * @note In the case of a clock error, the RNG is no more able to generate - * random numbers because the PLL48CLK clock is not correct. User has - * to check that the clock controller is correctly configured to provide - * the RNG clock and clear the CEIS bit using __HAL_RNG_CLEAR_IT(). - * The clock error has no impact on the previously generated - * random numbers, and the RNG_DR register contents can be used. - * @note In the case of a seed error, the generation of random numbers is - * interrupted as long as the SECS bit is '1'. If a number is - * available in the RNG_DR register, it must not be used because it may - * not have enough entropy. In this case, it is recommended to clear the - * SEIS bit using __HAL_RNG_CLEAR_IT(), then disable and enable - * the RNG peripheral to reinitialize and restart the RNG. - * @note User-written HAL_RNG_ErrorCallback() API is called once whether SEIS - * or CEIS are set. - * @param hrng: pointer to a RNG_HandleTypeDef structure that contains - * the configuration information for RNG. - * @retval None - - */ -void HAL_RNG_IRQHandler(RNG_HandleTypeDef *hrng) -{ - /* RNG clock error interrupt occurred */ - if((__HAL_RNG_GET_IT(hrng, RNG_IT_CEI) != RESET) || (__HAL_RNG_GET_IT(hrng, RNG_IT_SEI) != RESET)) - { - /* Change RNG peripheral state */ - hrng->State = HAL_RNG_STATE_ERROR; - - HAL_RNG_ErrorCallback(hrng); - - /* Clear the clock error flag */ - __HAL_RNG_CLEAR_IT(hrng, RNG_IT_CEI|RNG_IT_SEI); - - } - - /* Check RNG data ready interrupt occurred */ - if(__HAL_RNG_GET_IT(hrng, RNG_IT_DRDY) != RESET) - { - /* Generate random number once, so disable the IT */ - __HAL_RNG_DISABLE_IT(hrng); - - /* Get the 32bit Random number (DRDY flag automatically cleared) */ - hrng->RandomNumber = hrng->Instance->DR; - - if(hrng->State != HAL_RNG_STATE_ERROR) - { - /* Change RNG peripheral state */ - hrng->State = HAL_RNG_STATE_READY; - - /* Data Ready callback */ - HAL_RNG_ReadyDataCallback(hrng, hrng->RandomNumber); - } - } -} - -/** - * @brief Returns generated random number in polling mode (Obsolete) - * Use HAL_RNG_GenerateRandomNumber() API instead. - * @param hrng: pointer to a RNG_HandleTypeDef structure that contains - * the configuration information for RNG. - * @retval Random value - */ -uint32_t HAL_RNG_GetRandomNumber(RNG_HandleTypeDef *hrng) -{ - if(HAL_RNG_GenerateRandomNumber(hrng, &(hrng->RandomNumber)) == HAL_OK) - { - return hrng->RandomNumber; - } - else - { - return 0; - } -} - -/** - * @brief Returns a 32-bit random number with interrupt enabled (Obsolete), - * Use HAL_RNG_GenerateRandomNumber_IT() API instead. - * @param hrng: pointer to a RNG_HandleTypeDef structure that contains - * the configuration information for RNG. - * @retval 32-bit random number - */ -uint32_t HAL_RNG_GetRandomNumber_IT(RNG_HandleTypeDef *hrng) -{ - uint32_t random32bit = 0; - - /* Process locked */ - __HAL_LOCK(hrng); - - /* Change RNG peripheral state */ - hrng->State = HAL_RNG_STATE_BUSY; - - /* Get a 32bit Random number */ - random32bit = hrng->Instance->DR; - - /* Enable the RNG Interrupts: Data Ready, Clock error, Seed error */ - __HAL_RNG_ENABLE_IT(hrng); - - /* Return the 32 bit random number */ - return random32bit; -} - -/** - * @brief Read latest generated random number. - * @param hrng: pointer to a RNG_HandleTypeDef structure that contains - * the configuration information for RNG. - * @retval random value - */ -uint32_t HAL_RNG_ReadLastRandomNumber(RNG_HandleTypeDef *hrng) -{ - return(hrng->RandomNumber); -} - -/** - * @brief Data Ready callback in non-blocking mode. - * @param hrng: pointer to a RNG_HandleTypeDef structure that contains - * the configuration information for RNG. - * @param random32bit: generated random number. - * @retval None - */ -__weak void HAL_RNG_ReadyDataCallback(RNG_HandleTypeDef *hrng, uint32_t random32bit) -{ - /* NOTE : This function should not be modified. When the callback is needed, - function HAL_RNG_ReadyDataCallback must be implemented in the user file. - */ -} - -/** - * @brief RNG error callbacks. - * @param hrng: pointer to a RNG_HandleTypeDef structure that contains - * the configuration information for RNG. - * @retval None - */ -__weak void HAL_RNG_ErrorCallback(RNG_HandleTypeDef *hrng) -{ - /* NOTE : This function should not be modified. When the callback is needed, - function HAL_RNG_ErrorCallback must be implemented in the user file. - */ -} -/** - * @} - */ - - -/** @addtogroup RNG_Exported_Functions_Group3 - * @brief Peripheral State functions - * -@verbatim - =============================================================================== - ##### Peripheral State functions ##### - =============================================================================== - [..] - This subsection permits to get in run-time the status of the peripheral - and the data flow. - -@endverbatim - * @{ - */ - -/** - * @brief Returns the RNG state. - * @param hrng: pointer to a RNG_HandleTypeDef structure that contains - * the configuration information for RNG. - * @retval HAL state - */ -HAL_RNG_StateTypeDef HAL_RNG_GetState(RNG_HandleTypeDef *hrng) -{ - return hrng->State; -} - -/** - * @} - */ - -/** - * @} - */ - -#endif /* HAL_RNG_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_sd.c b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_sd.c deleted file mode 100755 index 7312d0e3..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_sd.c +++ /dev/null @@ -1,3469 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_hal_sd.c - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief SD card HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the Secure Digital (SD) peripheral: - * + Initialization and de-initialization functions - * + IO operation functions - * + Peripheral Control functions - * + Peripheral State functions - * - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - This driver implements a high level communication layer for read and write from/to - this memory. The needed STM32 hardware resources (SDIO and GPIO) are performed by - the user in HAL_SD_MspInit() function (MSP layer). - Basically, the MSP layer configuration should be the same as we provide in the - examples. - You can easily tailor this configuration according to hardware resources. - - [..] - This driver is a generic layered driver for SDIO memories which uses the HAL - SDIO driver functions to interface with SD and uSD cards devices. - It is used as follows: - - (#)Initialize the SDIO low level resources by implement the HAL_SD_MspInit() API: - (##) Enable the SDIO interface clock using __HAL_RCC_SDIO_CLK_ENABLE(); - (##) SDIO pins configuration for SD card - (+++) Enable the clock for the SDIO GPIOs using the functions __HAL_RCC_GPIOx_CLK_ENABLE(); - (+++) Configure these SDIO pins as alternate function pull-up using HAL_GPIO_Init() - and according to your pin assignment; - (##) DMA Configuration if you need to use DMA process (HAL_SD_ReadBlocks_DMA() - and HAL_SD_WriteBlocks_DMA() APIs). - (+++) Enable the DMAx interface clock using __HAL_RCC_DMAx_CLK_ENABLE(); - (+++) Configure the DMA using the function HAL_DMA_Init() with predeclared and filled. - (##) NVIC configuration if you need to use interrupt process when using DMA transfer. - (+++) Configure the SDIO and DMA interrupt priorities using functions - HAL_NVIC_SetPriority(); DMA priority is superior to SDIO's priority - (+++) Enable the NVIC DMA and SDIO IRQs using function HAL_NVIC_EnableIRQ() - (+++) SDIO interrupts are managed using the macros __HAL_SD_SDIO_ENABLE_IT() - and __HAL_SD_SDIO_DISABLE_IT() inside the communication process. - (+++) SDIO interrupts pending bits are managed using the macros __HAL_SD_SDIO_GET_IT() - and __HAL_SD_SDIO_CLEAR_IT() - (#) At this stage, you can perform SD read/write/erase operations after SD card initialization - - - *** SD Card Initialization and configuration *** - ================================================ - [..] - To initialize the SD Card, use the HAL_SD_Init() function. It Initializes - the SD Card and put it into Standby State (Ready for data transfer). - This function provide the following operations: - - (#) Apply the SD Card initialization process at 400KHz and check the SD Card - type (Standard Capacity or High Capacity). You can change or adapt this - frequency by adjusting the "ClockDiv" field. - The SD Card frequency (SDIO_CK) is computed as follows: - - SDIO_CK = SDIOCLK / (ClockDiv + 2) - - In initialization mode and according to the SD Card standard, - make sure that the SDIO_CK frequency doesn't exceed 400KHz. - - (#) Get the SD CID and CSD data. All these information are managed by the SDCardInfo - structure. This structure provide also ready computed SD Card capacity - and Block size. - - -@- These information are stored in SD handle structure in case of future use. - - (#) Configure the SD Card Data transfer frequency. By Default, the card transfer - frequency is set to 24MHz. You can change or adapt this frequency by adjusting - the "ClockDiv" field. - In transfer mode and according to the SD Card standard, make sure that the - SDIO_CK frequency doesn't exceed 25MHz and 50MHz in High-speed mode switch. - To be able to use a frequency higher than 24MHz, you should use the SDIO - peripheral in bypass mode. Refer to the corresponding reference manual - for more details. - - (#) Select the corresponding SD Card according to the address read with the step 2. - - (#) Configure the SD Card in wide bus mode: 4-bits data. - - *** SD Card Read operation *** - ============================== - [..] - (+) You can read from SD card in polling mode by using function HAL_SD_ReadBlocks(). - This function support only 512-bytes block length (the block size should be - chosen as 512 bytes). - You can choose either one block read operation or multiple block read operation - by adjusting the "NumberOfBlocks" parameter. - - (+) You can read from SD card in DMA mode by using function HAL_SD_ReadBlocks_DMA(). - This function support only 512-bytes block length (the block size should be - chosen as 512 bytes). - You can choose either one block read operation or multiple block read operation - by adjusting the "NumberOfBlocks" parameter. - After this, you have to call the function HAL_SD_CheckReadOperation(), to insure - that the read transfer is done correctly in both DMA and SD sides. - - *** SD Card Write operation *** - =============================== - [..] - (+) You can write to SD card in polling mode by using function HAL_SD_WriteBlocks(). - This function support only 512-bytes block length (the block size should be - chosen as 512 bytes). - You can choose either one block read operation or multiple block read operation - by adjusting the "NumberOfBlocks" parameter. - - (+) You can write to SD card in DMA mode by using function HAL_SD_WriteBlocks_DMA(). - This function support only 512-bytes block length (the block size should be - chosen as 512 byte). - You can choose either one block read operation or multiple block read operation - by adjusting the "NumberOfBlocks" parameter. - After this, you have to call the function HAL_SD_CheckWriteOperation(), to insure - that the write transfer is done correctly in both DMA and SD sides. - - *** SD card status *** - ====================== - [..] - (+) At any time, you can check the SD Card status and get the SD card state - by using the HAL_SD_GetStatus() function. This function checks first if the - SD card is still connected and then get the internal SD Card transfer state. - (+) You can also get the SD card SD Status register by using the HAL_SD_SendSDStatus() - function. - - *** SD HAL driver macros list *** - ================================== - [..] - Below the list of most used macros in SD HAL driver. - - (+) __HAL_SD_SDIO_ENABLE : Enable the SD device - (+) __HAL_SD_SDIO_DISABLE : Disable the SD device - (+) __HAL_SD_SDIO_DMA_ENABLE: Enable the SDIO DMA transfer - (+) __HAL_SD_SDIO_DMA_DISABLE: Disable the SDIO DMA transfer - (+) __HAL_SD_SDIO_ENABLE_IT: Enable the SD device interrupt - (+) __HAL_SD_SDIO_DISABLE_IT: Disable the SD device interrupt - (+) __HAL_SD_SDIO_GET_FLAG:Check whether the specified SD flag is set or not - (+) __HAL_SD_SDIO_CLEAR_FLAG: Clear the SD's pending flags - - (@) You can refer to the SD HAL driver header file for more useful macros - - @endverbatim - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal.h" -#ifdef HAL_SD_MODULE_ENABLED - -/** @addtogroup STM32F2xx_HAL_Driver - * @{ - */ - -/** @addtogroup SD - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @addtogroup SD_Private_Defines - * @{ - */ -/** - * @brief SDIO Data block size - */ -#define DATA_BLOCK_SIZE ((uint32_t)(9 << 4)) -/** - * @brief SDIO Static flags, Timeout, FIFO Address - */ -#define SDIO_STATIC_FLAGS ((uint32_t)(SDIO_FLAG_CCRCFAIL | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_CTIMEOUT |\ - SDIO_FLAG_DTIMEOUT | SDIO_FLAG_TXUNDERR | SDIO_FLAG_RXOVERR |\ - SDIO_FLAG_CMDREND | SDIO_FLAG_CMDSENT | SDIO_FLAG_DATAEND |\ - SDIO_FLAG_DBCKEND)) - -#define SDIO_CMD0TIMEOUT ((uint32_t)0x00010000) - -/** - * @brief Mask for errors Card Status R1 (OCR Register) - */ -#define SD_OCR_ADDR_OUT_OF_RANGE ((uint32_t)0x80000000) -#define SD_OCR_ADDR_MISALIGNED ((uint32_t)0x40000000) -#define SD_OCR_BLOCK_LEN_ERR ((uint32_t)0x20000000) -#define SD_OCR_ERASE_SEQ_ERR ((uint32_t)0x10000000) -#define SD_OCR_BAD_ERASE_PARAM ((uint32_t)0x08000000) -#define SD_OCR_WRITE_PROT_VIOLATION ((uint32_t)0x04000000) -#define SD_OCR_LOCK_UNLOCK_FAILED ((uint32_t)0x01000000) -#define SD_OCR_COM_CRC_FAILED ((uint32_t)0x00800000) -#define SD_OCR_ILLEGAL_CMD ((uint32_t)0x00400000) -#define SD_OCR_CARD_ECC_FAILED ((uint32_t)0x00200000) -#define SD_OCR_CC_ERROR ((uint32_t)0x00100000) -#define SD_OCR_GENERAL_UNKNOWN_ERROR ((uint32_t)0x00080000) -#define SD_OCR_STREAM_READ_UNDERRUN ((uint32_t)0x00040000) -#define SD_OCR_STREAM_WRITE_OVERRUN ((uint32_t)0x00020000) -#define SD_OCR_CID_CSD_OVERWRITE ((uint32_t)0x00010000) -#define SD_OCR_WP_ERASE_SKIP ((uint32_t)0x00008000) -#define SD_OCR_CARD_ECC_DISABLED ((uint32_t)0x00004000) -#define SD_OCR_ERASE_RESET ((uint32_t)0x00002000) -#define SD_OCR_AKE_SEQ_ERROR ((uint32_t)0x00000008) -#define SD_OCR_ERRORBITS ((uint32_t)0xFDFFE008) - -/** - * @brief Masks for R6 Response - */ -#define SD_R6_GENERAL_UNKNOWN_ERROR ((uint32_t)0x00002000) -#define SD_R6_ILLEGAL_CMD ((uint32_t)0x00004000) -#define SD_R6_COM_CRC_FAILED ((uint32_t)0x00008000) - -#define SD_VOLTAGE_WINDOW_SD ((uint32_t)0x80100000) -#define SD_HIGH_CAPACITY ((uint32_t)0x40000000) -#define SD_STD_CAPACITY ((uint32_t)0x00000000) -#define SD_CHECK_PATTERN ((uint32_t)0x000001AA) - -#define SD_MAX_VOLT_TRIAL ((uint32_t)0x0000FFFF) -#define SD_ALLZERO ((uint32_t)0x00000000) - -#define SD_WIDE_BUS_SUPPORT ((uint32_t)0x00040000) -#define SD_SINGLE_BUS_SUPPORT ((uint32_t)0x00010000) -#define SD_CARD_LOCKED ((uint32_t)0x02000000) - -#define SD_DATATIMEOUT ((uint32_t)0xFFFFFFFF) -#define SD_0TO7BITS ((uint32_t)0x000000FF) -#define SD_8TO15BITS ((uint32_t)0x0000FF00) -#define SD_16TO23BITS ((uint32_t)0x00FF0000) -#define SD_24TO31BITS ((uint32_t)0xFF000000) -#define SD_MAX_DATA_LENGTH ((uint32_t)0x01FFFFFF) - -#define SD_HALFFIFO ((uint32_t)0x00000008) -#define SD_HALFFIFOBYTES ((uint32_t)0x00000020) - -/** - * @brief Command Class Supported - */ -#define SD_CCCC_LOCK_UNLOCK ((uint32_t)0x00000080) -#define SD_CCCC_WRITE_PROT ((uint32_t)0x00000040) -#define SD_CCCC_ERASE ((uint32_t)0x00000020) - -/** - * @brief Following commands are SD Card Specific commands. - * SDIO_APP_CMD should be sent before sending these commands. - */ -#define SD_SDIO_SEND_IF_COND ((uint32_t)SD_CMD_HS_SEND_EXT_CSD) - -/** - * @} - */ - -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/** @addtogroup SD_Private_Functions_Prototypes - * @{ - */ -static HAL_SD_ErrorTypedef SD_Initialize_Cards(SD_HandleTypeDef *hsd); -static HAL_SD_ErrorTypedef SD_Select_Deselect(SD_HandleTypeDef *hsd, uint64_t addr); -static HAL_SD_ErrorTypedef SD_PowerON(SD_HandleTypeDef *hsd); -static HAL_SD_ErrorTypedef SD_PowerOFF(SD_HandleTypeDef *hsd); -static HAL_SD_ErrorTypedef SD_SendStatus(SD_HandleTypeDef *hsd, uint32_t *pCardStatus); -static HAL_SD_CardStateTypedef SD_GetState(SD_HandleTypeDef *hsd); -static HAL_SD_ErrorTypedef SD_IsCardProgramming(SD_HandleTypeDef *hsd, uint8_t *pStatus); -static HAL_SD_ErrorTypedef SD_CmdError(SD_HandleTypeDef *hsd); -static HAL_SD_ErrorTypedef SD_CmdResp1Error(SD_HandleTypeDef *hsd, uint8_t SD_CMD); -static HAL_SD_ErrorTypedef SD_CmdResp7Error(SD_HandleTypeDef *hsd); -static HAL_SD_ErrorTypedef SD_CmdResp3Error(SD_HandleTypeDef *hsd); -static HAL_SD_ErrorTypedef SD_CmdResp2Error(SD_HandleTypeDef *hsd); -static HAL_SD_ErrorTypedef SD_CmdResp6Error(SD_HandleTypeDef *hsd, uint8_t SD_CMD, uint16_t *pRCA); -static HAL_SD_ErrorTypedef SD_WideBus_Enable(SD_HandleTypeDef *hsd); -static HAL_SD_ErrorTypedef SD_WideBus_Disable(SD_HandleTypeDef *hsd); -static HAL_SD_ErrorTypedef SD_FindSCR(SD_HandleTypeDef *hsd, uint32_t *pSCR); -static void SD_DMA_RxCplt(DMA_HandleTypeDef *hdma); -static void SD_DMA_RxError(DMA_HandleTypeDef *hdma); -static void SD_DMA_TxCplt(DMA_HandleTypeDef *hdma); -static void SD_DMA_TxError(DMA_HandleTypeDef *hdma); -/** - * @} - */ -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup SD_Exported_Functions - * @{ - */ - -/** @addtogroup SD_Exported_Functions_Group1 - * @brief Initialization and de-initialization functions - * -@verbatim - ============================================================================== - ##### Initialization and de-initialization functions ##### - ============================================================================== - [..] - This section provides functions allowing to initialize/de-initialize the SD - card device to be ready for use. - - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the SD card according to the specified parameters in the - SD_HandleTypeDef and create the associated handle. - * @param hsd: SD handle - * @param SDCardInfo: HAL_SD_CardInfoTypedef structure for SD card information - * @retval HAL SD error state - */ -HAL_SD_ErrorTypedef HAL_SD_Init(SD_HandleTypeDef *hsd, HAL_SD_CardInfoTypedef *SDCardInfo) -{ - __IO HAL_SD_ErrorTypedef errorstate = SD_OK; - SD_InitTypeDef tmpinit; - - /* Allocate lock resource and initialize it */ - hsd->Lock = HAL_UNLOCKED; - /* Initialize the low level hardware (MSP) */ - HAL_SD_MspInit(hsd); - - /* Default SDIO peripheral configuration for SD card initialization */ - tmpinit.ClockEdge = SDIO_CLOCK_EDGE_RISING; - tmpinit.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE; - tmpinit.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE; - tmpinit.BusWide = SDIO_BUS_WIDE_1B; - tmpinit.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE; - tmpinit.ClockDiv = SDIO_INIT_CLK_DIV; - - /* Initialize SDIO peripheral interface with default configuration */ - SDIO_Init(hsd->Instance, tmpinit); - - /* Identify card operating voltage */ - errorstate = SD_PowerON(hsd); - - if(errorstate != SD_OK) - { - return errorstate; - } - - /* Initialize the present SDIO card(s) and put them in idle state */ - errorstate = SD_Initialize_Cards(hsd); - - if (errorstate != SD_OK) - { - return errorstate; - } - - /* Read CSD/CID MSD registers */ - errorstate = HAL_SD_Get_CardInfo(hsd, SDCardInfo); - - if (errorstate == SD_OK) - { - /* Select the Card */ - errorstate = SD_Select_Deselect(hsd, (uint32_t)(((uint32_t)SDCardInfo->RCA) << 16)); - } - - /* Configure SDIO peripheral interface */ - SDIO_Init(hsd->Instance, hsd->Init); - - return errorstate; -} - -/** - * @brief De-Initializes the SD card. - * @param hsd: SD handle - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SD_DeInit(SD_HandleTypeDef *hsd) -{ - - /* Set SD power state to off */ - SD_PowerOFF(hsd); - - /* De-Initialize the MSP layer */ - HAL_SD_MspDeInit(hsd); - - return HAL_OK; -} - - -/** - * @brief Initializes the SD MSP. - * @param hsd: SD handle - * @retval None - */ -__weak void HAL_SD_MspInit(SD_HandleTypeDef *hsd) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_SD_MspInit could be implemented in the user file - */ -} - -/** - * @brief De-Initialize SD MSP. - * @param hsd: SD handle - * @retval None - */ -__weak void HAL_SD_MspDeInit(SD_HandleTypeDef *hsd) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_SD_MspDeInit could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @addtogroup SD_Exported_Functions_Group2 - * @brief Data transfer functions - * -@verbatim - ============================================================================== - ##### IO operation functions ##### - ============================================================================== - [..] - This subsection provides a set of functions allowing to manage the data - transfer from/to SD card. - -@endverbatim - * @{ - */ - -/** - * @brief Reads block(s) from a specified address in a card. The Data transfer - * is managed by polling mode. - * @param hsd: SD handle - * @param pReadBuffer: pointer to the buffer that will contain the received data - * @param ReadAddr: Address from where data is to be read - * @param BlockSize: SD card Data block size - * @note BlockSize must be 512 bytes. - * @param NumberOfBlocks: Number of SD blocks to read - * @retval SD Card error state - */ -HAL_SD_ErrorTypedef HAL_SD_ReadBlocks(SD_HandleTypeDef *hsd, uint32_t *pReadBuffer, uint64_t ReadAddr, uint32_t BlockSize, uint32_t NumberOfBlocks) -{ - SDIO_CmdInitTypeDef sdio_cmdinitstructure; - SDIO_DataInitTypeDef sdio_datainitstructure; - HAL_SD_ErrorTypedef errorstate = SD_OK; - uint32_t count = 0, *tempbuff = (uint32_t *)pReadBuffer; - - /* Initialize data control register */ - hsd->Instance->DCTRL = 0; - - if (hsd->CardType == HIGH_CAPACITY_SD_CARD) - { - BlockSize = 512; - ReadAddr /= 512; - } - - /* Set Block Size for Card */ - sdio_cmdinitstructure.Argument = (uint32_t) BlockSize; - sdio_cmdinitstructure.CmdIndex = SD_CMD_SET_BLOCKLEN; - sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT; - sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO; - sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_SET_BLOCKLEN); - - if (errorstate != SD_OK) - { - return errorstate; - } - - /* Configure the SD DPSM (Data Path State Machine) */ - sdio_datainitstructure.DataTimeOut = SD_DATATIMEOUT; - sdio_datainitstructure.DataLength = NumberOfBlocks * BlockSize; - sdio_datainitstructure.DataBlockSize = DATA_BLOCK_SIZE; - sdio_datainitstructure.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO; - sdio_datainitstructure.TransferMode = SDIO_TRANSFER_MODE_BLOCK; - sdio_datainitstructure.DPSM = SDIO_DPSM_ENABLE; - SDIO_DataConfig(hsd->Instance, &sdio_datainitstructure); - - if(NumberOfBlocks > 1) - { - /* Send CMD18 READ_MULT_BLOCK with argument data address */ - sdio_cmdinitstructure.CmdIndex = SD_CMD_READ_MULT_BLOCK; - } - else - { - /* Send CMD17 READ_SINGLE_BLOCK */ - sdio_cmdinitstructure.CmdIndex = SD_CMD_READ_SINGLE_BLOCK; - } - - sdio_cmdinitstructure.Argument = (uint32_t)ReadAddr; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Read block(s) in polling mode */ - if(NumberOfBlocks > 1) - { - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_READ_MULT_BLOCK); - - if (errorstate != SD_OK) - { - return errorstate; - } - - /* Poll on SDIO flags */ - while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND | SDIO_FLAG_STBITERR)) - { - if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXFIFOHF)) - { - /* Read data from SDIO Rx FIFO */ - for (count = 0; count < 8; count++) - { - *(tempbuff + count) = SDIO_ReadFIFO(hsd->Instance); - } - - tempbuff += 8; - } - } - } - else - { - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_READ_SINGLE_BLOCK); - - if (errorstate != SD_OK) - { - return errorstate; - } - - /* In case of single block transfer, no need of stop transfer at all */ - while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND | SDIO_FLAG_STBITERR)) - { - if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXFIFOHF)) - { - /* Read data from SDIO Rx FIFO */ - for (count = 0; count < 8; count++) - { - *(tempbuff + count) = SDIO_ReadFIFO(hsd->Instance); - } - - tempbuff += 8; - } - } - } - - /* Send stop transmission command in case of multiblock read */ - if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_DATAEND) && (NumberOfBlocks > 1)) - { - if ((hsd->CardType == STD_CAPACITY_SD_CARD_V1_1) ||\ - (hsd->CardType == STD_CAPACITY_SD_CARD_V2_0) ||\ - (hsd->CardType == HIGH_CAPACITY_SD_CARD)) - { - /* Send stop transmission command */ - errorstate = HAL_SD_StopTransfer(hsd); - } - } - - /* Get error state */ - if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT)) - { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_DTIMEOUT); - - errorstate = SD_DATA_TIMEOUT; - - return errorstate; - } - else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL)) - { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_DCRCFAIL); - - errorstate = SD_DATA_CRC_FAIL; - - return errorstate; - } - else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR)) - { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_RXOVERR); - - errorstate = SD_RX_OVERRUN; - - return errorstate; - } - else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_STBITERR)) - { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_STBITERR); - - errorstate = SD_START_BIT_ERR; - - return errorstate; - } - else - { - /* No error flag set */ - } - - count = SD_DATATIMEOUT; - - /* Empty FIFO if there is still any data */ - while ((__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXDAVL)) && (count > 0)) - { - *tempbuff = SDIO_ReadFIFO(hsd->Instance); - tempbuff++; - count--; - } - - /* Clear all the static flags */ - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); - - return errorstate; -} - -/** - * @brief Allows to write block(s) to a specified address in a card. The Data - * transfer is managed by polling mode. - * @param hsd: SD handle - * @param pWriteBuffer: pointer to the buffer that will contain the data to transmit - * @param WriteAddr: Address from where data is to be written - * @param BlockSize: SD card Data block size - * @note BlockSize must be 512 bytes. - * @param NumberOfBlocks: Number of SD blocks to write - * @retval SD Card error state - */ -HAL_SD_ErrorTypedef HAL_SD_WriteBlocks(SD_HandleTypeDef *hsd, uint32_t *pWriteBuffer, uint64_t WriteAddr, uint32_t BlockSize, uint32_t NumberOfBlocks) -{ - SDIO_CmdInitTypeDef sdio_cmdinitstructure; - SDIO_DataInitTypeDef sdio_datainitstructure; - HAL_SD_ErrorTypedef errorstate = SD_OK; - uint32_t totalnumberofbytes = 0, bytestransferred = 0, count = 0, restwords = 0; - uint32_t *tempbuff = (uint32_t *)pWriteBuffer; - uint8_t cardstate = 0; - - /* Initialize data control register */ - hsd->Instance->DCTRL = 0; - - if (hsd->CardType == HIGH_CAPACITY_SD_CARD) - { - BlockSize = 512; - WriteAddr /= 512; - } - - /* Set Block Size for Card */ - sdio_cmdinitstructure.Argument = (uint32_t)BlockSize; - sdio_cmdinitstructure.CmdIndex = SD_CMD_SET_BLOCKLEN; - sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT; - sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO; - sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_SET_BLOCKLEN); - - if (errorstate != SD_OK) - { - return errorstate; - } - - if(NumberOfBlocks > 1) - { - /* Send CMD25 WRITE_MULT_BLOCK with argument data address */ - sdio_cmdinitstructure.CmdIndex = SD_CMD_WRITE_MULT_BLOCK; - } - else - { - /* Send CMD24 WRITE_SINGLE_BLOCK */ - sdio_cmdinitstructure.CmdIndex = SD_CMD_WRITE_SINGLE_BLOCK; - } - - sdio_cmdinitstructure.Argument = (uint32_t)WriteAddr; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - if(NumberOfBlocks > 1) - { - errorstate = SD_CmdResp1Error(hsd, SD_CMD_WRITE_MULT_BLOCK); - } - else - { - errorstate = SD_CmdResp1Error(hsd, SD_CMD_WRITE_SINGLE_BLOCK); - } - - if (errorstate != SD_OK) - { - return errorstate; - } - - /* Set total number of bytes to write */ - totalnumberofbytes = NumberOfBlocks * BlockSize; - - /* Configure the SD DPSM (Data Path State Machine) */ - sdio_datainitstructure.DataTimeOut = SD_DATATIMEOUT; - sdio_datainitstructure.DataLength = NumberOfBlocks * BlockSize; - sdio_datainitstructure.DataBlockSize = SDIO_DATABLOCK_SIZE_512B; - sdio_datainitstructure.TransferDir = SDIO_TRANSFER_DIR_TO_CARD; - sdio_datainitstructure.TransferMode = SDIO_TRANSFER_MODE_BLOCK; - sdio_datainitstructure.DPSM = SDIO_DPSM_ENABLE; - SDIO_DataConfig(hsd->Instance, &sdio_datainitstructure); - - /* Write block(s) in polling mode */ - if(NumberOfBlocks > 1) - { - while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_TXUNDERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND | SDIO_FLAG_STBITERR)) - { - if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_TXFIFOHE)) - { - if ((totalnumberofbytes - bytestransferred) < 32) - { - restwords = ((totalnumberofbytes - bytestransferred) % 4 == 0) ? ((totalnumberofbytes - bytestransferred) / 4) : (( totalnumberofbytes - bytestransferred) / 4 + 1); - - /* Write data to SDIO Tx FIFO */ - for (count = 0; count < restwords; count++) - { - SDIO_WriteFIFO(hsd->Instance, tempbuff); - tempbuff++; - bytestransferred += 4; - } - } - else - { - /* Write data to SDIO Tx FIFO */ - for (count = 0; count < 8; count++) - { - SDIO_WriteFIFO(hsd->Instance, (tempbuff + count)); - } - - tempbuff += 8; - bytestransferred += 32; - } - } - } - } - else - { - /* In case of single data block transfer no need of stop command at all */ - while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_TXUNDERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND | SDIO_FLAG_STBITERR)) - { - if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_TXFIFOHE)) - { - if ((totalnumberofbytes - bytestransferred) < 32) - { - restwords = ((totalnumberofbytes - bytestransferred) % 4 == 0) ? ((totalnumberofbytes - bytestransferred) / 4) : (( totalnumberofbytes - bytestransferred) / 4 + 1); - - /* Write data to SDIO Tx FIFO */ - for (count = 0; count < restwords; count++) - { - SDIO_WriteFIFO(hsd->Instance, tempbuff); - tempbuff++; - bytestransferred += 4; - } - } - else - { - /* Write data to SDIO Tx FIFO */ - for (count = 0; count < 8; count++) - { - SDIO_WriteFIFO(hsd->Instance, (tempbuff + count)); - } - - tempbuff += 8; - bytestransferred += 32; - } - } - } - } - - /* Send stop transmission command in case of multiblock write */ - if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_DATAEND) && (NumberOfBlocks > 1)) - { - if ((hsd->CardType == STD_CAPACITY_SD_CARD_V1_1) || (hsd->CardType == STD_CAPACITY_SD_CARD_V2_0) ||\ - (hsd->CardType == HIGH_CAPACITY_SD_CARD)) - { - /* Send stop transmission command */ - errorstate = HAL_SD_StopTransfer(hsd); - } - } - - /* Get error state */ - if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT)) - { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_DTIMEOUT); - - errorstate = SD_DATA_TIMEOUT; - - return errorstate; - } - else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL)) - { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_DCRCFAIL); - - errorstate = SD_DATA_CRC_FAIL; - - return errorstate; - } - else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_TXUNDERR)) - { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_TXUNDERR); - - errorstate = SD_TX_UNDERRUN; - - return errorstate; - } - else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_STBITERR)) - { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_STBITERR); - - errorstate = SD_START_BIT_ERR; - - return errorstate; - } - else - { - /* No error flag set */ - } - - /* Clear all the static flags */ - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); - - /* Wait till the card is in programming state */ - errorstate = SD_IsCardProgramming(hsd, &cardstate); - - while ((errorstate == SD_OK) && ((cardstate == SD_CARD_PROGRAMMING) || (cardstate == SD_CARD_RECEIVING))) - { - errorstate = SD_IsCardProgramming(hsd, &cardstate); - } - - return errorstate; -} - -/** - * @brief Reads block(s) from a specified address in a card. The Data transfer - * is managed by DMA mode. - * @note This API should be followed by the function HAL_SD_CheckReadOperation() - * to check the completion of the read process - * @param hsd: SD handle - * @param pReadBuffer: Pointer to the buffer that will contain the received data - * @param ReadAddr: Address from where data is to be read - * @param BlockSize: SD card Data block size - * @note BlockSize must be 512 bytes. - * @param NumberOfBlocks: Number of blocks to read. - * @retval SD Card error state - */ -HAL_SD_ErrorTypedef HAL_SD_ReadBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pReadBuffer, uint64_t ReadAddr, uint32_t BlockSize, uint32_t NumberOfBlocks) -{ - SDIO_CmdInitTypeDef sdio_cmdinitstructure; - SDIO_DataInitTypeDef sdio_datainitstructure; - HAL_SD_ErrorTypedef errorstate = SD_OK; - - /* Initialize data control register */ - hsd->Instance->DCTRL = 0; - - /* Initialize handle flags */ - hsd->SdTransferCplt = 0; - hsd->DmaTransferCplt = 0; - hsd->SdTransferErr = SD_OK; - - /* Initialize SD Read operation */ - if(NumberOfBlocks > 1) - { - hsd->SdOperation = SD_READ_MULTIPLE_BLOCK; - } - else - { - hsd->SdOperation = SD_READ_SINGLE_BLOCK; - } - - /* Enable transfer interrupts */ - __HAL_SD_SDIO_ENABLE_IT(hsd, (SDIO_IT_DCRCFAIL |\ - SDIO_IT_DTIMEOUT |\ - SDIO_IT_DATAEND |\ - SDIO_IT_RXOVERR |\ - SDIO_IT_STBITERR)); - - /* Enable SDIO DMA transfer */ - // MM disabled, as this fails on fast cards. __HAL_SD_SDIO_DMA_ENABLE(); - - /* Configure DMA user callbacks */ - hsd->hdmarx->XferCpltCallback = SD_DMA_RxCplt; - hsd->hdmarx->XferErrorCallback = SD_DMA_RxError; - - /* Enable the DMA Stream */ - HAL_DMA_Start_IT(hsd->hdmarx, (uint32_t)&hsd->Instance->FIFO, (uint32_t)pReadBuffer, (uint32_t)(BlockSize * NumberOfBlocks)/4); - - sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT; - sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO; - sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE; - - if (hsd->CardType == HIGH_CAPACITY_SD_CARD) - { - BlockSize = 512; - ReadAddr /= 512; - } else { - - /* Set Block Size for Card */ - sdio_cmdinitstructure.Argument = (uint32_t)BlockSize; - sdio_cmdinitstructure.CmdIndex = SD_CMD_SET_BLOCKLEN; - - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_SET_BLOCKLEN); - - if (errorstate != SD_OK) - { - return errorstate; - } - } - - /* Configure the SD DPSM (Data Path State Machine) */ - sdio_datainitstructure.DataTimeOut = SD_DATATIMEOUT; - sdio_datainitstructure.DataLength = BlockSize * NumberOfBlocks; - sdio_datainitstructure.DataBlockSize = SDIO_DATABLOCK_SIZE_512B; - sdio_datainitstructure.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO; - sdio_datainitstructure.TransferMode = SDIO_TRANSFER_MODE_BLOCK; - sdio_datainitstructure.DPSM = SDIO_DPSM_ENABLE; - - // We cannot enable DMA too early on UHS-I class 3 SD cards, or else the - // data is just discarded before the dpsm is started. - __HAL_SD_SDIO_DMA_ENABLE(); - - SDIO_DataConfig(hsd->Instance, &sdio_datainitstructure); - - /* Check number of blocks command */ - if(NumberOfBlocks > 1) - { - /* Send CMD18 READ_MULT_BLOCK with argument data address */ - sdio_cmdinitstructure.CmdIndex = SD_CMD_READ_MULT_BLOCK; - } - else - { - /* Send CMD17 READ_SINGLE_BLOCK */ - sdio_cmdinitstructure.CmdIndex = SD_CMD_READ_SINGLE_BLOCK; - } - - sdio_cmdinitstructure.Argument = (uint32_t)ReadAddr; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - if(NumberOfBlocks > 1) - { - errorstate = SD_CmdResp1Error(hsd, SD_CMD_READ_MULT_BLOCK); - } - else - { - errorstate = SD_CmdResp1Error(hsd, SD_CMD_READ_SINGLE_BLOCK); - } - - /* Update the SD transfer error in SD handle */ - hsd->SdTransferErr = errorstate; - - return errorstate; -} - - -/** - * @brief Writes block(s) to a specified address in a card. The Data transfer - * is managed by DMA mode. - * @note This API should be followed by the function HAL_SD_CheckWriteOperation() - * to check the completion of the write process (by SD current status polling). - * @param hsd: SD handle - * @param pWriteBuffer: pointer to the buffer that will contain the data to transmit - * @param WriteAddr: Address from where data is to be read - * @param BlockSize: the SD card Data block size - * @note BlockSize must be 512 bytes. - * @param NumberOfBlocks: Number of blocks to write - * @retval SD Card error state - */ -HAL_SD_ErrorTypedef HAL_SD_WriteBlocks_DMA(SD_HandleTypeDef *hsd, uint32_t *pWriteBuffer, uint64_t WriteAddr, uint32_t BlockSize, uint32_t NumberOfBlocks) -{ - SDIO_CmdInitTypeDef sdio_cmdinitstructure; - SDIO_DataInitTypeDef sdio_datainitstructure; - HAL_SD_ErrorTypedef errorstate = SD_OK; - - /* Initialize data control register */ - hsd->Instance->DCTRL = 0; - - /* Initialize handle flags */ - hsd->SdTransferCplt = 0; - hsd->DmaTransferCplt = 0; - hsd->SdTransferErr = SD_OK; - - /* Initialize SD Write operation */ - if(NumberOfBlocks > 1) - { - hsd->SdOperation = SD_WRITE_MULTIPLE_BLOCK; - } - else - { - hsd->SdOperation = SD_WRITE_SINGLE_BLOCK; - } - - /* Enable transfer interrupts */ - __HAL_SD_SDIO_ENABLE_IT(hsd, (SDIO_IT_DCRCFAIL |\ - SDIO_IT_DTIMEOUT |\ - SDIO_IT_DATAEND |\ - SDIO_IT_TXUNDERR |\ - SDIO_IT_STBITERR)); - - /* Configure DMA user callbacks */ - hsd->hdmatx->XferCpltCallback = SD_DMA_TxCplt; - hsd->hdmatx->XferErrorCallback = SD_DMA_TxError; - - /* Enable the DMA Stream */ - HAL_DMA_Start_IT(hsd->hdmatx, (uint32_t)pWriteBuffer, (uint32_t)&hsd->Instance->FIFO, (uint32_t)(BlockSize * NumberOfBlocks)/4); - - /* Enable SDIO DMA transfer */ - // MM disabled, as this fails on fast cards. __HAL_SD_SDIO_DMA_ENABLE(); - - sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT; - sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO; - sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE; - - if (hsd->CardType == HIGH_CAPACITY_SD_CARD) - { - BlockSize = 512; - WriteAddr /= 512; - } else { - /* Set Block Size for Card */ - sdio_cmdinitstructure.Argument = (uint32_t)BlockSize; - sdio_cmdinitstructure.CmdIndex = SD_CMD_SET_BLOCKLEN; - - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_SET_BLOCKLEN); - - if (errorstate != SD_OK) - { - return errorstate; - } - } - - /* Check number of blocks command */ - if(NumberOfBlocks <= 1) - { - /* Send CMD24 WRITE_SINGLE_BLOCK */ - sdio_cmdinitstructure.CmdIndex = SD_CMD_WRITE_SINGLE_BLOCK; - } - else - { - /* MM: Prepare for write */ - sdio_cmdinitstructure.Argument = (uint32_t)(hsd->RCA << 16); - sdio_cmdinitstructure.CmdIndex = SD_CMD_APP_CMD; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - errorstate = SD_CmdResp1Error(hsd, SD_CMD_APP_CMD); - if (errorstate != SD_OK) - { - return errorstate; - } - sdio_cmdinitstructure.Argument = (uint32_t)NumberOfBlocks; - sdio_cmdinitstructure.CmdIndex = SD_CMD_SET_BLOCK_COUNT; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - errorstate = SD_CmdResp1Error(hsd, SD_CMD_SET_BLOCK_COUNT); - if (errorstate != SD_OK) - { - return errorstate; - } - - /* /MM */ - - /* Send CMD25 WRITE_MULT_BLOCK with argument data address */ - sdio_cmdinitstructure.CmdIndex = SD_CMD_WRITE_MULT_BLOCK; - } - - sdio_cmdinitstructure.Argument = (uint32_t)WriteAddr; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - - /* Check for error conditions */ - if(NumberOfBlocks > 1) - { - errorstate = SD_CmdResp1Error(hsd, SD_CMD_WRITE_MULT_BLOCK); - } - else - { - errorstate = SD_CmdResp1Error(hsd, SD_CMD_WRITE_SINGLE_BLOCK); - } - - if (errorstate != SD_OK) - { - return errorstate; - } - - /* Configure the SD DPSM (Data Path State Machine) */ - sdio_datainitstructure.DataTimeOut = SD_DATATIMEOUT; - sdio_datainitstructure.DataLength = BlockSize * NumberOfBlocks; - sdio_datainitstructure.DataBlockSize = SDIO_DATABLOCK_SIZE_512B; - sdio_datainitstructure.TransferDir = SDIO_TRANSFER_DIR_TO_CARD; - sdio_datainitstructure.TransferMode = SDIO_TRANSFER_MODE_BLOCK; - sdio_datainitstructure.DPSM = SDIO_DPSM_ENABLE; - - // We cannot enable DMA too early on UHS-I class 3 SD cards, or else the - // data is just discarded before the dpsm is started. - __HAL_SD_SDIO_DMA_ENABLE(); - - SDIO_DataConfig(hsd->Instance, &sdio_datainitstructure); - - hsd->SdTransferErr = errorstate; - - return errorstate; -} - -/** - * @brief This function waits until the SD DMA data read transfer is finished. - * This API should be called after HAL_SD_ReadBlocks_DMA() function - * to insure that all data sent by the card is already transferred by the - * DMA controller. - * @param hsd: SD handle - * @param Timeout: Timeout duration - * @retval SD Card error state - */ -HAL_SD_ErrorTypedef HAL_SD_CheckReadOperation(SD_HandleTypeDef *hsd, uint32_t Timeout) -{ - HAL_SD_ErrorTypedef errorstate = SD_OK; - uint32_t timeout = Timeout; - uint32_t tmp1, tmp2; - HAL_SD_ErrorTypedef tmp3; - - /* Wait for DMA/SD transfer end or SD error variables to be in SD handle */ - tmp1 = hsd->DmaTransferCplt; - tmp2 = hsd->SdTransferCplt; - tmp3 = (HAL_SD_ErrorTypedef)hsd->SdTransferErr; - - while ((tmp1 == 0) && (tmp2 == 0) && (tmp3 == SD_OK) && (timeout > 0)) - { - tmp1 = hsd->DmaTransferCplt; - tmp2 = hsd->SdTransferCplt; - tmp3 = (HAL_SD_ErrorTypedef)hsd->SdTransferErr; - timeout--; - } - - timeout = Timeout; - - /* Wait until the Rx transfer is no longer active. IE. fifo is empty. -Once FIFO is empty, the DMA will have finished and DmaTransferCplt should -be true */ - while((__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXACT)) && (timeout > 0)) - { - timeout--; - } - - /* Send stop command in multiblock read */ - if (hsd->SdOperation == SD_READ_MULTIPLE_BLOCK) - { - errorstate = HAL_SD_StopTransfer(hsd); - } - - if ((timeout == 0) && (errorstate == SD_OK)) - { - errorstate = SD_DATA_TIMEOUT; - } - - /* Clear all the static flags */ - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); - - /* Return error state */ - if (hsd->SdTransferErr != SD_OK) - { - return (HAL_SD_ErrorTypedef)(hsd->SdTransferErr); - } - - return errorstate; -} - -/** - * @brief This function waits until the SD DMA data write transfer is finished. - * This API should be called after HAL_SD_WriteBlocks_DMA() function - * to insure that all data sent by the card is already transferred by the - * DMA controller. - * @param hsd: SD handle - * @param Timeout: Timeout duration - * @retval SD Card error state - */ -HAL_SD_ErrorTypedef HAL_SD_CheckWriteOperation(SD_HandleTypeDef *hsd, uint32_t Timeout) -{ - HAL_SD_ErrorTypedef errorstate = SD_OK; - uint32_t timeout = Timeout; - uint32_t tmp1, tmp2; - HAL_SD_ErrorTypedef tmp3; - - /* Wait for DMA/SD transfer end or SD error variables to be in SD handle */ - tmp1 = hsd->DmaTransferCplt; - tmp2 = hsd->SdTransferCplt; - tmp3 = (HAL_SD_ErrorTypedef)hsd->SdTransferErr; - - while ((tmp1 == 0) && (tmp2 == 0) && (tmp3 == SD_OK) && (timeout > 0)) - { - tmp1 = hsd->DmaTransferCplt; - tmp2 = hsd->SdTransferCplt; - tmp3 = (HAL_SD_ErrorTypedef)hsd->SdTransferErr; - timeout--; - } - - timeout = Timeout; - - /* Wait until the Tx transfer is no longer active */ - while((__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_TXACT)) && (timeout > 0)) - { - timeout--; - } - - /* Send stop command in multiblock write */ - if (hsd->SdOperation == SD_WRITE_MULTIPLE_BLOCK) - { - errorstate = HAL_SD_StopTransfer(hsd); - } - - if ((timeout == 0) && (errorstate == SD_OK)) - { - errorstate = SD_DATA_TIMEOUT; - } - - /* Clear all the static flags */ - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); - - /* Return error state */ - if (hsd->SdTransferErr != SD_OK) - { - return (HAL_SD_ErrorTypedef)(hsd->SdTransferErr); - } - - /* Wait until write is complete */ - while(HAL_SD_GetStatus(hsd) != SD_TRANSFER_OK) - { - } - - return errorstate; -} - -/** - * @brief Erases the specified memory area of the given SD card. - * @param hsd: SD handle - * @param startaddr: Start byte address - * @param endaddr: End byte address - * @retval SD Card error state - */ -HAL_SD_ErrorTypedef HAL_SD_Erase(SD_HandleTypeDef *hsd, uint64_t startaddr, uint64_t endaddr) -{ - HAL_SD_ErrorTypedef errorstate = SD_OK; - SDIO_CmdInitTypeDef sdio_cmdinitstructure; - - uint32_t delay = 0; - __IO uint32_t maxdelay = 0; - uint8_t cardstate = 0; - - /* Check if the card command class supports erase command */ - if (((hsd->CSD[1] >> 20) & SD_CCCC_ERASE) == 0) - { - errorstate = SD_REQUEST_NOT_APPLICABLE; - - return errorstate; - } - - /* Get max delay value */ - maxdelay = 120000 / (((hsd->Instance->CLKCR) & 0xFF) + 2); - - if((SDIO_GetResponse(SDIO_RESP1) & SD_CARD_LOCKED) == SD_CARD_LOCKED) - { - errorstate = SD_LOCK_UNLOCK_FAILED; - - return errorstate; - } - - /* Get start and end block for high capacity cards */ - if (hsd->CardType == HIGH_CAPACITY_SD_CARD) - { - startaddr /= 512; - endaddr /= 512; - } - - /* According to sd-card spec 1.0 ERASE_GROUP_START (CMD32) and erase_group_end(CMD33) */ - if ((hsd->CardType == STD_CAPACITY_SD_CARD_V1_1) || (hsd->CardType == STD_CAPACITY_SD_CARD_V2_0) ||\ - (hsd->CardType == HIGH_CAPACITY_SD_CARD)) - { - /* Send CMD32 SD_ERASE_GRP_START with argument as addr */ - sdio_cmdinitstructure.Argument =(uint32_t)startaddr; - sdio_cmdinitstructure.CmdIndex = SD_CMD_SD_ERASE_GRP_START; - sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT; - sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO; - sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_SD_ERASE_GRP_START); - - if (errorstate != SD_OK) - { - return errorstate; - } - - /* Send CMD33 SD_ERASE_GRP_END with argument as addr */ - sdio_cmdinitstructure.Argument = (uint32_t)endaddr; - sdio_cmdinitstructure.CmdIndex = SD_CMD_SD_ERASE_GRP_END; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_SD_ERASE_GRP_END); - - if (errorstate != SD_OK) - { - return errorstate; - } - } - - /* Send CMD38 ERASE */ - sdio_cmdinitstructure.Argument = 0; - sdio_cmdinitstructure.CmdIndex = SD_CMD_ERASE; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_ERASE); - - if (errorstate != SD_OK) - { - return errorstate; - } - - for (; delay < maxdelay; delay++) - { - } - - /* Wait until the card is in programming state */ - errorstate = SD_IsCardProgramming(hsd, &cardstate); - - delay = SD_DATATIMEOUT; - - while ((delay > 0) && (errorstate == SD_OK) && ((cardstate == SD_CARD_PROGRAMMING) || (cardstate == SD_CARD_RECEIVING))) - { - errorstate = SD_IsCardProgramming(hsd, &cardstate); - delay--; - } - - return errorstate; -} - -/** - * @brief This function handles SD card interrupt request. - * @param hsd: SD handle - * @retval None - */ -void HAL_SD_IRQHandler(SD_HandleTypeDef *hsd) -{ - /* Check for SDIO interrupt flags */ - if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_IT_DATAEND)) - { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_IT_DATAEND); - - /* SD transfer is complete */ - hsd->SdTransferCplt = 1; - - /* No transfer error */ - hsd->SdTransferErr = SD_OK; - - HAL_SD_XferCpltCallback(hsd); - } - else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_IT_DCRCFAIL)) - { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_DCRCFAIL); - - hsd->SdTransferErr = SD_DATA_CRC_FAIL; - - HAL_SD_XferErrorCallback(hsd); - - } - else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_IT_DTIMEOUT)) - { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_DTIMEOUT); - - hsd->SdTransferErr = SD_DATA_TIMEOUT; - - HAL_SD_XferErrorCallback(hsd); - } - else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_IT_RXOVERR)) - { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_RXOVERR); - - hsd->SdTransferErr = SD_RX_OVERRUN; - - HAL_SD_XferErrorCallback(hsd); - } - else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_IT_TXUNDERR)) - { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_TXUNDERR); - - hsd->SdTransferErr = SD_TX_UNDERRUN; - - HAL_SD_XferErrorCallback(hsd); - } - else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_IT_STBITERR)) - { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_STBITERR); - - hsd->SdTransferErr = SD_START_BIT_ERR; - - HAL_SD_XferErrorCallback(hsd); - } - else - { - /* No error flag set */ - } - - /* Disable all SDIO peripheral interrupt sources */ - __HAL_SD_SDIO_DISABLE_IT(hsd, SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND |\ - SDIO_IT_TXFIFOHE | SDIO_IT_RXFIFOHF | SDIO_IT_TXUNDERR |\ - SDIO_IT_RXOVERR | SDIO_IT_STBITERR); -} - - -/** - * @brief SD end of transfer callback. - * @param hsd: SD handle - * @retval None - */ -__weak void HAL_SD_XferCpltCallback(SD_HandleTypeDef *hsd) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_SD_XferCpltCallback could be implemented in the user file - */ -} - -/** - * @brief SD Transfer Error callback. - * @param hsd: SD handle - * @retval None - */ -__weak void HAL_SD_XferErrorCallback(SD_HandleTypeDef *hsd) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_SD_XferErrorCallback could be implemented in the user file - */ -} - -/** - * @brief SD Transfer complete Rx callback in non blocking mode. - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -__weak void HAL_SD_DMA_RxCpltCallback(DMA_HandleTypeDef *hdma) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_SD_DMA_RxCpltCallback could be implemented in the user file - */ -} - -/** - * @brief SD DMA transfer complete Rx error callback. - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -__weak void HAL_SD_DMA_RxErrorCallback(DMA_HandleTypeDef *hdma) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_SD_DMA_RxErrorCallback could be implemented in the user file - */ -} - -/** - * @brief SD Transfer complete Tx callback in non blocking mode. - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -__weak void HAL_SD_DMA_TxCpltCallback(DMA_HandleTypeDef *hdma) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_SD_DMA_TxCpltCallback could be implemented in the user file - */ -} - -/** - * @brief SD DMA transfer complete error Tx callback. - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -__weak void HAL_SD_DMA_TxErrorCallback(DMA_HandleTypeDef *hdma) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_SD_DMA_TxErrorCallback could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @addtogroup SD_Exported_Functions_Group3 - * @brief management functions - * -@verbatim - ============================================================================== - ##### Peripheral Control functions ##### - ============================================================================== - [..] - This subsection provides a set of functions allowing to control the SD card - operations. - -@endverbatim - * @{ - */ - -/** - * @brief Returns information about specific card. - * @param hsd: SD handle - * @param pCardInfo: Pointer to a HAL_SD_CardInfoTypedef structure that - * contains all SD cardinformation - * @retval SD Card error state - */ -HAL_SD_ErrorTypedef HAL_SD_Get_CardInfo(SD_HandleTypeDef *hsd, HAL_SD_CardInfoTypedef *pCardInfo) -{ - HAL_SD_ErrorTypedef errorstate = SD_OK; - uint32_t tmp = 0; - - pCardInfo->CardType = (uint8_t)(hsd->CardType); - pCardInfo->RCA = (uint16_t)(hsd->RCA); - - /* Byte 0 */ - tmp = (hsd->CSD[0] & 0xFF000000) >> 24; - pCardInfo->SD_csd.CSDStruct = (uint8_t)((tmp & 0xC0) >> 6); - pCardInfo->SD_csd.SysSpecVersion = (uint8_t)((tmp & 0x3C) >> 2); - pCardInfo->SD_csd.Reserved1 = tmp & 0x03; - - /* Byte 1 */ - tmp = (hsd->CSD[0] & 0x00FF0000) >> 16; - pCardInfo->SD_csd.TAAC = (uint8_t)tmp; - - /* Byte 2 */ - tmp = (hsd->CSD[0] & 0x0000FF00) >> 8; - pCardInfo->SD_csd.NSAC = (uint8_t)tmp; - - /* Byte 3 */ - tmp = hsd->CSD[0] & 0x000000FF; - pCardInfo->SD_csd.MaxBusClkFrec = (uint8_t)tmp; - - /* Byte 4 */ - tmp = (hsd->CSD[1] & 0xFF000000) >> 24; - pCardInfo->SD_csd.CardComdClasses = (uint16_t)(tmp << 4); - - /* Byte 5 */ - tmp = (hsd->CSD[1] & 0x00FF0000) >> 16; - pCardInfo->SD_csd.CardComdClasses |= (uint16_t)((tmp & 0xF0) >> 4); - pCardInfo->SD_csd.RdBlockLen = (uint8_t)(tmp & 0x0F); - - /* Byte 6 */ - tmp = (hsd->CSD[1] & 0x0000FF00) >> 8; - pCardInfo->SD_csd.PartBlockRead = (uint8_t)((tmp & 0x80) >> 7); - pCardInfo->SD_csd.WrBlockMisalign = (uint8_t)((tmp & 0x40) >> 6); - pCardInfo->SD_csd.RdBlockMisalign = (uint8_t)((tmp & 0x20) >> 5); - pCardInfo->SD_csd.DSRImpl = (uint8_t)((tmp & 0x10) >> 4); - pCardInfo->SD_csd.Reserved2 = 0; /*!< Reserved */ - - if ((hsd->CardType == STD_CAPACITY_SD_CARD_V1_1) || (hsd->CardType == STD_CAPACITY_SD_CARD_V2_0)) - { - pCardInfo->SD_csd.DeviceSize = (tmp & 0x03) << 10; - - /* Byte 7 */ - tmp = (uint8_t)(hsd->CSD[1] & 0x000000FF); - pCardInfo->SD_csd.DeviceSize |= (tmp) << 2; - - /* Byte 8 */ - tmp = (uint8_t)((hsd->CSD[2] & 0xFF000000) >> 24); - pCardInfo->SD_csd.DeviceSize |= (tmp & 0xC0) >> 6; - - pCardInfo->SD_csd.MaxRdCurrentVDDMin = (tmp & 0x38) >> 3; - pCardInfo->SD_csd.MaxRdCurrentVDDMax = (tmp & 0x07); - - /* Byte 9 */ - tmp = (uint8_t)((hsd->CSD[2] & 0x00FF0000) >> 16); - pCardInfo->SD_csd.MaxWrCurrentVDDMin = (tmp & 0xE0) >> 5; - pCardInfo->SD_csd.MaxWrCurrentVDDMax = (tmp & 0x1C) >> 2; - pCardInfo->SD_csd.DeviceSizeMul = (tmp & 0x03) << 1; - /* Byte 10 */ - tmp = (uint8_t)((hsd->CSD[2] & 0x0000FF00) >> 8); - pCardInfo->SD_csd.DeviceSizeMul |= (tmp & 0x80) >> 7; - - pCardInfo->CardCapacity = (pCardInfo->SD_csd.DeviceSize + 1) ; - pCardInfo->CardCapacity *= (1 << (pCardInfo->SD_csd.DeviceSizeMul + 2)); - pCardInfo->CardBlockSize = 1 << (pCardInfo->SD_csd.RdBlockLen); - pCardInfo->CardCapacity *= pCardInfo->CardBlockSize; - } - else if (hsd->CardType == HIGH_CAPACITY_SD_CARD) - { - /* Byte 7 */ - tmp = (uint8_t)(hsd->CSD[1] & 0x000000FF); - pCardInfo->SD_csd.DeviceSize = (tmp & 0x3F) << 16; - - /* Byte 8 */ - tmp = (uint8_t)((hsd->CSD[2] & 0xFF000000) >> 24); - - pCardInfo->SD_csd.DeviceSize |= (tmp << 8); - - /* Byte 9 */ - tmp = (uint8_t)((hsd->CSD[2] & 0x00FF0000) >> 16); - - pCardInfo->SD_csd.DeviceSize |= (tmp); - - /* Byte 10 */ - tmp = (uint8_t)((hsd->CSD[2] & 0x0000FF00) >> 8); - - pCardInfo->CardCapacity = (uint64_t)((((uint64_t)pCardInfo->SD_csd.DeviceSize + 1)) * 512 * 1024); - pCardInfo->CardBlockSize = 512; - } - else - { - /* Not supported card type */ - errorstate = SD_ERROR; - } - - pCardInfo->SD_csd.EraseGrSize = (tmp & 0x40) >> 6; - pCardInfo->SD_csd.EraseGrMul = (tmp & 0x3F) << 1; - - /* Byte 11 */ - tmp = (uint8_t)(hsd->CSD[2] & 0x000000FF); - pCardInfo->SD_csd.EraseGrMul |= (tmp & 0x80) >> 7; - pCardInfo->SD_csd.WrProtectGrSize = (tmp & 0x7F); - - /* Byte 12 */ - tmp = (uint8_t)((hsd->CSD[3] & 0xFF000000) >> 24); - pCardInfo->SD_csd.WrProtectGrEnable = (tmp & 0x80) >> 7; - pCardInfo->SD_csd.ManDeflECC = (tmp & 0x60) >> 5; - pCardInfo->SD_csd.WrSpeedFact = (tmp & 0x1C) >> 2; - pCardInfo->SD_csd.MaxWrBlockLen = (tmp & 0x03) << 2; - - /* Byte 13 */ - tmp = (uint8_t)((hsd->CSD[3] & 0x00FF0000) >> 16); - pCardInfo->SD_csd.MaxWrBlockLen |= (tmp & 0xC0) >> 6; - pCardInfo->SD_csd.WriteBlockPaPartial = (tmp & 0x20) >> 5; - pCardInfo->SD_csd.Reserved3 = 0; - pCardInfo->SD_csd.ContentProtectAppli = (tmp & 0x01); - - /* Byte 14 */ - tmp = (uint8_t)((hsd->CSD[3] & 0x0000FF00) >> 8); - pCardInfo->SD_csd.FileFormatGrouop = (tmp & 0x80) >> 7; - pCardInfo->SD_csd.CopyFlag = (tmp & 0x40) >> 6; - pCardInfo->SD_csd.PermWrProtect = (tmp & 0x20) >> 5; - pCardInfo->SD_csd.TempWrProtect = (tmp & 0x10) >> 4; - pCardInfo->SD_csd.FileFormat = (tmp & 0x0C) >> 2; - pCardInfo->SD_csd.ECC = (tmp & 0x03); - - /* Byte 15 */ - tmp = (uint8_t)(hsd->CSD[3] & 0x000000FF); - pCardInfo->SD_csd.CSD_CRC = (tmp & 0xFE) >> 1; - pCardInfo->SD_csd.Reserved4 = 1; - - /* Byte 0 */ - tmp = (uint8_t)((hsd->CID[0] & 0xFF000000) >> 24); - pCardInfo->SD_cid.ManufacturerID = tmp; - - /* Byte 1 */ - tmp = (uint8_t)((hsd->CID[0] & 0x00FF0000) >> 16); - pCardInfo->SD_cid.OEM_AppliID = tmp << 8; - - /* Byte 2 */ - tmp = (uint8_t)((hsd->CID[0] & 0x000000FF00) >> 8); - pCardInfo->SD_cid.OEM_AppliID |= tmp; - - /* Byte 3 */ - tmp = (uint8_t)(hsd->CID[0] & 0x000000FF); - pCardInfo->SD_cid.ProdName1 = tmp << 24; - - /* Byte 4 */ - tmp = (uint8_t)((hsd->CID[1] & 0xFF000000) >> 24); - pCardInfo->SD_cid.ProdName1 |= tmp << 16; - - /* Byte 5 */ - tmp = (uint8_t)((hsd->CID[1] & 0x00FF0000) >> 16); - pCardInfo->SD_cid.ProdName1 |= tmp << 8; - - /* Byte 6 */ - tmp = (uint8_t)((hsd->CID[1] & 0x0000FF00) >> 8); - pCardInfo->SD_cid.ProdName1 |= tmp; - - /* Byte 7 */ - tmp = (uint8_t)(hsd->CID[1] & 0x000000FF); - pCardInfo->SD_cid.ProdName2 = tmp; - - /* Byte 8 */ - tmp = (uint8_t)((hsd->CID[2] & 0xFF000000) >> 24); - pCardInfo->SD_cid.ProdRev = tmp; - - /* Byte 9 */ - tmp = (uint8_t)((hsd->CID[2] & 0x00FF0000) >> 16); - pCardInfo->SD_cid.ProdSN = tmp << 24; - - /* Byte 10 */ - tmp = (uint8_t)((hsd->CID[2] & 0x0000FF00) >> 8); - pCardInfo->SD_cid.ProdSN |= tmp << 16; - - /* Byte 11 */ - tmp = (uint8_t)(hsd->CID[2] & 0x000000FF); - pCardInfo->SD_cid.ProdSN |= tmp << 8; - - /* Byte 12 */ - tmp = (uint8_t)((hsd->CID[3] & 0xFF000000) >> 24); - pCardInfo->SD_cid.ProdSN |= tmp; - - /* Byte 13 */ - tmp = (uint8_t)((hsd->CID[3] & 0x00FF0000) >> 16); - pCardInfo->SD_cid.Reserved1 |= (tmp & 0xF0) >> 4; - pCardInfo->SD_cid.ManufactDate = (tmp & 0x0F) << 8; - - /* Byte 14 */ - tmp = (uint8_t)((hsd->CID[3] & 0x0000FF00) >> 8); - pCardInfo->SD_cid.ManufactDate |= tmp; - - /* Byte 15 */ - tmp = (uint8_t)(hsd->CID[3] & 0x000000FF); - pCardInfo->SD_cid.CID_CRC = (tmp & 0xFE) >> 1; - pCardInfo->SD_cid.Reserved2 = 1; - - return errorstate; -} - -/** - * @brief Enables wide bus operation for the requested card if supported by - * card. - * @param hsd: SD handle - * @param WideMode: Specifies the SD card wide bus mode - * This parameter can be one of the following values: - * @arg SDIO_BUS_WIDE_8B: 8-bit data transfer (Only for MMC) - * @arg SDIO_BUS_WIDE_4B: 4-bit data transfer - * @arg SDIO_BUS_WIDE_1B: 1-bit data transfer - * @retval SD Card error state - */ -HAL_SD_ErrorTypedef HAL_SD_WideBusOperation_Config(SD_HandleTypeDef *hsd, uint32_t WideMode) -{ - HAL_SD_ErrorTypedef errorstate = SD_OK; - SDIO_InitTypeDef tmpinit; - - /* MMC Card does not support this feature */ - if (hsd->CardType == MULTIMEDIA_CARD) - { - errorstate = SD_UNSUPPORTED_FEATURE; - - return errorstate; - } - else if ((hsd->CardType == STD_CAPACITY_SD_CARD_V1_1) || (hsd->CardType == STD_CAPACITY_SD_CARD_V2_0) ||\ - (hsd->CardType == HIGH_CAPACITY_SD_CARD)) - { - if (WideMode == SDIO_BUS_WIDE_8B) - { - errorstate = SD_UNSUPPORTED_FEATURE; - } - else if (WideMode == SDIO_BUS_WIDE_4B) - { - errorstate = SD_WideBus_Enable(hsd); - } - else if (WideMode == SDIO_BUS_WIDE_1B) - { - errorstate = SD_WideBus_Disable(hsd); - } - else - { - /* WideMode is not a valid argument*/ - errorstate = SD_INVALID_PARAMETER; - } - - if (errorstate == SD_OK) - { - /* Configure the SDIO peripheral */ - tmpinit.ClockEdge = hsd->Init.ClockEdge; - tmpinit.ClockBypass = hsd->Init.ClockBypass; - tmpinit.ClockPowerSave = hsd->Init.ClockPowerSave; - tmpinit.BusWide = WideMode; - tmpinit.HardwareFlowControl = hsd->Init.HardwareFlowControl; - tmpinit.ClockDiv = hsd->Init.ClockDiv; - SDIO_Init(hsd->Instance, tmpinit); - } - } - - return errorstate; -} - -/** - * @brief Aborts an ongoing data transfer. - * @param hsd: SD handle - * @retval SD Card error state - */ -HAL_SD_ErrorTypedef HAL_SD_StopTransfer(SD_HandleTypeDef *hsd) -{ - SDIO_CmdInitTypeDef sdio_cmdinitstructure; - HAL_SD_ErrorTypedef errorstate = SD_OK; - - /* Send CMD12 STOP_TRANSMISSION */ - sdio_cmdinitstructure.Argument = 0; - sdio_cmdinitstructure.CmdIndex = SD_CMD_STOP_TRANSMISSION; - sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT; - sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO; - sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_STOP_TRANSMISSION); - - return errorstate; -} - -/** - * @brief Switches the SD card to High Speed mode. - * This API must be used after "Transfer State" - * @note This operation should be followed by the configuration - * of PLL to have SDIOCK clock between 67 and 75 MHz - * @param hsd: SD handle - * @retval SD Card error state - */ -HAL_SD_ErrorTypedef HAL_SD_HighSpeed (SD_HandleTypeDef *hsd) -{ - HAL_SD_ErrorTypedef errorstate = SD_OK; - SDIO_CmdInitTypeDef sdio_cmdinitstructure; - SDIO_DataInitTypeDef sdio_datainitstructure; - - uint8_t SD_hs[64] = {0}; - uint32_t SD_scr[2] = {0, 0}; - uint32_t SD_SPEC = 0 ; - uint32_t count = 0, *tempbuff = (uint32_t *)SD_hs; - - /* Initialize the Data control register */ - hsd->Instance->DCTRL = 0; - - /* Get SCR Register */ - errorstate = SD_FindSCR(hsd, SD_scr); - - if (errorstate != SD_OK) - { - return errorstate; - } - - /* Test the Version supported by the card*/ - SD_SPEC = (SD_scr[1] & 0x01000000) | (SD_scr[1] & 0x02000000); - - if (SD_SPEC != SD_ALLZERO) - { - /* Set Block Size for Card */ - sdio_cmdinitstructure.Argument = (uint32_t)64; - sdio_cmdinitstructure.CmdIndex = SD_CMD_SET_BLOCKLEN; - sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT; - sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO; - sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_SET_BLOCKLEN); - - if (errorstate != SD_OK) - { - return errorstate; - } - - /* Configure the SD DPSM (Data Path State Machine) */ - sdio_datainitstructure.DataTimeOut = SD_DATATIMEOUT; - sdio_datainitstructure.DataLength = 64; - sdio_datainitstructure.DataBlockSize = SDIO_DATABLOCK_SIZE_64B ; - sdio_datainitstructure.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO; - sdio_datainitstructure.TransferMode = SDIO_TRANSFER_MODE_BLOCK; - sdio_datainitstructure.DPSM = SDIO_DPSM_ENABLE; - SDIO_DataConfig(hsd->Instance, &sdio_datainitstructure); - - /* Send CMD6 switch mode */ - sdio_cmdinitstructure.Argument = 0x80FFFF01; - sdio_cmdinitstructure.CmdIndex = SD_CMD_HS_SWITCH; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_HS_SWITCH); - - if (errorstate != SD_OK) - { - return errorstate; - } - - while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND | SDIO_FLAG_STBITERR)) - { - if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXFIFOHF)) - { - for (count = 0; count < 8; count++) - { - *(tempbuff + count) = SDIO_ReadFIFO(hsd->Instance); - } - - tempbuff += 8; - } - } - - if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT)) - { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_DTIMEOUT); - - errorstate = SD_DATA_TIMEOUT; - - return errorstate; - } - else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL)) - { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_DCRCFAIL); - - errorstate = SD_DATA_CRC_FAIL; - - return errorstate; - } - else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR)) - { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_RXOVERR); - - errorstate = SD_RX_OVERRUN; - - return errorstate; - } - else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_STBITERR)) - { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_STBITERR); - - errorstate = SD_START_BIT_ERR; - - return errorstate; - } - else - { - /* No error flag set */ - } - - count = SD_DATATIMEOUT; - - while ((__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXDAVL)) && (count > 0)) - { - *tempbuff = SDIO_ReadFIFO(hsd->Instance); - tempbuff++; - count--; - } - - /* Clear all the static flags */ - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); - - /* Test if the switch mode HS is ok */ - // MM: These bits (0 to 271) are reserved in the spec I'm looking at ??? - // Should be safe to ignore the result. - //if ((SD_hs[13]& 2) != 2) - //{ - //errorstate = SD_UNSUPPORTED_FEATURE; - //} - } - - return errorstate; -} - -/** - * @} - */ - -/** @addtogroup SD_Exported_Functions_Group4 - * @brief Peripheral State functions - * -@verbatim - ============================================================================== - ##### Peripheral State functions ##### - ============================================================================== - [..] - This subsection permits to get in runtime the status of the peripheral - and the data flow. - -@endverbatim - * @{ - */ - -/** - * @brief Returns the current SD card's status. - * @param hsd: SD handle - * @param pSDstatus: Pointer to the buffer that will contain the SD card status - * SD Status register) - * @retval SD Card error state - */ -HAL_SD_ErrorTypedef HAL_SD_SendSDStatus(SD_HandleTypeDef *hsd, uint32_t *pSDstatus) -{ - SDIO_CmdInitTypeDef sdio_cmdinitstructure; - SDIO_DataInitTypeDef sdio_datainitstructure; - HAL_SD_ErrorTypedef errorstate = SD_OK; - uint32_t count = 0; - - /* Check SD response */ - if ((SDIO_GetResponse(SDIO_RESP1) & SD_CARD_LOCKED) == SD_CARD_LOCKED) - { - errorstate = SD_LOCK_UNLOCK_FAILED; - - return errorstate; - } - - /* Set block size for card if it is not equal to current block size for card */ - sdio_cmdinitstructure.Argument = 64; - sdio_cmdinitstructure.CmdIndex = SD_CMD_SET_BLOCKLEN; - sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT; - sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO; - sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_SET_BLOCKLEN); - - if (errorstate != SD_OK) - { - return errorstate; - } - - /* Send CMD55 */ - sdio_cmdinitstructure.Argument = (uint32_t)(hsd->RCA << 16); - sdio_cmdinitstructure.CmdIndex = SD_CMD_APP_CMD; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_APP_CMD); - - if (errorstate != SD_OK) - { - return errorstate; - } - - /* Configure the SD DPSM (Data Path State Machine) */ - sdio_datainitstructure.DataTimeOut = SD_DATATIMEOUT; - sdio_datainitstructure.DataLength = 64; - sdio_datainitstructure.DataBlockSize = SDIO_DATABLOCK_SIZE_64B; - sdio_datainitstructure.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO; - sdio_datainitstructure.TransferMode = SDIO_TRANSFER_MODE_BLOCK; - sdio_datainitstructure.DPSM = SDIO_DPSM_ENABLE; - SDIO_DataConfig(hsd->Instance, &sdio_datainitstructure); - - /* Send ACMD13 (SD_APP_STATUS) with argument as card's RCA */ - sdio_cmdinitstructure.Argument = 0; - sdio_cmdinitstructure.CmdIndex = SD_CMD_SD_APP_STATUS; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_SD_APP_STATUS); - - if (errorstate != SD_OK) - { - return errorstate; - } - - /* Get status data */ - while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND | SDIO_FLAG_STBITERR)) - { - if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXFIFOHF)) - { - for (count = 0; count < 8; count++) - { - *(pSDstatus + count) = SDIO_ReadFIFO(hsd->Instance); - } - - pSDstatus += 8; - } - } - - if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT)) - { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_DTIMEOUT); - - errorstate = SD_DATA_TIMEOUT; - - return errorstate; - } - else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL)) - { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_DCRCFAIL); - - errorstate = SD_DATA_CRC_FAIL; - - return errorstate; - } - else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR)) - { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_RXOVERR); - - errorstate = SD_RX_OVERRUN; - - return errorstate; - } - else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_STBITERR)) - { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_STBITERR); - - errorstate = SD_START_BIT_ERR; - - return errorstate; - } - else - { - /* No error flag set */ - } - - count = SD_DATATIMEOUT; - while ((__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXDAVL)) && (count > 0)) - { - *pSDstatus = SDIO_ReadFIFO(hsd->Instance); - pSDstatus++; - count--; - } - - /* Clear all the static status flags*/ - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); - - return errorstate; -} - -/** - * @brief Gets the current sd card data status. - * @param hsd: SD handle - * @retval Data Transfer state - */ -HAL_SD_TransferStateTypedef HAL_SD_GetStatus(SD_HandleTypeDef *hsd) -{ - HAL_SD_CardStateTypedef cardstate = SD_CARD_TRANSFER; - - /* Get SD card state */ - cardstate = SD_GetState(hsd); - - /* Find SD status according to card state*/ - if (cardstate == SD_CARD_TRANSFER) - { - return SD_TRANSFER_OK; - } - else if(cardstate == SD_CARD_ERROR) - { - return SD_TRANSFER_ERROR; - } - else - { - return SD_TRANSFER_BUSY; - } -} - -/** - * @brief Gets the SD card status. - * @param hsd: SD handle - * @param pCardStatus: Pointer to the HAL_SD_CardStatusTypedef structure that - * will contain the SD card status information - * @retval SD Card error state - */ -HAL_SD_ErrorTypedef HAL_SD_GetCardStatus(SD_HandleTypeDef *hsd, HAL_SD_CardStatusTypedef *pCardStatus) -{ - HAL_SD_ErrorTypedef errorstate = SD_OK; - uint32_t tmp = 0; - uint32_t sd_status[16]; - - errorstate = HAL_SD_SendSDStatus(hsd, sd_status); - - if (errorstate != SD_OK) - { - return errorstate; - } - - /* Byte 0 */ - tmp = (sd_status[0] & 0xC0) >> 6; - pCardStatus->DAT_BUS_WIDTH = (uint8_t)tmp; - - /* Byte 0 */ - tmp = (sd_status[0] & 0x20) >> 5; - pCardStatus->SECURED_MODE = (uint8_t)tmp; - - /* Byte 2 */ - tmp = (sd_status[2] & 0xFF); - pCardStatus->SD_CARD_TYPE = (uint8_t)(tmp << 8); - - /* Byte 3 */ - tmp = (sd_status[3] & 0xFF); - pCardStatus->SD_CARD_TYPE |= (uint8_t)tmp; - - /* Byte 4 */ - tmp = (sd_status[4] & 0xFF); - pCardStatus->SIZE_OF_PROTECTED_AREA = (uint8_t)(tmp << 24); - - /* Byte 5 */ - tmp = (sd_status[5] & 0xFF); - pCardStatus->SIZE_OF_PROTECTED_AREA |= (uint8_t)(tmp << 16); - - /* Byte 6 */ - tmp = (sd_status[6] & 0xFF); - pCardStatus->SIZE_OF_PROTECTED_AREA |= (uint8_t)(tmp << 8); - - /* Byte 7 */ - tmp = (sd_status[7] & 0xFF); - pCardStatus->SIZE_OF_PROTECTED_AREA |= (uint8_t)tmp; - - /* Byte 8 */ - tmp = (sd_status[8] & 0xFF); - pCardStatus->SPEED_CLASS = (uint8_t)tmp; - - /* Byte 9 */ - tmp = (sd_status[9] & 0xFF); - pCardStatus->PERFORMANCE_MOVE = (uint8_t)tmp; - - /* Byte 10 */ - tmp = (sd_status[10] & 0xF0) >> 4; - pCardStatus->AU_SIZE = (uint8_t)tmp; - - /* Byte 11 */ - tmp = (sd_status[11] & 0xFF); - pCardStatus->ERASE_SIZE = (uint8_t)(tmp << 8); - - /* Byte 12 */ - tmp = (sd_status[12] & 0xFF); - pCardStatus->ERASE_SIZE |= (uint8_t)tmp; - - /* Byte 13 */ - tmp = (sd_status[13] & 0xFC) >> 2; - pCardStatus->ERASE_TIMEOUT = (uint8_t)tmp; - - /* Byte 13 */ - tmp = (sd_status[13] & 0x3); - pCardStatus->ERASE_OFFSET = (uint8_t)tmp; - - return errorstate; -} - -/** - * @} - */ - -/** - * @} - */ - -/* Private function ----------------------------------------------------------*/ -/** @addtogroup SD_Private_Functions - * @{ - */ - -/** - * @brief SD DMA transfer complete Rx callback. - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void SD_DMA_RxCplt(DMA_HandleTypeDef *hdma) -{ - SD_HandleTypeDef *hsd = (SD_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent; - - /* DMA transfer is complete */ - hsd->DmaTransferCplt = 1; - - /* Wait until SD transfer is complete */ - while(hsd->SdTransferCplt == 0) - { - } - - /* Disable the DMA channel */ - HAL_DMA_Abort(hdma); - - /* Transfer complete user callback */ - HAL_SD_DMA_RxCpltCallback(hsd->hdmarx); -} - -/** - * @brief SD DMA transfer Error Rx callback. - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void SD_DMA_RxError(DMA_HandleTypeDef *hdma) -{ - SD_HandleTypeDef *hsd = (SD_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent; - - /* Transfer complete user callback */ - HAL_SD_DMA_RxErrorCallback(hsd->hdmarx); -} - -/** - * @brief SD DMA transfer complete Tx callback. - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void SD_DMA_TxCplt(DMA_HandleTypeDef *hdma) -{ - SD_HandleTypeDef *hsd = (SD_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent; - - /* DMA transfer is complete */ - hsd->DmaTransferCplt = 1; - - /* Wait until SD transfer is complete */ - while(hsd->SdTransferCplt == 0) - { - } - - /* Disable the DMA channel */ - HAL_DMA_Abort(hdma); - - /* Transfer complete user callback */ - HAL_SD_DMA_TxCpltCallback(hsd->hdmatx); -} - -/** - * @brief SD DMA transfer Error Tx callback. - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void SD_DMA_TxError(DMA_HandleTypeDef *hdma) -{ - SD_HandleTypeDef *hsd = ( SD_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; - - /* Transfer complete user callback */ - HAL_SD_DMA_TxErrorCallback(hsd->hdmatx); -} - -/** - * @brief Returns the SD current state. - * @param hsd: SD handle - * @retval SD card current state - */ -static HAL_SD_CardStateTypedef SD_GetState(SD_HandleTypeDef *hsd) -{ - uint32_t resp1 = 0; - - if (SD_SendStatus(hsd, &resp1) != SD_OK) - { - return SD_CARD_ERROR; - } - else - { - return (HAL_SD_CardStateTypedef)((resp1 >> 9) & 0x0F); - } -} - -/** - * @brief Initializes all cards or single card as the case may be Card(s) come - * into standby state. - * @param hsd: SD handle - * @retval SD Card error state - */ -static HAL_SD_ErrorTypedef SD_Initialize_Cards(SD_HandleTypeDef *hsd) -{ - SDIO_CmdInitTypeDef sdio_cmdinitstructure; - HAL_SD_ErrorTypedef errorstate = SD_OK; - uint16_t sd_rca = 1; - - if(SDIO_GetPowerState(hsd->Instance) == 0) /* Power off */ - { - errorstate = SD_REQUEST_NOT_APPLICABLE; - - return errorstate; - } - - if(hsd->CardType != SECURE_DIGITAL_IO_CARD) - { - /* Send CMD2 ALL_SEND_CID */ - sdio_cmdinitstructure.Argument = 0; - sdio_cmdinitstructure.CmdIndex = SD_CMD_ALL_SEND_CID; - sdio_cmdinitstructure.Response = SDIO_RESPONSE_LONG; - sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO; - sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp2Error(hsd); - - if(errorstate != SD_OK) - { - return errorstate; - } - - /* Get Card identification number data */ - hsd->CID[0] = SDIO_GetResponse(SDIO_RESP1); - hsd->CID[1] = SDIO_GetResponse(SDIO_RESP2); - hsd->CID[2] = SDIO_GetResponse(SDIO_RESP3); - hsd->CID[3] = SDIO_GetResponse(SDIO_RESP4); - } - - if((hsd->CardType == STD_CAPACITY_SD_CARD_V1_1) || (hsd->CardType == STD_CAPACITY_SD_CARD_V2_0) ||\ - (hsd->CardType == SECURE_DIGITAL_IO_COMBO_CARD) || (hsd->CardType == HIGH_CAPACITY_SD_CARD)) - { - /* Send CMD3 SET_REL_ADDR with argument 0 */ - /* SD Card publishes its RCA. */ - sdio_cmdinitstructure.CmdIndex = SD_CMD_SET_REL_ADDR; - sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp6Error(hsd, SD_CMD_SET_REL_ADDR, &sd_rca); - - if(errorstate != SD_OK) - { - return errorstate; - } - } - - if (hsd->CardType != SECURE_DIGITAL_IO_CARD) - { - /* Get the SD card RCA */ - hsd->RCA = sd_rca; - - /* Send CMD9 SEND_CSD with argument as card's RCA */ - sdio_cmdinitstructure.Argument = (uint32_t)(hsd->RCA << 16); - sdio_cmdinitstructure.CmdIndex = SD_CMD_SEND_CSD; - sdio_cmdinitstructure.Response = SDIO_RESPONSE_LONG; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp2Error(hsd); - - if(errorstate != SD_OK) - { - return errorstate; - } - - /* Get Card Specific Data */ - hsd->CSD[0] = SDIO_GetResponse(SDIO_RESP1); - hsd->CSD[1] = SDIO_GetResponse(SDIO_RESP2); - hsd->CSD[2] = SDIO_GetResponse(SDIO_RESP3); - hsd->CSD[3] = SDIO_GetResponse(SDIO_RESP4); - } - - /* All cards are initialized */ - return errorstate; -} - -/** - * @brief Selects of Deselects the corresponding card. - * @param hsd: SD handle - * @param addr: Address of the card to be selected - * @retval SD Card error state - */ -static HAL_SD_ErrorTypedef SD_Select_Deselect(SD_HandleTypeDef *hsd, uint64_t addr) -{ - SDIO_CmdInitTypeDef sdio_cmdinitstructure; - HAL_SD_ErrorTypedef errorstate = SD_OK; - - /* Send CMD7 SDIO_SEL_DESEL_CARD */ - sdio_cmdinitstructure.Argument = (uint32_t)addr; - sdio_cmdinitstructure.CmdIndex = SD_CMD_SEL_DESEL_CARD; - sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT; - sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO; - sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_SEL_DESEL_CARD); - - return errorstate; -} - -/** - * @brief Enquires cards about their operating voltage and configures clock - * controls and stores SD information that will be needed in future - * in the SD handle. - * @param hsd: SD handle - * @retval SD Card error state - */ -static HAL_SD_ErrorTypedef SD_PowerON(SD_HandleTypeDef *hsd) -{ - SDIO_CmdInitTypeDef sdio_cmdinitstructure; - __IO HAL_SD_ErrorTypedef errorstate = SD_OK; - uint32_t response = 0, count = 0, validvoltage = 0; - uint32_t sdtype = SD_STD_CAPACITY; - - /* Power ON Sequence -------------------------------------------------------*/ - /* Disable SDIO Clock */ - __HAL_SD_SDIO_DISABLE(); - - /* Set Power State to ON */ - SDIO_PowerState_ON(hsd->Instance); - - /* 1ms: required power up waiting time before starting the SD initialization - sequence */ - HAL_Delay(1); - - /* Enable SDIO Clock */ - __HAL_SD_SDIO_ENABLE(); - - /* CMD0: GO_IDLE_STATE -----------------------------------------------------*/ - /* No CMD response required */ - sdio_cmdinitstructure.Argument = 0; - sdio_cmdinitstructure.CmdIndex = SD_CMD_GO_IDLE_STATE; - sdio_cmdinitstructure.Response = SDIO_RESPONSE_NO; - sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO; - sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdError(hsd); - - if(errorstate != SD_OK) - { - /* CMD Response Timeout (wait for CMDSENT flag) */ - return errorstate; - } - - /* CMD8: SEND_IF_COND ------------------------------------------------------*/ - /* Send CMD8 to verify SD card interface operating condition */ - /* Argument: - [31:12]: Reserved (shall be set to '0') - - [11:8]: Supply Voltage (VHS) 0x1 (Range: 2.7-3.6 V) - - [7:0]: Check Pattern (recommended 0xAA) */ - /* CMD Response: R7 */ - sdio_cmdinitstructure.Argument = SD_CHECK_PATTERN; - sdio_cmdinitstructure.CmdIndex = SD_SDIO_SEND_IF_COND; - sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp7Error(hsd); - - if (errorstate == SD_OK) - { - /* SD Card 2.0 */ - hsd->CardType = STD_CAPACITY_SD_CARD_V2_0; - sdtype = SD_HIGH_CAPACITY; - } - - /* Send CMD55 */ - sdio_cmdinitstructure.Argument = 0; - sdio_cmdinitstructure.CmdIndex = SD_CMD_APP_CMD; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_APP_CMD); - - /* If errorstate is Command Timeout, it is a MMC card */ - /* If errorstate is SD_OK it is a SD card: SD card 2.0 (voltage range mismatch) - or SD card 1.x */ - if(errorstate == SD_OK) - { - /* SD CARD */ - /* Send ACMD41 SD_APP_OP_COND with Argument 0x80100000 */ - while((!validvoltage) && (count < SD_MAX_VOLT_TRIAL)) - { - - /* SEND CMD55 APP_CMD with RCA as 0 */ - sdio_cmdinitstructure.Argument = 0; - sdio_cmdinitstructure.CmdIndex = SD_CMD_APP_CMD; - sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT; - sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO; - sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_APP_CMD); - - if(errorstate != SD_OK) - { - return errorstate; - } - - /* Send CMD41 */ - sdio_cmdinitstructure.Argument = SD_VOLTAGE_WINDOW_SD | sdtype; - sdio_cmdinitstructure.CmdIndex = SD_CMD_SD_APP_OP_COND; - sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT; - sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO; - sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp3Error(hsd); - - if(errorstate != SD_OK) - { - return errorstate; - } - - /* Get command response */ - response = SDIO_GetResponse(SDIO_RESP1); - - /* Get operating voltage*/ - validvoltage = (((response >> 31) == 1) ? 1 : 0); - - count++; - } - - if(count >= SD_MAX_VOLT_TRIAL) - { - errorstate = SD_INVALID_VOLTRANGE; - - return errorstate; - } - - if((response & SD_HIGH_CAPACITY) == SD_HIGH_CAPACITY) /* (response &= SD_HIGH_CAPACITY) */ - { - hsd->CardType = HIGH_CAPACITY_SD_CARD; - } - - } /* else MMC Card */ - - return errorstate; -} - -/** - * @brief Turns the SDIO output signals off. - * @param hsd: SD handle - * @retval SD Card error state - */ -static HAL_SD_ErrorTypedef SD_PowerOFF(SD_HandleTypeDef *hsd) -{ - HAL_SD_ErrorTypedef errorstate = SD_OK; - - /* Set Power State to OFF */ - SDIO_PowerState_OFF(hsd->Instance); - - return errorstate; -} - -/** - * @brief Returns the current card's status. - * @param hsd: SD handle - * @param pCardStatus: pointer to the buffer that will contain the SD card - * status (Card Status register) - * @retval SD Card error state - */ -static HAL_SD_ErrorTypedef SD_SendStatus(SD_HandleTypeDef *hsd, uint32_t *pCardStatus) -{ - SDIO_CmdInitTypeDef sdio_cmdinitstructure; - HAL_SD_ErrorTypedef errorstate = SD_OK; - - if(pCardStatus == NULL) - { - errorstate = SD_INVALID_PARAMETER; - - return errorstate; - } - - /* Send Status command */ - sdio_cmdinitstructure.Argument = (uint32_t)(hsd->RCA << 16); - sdio_cmdinitstructure.CmdIndex = SD_CMD_SEND_STATUS; - sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT; - sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO; - sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_SEND_STATUS); - - if(errorstate != SD_OK) - { - return errorstate; - } - - /* Get SD card status */ - *pCardStatus = SDIO_GetResponse(SDIO_RESP1); - - return errorstate; -} - -/** - * @brief Checks for error conditions for CMD0. - * @param hsd: SD handle - * @retval SD Card error state - */ -static HAL_SD_ErrorTypedef SD_CmdError(SD_HandleTypeDef *hsd) -{ - HAL_SD_ErrorTypedef errorstate = SD_OK; - uint32_t timeout, tmp; - - timeout = SDIO_CMD0TIMEOUT; - - tmp = __HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CMDSENT); - - while((timeout > 0) && (!tmp)) - { - tmp = __HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CMDSENT); - timeout--; - } - - if(timeout == 0) - { - errorstate = SD_CMD_RSP_TIMEOUT; - return errorstate; - } - - /* Clear all the static flags */ - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); - - return errorstate; -} - -/** - * @brief Checks for error conditions for R7 response. - * @param hsd: SD handle - * @retval SD Card error state - */ -static HAL_SD_ErrorTypedef SD_CmdResp7Error(SD_HandleTypeDef *hsd) -{ - HAL_SD_ErrorTypedef errorstate = SD_ERROR; - uint32_t timeout = SDIO_CMD0TIMEOUT, tmp; - - tmp = __HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT); - - while((!tmp) && (timeout > 0)) - { - tmp = __HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT); - timeout--; - } - - tmp = __HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CTIMEOUT); - - if((timeout == 0) || tmp) - { - /* Card is not V2.0 compliant or card does not support the set voltage range */ - errorstate = SD_CMD_RSP_TIMEOUT; - - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_CTIMEOUT); - - return errorstate; - } - - if(__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CMDREND)) - { - /* Card is SD V2.0 compliant */ - errorstate = SD_OK; - - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_CMDREND); - - return errorstate; - } - - return errorstate; -} - -/** - * @brief Checks for error conditions for R1 response. - * @param hsd: SD handle - * @param SD_CMD: The sent command index - * @retval SD Card error state - */ -static HAL_SD_ErrorTypedef SD_CmdResp1Error(SD_HandleTypeDef *hsd, uint8_t SD_CMD) -{ - HAL_SD_ErrorTypedef errorstate = SD_OK; - uint32_t response_r1; - - while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT)) - { - } - - if(__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CTIMEOUT)) - { - errorstate = SD_CMD_RSP_TIMEOUT; - - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_CTIMEOUT); - - return errorstate; - } - else if(__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CCRCFAIL)) - { - errorstate = SD_CMD_CRC_FAIL; - - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_CCRCFAIL); - - return errorstate; - } - - /* Check response received is of desired command */ - if(SDIO_GetCommandResponse(hsd->Instance) != SD_CMD) - { - errorstate = SD_ILLEGAL_CMD; - - return errorstate; - } - - /* Clear all the static flags */ - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); - - /* We have received response, retrieve it for analysis */ - response_r1 = SDIO_GetResponse(SDIO_RESP1); - - if((response_r1 & SD_OCR_ERRORBITS) == SD_ALLZERO) - { - return errorstate; - } - - if((response_r1 & SD_OCR_ADDR_OUT_OF_RANGE) == SD_OCR_ADDR_OUT_OF_RANGE) - { - return(SD_ADDR_OUT_OF_RANGE); - } - - if((response_r1 & SD_OCR_ADDR_MISALIGNED) == SD_OCR_ADDR_MISALIGNED) - { - return(SD_ADDR_MISALIGNED); - } - - if((response_r1 & SD_OCR_BLOCK_LEN_ERR) == SD_OCR_BLOCK_LEN_ERR) - { - return(SD_BLOCK_LEN_ERR); - } - - if((response_r1 & SD_OCR_ERASE_SEQ_ERR) == SD_OCR_ERASE_SEQ_ERR) - { - return(SD_ERASE_SEQ_ERR); - } - - if((response_r1 & SD_OCR_BAD_ERASE_PARAM) == SD_OCR_BAD_ERASE_PARAM) - { - return(SD_BAD_ERASE_PARAM); - } - - if((response_r1 & SD_OCR_WRITE_PROT_VIOLATION) == SD_OCR_WRITE_PROT_VIOLATION) - { - return(SD_WRITE_PROT_VIOLATION); - } - - if((response_r1 & SD_OCR_LOCK_UNLOCK_FAILED) == SD_OCR_LOCK_UNLOCK_FAILED) - { - return(SD_LOCK_UNLOCK_FAILED); - } - - if((response_r1 & SD_OCR_COM_CRC_FAILED) == SD_OCR_COM_CRC_FAILED) - { - return(SD_COM_CRC_FAILED); - } - - if((response_r1 & SD_OCR_ILLEGAL_CMD) == SD_OCR_ILLEGAL_CMD) - { - return(SD_ILLEGAL_CMD); - } - - if((response_r1 & SD_OCR_CARD_ECC_FAILED) == SD_OCR_CARD_ECC_FAILED) - { - return(SD_CARD_ECC_FAILED); - } - - if((response_r1 & SD_OCR_CC_ERROR) == SD_OCR_CC_ERROR) - { - return(SD_CC_ERROR); - } - - if((response_r1 & SD_OCR_GENERAL_UNKNOWN_ERROR) == SD_OCR_GENERAL_UNKNOWN_ERROR) - { - return(SD_GENERAL_UNKNOWN_ERROR); - } - - if((response_r1 & SD_OCR_STREAM_READ_UNDERRUN) == SD_OCR_STREAM_READ_UNDERRUN) - { - return(SD_STREAM_READ_UNDERRUN); - } - - if((response_r1 & SD_OCR_STREAM_WRITE_OVERRUN) == SD_OCR_STREAM_WRITE_OVERRUN) - { - return(SD_STREAM_WRITE_OVERRUN); - } - - if((response_r1 & SD_OCR_CID_CSD_OVERWRITE) == SD_OCR_CID_CSD_OVERWRITE) - { - return(SD_CID_CSD_OVERWRITE); - } - - if((response_r1 & SD_OCR_WP_ERASE_SKIP) == SD_OCR_WP_ERASE_SKIP) - { - return(SD_WP_ERASE_SKIP); - } - - if((response_r1 & SD_OCR_CARD_ECC_DISABLED) == SD_OCR_CARD_ECC_DISABLED) - { - return(SD_CARD_ECC_DISABLED); - } - - if((response_r1 & SD_OCR_ERASE_RESET) == SD_OCR_ERASE_RESET) - { - return(SD_ERASE_RESET); - } - - if((response_r1 & SD_OCR_AKE_SEQ_ERROR) == SD_OCR_AKE_SEQ_ERROR) - { - return(SD_AKE_SEQ_ERROR); - } - - return errorstate; -} - -/** - * @brief Checks for error conditions for R3 (OCR) response. - * @param hsd: SD handle - * @retval SD Card error state - */ -static HAL_SD_ErrorTypedef SD_CmdResp3Error(SD_HandleTypeDef *hsd) -{ - HAL_SD_ErrorTypedef errorstate = SD_OK; - - while (!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT)) - { - } - - if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CTIMEOUT)) - { - errorstate = SD_CMD_RSP_TIMEOUT; - - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_CTIMEOUT); - - return errorstate; - } - - /* Clear all the static flags */ - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); - - return errorstate; -} - -/** - * @brief Checks for error conditions for R2 (CID or CSD) response. - * @param hsd: SD handle - * @retval SD Card error state - */ -static HAL_SD_ErrorTypedef SD_CmdResp2Error(SD_HandleTypeDef *hsd) -{ - HAL_SD_ErrorTypedef errorstate = SD_OK; - - while (!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT)) - { - } - - if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CTIMEOUT)) - { - errorstate = SD_CMD_RSP_TIMEOUT; - - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_CTIMEOUT); - - return errorstate; - } - else if (__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CCRCFAIL)) - { - errorstate = SD_CMD_CRC_FAIL; - - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_CCRCFAIL); - - return errorstate; - } - else - { - /* No error flag set */ - } - - /* Clear all the static flags */ - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); - - return errorstate; -} - -/** - * @brief Checks for error conditions for R6 (RCA) response. - * @param hsd: SD handle - * @param SD_CMD: The sent command index - * @param pRCA: Pointer to the variable that will contain the SD card relative - * address RCA - * @retval SD Card error state - */ -static HAL_SD_ErrorTypedef SD_CmdResp6Error(SD_HandleTypeDef *hsd, uint8_t SD_CMD, uint16_t *pRCA) -{ - HAL_SD_ErrorTypedef errorstate = SD_OK; - uint32_t response_r1; - - while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT)) - { - } - - if(__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CTIMEOUT)) - { - errorstate = SD_CMD_RSP_TIMEOUT; - - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_CTIMEOUT); - - return errorstate; - } - else if(__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CCRCFAIL)) - { - errorstate = SD_CMD_CRC_FAIL; - - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_CCRCFAIL); - - return errorstate; - } - else - { - /* No error flag set */ - } - - /* Check response received is of desired command */ - if(SDIO_GetCommandResponse(hsd->Instance) != SD_CMD) - { - errorstate = SD_ILLEGAL_CMD; - - return errorstate; - } - - /* Clear all the static flags */ - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); - - /* We have received response, retrieve it. */ - response_r1 = SDIO_GetResponse(SDIO_RESP1); - - if((response_r1 & (SD_R6_GENERAL_UNKNOWN_ERROR | SD_R6_ILLEGAL_CMD | SD_R6_COM_CRC_FAILED)) == SD_ALLZERO) - { - *pRCA = (uint16_t) (response_r1 >> 16); - - return errorstate; - } - - if((response_r1 & SD_R6_GENERAL_UNKNOWN_ERROR) == SD_R6_GENERAL_UNKNOWN_ERROR) - { - return(SD_GENERAL_UNKNOWN_ERROR); - } - - if((response_r1 & SD_R6_ILLEGAL_CMD) == SD_R6_ILLEGAL_CMD) - { - return(SD_ILLEGAL_CMD); - } - - if((response_r1 & SD_R6_COM_CRC_FAILED) == SD_R6_COM_CRC_FAILED) - { - return(SD_COM_CRC_FAILED); - } - - return errorstate; -} - -/** - * @brief Enables the SDIO wide bus mode. - * @param hsd: SD handle - * @retval SD Card error state - */ -static HAL_SD_ErrorTypedef SD_WideBus_Enable(SD_HandleTypeDef *hsd) -{ - SDIO_CmdInitTypeDef sdio_cmdinitstructure; - HAL_SD_ErrorTypedef errorstate = SD_OK; - - uint32_t scr[2] = {0, 0}; - - if((SDIO_GetResponse(SDIO_RESP1) & SD_CARD_LOCKED) == SD_CARD_LOCKED) - { - errorstate = SD_LOCK_UNLOCK_FAILED; - - return errorstate; - } - - /* Get SCR Register */ - errorstate = SD_FindSCR(hsd, scr); - - if(errorstate != SD_OK) - { - return errorstate; - } - - /* If requested card supports wide bus operation */ - if((scr[1] & SD_WIDE_BUS_SUPPORT) != SD_ALLZERO) - { - /* Send CMD55 APP_CMD with argument as card's RCA.*/ - sdio_cmdinitstructure.Argument = (uint32_t)(hsd->RCA << 16); - sdio_cmdinitstructure.CmdIndex = SD_CMD_APP_CMD; - sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT; - sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO; - sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_APP_CMD); - - if(errorstate != SD_OK) - { - return errorstate; - } - - /* Send ACMD6 APP_CMD with argument as 2 for wide bus mode */ - sdio_cmdinitstructure.Argument = 2; - sdio_cmdinitstructure.CmdIndex = SD_CMD_APP_SD_SET_BUSWIDTH; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_APP_SD_SET_BUSWIDTH); - - if(errorstate != SD_OK) - { - return errorstate; - } - - return errorstate; - } - else - { - errorstate = SD_REQUEST_NOT_APPLICABLE; - - return errorstate; - } -} - -/** - * @brief Disables the SDIO wide bus mode. - * @param hsd: SD handle - * @retval SD Card error state - */ -static HAL_SD_ErrorTypedef SD_WideBus_Disable(SD_HandleTypeDef *hsd) -{ - SDIO_CmdInitTypeDef sdio_cmdinitstructure; - HAL_SD_ErrorTypedef errorstate = SD_OK; - - uint32_t scr[2] = {0, 0}; - - if((SDIO_GetResponse(SDIO_RESP1) & SD_CARD_LOCKED) == SD_CARD_LOCKED) - { - errorstate = SD_LOCK_UNLOCK_FAILED; - - return errorstate; - } - - /* Get SCR Register */ - errorstate = SD_FindSCR(hsd, scr); - - if(errorstate != SD_OK) - { - return errorstate; - } - - /* If requested card supports 1 bit mode operation */ - if((scr[1] & SD_SINGLE_BUS_SUPPORT) != SD_ALLZERO) - { - /* Send CMD55 APP_CMD with argument as card's RCA */ - sdio_cmdinitstructure.Argument = (uint32_t)(hsd->RCA << 16); - sdio_cmdinitstructure.CmdIndex = SD_CMD_APP_CMD; - sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT; - sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO; - sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_APP_CMD); - - if(errorstate != SD_OK) - { - return errorstate; - } - - /* Send ACMD6 APP_CMD with argument as 0 for single bus mode */ - sdio_cmdinitstructure.Argument = 0; - sdio_cmdinitstructure.CmdIndex = SD_CMD_APP_SD_SET_BUSWIDTH; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_APP_SD_SET_BUSWIDTH); - - if(errorstate != SD_OK) - { - return errorstate; - } - - return errorstate; - } - else - { - errorstate = SD_REQUEST_NOT_APPLICABLE; - - return errorstate; - } -} - - -/** - * @brief Finds the SD card SCR register value. - * @param hsd: SD handle - * @param pSCR: pointer to the buffer that will contain the SCR value - * @retval SD Card error state - */ -static HAL_SD_ErrorTypedef SD_FindSCR(SD_HandleTypeDef *hsd, uint32_t *pSCR) -{ - SDIO_CmdInitTypeDef sdio_cmdinitstructure; - SDIO_DataInitTypeDef sdio_datainitstructure; - HAL_SD_ErrorTypedef errorstate = SD_OK; - uint32_t index = 0; - uint32_t tempscr[2] = {0, 0}; - - /* Set Block Size To 8 Bytes */ - /* Send CMD55 APP_CMD with argument as card's RCA */ - sdio_cmdinitstructure.Argument = (uint32_t)8; - sdio_cmdinitstructure.CmdIndex = SD_CMD_SET_BLOCKLEN; - sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT; - sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO; - sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_SET_BLOCKLEN); - - if(errorstate != SD_OK) - { - return errorstate; - } - - /* Send CMD55 APP_CMD with argument as card's RCA */ - sdio_cmdinitstructure.Argument = (uint32_t)((hsd->RCA) << 16); - sdio_cmdinitstructure.CmdIndex = SD_CMD_APP_CMD; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_APP_CMD); - - if(errorstate != SD_OK) - { - return errorstate; - } - sdio_datainitstructure.DataTimeOut = SD_DATATIMEOUT; - sdio_datainitstructure.DataLength = 8; - sdio_datainitstructure.DataBlockSize = SDIO_DATABLOCK_SIZE_8B; - sdio_datainitstructure.TransferDir = SDIO_TRANSFER_DIR_TO_SDIO; - sdio_datainitstructure.TransferMode = SDIO_TRANSFER_MODE_BLOCK; - sdio_datainitstructure.DPSM = SDIO_DPSM_ENABLE; - SDIO_DataConfig(hsd->Instance, &sdio_datainitstructure); - - /* Send ACMD51 SD_APP_SEND_SCR with argument as 0 */ - sdio_cmdinitstructure.Argument = 0; - sdio_cmdinitstructure.CmdIndex = SD_CMD_SD_APP_SEND_SCR; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - /* Check for error conditions */ - errorstate = SD_CmdResp1Error(hsd, SD_CMD_SD_APP_SEND_SCR); - - if(errorstate != SD_OK) - { - return errorstate; - } - - while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND | SDIO_FLAG_STBITERR)) - { - if(__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXDAVL)) - { - *(tempscr + index) = SDIO_ReadFIFO(hsd->Instance); - index++; - } - } - - if(__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_DTIMEOUT)) - { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_DTIMEOUT); - - errorstate = SD_DATA_TIMEOUT; - - return errorstate; - } - else if(__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_DCRCFAIL)) - { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_DCRCFAIL); - - errorstate = SD_DATA_CRC_FAIL; - - return errorstate; - } - else if(__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_RXOVERR)) - { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_RXOVERR); - - errorstate = SD_RX_OVERRUN; - - return errorstate; - } - else if(__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_STBITERR)) - { - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_STBITERR); - - errorstate = SD_START_BIT_ERR; - - return errorstate; - } - else - { - /* No error flag set */ - } - - /* Clear all the static flags */ - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); - - *(pSCR + 1) = ((tempscr[0] & SD_0TO7BITS) << 24) | ((tempscr[0] & SD_8TO15BITS) << 8) |\ - ((tempscr[0] & SD_16TO23BITS) >> 8) | ((tempscr[0] & SD_24TO31BITS) >> 24); - - *(pSCR) = ((tempscr[1] & SD_0TO7BITS) << 24) | ((tempscr[1] & SD_8TO15BITS) << 8) |\ - ((tempscr[1] & SD_16TO23BITS) >> 8) | ((tempscr[1] & SD_24TO31BITS) >> 24); - - return errorstate; -} - -/** - * @brief Checks if the SD card is in programming state. - * @param hsd: SD handle - * @param pStatus: pointer to the variable that will contain the SD card state - * @retval SD Card error state - */ -static HAL_SD_ErrorTypedef SD_IsCardProgramming(SD_HandleTypeDef *hsd, uint8_t *pStatus) -{ - SDIO_CmdInitTypeDef sdio_cmdinitstructure; - HAL_SD_ErrorTypedef errorstate = SD_OK; - __IO uint32_t responseR1 = 0; - - sdio_cmdinitstructure.Argument = (uint32_t)(hsd->RCA << 16); - sdio_cmdinitstructure.CmdIndex = SD_CMD_SEND_STATUS; - sdio_cmdinitstructure.Response = SDIO_RESPONSE_SHORT; - sdio_cmdinitstructure.WaitForInterrupt = SDIO_WAIT_NO; - sdio_cmdinitstructure.CPSM = SDIO_CPSM_ENABLE; - SDIO_SendCommand(hsd->Instance, &sdio_cmdinitstructure); - - while(!__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT)) - { - } - - if(__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CTIMEOUT)) - { - errorstate = SD_CMD_RSP_TIMEOUT; - - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_CTIMEOUT); - - return errorstate; - } - else if(__HAL_SD_SDIO_GET_FLAG(hsd, SDIO_FLAG_CCRCFAIL)) - { - errorstate = SD_CMD_CRC_FAIL; - - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_FLAG_CCRCFAIL); - - return errorstate; - } - else - { - /* No error flag set */ - } - - /* Check response received is of desired command */ - if((uint32_t)SDIO_GetCommandResponse(hsd->Instance) != SD_CMD_SEND_STATUS) - { - errorstate = SD_ILLEGAL_CMD; - - return errorstate; - } - - /* Clear all the static flags */ - __HAL_SD_SDIO_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS); - - - /* We have received response, retrieve it for analysis */ - responseR1 = SDIO_GetResponse(SDIO_RESP1); - - /* Find out card status */ - *pStatus = (uint8_t)((responseR1 >> 9) & 0x0000000F); - - if((responseR1 & SD_OCR_ERRORBITS) == SD_ALLZERO) - { - return errorstate; - } - - if((responseR1 & SD_OCR_ADDR_OUT_OF_RANGE) == SD_OCR_ADDR_OUT_OF_RANGE) - { - return(SD_ADDR_OUT_OF_RANGE); - } - - if((responseR1 & SD_OCR_ADDR_MISALIGNED) == SD_OCR_ADDR_MISALIGNED) - { - return(SD_ADDR_MISALIGNED); - } - - if((responseR1 & SD_OCR_BLOCK_LEN_ERR) == SD_OCR_BLOCK_LEN_ERR) - { - return(SD_BLOCK_LEN_ERR); - } - - if((responseR1 & SD_OCR_ERASE_SEQ_ERR) == SD_OCR_ERASE_SEQ_ERR) - { - return(SD_ERASE_SEQ_ERR); - } - - if((responseR1 & SD_OCR_BAD_ERASE_PARAM) == SD_OCR_BAD_ERASE_PARAM) - { - return(SD_BAD_ERASE_PARAM); - } - - if((responseR1 & SD_OCR_WRITE_PROT_VIOLATION) == SD_OCR_WRITE_PROT_VIOLATION) - { - return(SD_WRITE_PROT_VIOLATION); - } - - if((responseR1 & SD_OCR_LOCK_UNLOCK_FAILED) == SD_OCR_LOCK_UNLOCK_FAILED) - { - return(SD_LOCK_UNLOCK_FAILED); - } - - if((responseR1 & SD_OCR_COM_CRC_FAILED) == SD_OCR_COM_CRC_FAILED) - { - return(SD_COM_CRC_FAILED); - } - - if((responseR1 & SD_OCR_ILLEGAL_CMD) == SD_OCR_ILLEGAL_CMD) - { - return(SD_ILLEGAL_CMD); - } - - if((responseR1 & SD_OCR_CARD_ECC_FAILED) == SD_OCR_CARD_ECC_FAILED) - { - return(SD_CARD_ECC_FAILED); - } - - if((responseR1 & SD_OCR_CC_ERROR) == SD_OCR_CC_ERROR) - { - return(SD_CC_ERROR); - } - - if((responseR1 & SD_OCR_GENERAL_UNKNOWN_ERROR) == SD_OCR_GENERAL_UNKNOWN_ERROR) - { - return(SD_GENERAL_UNKNOWN_ERROR); - } - - if((responseR1 & SD_OCR_STREAM_READ_UNDERRUN) == SD_OCR_STREAM_READ_UNDERRUN) - { - return(SD_STREAM_READ_UNDERRUN); - } - - if((responseR1 & SD_OCR_STREAM_WRITE_OVERRUN) == SD_OCR_STREAM_WRITE_OVERRUN) - { - return(SD_STREAM_WRITE_OVERRUN); - } - - if((responseR1 & SD_OCR_CID_CSD_OVERWRITE) == SD_OCR_CID_CSD_OVERWRITE) - { - return(SD_CID_CSD_OVERWRITE); - } - - if((responseR1 & SD_OCR_WP_ERASE_SKIP) == SD_OCR_WP_ERASE_SKIP) - { - return(SD_WP_ERASE_SKIP); - } - - if((responseR1 & SD_OCR_CARD_ECC_DISABLED) == SD_OCR_CARD_ECC_DISABLED) - { - return(SD_CARD_ECC_DISABLED); - } - - if((responseR1 & SD_OCR_ERASE_RESET) == SD_OCR_ERASE_RESET) - { - return(SD_ERASE_RESET); - } - - if((responseR1 & SD_OCR_AKE_SEQ_ERROR) == SD_OCR_AKE_SEQ_ERROR) - { - return(SD_AKE_SEQ_ERROR); - } - - return errorstate; -} - -/** - * @} - */ - -#endif /* HAL_SD_MODULE_ENABLED */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_smartcard.c b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_smartcard.c deleted file mode 100755 index 0d424cae..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_smartcard.c +++ /dev/null @@ -1,1305 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_hal_smartcard.c - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief SMARTCARD HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the SMARTCARD peripheral: - * + Initialization and de-initialization functions - * + IO operation functions - * + Peripheral State and Errors functions - * - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - The SMARTCARD HAL driver can be used as follows: - - (#) Declare a SMARTCARD_HandleTypeDef handle structure. - (#) Initialize the SMARTCARD low level resources by implementing the HAL_SMARTCARD_MspInit() API: - (##) Enable the USARTx interface clock. - (##) SMARTCARD pins configuration: - (+++) Enable the clock for the SMARTCARD GPIOs. - (+++) Configure these SMARTCARD pins as alternate function pull-up. - (##) NVIC configuration if you need to use interrupt process (HAL_SMARTCARD_Transmit_IT() - and HAL_SMARTCARD_Receive_IT() APIs): - (+++) Configure the USARTx interrupt priority. - (+++) Enable the NVIC USART IRQ handle. - (##) DMA Configuration if you need to use DMA process (HAL_SMARTCARD_Transmit_DMA() - and HAL_SMARTCARD_Receive_DMA() APIs): - (+++) Declare a DMA handle structure for the Tx/Rx stream. - (+++) Enable the DMAx interface clock. - (+++) Configure the declared DMA handle structure with the required Tx/Rx parameters. - (+++) Configure the DMA Tx/Rx Stream. - (+++) Associate the initialized DMA handle to the SMARTCARD DMA Tx/Rx handle. - (+++) Configure the priority and enable the NVIC for the transfer complete interrupt on the DMA Tx/Rx Stream. - - (#) Program the Baud Rate, Word Length , Stop Bit, Parity, Hardware - flow control and Mode(Receiver/Transmitter) in the SMARTCARD Init structure. - - (#) Initialize the SMARTCARD registers by calling the HAL_SMARTCARD_Init() API: - (++) These APIs configure also the low level Hardware GPIO, CLOCK, CORTEX...etc) - by calling the customized HAL_SMARTCARD_MspInit() API. - [..] - (@) The specific SMARTCARD interrupts (Transmission complete interrupt, - RXNE interrupt and Error Interrupts) will be managed using the macros - __HAL_SMARTCARD_ENABLE_IT() and __HAL_SMARTCARD_DISABLE_IT() inside the transmit and receive process. - - [..] - Three operation modes are available within this driver : - - *** Polling mode IO operation *** - ================================= - [..] - (+) Send an amount of data in blocking mode using HAL_SMARTCARD_Transmit() - (+) Receive an amount of data in blocking mode using HAL_SMARTCARD_Receive() - - *** Interrupt mode IO operation *** - =================================== - [..] - (+) Send an amount of data in non blocking mode using HAL_SMARTCARD_Transmit_IT() - (+) At transmission end of transfer HAL_SMARTCARD_TxCpltCallback is executed and user can - add his own code by customization of function pointer HAL_SMARTCARD_TxCpltCallback - (+) Receive an amount of data in non blocking mode using HAL_SMARTCARD_Receive_IT() - (+) At reception end of transfer HAL_SMARTCARD_RxCpltCallback is executed and user can - add his own code by customization of function pointer HAL_SMARTCARD_RxCpltCallback - (+) In case of transfer Error, HAL_SMARTCARD_ErrorCallback() function is executed and user can - add his own code by customization of function pointer HAL_SMARTCARD_ErrorCallback - - *** DMA mode IO operation *** - ============================== - [..] - (+) Send an amount of data in non blocking mode (DMA) using HAL_SMARTCARD_Transmit_DMA() - (+) At transmission end of transfer HAL_SMARTCARD_TxCpltCallback is executed and user can - add his own code by customization of function pointer HAL_SMARTCARD_TxCpltCallback - (+) Receive an amount of data in non blocking mode (DMA) using HAL_SMARTCARD_Receive_DMA() - (+) At reception end of transfer HAL_SMARTCARD_RxCpltCallback is executed and user can - add his own code by customization of function pointer HAL_SMARTCARD_RxCpltCallback - (+) In case of transfer Error, HAL_SMARTCARD_ErrorCallback() function is executed and user can - add his own code by customization of function pointer HAL_SMARTCARD_ErrorCallback - - *** SMARTCARD HAL driver macros list *** - ============================================= - [..] - Below the list of most used macros in SMARTCARD HAL driver. - - (+) __HAL_SMARTCARD_ENABLE: Enable the SMARTCARD peripheral - (+) __HAL_SMARTCARD_DISABLE: Disable the SMARTCARD peripheral - (+) __HAL_SMARTCARD_GET_FLAG : Check whether the specified SMARTCARD flag is set or not - (+) __HAL_SMARTCARD_CLEAR_FLAG : Clear the specified SMARTCARD pending flag - (+) __HAL_SMARTCARD_ENABLE_IT: Enable the specified SMARTCARD interrupt - (+) __HAL_SMARTCARD_DISABLE_IT: Disable the specified SMARTCARD interrupt - - [..] - (@) You can refer to the SMARTCARD HAL driver header file for more useful macros - - @endverbatim - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal.h" - -/** @addtogroup STM32F2xx_HAL_Driver - * @{ - */ - -/** @defgroup SMARTCARD SMARTCARD - * @brief HAL USART SMARTCARD module driver - * @{ - */ -#ifdef HAL_SMARTCARD_MODULE_ENABLED -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @addtogroup SMARTCARD_Private_Constants - * @{ - */ -#define SMARTCARD_TIMEOUT_VALUE 22000 -/** - * @} - */ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/** @addtogroup SMARTCARD_Private_Functions - * @{ - */ -static void SMARTCARD_SetConfig (SMARTCARD_HandleTypeDef *hsc); -static HAL_StatusTypeDef SMARTCARD_Transmit_IT(SMARTCARD_HandleTypeDef *hsc); -static HAL_StatusTypeDef SMARTCARD_EndTransmit_IT(SMARTCARD_HandleTypeDef *hsmartcard); -static HAL_StatusTypeDef SMARTCARD_Receive_IT(SMARTCARD_HandleTypeDef *hsc); -static void SMARTCARD_DMATransmitCplt(DMA_HandleTypeDef *hdma); -static void SMARTCARD_DMAReceiveCplt(DMA_HandleTypeDef *hdma); -static void SMARTCARD_DMAError(DMA_HandleTypeDef *hdma); -static HAL_StatusTypeDef SMARTCARD_WaitOnFlagUntilTimeout(SMARTCARD_HandleTypeDef *hsc, uint32_t Flag, FlagStatus Status, uint32_t Timeout); -/** - * @} - */ -/* Exported functions --------------------------------------------------------*/ -/** @defgroup SMARTCARD_Exported_Functions SMARTCARD Exported Functions - * @{ - */ - -/** @defgroup SMARTCARD_Exported_Functions_Group1 SmartCard Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * -@verbatim - ============================================================================== - ##### Initialization and Configuration functions ##### - ============================================================================== - [..] - This subsection provides a set of functions allowing to initialize the USART - in Smartcard mode. - [..] - The Smartcard interface is designed to support asynchronous protocol Smartcards as - defined in the ISO 7816-3 standard. - [..] - The USART can provide a clock to the smartcard through the SCLK output. - In smartcard mode, SCLK is not associated to the communication but is simply derived - from the internal peripheral input clock through a 5-bit prescaler. - [..] - (+) For the Smartcard mode only these parameters can be configured: - (++) Baud Rate - (++) Word Length => Should be 9 bits (8 bits + parity) - (++) Stop Bit - (++) Parity: => Should be enabled - - (+++) +-------------------------------------------------------------+ - (+++) | M bit | PCE bit | SMARTCARD frame | - (+++) |---------------------|---------------------------------------| - (+++) | 1 | 1 | | SB | 8 bit data | PB | STB | | - (+++) +-------------------------------------------------------------+ - - (++) USART polarity - (++) USART phase - (++) USART LastBit - (++) Receiver/transmitter modes - (++) Prescaler - (++) GuardTime - (++) NACKState: The Smartcard NACK state - - (+) Recommended SmartCard interface configuration to get the Answer to Reset from the Card: - (++) Word Length = 9 Bits - (++) 1.5 Stop Bit - (++) Even parity - (++) BaudRate = 12096 baud - (++) Tx and Rx enabled - [..] - Please refer to the ISO 7816-3 specification for more details. - - -@- It is also possible to choose 0.5 stop bit for receiving but it is recommended - to use 1.5 stop bits for both transmitting and receiving to avoid switching - between the two configurations. - [..] - The HAL_SMARTCARD_Init() function follows the USART SmartCard configuration - procedure (details for the procedure are available in reference manual (RM0329)). - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the SmartCard mode according to the specified - * parameters in the SMARTCARD_InitTypeDef and create the associated handle . - * @param hsc: pointer to a SMARTCARD_HandleTypeDef structure that contains - * the configuration information for SMARTCARD module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SMARTCARD_Init(SMARTCARD_HandleTypeDef *hsc) -{ - /* Check the SMARTCARD handle allocation */ - if(hsc == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_SMARTCARD_INSTANCE(hsc->Instance)); - assert_param(IS_SMARTCARD_NACK_STATE(hsc->Init.NACKState)); - - if(hsc->State == HAL_SMARTCARD_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - hsc->Lock = HAL_UNLOCKED; - /* Init the low level hardware : GPIO, CLOCK, CORTEX...etc */ - HAL_SMARTCARD_MspInit(hsc); - } - - hsc->State = HAL_SMARTCARD_STATE_BUSY; - - /* Set the Prescaler */ - MODIFY_REG(hsc->Instance->GTPR, USART_GTPR_PSC, hsc->Init.Prescaler); - - /* Set the Guard Time */ - MODIFY_REG(hsc->Instance->GTPR, USART_GTPR_GT, ((hsc->Init.GuardTime)<<8)); - - /* Set the Smartcard Communication parameters */ - SMARTCARD_SetConfig(hsc); - - /* In SmartCard mode, the following bits must be kept cleared: - - LINEN bit in the USART_CR2 register - - HDSEL and IREN bits in the USART_CR3 register.*/ - hsc->Instance->CR2 &= ~USART_CR2_LINEN; - hsc->Instance->CR3 &= ~(USART_CR3_IREN | USART_CR3_HDSEL); - - /* Enable the SMARTCARD Parity Error Interrupt */ - __HAL_SMARTCARD_ENABLE_IT(hsc, SMARTCARD_IT_PE); - - /* Enable the SMARTCARD Framing Error Interrupt */ - __HAL_SMARTCARD_ENABLE_IT(hsc, SMARTCARD_IT_ERR); - - /* Enable the Peripheral */ - __HAL_SMARTCARD_ENABLE(hsc); - - /* Configure the Smartcard NACK state */ - MODIFY_REG(hsc->Instance->CR3, USART_CR3_NACK, hsc->Init.NACKState); - - /* Enable the SC mode by setting the SCEN bit in the CR3 register */ - hsc->Instance->CR3 |= (USART_CR3_SCEN); - - /* Initialize the SMARTCARD state*/ - hsc->ErrorCode = HAL_SMARTCARD_ERROR_NONE; - hsc->State= HAL_SMARTCARD_STATE_READY; - - return HAL_OK; -} - -/** - * @brief DeInitializes the USART SmartCard peripheral - * @param hsc: pointer to a SMARTCARD_HandleTypeDef structure that contains - * the configuration information for SMARTCARD module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SMARTCARD_DeInit(SMARTCARD_HandleTypeDef *hsc) -{ - /* Check the SMARTCARD handle allocation */ - if(hsc == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_SMARTCARD_INSTANCE(hsc->Instance)); - - hsc->State = HAL_SMARTCARD_STATE_BUSY; - - /* Disable the Peripheral */ - __HAL_SMARTCARD_DISABLE(hsc); - - /* DeInit the low level hardware */ - HAL_SMARTCARD_MspDeInit(hsc); - - hsc->ErrorCode = HAL_SMARTCARD_ERROR_NONE; - hsc->State = HAL_SMARTCARD_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(hsc); - - return HAL_OK; -} - -/** - * @brief SMARTCARD MSP Init - * @param hsc: pointer to a SMARTCARD_HandleTypeDef structure that contains - * the configuration information for SMARTCARD module. - * @retval None - */ - __weak void HAL_SMARTCARD_MspInit(SMARTCARD_HandleTypeDef *hsc) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_SMARTCARD_MspInit could be implemented in the user file - */ -} - -/** - * @brief SMARTCARD MSP DeInit - * @param hsc: pointer to a SMARTCARD_HandleTypeDef structure that contains - * the configuration information for SMARTCARD module. - * @retval None - */ - __weak void HAL_SMARTCARD_MspDeInit(SMARTCARD_HandleTypeDef *hsc) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_SMARTCARD_MspDeInit could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup SMARTCARD_Exported_Functions_Group2 IO operation functions - * @brief SMARTCARD Transmit and Receive functions - * -@verbatim - =============================================================================== - ##### IO operation functions ##### - =============================================================================== - This subsection provides a set of functions allowing to manage the SMARTCARD data transfers. - [..] - Smartcard is a single wire half duplex communication protocol. - The Smartcard interface is designed to support asynchronous protocol Smartcards as - defined in the ISO 7816-3 standard. The USART should be configured as: - (+) 8 bits plus parity: where M=1 and PCE=1 in the USART_CR1 register - (+) 1.5 stop bits when transmitting and receiving: where STOP=11 in the USART_CR2 register. - - (#) There are two modes of transfer: - (++) Blocking mode: The communication is performed in polling mode. - The HAL status of all data processing is returned by the same function - after finishing transfer. - (++) Non Blocking mode: The communication is performed using Interrupts - or DMA, These APIs return the HAL status. - The end of the data processing will be indicated through the - dedicated SMARTCARD IRQ when using Interrupt mode or the DMA IRQ when - using DMA mode. - The HAL_SMARTCARD_TxCpltCallback(), HAL_SMARTCARD_RxCpltCallback() user callbacks - will be executed respectively at the end of the Transmit or Receive process - The HAL_SMARTCARD_ErrorCallback() user callback will be executed when a communication error is detected - - (#) Blocking mode APIs are : - (++) HAL_SMARTCARD_Transmit() - (++) HAL_SMARTCARD_Receive() - - (#) Non Blocking mode APIs with Interrupt are : - (++) HAL_SMARTCARD_Transmit_IT() - (++) HAL_SMARTCARD_Receive_IT() - (++) HAL_SMARTCARD_IRQHandler() - - (#) Non Blocking mode functions with DMA are : - (++) HAL_SMARTCARD_Transmit_DMA() - (++) HAL_SMARTCARD_Receive_DMA() - - (#) A set of Transfer Complete Callbacks are provided in non Blocking mode: - (++) HAL_SMARTCARD_TxCpltCallback() - (++) HAL_SMARTCARD_RxCpltCallback() - (++) HAL_SMARTCARD_ErrorCallback() - -@endverbatim - * @{ - */ - -/** - * @brief Send an amount of data in blocking mode - * @param hsc: pointer to a SMARTCARD_HandleTypeDef structure that contains - * the configuration information for SMARTCARD module. - * @param pData: pointer to data buffer - * @param Size: amount of data to be sent - * @param Timeout: Timeout duration - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SMARTCARD_Transmit(SMARTCARD_HandleTypeDef *hsc, uint8_t *pData, uint16_t Size, uint32_t Timeout) -{ - uint16_t* tmp; - uint32_t tmp1 = 0; - - tmp1 = hsc->State; - if((tmp1 == HAL_SMARTCARD_STATE_READY) || (tmp1 == HAL_SMARTCARD_STATE_BUSY_RX)) - { - if((pData == NULL) || (Size == 0)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hsc); - - hsc->ErrorCode = HAL_SMARTCARD_ERROR_NONE; - /* Check if a non-blocking receive process is ongoing or not */ - if(hsc->State == HAL_SMARTCARD_STATE_BUSY_RX) - { - hsc->State = HAL_SMARTCARD_STATE_BUSY_TX_RX; - } - else - { - hsc->State = HAL_SMARTCARD_STATE_BUSY_TX; - } - - hsc->TxXferSize = Size; - hsc->TxXferCount = Size; - while(hsc->TxXferCount > 0) - { - hsc->TxXferCount--; - if(SMARTCARD_WaitOnFlagUntilTimeout(hsc, SMARTCARD_FLAG_TXE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - tmp = (uint16_t*) pData; - hsc->Instance->DR = (*tmp & (uint16_t)0x01FF); - pData +=1; - } - - if(SMARTCARD_WaitOnFlagUntilTimeout(hsc, SMARTCARD_FLAG_TC, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Check if a non-blocking receive process is ongoing or not */ - if(hsc->State == HAL_SMARTCARD_STATE_BUSY_TX_RX) - { - hsc->State = HAL_SMARTCARD_STATE_BUSY_RX; - } - else - { - hsc->State = HAL_SMARTCARD_STATE_READY; - } - /* Process Unlocked */ - __HAL_UNLOCK(hsc); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Receive an amount of data in blocking mode - * @param hsc: pointer to a SMARTCARD_HandleTypeDef structure that contains - * the configuration information for SMARTCARD module. - * @param pData: pointer to data buffer - * @param Size: amount of data to be received - * @param Timeout: Timeout duration - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SMARTCARD_Receive(SMARTCARD_HandleTypeDef *hsc, uint8_t *pData, uint16_t Size, uint32_t Timeout) -{ - uint16_t* tmp; - uint32_t tmp1 = 0; - - tmp1 = hsc->State; - if((tmp1 == HAL_SMARTCARD_STATE_READY) || (tmp1 == HAL_SMARTCARD_STATE_BUSY_TX)) - { - if((pData == NULL) || (Size == 0)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hsc); - - hsc->ErrorCode = HAL_SMARTCARD_ERROR_NONE; - - /* Check if a non-blocking transmit process is ongoing or not */ - if(hsc->State == HAL_SMARTCARD_STATE_BUSY_TX) - { - hsc->State = HAL_SMARTCARD_STATE_BUSY_TX_RX; - } - else - { - hsc->State = HAL_SMARTCARD_STATE_BUSY_RX; - } - - hsc->RxXferSize = Size; - hsc->RxXferCount = Size; - - /* Check the remain data to be received */ - while(hsc->RxXferCount > 0) - { - hsc->RxXferCount--; - if(SMARTCARD_WaitOnFlagUntilTimeout(hsc, SMARTCARD_FLAG_RXNE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - tmp = (uint16_t*) pData; - *tmp = (uint16_t)(hsc->Instance->DR & (uint16_t)0x00FF); - pData +=1; - } - - /* Check if a non-blocking transmit process is ongoing or not */ - if(hsc->State == HAL_SMARTCARD_STATE_BUSY_TX_RX) - { - hsc->State = HAL_SMARTCARD_STATE_BUSY_TX; - } - else - { - hsc->State = HAL_SMARTCARD_STATE_READY; - } - - /* Process Unlocked */ - __HAL_UNLOCK(hsc); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Send an amount of data in non blocking mode - * @param hsc: pointer to a SMARTCARD_HandleTypeDef structure that contains - * the configuration information for SMARTCARD module. - * @param pData: pointer to data buffer - * @param Size: amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SMARTCARD_Transmit_IT(SMARTCARD_HandleTypeDef *hsc, uint8_t *pData, uint16_t Size) -{ - uint32_t tmp1 = 0; - - tmp1 = hsc->State; - if((tmp1 == HAL_SMARTCARD_STATE_READY) || (tmp1 == HAL_SMARTCARD_STATE_BUSY_RX)) - { - if((pData == NULL) || (Size == 0)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hsc); - - hsc->pTxBuffPtr = pData; - hsc->TxXferSize = Size; - hsc->TxXferCount = Size; - - hsc->ErrorCode = HAL_SMARTCARD_ERROR_NONE; - /* Check if a non-blocking receive process is ongoing or not */ - if(hsc->State == HAL_SMARTCARD_STATE_BUSY_RX) - { - hsc->State = HAL_SMARTCARD_STATE_BUSY_TX_RX; - } - else - { - hsc->State = HAL_SMARTCARD_STATE_BUSY_TX; - } - - /* Process Unlocked */ - __HAL_UNLOCK(hsc); - - /* Enable the SMARTCARD Parity Error Interrupt */ - __HAL_SMARTCARD_ENABLE_IT(hsc, SMARTCARD_IT_PE); - - /* Disable the SMARTCARD Error Interrupt: (Frame error, noise error, overrun error) */ - __HAL_SMARTCARD_DISABLE_IT(hsc, SMARTCARD_IT_ERR); - - /* Enable the SMARTCARD Transmit data register empty Interrupt */ - __HAL_SMARTCARD_ENABLE_IT(hsc, SMARTCARD_IT_TXE); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Receive an amount of data in non blocking mode - * @param hsc: pointer to a SMARTCARD_HandleTypeDef structure that contains - * the configuration information for SMARTCARD module. - * @param pData: pointer to data buffer - * @param Size: amount of data to be received - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SMARTCARD_Receive_IT(SMARTCARD_HandleTypeDef *hsc, uint8_t *pData, uint16_t Size) -{ - uint32_t tmp1 = 0; - - tmp1 = hsc->State; - if((tmp1 == HAL_SMARTCARD_STATE_READY) || (tmp1 == HAL_SMARTCARD_STATE_BUSY_TX)) - { - if((pData == NULL) || (Size == 0)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hsc); - - hsc->pRxBuffPtr = pData; - hsc->RxXferSize = Size; - hsc->RxXferCount = Size; - - hsc->ErrorCode = HAL_SMARTCARD_ERROR_NONE; - /* Check if a non-blocking transmit process is ongoing or not */ - if(hsc->State == HAL_SMARTCARD_STATE_BUSY_TX) - { - hsc->State = HAL_SMARTCARD_STATE_BUSY_TX_RX; - } - else - { - hsc->State = HAL_SMARTCARD_STATE_BUSY_RX; - } - /* Process Unlocked */ - __HAL_UNLOCK(hsc); - - /* Enable the SMARTCARD Data Register not empty Interrupt */ - __HAL_SMARTCARD_ENABLE_IT(hsc, SMARTCARD_IT_RXNE); - - /* Enable the SMARTCARD Parity Error Interrupt */ - __HAL_SMARTCARD_ENABLE_IT(hsc, SMARTCARD_IT_PE); - - /* Enable the SMARTCARD Error Interrupt: (Frame error, noise error, overrun error) */ - __HAL_SMARTCARD_ENABLE_IT(hsc, SMARTCARD_IT_ERR); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Send an amount of data in non blocking mode - * @param hsc: pointer to a SMARTCARD_HandleTypeDef structure that contains - * the configuration information for SMARTCARD module. - * @param pData: pointer to data buffer - * @param Size: amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SMARTCARD_Transmit_DMA(SMARTCARD_HandleTypeDef *hsc, uint8_t *pData, uint16_t Size) -{ - uint32_t *tmp; - uint32_t tmp1 = 0; - - tmp1 = hsc->State; - if((tmp1 == HAL_SMARTCARD_STATE_READY) || (tmp1 == HAL_SMARTCARD_STATE_BUSY_RX)) - { - if((pData == NULL) || (Size == 0)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hsc); - - hsc->pTxBuffPtr = pData; - hsc->TxXferSize = Size; - hsc->TxXferCount = Size; - - hsc->ErrorCode = HAL_SMARTCARD_ERROR_NONE; - /* Check if a non-blocking receive process is ongoing or not */ - if(hsc->State == HAL_SMARTCARD_STATE_BUSY_RX) - { - hsc->State = HAL_SMARTCARD_STATE_BUSY_TX_RX; - } - else - { - hsc->State = HAL_SMARTCARD_STATE_BUSY_TX; - } - - /* Set the SMARTCARD DMA transfer complete callback */ - hsc->hdmatx->XferCpltCallback = SMARTCARD_DMATransmitCplt; - - /* Set the DMA error callback */ - hsc->hdmatx->XferErrorCallback = SMARTCARD_DMAError; - - /* Enable the SMARTCARD transmit DMA Stream */ - tmp = (uint32_t*)&pData; - HAL_DMA_Start_IT(hsc->hdmatx, *(uint32_t*)tmp, (uint32_t)&hsc->Instance->DR, Size); - - /* Clear the TC flag in the SR register by writing 0 to it */ - __HAL_SMARTCARD_CLEAR_FLAG(hsc, SMARTCARD_FLAG_TC); - - /* Enable the DMA transfer for transmit request by setting the DMAT bit - in the SMARTCARD CR3 register */ - hsc->Instance->CR3 |= USART_CR3_DMAT; - - /* Process Unlocked */ - __HAL_UNLOCK(hsc); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Receive an amount of data in non blocking mode - * @param hsc: pointer to a SMARTCARD_HandleTypeDef structure that contains - * the configuration information for SMARTCARD module. - * @param pData: pointer to data buffer - * @param Size: amount of data to be received - * @note When the SMARTCARD parity is enabled (PCE = 1) the data received contain the parity bit.s - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SMARTCARD_Receive_DMA(SMARTCARD_HandleTypeDef *hsc, uint8_t *pData, uint16_t Size) -{ - uint32_t *tmp; - uint32_t tmp1 = 0; - - tmp1 = hsc->State; - if((tmp1 == HAL_SMARTCARD_STATE_READY) || (tmp1 == HAL_SMARTCARD_STATE_BUSY_TX)) - { - if((pData == NULL) || (Size == 0)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hsc); - - hsc->pRxBuffPtr = pData; - hsc->RxXferSize = Size; - - hsc->ErrorCode = HAL_SMARTCARD_ERROR_NONE; - /* Check if a non-blocking transmit process is ongoing or not */ - if(hsc->State == HAL_SMARTCARD_STATE_BUSY_TX) - { - hsc->State = HAL_SMARTCARD_STATE_BUSY_TX_RX; - } - else - { - hsc->State = HAL_SMARTCARD_STATE_BUSY_RX; - } - - /* Set the SMARTCARD DMA transfer complete callback */ - hsc->hdmarx->XferCpltCallback = SMARTCARD_DMAReceiveCplt; - - /* Set the DMA error callback */ - hsc->hdmarx->XferErrorCallback = SMARTCARD_DMAError; - - /* Enable the DMA Stream */ - tmp = (uint32_t*)&pData; - HAL_DMA_Start_IT(hsc->hdmarx, (uint32_t)&hsc->Instance->DR, *(uint32_t*)tmp, Size); - - /* Enable the DMA transfer for the receiver request by setting the DMAR bit - in the SMARTCARD CR3 register */ - hsc->Instance->CR3 |= USART_CR3_DMAR; - - /* Process Unlocked */ - __HAL_UNLOCK(hsc); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief This function handles SMARTCARD interrupt request. - * @param hsc: pointer to a SMARTCARD_HandleTypeDef structure that contains - * the configuration information for SMARTCARD module. - * @retval None - */ -void HAL_SMARTCARD_IRQHandler(SMARTCARD_HandleTypeDef *hsc) -{ - uint32_t tmp1 = 0, tmp2 = 0; - - tmp1 = hsc->Instance->SR; - tmp2 = __HAL_SMARTCARD_GET_IT_SOURCE(hsc, SMARTCARD_IT_PE); - - /* SMARTCARD parity error interrupt occurred --------------------------------*/ - if(((tmp1 & SMARTCARD_FLAG_PE) != RESET) && (tmp2 != RESET)) - { - __HAL_SMARTCARD_CLEAR_PEFLAG(hsc); - hsc->ErrorCode |= HAL_SMARTCARD_ERROR_PE; - } - - tmp2 = __HAL_SMARTCARD_GET_IT_SOURCE(hsc, SMARTCARD_IT_ERR); - /* SMARTCARD frame error interrupt occurred ---------------------------------*/ - if(((tmp1 & SMARTCARD_FLAG_FE) != RESET) && (tmp2 != RESET)) - { - __HAL_SMARTCARD_CLEAR_FEFLAG(hsc); - hsc->ErrorCode |= HAL_SMARTCARD_ERROR_FE; - } - - tmp2 = __HAL_SMARTCARD_GET_IT_SOURCE(hsc, SMARTCARD_IT_ERR); - /* SMARTCARD noise error interrupt occurred ---------------------------------*/ - if(((tmp1 & SMARTCARD_FLAG_NE) != RESET) && (tmp2 != RESET)) - { - __HAL_SMARTCARD_CLEAR_NEFLAG(hsc); - hsc->ErrorCode |= HAL_SMARTCARD_ERROR_NE; - } - - tmp2 = __HAL_SMARTCARD_GET_IT_SOURCE(hsc, SMARTCARD_IT_ERR); - /* SMARTCARD Over-Run interrupt occurred ------------------------------------*/ - if(((tmp1 & SMARTCARD_FLAG_ORE) != RESET) && (tmp2 != RESET)) - { - __HAL_SMARTCARD_CLEAR_OREFLAG(hsc); - hsc->ErrorCode |= HAL_SMARTCARD_ERROR_ORE; - } - - tmp2 = __HAL_SMARTCARD_GET_IT_SOURCE(hsc, SMARTCARD_IT_RXNE); - /* SMARTCARD in mode Receiver ----------------------------------------------*/ - if(((tmp1 & SMARTCARD_FLAG_RXNE) != RESET) && (tmp2 != RESET)) - { - SMARTCARD_Receive_IT(hsc); - } - - tmp2 = __HAL_SMARTCARD_GET_IT_SOURCE(hsc, SMARTCARD_IT_TXE); - /* SMARTCARD in mode Transmitter -------------------------------------------*/ - if(((tmp1 & SMARTCARD_FLAG_TXE) != RESET) && (tmp2 != RESET)) - { - SMARTCARD_Transmit_IT(hsc); - } - - tmp2 = __HAL_SMARTCARD_GET_IT_SOURCE(hsc, SMARTCARD_IT_TC); - /* SMARTCARD in mode Transmitter (transmission end) ------------------------*/ - if(((tmp1 & SMARTCARD_FLAG_TC) != RESET) && (tmp2 != RESET)) - { - SMARTCARD_EndTransmit_IT(hsc); - } - - /* Call the Error call Back in case of Errors */ - if(hsc->ErrorCode != HAL_SMARTCARD_ERROR_NONE) - { - /* Set the SMARTCARD state ready to be able to start again the process */ - hsc->State= HAL_SMARTCARD_STATE_READY; - HAL_SMARTCARD_ErrorCallback(hsc); - } -} - -/** - * @brief Tx Transfer completed callbacks - * @param hsc: pointer to a SMARTCARD_HandleTypeDef structure that contains - * the configuration information for SMARTCARD module. - * @retval None - */ - __weak void HAL_SMARTCARD_TxCpltCallback(SMARTCARD_HandleTypeDef *hsc) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_SMARTCARD_TxCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Rx Transfer completed callbacks - * @param hsc: pointer to a SMARTCARD_HandleTypeDef structure that contains - * the configuration information for SMARTCARD module. - * @retval None - */ -__weak void HAL_SMARTCARD_RxCpltCallback(SMARTCARD_HandleTypeDef *hsc) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_SMARTCARD_TxCpltCallback could be implemented in the user file - */ -} - -/** - * @brief SMARTCARD error callbacks - * @param hsc: pointer to a SMARTCARD_HandleTypeDef structure that contains - * the configuration information for SMARTCARD module. - * @retval None - */ - __weak void HAL_SMARTCARD_ErrorCallback(SMARTCARD_HandleTypeDef *hsc) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_SMARTCARD_ErrorCallback could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup SMARTCARD_Exported_Functions_Group3 Peripheral State and Errors functions - * @brief SMARTCARD State and Errors functions - * -@verbatim - =============================================================================== - ##### Peripheral State and Errors functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to control the SmartCard. - (+) HAL_SMARTCARD_GetState() API can be helpful to check in run-time the state of the SmartCard peripheral. - (+) HAL_SMARTCARD_GetError() check in run-time errors that could be occurred during communication. -@endverbatim - * @{ - */ - -/** - * @brief return the SMARTCARD state - * @param hsc: pointer to a SMARTCARD_HandleTypeDef structure that contains - * the configuration information for SMARTCARD module. - * @retval HAL state - */ -HAL_SMARTCARD_StateTypeDef HAL_SMARTCARD_GetState(SMARTCARD_HandleTypeDef *hsc) -{ - return hsc->State; -} - -/** - * @brief Return the SMARTCARD error code - * @param hsc : pointer to a SMARTCARD_HandleTypeDef structure that contains - * the configuration information for the specified SMARTCARD. - * @retval SMARTCARD Error Code - */ -uint32_t HAL_SMARTCARD_GetError(SMARTCARD_HandleTypeDef *hsc) -{ - return hsc->ErrorCode; -} - -/** - * @} - */ - -/** - * @brief DMA SMARTCARD transmit process complete callback - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void SMARTCARD_DMATransmitCplt(DMA_HandleTypeDef *hdma) -{ - SMARTCARD_HandleTypeDef* hsc = ( SMARTCARD_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; - - hsc->TxXferCount = 0; - - /* Disable the DMA transfer for transmit request by setting the DMAT bit - in the USART CR3 register */ - hsc->Instance->CR3 &= (uint32_t)~((uint32_t)USART_CR3_DMAT); - - /* Enable the SMARTCARD Transmit Complete Interrupt */ - __HAL_SMARTCARD_ENABLE_IT(hsc, SMARTCARD_IT_TC); -} - -/** - * @brief DMA SMARTCARD receive process complete callback - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void SMARTCARD_DMAReceiveCplt(DMA_HandleTypeDef *hdma) -{ - SMARTCARD_HandleTypeDef* hsc = ( SMARTCARD_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; - - hsc->RxXferCount = 0; - - /* Disable the DMA transfer for the receiver request by setting the DMAR bit - in the USART CR3 register */ - hsc->Instance->CR3 &= (uint32_t)~((uint32_t)USART_CR3_DMAR); - - /* Check if a non-blocking transmit process is ongoing or not */ - if(hsc->State == HAL_SMARTCARD_STATE_BUSY_TX_RX) - { - hsc->State = HAL_SMARTCARD_STATE_BUSY_TX; - } - else - { - hsc->State = HAL_SMARTCARD_STATE_READY; - } - - HAL_SMARTCARD_RxCpltCallback(hsc); -} - -/** - * @brief DMA SMARTCARD communication error callback - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void SMARTCARD_DMAError(DMA_HandleTypeDef *hdma) -{ - SMARTCARD_HandleTypeDef* hsc = ( SMARTCARD_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; - - hsc->RxXferCount = 0; - hsc->TxXferCount = 0; - hsc->ErrorCode = HAL_SMARTCARD_ERROR_DMA; - hsc->State= HAL_SMARTCARD_STATE_READY; - - HAL_SMARTCARD_ErrorCallback(hsc); -} - -/** - * @brief This function handles SMARTCARD Communication Timeout. - * @param hsc: SMARTCARD handle - * @param Flag: specifies the SMARTCARD flag to check. - * @param Status: The new Flag status (SET or RESET). - * @param Timeout: Timeout duration - * @retval HAL status - */ -static HAL_StatusTypeDef SMARTCARD_WaitOnFlagUntilTimeout(SMARTCARD_HandleTypeDef *hsc, uint32_t Flag, FlagStatus Status, uint32_t Timeout) -{ - uint32_t tickstart = 0; - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait until flag is set */ - if(Status == RESET) - { - while(__HAL_SMARTCARD_GET_FLAG(hsc, Flag) == RESET) - { - /* Check for the Timeout */ - if(Timeout != HAL_MAX_DELAY) - { - if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout)) - { - /* Disable TXE and RXNE interrupts for the interrupt process */ - __HAL_SMARTCARD_DISABLE_IT(hsc, SMARTCARD_IT_TXE); - __HAL_SMARTCARD_DISABLE_IT(hsc, SMARTCARD_IT_RXNE); - - hsc->State= HAL_SMARTCARD_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hsc); - - return HAL_TIMEOUT; - } - } - } - } - else - { - while(__HAL_SMARTCARD_GET_FLAG(hsc, Flag) != RESET) - { - /* Check for the Timeout */ - if(Timeout != HAL_MAX_DELAY) - { - if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout)) - { - /* Disable TXE and RXNE interrupts for the interrupt process */ - __HAL_SMARTCARD_DISABLE_IT(hsc, SMARTCARD_IT_TXE); - __HAL_SMARTCARD_DISABLE_IT(hsc, SMARTCARD_IT_RXNE); - - hsc->State= HAL_SMARTCARD_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hsc); - - return HAL_TIMEOUT; - } - } - } - } - return HAL_OK; -} - -/** - * @brief Send an amount of data in non blocking mode - * @param hsc: pointer to a SMARTCARD_HandleTypeDef structure that contains - * the configuration information for SMARTCARD module. - * @retval HAL status - */ -static HAL_StatusTypeDef SMARTCARD_Transmit_IT(SMARTCARD_HandleTypeDef *hsc) -{ - uint16_t* tmp; - uint32_t tmp1 = 0; - - tmp1 = hsc->State; - if((tmp1 == HAL_SMARTCARD_STATE_BUSY_TX) || (tmp1 == HAL_SMARTCARD_STATE_BUSY_TX_RX)) - { - tmp = (uint16_t*) hsc->pTxBuffPtr; - hsc->Instance->DR = (uint16_t)(*tmp & (uint16_t)0x01FF); - hsc->pTxBuffPtr += 1; - - if(--hsc->TxXferCount == 0) - { - /* Disable the SMARTCARD Transmit data register empty Interrupt */ - __HAL_SMARTCARD_DISABLE_IT(hsc, SMARTCARD_IT_TXE); - - /* Enable the SMARTCARD Transmit Complete Interrupt */ - __HAL_SMARTCARD_ENABLE_IT(hsc, SMARTCARD_IT_TC); - } - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Wraps up transmission in non blocking mode. - * @param hsmartcard: pointer to a SMARTCARD_HandleTypeDef structure that contains - * the configuration information for the specified SMARTCARD module. - * @retval HAL status - */ -static HAL_StatusTypeDef SMARTCARD_EndTransmit_IT(SMARTCARD_HandleTypeDef *hsmartcard) -{ - /* Disable the SMARTCARD Transmit Complete Interrupt */ - __HAL_SMARTCARD_DISABLE_IT(hsmartcard, SMARTCARD_IT_TC); - - /* Check if a receive process is ongoing or not */ - if(hsmartcard->State == HAL_SMARTCARD_STATE_BUSY_TX_RX) - { - hsmartcard->State = HAL_SMARTCARD_STATE_BUSY_RX; - } - else - { - /* Disable the SMARTCARD Error Interrupt: (Frame error, noise error, overrun error) */ - __HAL_SMARTCARD_DISABLE_IT(hsmartcard, SMARTCARD_IT_ERR); - - hsmartcard->State = HAL_SMARTCARD_STATE_READY; - } - - HAL_SMARTCARD_TxCpltCallback(hsmartcard); - - return HAL_OK; -} - -/** - * @brief Receive an amount of data in non blocking mode - * @param hsc: pointer to a SMARTCARD_HandleTypeDef structure that contains - * the configuration information for SMARTCARD module. - * @retval HAL status - */ -static HAL_StatusTypeDef SMARTCARD_Receive_IT(SMARTCARD_HandleTypeDef *hsc) -{ - uint16_t* tmp; - uint32_t tmp1 = 0; - - tmp1 = hsc->State; - if((tmp1 == HAL_SMARTCARD_STATE_BUSY_RX) || (tmp1 == HAL_SMARTCARD_STATE_BUSY_TX_RX)) - { - tmp = (uint16_t*) hsc->pRxBuffPtr; - *tmp = (uint16_t)(hsc->Instance->DR & (uint16_t)0x00FF); - hsc->pRxBuffPtr += 1; - - if(--hsc->RxXferCount == 0) - { - __HAL_SMARTCARD_DISABLE_IT(hsc, SMARTCARD_IT_RXNE); - - /* Disable the SMARTCARD Parity Error Interrupt */ - __HAL_SMARTCARD_DISABLE_IT(hsc, SMARTCARD_IT_PE); - - /* Disable the SMARTCARD Error Interrupt: (Frame error, noise error, overrun error) */ - __HAL_SMARTCARD_DISABLE_IT(hsc, SMARTCARD_IT_ERR); - - /* Check if a non-blocking transmit process is ongoing or not */ - if(hsc->State == HAL_SMARTCARD_STATE_BUSY_TX_RX) - { - hsc->State = HAL_SMARTCARD_STATE_BUSY_TX; - } - else - { - hsc->State = HAL_SMARTCARD_STATE_READY; - } - - HAL_SMARTCARD_RxCpltCallback(hsc); - - return HAL_OK; - } - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Configure the SMARTCARD peripheral - * @param hsc: pointer to a SMARTCARD_HandleTypeDef structure that contains - * the configuration information for SMARTCARD module. - * @retval None - */ -static void SMARTCARD_SetConfig(SMARTCARD_HandleTypeDef *hsc) -{ - uint32_t tmpreg = 0x00; - - /* Check the parameters */ - assert_param(IS_SMARTCARD_INSTANCE(hsc->Instance)); - assert_param(IS_SMARTCARD_POLARITY(hsc->Init.CLKPolarity)); - assert_param(IS_SMARTCARD_PHASE(hsc->Init.CLKPhase)); - assert_param(IS_SMARTCARD_LASTBIT(hsc->Init.CLKLastBit)); - assert_param(IS_SMARTCARD_BAUDRATE(hsc->Init.BaudRate)); - assert_param(IS_SMARTCARD_WORD_LENGTH(hsc->Init.WordLength)); - assert_param(IS_SMARTCARD_STOPBITS(hsc->Init.StopBits)); - assert_param(IS_SMARTCARD_PARITY(hsc->Init.Parity)); - assert_param(IS_SMARTCARD_MODE(hsc->Init.Mode)); - assert_param(IS_SMARTCARD_NACK_STATE(hsc->Init.NACKState)); - - /* The LBCL, CPOL and CPHA bits have to be selected when both the transmitter and the - receiver are disabled (TE=RE=0) to ensure that the clock pulses function correctly. */ - hsc->Instance->CR1 &= (uint32_t)~((uint32_t)(USART_CR1_TE | USART_CR1_RE)); - - /*---------------------------- USART CR2 Configuration ---------------------*/ - tmpreg = hsc->Instance->CR2; - /* Clear CLKEN, CPOL, CPHA and LBCL bits */ - tmpreg &= (uint32_t)~((uint32_t)(USART_CR2_CPHA | USART_CR2_CPOL | USART_CR2_CLKEN | USART_CR2_LBCL)); - /* Configure the SMARTCARD Clock, CPOL, CPHA and LastBit -----------------------*/ - /* Set CPOL bit according to hsc->Init.CLKPolarity value */ - /* Set CPHA bit according to hsc->Init.CLKPhase value */ - /* Set LBCL bit according to hsc->Init.CLKLastBit value */ - /* Set Stop Bits: Set STOP[13:12] bits according to hsc->Init.StopBits value */ - tmpreg |= (uint32_t)(USART_CR2_CLKEN | hsc->Init.CLKPolarity | - hsc->Init.CLKPhase| hsc->Init.CLKLastBit | hsc->Init.StopBits); - /* Write to USART CR2 */ - hsc->Instance->CR2 = (uint32_t)tmpreg; - - tmpreg = hsc->Instance->CR2; - - /* Clear STOP[13:12] bits */ - tmpreg &= (uint32_t)~((uint32_t)USART_CR2_STOP); - - /* Set Stop Bits: Set STOP[13:12] bits according to hsc->Init.StopBits value */ - tmpreg |= (uint32_t)(hsc->Init.StopBits); - - /* Write to USART CR2 */ - hsc->Instance->CR2 = (uint32_t)tmpreg; - - /*-------------------------- USART CR1 Configuration -----------------------*/ - tmpreg = hsc->Instance->CR1; - - /* Clear M, PCE, PS, TE and RE bits */ - tmpreg &= (uint32_t)~((uint32_t)(USART_CR1_M | USART_CR1_PCE | USART_CR1_PS | USART_CR1_TE | \ - USART_CR1_RE)); - - /* Configure the SMARTCARD Word Length, Parity and mode: - Set the M bits according to hsc->Init.WordLength value - Set PCE and PS bits according to hsc->Init.Parity value - Set TE and RE bits according to hsc->Init.Mode value */ - tmpreg |= (uint32_t)hsc->Init.WordLength | hsc->Init.Parity | hsc->Init.Mode; - - /* Write to USART CR1 */ - hsc->Instance->CR1 = (uint32_t)tmpreg; - - /*-------------------------- USART CR3 Configuration -----------------------*/ - /* Clear CTSE and RTSE bits */ - hsc->Instance->CR3 &= (uint32_t)~((uint32_t)(USART_CR3_RTSE | USART_CR3_CTSE)); - - /*-------------------------- USART BRR Configuration -----------------------*/ - if((hsc->Instance == USART1) || (hsc->Instance == USART6)) - { - hsc->Instance->BRR = SMARTCARD_BRR(HAL_RCC_GetPCLK2Freq(), hsc->Init.BaudRate); - } - else - { - hsc->Instance->BRR = SMARTCARD_BRR(HAL_RCC_GetPCLK1Freq(), hsc->Init.BaudRate); - } -} - -/** - * @} - */ - -#endif /* HAL_SMARTCARD_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_spi.c b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_spi.c deleted file mode 100755 index e3093013..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_spi.c +++ /dev/null @@ -1,2298 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_hal_spi.c - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief SPI HAL module driver. - * - * This file provides firmware functions to manage the following - * functionalities of the Serial Peripheral Interface (SPI) peripheral: - * + Initialization and de-initialization functions - * + IO operation functions - * + Peripheral Control functions - * + Peripheral State functions - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - The SPI HAL driver can be used as follows: - - (#) Declare a SPI_HandleTypeDef handle structure, for example: - SPI_HandleTypeDef hspi; - - (#)Initialize the SPI low level resources by implementing the HAL_SPI_MspInit ()API: - (##) Enable the SPIx interface clock - (##) SPI pins configuration - (+++) Enable the clock for the SPI GPIOs - (+++) Configure these SPI pins as alternate function push-pull - (##) NVIC configuration if you need to use interrupt process - (+++) Configure the SPIx interrupt priority - (+++) Enable the NVIC SPI IRQ handle - (##) DMA Configuration if you need to use DMA process - (+++) Declare a DMA_HandleTypeDef handle structure for the transmit or receive stream - (+++) Enable the DMAx interface clock using - (+++) Configure the DMA handle parameters - (+++) Configure the DMA Tx or Rx Stream - (+++) Associate the initialized hdma_tx handle to the hspi DMA Tx or Rx handle - (+++) Configure the priority and enable the NVIC for the transfer complete interrupt on the DMA Tx or Rx Stream - - (#) Program the Mode, Direction , Data size, Baudrate Prescaler, NSS - management, Clock polarity and phase, FirstBit and CRC configuration in the hspi Init structure. - - (#) Initialize the SPI registers by calling the HAL_SPI_Init() API: - (++) This API configures also the low level Hardware GPIO, CLOCK, CORTEX...etc) - by calling the customized HAL_SPI_MspInit() API. - [..] - Circular mode restriction: - (#) The DMA circular mode cannot be used when the SPI is configured in these modes: - (##) Master 2Lines RxOnly - (##) Master 1Line Rx - (#) The CRC feature is not managed when the DMA circular mode is enabled - (#) When the SPI DMA Pause/Stop features are used, we must use the following APIs - the HAL_SPI_DMAPause()/ HAL_SPI_DMAStop() only under the SPI callbacks - - - - @endverbatim - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal.h" - -/** @addtogroup STM32F2xx_HAL_Driver - * @{ - */ - -/** @defgroup SPI SPI - * @brief SPI HAL module driver - * @{ - */ - -#ifdef HAL_SPI_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -#define SPI_TIMEOUT_VALUE 10 -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/** @addtogroup SPI_Private_Functions - * @{ - */ -static void SPI_TxCloseIRQHandler(SPI_HandleTypeDef *hspi); -static void SPI_TxISR(SPI_HandleTypeDef *hspi); -static void SPI_RxCloseIRQHandler(SPI_HandleTypeDef *hspi); -static void SPI_2LinesRxISR(SPI_HandleTypeDef *hspi); -static void SPI_RxISR(SPI_HandleTypeDef *hspi); -static void SPI_DMAEndTransmitReceive(SPI_HandleTypeDef *hspi); -static void SPI_DMATransmitCplt(DMA_HandleTypeDef *hdma); -static void SPI_DMAReceiveCplt(DMA_HandleTypeDef *hdma); -static void SPI_DMATransmitReceiveCplt(DMA_HandleTypeDef *hdma); -static void SPI_DMAHalfTransmitCplt(DMA_HandleTypeDef *hdma); -static void SPI_DMAHalfReceiveCplt(DMA_HandleTypeDef *hdma); -static void SPI_DMAHalfTransmitReceiveCplt(DMA_HandleTypeDef *hdma); -static void SPI_DMAError(DMA_HandleTypeDef *hdma); -static HAL_StatusTypeDef SPI_WaitOnFlagUntilTimeout(SPI_HandleTypeDef *hspi, uint32_t Flag, FlagStatus Status, uint32_t Timeout); -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup SPI_Exported_Functions SPI Exported Functions - * @{ - */ - -/** @defgroup SPI_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - ##### Initialization and de-initialization functions ##### - =============================================================================== - [..] This subsection provides a set of functions allowing to initialize and - de-initialize the SPIx peripheral: - - (+) User must implement HAL_SPI_MspInit() function in which he configures - all related peripherals resources (CLOCK, GPIO, DMA, IT and NVIC ). - - (+) Call the function HAL_SPI_Init() to configure the selected device with - the selected configuration: - (++) Mode - (++) Direction - (++) Data Size - (++) Clock Polarity and Phase - (++) NSS Management - (++) BaudRate Prescaler - (++) FirstBit - (++) TIMode - (++) CRC Calculation - (++) CRC Polynomial if CRC enabled - - (+) Call the function HAL_SPI_DeInit() to restore the default configuration - of the selected SPIx peripheral. - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the SPI according to the specified parameters - * in the SPI_InitTypeDef and create the associated handle. - * @param hspi: pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_Init(SPI_HandleTypeDef *hspi) -{ - /* Check the SPI handle allocation */ - if(hspi == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_SPI_MODE(hspi->Init.Mode)); - assert_param(IS_SPI_DIRECTION_MODE(hspi->Init.Direction)); - assert_param(IS_SPI_DATASIZE(hspi->Init.DataSize)); - assert_param(IS_SPI_CPOL(hspi->Init.CLKPolarity)); - assert_param(IS_SPI_CPHA(hspi->Init.CLKPhase)); - assert_param(IS_SPI_NSS(hspi->Init.NSS)); - assert_param(IS_SPI_BAUDRATE_PRESCALER(hspi->Init.BaudRatePrescaler)); - assert_param(IS_SPI_FIRST_BIT(hspi->Init.FirstBit)); - assert_param(IS_SPI_TIMODE(hspi->Init.TIMode)); - assert_param(IS_SPI_CRC_CALCULATION(hspi->Init.CRCCalculation)); - assert_param(IS_SPI_CRC_POLYNOMIAL(hspi->Init.CRCPolynomial)); - - if(hspi->State == HAL_SPI_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - hspi->Lock = HAL_UNLOCKED; - /* Init the low level hardware : GPIO, CLOCK, NVIC... */ - HAL_SPI_MspInit(hspi); - } - - hspi->State = HAL_SPI_STATE_BUSY; - - /* Disable the selected SPI peripheral */ - __HAL_SPI_DISABLE(hspi); - - /*----------------------- SPIx CR1 & CR2 Configuration ---------------------*/ - /* Configure : SPI Mode, Communication Mode, Data size, Clock polarity and phase, NSS management, - Communication speed, First bit and CRC calculation state */ - hspi->Instance->CR1 = (hspi->Init.Mode | hspi->Init.Direction | hspi->Init.DataSize | - hspi->Init.CLKPolarity | hspi->Init.CLKPhase | (hspi->Init.NSS & SPI_CR1_SSM) | - hspi->Init.BaudRatePrescaler | hspi->Init.FirstBit | hspi->Init.CRCCalculation); - - /* Configure : NSS management */ - hspi->Instance->CR2 = (((hspi->Init.NSS >> 16) & SPI_CR2_SSOE) | hspi->Init.TIMode); - - /*---------------------------- SPIx CRCPOLY Configuration ------------------*/ - /* Configure : CRC Polynomial */ - hspi->Instance->CRCPR = hspi->Init.CRCPolynomial; - - /* Activate the SPI mode (Make sure that I2SMOD bit in I2SCFGR register is reset) */ - hspi->Instance->I2SCFGR &= (uint32_t)(~SPI_I2SCFGR_I2SMOD); - - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - hspi->State = HAL_SPI_STATE_READY; - - return HAL_OK; -} - -/** - * @brief DeInitializes the SPI peripheral - * @param hspi: pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_DeInit(SPI_HandleTypeDef *hspi) -{ - /* Check the SPI handle allocation */ - if(hspi == NULL) - { - return HAL_ERROR; - } - - /* Disable the SPI Peripheral Clock */ - __HAL_SPI_DISABLE(hspi); - - /* DeInit the low level hardware: GPIO, CLOCK, NVIC... */ - HAL_SPI_MspDeInit(hspi); - - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - hspi->State = HAL_SPI_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(hspi); - - return HAL_OK; -} - -/** - * @brief SPI MSP Init - * @param hspi: pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ - __weak void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi) - { - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_SPI_MspInit could be implemented in the user file - */ -} - -/** - * @brief SPI MSP DeInit - * @param hspi: pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ - __weak void HAL_SPI_MspDeInit(SPI_HandleTypeDef *hspi) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_SPI_MspDeInit could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup SPI_Exported_Functions_Group2 IO operation functions - * @brief Data transfers functions - * -@verbatim - ============================================================================== - ##### IO operation functions ##### - =============================================================================== - This subsection provides a set of functions allowing to manage the SPI - data transfers. - - [..] The SPI supports master and slave mode : - - (#) There are two modes of transfer: - (++) Blocking mode: The communication is performed in polling mode. - The HAL status of all data processing is returned by the same function - after finishing transfer. - (++) No-Blocking mode: The communication is performed using Interrupts - or DMA, These APIs return the HAL status. - The end of the data processing will be indicated through the - dedicated SPI IRQ when using Interrupt mode or the DMA IRQ when - using DMA mode. - The HAL_SPI_TxCpltCallback(), HAL_SPI_RxCpltCallback() and HAL_SPI_TxRxCpltCallback() user callbacks - will be executed respectively at the end of the transmit or Receive process - The HAL_SPI_ErrorCallback()user callback will be executed when a communication error is detected - - (#) APIs provided for these 2 transfer modes (Blocking mode or Non blocking mode using either Interrupt or DMA) - exist for 1Line (simplex) and 2Lines (full duplex) modes. - -@endverbatim - * @{ - */ - -/** - * @brief Transmit an amount of data in blocking mode - * @param hspi: pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @param pData: pointer to data buffer - * @param Size: amount of data to be sent - * @param Timeout: Timeout duration - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout) -{ - - if(hspi->State == HAL_SPI_STATE_READY) - { - if((pData == NULL ) || (Size == 0)) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE(hspi->Init.Direction)); - - /* Process Locked */ - __HAL_LOCK(hspi); - - /* Configure communication */ - hspi->State = HAL_SPI_STATE_BUSY_TX; - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - - hspi->pTxBuffPtr = pData; - hspi->TxXferSize = Size; - hspi->TxXferCount = Size; - - /*Init field not used in handle to zero */ - hspi->TxISR = 0; - hspi->RxISR = 0; - hspi->RxXferSize = 0; - hspi->RxXferCount = 0; - - /* Reset CRC Calculation */ - if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - SPI_RESET_CRC(hspi); - } - - if(hspi->Init.Direction == SPI_DIRECTION_1LINE) - { - /* Configure communication direction : 1Line */ - SPI_1LINE_TX(hspi); - } - - /* Check if the SPI is already enabled */ - if((hspi->Instance->CR1 &SPI_CR1_SPE) != SPI_CR1_SPE) - { - /* Enable SPI peripheral */ - __HAL_SPI_ENABLE(hspi); - } - - /* Transmit data in 8 Bit mode */ - if(hspi->Init.DataSize == SPI_DATASIZE_8BIT) - { - if((hspi->Init.Mode == SPI_MODE_SLAVE)|| (hspi->TxXferCount == 0x01)) - { - hspi->Instance->DR = (*hspi->pTxBuffPtr++); - hspi->TxXferCount--; - } - while(hspi->TxXferCount > 0) - { - /* Wait until TXE flag is set to send data */ - if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_TXE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - hspi->Instance->DR = (*hspi->pTxBuffPtr++); - hspi->TxXferCount--; - } - /* Enable CRC Transmission */ - if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - hspi->Instance->CR1 |= SPI_CR1_CRCNEXT; - } - } - /* Transmit data in 16 Bit mode */ - else - { - if((hspi->Init.Mode == SPI_MODE_SLAVE) || (hspi->TxXferCount == 0x01)) - { - hspi->Instance->DR = *((uint16_t*)hspi->pTxBuffPtr); - hspi->pTxBuffPtr+=2; - hspi->TxXferCount--; - } - while(hspi->TxXferCount > 0) - { - /* Wait until TXE flag is set to send data */ - if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_TXE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - hspi->Instance->DR = *((uint16_t*)hspi->pTxBuffPtr); - hspi->pTxBuffPtr+=2; - hspi->TxXferCount--; - } - /* Enable CRC Transmission */ - if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - hspi->Instance->CR1 |= SPI_CR1_CRCNEXT; - } - } - - /* Wait until TXE flag is set to send data */ - if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_TXE, RESET, Timeout) != HAL_OK) - { - hspi->ErrorCode |= HAL_SPI_ERROR_FLAG; - return HAL_TIMEOUT; - } - - /* Wait until Busy flag is reset before disabling SPI */ - if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_BSY, SET, Timeout) != HAL_OK) - { - hspi->ErrorCode |= HAL_SPI_ERROR_FLAG; - return HAL_TIMEOUT; - } - - /* Clear OVERRUN flag in 2 Lines communication mode because received is not read */ - if(hspi->Init.Direction == SPI_DIRECTION_2LINES) - { - __HAL_SPI_CLEAR_OVRFLAG(hspi); - } - - hspi->State = HAL_SPI_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Receive an amount of data in blocking mode - * @param hspi: pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @param pData: pointer to data buffer - * @param Size: amount of data to be sent - * @param Timeout: Timeout duration - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout) -{ - __IO uint16_t tmpreg; - uint32_t tmp = 0; - - if(hspi->State == HAL_SPI_STATE_READY) - { - if((pData == NULL ) || (Size == 0)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hspi); - - /* Configure communication */ - hspi->State = HAL_SPI_STATE_BUSY_RX; - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - - hspi->pRxBuffPtr = pData; - hspi->RxXferSize = Size; - hspi->RxXferCount = Size; - - /*Init field not used in handle to zero */ - hspi->RxISR = 0; - hspi->TxISR = 0; - hspi->TxXferSize = 0; - hspi->TxXferCount = 0; - - /* Configure communication direction : 1Line */ - if(hspi->Init.Direction == SPI_DIRECTION_1LINE) - { - SPI_1LINE_RX(hspi); - } - - /* Reset CRC Calculation */ - if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - SPI_RESET_CRC(hspi); - } - - if((hspi->Init.Mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES)) - { - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - - /* Call transmit-receive function to send Dummy data on Tx line and generate clock on CLK line */ - return HAL_SPI_TransmitReceive(hspi, pData, pData, Size, Timeout); - } - - /* Check if the SPI is already enabled */ - if((hspi->Instance->CR1 &SPI_CR1_SPE) != SPI_CR1_SPE) - { - /* Enable SPI peripheral */ - __HAL_SPI_ENABLE(hspi); - } - - /* Receive data in 8 Bit mode */ - if(hspi->Init.DataSize == SPI_DATASIZE_8BIT) - { - while(hspi->RxXferCount > 1) - { - /* Wait until RXNE flag is set */ - if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - (*hspi->pRxBuffPtr++) = hspi->Instance->DR; - hspi->RxXferCount--; - } - /* Enable CRC Transmission */ - if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - hspi->Instance->CR1 |= SPI_CR1_CRCNEXT; - } - } - /* Receive data in 16 Bit mode */ - else - { - while(hspi->RxXferCount > 1) - { - /* Wait until RXNE flag is set to read data */ - if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - *((uint16_t*)hspi->pRxBuffPtr) = hspi->Instance->DR; - hspi->pRxBuffPtr+=2; - hspi->RxXferCount--; - } - /* Enable CRC Transmission */ - if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - hspi->Instance->CR1 |= SPI_CR1_CRCNEXT; - } - } - - /* Wait until RXNE flag is set */ - if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Receive last data in 8 Bit mode */ - if(hspi->Init.DataSize == SPI_DATASIZE_8BIT) - { - (*hspi->pRxBuffPtr++) = hspi->Instance->DR; - } - /* Receive last data in 16 Bit mode */ - else - { - *((uint16_t*)hspi->pRxBuffPtr) = hspi->Instance->DR; - hspi->pRxBuffPtr+=2; - } - hspi->RxXferCount--; - - /* Wait until RXNE flag is set: CRC Received */ - if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, Timeout) != HAL_OK) - { - hspi->ErrorCode |= HAL_SPI_ERROR_CRC; - return HAL_TIMEOUT; - } - - /* Read CRC to Flush RXNE flag */ - tmpreg = hspi->Instance->DR; - UNUSED(tmpreg); - } - - if((hspi->Init.Mode == SPI_MODE_MASTER)&&((hspi->Init.Direction == SPI_DIRECTION_1LINE)||(hspi->Init.Direction == SPI_DIRECTION_2LINES_RXONLY))) - { - /* Disable SPI peripheral */ - __HAL_SPI_DISABLE(hspi); - } - - hspi->State = HAL_SPI_STATE_READY; - - tmp = __HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR); - /* Check if CRC error occurred */ - if((hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) && (tmp != RESET)) - { - hspi->ErrorCode |= HAL_SPI_ERROR_CRC; - - /* Reset CRC Calculation */ - SPI_RESET_CRC(hspi); - - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - - return HAL_ERROR; - } - - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Transmit and Receive an amount of data in blocking mode - * @param hspi: pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @param pTxData: pointer to transmission data buffer - * @param pRxData: pointer to reception data buffer to be - * @param Size: amount of data to be sent - * @param Timeout: Timeout duration - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout) -{ - __IO uint16_t tmpreg; - uint32_t tmpstate = 0, tmp = 0; - - tmpstate = hspi->State; - if((tmpstate == HAL_SPI_STATE_READY) || (tmpstate == HAL_SPI_STATE_BUSY_RX)) - { - if((pTxData == NULL ) || (pRxData == NULL ) || (Size == 0)) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction)); - - /* Process Locked */ - __HAL_LOCK(hspi); - - /* Don't overwrite in case of HAL_SPI_STATE_BUSY_RX */ - if(hspi->State == HAL_SPI_STATE_READY) - { - hspi->State = HAL_SPI_STATE_BUSY_TX_RX; - } - - /* Configure communication */ - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - - hspi->pRxBuffPtr = pRxData; - hspi->RxXferSize = Size; - hspi->RxXferCount = Size; - - hspi->pTxBuffPtr = pTxData; - hspi->TxXferSize = Size; - hspi->TxXferCount = Size; - - /*Init field not used in handle to zero */ - hspi->RxISR = 0; - hspi->TxISR = 0; - - /* Reset CRC Calculation */ - if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - SPI_RESET_CRC(hspi); - } - - /* Check if the SPI is already enabled */ - if((hspi->Instance->CR1 &SPI_CR1_SPE) != SPI_CR1_SPE) - { - /* Enable SPI peripheral */ - __HAL_SPI_ENABLE(hspi); - } - - /* Transmit and Receive data in 16 Bit mode */ - if(hspi->Init.DataSize == SPI_DATASIZE_16BIT) - { - if((hspi->Init.Mode == SPI_MODE_SLAVE) || ((hspi->Init.Mode == SPI_MODE_MASTER) && (hspi->TxXferCount == 0x01))) - { - hspi->Instance->DR = *((uint16_t*)hspi->pTxBuffPtr); - hspi->pTxBuffPtr+=2; - hspi->TxXferCount--; - } - if(hspi->TxXferCount == 0) - { - /* Enable CRC Transmission */ - if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - hspi->Instance->CR1 |= SPI_CR1_CRCNEXT; - } - - /* Wait until RXNE flag is set */ - if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - *((uint16_t*)hspi->pRxBuffPtr) = hspi->Instance->DR; - hspi->pRxBuffPtr+=2; - hspi->RxXferCount--; - } - else - { - while(hspi->TxXferCount > 0) - { - /* Wait until TXE flag is set to send data */ - if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_TXE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - hspi->Instance->DR = *((uint16_t*)hspi->pTxBuffPtr); - hspi->pTxBuffPtr+=2; - hspi->TxXferCount--; - - /* Enable CRC Transmission */ - if((hspi->TxXferCount == 0) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)) - { - hspi->Instance->CR1 |= SPI_CR1_CRCNEXT; - } - - /* Wait until RXNE flag is set */ - if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - *((uint16_t*)hspi->pRxBuffPtr) = hspi->Instance->DR; - hspi->pRxBuffPtr+=2; - hspi->RxXferCount--; - } - /* Receive the last byte */ - if(hspi->Init.Mode == SPI_MODE_SLAVE) - { - /* Wait until RXNE flag is set */ - if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - *((uint16_t*)hspi->pRxBuffPtr) = hspi->Instance->DR; - hspi->pRxBuffPtr+=2; - hspi->RxXferCount--; - } - } - } - /* Transmit and Receive data in 8 Bit mode */ - else - { - if((hspi->Init.Mode == SPI_MODE_SLAVE) || ((hspi->Init.Mode == SPI_MODE_MASTER) && (hspi->TxXferCount == 0x01))) - { - hspi->Instance->DR = (*hspi->pTxBuffPtr++); - hspi->TxXferCount--; - } - if(hspi->TxXferCount == 0) - { - /* Enable CRC Transmission */ - if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - hspi->Instance->CR1 |= SPI_CR1_CRCNEXT; - } - - /* Wait until RXNE flag is set */ - if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - (*hspi->pRxBuffPtr) = hspi->Instance->DR; - hspi->RxXferCount--; - } - else - { - while(hspi->TxXferCount > 0) - { - /* Wait until TXE flag is set to send data */ - if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_TXE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - hspi->Instance->DR = (*hspi->pTxBuffPtr++); - hspi->TxXferCount--; - - /* Enable CRC Transmission */ - if((hspi->TxXferCount == 0) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)) - { - hspi->Instance->CR1 |= SPI_CR1_CRCNEXT; - } - - /* Wait until RXNE flag is set */ - if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - (*hspi->pRxBuffPtr++) = hspi->Instance->DR; - hspi->RxXferCount--; - } - if(hspi->Init.Mode == SPI_MODE_SLAVE) - { - /* Wait until RXNE flag is set */ - if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - (*hspi->pRxBuffPtr++) = hspi->Instance->DR; - hspi->RxXferCount--; - } - } - } - - /* Read CRC from DR to close CRC calculation process */ - if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - /* Wait until RXNE flag is set */ - if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, Timeout) != HAL_OK) - { - hspi->ErrorCode |= HAL_SPI_ERROR_CRC; - return HAL_TIMEOUT; - } - /* Read CRC */ - tmpreg = hspi->Instance->DR; - UNUSED(tmpreg); - } - - /* Wait until Busy flag is reset before disabling SPI */ - if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_BSY, SET, Timeout) != HAL_OK) - { - hspi->ErrorCode |= HAL_SPI_ERROR_FLAG; - return HAL_TIMEOUT; - } - - hspi->State = HAL_SPI_STATE_READY; - - tmp = __HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR); - /* Check if CRC error occurred */ - if((hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) && (tmp != RESET)) - { - hspi->ErrorCode |= HAL_SPI_ERROR_CRC; - - /* Reset CRC Calculation */ - if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - SPI_RESET_CRC(hspi); - } - - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - - return HAL_ERROR; - } - - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Transmit an amount of data in no-blocking mode with Interrupt - * @param hspi: pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @param pData: pointer to data buffer - * @param Size: amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_Transmit_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size) -{ - if(hspi->State == HAL_SPI_STATE_READY) - { - if((pData == NULL) || (Size == 0)) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE(hspi->Init.Direction)); - - /* Process Locked */ - __HAL_LOCK(hspi); - - /* Configure communication */ - hspi->State = HAL_SPI_STATE_BUSY_TX; - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - - hspi->TxISR = &SPI_TxISR; - hspi->pTxBuffPtr = pData; - hspi->TxXferSize = Size; - hspi->TxXferCount = Size; - - /*Init field not used in handle to zero */ - hspi->RxISR = 0; - hspi->RxXferSize = 0; - hspi->RxXferCount = 0; - - /* Configure communication direction : 1Line */ - if(hspi->Init.Direction == SPI_DIRECTION_1LINE) - { - SPI_1LINE_TX(hspi); - } - - /* Reset CRC Calculation */ - if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - SPI_RESET_CRC(hspi); - } - - if (hspi->Init.Direction == SPI_DIRECTION_2LINES) - { - __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_TXE)); - }else - { - /* Enable TXE and ERR interrupt */ - __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_ERR)); - } - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - - /* Check if the SPI is already enabled */ - if((hspi->Instance->CR1 &SPI_CR1_SPE) != SPI_CR1_SPE) - { - /* Enable SPI peripheral */ - __HAL_SPI_ENABLE(hspi); - } - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Receive an amount of data in no-blocking mode with Interrupt - * @param hspi: pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @param pData: pointer to data buffer - * @param Size: amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_Receive_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size) -{ - if(hspi->State == HAL_SPI_STATE_READY) - { - if((pData == NULL) || (Size == 0)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hspi); - - /* Configure communication */ - hspi->State = HAL_SPI_STATE_BUSY_RX; - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - - hspi->RxISR = &SPI_RxISR; - hspi->pRxBuffPtr = pData; - hspi->RxXferSize = Size; - hspi->RxXferCount = Size ; - - /*Init field not used in handle to zero */ - hspi->TxISR = 0; - hspi->TxXferSize = 0; - hspi->TxXferCount = 0; - - /* Configure communication direction : 1Line */ - if(hspi->Init.Direction == SPI_DIRECTION_1LINE) - { - SPI_1LINE_RX(hspi); - } - else if((hspi->Init.Direction == SPI_DIRECTION_2LINES) && (hspi->Init.Mode == SPI_MODE_MASTER)) - { - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - - /* Call transmit-receive function to send Dummy data on Tx line and generate clock on CLK line */ - return HAL_SPI_TransmitReceive_IT(hspi, pData, pData, Size); - } - - /* Reset CRC Calculation */ - if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - SPI_RESET_CRC(hspi); - } - - /* Enable TXE and ERR interrupt */ - __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR)); - - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - - /* Note : The SPI must be enabled after unlocking current process - to avoid the risk of SPI interrupt handle execution before current - process unlock */ - - /* Check if the SPI is already enabled */ - if((hspi->Instance->CR1 &SPI_CR1_SPE) != SPI_CR1_SPE) - { - /* Enable SPI peripheral */ - __HAL_SPI_ENABLE(hspi); - } - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Transmit and Receive an amount of data in no-blocking mode with Interrupt - * @param hspi: pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @param pTxData: pointer to transmission data buffer - * @param pRxData: pointer to reception data buffer to be - * @param Size: amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_TransmitReceive_IT(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size) -{ - uint32_t tmpstate = 0; - - tmpstate = hspi->State; - if((tmpstate == HAL_SPI_STATE_READY) || \ - ((hspi->Init.Mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES) && (tmpstate == HAL_SPI_STATE_BUSY_RX))) - { - if((pTxData == NULL ) || (pRxData == NULL ) || (Size == 0)) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction)); - - /* Process locked */ - __HAL_LOCK(hspi); - - /* Don't overwrite in case of HAL_SPI_STATE_BUSY_RX */ - if(hspi->State != HAL_SPI_STATE_BUSY_RX) - { - hspi->State = HAL_SPI_STATE_BUSY_TX_RX; - } - - /* Configure communication */ - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - - hspi->TxISR = &SPI_TxISR; - hspi->pTxBuffPtr = pTxData; - hspi->TxXferSize = Size; - hspi->TxXferCount = Size; - - hspi->RxISR = &SPI_2LinesRxISR; - hspi->pRxBuffPtr = pRxData; - hspi->RxXferSize = Size; - hspi->RxXferCount = Size; - - /* Reset CRC Calculation */ - if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - SPI_RESET_CRC(hspi); - } - - /* Enable TXE, RXNE and ERR interrupt */ - __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_RXNE | SPI_IT_ERR)); - - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - - /* Check if the SPI is already enabled */ - if((hspi->Instance->CR1 &SPI_CR1_SPE) != SPI_CR1_SPE) - { - /* Enable SPI peripheral */ - __HAL_SPI_ENABLE(hspi); - } - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Transmit an amount of data in no-blocking mode with DMA - * @param hspi: pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @param pData: pointer to data buffer - * @param Size: amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_Transmit_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size) -{ - if(hspi->State == HAL_SPI_STATE_READY) - { - if((pData == NULL) || (Size == 0)) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE(hspi->Init.Direction)); - - /* Process Locked */ - __HAL_LOCK(hspi); - - /* Configure communication */ - hspi->State = HAL_SPI_STATE_BUSY_TX; - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - - hspi->pTxBuffPtr = pData; - hspi->TxXferSize = Size; - hspi->TxXferCount = Size; - - /*Init field not used in handle to zero */ - hspi->TxISR = 0; - hspi->RxISR = 0; - hspi->RxXferSize = 0; - hspi->RxXferCount = 0; - - /* Configure communication direction : 1Line */ - if(hspi->Init.Direction == SPI_DIRECTION_1LINE) - { - SPI_1LINE_TX(hspi); - } - - /* Reset CRC Calculation */ - if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - SPI_RESET_CRC(hspi); - } - - /* Set the SPI TxDMA Half transfer complete callback */ - hspi->hdmatx->XferHalfCpltCallback = SPI_DMAHalfTransmitCplt; - - /* Set the SPI TxDMA transfer complete callback */ - hspi->hdmatx->XferCpltCallback = SPI_DMATransmitCplt; - - /* Set the DMA error callback */ - hspi->hdmatx->XferErrorCallback = SPI_DMAError; - - /* Enable the Tx DMA Stream */ - HAL_DMA_Start_IT(hspi->hdmatx, (uint32_t)hspi->pTxBuffPtr, (uint32_t)&hspi->Instance->DR, hspi->TxXferCount); - - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - - /* Check if the SPI is already enabled */ - if((hspi->Instance->CR1 &SPI_CR1_SPE) != SPI_CR1_SPE) - { - /* Enable SPI peripheral */ - __HAL_SPI_ENABLE(hspi); - } - - /* Enable Tx DMA Request */ - hspi->Instance->CR2 |= SPI_CR2_TXDMAEN; - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Receive an amount of data in no-blocking mode with DMA - * @param hspi: pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @param pData: pointer to data buffer - * @note When the CRC feature is enabled the pData Length must be Size + 1. - * @param Size: amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_Receive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size) -{ - if(hspi->State == HAL_SPI_STATE_READY) - { - if((pData == NULL) || (Size == 0)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hspi); - - /* Configure communication */ - hspi->State = HAL_SPI_STATE_BUSY_RX; - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - - hspi->pRxBuffPtr = pData; - hspi->RxXferSize = Size; - hspi->RxXferCount = Size; - - /*Init field not used in handle to zero */ - hspi->RxISR = 0; - hspi->TxISR = 0; - hspi->TxXferSize = 0; - hspi->TxXferCount = 0; - - /* Configure communication direction : 1Line */ - if(hspi->Init.Direction == SPI_DIRECTION_1LINE) - { - SPI_1LINE_RX(hspi); - } - else if((hspi->Init.Direction == SPI_DIRECTION_2LINES)&&(hspi->Init.Mode == SPI_MODE_MASTER)) - { - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - - /* Call transmit-receive function to send Dummy data on Tx line and generate clock on CLK line */ - return HAL_SPI_TransmitReceive_DMA(hspi, pData, pData, Size); - } - - /* Reset CRC Calculation */ - if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - SPI_RESET_CRC(hspi); - } - - /* Set the SPI RxDMA Half transfer complete callback */ - hspi->hdmarx->XferHalfCpltCallback = SPI_DMAHalfReceiveCplt; - - /* Set the SPI Rx DMA transfer complete callback */ - hspi->hdmarx->XferCpltCallback = SPI_DMAReceiveCplt; - - /* Set the DMA error callback */ - hspi->hdmarx->XferErrorCallback = SPI_DMAError; - - /* Enable the Rx DMA Stream */ - HAL_DMA_Start_IT(hspi->hdmarx, (uint32_t)&hspi->Instance->DR, (uint32_t)hspi->pRxBuffPtr, hspi->RxXferCount); - - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - - /* Check if the SPI is already enabled */ - if((hspi->Instance->CR1 &SPI_CR1_SPE) != SPI_CR1_SPE) - { - /* Enable SPI peripheral */ - __HAL_SPI_ENABLE(hspi); - } - - /* Enable Rx DMA Request */ - hspi->Instance->CR2 |= SPI_CR2_RXDMAEN; - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Transmit and Receive an amount of data in no-blocking mode with DMA - * @param hspi: pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @param pTxData: pointer to transmission data buffer - * @param pRxData: pointer to reception data buffer - * @note When the CRC feature is enabled the pRxData Length must be Size + 1 - * @param Size: amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_TransmitReceive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size) -{ - uint32_t tmpstate = 0; - tmpstate = hspi->State; - if((tmpstate == HAL_SPI_STATE_READY) || ((hspi->Init.Mode == SPI_MODE_MASTER) && \ - (hspi->Init.Direction == SPI_DIRECTION_2LINES) && (tmpstate == HAL_SPI_STATE_BUSY_RX))) - { - if((pTxData == NULL ) || (pRxData == NULL ) || (Size == 0)) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction)); - - /* Process locked */ - __HAL_LOCK(hspi); - - /* Don't overwrite in case of HAL_SPI_STATE_BUSY_RX */ - if(hspi->State != HAL_SPI_STATE_BUSY_RX) - { - hspi->State = HAL_SPI_STATE_BUSY_TX_RX; - } - - /* Configure communication */ - hspi->ErrorCode = HAL_SPI_ERROR_NONE; - - hspi->pTxBuffPtr = (uint8_t*)pTxData; - hspi->TxXferSize = Size; - hspi->TxXferCount = Size; - - hspi->pRxBuffPtr = (uint8_t*)pRxData; - hspi->RxXferSize = Size; - hspi->RxXferCount = Size; - - /*Init field not used in handle to zero */ - hspi->RxISR = 0; - hspi->TxISR = 0; - - /* Reset CRC Calculation */ - if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - SPI_RESET_CRC(hspi); - } - - /* Check if we are in Rx only or in Rx/Tx Mode and configure the DMA transfer complete callback */ - if(hspi->State == HAL_SPI_STATE_BUSY_RX) - { - /* Set the SPI Rx DMA Half transfer complete callback */ - hspi->hdmarx->XferHalfCpltCallback = SPI_DMAHalfReceiveCplt; - - hspi->hdmarx->XferCpltCallback = SPI_DMAReceiveCplt; - } - else - { - /* Set the SPI Tx/Rx DMA Half transfer complete callback */ - hspi->hdmarx->XferHalfCpltCallback = SPI_DMAHalfTransmitReceiveCplt; - - hspi->hdmarx->XferCpltCallback = SPI_DMATransmitReceiveCplt; - } - - /* Set the DMA error callback */ - hspi->hdmarx->XferErrorCallback = SPI_DMAError; - - /* Enable the Rx DMA Stream */ - HAL_DMA_Start_IT(hspi->hdmarx, (uint32_t)&hspi->Instance->DR, (uint32_t)hspi->pRxBuffPtr, hspi->RxXferCount); - - /* Enable Rx DMA Request */ - hspi->Instance->CR2 |= SPI_CR2_RXDMAEN; - - /* Set the SPI Tx DMA transfer complete callback as NULL because the communication closing - is performed in DMA reception complete callback */ - hspi->hdmatx->XferCpltCallback = NULL; - - if(hspi->State == HAL_SPI_STATE_BUSY_TX_RX) - { - /* Set the DMA error callback */ - hspi->hdmatx->XferErrorCallback = SPI_DMAError; - } - else - { - hspi->hdmatx->XferErrorCallback = NULL; - } - - /* Enable the Tx DMA Stream */ - HAL_DMA_Start_IT(hspi->hdmatx, (uint32_t)hspi->pTxBuffPtr, (uint32_t)&hspi->Instance->DR, hspi->TxXferCount); - - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - - /* Check if the SPI is already enabled */ - if((hspi->Instance->CR1 &SPI_CR1_SPE) != SPI_CR1_SPE) - { - /* Enable SPI peripheral */ - __HAL_SPI_ENABLE(hspi); - } - - /* Enable Tx DMA Request */ - hspi->Instance->CR2 |= SPI_CR2_TXDMAEN; - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Pauses the DMA Transfer. - * @param hspi: pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for the specified SPI module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_DMAPause(SPI_HandleTypeDef *hspi) -{ - /* Process Locked */ - __HAL_LOCK(hspi); - - /* Disable the SPI DMA Tx & Rx requests */ - hspi->Instance->CR2 &= (uint32_t)(~SPI_CR2_TXDMAEN); - hspi->Instance->CR2 &= (uint32_t)(~SPI_CR2_RXDMAEN); - - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - - return HAL_OK; -} - -/** - * @brief Resumes the DMA Transfer. - * @param hspi: pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for the specified SPI module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_DMAResume(SPI_HandleTypeDef *hspi) -{ - /* Process Locked */ - __HAL_LOCK(hspi); - - /* Enable the SPI DMA Tx & Rx requests */ - hspi->Instance->CR2 |= SPI_CR2_TXDMAEN; - hspi->Instance->CR2 |= SPI_CR2_RXDMAEN; - - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - - return HAL_OK; -} - -/** - * @brief Stops the DMA Transfer. - * @param hspi: pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for the specified SPI module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SPI_DMAStop(SPI_HandleTypeDef *hspi) -{ - /* The Lock is not implemented on this API to allow the user application - to call the HAL SPI API under callbacks HAL_SPI_TxCpltCallback() or HAL_SPI_RxCpltCallback() or HAL_SPI_TxRxCpltCallback(): - when calling HAL_DMA_Abort() API the DMA TX/RX Transfer complete interrupt is generated - and the correspond call back is executed HAL_SPI_TxCpltCallback() or HAL_SPI_RxCpltCallback() or HAL_SPI_TxRxCpltCallback() - */ - - /* Abort the SPI DMA tx Stream */ - if(hspi->hdmatx != NULL) - { - HAL_DMA_Abort(hspi->hdmatx); - } - /* Abort the SPI DMA rx Stream */ - if(hspi->hdmarx != NULL) - { - HAL_DMA_Abort(hspi->hdmarx); - } - - /* Disable the SPI DMA Tx & Rx requests */ - hspi->Instance->CR2 &= (uint32_t)(~SPI_CR2_TXDMAEN); - hspi->Instance->CR2 &= (uint32_t)(~SPI_CR2_RXDMAEN); - - hspi->State = HAL_SPI_STATE_READY; - - return HAL_OK; -} - -/** - * @brief This function handles SPI interrupt request. - * @param hspi: pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval HAL status - */ -void HAL_SPI_IRQHandler(SPI_HandleTypeDef *hspi) -{ - uint32_t tmp1 = 0, tmp2 = 0, tmp3 = 0; - - tmp1 = __HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE); - tmp2 = __HAL_SPI_GET_IT_SOURCE(hspi, SPI_IT_RXNE); - tmp3 = __HAL_SPI_GET_FLAG(hspi, SPI_FLAG_OVR); - /* SPI in mode Receiver and Overrun not occurred ---------------------------*/ - if((tmp1 != RESET) && (tmp2 != RESET) && (tmp3 == RESET)) - { - hspi->RxISR(hspi); - return; - } - - tmp1 = __HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE); - tmp2 = __HAL_SPI_GET_IT_SOURCE(hspi, SPI_IT_TXE); - /* SPI in mode Transmitter ---------------------------------------------------*/ - if((tmp1 != RESET) && (tmp2 != RESET)) - { - hspi->TxISR(hspi); - return; - } - - if(__HAL_SPI_GET_IT_SOURCE(hspi, SPI_IT_ERR) != RESET) - { - /* SPI CRC error interrupt occurred ---------------------------------------*/ - if(__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR) != RESET) - { - hspi->ErrorCode |= HAL_SPI_ERROR_CRC; - __HAL_SPI_CLEAR_CRCERRFLAG(hspi); - } - /* SPI Mode Fault error interrupt occurred --------------------------------*/ - if(__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_MODF) != RESET) - { - hspi->ErrorCode |= HAL_SPI_ERROR_MODF; - __HAL_SPI_CLEAR_MODFFLAG(hspi); - } - - /* SPI Overrun error interrupt occurred -----------------------------------*/ - if(__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_OVR) != RESET) - { - if(hspi->State != HAL_SPI_STATE_BUSY_TX) - { - hspi->ErrorCode |= HAL_SPI_ERROR_OVR; - __HAL_SPI_CLEAR_OVRFLAG(hspi); - } - } - - /* SPI Frame error interrupt occurred -------------------------------------*/ - if(__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_FRE) != RESET) - { - hspi->ErrorCode |= HAL_SPI_ERROR_FRE; - __HAL_SPI_CLEAR_FREFLAG(hspi); - } - - /* Call the Error call Back in case of Errors */ - if(hspi->ErrorCode!=HAL_SPI_ERROR_NONE) - { - hspi->State = HAL_SPI_STATE_READY; - HAL_SPI_ErrorCallback(hspi); - } - } -} - -/** - * @brief Tx Transfer completed callbacks - * @param hspi: pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -__weak void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_SPI_TxCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Rx Transfer completed callbacks - * @param hspi: pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -__weak void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_SPI_RxCpltCallback() could be implemented in the user file - */ -} - -/** - * @brief Tx and Rx Transfer completed callbacks - * @param hspi: pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -__weak void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_SPI_TxRxCpltCallback() could be implemented in the user file - */ -} - -/** - * @brief Tx Half Transfer completed callbacks - * @param hspi: pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -__weak void HAL_SPI_TxHalfCpltCallback(SPI_HandleTypeDef *hspi) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_SPI_TxHalfCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Rx Half Transfer completed callbacks - * @param hspi: pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -__weak void HAL_SPI_RxHalfCpltCallback(SPI_HandleTypeDef *hspi) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_SPI_RxHalfCpltCallback() could be implemented in the user file - */ -} - -/** - * @brief Tx and Rx Transfer completed callbacks - * @param hspi: pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -__weak void HAL_SPI_TxRxHalfCpltCallback(SPI_HandleTypeDef *hspi) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_SPI_TxRxHalfCpltCallback() could be implemented in the user file - */ -} - -/** - * @brief SPI error callbacks - * @param hspi: pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ - __weak void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi) -{ - /* NOTE : - This function Should not be modified, when the callback is needed, - the HAL_SPI_ErrorCallback() could be implemented in the user file. - - The ErrorCode parameter in the hspi handle is updated by the SPI processes - and user can use HAL_SPI_GetError() API to check the latest error occurred. - */ -} - -/** - * @} - */ - -/** @defgroup SPI_Exported_Functions_Group3 Peripheral State and Errors functions - * @brief SPI control functions - * -@verbatim - =============================================================================== - ##### Peripheral State and Errors functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to control the SPI. - (+) HAL_SPI_GetState() API can be helpful to check in run-time the state of the SPI peripheral - (+) HAL_SPI_GetError() check in run-time Errors occurring during communication -@endverbatim - * @{ - */ - -/** - * @brief Return the SPI state - * @param hspi: pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval HAL state - */ -HAL_SPI_StateTypeDef HAL_SPI_GetState(SPI_HandleTypeDef *hspi) -{ - return hspi->State; -} - -/** - * @brief Return the SPI error code - * @param hspi: pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval SPI Error Code - */ -uint32_t HAL_SPI_GetError(SPI_HandleTypeDef *hspi) -{ - return hspi->ErrorCode; -} - -/** - * @} - */ - - /** - * @brief Interrupt Handler to close Tx transfer - * @param hspi: pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval void - */ -static void SPI_TxCloseIRQHandler(SPI_HandleTypeDef *hspi) -{ - /* Wait until TXE flag is set to send data */ - if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_TXE, RESET, SPI_TIMEOUT_VALUE) != HAL_OK) - { - hspi->ErrorCode |= HAL_SPI_ERROR_FLAG; - } - - /* Disable TXE interrupt */ - __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_TXE )); - - /* Disable ERR interrupt if Receive process is finished */ - if(__HAL_SPI_GET_IT_SOURCE(hspi, SPI_IT_RXNE) == RESET) - { - __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_ERR)); - - /* Wait until Busy flag is reset before disabling SPI */ - if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_BSY, SET, SPI_TIMEOUT_VALUE) != HAL_OK) - { - hspi->ErrorCode |= HAL_SPI_ERROR_FLAG; - } - - /* Clear OVERRUN flag in 2 Lines communication mode because received is not read */ - if(hspi->Init.Direction == SPI_DIRECTION_2LINES) - { - __HAL_SPI_CLEAR_OVRFLAG(hspi); - } - - /* Check if Errors has been detected during transfer */ - if(hspi->ErrorCode == HAL_SPI_ERROR_NONE) - { - /* Check if we are in Tx or in Rx/Tx Mode */ - if(hspi->State == HAL_SPI_STATE_BUSY_TX_RX) - { - /* Set state to READY before run the Callback Complete */ - hspi->State = HAL_SPI_STATE_READY; - HAL_SPI_TxRxCpltCallback(hspi); - } - else - { - /* Set state to READY before run the Callback Complete */ - hspi->State = HAL_SPI_STATE_READY; - HAL_SPI_TxCpltCallback(hspi); - } - } - else - { - /* Set state to READY before run the Callback Complete */ - hspi->State = HAL_SPI_STATE_READY; - /* Call Error call back in case of Error */ - HAL_SPI_ErrorCallback(hspi); - } - } -} - -/** - * @brief Interrupt Handler to transmit amount of data in no-blocking mode - * @param hspi: pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval void - */ -static void SPI_TxISR(SPI_HandleTypeDef *hspi) -{ - /* Transmit data in 8 Bit mode */ - if(hspi->Init.DataSize == SPI_DATASIZE_8BIT) - { - hspi->Instance->DR = (*hspi->pTxBuffPtr++); - } - /* Transmit data in 16 Bit mode */ - else - { - hspi->Instance->DR = *((uint16_t*)hspi->pTxBuffPtr); - hspi->pTxBuffPtr+=2; - } - hspi->TxXferCount--; - - if(hspi->TxXferCount == 0) - { - if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - /* calculate and transfer CRC on Tx line */ - hspi->Instance->CR1 |= SPI_CR1_CRCNEXT; - } - SPI_TxCloseIRQHandler(hspi); - } -} - -/** - * @brief Interrupt Handler to close Rx transfer - * @param hspi: pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval void - */ -static void SPI_RxCloseIRQHandler(SPI_HandleTypeDef *hspi) -{ - __IO uint16_t tmpreg; - - if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - /* Wait until RXNE flag is set to send data */ - if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, SPI_TIMEOUT_VALUE) != HAL_OK) - { - hspi->ErrorCode |= HAL_SPI_ERROR_FLAG; - } - - /* Read CRC to reset RXNE flag */ - tmpreg = hspi->Instance->DR; - UNUSED(tmpreg); - - /* Wait until RXNE flag is set to send data */ - if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, SET, SPI_TIMEOUT_VALUE) != HAL_OK) - { - hspi->ErrorCode |= HAL_SPI_ERROR_FLAG; - } - - /* Check if CRC error occurred */ - if(__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR) != RESET) - { - hspi->ErrorCode |= HAL_SPI_ERROR_CRC; - - /* Reset CRC Calculation */ - SPI_RESET_CRC(hspi); - } - } - - /* Disable RXNE and ERR interrupt */ - __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_RXNE)); - - /* if Transmit process is finished */ - if(__HAL_SPI_GET_IT_SOURCE(hspi, SPI_IT_TXE) == RESET) - { - /* Disable ERR interrupt */ - __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_ERR)); - - if((hspi->Init.Mode == SPI_MODE_MASTER)&&((hspi->Init.Direction == SPI_DIRECTION_1LINE)||(hspi->Init.Direction == SPI_DIRECTION_2LINES_RXONLY))) - { - /* Disable SPI peripheral */ - __HAL_SPI_DISABLE(hspi); - } - - /* Check if Errors has been detected during transfer */ - if(hspi->ErrorCode == HAL_SPI_ERROR_NONE) - { - /* Check if we are in Rx or in Rx/Tx Mode */ - if(hspi->State == HAL_SPI_STATE_BUSY_TX_RX) - { - /* Set state to READY before run the Callback Complete */ - hspi->State = HAL_SPI_STATE_READY; - HAL_SPI_TxRxCpltCallback(hspi); - } - else - { - /* Set state to READY before run the Callback Complete */ - hspi->State = HAL_SPI_STATE_READY; - HAL_SPI_RxCpltCallback(hspi); - } - } - else - { - /* Set state to READY before run the Callback Complete */ - hspi->State = HAL_SPI_STATE_READY; - /* Call Error call back in case of Error */ - HAL_SPI_ErrorCallback(hspi); - } - } -} - -/** - * @brief Interrupt Handler to receive amount of data in 2Lines mode - * @param hspi: pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval void - */ -static void SPI_2LinesRxISR(SPI_HandleTypeDef *hspi) -{ - /* Receive data in 8 Bit mode */ - if(hspi->Init.DataSize == SPI_DATASIZE_8BIT) - { - (*hspi->pRxBuffPtr++) = hspi->Instance->DR; - } - /* Receive data in 16 Bit mode */ - else - { - *((uint16_t*)hspi->pRxBuffPtr) = hspi->Instance->DR; - hspi->pRxBuffPtr+=2; - } - hspi->RxXferCount--; - - if(hspi->RxXferCount==0) - { - SPI_RxCloseIRQHandler(hspi); - } -} - -/** - * @brief Interrupt Handler to receive amount of data in no-blocking mode - * @param hspi: pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval void - */ -static void SPI_RxISR(SPI_HandleTypeDef *hspi) -{ - /* Receive data in 8 Bit mode */ - if(hspi->Init.DataSize == SPI_DATASIZE_8BIT) - { - (*hspi->pRxBuffPtr++) = hspi->Instance->DR; - } - /* Receive data in 16 Bit mode */ - else - { - *((uint16_t*)hspi->pRxBuffPtr) = hspi->Instance->DR; - hspi->pRxBuffPtr+=2; - } - hspi->RxXferCount--; - - /* Enable CRC Transmission */ - if((hspi->RxXferCount == 1) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)) - { - /* Set CRC Next to calculate CRC on Rx side */ - hspi->Instance->CR1 |= SPI_CR1_CRCNEXT; - } - - if(hspi->RxXferCount == 0) - { - SPI_RxCloseIRQHandler(hspi); - } -} - -/** - * @brief DMA SPI transmit process complete callback - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void SPI_DMATransmitCplt(DMA_HandleTypeDef *hdma) -{ - SPI_HandleTypeDef* hspi = ( SPI_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; - - /* DMA Normal Mode */ - if((hdma->Instance->CR & DMA_SxCR_CIRC) == 0) - { - /* Wait until TXE flag is set to send data */ - if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_TXE, RESET, SPI_TIMEOUT_VALUE) != HAL_OK) - { - hspi->ErrorCode |= HAL_SPI_ERROR_FLAG; - } - /* Disable Tx DMA Request */ - hspi->Instance->CR2 &= (uint32_t)(~SPI_CR2_TXDMAEN); - - /* Wait until Busy flag is reset before disabling SPI */ - if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_BSY, SET, SPI_TIMEOUT_VALUE) != HAL_OK) - { - hspi->ErrorCode |= HAL_SPI_ERROR_FLAG; - } - - hspi->TxXferCount = 0; - - hspi->State = HAL_SPI_STATE_READY; - } - - /* Clear OVERRUN flag in 2 Lines communication mode because received is not read */ - if(hspi->Init.Direction == SPI_DIRECTION_2LINES) - { - __HAL_SPI_CLEAR_OVRFLAG(hspi); - } - - /* Check if Errors has been detected during transfer */ - if(hspi->ErrorCode != HAL_SPI_ERROR_NONE) - { - HAL_SPI_ErrorCallback(hspi); - } - else - { - HAL_SPI_TxCpltCallback(hspi); - } -} - -/** - * @brief DMA SPI receive process complete callback - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void SPI_DMAReceiveCplt(DMA_HandleTypeDef *hdma) -{ - __IO uint16_t tmpreg; - - SPI_HandleTypeDef* hspi = ( SPI_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; - /* DMA Normal mode */ - if((hdma->Instance->CR & DMA_SxCR_CIRC) == 0) - { - if((hspi->Init.Direction == SPI_DIRECTION_2LINES)&&(hspi->Init.Mode == SPI_MODE_MASTER)) - { - SPI_DMAEndTransmitReceive(hspi); - } - /* SPI_DIRECTION_1LINE or SPI_DIRECTION_2LINES_RXONLY */ - else - { - if((hspi->Init.Mode == SPI_MODE_MASTER)&&((hspi->Init.Direction == SPI_DIRECTION_1LINE)||(hspi->Init.Direction == SPI_DIRECTION_2LINES_RXONLY))) - { - /* Disable SPI peripheral */ - __HAL_SPI_DISABLE(hspi); - } - - /* Disable Rx DMA Request */ - hspi->Instance->CR2 &= (uint32_t)(~SPI_CR2_RXDMAEN); - - hspi->RxXferCount = 0; - - /* Reset CRC Calculation */ - if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - /* Wait until RXNE flag is set to send data */ - if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, SPI_TIMEOUT_VALUE) != HAL_OK) - { - hspi->ErrorCode |= HAL_SPI_ERROR_FLAG; - } - - /* Read CRC */ - tmpreg = hspi->Instance->DR; - UNUSED(tmpreg); - - /* Wait until RXNE flag is set */ - if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, SET, SPI_TIMEOUT_VALUE) != HAL_OK) - { - hspi->ErrorCode |= HAL_SPI_ERROR_FLAG; - } - - /* Check if CRC error occurred */ - if(__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR) != RESET) - { - hspi->ErrorCode |= HAL_SPI_ERROR_CRC; - __HAL_SPI_CLEAR_CRCERRFLAG(hspi); - } - } - } - - hspi->State = HAL_SPI_STATE_READY; - - /* Check if Errors has been detected during transfer */ - if(hspi->ErrorCode != HAL_SPI_ERROR_NONE) - { - HAL_SPI_ErrorCallback(hspi); - } - else - { - HAL_SPI_RxCpltCallback(hspi); - } - } - else - { - HAL_SPI_RxCpltCallback(hspi); - } -} - -/** - * @brief End DMA SPI transmit receive process - * @param hspi: pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @retval None - */ -static void SPI_DMAEndTransmitReceive(SPI_HandleTypeDef *hspi) -{ - __IO uint16_t tmpreg; - - /* Reset CRC Calculation */ - if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - /* Check if CRC is done on going (RXNE flag set) */ - if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, SET, SPI_TIMEOUT_VALUE) == HAL_OK) - { - /* Wait until RXNE flag is set to send data */ - if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_RXNE, RESET, SPI_TIMEOUT_VALUE) != HAL_OK) - { - hspi->ErrorCode |= HAL_SPI_ERROR_FLAG; - } - } - /* Read CRC */ - tmpreg = hspi->Instance->DR; - UNUSED(tmpreg); - - /* Check if CRC error occurred */ - if(__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR) != RESET) - { - hspi->ErrorCode |= HAL_SPI_ERROR_CRC; - __HAL_SPI_CLEAR_CRCERRFLAG(hspi); - } - } - - /* Wait until TXE flag is set to send data */ - if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_TXE, RESET, SPI_TIMEOUT_VALUE) != HAL_OK) - { - hspi->ErrorCode |= HAL_SPI_ERROR_FLAG; - } - /* Disable Tx DMA Request */ - hspi->Instance->CR2 &= (uint32_t)(~SPI_CR2_TXDMAEN); - - /* Wait until Busy flag is reset before disabling SPI */ - if(SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_BSY, SET, SPI_TIMEOUT_VALUE) != HAL_OK) - { - hspi->ErrorCode |= HAL_SPI_ERROR_FLAG; - } - - /* Disable Rx DMA Request */ - hspi->Instance->CR2 &= (uint32_t)(~SPI_CR2_RXDMAEN); - - hspi->TxXferCount = 0; - hspi->RxXferCount = 0; -} - -/** - * @brief DMA SPI transmit receive process complete callback - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void SPI_DMATransmitReceiveCplt(DMA_HandleTypeDef *hdma) -{ - SPI_HandleTypeDef* hspi = ( SPI_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; - if((hdma->Instance->CR & DMA_SxCR_CIRC) == 0) - { /**/ - SPI_DMAEndTransmitReceive(hspi); - - hspi->State = HAL_SPI_STATE_READY; - - /* Check if Errors has been detected during transfer */ - if(hspi->ErrorCode != HAL_SPI_ERROR_NONE) - { - HAL_SPI_ErrorCallback(hspi); - } - else - { - HAL_SPI_TxRxCpltCallback(hspi); - } - } - else - { - HAL_SPI_TxRxCpltCallback(hspi); - } -} - -/** - * @brief DMA SPI half transmit process complete callback - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void SPI_DMAHalfTransmitCplt(DMA_HandleTypeDef *hdma) -{ - SPI_HandleTypeDef* hspi = ( SPI_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; - - HAL_SPI_TxHalfCpltCallback(hspi); -} - -/** - * @brief DMA SPI half receive process complete callback - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void SPI_DMAHalfReceiveCplt(DMA_HandleTypeDef *hdma) -{ - SPI_HandleTypeDef* hspi = ( SPI_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; - - HAL_SPI_RxHalfCpltCallback(hspi); -} - -/** - * @brief DMA SPI Half transmit receive process complete callback - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void SPI_DMAHalfTransmitReceiveCplt(DMA_HandleTypeDef *hdma) -{ - SPI_HandleTypeDef* hspi = ( SPI_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; - - HAL_SPI_TxRxHalfCpltCallback(hspi); -} - -/** - * @brief DMA SPI communication error callback - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void SPI_DMAError(DMA_HandleTypeDef *hdma) -{ - SPI_HandleTypeDef* hspi = (SPI_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; - hspi->TxXferCount = 0; - hspi->RxXferCount = 0; - hspi->State= HAL_SPI_STATE_READY; - hspi->ErrorCode |= HAL_SPI_ERROR_DMA; - HAL_SPI_ErrorCallback(hspi); -} - -/** - * @brief This function handles SPI Communication Timeout. - * @param hspi: pointer to a SPI_HandleTypeDef structure that contains - * the configuration information for SPI module. - * @param Flag: SPI flag to check - * @param Status: Flag status to check: RESET or set - * @param Timeout: Timeout duration - * @retval HAL status - */ -static HAL_StatusTypeDef SPI_WaitOnFlagUntilTimeout(SPI_HandleTypeDef *hspi, uint32_t Flag, FlagStatus Status, uint32_t Timeout) -{ - uint32_t tickstart = 0; - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait until flag is set */ - if(Status == RESET) - { - while(__HAL_SPI_GET_FLAG(hspi, Flag) == RESET) - { - if(Timeout != HAL_MAX_DELAY) - { - if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout)) - { - /* Disable the SPI and reset the CRC: the CRC value should be cleared - on both master and slave sides in order to resynchronize the master - and slave for their respective CRC calculation */ - - /* Disable TXE, RXNE and ERR interrupts for the interrupt process */ - __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_RXNE | SPI_IT_ERR)); - - /* Disable SPI peripheral */ - __HAL_SPI_DISABLE(hspi); - - /* Reset CRC Calculation */ - if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - SPI_RESET_CRC(hspi); - } - - hspi->State= HAL_SPI_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - - return HAL_TIMEOUT; - } - } - } - } - else - { - while(__HAL_SPI_GET_FLAG(hspi, Flag) != RESET) - { - if(Timeout != HAL_MAX_DELAY) - { - if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout)) - { - /* Disable the SPI and reset the CRC: the CRC value should be cleared - on both master and slave sides in order to resynchronize the master - and slave for their respective CRC calculation */ - - /* Disable TXE, RXNE and ERR interrupts for the interrupt process */ - __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_RXNE | SPI_IT_ERR)); - - /* Disable SPI peripheral */ - __HAL_SPI_DISABLE(hspi); - - /* Reset CRC Calculation */ - if(hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) - { - SPI_RESET_CRC(hspi); - } - - hspi->State= HAL_SPI_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hspi); - - return HAL_TIMEOUT; - } - } - } - } - return HAL_OK; -} - - -/** - * @} - */ - -#endif /* HAL_SPI_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_sram.c b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_sram.c deleted file mode 100755 index 833c541c..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_sram.c +++ /dev/null @@ -1,678 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_hal_sram.c - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief SRAM HAL module driver. - * This file provides a generic firmware to drive SRAM memories - * mounted as external device. - * - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - This driver is a generic layered driver which contains a set of APIs used to - control SRAM memories. It uses the FSMC layer functions to interface - with SRAM devices. - The following sequence should be followed to configure the FSMC to interface - with SRAM/PSRAM memories: - - (#) Declare a SRAM_HandleTypeDef handle structure, for example: - SRAM_HandleTypeDef hsram; and: - - (++) Fill the SRAM_HandleTypeDef handle "Init" field with the allowed - values of the structure member. - - (++) Fill the SRAM_HandleTypeDef handle "Instance" field with a predefined - base register instance for NOR or SRAM device - - (++) Fill the SRAM_HandleTypeDef handle "Extended" field with a predefined - base register instance for NOR or SRAM extended mode - - (#) Declare two FSMC_NORSRAM_TimingTypeDef structures, for both normal and extended - mode timings; for example: - FSMC_NORSRAM_TimingTypeDef Timing and FSMC_NORSRAM_TimingTypeDef ExTiming; - and fill its fields with the allowed values of the structure member. - - (#) Initialize the SRAM Controller by calling the function HAL_SRAM_Init(). This function - performs the following sequence: - - (##) MSP hardware layer configuration using the function HAL_SRAM_MspInit() - (##) Control register configuration using the FSMC NORSRAM interface function - FSMC_NORSRAM_Init() - (##) Timing register configuration using the FSMC NORSRAM interface function - FSMC_NORSRAM_Timing_Init() - (##) Extended mode Timing register configuration using the FSMC NORSRAM interface function - FSMC_NORSRAM_Extended_Timing_Init() - (##) Enable the SRAM device using the macro __FSMC_NORSRAM_ENABLE() - - (#) At this stage you can perform read/write accesses from/to the memory connected - to the NOR/SRAM Bank. You can perform either polling or DMA transfer using the - following APIs: - (++) HAL_SRAM_Read()/HAL_SRAM_Write() for polling read/write access - (++) HAL_SRAM_Read_DMA()/HAL_SRAM_Write_DMA() for DMA read/write transfer - - (#) You can also control the SRAM device by calling the control APIs HAL_SRAM_WriteOperation_Enable()/ - HAL_SRAM_WriteOperation_Disable() to respectively enable/disable the SRAM write operation - - (#) You can continuously monitor the SRAM device HAL state by calling the function - HAL_SRAM_GetState() - - @endverbatim - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal.h" - -/** @addtogroup STM32F2xx_HAL_Driver - * @{ - */ - -/** @defgroup SRAM SRAM - * @brief SRAM driver modules - * @{ - */ -#ifdef HAL_SRAM_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup SRAM_Exported_Functions SRAM Exported Functions - * @{ - */ -/** @defgroup SRAM_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * - @verbatim - ============================================================================== - ##### SRAM Initialization and de_initialization functions ##### - ============================================================================== - [..] This section provides functions allowing to initialize/de-initialize - the SRAM memory - -@endverbatim - * @{ - */ - -/** - * @brief Performs the SRAM device initialization sequence - * @param hsram: pointer to a SRAM_HandleTypeDef structure that contains - * the configuration information for SRAM module. - * @param Timing: Pointer to SRAM control timing structure - * @param ExtTiming: Pointer to SRAM extended mode timing structure - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SRAM_Init(SRAM_HandleTypeDef *hsram, FSMC_NORSRAM_TimingTypeDef *Timing, FSMC_NORSRAM_TimingTypeDef *ExtTiming) -{ - /* Check the SRAM handle parameter */ - if(hsram == NULL) - { - return HAL_ERROR; - } - - if(hsram->State == HAL_SRAM_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - hsram->Lock = HAL_UNLOCKED; - /* Initialize the low level hardware (MSP) */ - HAL_SRAM_MspInit(hsram); - } - - /* Initialize SRAM control Interface */ - FSMC_NORSRAM_Init(hsram->Instance, &(hsram->Init)); - - /* Initialize SRAM timing Interface */ - FSMC_NORSRAM_Timing_Init(hsram->Instance, Timing, hsram->Init.NSBank); - - /* Initialize SRAM extended mode timing Interface */ - FSMC_NORSRAM_Extended_Timing_Init(hsram->Extended, ExtTiming, hsram->Init.NSBank, hsram->Init.ExtendedMode); - - /* Enable the NORSRAM device */ - __FSMC_NORSRAM_ENABLE(hsram->Instance, hsram->Init.NSBank); - - return HAL_OK; -} - -/** - * @brief Performs the SRAM device De-initialization sequence. - * @param hsram: pointer to a SRAM_HandleTypeDef structure that contains - * the configuration information for SRAM module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SRAM_DeInit(SRAM_HandleTypeDef *hsram) -{ - /* De-Initialize the low level hardware (MSP) */ - HAL_SRAM_MspDeInit(hsram); - - /* Configure the SRAM registers with their reset values */ - FSMC_NORSRAM_DeInit(hsram->Instance, hsram->Extended, hsram->Init.NSBank); - - hsram->State = HAL_SRAM_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(hsram); - - return HAL_OK; -} - -/** - * @brief SRAM MSP Init. - * @param hsram: pointer to a SRAM_HandleTypeDef structure that contains - * the configuration information for SRAM module. - * @retval None - */ -__weak void HAL_SRAM_MspInit(SRAM_HandleTypeDef *hsram) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_SRAM_MspInit could be implemented in the user file - */ -} - -/** - * @brief SRAM MSP DeInit. - * @param hsram: pointer to a SRAM_HandleTypeDef structure that contains - * the configuration information for SRAM module. - * @retval None - */ -__weak void HAL_SRAM_MspDeInit(SRAM_HandleTypeDef *hsram) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_SRAM_MspDeInit could be implemented in the user file - */ -} - -/** - * @brief DMA transfer complete callback. - * @param hdma: pointer to a SRAM_HandleTypeDef structure that contains - * the configuration information for SRAM module. - * @retval None - */ -__weak void HAL_SRAM_DMA_XferCpltCallback(DMA_HandleTypeDef *hdma) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_SRAM_DMA_XferCpltCallback could be implemented in the user file - */ -} - -/** - * @brief DMA transfer complete error callback. - * @param hdma: pointer to a SRAM_HandleTypeDef structure that contains - * the configuration information for SRAM module. - * @retval None - */ -__weak void HAL_SRAM_DMA_XferErrorCallback(DMA_HandleTypeDef *hdma) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_SRAM_DMA_XferErrorCallback could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup SRAM_Exported_Functions_Group2 Input and Output functions - * @brief Input Output and memory control functions - * - @verbatim - ============================================================================== - ##### SRAM Input and Output functions ##### - ============================================================================== - [..] - This section provides functions allowing to use and control the SRAM memory - -@endverbatim - * @{ - */ - -/** - * @brief Reads 8-bit buffer from SRAM memory. - * @param hsram: pointer to a SRAM_HandleTypeDef structure that contains - * the configuration information for SRAM module. - * @param pAddress: Pointer to read start address - * @param pDstBuffer: Pointer to destination buffer - * @param BufferSize: Size of the buffer to read from memory - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SRAM_Read_8b(SRAM_HandleTypeDef *hsram, uint32_t *pAddress, uint8_t *pDstBuffer, uint32_t BufferSize) -{ - __IO uint8_t * pSramAddress = (uint8_t *)pAddress; - - /* Process Locked */ - __HAL_LOCK(hsram); - - /* Update the SRAM controller state */ - hsram->State = HAL_SRAM_STATE_BUSY; - - /* Read data from memory */ - for(; BufferSize != 0; BufferSize--) - { - *pDstBuffer = *(__IO uint8_t *)pSramAddress; - pDstBuffer++; - pSramAddress++; - } - - /* Update the SRAM controller state */ - hsram->State = HAL_SRAM_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hsram); - - return HAL_OK; -} - -/** - * @brief Writes 8-bit buffer to SRAM memory. - * @param hsram: pointer to a SRAM_HandleTypeDef structure that contains - * the configuration information for SRAM module. - * @param pAddress: Pointer to write start address - * @param pSrcBuffer: Pointer to source buffer to write - * @param BufferSize: Size of the buffer to write to memory - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SRAM_Write_8b(SRAM_HandleTypeDef *hsram, uint32_t *pAddress, uint8_t *pSrcBuffer, uint32_t BufferSize) -{ - __IO uint8_t * pSramAddress = (uint8_t *)pAddress; - - /* Check the SRAM controller state */ - if(hsram->State == HAL_SRAM_STATE_PROTECTED) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hsram); - - /* Update the SRAM controller state */ - hsram->State = HAL_SRAM_STATE_BUSY; - - /* Write data to memory */ - for(; BufferSize != 0; BufferSize--) - { - *(__IO uint8_t *)pSramAddress = *pSrcBuffer; - pSrcBuffer++; - pSramAddress++; - } - - /* Update the SRAM controller state */ - hsram->State = HAL_SRAM_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hsram); - - return HAL_OK; -} - -/** - * @brief Reads 16-bit buffer from SRAM memory. - * @param hsram: pointer to a SRAM_HandleTypeDef structure that contains - * the configuration information for SRAM module. - * @param pAddress: Pointer to read start address - * @param pDstBuffer: Pointer to destination buffer - * @param BufferSize: Size of the buffer to read from memory - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SRAM_Read_16b(SRAM_HandleTypeDef *hsram, uint32_t *pAddress, uint16_t *pDstBuffer, uint32_t BufferSize) -{ - __IO uint16_t * pSramAddress = (uint16_t *)pAddress; - - /* Process Locked */ - __HAL_LOCK(hsram); - - /* Update the SRAM controller state */ - hsram->State = HAL_SRAM_STATE_BUSY; - - /* Read data from memory */ - for(; BufferSize != 0; BufferSize--) - { - *pDstBuffer = *(__IO uint16_t *)pSramAddress; - pDstBuffer++; - pSramAddress++; - } - - /* Update the SRAM controller state */ - hsram->State = HAL_SRAM_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hsram); - - return HAL_OK; -} - -/** - * @brief Writes 16-bit buffer to SRAM memory. - * @param hsram: pointer to a SRAM_HandleTypeDef structure that contains - * the configuration information for SRAM module. - * @param pAddress: Pointer to write start address - * @param pSrcBuffer: Pointer to source buffer to write - * @param BufferSize: Size of the buffer to write to memory - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SRAM_Write_16b(SRAM_HandleTypeDef *hsram, uint32_t *pAddress, uint16_t *pSrcBuffer, uint32_t BufferSize) -{ - __IO uint16_t * pSramAddress = (uint16_t *)pAddress; - - /* Check the SRAM controller state */ - if(hsram->State == HAL_SRAM_STATE_PROTECTED) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hsram); - - /* Update the SRAM controller state */ - hsram->State = HAL_SRAM_STATE_BUSY; - - /* Write data to memory */ - for(; BufferSize != 0; BufferSize--) - { - *(__IO uint16_t *)pSramAddress = *pSrcBuffer; - pSrcBuffer++; - pSramAddress++; - } - - /* Update the SRAM controller state */ - hsram->State = HAL_SRAM_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hsram); - - return HAL_OK; -} - -/** - * @brief Reads 32-bit buffer from SRAM memory. - * @param hsram: pointer to a SRAM_HandleTypeDef structure that contains - * the configuration information for SRAM module. - * @param pAddress: Pointer to read start address - * @param pDstBuffer: Pointer to destination buffer - * @param BufferSize: Size of the buffer to read from memory - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SRAM_Read_32b(SRAM_HandleTypeDef *hsram, uint32_t *pAddress, uint32_t *pDstBuffer, uint32_t BufferSize) -{ - /* Process Locked */ - __HAL_LOCK(hsram); - - /* Update the SRAM controller state */ - hsram->State = HAL_SRAM_STATE_BUSY; - - /* Read data from memory */ - for(; BufferSize != 0; BufferSize--) - { - *pDstBuffer = *(__IO uint32_t *)pAddress; - pDstBuffer++; - pAddress++; - } - - /* Update the SRAM controller state */ - hsram->State = HAL_SRAM_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hsram); - - return HAL_OK; -} - -/** - * @brief Writes 32-bit buffer to SRAM memory. - * @param hsram: pointer to a SRAM_HandleTypeDef structure that contains - * the configuration information for SRAM module. - * @param pAddress: Pointer to write start address - * @param pSrcBuffer: Pointer to source buffer to write - * @param BufferSize: Size of the buffer to write to memory - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SRAM_Write_32b(SRAM_HandleTypeDef *hsram, uint32_t *pAddress, uint32_t *pSrcBuffer, uint32_t BufferSize) -{ - /* Check the SRAM controller state */ - if(hsram->State == HAL_SRAM_STATE_PROTECTED) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hsram); - - /* Update the SRAM controller state */ - hsram->State = HAL_SRAM_STATE_BUSY; - - /* Write data to memory */ - for(; BufferSize != 0; BufferSize--) - { - *(__IO uint32_t *)pAddress = *pSrcBuffer; - pSrcBuffer++; - pAddress++; - } - - /* Update the SRAM controller state */ - hsram->State = HAL_SRAM_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hsram); - - return HAL_OK; -} - -/** - * @brief Reads a Words data from the SRAM memory using DMA transfer. - * @param hsram: pointer to a SRAM_HandleTypeDef structure that contains - * the configuration information for SRAM module. - * @param pAddress: Pointer to read start address - * @param pDstBuffer: Pointer to destination buffer - * @param BufferSize: Size of the buffer to read from memory - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SRAM_Read_DMA(SRAM_HandleTypeDef *hsram, uint32_t *pAddress, uint32_t *pDstBuffer, uint32_t BufferSize) -{ - /* Process Locked */ - __HAL_LOCK(hsram); - - /* Update the SRAM controller state */ - hsram->State = HAL_SRAM_STATE_BUSY; - - /* Configure DMA user callbacks */ - hsram->hdma->XferCpltCallback = HAL_SRAM_DMA_XferCpltCallback; - hsram->hdma->XferErrorCallback = HAL_SRAM_DMA_XferErrorCallback; - - /* Enable the DMA Stream */ - HAL_DMA_Start_IT(hsram->hdma, (uint32_t)pAddress, (uint32_t)pDstBuffer, (uint32_t)BufferSize); - - /* Update the SRAM controller state */ - hsram->State = HAL_SRAM_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hsram); - - return HAL_OK; -} - -/** - * @brief Writes a Words data buffer to SRAM memory using DMA transfer. - * @param hsram: pointer to a SRAM_HandleTypeDef structure that contains - * the configuration information for SRAM module. - * @param pAddress: Pointer to write start address - * @param pSrcBuffer: Pointer to source buffer to write - * @param BufferSize: Size of the buffer to write to memory - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SRAM_Write_DMA(SRAM_HandleTypeDef *hsram, uint32_t *pAddress, uint32_t *pSrcBuffer, uint32_t BufferSize) -{ - /* Check the SRAM controller state */ - if(hsram->State == HAL_SRAM_STATE_PROTECTED) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(hsram); - - /* Update the SRAM controller state */ - hsram->State = HAL_SRAM_STATE_BUSY; - - /* Configure DMA user callbacks */ - hsram->hdma->XferCpltCallback = HAL_SRAM_DMA_XferCpltCallback; - hsram->hdma->XferErrorCallback = HAL_SRAM_DMA_XferErrorCallback; - - /* Enable the DMA Stream */ - HAL_DMA_Start_IT(hsram->hdma, (uint32_t)pSrcBuffer, (uint32_t)pAddress, (uint32_t)BufferSize); - - /* Update the SRAM controller state */ - hsram->State = HAL_SRAM_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hsram); - - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup SRAM_Exported_Functions_Group3 Control functions - * @brief management functions - * -@verbatim - ============================================================================== - ##### SRAM Control functions ##### - ============================================================================== - [..] - This subsection provides a set of functions allowing to control dynamically - the SRAM interface. - -@endverbatim - * @{ - */ - -/** - * @brief Enables dynamically SRAM write operation. - * @param hsram: pointer to a SRAM_HandleTypeDef structure that contains - * the configuration information for SRAM module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SRAM_WriteOperation_Enable(SRAM_HandleTypeDef *hsram) -{ - /* Process Locked */ - __HAL_LOCK(hsram); - - /* Enable write operation */ - FSMC_NORSRAM_WriteOperation_Enable(hsram->Instance, hsram->Init.NSBank); - - /* Update the SRAM controller state */ - hsram->State = HAL_SRAM_STATE_READY; - - /* Process unlocked */ - __HAL_UNLOCK(hsram); - - return HAL_OK; -} - -/** - * @brief Disables dynamically SRAM write operation. - * @param hsram: pointer to a SRAM_HandleTypeDef structure that contains - * the configuration information for SRAM module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_SRAM_WriteOperation_Disable(SRAM_HandleTypeDef *hsram) -{ - /* Process Locked */ - __HAL_LOCK(hsram); - - /* Update the SRAM controller state */ - hsram->State = HAL_SRAM_STATE_BUSY; - - /* Disable write operation */ - FSMC_NORSRAM_WriteOperation_Disable(hsram->Instance, hsram->Init.NSBank); - - /* Update the SRAM controller state */ - hsram->State = HAL_SRAM_STATE_PROTECTED; - - /* Process unlocked */ - __HAL_UNLOCK(hsram); - - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup SRAM_Exported_Functions_Group4 State functions - * @brief Peripheral State functions - * -@verbatim - ============================================================================== - ##### SRAM State functions ##### - ============================================================================== - [..] - This subsection permits to get in run-time the status of the SRAM controller - and the data flow. - -@endverbatim - * @{ - */ - -/** - * @brief Returns the SRAM controller state - * @param hsram: pointer to a SRAM_HandleTypeDef structure that contains - * the configuration information for SRAM module. - * @retval HAL state - */ -HAL_SRAM_StateTypeDef HAL_SRAM_GetState(SRAM_HandleTypeDef *hsram) -{ - return hsram->State; -} - -/** - * @} - */ - -/** - * @} - */ -#endif /* HAL_SRAM_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_tim.c b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_tim.c deleted file mode 100755 index b429c9ec..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_tim.c +++ /dev/null @@ -1,5315 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_hal_tim.c - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief TIM HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the Timer (TIM) peripheral: - * + Time Base Initialization - * + Time Base Start - * + Time Base Start Interruption - * + Time Base Start DMA - * + Time Output Compare/PWM Initialization - * + Time Output Compare/PWM Channel Configuration - * + Time Output Compare/PWM Start - * + Time Output Compare/PWM Start Interruption - * + Time Output Compare/PWM Start DMA - * + Time Input Capture Initialization - * + Time Input Capture Channel Configuration - * + Time Input Capture Start - * + Time Input Capture Start Interruption - * + Time Input Capture Start DMA - * + Time One Pulse Initialization - * + Time One Pulse Channel Configuration - * + Time One Pulse Start - * + Time Encoder Interface Initialization - * + Time Encoder Interface Start - * + Time Encoder Interface Start Interruption - * + Time Encoder Interface Start DMA - * + Commutation Event configuration with Interruption and DMA - * + Time OCRef clear configuration - * + Time External Clock configuration - @verbatim - ============================================================================== - ##### TIMER Generic features ##### - ============================================================================== - [..] The Timer features include: - (#) 16-bit up, down, up/down auto-reload counter. - (#) 16-bit programmable prescaler allowing dividing (also on the fly) the - counter clock frequency either by any factor between 1 and 65536. - (#) Up to 4 independent channels for: - (++) Input Capture - (++) Output Compare - (++) PWM generation (Edge and Center-aligned Mode) - (++) One-pulse mode output - - ##### How to use this driver ##### - ============================================================================== - [..] - (#) Initialize the TIM low level resources by implementing the following functions - depending from feature used : - (++) Time Base : HAL_TIM_Base_MspInit() - (++) Input Capture : HAL_TIM_IC_MspInit() - (++) Output Compare : HAL_TIM_OC_MspInit() - (++) PWM generation : HAL_TIM_PWM_MspInit() - (++) One-pulse mode output : HAL_TIM_OnePulse_MspInit() - (++) Encoder mode output : HAL_TIM_Encoder_MspInit() - - (#) Initialize the TIM low level resources : - (##) Enable the TIM interface clock using __TIMx_CLK_ENABLE(); - (##) TIM pins configuration - (+++) Enable the clock for the TIM GPIOs using the following function: - __GPIOx_CLK_ENABLE(); - (+++) Configure these TIM pins in Alternate function mode using HAL_GPIO_Init(); - - (#) The external Clock can be configured, if needed (the default clock is the - internal clock from the APBx), using the following function: - HAL_TIM_ConfigClockSource, the clock configuration should be done before - any start function. - - (#) Configure the TIM in the desired functioning mode using one of the - initialization function of this driver: - (++) HAL_TIM_Base_Init: to use the Timer to generate a simple time base - (++) HAL_TIM_OC_Init and HAL_TIM_OC_ConfigChannel: to use the Timer to generate an - Output Compare signal. - (++) HAL_TIM_PWM_Init and HAL_TIM_PWM_ConfigChannel: to use the Timer to generate a - PWM signal. - (++) HAL_TIM_IC_Init and HAL_TIM_IC_ConfigChannel: to use the Timer to measure an - external signal. - (++) HAL_TIM_OnePulse_Init and HAL_TIM_OnePulse_ConfigChannel: to use the Timer - in One Pulse Mode. - (++) HAL_TIM_Encoder_Init: to use the Timer Encoder Interface. - - (#) Activate the TIM peripheral using one of the start functions depending from the feature used: - (++) Time Base : HAL_TIM_Base_Start(), HAL_TIM_Base_Start_DMA(), HAL_TIM_Base_Start_IT() - (++) Input Capture : HAL_TIM_IC_Start(), HAL_TIM_IC_Start_DMA(), HAL_TIM_IC_Start_IT() - (++) Output Compare : HAL_TIM_OC_Start(), HAL_TIM_OC_Start_DMA(), HAL_TIM_OC_Start_IT() - (++) PWM generation : HAL_TIM_PWM_Start(), HAL_TIM_PWM_Start_DMA(), HAL_TIM_PWM_Start_IT() - (++) One-pulse mode output : HAL_TIM_OnePulse_Start(), HAL_TIM_OnePulse_Start_IT() - (++) Encoder mode output : HAL_TIM_Encoder_Start(), HAL_TIM_Encoder_Start_DMA(), HAL_TIM_Encoder_Start_IT(). - - (#) The DMA Burst is managed with the two following functions: - HAL_TIM_DMABurst_WriteStart() - HAL_TIM_DMABurst_ReadStart() - - @endverbatim - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal.h" - -/** @addtogroup STM32F2xx_HAL_Driver - * @{ - */ - -/** @defgroup TIM TIM - * @brief TIM HAL module driver - * @{ - */ - -#ifdef HAL_TIM_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/** @addtogroup TIM_Private_Functions - * @{ - */ -/* Private function prototypes -----------------------------------------------*/ -static void TIM_OC1_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config); -static void TIM_OC3_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config); -static void TIM_OC4_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config); - -static void TIM_TI1_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter); -static void TIM_TI2_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, - uint32_t TIM_ICFilter); -static void TIM_TI2_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter); -static void TIM_TI3_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, - uint32_t TIM_ICFilter); -static void TIM_TI4_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, - uint32_t TIM_ICFilter); - -static void TIM_ETR_SetConfig(TIM_TypeDef* TIMx, uint32_t TIM_ExtTRGPrescaler, - uint32_t TIM_ExtTRGPolarity, uint32_t ExtTRGFilter); - -static void TIM_ITRx_SetConfig(TIM_TypeDef* TIMx, uint16_t TIM_ITRx); -static void TIM_DMAPeriodElapsedCplt(DMA_HandleTypeDef *hdma); -static void TIM_DMATriggerCplt(DMA_HandleTypeDef *hdma); -static void TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim, - TIM_SlaveConfigTypeDef * sSlaveConfig); -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup TIM_Exported_Functions TIM Exported Functions - * @{ - */ - -/** @defgroup TIM_Exported_Functions_Group1 Time Base functions - * @brief Time Base functions - * -@verbatim - ============================================================================== - ##### Time Base functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure the TIM base. - (+) De-initialize the TIM base. - (+) Start the Time Base. - (+) Stop the Time Base. - (+) Start the Time Base and enable interrupt. - (+) Stop the Time Base and disable interrupt. - (+) Start the Time Base and enable DMA transfer. - (+) Stop the Time Base and disable DMA transfer. - -@endverbatim - * @{ - */ -/** - * @brief Initializes the TIM Time base Unit according to the specified - * parameters in the TIM_HandleTypeDef and create the associated handle. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Base_Init(TIM_HandleTypeDef *htim) -{ - /* Check the TIM handle allocation */ - if(htim == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); - assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); - - if(htim->State == HAL_TIM_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - htim->Lock = HAL_UNLOCKED; - /* Init the low level hardware : GPIO, CLOCK, NVIC */ - HAL_TIM_Base_MspInit(htim); - } - - /* Set the TIM state */ - htim->State= HAL_TIM_STATE_BUSY; - - /* Set the Time Base configuration */ - TIM_Base_SetConfig(htim->Instance, &htim->Init); - - /* Initialize the TIM state*/ - htim->State= HAL_TIM_STATE_READY; - - return HAL_OK; -} - -/** - * @brief DeInitializes the TIM Base peripheral - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Base_DeInit(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Disable the TIM Peripheral Clock */ - __HAL_TIM_DISABLE(htim); - - /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ - HAL_TIM_Base_MspDeInit(htim); - - /* Change TIM state */ - htim->State = HAL_TIM_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM Base MSP. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @retval None - */ -__weak void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_TIM_Base_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes TIM Base MSP. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @retval None - */ -__weak void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef *htim) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_TIM_Base_MspDeInit could be implemented in the user file - */ -} - -/** - * @brief Starts the TIM Base generation. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - /* Set the TIM state */ - htim->State= HAL_TIM_STATE_BUSY; - - /* Enable the Peripheral */ - __HAL_TIM_ENABLE(htim); - - /* Change the TIM state*/ - htim->State= HAL_TIM_STATE_READY; - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Base generation. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - /* Set the TIM state */ - htim->State= HAL_TIM_STATE_BUSY; - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Change the TIM state*/ - htim->State= HAL_TIM_STATE_READY; - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Base generation in interrupt mode. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - /* Enable the TIM Update interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_UPDATE); - - /* Enable the Peripheral */ - __HAL_TIM_ENABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Base generation in interrupt mode. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - /* Disable the TIM Update interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_UPDATE); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Base generation in DMA mode. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @param pData: The source Buffer address. - * @param Length: The length of data to be transferred from memory to peripheral. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Base_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pData, uint16_t Length) -{ - /* Check the parameters */ - assert_param(IS_TIM_DMA_INSTANCE(htim->Instance)); - - if((htim->State == HAL_TIM_STATE_BUSY)) - { - return HAL_BUSY; - } - else if((htim->State == HAL_TIM_STATE_READY)) - { - if((pData == 0 ) && (Length > 0)) - { - return HAL_ERROR; - } - else - { - htim->State = HAL_TIM_STATE_BUSY; - } - } - /* Set the DMA Period elapsed callback */ - htim->hdma[TIM_DMA_ID_UPDATE]->XferCpltCallback = TIM_DMAPeriodElapsedCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_UPDATE]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA Stream */ - HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_UPDATE], (uint32_t)pData, (uint32_t)&htim->Instance->ARR, Length); - - /* Enable the TIM Update DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_UPDATE); - - /* Enable the Peripheral */ - __HAL_TIM_ENABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Base generation in DMA mode. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Base_Stop_DMA(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_DMA_INSTANCE(htim->Instance)); - - /* Disable the TIM Update DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_UPDATE); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Change the htim state */ - htim->State = HAL_TIM_STATE_READY; - - /* Return function status */ - return HAL_OK; -} -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group2 Time Output Compare functions - * @brief Time Output Compare functions - * -@verbatim - ============================================================================== - ##### Time Output Compare functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure the TIM Output Compare. - (+) De-initialize the TIM Output Compare. - (+) Start the Time Output Compare. - (+) Stop the Time Output Compare. - (+) Start the Time Output Compare and enable interrupt. - (+) Stop the Time Output Compare and disable interrupt. - (+) Start the Time Output Compare and enable DMA transfer. - (+) Stop the Time Output Compare and disable DMA transfer. - -@endverbatim - * @{ - */ -/** - * @brief Initializes the TIM Output Compare according to the specified - * parameters in the TIM_HandleTypeDef and create the associated handle. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_Init(TIM_HandleTypeDef* htim) -{ - /* Check the TIM handle allocation */ - if(htim == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); - assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); - - if(htim->State == HAL_TIM_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - htim->Lock = HAL_UNLOCKED; - /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ - HAL_TIM_OC_MspInit(htim); - } - - /* Set the TIM state */ - htim->State= HAL_TIM_STATE_BUSY; - - /* Init the base time for the Output Compare */ - TIM_Base_SetConfig(htim->Instance, &htim->Init); - - /* Initialize the TIM state*/ - htim->State= HAL_TIM_STATE_READY; - - return HAL_OK; -} - -/** - * @brief DeInitializes the TIM peripheral - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_DeInit(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Disable the TIM Peripheral Clock */ - __HAL_TIM_DISABLE(htim); - - /* DeInit the low level hardware: GPIO, CLOCK, NVIC and DMA */ - HAL_TIM_OC_MspDeInit(htim); - - /* Change TIM state */ - htim->State = HAL_TIM_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM Output Compare MSP. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @retval None - */ -__weak void HAL_TIM_OC_MspInit(TIM_HandleTypeDef *htim) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_TIM_OC_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes TIM Output Compare MSP. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @retval None - */ -__weak void HAL_TIM_OC_MspDeInit(TIM_HandleTypeDef *htim) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_TIM_OC_MspDeInit could be implemented in the user file - */ -} - -/** - * @brief Starts the TIM Output Compare signal generation. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @param Channel: TIM Channel to be enabled. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_Start(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Enable the Output compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - if(IS_TIM_ADVANCED_INSTANCE(htim->Instance) != RESET) - { - /* Enable the main output */ - __HAL_TIM_MOE_ENABLE(htim); - } - - /* Enable the Peripheral */ - __HAL_TIM_ENABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Output Compare signal generation. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @param Channel: TIM Channel to be disabled. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Disable the Output compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - if(IS_TIM_ADVANCED_INSTANCE(htim->Instance) != RESET) - { - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Output Compare signal generation in interrupt mode. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @param Channel: TIM Channel to be enabled. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Enable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - } - break; - - case TIM_CHANNEL_2: - { - /* Enable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - } - break; - - case TIM_CHANNEL_3: - { - /* Enable the TIM Capture/Compare 3 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); - } - break; - - case TIM_CHANNEL_4: - { - /* Enable the TIM Capture/Compare 4 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC4); - } - break; - - default: - break; - } - - /* Enable the Output compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - if(IS_TIM_ADVANCED_INSTANCE(htim->Instance) != RESET) - { - /* Enable the main output */ - __HAL_TIM_MOE_ENABLE(htim); - } - - /* Enable the Peripheral */ - __HAL_TIM_ENABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Output Compare signal generation in interrupt mode. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @param Channel: TIM Channel to be disabled. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - } - break; - - case TIM_CHANNEL_2: - { - /* Disable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - } - break; - - case TIM_CHANNEL_3: - { - /* Disable the TIM Capture/Compare 3 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); - } - break; - - case TIM_CHANNEL_4: - { - /* Disable the TIM Capture/Compare 4 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC4); - } - break; - - default: - break; - } - - /* Disable the Output compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - if(IS_TIM_ADVANCED_INSTANCE(htim->Instance) != RESET) - { - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Output Compare signal generation in DMA mode. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @param Channel: TIM Channel to be enabled. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @param pData: The source Buffer address. - * @param Length: The length of data to be transferred from memory to TIM peripheral - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - if((htim->State == HAL_TIM_STATE_BUSY)) - { - return HAL_BUSY; - } - else if((htim->State == HAL_TIM_STATE_READY)) - { - if(((uint32_t)pData == 0 ) && (Length > 0)) - { - return HAL_ERROR; - } - else - { - htim->State = HAL_TIM_STATE_BUSY; - } - } - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Set the DMA Period elapsed callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA Stream */ - HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, Length); - - /* Enable the TIM Capture/Compare 1 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); - } - break; - - case TIM_CHANNEL_2: - { - /* Set the DMA Period elapsed callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA Stream */ - HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, Length); - - /* Enable the TIM Capture/Compare 2 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); - } - break; - - case TIM_CHANNEL_3: - { - /* Set the DMA Period elapsed callback */ - htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA Stream */ - HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3,Length); - - /* Enable the TIM Capture/Compare 3 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); - } - break; - - case TIM_CHANNEL_4: - { - /* Set the DMA Period elapsed callback */ - htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMADelayPulseCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA Stream */ - HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)pData, (uint32_t)&htim->Instance->CCR4, Length); - - /* Enable the TIM Capture/Compare 4 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC4); - } - break; - - default: - break; - } - - /* Enable the Output compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - if(IS_TIM_ADVANCED_INSTANCE(htim->Instance) != RESET) - { - /* Enable the main output */ - __HAL_TIM_MOE_ENABLE(htim); - } - - /* Enable the Peripheral */ - __HAL_TIM_ENABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Output Compare signal generation in DMA mode. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @param Channel: TIM Channel to be disabled. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Capture/Compare 1 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); - } - break; - - case TIM_CHANNEL_2: - { - /* Disable the TIM Capture/Compare 2 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); - } - break; - - case TIM_CHANNEL_3: - { - /* Disable the TIM Capture/Compare 3 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); - } - break; - - case TIM_CHANNEL_4: - { - /* Disable the TIM Capture/Compare 4 interrupt */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC4); - } - break; - - default: - break; - } - - /* Disable the Output compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - if(IS_TIM_ADVANCED_INSTANCE(htim->Instance) != RESET) - { - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Change the htim state */ - htim->State = HAL_TIM_STATE_READY; - - /* Return function status */ - return HAL_OK; -} -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group3 Time PWM functions - * @brief Time PWM functions - * -@verbatim - ============================================================================== - ##### Time PWM functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure the TIM OPWM. - (+) De-initialize the TIM PWM. - (+) Start the Time PWM. - (+) Stop the Time PWM. - (+) Start the Time PWM and enable interrupt. - (+) Stop the Time PWM and disable interrupt. - (+) Start the Time PWM and enable DMA transfer. - (+) Stop the Time PWM and disable DMA transfer. - -@endverbatim - * @{ - */ -/** - * @brief Initializes the TIM PWM Time Base according to the specified - * parameters in the TIM_HandleTypeDef and create the associated handle. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_Init(TIM_HandleTypeDef *htim) -{ - /* Check the TIM handle allocation */ - if(htim == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); - assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); - - if(htim->State == HAL_TIM_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - htim->Lock = HAL_UNLOCKED; - /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ - HAL_TIM_PWM_MspInit(htim); - } - - /* Set the TIM state */ - htim->State= HAL_TIM_STATE_BUSY; - - /* Init the base time for the PWM */ - TIM_Base_SetConfig(htim->Instance, &htim->Init); - - /* Initialize the TIM state*/ - htim->State= HAL_TIM_STATE_READY; - - return HAL_OK; -} - -/** - * @brief DeInitializes the TIM peripheral - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_DeInit(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Disable the TIM Peripheral Clock */ - __HAL_TIM_DISABLE(htim); - - /* DeInit the low level hardware: GPIO, CLOCK, NVIC and DMA */ - HAL_TIM_PWM_MspDeInit(htim); - - /* Change TIM state */ - htim->State = HAL_TIM_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM PWM MSP. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @retval None - */ -__weak void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_TIM_PWM_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes TIM PWM MSP. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @retval None - */ -__weak void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef *htim) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_TIM_PWM_MspDeInit could be implemented in the user file - */ -} - -/** - * @brief Starts the PWM signal generation. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @param Channel: TIM Channels to be enabled. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Enable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - if(IS_TIM_ADVANCED_INSTANCE(htim->Instance) != RESET) - { - /* Enable the main output */ - __HAL_TIM_MOE_ENABLE(htim); - } - - /* Enable the Peripheral */ - __HAL_TIM_ENABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the PWM signal generation. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @param Channel: TIM Channels to be disabled. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Disable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - if(IS_TIM_ADVANCED_INSTANCE(htim->Instance) != RESET) - { - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Change the htim state */ - htim->State = HAL_TIM_STATE_READY; - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the PWM signal generation in interrupt mode. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @param Channel: TIM Channel to be disabled. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Enable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - } - break; - - case TIM_CHANNEL_2: - { - /* Enable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - } - break; - - case TIM_CHANNEL_3: - { - /* Enable the TIM Capture/Compare 3 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); - } - break; - - case TIM_CHANNEL_4: - { - /* Enable the TIM Capture/Compare 4 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC4); - } - break; - - default: - break; - } - - /* Enable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - if(IS_TIM_ADVANCED_INSTANCE(htim->Instance) != RESET) - { - /* Enable the main output */ - __HAL_TIM_MOE_ENABLE(htim); - } - - /* Enable the Peripheral */ - __HAL_TIM_ENABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the PWM signal generation in interrupt mode. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @param Channel: TIM Channels to be disabled. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_Stop_IT (TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - } - break; - - case TIM_CHANNEL_2: - { - /* Disable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - } - break; - - case TIM_CHANNEL_3: - { - /* Disable the TIM Capture/Compare 3 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); - } - break; - - case TIM_CHANNEL_4: - { - /* Disable the TIM Capture/Compare 4 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC4); - } - break; - - default: - break; - } - - /* Disable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - if(IS_TIM_ADVANCED_INSTANCE(htim->Instance) != RESET) - { - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM PWM signal generation in DMA mode. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @param Channel: TIM Channels to be enabled. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @param pData: The source Buffer address. - * @param Length: The length of data to be transferred from memory to TIM peripheral - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - if((htim->State == HAL_TIM_STATE_BUSY)) - { - return HAL_BUSY; - } - else if((htim->State == HAL_TIM_STATE_READY)) - { - if(((uint32_t)pData == 0 ) && (Length > 0)) - { - return HAL_ERROR; - } - else - { - htim->State = HAL_TIM_STATE_BUSY; - } - } - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Set the DMA Period elapsed callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA Stream */ - HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, Length); - - /* Enable the TIM Capture/Compare 1 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); - } - break; - - case TIM_CHANNEL_2: - { - /* Set the DMA Period elapsed callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA Stream */ - HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, Length); - - /* Enable the TIM Capture/Compare 2 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); - } - break; - - case TIM_CHANNEL_3: - { - /* Set the DMA Period elapsed callback */ - htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA Stream */ - HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3,Length); - - /* Enable the TIM Output Capture/Compare 3 request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); - } - break; - - case TIM_CHANNEL_4: - { - /* Set the DMA Period elapsed callback */ - htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMADelayPulseCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA Stream */ - HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)pData, (uint32_t)&htim->Instance->CCR4, Length); - - /* Enable the TIM Capture/Compare 4 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC4); - } - break; - - default: - break; - } - - /* Enable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - if(IS_TIM_ADVANCED_INSTANCE(htim->Instance) != RESET) - { - /* Enable the main output */ - __HAL_TIM_MOE_ENABLE(htim); - } - - /* Enable the Peripheral */ - __HAL_TIM_ENABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM PWM signal generation in DMA mode. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @param Channel: TIM Channels to be disabled. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Capture/Compare 1 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); - } - break; - - case TIM_CHANNEL_2: - { - /* Disable the TIM Capture/Compare 2 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); - } - break; - - case TIM_CHANNEL_3: - { - /* Disable the TIM Capture/Compare 3 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); - } - break; - - case TIM_CHANNEL_4: - { - /* Disable the TIM Capture/Compare 4 interrupt */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC4); - } - break; - - default: - break; - } - - /* Disable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - if(IS_TIM_ADVANCED_INSTANCE(htim->Instance) != RESET) - { - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Change the htim state */ - htim->State = HAL_TIM_STATE_READY; - - /* Return function status */ - return HAL_OK; -} -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group4 Time Input Capture functions - * @brief Time Input Capture functions - * -@verbatim - ============================================================================== - ##### Time Input Capture functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure the TIM Input Capture. - (+) De-initialize the TIM Input Capture. - (+) Start the Time Input Capture. - (+) Stop the Time Input Capture. - (+) Start the Time Input Capture and enable interrupt. - (+) Stop the Time Input Capture and disable interrupt. - (+) Start the Time Input Capture and enable DMA transfer. - (+) Stop the Time Input Capture and disable DMA transfer. - -@endverbatim - * @{ - */ -/** - * @brief Initializes the TIM Input Capture Time base according to the specified - * parameters in the TIM_HandleTypeDef and create the associated handle. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_Init(TIM_HandleTypeDef *htim) -{ - /* Check the TIM handle allocation */ - if(htim == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); - assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); - - if(htim->State == HAL_TIM_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - htim->Lock = HAL_UNLOCKED; - /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ - HAL_TIM_IC_MspInit(htim); - } - - /* Set the TIM state */ - htim->State= HAL_TIM_STATE_BUSY; - - /* Init the base time for the input capture */ - TIM_Base_SetConfig(htim->Instance, &htim->Init); - - /* Initialize the TIM state*/ - htim->State= HAL_TIM_STATE_READY; - - return HAL_OK; -} - -/** - * @brief DeInitializes the TIM peripheral - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_DeInit(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Disable the TIM Peripheral Clock */ - __HAL_TIM_DISABLE(htim); - - /* DeInit the low level hardware: GPIO, CLOCK, NVIC and DMA */ - HAL_TIM_IC_MspDeInit(htim); - - /* Change TIM state */ - htim->State = HAL_TIM_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM INput Capture MSP. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @retval None - */ -__weak void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_TIM_IC_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes TIM Input Capture MSP. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @retval None - */ -__weak void HAL_TIM_IC_MspDeInit(TIM_HandleTypeDef *htim) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_TIM_IC_MspDeInit could be implemented in the user file - */ -} - -/** - * @brief Starts the TIM Input Capture measurement. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @param Channel: TIM Channels to be enabled. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_Start (TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Enable the Input Capture channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - /* Enable the Peripheral */ - __HAL_TIM_ENABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Input Capture measurement. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @param Channel: TIM Channels to be disabled. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - /* Disable the Input Capture channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Input Capture measurement in interrupt mode. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @param Channel: TIM Channels to be enabled. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_Start_IT (TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Enable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - } - break; - - case TIM_CHANNEL_2: - { - /* Enable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - } - break; - - case TIM_CHANNEL_3: - { - /* Enable the TIM Capture/Compare 3 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); - } - break; - - case TIM_CHANNEL_4: - { - /* Enable the TIM Capture/Compare 4 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC4); - } - break; - - default: - break; - } - /* Enable the Input Capture channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - /* Enable the Peripheral */ - __HAL_TIM_ENABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Input Capture measurement in interrupt mode. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @param Channel: TIM Channels to be disabled. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - } - break; - - case TIM_CHANNEL_2: - { - /* Disable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - } - break; - - case TIM_CHANNEL_3: - { - /* Disable the TIM Capture/Compare 3 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); - } - break; - - case TIM_CHANNEL_4: - { - /* Disable the TIM Capture/Compare 4 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC4); - } - break; - - default: - break; - } - - /* Disable the Input Capture channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Input Capture measurement on in DMA mode. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @param Channel: TIM Channels to be enabled. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @param pData: The destination Buffer address. - * @param Length: The length of data to be transferred from TIM peripheral to memory. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); - - if((htim->State == HAL_TIM_STATE_BUSY)) - { - return HAL_BUSY; - } - else if((htim->State == HAL_TIM_STATE_READY)) - { - if((pData == 0 ) && (Length > 0)) - { - return HAL_ERROR; - } - else - { - htim->State = HAL_TIM_STATE_BUSY; - } - } - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Set the DMA Period elapsed callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA Stream */ - HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData, Length); - - /* Enable the TIM Capture/Compare 1 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); - } - break; - - case TIM_CHANNEL_2: - { - /* Set the DMA Period elapsed callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA Stream */ - HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->CCR2, (uint32_t)pData, Length); - - /* Enable the TIM Capture/Compare 2 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); - } - break; - - case TIM_CHANNEL_3: - { - /* Set the DMA Period elapsed callback */ - htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMACaptureCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA Stream */ - HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)&htim->Instance->CCR3, (uint32_t)pData, Length); - - /* Enable the TIM Capture/Compare 3 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); - } - break; - - case TIM_CHANNEL_4: - { - /* Set the DMA Period elapsed callback */ - htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMACaptureCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA Stream */ - HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)&htim->Instance->CCR4, (uint32_t)pData, Length); - - /* Enable the TIM Capture/Compare 4 DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC4); - } - break; - - default: - break; - } - - /* Enable the Input Capture channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); - - /* Enable the Peripheral */ - __HAL_TIM_ENABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Input Capture measurement on in DMA mode. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @param Channel: TIM Channels to be disabled. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Disable the TIM Capture/Compare 1 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); - } - break; - - case TIM_CHANNEL_2: - { - /* Disable the TIM Capture/Compare 2 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); - } - break; - - case TIM_CHANNEL_3: - { - /* Disable the TIM Capture/Compare 3 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); - } - break; - - case TIM_CHANNEL_4: - { - /* Disable the TIM Capture/Compare 4 DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC4); - } - break; - - default: - break; - } - - /* Disable the Input Capture channel */ - TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Change the htim state */ - htim->State = HAL_TIM_STATE_READY; - - /* Return function status */ - return HAL_OK; -} -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group5 Time One Pulse functions - * @brief Time One Pulse functions - * -@verbatim - ============================================================================== - ##### Time One Pulse functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure the TIM One Pulse. - (+) De-initialize the TIM One Pulse. - (+) Start the Time One Pulse. - (+) Stop the Time One Pulse. - (+) Start the Time One Pulse and enable interrupt. - (+) Stop the Time One Pulse and disable interrupt. - (+) Start the Time One Pulse and enable DMA transfer. - (+) Stop the Time One Pulse and disable DMA transfer. - -@endverbatim - * @{ - */ -/** - * @brief Initializes the TIM One Pulse Time Base according to the specified - * parameters in the TIM_HandleTypeDef and create the associated handle. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @param OnePulseMode: Select the One pulse mode. - * This parameter can be one of the following values: - * @arg TIM_OPMODE_SINGLE: Only one pulse will be generated. - * @arg TIM_OPMODE_REPETITIVE: Repetitive pulses will be generated. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OnePulse_Init(TIM_HandleTypeDef *htim, uint32_t OnePulseMode) -{ - /* Check the TIM handle allocation */ - if(htim == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); - assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); - assert_param(IS_TIM_OPM_MODE(OnePulseMode)); - - if(htim->State == HAL_TIM_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - htim->Lock = HAL_UNLOCKED; - /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ - HAL_TIM_OnePulse_MspInit(htim); - } - - /* Set the TIM state */ - htim->State= HAL_TIM_STATE_BUSY; - - /* Configure the Time base in the One Pulse Mode */ - TIM_Base_SetConfig(htim->Instance, &htim->Init); - - /* Reset the OPM Bit */ - htim->Instance->CR1 &= ~TIM_CR1_OPM; - - /* Configure the OPM Mode */ - htim->Instance->CR1 |= OnePulseMode; - - /* Initialize the TIM state*/ - htim->State= HAL_TIM_STATE_READY; - - return HAL_OK; -} - -/** - * @brief DeInitializes the TIM One Pulse - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OnePulse_DeInit(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Disable the TIM Peripheral Clock */ - __HAL_TIM_DISABLE(htim); - - /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ - HAL_TIM_OnePulse_MspDeInit(htim); - - /* Change TIM state */ - htim->State = HAL_TIM_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM One Pulse MSP. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @retval None - */ -__weak void HAL_TIM_OnePulse_MspInit(TIM_HandleTypeDef *htim) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_TIM_OnePulse_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes TIM One Pulse MSP. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @retval None - */ -__weak void HAL_TIM_OnePulse_MspDeInit(TIM_HandleTypeDef *htim) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_TIM_OnePulse_MspDeInit could be implemented in the user file - */ -} - -/** - * @brief Starts the TIM One Pulse signal generation. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @param OutputChannel : TIM Channels to be enabled. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OnePulse_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel) -{ - /* Enable the Capture compare and the Input Capture channels - (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) - if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and - if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output - in all combinations, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be enabled together - - No need to enable the counter, it's enabled automatically by hardware - (the counter starts in response to a stimulus and generate a pulse */ - - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); - - if(IS_TIM_ADVANCED_INSTANCE(htim->Instance) != RESET) - { - /* Enable the main output */ - __HAL_TIM_MOE_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM One Pulse signal generation. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @param OutputChannel : TIM Channels to be disable. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OnePulse_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel) -{ - /* Disable the Capture compare and the Input Capture channels - (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) - if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and - if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output - in all combinations, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be disabled together */ - - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); - - if(IS_TIM_ADVANCED_INSTANCE(htim->Instance) != RESET) - { - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM One Pulse signal generation in interrupt mode. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @param OutputChannel : TIM Channels to be enabled. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OnePulse_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel) -{ - /* Enable the Capture compare and the Input Capture channels - (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) - if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and - if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output - in all combinations, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be enabled together - - No need to enable the counter, it's enabled automatically by hardware - (the counter starts in response to a stimulus and generate a pulse */ - - /* Enable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - - /* Enable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); - - if(IS_TIM_ADVANCED_INSTANCE(htim->Instance) != RESET) - { - /* Enable the main output */ - __HAL_TIM_MOE_ENABLE(htim); - } - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM One Pulse signal generation in interrupt mode. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @param OutputChannel : TIM Channels to be enabled. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OnePulse_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel) -{ - /* Disable the TIM Capture/Compare 1 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - - /* Disable the TIM Capture/Compare 2 interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - - /* Disable the Capture compare and the Input Capture channels - (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) - if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and - if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output - in all combinations, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be disabled together */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); - - if(IS_TIM_ADVANCED_INSTANCE(htim->Instance) != RESET) - { - /* Disable the Main Output */ - __HAL_TIM_MOE_DISABLE(htim); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Return function status */ - return HAL_OK; -} -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group6 Time Encoder functions - * @brief Time Encoder functions - * -@verbatim - ============================================================================== - ##### Time Encoder functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure the TIM Encoder. - (+) De-initialize the TIM Encoder. - (+) Start the Time Encoder. - (+) Stop the Time Encoder. - (+) Start the Time Encoder and enable interrupt. - (+) Stop the Time Encoder and disable interrupt. - (+) Start the Time Encoder and enable DMA transfer. - (+) Stop the Time Encoder and disable DMA transfer. - -@endverbatim - * @{ - */ -/** - * @brief Initializes the TIM Encoder Interface and create the associated handle. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @param sConfig: TIM Encoder Interface configuration structure - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Encoder_Init(TIM_HandleTypeDef *htim, TIM_Encoder_InitTypeDef* sConfig) -{ - uint32_t tmpsmcr = 0; - uint32_t tmpccmr1 = 0; - uint32_t tmpccer = 0; - - /* Check the TIM handle allocation */ - if(htim == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - assert_param(IS_TIM_ENCODER_MODE(sConfig->EncoderMode)); - assert_param(IS_TIM_IC_SELECTION(sConfig->IC1Selection)); - assert_param(IS_TIM_IC_SELECTION(sConfig->IC2Selection)); - assert_param(IS_TIM_IC_POLARITY(sConfig->IC1Polarity)); - assert_param(IS_TIM_IC_POLARITY(sConfig->IC2Polarity)); - assert_param(IS_TIM_IC_PRESCALER(sConfig->IC1Prescaler)); - assert_param(IS_TIM_IC_PRESCALER(sConfig->IC2Prescaler)); - assert_param(IS_TIM_IC_FILTER(sConfig->IC1Filter)); - assert_param(IS_TIM_IC_FILTER(sConfig->IC2Filter)); - - if(htim->State == HAL_TIM_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - htim->Lock = HAL_UNLOCKED; - /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ - HAL_TIM_Encoder_MspInit(htim); - } - - /* Set the TIM state */ - htim->State= HAL_TIM_STATE_BUSY; - - /* Reset the SMS bits */ - htim->Instance->SMCR &= ~TIM_SMCR_SMS; - - /* Configure the Time base in the Encoder Mode */ - TIM_Base_SetConfig(htim->Instance, &htim->Init); - - /* Get the TIMx SMCR register value */ - tmpsmcr = htim->Instance->SMCR; - - /* Get the TIMx CCMR1 register value */ - tmpccmr1 = htim->Instance->CCMR1; - - /* Get the TIMx CCER register value */ - tmpccer = htim->Instance->CCER; - - /* Set the encoder Mode */ - tmpsmcr |= sConfig->EncoderMode; - - /* Select the Capture Compare 1 and the Capture Compare 2 as input */ - tmpccmr1 &= ~(TIM_CCMR1_CC1S | TIM_CCMR1_CC2S); - tmpccmr1 |= (sConfig->IC1Selection | (sConfig->IC2Selection << 8)); - - /* Set the Capture Compare 1 and the Capture Compare 2 prescalers and filters */ - tmpccmr1 &= ~(TIM_CCMR1_IC1PSC | TIM_CCMR1_IC2PSC); - tmpccmr1 &= ~(TIM_CCMR1_IC1F | TIM_CCMR1_IC2F); - tmpccmr1 |= sConfig->IC1Prescaler | (sConfig->IC2Prescaler << 8); - tmpccmr1 |= (sConfig->IC1Filter << 4) | (sConfig->IC2Filter << 12); - - /* Set the TI1 and the TI2 Polarities */ - tmpccer &= ~(TIM_CCER_CC1P | TIM_CCER_CC2P); - tmpccer &= ~(TIM_CCER_CC1NP | TIM_CCER_CC2NP); - tmpccer |= sConfig->IC1Polarity | (sConfig->IC2Polarity << 4); - - /* Write to TIMx SMCR */ - htim->Instance->SMCR = tmpsmcr; - - /* Write to TIMx CCMR1 */ - htim->Instance->CCMR1 = tmpccmr1; - - /* Write to TIMx CCER */ - htim->Instance->CCER = tmpccer; - - /* Initialize the TIM state*/ - htim->State= HAL_TIM_STATE_READY; - - return HAL_OK; -} - -/** - * @brief DeInitializes the TIM Encoder interface - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Encoder_DeInit(TIM_HandleTypeDef *htim) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Disable the TIM Peripheral Clock */ - __HAL_TIM_DISABLE(htim); - - /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ - HAL_TIM_Encoder_MspDeInit(htim); - - /* Change TIM state */ - htim->State = HAL_TIM_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM Encoder Interface MSP. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @retval None - */ -__weak void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef *htim) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_TIM_Encoder_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes TIM Encoder Interface MSP. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @retval None - */ -__weak void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef *htim) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_TIM_Encoder_MspDeInit could be implemented in the user file - */ -} - -/** - * @brief Starts the TIM Encoder Interface. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @param Channel: TIM Channels to be enabled. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - - /* Enable the encoder interface channels */ - switch (Channel) - { - case TIM_CHANNEL_1: - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - break; - } - case TIM_CHANNEL_2: - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); - break; - } - default : - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); - break; - } - } - /* Enable the Peripheral */ - __HAL_TIM_ENABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Encoder Interface. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @param Channel: TIM Channels to be disabled. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - - /* Disable the Input Capture channels 1 and 2 - (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ - switch (Channel) - { - case TIM_CHANNEL_1: - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - break; - } - case TIM_CHANNEL_2: - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); - break; - } - default : - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); - break; - } - } - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Encoder Interface in interrupt mode. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @param Channel: TIM Channels to be enabled. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - - /* Enable the encoder interface channels */ - /* Enable the capture compare Interrupts 1 and/or 2 */ - switch (Channel) - { - case TIM_CHANNEL_1: - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - break; - } - case TIM_CHANNEL_2: - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - break; - } - default : - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); - __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); - break; - } - } - - /* Enable the Peripheral */ - __HAL_TIM_ENABLE(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Encoder Interface in interrupt mode. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @param Channel: TIM Channels to be disabled. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - - /* Disable the Input Capture channels 1 and 2 - (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ - if(Channel == TIM_CHANNEL_1) - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - - /* Disable the capture compare Interrupts 1 */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - } - else if(Channel == TIM_CHANNEL_2) - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); - - /* Disable the capture compare Interrupts 2 */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - } - else - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); - - /* Disable the capture compare Interrupts 1 and 2 */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); - __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Change the htim state */ - htim->State = HAL_TIM_STATE_READY; - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the TIM Encoder Interface in DMA mode. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @param Channel: TIM Channels to be enabled. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected - * @param pData1: The destination Buffer address for IC1. - * @param pData2: The destination Buffer address for IC2. - * @param Length: The length of data to be transferred from TIM peripheral to memory. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, uint32_t *pData2, uint16_t Length) -{ - /* Check the parameters */ - assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); - - if((htim->State == HAL_TIM_STATE_BUSY)) - { - return HAL_BUSY; - } - else if((htim->State == HAL_TIM_STATE_READY)) - { - if((((pData1 == 0) || (pData2 == 0) )) && (Length > 0)) - { - return HAL_ERROR; - } - else - { - htim->State = HAL_TIM_STATE_BUSY; - } - } - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Set the DMA Period elapsed callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA Stream */ - HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t )pData1, Length); - - /* Enable the TIM Input Capture DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); - - /* Enable the Peripheral */ - __HAL_TIM_ENABLE(htim); - - /* Enable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - } - break; - - case TIM_CHANNEL_2: - { - /* Set the DMA Period elapsed callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError; - /* Enable the DMA Stream */ - HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->CCR2, (uint32_t)pData2, Length); - - /* Enable the TIM Input Capture DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); - - /* Enable the Peripheral */ - __HAL_TIM_ENABLE(htim); - - /* Enable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); - } - break; - - case TIM_CHANNEL_ALL: - { - /* Set the DMA Period elapsed callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA Stream */ - HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData1, Length); - - /* Set the DMA Period elapsed callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA Stream */ - HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->CCR2, (uint32_t)pData2, Length); - - /* Enable the Peripheral */ - __HAL_TIM_ENABLE(htim); - - /* Enable the Capture compare channel */ - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); - - /* Enable the TIM Input Capture DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); - /* Enable the TIM Input Capture DMA request */ - __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); - } - break; - - default: - break; - } - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM Encoder Interface in DMA mode. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @param Channel: TIM Channels to be enabled. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); - - /* Disable the Input Capture channels 1 and 2 - (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ - if(Channel == TIM_CHANNEL_1) - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - - /* Disable the capture compare DMA Request 1 */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); - } - else if(Channel == TIM_CHANNEL_2) - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); - - /* Disable the capture compare DMA Request 2 */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); - } - else - { - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); - TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); - - /* Disable the capture compare DMA Request 1 and 2 */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); - } - - /* Disable the Peripheral */ - __HAL_TIM_DISABLE(htim); - - /* Change the htim state */ - htim->State = HAL_TIM_STATE_READY; - - /* Return function status */ - return HAL_OK; -} -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group7 TIM IRQ handler management - * @brief IRQ handler management - * -@verbatim - ============================================================================== - ##### IRQ handler management ##### - ============================================================================== - [..] - This section provides Timer IRQ handler function. - -@endverbatim - * @{ - */ -/** - * @brief This function handles TIM interrupts requests. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @retval None - */ -void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim) -{ - /* Capture compare 1 event */ - if(__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC1) != RESET) - { - if(__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC1) !=RESET) - { - { - __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC1); - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; - - /* Input capture event */ - if((htim->Instance->CCMR1 & TIM_CCMR1_CC1S) != 0x00) - { - HAL_TIM_IC_CaptureCallback(htim); - } - /* Output compare event */ - else - { - HAL_TIM_OC_DelayElapsedCallback(htim); - HAL_TIM_PWM_PulseFinishedCallback(htim); - } - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; - } - } - } - /* Capture compare 2 event */ - if(__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC2) != RESET) - { - if(__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC2) !=RESET) - { - __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC2); - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; - /* Input capture event */ - if((htim->Instance->CCMR1 & TIM_CCMR1_CC2S) != 0x00) - { - HAL_TIM_IC_CaptureCallback(htim); - } - /* Output compare event */ - else - { - HAL_TIM_OC_DelayElapsedCallback(htim); - HAL_TIM_PWM_PulseFinishedCallback(htim); - } - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; - } - } - /* Capture compare 3 event */ - if(__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC3) != RESET) - { - if(__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC3) !=RESET) - { - __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC3); - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; - /* Input capture event */ - if((htim->Instance->CCMR2 & TIM_CCMR2_CC3S) != 0x00) - { - HAL_TIM_IC_CaptureCallback(htim); - } - /* Output compare event */ - else - { - HAL_TIM_OC_DelayElapsedCallback(htim); - HAL_TIM_PWM_PulseFinishedCallback(htim); - } - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; - } - } - /* Capture compare 4 event */ - if(__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC4) != RESET) - { - if(__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC4) !=RESET) - { - __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC4); - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; - /* Input capture event */ - if((htim->Instance->CCMR2 & TIM_CCMR2_CC4S) != 0x00) - { - HAL_TIM_IC_CaptureCallback(htim); - } - /* Output compare event */ - else - { - HAL_TIM_OC_DelayElapsedCallback(htim); - HAL_TIM_PWM_PulseFinishedCallback(htim); - } - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; - } - } - /* TIM Update event */ - if(__HAL_TIM_GET_FLAG(htim, TIM_FLAG_UPDATE) != RESET) - { - if(__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_UPDATE) !=RESET) - { - __HAL_TIM_CLEAR_IT(htim, TIM_IT_UPDATE); - HAL_TIM_PeriodElapsedCallback(htim); - } - } - /* TIM Break input event */ - if(__HAL_TIM_GET_FLAG(htim, TIM_FLAG_BREAK) != RESET) - { - if(__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_BREAK) !=RESET) - { - __HAL_TIM_CLEAR_IT(htim, TIM_IT_BREAK); - HAL_TIMEx_BreakCallback(htim); - } - } - /* TIM Trigger detection event */ - if(__HAL_TIM_GET_FLAG(htim, TIM_FLAG_TRIGGER) != RESET) - { - if(__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_TRIGGER) !=RESET) - { - __HAL_TIM_CLEAR_IT(htim, TIM_IT_TRIGGER); - HAL_TIM_TriggerCallback(htim); - } - } - /* TIM commutation event */ - if(__HAL_TIM_GET_FLAG(htim, TIM_FLAG_COM) != RESET) - { - if(__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_COM) !=RESET) - { - __HAL_TIM_CLEAR_IT(htim, TIM_FLAG_COM); - HAL_TIMEx_CommutationCallback(htim); - } - } -} -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group8 Peripheral Control functions - * @brief Peripheral Control functions - * -@verbatim - ============================================================================== - ##### Peripheral Control functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Configure The Input Output channels for OC, PWM, IC or One Pulse mode. - (+) Configure External Clock source. - (+) Configure Complementary channels, break features and dead time. - (+) Configure Master and the Slave synchronization. - (+) Configure the DMA Burst Mode. - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the TIM Output Compare Channels according to the specified - * parameters in the TIM_OC_InitTypeDef. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @param sConfig: TIM Output Compare configuration structure - * @param Channel: TIM Channels to be enabled. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OC_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef* sConfig, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CHANNELS(Channel)); - assert_param(IS_TIM_OC_MODE(sConfig->OCMode)); - assert_param(IS_TIM_OC_POLARITY(sConfig->OCPolarity)); - - /* Check input state */ - __HAL_LOCK(htim); - - htim->State = HAL_TIM_STATE_BUSY; - - switch (Channel) - { - case TIM_CHANNEL_1: - { - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - /* Configure the TIM Channel 1 in Output Compare */ - TIM_OC1_SetConfig(htim->Instance, sConfig); - } - break; - - case TIM_CHANNEL_2: - { - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - /* Configure the TIM Channel 2 in Output Compare */ - TIM_OC2_SetConfig(htim->Instance, sConfig); - } - break; - - case TIM_CHANNEL_3: - { - assert_param(IS_TIM_CC3_INSTANCE(htim->Instance)); - /* Configure the TIM Channel 3 in Output Compare */ - TIM_OC3_SetConfig(htim->Instance, sConfig); - } - break; - - case TIM_CHANNEL_4: - { - assert_param(IS_TIM_CC4_INSTANCE(htim->Instance)); - /* Configure the TIM Channel 4 in Output Compare */ - TIM_OC4_SetConfig(htim->Instance, sConfig); - } - break; - - default: - break; - } - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM Input Capture Channels according to the specified - * parameters in the TIM_IC_InitTypeDef. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @param sConfig: TIM Input Capture configuration structure - * @param Channel: TIM Channels to be enabled. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_IC_ConfigChannel(TIM_HandleTypeDef *htim, TIM_IC_InitTypeDef* sConfig, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - assert_param(IS_TIM_IC_POLARITY(sConfig->ICPolarity)); - assert_param(IS_TIM_IC_SELECTION(sConfig->ICSelection)); - assert_param(IS_TIM_IC_PRESCALER(sConfig->ICPrescaler)); - assert_param(IS_TIM_IC_FILTER(sConfig->ICFilter)); - - __HAL_LOCK(htim); - - htim->State = HAL_TIM_STATE_BUSY; - - if (Channel == TIM_CHANNEL_1) - { - /* TI1 Configuration */ - TIM_TI1_SetConfig(htim->Instance, - sConfig->ICPolarity, - sConfig->ICSelection, - sConfig->ICFilter); - - /* Reset the IC1PSC Bits */ - htim->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC; - - /* Set the IC1PSC value */ - htim->Instance->CCMR1 |= sConfig->ICPrescaler; - } - else if (Channel == TIM_CHANNEL_2) - { - /* TI2 Configuration */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - - TIM_TI2_SetConfig(htim->Instance, - sConfig->ICPolarity, - sConfig->ICSelection, - sConfig->ICFilter); - - /* Reset the IC2PSC Bits */ - htim->Instance->CCMR1 &= ~TIM_CCMR1_IC2PSC; - - /* Set the IC2PSC value */ - htim->Instance->CCMR1 |= (sConfig->ICPrescaler << 8); - } - else if (Channel == TIM_CHANNEL_3) - { - /* TI3 Configuration */ - assert_param(IS_TIM_CC3_INSTANCE(htim->Instance)); - - TIM_TI3_SetConfig(htim->Instance, - sConfig->ICPolarity, - sConfig->ICSelection, - sConfig->ICFilter); - - /* Reset the IC3PSC Bits */ - htim->Instance->CCMR2 &= ~TIM_CCMR2_IC3PSC; - - /* Set the IC3PSC value */ - htim->Instance->CCMR2 |= sConfig->ICPrescaler; - } - else - { - /* TI4 Configuration */ - assert_param(IS_TIM_CC4_INSTANCE(htim->Instance)); - - TIM_TI4_SetConfig(htim->Instance, - sConfig->ICPolarity, - sConfig->ICSelection, - sConfig->ICFilter); - - /* Reset the IC4PSC Bits */ - htim->Instance->CCMR2 &= ~TIM_CCMR2_IC4PSC; - - /* Set the IC4PSC value */ - htim->Instance->CCMR2 |= (sConfig->ICPrescaler << 8); - } - - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM PWM channels according to the specified - * parameters in the TIM_OC_InitTypeDef. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @param sConfig: TIM PWM configuration structure - * @param Channel: TIM Channels to be enabled. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef* sConfig, uint32_t Channel) -{ - __HAL_LOCK(htim); - - /* Check the parameters */ - assert_param(IS_TIM_CHANNELS(Channel)); - assert_param(IS_TIM_PWM_MODE(sConfig->OCMode)); - assert_param(IS_TIM_OC_POLARITY(sConfig->OCPolarity)); - assert_param(IS_TIM_FAST_STATE(sConfig->OCFastMode)); - - htim->State = HAL_TIM_STATE_BUSY; - - switch (Channel) - { - case TIM_CHANNEL_1: - { - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - /* Configure the Channel 1 in PWM mode */ - TIM_OC1_SetConfig(htim->Instance, sConfig); - - /* Set the Preload enable bit for channel1 */ - htim->Instance->CCMR1 |= TIM_CCMR1_OC1PE; - - /* Configure the Output Fast mode */ - htim->Instance->CCMR1 &= ~TIM_CCMR1_OC1FE; - htim->Instance->CCMR1 |= sConfig->OCFastMode; - } - break; - - case TIM_CHANNEL_2: - { - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - /* Configure the Channel 2 in PWM mode */ - TIM_OC2_SetConfig(htim->Instance, sConfig); - - /* Set the Preload enable bit for channel2 */ - htim->Instance->CCMR1 |= TIM_CCMR1_OC2PE; - - /* Configure the Output Fast mode */ - htim->Instance->CCMR1 &= ~TIM_CCMR1_OC2FE; - htim->Instance->CCMR1 |= sConfig->OCFastMode << 8; - } - break; - - case TIM_CHANNEL_3: - { - assert_param(IS_TIM_CC3_INSTANCE(htim->Instance)); - /* Configure the Channel 3 in PWM mode */ - TIM_OC3_SetConfig(htim->Instance, sConfig); - - /* Set the Preload enable bit for channel3 */ - htim->Instance->CCMR2 |= TIM_CCMR2_OC3PE; - - /* Configure the Output Fast mode */ - htim->Instance->CCMR2 &= ~TIM_CCMR2_OC3FE; - htim->Instance->CCMR2 |= sConfig->OCFastMode; - } - break; - - case TIM_CHANNEL_4: - { - assert_param(IS_TIM_CC4_INSTANCE(htim->Instance)); - /* Configure the Channel 4 in PWM mode */ - TIM_OC4_SetConfig(htim->Instance, sConfig); - - /* Set the Preload enable bit for channel4 */ - htim->Instance->CCMR2 |= TIM_CCMR2_OC4PE; - - /* Configure the Output Fast mode */ - htim->Instance->CCMR2 &= ~TIM_CCMR2_OC4FE; - htim->Instance->CCMR2 |= sConfig->OCFastMode << 8; - } - break; - - default: - break; - } - - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Initializes the TIM One Pulse Channels according to the specified - * parameters in the TIM_OnePulse_InitTypeDef. - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @param sConfig: TIM One Pulse configuration structure - * @param OutputChannel: TIM Channels to be enabled. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @param InputChannel: TIM Channels to be enabled. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef* sConfig, uint32_t OutputChannel, uint32_t InputChannel) -{ - TIM_OC_InitTypeDef temp1; - - /* Check the parameters */ - assert_param(IS_TIM_OPM_CHANNELS(OutputChannel)); - assert_param(IS_TIM_OPM_CHANNELS(InputChannel)); - - if(OutputChannel != InputChannel) - { - __HAL_LOCK(htim); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Extract the Output compare configuration from sConfig structure */ - temp1.OCMode = sConfig->OCMode; - temp1.Pulse = sConfig->Pulse; - temp1.OCPolarity = sConfig->OCPolarity; - temp1.OCNPolarity = sConfig->OCNPolarity; - temp1.OCIdleState = sConfig->OCIdleState; - temp1.OCNIdleState = sConfig->OCNIdleState; - - switch (OutputChannel) - { - case TIM_CHANNEL_1: - { - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - - TIM_OC1_SetConfig(htim->Instance, &temp1); - } - break; - case TIM_CHANNEL_2: - { - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - - TIM_OC2_SetConfig(htim->Instance, &temp1); - } - break; - default: - break; - } - switch (InputChannel) - { - case TIM_CHANNEL_1: - { - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - - TIM_TI1_SetConfig(htim->Instance, sConfig->ICPolarity, - sConfig->ICSelection, sConfig->ICFilter); - - /* Reset the IC1PSC Bits */ - htim->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC; - - /* Select the Trigger source */ - htim->Instance->SMCR &= ~TIM_SMCR_TS; - htim->Instance->SMCR |= TIM_TS_TI1FP1; - - /* Select the Slave Mode */ - htim->Instance->SMCR &= ~TIM_SMCR_SMS; - htim->Instance->SMCR |= TIM_SLAVEMODE_TRIGGER; - } - break; - case TIM_CHANNEL_2: - { - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - - TIM_TI2_SetConfig(htim->Instance, sConfig->ICPolarity, - sConfig->ICSelection, sConfig->ICFilter); - - /* Reset the IC2PSC Bits */ - htim->Instance->CCMR1 &= ~TIM_CCMR1_IC2PSC; - - /* Select the Trigger source */ - htim->Instance->SMCR &= ~TIM_SMCR_TS; - htim->Instance->SMCR |= TIM_TS_TI2FP2; - - /* Select the Slave Mode */ - htim->Instance->SMCR &= ~TIM_SMCR_SMS; - htim->Instance->SMCR |= TIM_SLAVEMODE_TRIGGER; - } - break; - - default: - break; - } - - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - return HAL_OK; - } - else - { - return HAL_ERROR; - } -} - -/** - * @brief Configure the DMA Burst to transfer Data from the memory to the TIM peripheral - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @param BurstBaseAddress: TIM Base address from when the DMA will starts the Data write. - * This parameters can be on of the following values: - * @arg TIM_DMABASE_CR1 - * @arg TIM_DMABASE_CR2 - * @arg TIM_DMABASE_SMCR - * @arg TIM_DMABASE_DIER - * @arg TIM_DMABASE_SR - * @arg TIM_DMABASE_EGR - * @arg TIM_DMABASE_CCMR1 - * @arg TIM_DMABASE_CCMR2 - * @arg TIM_DMABASE_CCER - * @arg TIM_DMABASE_CNT - * @arg TIM_DMABASE_PSC - * @arg TIM_DMABASE_ARR - * @arg TIM_DMABASE_RCR - * @arg TIM_DMABASE_CCR1 - * @arg TIM_DMABASE_CCR2 - * @arg TIM_DMABASE_CCR3 - * @arg TIM_DMABASE_CCR4 - * @arg TIM_DMABASE_BDTR - * @arg TIM_DMABASE_DCR - * @param BurstRequestSrc: TIM DMA Request sources. - * This parameters can be on of the following values: - * @arg TIM_DMA_UPDATE: TIM update Interrupt source - * @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source - * @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source - * @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source - * @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source - * @arg TIM_DMA_COM: TIM Commutation DMA source - * @arg TIM_DMA_TRIGGER: TIM Trigger DMA source - * @param BurstBuffer: The Buffer address. - * @param BurstLength: DMA Burst length. This parameter can be one value - * between TIM_DMABURSTLENGTH_1TRANSFER and TIM_DMABURSTLENGTH_18TRANSFERS. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, uint32_t BurstRequestSrc, - uint32_t* BurstBuffer, uint32_t BurstLength) -{ - /* Check the parameters */ - assert_param(IS_TIM_DMABURST_INSTANCE(htim->Instance)); - assert_param(IS_TIM_DMA_BASE(BurstBaseAddress)); - assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); - assert_param(IS_TIM_DMA_LENGTH(BurstLength)); - - if((htim->State == HAL_TIM_STATE_BUSY)) - { - return HAL_BUSY; - } - else if((htim->State == HAL_TIM_STATE_READY)) - { - if((BurstBuffer == 0 ) && (BurstLength > 0)) - { - return HAL_ERROR; - } - else - { - htim->State = HAL_TIM_STATE_BUSY; - } - } - switch(BurstRequestSrc) - { - case TIM_DMA_UPDATE: - { - /* Set the DMA Period elapsed callback */ - htim->hdma[TIM_DMA_ID_UPDATE]->XferCpltCallback = TIM_DMAPeriodElapsedCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_UPDATE]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA Stream */ - HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_UPDATE], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8) + 1); - } - break; - case TIM_DMA_CC1: - { - /* Set the DMA Period elapsed callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA Stream */ - HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8) + 1); - } - break; - case TIM_DMA_CC2: - { - /* Set the DMA Period elapsed callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA Stream */ - HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8) + 1); - } - break; - case TIM_DMA_CC3: - { - /* Set the DMA Period elapsed callback */ - htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA Stream */ - HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8) + 1); - } - break; - case TIM_DMA_CC4: - { - /* Set the DMA Period elapsed callback */ - htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMADelayPulseCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA Stream */ - HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8) + 1); - } - break; - case TIM_DMA_COM: - { - /* Set the DMA Period elapsed callback */ - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferCpltCallback = TIMEx_DMACommutationCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA Stream */ - HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_COMMUTATION], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8) + 1); - } - break; - case TIM_DMA_TRIGGER: - { - /* Set the DMA Period elapsed callback */ - htim->hdma[TIM_DMA_ID_TRIGGER]->XferCpltCallback = TIM_DMATriggerCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_TRIGGER]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA Stream */ - HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_TRIGGER], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8) + 1); - } - break; - default: - break; - } - /* configure the DMA Burst Mode */ - htim->Instance->DCR = BurstBaseAddress | BurstLength; - - /* Enable the TIM DMA Request */ - __HAL_TIM_ENABLE_DMA(htim, BurstRequestSrc); - - htim->State = HAL_TIM_STATE_READY; - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stops the TIM DMA Burst mode - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @param BurstRequestSrc: TIM DMA Request sources to disable - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc) -{ - /* Check the parameters */ - assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); - - /* Abort the DMA transfer (at least disable the DMA channel) */ - switch(BurstRequestSrc) - { - case TIM_DMA_UPDATE: - { - HAL_DMA_Abort(htim->hdma[TIM_DMA_ID_UPDATE]); - } - break; - case TIM_DMA_CC1: - { - HAL_DMA_Abort(htim->hdma[TIM_DMA_ID_CC1]); - } - break; - case TIM_DMA_CC2: - { - HAL_DMA_Abort(htim->hdma[TIM_DMA_ID_CC2]); - } - break; - case TIM_DMA_CC3: - { - HAL_DMA_Abort(htim->hdma[TIM_DMA_ID_CC3]); - } - break; - case TIM_DMA_CC4: - { - HAL_DMA_Abort(htim->hdma[TIM_DMA_ID_CC4]); - } - break; - case TIM_DMA_COM: - { - HAL_DMA_Abort(htim->hdma[TIM_DMA_ID_COMMUTATION]); - } - break; - case TIM_DMA_TRIGGER: - { - HAL_DMA_Abort(htim->hdma[TIM_DMA_ID_TRIGGER]); - } - break; - default: - break; - } - - /* Disable the TIM Update DMA request */ - __HAL_TIM_DISABLE_DMA(htim, BurstRequestSrc); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Configure the DMA Burst to transfer Data from the TIM peripheral to the memory - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @param BurstBaseAddress: TIM Base address from when the DMA will starts the Data read. - * This parameters can be on of the following values: - * @arg TIM_DMABASE_CR1 - * @arg TIM_DMABASE_CR2 - * @arg TIM_DMABASE_SMCR - * @arg TIM_DMABASE_DIER - * @arg TIM_DMABASE_SR - * @arg TIM_DMABASE_EGR - * @arg TIM_DMABASE_CCMR1 - * @arg TIM_DMABASE_CCMR2 - * @arg TIM_DMABASE_CCER - * @arg TIM_DMABASE_CNT - * @arg TIM_DMABASE_PSC - * @arg TIM_DMABASE_ARR - * @arg TIM_DMABASE_RCR - * @arg TIM_DMABASE_CCR1 - * @arg TIM_DMABASE_CCR2 - * @arg TIM_DMABASE_CCR3 - * @arg TIM_DMABASE_CCR4 - * @arg TIM_DMABASE_BDTR - * @arg TIM_DMABASE_DCR - * @param BurstRequestSrc: TIM DMA Request sources. - * This parameters can be on of the following values: - * @arg TIM_DMA_UPDATE: TIM update Interrupt source - * @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source - * @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source - * @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source - * @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source - * @arg TIM_DMA_COM: TIM Commutation DMA source - * @arg TIM_DMA_TRIGGER: TIM Trigger DMA source - * @param BurstBuffer: The Buffer address. - * @param BurstLength: DMA Burst length. This parameter can be one value - * between TIM_DMABURSTLENGTH_1TRANSFER and TIM_DMABURSTLENGTH_18TRANSFERS. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, uint32_t BurstRequestSrc, - uint32_t *BurstBuffer, uint32_t BurstLength) -{ - /* Check the parameters */ - assert_param(IS_TIM_DMABURST_INSTANCE(htim->Instance)); - assert_param(IS_TIM_DMA_BASE(BurstBaseAddress)); - assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); - assert_param(IS_TIM_DMA_LENGTH(BurstLength)); - - if((htim->State == HAL_TIM_STATE_BUSY)) - { - return HAL_BUSY; - } - else if((htim->State == HAL_TIM_STATE_READY)) - { - if((BurstBuffer == 0 ) && (BurstLength > 0)) - { - return HAL_ERROR; - } - else - { - htim->State = HAL_TIM_STATE_BUSY; - } - } - switch(BurstRequestSrc) - { - case TIM_DMA_UPDATE: - { - /* Set the DMA Period elapsed callback */ - htim->hdma[TIM_DMA_ID_UPDATE]->XferCpltCallback = TIM_DMAPeriodElapsedCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_UPDATE]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA Stream */ - HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_UPDATE], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, ((BurstLength) >> 8) + 1); - } - break; - case TIM_DMA_CC1: - { - /* Set the DMA Period elapsed callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA Stream */ - HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, ((BurstLength) >> 8) + 1); - } - break; - case TIM_DMA_CC2: - { - /* Set the DMA Period elapsed callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA Stream */ - HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, ((BurstLength) >> 8) + 1); - } - break; - case TIM_DMA_CC3: - { - /* Set the DMA Period elapsed callback */ - htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMACaptureCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA Stream */ - HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, ((BurstLength) >> 8) + 1); - } - break; - case TIM_DMA_CC4: - { - /* Set the DMA Period elapsed callback */ - htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMACaptureCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA Stream */ - HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, ((BurstLength) >> 8) + 1); - } - break; - case TIM_DMA_COM: - { - /* Set the DMA Period elapsed callback */ - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferCpltCallback = TIMEx_DMACommutationCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA Stream */ - HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_COMMUTATION], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, ((BurstLength) >> 8) + 1); - } - break; - case TIM_DMA_TRIGGER: - { - /* Set the DMA Period elapsed callback */ - htim->hdma[TIM_DMA_ID_TRIGGER]->XferCpltCallback = TIM_DMATriggerCplt; - - /* Set the DMA error callback */ - htim->hdma[TIM_DMA_ID_TRIGGER]->XferErrorCallback = TIM_DMAError ; - - /* Enable the DMA Stream */ - HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_TRIGGER], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, ((BurstLength) >> 8) + 1); - } - break; - default: - break; - } - - /* configure the DMA Burst Mode */ - htim->Instance->DCR = BurstBaseAddress | BurstLength; - - /* Enable the TIM DMA Request */ - __HAL_TIM_ENABLE_DMA(htim, BurstRequestSrc); - - htim->State = HAL_TIM_STATE_READY; - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Stop the DMA burst reading - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @param BurstRequestSrc: TIM DMA Request sources to disable. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc) -{ - /* Check the parameters */ - assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); - - /* Abort the DMA transfer (at least disable the DMA channel) */ - switch(BurstRequestSrc) - { - case TIM_DMA_UPDATE: - { - HAL_DMA_Abort(htim->hdma[TIM_DMA_ID_UPDATE]); - } - break; - case TIM_DMA_CC1: - { - HAL_DMA_Abort(htim->hdma[TIM_DMA_ID_CC1]); - } - break; - case TIM_DMA_CC2: - { - HAL_DMA_Abort(htim->hdma[TIM_DMA_ID_CC2]); - } - break; - case TIM_DMA_CC3: - { - HAL_DMA_Abort(htim->hdma[TIM_DMA_ID_CC3]); - } - break; - case TIM_DMA_CC4: - { - HAL_DMA_Abort(htim->hdma[TIM_DMA_ID_CC4]); - } - break; - case TIM_DMA_COM: - { - HAL_DMA_Abort(htim->hdma[TIM_DMA_ID_COMMUTATION]); - } - break; - case TIM_DMA_TRIGGER: - { - HAL_DMA_Abort(htim->hdma[TIM_DMA_ID_TRIGGER]); - } - break; - default: - break; - } - - /* Disable the TIM Update DMA request */ - __HAL_TIM_DISABLE_DMA(htim, BurstRequestSrc); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Generate a software event - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @param EventSource: specifies the event source. - * This parameter can be one of the following values: - * @arg TIM_EVENTSOURCE_UPDATE: Timer update Event source - * @arg TIM_EVENTSOURCE_CC1: Timer Capture Compare 1 Event source - * @arg TIM_EVENTSOURCE_CC2: Timer Capture Compare 2 Event source - * @arg TIM_EVENTSOURCE_CC3: Timer Capture Compare 3 Event source - * @arg TIM_EVENTSOURCE_CC4: Timer Capture Compare 4 Event source - * @arg TIM_EVENTSOURCE_COM: Timer COM event source - * @arg TIM_EVENTSOURCE_TRIGGER: Timer Trigger Event source - * @arg TIM_EVENTSOURCE_BREAK: Timer Break event source - * @note TIM6 and TIM7 can only generate an update event. - * @note TIM_EVENTSOURCE_COM and TIM_EVENTSOURCE_BREAK are used only with TIM1 and TIM8. - * @retval HAL status - */ - -HAL_StatusTypeDef HAL_TIM_GenerateEvent(TIM_HandleTypeDef *htim, uint32_t EventSource) -{ - /* Check the parameters */ - assert_param(IS_TIM_INSTANCE(htim->Instance)); - assert_param(IS_TIM_EVENT_SOURCE(EventSource)); - - /* Process Locked */ - __HAL_LOCK(htim); - - /* Change the TIM state */ - htim->State = HAL_TIM_STATE_BUSY; - - /* Set the event sources */ - htim->Instance->EGR = EventSource; - - /* Change the TIM state */ - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Configures the OCRef clear feature - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @param sClearInputConfig: pointer to a TIM_ClearInputConfigTypeDef structure that - * contains the OCREF clear feature and parameters for the TIM peripheral. - * @param Channel: specifies the TIM Channel. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim, TIM_ClearInputConfigTypeDef * sClearInputConfig, uint32_t Channel) -{ - /* Check the parameters */ - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - assert_param(IS_TIM_CHANNELS(Channel)); - assert_param(IS_TIM_CLEARINPUT_SOURCE(sClearInputConfig->ClearInputSource)); - assert_param(IS_TIM_CLEARINPUT_POLARITY(sClearInputConfig->ClearInputPolarity)); - assert_param(IS_TIM_CLEARINPUT_PRESCALER(sClearInputConfig->ClearInputPrescaler)); - assert_param(IS_TIM_CLEARINPUT_FILTER(sClearInputConfig->ClearInputFilter)); - - /* Process Locked */ - __HAL_LOCK(htim); - - htim->State = HAL_TIM_STATE_BUSY; - - if(sClearInputConfig->ClearInputSource == TIM_CLEARINPUTSOURCE_ETR) - { - TIM_ETR_SetConfig(htim->Instance, - sClearInputConfig->ClearInputPrescaler, - sClearInputConfig->ClearInputPolarity, - sClearInputConfig->ClearInputFilter); - } - - switch (Channel) - { - case TIM_CHANNEL_1: - { - if(sClearInputConfig->ClearInputState != RESET) - { - /* Enable the Ocref clear feature for Channel 1 */ - htim->Instance->CCMR1 |= TIM_CCMR1_OC1CE; - } - else - { - /* Disable the Ocref clear feature for Channel 1 */ - htim->Instance->CCMR1 &= ~TIM_CCMR1_OC1CE; - } - } - break; - case TIM_CHANNEL_2: - { - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - if(sClearInputConfig->ClearInputState != RESET) - { - /* Enable the Ocref clear feature for Channel 2 */ - htim->Instance->CCMR1 |= TIM_CCMR1_OC2CE; - } - else - { - /* Disable the Ocref clear feature for Channel 2 */ - htim->Instance->CCMR1 &= ~TIM_CCMR1_OC2CE; - } - } - break; - case TIM_CHANNEL_3: - { - assert_param(IS_TIM_CC3_INSTANCE(htim->Instance)); - if(sClearInputConfig->ClearInputState != RESET) - { - /* Enable the Ocref clear feature for Channel 3 */ - htim->Instance->CCMR2 |= TIM_CCMR2_OC3CE; - } - else - { - /* Disable the Ocref clear feature for Channel 3 */ - htim->Instance->CCMR2 &= ~TIM_CCMR2_OC3CE; - } - } - break; - case TIM_CHANNEL_4: - { - assert_param(IS_TIM_CC4_INSTANCE(htim->Instance)); - if(sClearInputConfig->ClearInputState != RESET) - { - /* Enable the Ocref clear feature for Channel 4 */ - htim->Instance->CCMR2 |= TIM_CCMR2_OC4CE; - } - else - { - /* Disable the Ocref clear feature for Channel 4 */ - htim->Instance->CCMR2 &= ~TIM_CCMR2_OC4CE; - } - } - break; - default: - break; - } - - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Configures the clock source to be used - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @param sClockSourceConfig: pointer to a TIM_ClockConfigTypeDef structure that - * contains the clock source information for the TIM peripheral. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_ConfigClockSource(TIM_HandleTypeDef *htim, TIM_ClockConfigTypeDef * sClockSourceConfig) -{ - uint32_t tmpsmcr = 0; - - /* Process Locked */ - __HAL_LOCK(htim); - - htim->State = HAL_TIM_STATE_BUSY; - - /* Check the parameters */ - assert_param(IS_TIM_CLOCKSOURCE(sClockSourceConfig->ClockSource)); - assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); - assert_param(IS_TIM_CLOCKPRESCALER(sClockSourceConfig->ClockPrescaler)); - assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); - - /* Reset the SMS, TS, ECE, ETPS and ETRF bits */ - tmpsmcr = htim->Instance->SMCR; - tmpsmcr &= ~(TIM_SMCR_SMS | TIM_SMCR_TS); - tmpsmcr &= ~(TIM_SMCR_ETF | TIM_SMCR_ETPS | TIM_SMCR_ECE | TIM_SMCR_ETP); - htim->Instance->SMCR = tmpsmcr; - - switch (sClockSourceConfig->ClockSource) - { - case TIM_CLOCKSOURCE_INTERNAL: - { - assert_param(IS_TIM_INSTANCE(htim->Instance)); - /* Disable slave mode to clock the prescaler directly with the internal clock */ - htim->Instance->SMCR &= ~TIM_SMCR_SMS; - } - break; - - case TIM_CLOCKSOURCE_ETRMODE1: - { - assert_param(IS_TIM_ETR_INSTANCE(htim->Instance)); - /* Configure the ETR Clock source */ - TIM_ETR_SetConfig(htim->Instance, - sClockSourceConfig->ClockPrescaler, - sClockSourceConfig->ClockPolarity, - sClockSourceConfig->ClockFilter); - /* Get the TIMx SMCR register value */ - tmpsmcr = htim->Instance->SMCR; - /* Reset the SMS and TS Bits */ - tmpsmcr &= ~(TIM_SMCR_SMS | TIM_SMCR_TS); - /* Select the External clock mode1 and the ETRF trigger */ - tmpsmcr |= (TIM_SLAVEMODE_EXTERNAL1 | TIM_CLOCKSOURCE_ETRMODE1); - /* Write to TIMx SMCR */ - htim->Instance->SMCR = tmpsmcr; - } - break; - - case TIM_CLOCKSOURCE_ETRMODE2: - { - assert_param(IS_TIM_ETR_INSTANCE(htim->Instance)); - /* Configure the ETR Clock source */ - TIM_ETR_SetConfig(htim->Instance, - sClockSourceConfig->ClockPrescaler, - sClockSourceConfig->ClockPolarity, - sClockSourceConfig->ClockFilter); - /* Enable the External clock mode2 */ - htim->Instance->SMCR |= TIM_SMCR_ECE; - } - break; - - case TIM_CLOCKSOURCE_TI1: - { - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - TIM_TI1_ConfigInputStage(htim->Instance, - sClockSourceConfig->ClockPolarity, - sClockSourceConfig->ClockFilter); - TIM_ITRx_SetConfig(htim->Instance, TIM_CLOCKSOURCE_TI1); - } - break; - case TIM_CLOCKSOURCE_TI2: - { - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - TIM_TI2_ConfigInputStage(htim->Instance, - sClockSourceConfig->ClockPolarity, - sClockSourceConfig->ClockFilter); - TIM_ITRx_SetConfig(htim->Instance, TIM_CLOCKSOURCE_TI2); - } - break; - case TIM_CLOCKSOURCE_TI1ED: - { - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - TIM_TI1_ConfigInputStage(htim->Instance, - sClockSourceConfig->ClockPolarity, - sClockSourceConfig->ClockFilter); - TIM_ITRx_SetConfig(htim->Instance, TIM_CLOCKSOURCE_TI1ED); - } - break; - case TIM_CLOCKSOURCE_ITR0: - { - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - TIM_ITRx_SetConfig(htim->Instance, TIM_CLOCKSOURCE_ITR0); - } - break; - case TIM_CLOCKSOURCE_ITR1: - { - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - TIM_ITRx_SetConfig(htim->Instance, TIM_CLOCKSOURCE_ITR1); - } - break; - case TIM_CLOCKSOURCE_ITR2: - { - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - TIM_ITRx_SetConfig(htim->Instance, TIM_CLOCKSOURCE_ITR2); - } - break; - case TIM_CLOCKSOURCE_ITR3: - { - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - TIM_ITRx_SetConfig(htim->Instance, TIM_CLOCKSOURCE_ITR3); - } - break; - - default: - break; - } - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Selects the signal connected to the TI1 input: direct from CH1_input - * or a XOR combination between CH1_input, CH2_input & CH3_input - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @param TI1_Selection: Indicate whether or not channel 1 is connected to the - * output of a XOR gate. - * This parameter can be one of the following values: - * @arg TIM_TI1SELECTION_CH1: The TIMx_CH1 pin is connected to TI1 input - * @arg TIM_TI1SELECTION_XORCOMBINATION: The TIMx_CH1, CH2 and CH3 - * pins are connected to the TI1 input (XOR combination) - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_ConfigTI1Input(TIM_HandleTypeDef *htim, uint32_t TI1_Selection) -{ - uint32_t tmpcr2 = 0; - - /* Check the parameters */ - assert_param(IS_TIM_XOR_INSTANCE(htim->Instance)); - assert_param(IS_TIM_TI1SELECTION(TI1_Selection)); - - /* Get the TIMx CR2 register value */ - tmpcr2 = htim->Instance->CR2; - - /* Reset the TI1 selection */ - tmpcr2 &= ~TIM_CR2_TI1S; - - /* Set the TI1 selection */ - tmpcr2 |= TI1_Selection; - - /* Write to TIMxCR2 */ - htim->Instance->CR2 = tmpcr2; - - return HAL_OK; -} - -/** - * @brief Configures the TIM in Slave mode - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @param sSlaveConfig: pointer to a TIM_SlaveConfigTypeDef structure that - * contains the selected trigger (internal trigger input, filtered - * timer input or external trigger input) and the ) and the Slave - * mode (Disable, Reset, Gated, Trigger, External clock mode 1). - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchronization(TIM_HandleTypeDef *htim, TIM_SlaveConfigTypeDef * sSlaveConfig) -{ - /* Check the parameters */ - assert_param(IS_TIM_SLAVE_INSTANCE(htim->Instance)); - assert_param(IS_TIM_SLAVE_MODE(sSlaveConfig->SlaveMode)); - assert_param(IS_TIM_TRIGGER_SELECTION(sSlaveConfig->InputTrigger)); - - __HAL_LOCK(htim); - - htim->State = HAL_TIM_STATE_BUSY; - - TIM_SlaveTimer_SetConfig(htim, sSlaveConfig); - - /* Disable Trigger Interrupt */ - __HAL_TIM_DISABLE_IT(htim, TIM_IT_TRIGGER); - - /* Disable Trigger DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_TRIGGER); - - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Configures the TIM in Slave mode in interrupt mode - * @param htim: TIM handle. - * @param sSlaveConfig: pointer to a TIM_SlaveConfigTypeDef structure that - * contains the selected trigger (internal trigger input, filtered - * timer input or external trigger input) and the ) and the Slave - * mode (Disable, Reset, Gated, Trigger, External clock mode 1). - * @retval HAL status - */ -HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchronization_IT(TIM_HandleTypeDef *htim, - TIM_SlaveConfigTypeDef * sSlaveConfig) -{ - /* Check the parameters */ - assert_param(IS_TIM_SLAVE_INSTANCE(htim->Instance)); - assert_param(IS_TIM_SLAVE_MODE(sSlaveConfig->SlaveMode)); - assert_param(IS_TIM_TRIGGER_SELECTION(sSlaveConfig->InputTrigger)); - - __HAL_LOCK(htim); - - htim->State = HAL_TIM_STATE_BUSY; - - TIM_SlaveTimer_SetConfig(htim, sSlaveConfig); - - /* Enable Trigger Interrupt */ - __HAL_TIM_ENABLE_IT(htim, TIM_IT_TRIGGER); - - /* Disable Trigger DMA request */ - __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_TRIGGER); - - htim->State = HAL_TIM_STATE_READY; - - __HAL_UNLOCK(htim); - - return HAL_OK; -} - -/** - * @brief Read the captured value from Capture Compare unit - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @param Channel: TIM Channels to be enabled. - * This parameter can be one of the following values: - * @arg TIM_CHANNEL_1: TIM Channel 1 selected - * @arg TIM_CHANNEL_2: TIM Channel 2 selected - * @arg TIM_CHANNEL_3: TIM Channel 3 selected - * @arg TIM_CHANNEL_4: TIM Channel 4 selected - * @retval Captured value - */ -uint32_t HAL_TIM_ReadCapturedValue(TIM_HandleTypeDef *htim, uint32_t Channel) -{ - uint32_t tmpreg = 0; - - __HAL_LOCK(htim); - - switch (Channel) - { - case TIM_CHANNEL_1: - { - /* Check the parameters */ - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - - /* Return the capture 1 value */ - tmpreg = htim->Instance->CCR1; - - break; - } - case TIM_CHANNEL_2: - { - /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - - /* Return the capture 2 value */ - tmpreg = htim->Instance->CCR2; - - break; - } - - case TIM_CHANNEL_3: - { - /* Check the parameters */ - assert_param(IS_TIM_CC3_INSTANCE(htim->Instance)); - - /* Return the capture 3 value */ - tmpreg = htim->Instance->CCR3; - - break; - } - - case TIM_CHANNEL_4: - { - /* Check the parameters */ - assert_param(IS_TIM_CC4_INSTANCE(htim->Instance)); - - /* Return the capture 4 value */ - tmpreg = htim->Instance->CCR4; - - break; - } - - default: - break; - } - - __HAL_UNLOCK(htim); - return tmpreg; -} -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group9 TIM Callbacks functions - * @brief TIM Callbacks functions - * -@verbatim - ============================================================================== - ##### TIM Callbacks functions ##### - ============================================================================== - [..] - This section provides TIM callback functions: - (+) Timer Period elapsed callback - (+) Timer Output Compare callback - (+) Timer Input capture callback - (+) Timer Trigger callback - (+) Timer Error callback - -@endverbatim - * @{ - */ - -/** - * @brief Period elapsed callback in non blocking mode - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @retval None - */ -__weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the __HAL_TIM_PeriodElapsedCallback could be implemented in the user file - */ - -} -/** - * @brief Output Compare callback in non blocking mode - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @retval None - */ -__weak void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the __HAL_TIM_OC_DelayElapsedCallback could be implemented in the user file - */ -} -/** - * @brief Input Capture callback in non blocking mode - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @retval None - */ -__weak void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the __HAL_TIM_IC_CaptureCallback could be implemented in the user file - */ -} - -/** - * @brief PWM Pulse finished callback in non blocking mode - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @retval None - */ -__weak void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the __HAL_TIM_PWM_PulseFinishedCallback could be implemented in the user file - */ -} - -/** - * @brief Hall Trigger detection callback in non blocking mode - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @retval None - */ -__weak void HAL_TIM_TriggerCallback(TIM_HandleTypeDef *htim) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_TIM_TriggerCallback could be implemented in the user file - */ -} - -/** - * @brief Timer error callback in non blocking mode - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @retval None - */ -__weak void HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_TIM_ErrorCallback could be implemented in the user file - */ -} -/** - * @} - */ - -/** @defgroup TIM_Exported_Functions_Group10 Peripheral State functions - * @brief Peripheral State functions - * -@verbatim - ============================================================================== - ##### Peripheral State functions ##### - ============================================================================== - [..] - This subsection permits to get in run-time the status of the peripheral - and the data flow. - -@endverbatim - * @{ - */ - -/** - * @brief Return the TIM Base state - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @retval HAL state - */ -HAL_TIM_StateTypeDef HAL_TIM_Base_GetState(TIM_HandleTypeDef *htim) -{ - return htim->State; -} - -/** - * @brief Return the TIM OC state - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @retval HAL state - */ -HAL_TIM_StateTypeDef HAL_TIM_OC_GetState(TIM_HandleTypeDef *htim) -{ - return htim->State; -} - -/** - * @brief Return the TIM PWM state - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @retval HAL state - */ -HAL_TIM_StateTypeDef HAL_TIM_PWM_GetState(TIM_HandleTypeDef *htim) -{ - return htim->State; -} - -/** - * @brief Return the TIM Input Capture state - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @retval HAL state - */ -HAL_TIM_StateTypeDef HAL_TIM_IC_GetState(TIM_HandleTypeDef *htim) -{ - return htim->State; -} - -/** - * @brief Return the TIM One Pulse Mode state - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @retval HAL state - */ -HAL_TIM_StateTypeDef HAL_TIM_OnePulse_GetState(TIM_HandleTypeDef *htim) -{ - return htim->State; -} - -/** - * @brief Return the TIM Encoder Mode state - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @retval HAL state - */ -HAL_TIM_StateTypeDef HAL_TIM_Encoder_GetState(TIM_HandleTypeDef *htim) -{ - return htim->State; -} -/** - * @} - */ - -/** - * @brief Time Base configuration - * @param TIMx: TIM peripheral - * @param Structure: pointer on TIM Time Base required parameters - * @retval None - */ -void TIM_Base_SetConfig(TIM_TypeDef *TIMx, TIM_Base_InitTypeDef *Structure) -{ - uint32_t tmpcr1 = 0; - tmpcr1 = TIMx->CR1; - - /* Set TIM Time Base Unit parameters ---------------------------------------*/ - if(IS_TIM_CC3_INSTANCE(TIMx) != RESET) - { - /* Select the Counter Mode */ - tmpcr1 &= ~(TIM_CR1_DIR | TIM_CR1_CMS); - tmpcr1 |= Structure->CounterMode; - } - - if(IS_TIM_CC1_INSTANCE(TIMx) != RESET) - { - /* Set the clock division */ - tmpcr1 &= ~TIM_CR1_CKD; - tmpcr1 |= (uint32_t)Structure->ClockDivision; - } - - TIMx->CR1 = tmpcr1; - - /* Set the Auto-reload value */ - TIMx->ARR = (uint32_t)Structure->Period ; - - /* Set the Prescaler value */ - TIMx->PSC = (uint32_t)Structure->Prescaler; - - if(IS_TIM_ADVANCED_INSTANCE(TIMx) != RESET) - { - /* Set the Repetition Counter value */ - TIMx->RCR = Structure->RepetitionCounter; - } - - /* Generate an update event to reload the Prescaler - and the repetition counter(only for TIM1 and TIM8) value immediately */ - TIMx->EGR = TIM_EGR_UG; -} - -/** - * @brief Configure the TI1 as Input. - * @param TIMx to select the TIM peripheral. - * @param TIM_ICPolarity : The Input Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPolarity_Rising - * @arg TIM_ICPolarity_Falling - * @arg TIM_ICPolarity_BothEdge - * @param TIM_ICSelection: specifies the input to be used. - * This parameter can be one of the following values: - * @arg TIM_ICSelection_DirectTI: TIM Input 1 is selected to be connected to IC1. - * @arg TIM_ICSelection_IndirectTI: TIM Input 1 is selected to be connected to IC2. - * @arg TIM_ICSelection_TRC: TIM Input 1 is selected to be connected to TRC. - * @param TIM_ICFilter: Specifies the Input Capture Filter. - * This parameter must be a value between 0x00 and 0x0F. - * @retval None - */ -void TIM_TI1_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, - uint32_t TIM_ICFilter) -{ - uint32_t tmpccmr1 = 0; - uint32_t tmpccer = 0; - - /* Disable the Channel 1: Reset the CC1E Bit */ - TIMx->CCER &= ~TIM_CCER_CC1E; - tmpccmr1 = TIMx->CCMR1; - tmpccer = TIMx->CCER; - - /* Select the Input */ - if(IS_TIM_CC2_INSTANCE(TIMx) != RESET) - { - tmpccmr1 &= ~TIM_CCMR1_CC1S; - tmpccmr1 |= TIM_ICSelection; - } - else - { - tmpccmr1 &= ~TIM_CCMR1_CC1S; - tmpccmr1 |= TIM_CCMR1_CC1S_0; - } - - /* Set the filter */ - tmpccmr1 &= ~TIM_CCMR1_IC1F; - tmpccmr1 |= ((TIM_ICFilter << 4) & TIM_CCMR1_IC1F); - - /* Select the Polarity and set the CC1E Bit */ - tmpccer &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP); - tmpccer |= (TIM_ICPolarity & (TIM_CCER_CC1P | TIM_CCER_CC1NP)); - - /* Write to TIMx CCMR1 and CCER registers */ - TIMx->CCMR1 = tmpccmr1; - TIMx->CCER = tmpccer; -} - -/** - * @brief Time Output Compare 2 configuration - * @param TIMx to select the TIM peripheral - * @param OC_Config: The output configuration structure - * @retval None - */ -void TIM_OC2_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config) -{ - uint32_t tmpccmrx = 0; - uint32_t tmpccer = 0; - uint32_t tmpcr2 = 0; - - /* Disable the Channel 2: Reset the CC2E Bit */ - TIMx->CCER &= ~TIM_CCER_CC2E; - - /* Get the TIMx CCER register value */ - tmpccer = TIMx->CCER; - /* Get the TIMx CR2 register value */ - tmpcr2 = TIMx->CR2; - - /* Get the TIMx CCMR1 register value */ - tmpccmrx = TIMx->CCMR1; - - /* Reset the Output Compare mode and Capture/Compare selection Bits */ - tmpccmrx &= ~TIM_CCMR1_OC2M; - tmpccmrx &= ~TIM_CCMR1_CC2S; - - /* Select the Output Compare Mode */ - tmpccmrx |= (OC_Config->OCMode << 8); - - /* Reset the Output Polarity level */ - tmpccer &= ~TIM_CCER_CC2P; - /* Set the Output Compare Polarity */ - tmpccer |= (OC_Config->OCPolarity << 4); - - if(IS_TIM_ADVANCED_INSTANCE(TIMx) != RESET) - { - assert_param(IS_TIM_OCN_POLARITY(OC_Config->OCNPolarity)); - - /* Reset the Output N Polarity level */ - tmpccer &= ~TIM_CCER_CC2NP; - /* Set the Output N Polarity */ - tmpccer |= (OC_Config->OCNPolarity << 4); - /* Reset the Output N State */ - tmpccer &= ~TIM_CCER_CC2NE; - - /* Reset the Output Compare and Output Compare N IDLE State */ - tmpcr2 &= ~TIM_CR2_OIS2; - tmpcr2 &= ~TIM_CR2_OIS2N; - /* Set the Output Idle state */ - tmpcr2 |= (OC_Config->OCIdleState << 2); - /* Set the Output N Idle state */ - tmpcr2 |= (OC_Config->OCNIdleState << 2); - } - /* Write to TIMx CR2 */ - TIMx->CR2 = tmpcr2; - - /* Write to TIMx CCMR1 */ - TIMx->CCMR1 = tmpccmrx; - - /* Set the Capture Compare Register value */ - TIMx->CCR2 = OC_Config->Pulse; - - /* Write to TIMx CCER */ - TIMx->CCER = tmpccer; -} - -/** - * @brief TIM DMA Delay Pulse complete callback. - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -void TIM_DMADelayPulseCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef* htim = ( TIM_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; - - htim->State= HAL_TIM_STATE_READY; - - if(hdma == htim->hdma[TIM_DMA_ID_CC1]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; - } - else if(hdma == htim->hdma[TIM_DMA_ID_CC2]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; - } - else if(hdma == htim->hdma[TIM_DMA_ID_CC3]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; - } - else if(hdma == htim->hdma[TIM_DMA_ID_CC4]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; - } - - HAL_TIM_PWM_PulseFinishedCallback(htim); - - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; -} - -/** - * @brief TIM DMA error callback - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -void TIM_DMAError(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef* htim = ( TIM_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; - - htim->State= HAL_TIM_STATE_READY; - - HAL_TIM_ErrorCallback(htim); -} - -/** - * @brief TIM DMA Capture complete callback. - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -void TIM_DMACaptureCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef* htim = ( TIM_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; - - htim->State= HAL_TIM_STATE_READY; - - if(hdma == htim->hdma[TIM_DMA_ID_CC1]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; - } - else if(hdma == htim->hdma[TIM_DMA_ID_CC2]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; - } - else if(hdma == htim->hdma[TIM_DMA_ID_CC3]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; - } - else if(hdma == htim->hdma[TIM_DMA_ID_CC4]) - { - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; - } - - HAL_TIM_IC_CaptureCallback(htim); - - htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; -} - -/** - * @brief Enables or disables the TIM Capture Compare Channel x. - * @param TIMx to select the TIM peripheral - * @param Channel: specifies the TIM Channel - * This parameter can be one of the following values: - * @arg TIM_Channel_1: TIM Channel 1 - * @arg TIM_Channel_2: TIM Channel 2 - * @arg TIM_Channel_3: TIM Channel 3 - * @arg TIM_Channel_4: TIM Channel 4 - * @param ChannelState: specifies the TIM Channel CCxE bit new state. - * This parameter can be: TIM_CCx_ENABLE or TIM_CCx_Disable. - * @retval None - */ -void TIM_CCxChannelCmd(TIM_TypeDef* TIMx, uint32_t Channel, uint32_t ChannelState) -{ - uint32_t tmp = 0; - - /* Check the parameters */ - assert_param(IS_TIM_CC1_INSTANCE(TIMx)); - assert_param(IS_TIM_CHANNELS(Channel)); - - tmp = TIM_CCER_CC1E << Channel; - - /* Reset the CCxE Bit */ - TIMx->CCER &= ~tmp; - - /* Set or reset the CCxE Bit */ - TIMx->CCER |= (uint32_t)(ChannelState << Channel); -} - -/** - * @brief TIM DMA Period Elapse complete callback. - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void TIM_DMAPeriodElapsedCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef* htim = ( TIM_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; - - htim->State= HAL_TIM_STATE_READY; - - HAL_TIM_PeriodElapsedCallback(htim); -} - -/** - * @brief TIM DMA Trigger callback. - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void TIM_DMATriggerCplt(DMA_HandleTypeDef *hdma) -{ - TIM_HandleTypeDef* htim = ( TIM_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; - - htim->State= HAL_TIM_STATE_READY; - - HAL_TIM_TriggerCallback(htim); -} - -/** - * @brief Time Output Compare 1 configuration - * @param TIMx to select the TIM peripheral - * @param OC_Config: The output configuration structure - * @retval None - */ -static void TIM_OC1_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config) -{ - uint32_t tmpccmrx = 0; - uint32_t tmpccer = 0; - uint32_t tmpcr2 = 0; - - /* Disable the Channel 1: Reset the CC1E Bit */ - TIMx->CCER &= ~TIM_CCER_CC1E; - - /* Get the TIMx CCER register value */ - tmpccer = TIMx->CCER; - /* Get the TIMx CR2 register value */ - tmpcr2 = TIMx->CR2; - - /* Get the TIMx CCMR1 register value */ - tmpccmrx = TIMx->CCMR1; - - /* Reset the Output Compare Mode Bits */ - tmpccmrx &= ~TIM_CCMR1_OC1M; - tmpccmrx &= ~TIM_CCMR1_CC1S; - /* Select the Output Compare Mode */ - tmpccmrx |= OC_Config->OCMode; - - /* Reset the Output Polarity level */ - tmpccer &= ~TIM_CCER_CC1P; - /* Set the Output Compare Polarity */ - tmpccer |= OC_Config->OCPolarity; - - - if(IS_TIM_ADVANCED_INSTANCE(TIMx) != RESET) - { - /* Reset the Output N Polarity level */ - tmpccer &= ~TIM_CCER_CC1NP; - /* Set the Output N Polarity */ - tmpccer |= OC_Config->OCNPolarity; - /* Reset the Output N State */ - tmpccer &= ~TIM_CCER_CC1NE; - - /* Reset the Output Compare and Output Compare N IDLE State */ - tmpcr2 &= ~TIM_CR2_OIS1; - tmpcr2 &= ~TIM_CR2_OIS1N; - /* Set the Output Idle state */ - tmpcr2 |= OC_Config->OCIdleState; - /* Set the Output N Idle state */ - tmpcr2 |= OC_Config->OCNIdleState; - } - /* Write to TIMx CR2 */ - TIMx->CR2 = tmpcr2; - - /* Write to TIMx CCMR1 */ - TIMx->CCMR1 = tmpccmrx; - - /* Set the Capture Compare Register value */ - TIMx->CCR1 = OC_Config->Pulse; - - /* Write to TIMx CCER */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Time Output Compare 3 configuration - * @param TIMx to select the TIM peripheral - * @param OC_Config: The output configuration structure - * @retval None - */ -static void TIM_OC3_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config) -{ - uint32_t tmpccmrx = 0; - uint32_t tmpccer = 0; - uint32_t tmpcr2 = 0; - - /* Disable the Channel 3: Reset the CC2E Bit */ - TIMx->CCER &= ~TIM_CCER_CC3E; - - /* Get the TIMx CCER register value */ - tmpccer = TIMx->CCER; - /* Get the TIMx CR2 register value */ - tmpcr2 = TIMx->CR2; - - /* Get the TIMx CCMR2 register value */ - tmpccmrx = TIMx->CCMR2; - - /* Reset the Output Compare mode and Capture/Compare selection Bits */ - tmpccmrx &= ~TIM_CCMR2_OC3M; - tmpccmrx &= ~TIM_CCMR2_CC3S; - /* Select the Output Compare Mode */ - tmpccmrx |= OC_Config->OCMode; - - /* Reset the Output Polarity level */ - tmpccer &= ~TIM_CCER_CC3P; - /* Set the Output Compare Polarity */ - tmpccer |= (OC_Config->OCPolarity << 8); - - if(IS_TIM_ADVANCED_INSTANCE(TIMx) != RESET) - { - assert_param(IS_TIM_OCN_POLARITY(OC_Config->OCNPolarity)); - assert_param(IS_TIM_OCNIDLE_STATE(OC_Config->OCNIdleState)); - assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState)); - - /* Reset the Output N Polarity level */ - tmpccer &= ~TIM_CCER_CC3NP; - /* Set the Output N Polarity */ - tmpccer |= (OC_Config->OCNPolarity << 8); - /* Reset the Output N State */ - tmpccer &= ~TIM_CCER_CC3NE; - - /* Reset the Output Compare and Output Compare N IDLE State */ - tmpcr2 &= ~TIM_CR2_OIS3; - tmpcr2 &= ~TIM_CR2_OIS3N; - /* Set the Output Idle state */ - tmpcr2 |= (OC_Config->OCIdleState << 4); - /* Set the Output N Idle state */ - tmpcr2 |= (OC_Config->OCNIdleState << 4); - } - /* Write to TIMx CR2 */ - TIMx->CR2 = tmpcr2; - - /* Write to TIMx CCMR2 */ - TIMx->CCMR2 = tmpccmrx; - - /* Set the Capture Compare Register value */ - TIMx->CCR3 = OC_Config->Pulse; - - /* Write to TIMx CCER */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Time Output Compare 4 configuration - * @param TIMx to select the TIM peripheral - * @param OC_Config: The output configuration structure - * @retval None - */ -static void TIM_OC4_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config) -{ - uint32_t tmpccmrx = 0; - uint32_t tmpccer = 0; - uint32_t tmpcr2 = 0; - - /* Disable the Channel 4: Reset the CC4E Bit */ - TIMx->CCER &= ~TIM_CCER_CC4E; - - /* Get the TIMx CCER register value */ - tmpccer = TIMx->CCER; - /* Get the TIMx CR2 register value */ - tmpcr2 = TIMx->CR2; - - /* Get the TIMx CCMR2 register value */ - tmpccmrx = TIMx->CCMR2; - - /* Reset the Output Compare mode and Capture/Compare selection Bits */ - tmpccmrx &= ~TIM_CCMR2_OC4M; - tmpccmrx &= ~TIM_CCMR2_CC4S; - - /* Select the Output Compare Mode */ - tmpccmrx |= (OC_Config->OCMode << 8); - - /* Reset the Output Polarity level */ - tmpccer &= ~TIM_CCER_CC4P; - /* Set the Output Compare Polarity */ - tmpccer |= (OC_Config->OCPolarity << 12); - - /*if((TIMx == TIM1) || (TIMx == TIM8))*/ - if(IS_TIM_ADVANCED_INSTANCE(TIMx) != RESET) - { - assert_param(IS_TIM_OCIDLE_STATE(OC_Config->OCIdleState)); - /* Reset the Output Compare IDLE State */ - tmpcr2 &= ~TIM_CR2_OIS4; - /* Set the Output Idle state */ - tmpcr2 |= (OC_Config->OCIdleState << 6); - } - /* Write to TIMx CR2 */ - TIMx->CR2 = tmpcr2; - - /* Write to TIMx CCMR2 */ - TIMx->CCMR2 = tmpccmrx; - - /* Set the Capture Compare Register value */ - TIMx->CCR4 = OC_Config->Pulse; - - /* Write to TIMx CCER */ - TIMx->CCER = tmpccer; -} - -/** - * @brief Time Output Compare 4 configuration - * @param htim: pointer to a TIM_HandleTypeDef structure that contains - * the configuration information for TIM module. - * @param sSlaveConfig: The slave configuration structure - * @retval None - */ -static void TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim, - TIM_SlaveConfigTypeDef * sSlaveConfig) -{ - uint32_t tmpsmcr = 0; - uint32_t tmpccmr1 = 0; - uint32_t tmpccer = 0; - - /* Get the TIMx SMCR register value */ - tmpsmcr = htim->Instance->SMCR; - - /* Reset the Trigger Selection Bits */ - tmpsmcr &= ~TIM_SMCR_TS; - /* Set the Input Trigger source */ - tmpsmcr |= sSlaveConfig->InputTrigger; - - /* Reset the slave mode Bits */ - tmpsmcr &= ~TIM_SMCR_SMS; - /* Set the slave mode */ - tmpsmcr |= sSlaveConfig->SlaveMode; - - /* Write to TIMx SMCR */ - htim->Instance->SMCR = tmpsmcr; - - /* Configure the trigger prescaler, filter, and polarity */ - switch (sSlaveConfig->InputTrigger) - { - case TIM_TS_ETRF: - { - /* Check the parameters */ - assert_param(IS_TIM_ETR_INSTANCE(htim->Instance)); - assert_param(IS_TIM_TRIGGERPRESCALER(sSlaveConfig->TriggerPrescaler)); - assert_param(IS_TIM_TRIGGERPOLARITY(sSlaveConfig->TriggerPolarity)); - assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter)); - /* Configure the ETR Trigger source */ - TIM_ETR_SetConfig(htim->Instance, - sSlaveConfig->TriggerPrescaler, - sSlaveConfig->TriggerPolarity, - sSlaveConfig->TriggerFilter); - } - break; - - case TIM_TS_TI1F_ED: - { - /* Check the parameters */ - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter)); - - /* Disable the Channel 1: Reset the CC1E Bit */ - tmpccer = htim->Instance->CCER; - htim->Instance->CCER &= ~TIM_CCER_CC1E; - tmpccmr1 = htim->Instance->CCMR1; - - /* Set the filter */ - tmpccmr1 &= ~TIM_CCMR1_IC1F; - tmpccmr1 |= ((sSlaveConfig->TriggerFilter) << 4); - - /* Write to TIMx CCMR1 and CCER registers */ - htim->Instance->CCMR1 = tmpccmr1; - htim->Instance->CCER = tmpccer; - - } - break; - - case TIM_TS_TI1FP1: - { - /* Check the parameters */ - assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); - assert_param(IS_TIM_TRIGGERPOLARITY(sSlaveConfig->TriggerPolarity)); - assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter)); - - /* Configure TI1 Filter and Polarity */ - TIM_TI1_ConfigInputStage(htim->Instance, - sSlaveConfig->TriggerPolarity, - sSlaveConfig->TriggerFilter); - } - break; - - case TIM_TS_TI2FP2: - { - /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - assert_param(IS_TIM_TRIGGERPOLARITY(sSlaveConfig->TriggerPolarity)); - assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter)); - - /* Configure TI2 Filter and Polarity */ - TIM_TI2_ConfigInputStage(htim->Instance, - sSlaveConfig->TriggerPolarity, - sSlaveConfig->TriggerFilter); - } - break; - - case TIM_TS_ITR0: - { - /* Check the parameter */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - } - break; - - case TIM_TS_ITR1: - { - /* Check the parameter */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - } - break; - - case TIM_TS_ITR2: - { - /* Check the parameter */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - } - break; - - case TIM_TS_ITR3: - { - /* Check the parameter */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); - } - break; - - default: - break; - } -} - - -/** - * @brief Configure the Polarity and Filter for TI1. - * @param TIMx to select the TIM peripheral. - * @param TIM_ICPolarity : The Input Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPolarity_Rising - * @arg TIM_ICPolarity_Falling - * @arg TIM_ICPolarity_BothEdge - * @param TIM_ICFilter: Specifies the Input Capture Filter. - * This parameter must be a value between 0x00 and 0x0F. - * @retval None - */ -static void TIM_TI1_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter) -{ - uint32_t tmpccmr1 = 0; - uint32_t tmpccer = 0; - - /* Disable the Channel 1: Reset the CC1E Bit */ - tmpccer = TIMx->CCER; - TIMx->CCER &= ~TIM_CCER_CC1E; - tmpccmr1 = TIMx->CCMR1; - - /* Set the filter */ - tmpccmr1 &= ~TIM_CCMR1_IC1F; - tmpccmr1 |= (TIM_ICFilter << 4); - - /* Select the Polarity and set the CC1E Bit */ - tmpccer &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP); - tmpccer |= TIM_ICPolarity; - - /* Write to TIMx CCMR1 and CCER registers */ - TIMx->CCMR1 = tmpccmr1; - TIMx->CCER = tmpccer; -} - -/** - * @brief Configure the TI2 as Input. - * @param TIMx to select the TIM peripheral - * @param TIM_ICPolarity : The Input Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPolarity_Rising - * @arg TIM_ICPolarity_Falling - * @arg TIM_ICPolarity_BothEdge - * @param TIM_ICSelection: specifies the input to be used. - * This parameter can be one of the following values: - * @arg TIM_ICSelection_DirectTI: TIM Input 2 is selected to be connected to IC2. - * @arg TIM_ICSelection_IndirectTI: TIM Input 2 is selected to be connected to IC1. - * @arg TIM_ICSelection_TRC: TIM Input 2 is selected to be connected to TRC. - * @param TIM_ICFilter: Specifies the Input Capture Filter. - * This parameter must be a value between 0x00 and 0x0F. - * @retval None - */ -static void TIM_TI2_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, - uint32_t TIM_ICFilter) -{ - uint32_t tmpccmr1 = 0; - uint32_t tmpccer = 0; - - /* Disable the Channel 2: Reset the CC2E Bit */ - TIMx->CCER &= ~TIM_CCER_CC2E; - tmpccmr1 = TIMx->CCMR1; - tmpccer = TIMx->CCER; - - /* Select the Input */ - tmpccmr1 &= ~TIM_CCMR1_CC2S; - tmpccmr1 |= (TIM_ICSelection << 8); - - /* Set the filter */ - tmpccmr1 &= ~TIM_CCMR1_IC2F; - tmpccmr1 |= ((TIM_ICFilter << 12) & TIM_CCMR1_IC2F); - - /* Select the Polarity and set the CC2E Bit */ - tmpccer &= ~(TIM_CCER_CC2P | TIM_CCER_CC2NP); - tmpccer |= ((TIM_ICPolarity << 4) & (TIM_CCER_CC2P | TIM_CCER_CC2NP)); - - /* Write to TIMx CCMR1 and CCER registers */ - TIMx->CCMR1 = tmpccmr1 ; - TIMx->CCER = tmpccer; -} - -/** - * @brief Configure the Polarity and Filter for TI2. - * @param TIMx to select the TIM peripheral. - * @param TIM_ICPolarity : The Input Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPolarity_Rising - * @arg TIM_ICPolarity_Falling - * @arg TIM_ICPolarity_BothEdge - * @param TIM_ICFilter: Specifies the Input Capture Filter. - * This parameter must be a value between 0x00 and 0x0F. - * @retval None - */ -static void TIM_TI2_ConfigInputStage(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICFilter) -{ - uint32_t tmpccmr1 = 0; - uint32_t tmpccer = 0; - - /* Disable the Channel 2: Reset the CC2E Bit */ - TIMx->CCER &= ~TIM_CCER_CC2E; - tmpccmr1 = TIMx->CCMR1; - tmpccer = TIMx->CCER; - - /* Set the filter */ - tmpccmr1 &= ~TIM_CCMR1_IC2F; - tmpccmr1 |= (TIM_ICFilter << 12); - - /* Select the Polarity and set the CC2E Bit */ - tmpccer &= ~(TIM_CCER_CC2P | TIM_CCER_CC2NP); - tmpccer |= (TIM_ICPolarity << 4); - - /* Write to TIMx CCMR1 and CCER registers */ - TIMx->CCMR1 = tmpccmr1 ; - TIMx->CCER = tmpccer; -} - -/** - * @brief Configure the TI3 as Input. - * @param TIMx to select the TIM peripheral - * @param TIM_ICPolarity : The Input Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPolarity_Rising - * @arg TIM_ICPolarity_Falling - * @arg TIM_ICPolarity_BothEdge - * @param TIM_ICSelection: specifies the input to be used. - * This parameter can be one of the following values: - * @arg TIM_ICSelection_DirectTI: TIM Input 3 is selected to be connected to IC3. - * @arg TIM_ICSelection_IndirectTI: TIM Input 3 is selected to be connected to IC4. - * @arg TIM_ICSelection_TRC: TIM Input 3 is selected to be connected to TRC. - * @param TIM_ICFilter: Specifies the Input Capture Filter. - * This parameter must be a value between 0x00 and 0x0F. - * @retval None - */ -static void TIM_TI3_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, - uint32_t TIM_ICFilter) -{ - uint32_t tmpccmr2 = 0; - uint32_t tmpccer = 0; - - /* Disable the Channel 3: Reset the CC3E Bit */ - TIMx->CCER &= ~TIM_CCER_CC3E; - tmpccmr2 = TIMx->CCMR2; - tmpccer = TIMx->CCER; - - /* Select the Input */ - tmpccmr2 &= ~TIM_CCMR2_CC3S; - tmpccmr2 |= TIM_ICSelection; - - /* Set the filter */ - tmpccmr2 &= ~TIM_CCMR2_IC3F; - tmpccmr2 |= ((TIM_ICFilter << 4) & TIM_CCMR2_IC3F); - - /* Select the Polarity and set the CC3E Bit */ - tmpccer &= ~(TIM_CCER_CC3P | TIM_CCER_CC3NP); - tmpccer |= ((TIM_ICPolarity << 8) & (TIM_CCER_CC3P | TIM_CCER_CC3NP)); - - /* Write to TIMx CCMR2 and CCER registers */ - TIMx->CCMR2 = tmpccmr2; - TIMx->CCER = tmpccer; -} - -/** - * @brief Configure the TI4 as Input. - * @param TIMx to select the TIM peripheral - * @param TIM_ICPolarity : The Input Polarity. - * This parameter can be one of the following values: - * @arg TIM_ICPolarity_Rising - * @arg TIM_ICPolarity_Falling - * @arg TIM_ICPolarity_BothEdge - * @param TIM_ICSelection: specifies the input to be used. - * This parameter can be one of the following values: - * @arg TIM_ICSelection_DirectTI: TIM Input 4 is selected to be connected to IC4. - * @arg TIM_ICSelection_IndirectTI: TIM Input 4 is selected to be connected to IC3. - * @arg TIM_ICSelection_TRC: TIM Input 4 is selected to be connected to TRC. - * @param TIM_ICFilter: Specifies the Input Capture Filter. - * This parameter must be a value between 0x00 and 0x0F. - * @retval None - */ -static void TIM_TI4_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, - uint32_t TIM_ICFilter) -{ - uint32_t tmpccmr2 = 0; - uint32_t tmpccer = 0; - - /* Disable the Channel 4: Reset the CC4E Bit */ - TIMx->CCER &= ~TIM_CCER_CC4E; - tmpccmr2 = TIMx->CCMR2; - tmpccer = TIMx->CCER; - - /* Select the Input */ - tmpccmr2 &= ~TIM_CCMR2_CC4S; - tmpccmr2 |= (TIM_ICSelection << 8); - - /* Set the filter */ - tmpccmr2 &= ~TIM_CCMR2_IC4F; - tmpccmr2 |= ((TIM_ICFilter << 12) & TIM_CCMR2_IC4F); - - /* Select the Polarity and set the CC4E Bit */ - tmpccer &= ~(TIM_CCER_CC4P | TIM_CCER_CC4NP); - tmpccer |= ((TIM_ICPolarity << 12) & (TIM_CCER_CC4P | TIM_CCER_CC4NP)); - - /* Write to TIMx CCMR2 and CCER registers */ - TIMx->CCMR2 = tmpccmr2; - TIMx->CCER = tmpccer ; -} - -/** - * @brief Selects the Input Trigger source - * @param TIMx to select the TIM peripheral - * @param TIM_ITRx: The Input Trigger source. - * This parameter can be one of the following values: - * @arg TIM_TS_ITR0: Internal Trigger 0 - * @arg TIM_TS_ITR1: Internal Trigger 1 - * @arg TIM_TS_ITR2: Internal Trigger 2 - * @arg TIM_TS_ITR3: Internal Trigger 3 - * @arg TIM_TS_TI1F_ED: TI1 Edge Detector - * @arg TIM_TS_TI1FP1: Filtered Timer Input 1 - * @arg TIM_TS_TI2FP2: Filtered Timer Input 2 - * @arg TIM_TS_ETRF: External Trigger input - * @retval None - */ -static void TIM_ITRx_SetConfig(TIM_TypeDef *TIMx, uint16_t TIM_ITRx) -{ - uint32_t tmpsmcr = 0; - - /* Get the TIMx SMCR register value */ - tmpsmcr = TIMx->SMCR; - /* Reset the TS Bits */ - tmpsmcr &= ~TIM_SMCR_TS; - /* Set the Input Trigger source and the slave mode*/ - tmpsmcr |= TIM_ITRx | TIM_SLAVEMODE_EXTERNAL1; - /* Write to TIMx SMCR */ - TIMx->SMCR = tmpsmcr; -} - -/** - * @brief Configures the TIMx External Trigger (ETR). - * @param TIMx to select the TIM peripheral - * @param TIM_ExtTRGPrescaler: The external Trigger Prescaler. - * This parameter can be one of the following values: - * @arg TIM_ExtTRGPSC_DIV1: ETRP Prescaler OFF. - * @arg TIM_ExtTRGPSC_DIV2: ETRP frequency divided by 2. - * @arg TIM_ExtTRGPSC_DIV4: ETRP frequency divided by 4. - * @arg TIM_ExtTRGPSC_DIV8: ETRP frequency divided by 8. - * @param TIM_ExtTRGPolarity: The external Trigger Polarity. - * This parameter can be one of the following values: - * @arg TIM_ExtTRGPolarity_Inverted: active low or falling edge active. - * @arg TIM_ExtTRGPolarity_NonInverted: active high or rising edge active. - * @param ExtTRGFilter: External Trigger Filter. - * This parameter must be a value between 0x00 and 0x0F - * @retval None - */ -static void TIM_ETR_SetConfig(TIM_TypeDef* TIMx, uint32_t TIM_ExtTRGPrescaler, - uint32_t TIM_ExtTRGPolarity, uint32_t ExtTRGFilter) -{ - uint32_t tmpsmcr = 0; - - tmpsmcr = TIMx->SMCR; - - /* Reset the ETR Bits */ - tmpsmcr &= ~(TIM_SMCR_ETF | TIM_SMCR_ETPS | TIM_SMCR_ECE | TIM_SMCR_ETP); - - /* Set the Prescaler, the Filter value and the Polarity */ - tmpsmcr |= (uint32_t)(TIM_ExtTRGPrescaler | (TIM_ExtTRGPolarity | (ExtTRGFilter << 8))); - - /* Write to TIMx SMCR */ - TIMx->SMCR = tmpsmcr; -} - -/** - * @} - */ - -#endif /* HAL_TIM_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_uart.c b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_uart.c deleted file mode 100755 index 77e739a7..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_uart.c +++ /dev/null @@ -1,1932 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_hal_uart.c - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief UART HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the Universal Asynchronous Receiver Transmitter (UART) peripheral: - * + Initialization and de-initialization functions - * + IO operation functions - * + Peripheral Control functions - * + Peripheral State and Errors functions - * - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - The UART HAL driver can be used as follows: - - (#) Declare a UART_HandleTypeDef handle structure. - - (#) Initialize the UART low level resources by implementing the HAL_UART_MspInit() API: - (##) Enable the USARTx interface clock. - (##) UART pins configuration: - (+++) Enable the clock for the UART GPIOs. - (+++) Configure these UART pins as alternate function pull-up. - (##) NVIC configuration if you need to use interrupt process (HAL_UART_Transmit_IT() - and HAL_UART_Receive_IT() APIs): - (+++) Configure the USARTx interrupt priority. - (+++) Enable the NVIC USART IRQ handle. - (##) DMA Configuration if you need to use DMA process (HAL_UART_Transmit_DMA() - and HAL_UART_Receive_DMA() APIs): - (+++) Declare a DMA handle structure for the Tx/Rx stream. - (+++) Enable the DMAx interface clock. - (+++) Configure the declared DMA handle structure with the required - Tx/Rx parameters. - (+++) Configure the DMA Tx/Rx Stream. - (+++) Associate the initialized DMA handle to the UART DMA Tx/Rx handle. - (+++) Configure the priority and enable the NVIC for the transfer complete - interrupt on the DMA Tx/Rx Stream. - - (#) Program the Baud Rate, Word Length, Stop Bit, Parity, Hardware - flow control and Mode(Receiver/Transmitter) in the Init structure. - - (#) For the UART asynchronous mode, initialize the UART registers by calling - the HAL_UART_Init() API. - - (#) For the UART Half duplex mode, initialize the UART registers by calling - the HAL_HalfDuplex_Init() API. - - (#) For the LIN mode, initialize the UART registers by calling the HAL_LIN_Init() API. - - (#) For the Multi-Processor mode, initialize the UART registers by calling - the HAL_MultiProcessor_Init() API. - - [..] - (@) The specific UART interrupts (Transmission complete interrupt, - RXNE interrupt and Error Interrupts) will be managed using the macros - __HAL_UART_ENABLE_IT() and __HAL_UART_DISABLE_IT() inside the transmit - and receive process. - - [..] - (@) These APIs (HAL_UART_Init() and HAL_HalfDuplex_Init()) configure also the - low level Hardware GPIO, CLOCK, CORTEX...etc) by calling the customized - HAL_UART_MspInit() API. - - [..] - Three operation modes are available within this driver : - - *** Polling mode IO operation *** - ================================= - [..] - (+) Send an amount of data in blocking mode using HAL_UART_Transmit() - (+) Receive an amount of data in blocking mode using HAL_UART_Receive() - - *** Interrupt mode IO operation *** - =================================== - [..] - (+) Send an amount of data in non blocking mode using HAL_UART_Transmit_IT() - (+) At transmission end of transfer HAL_UART_TxCpltCallback is executed and user can - add his own code by customization of function pointer HAL_UART_TxCpltCallback - (+) Receive an amount of data in non blocking mode using HAL_UART_Receive_IT() - (+) At reception end of transfer HAL_UART_RxCpltCallback is executed and user can - add his own code by customization of function pointer HAL_UART_RxCpltCallback - (+) In case of transfer Error, HAL_UART_ErrorCallback() function is executed and user can - add his own code by customization of function pointer HAL_UART_ErrorCallback - - *** DMA mode IO operation *** - ============================== - [..] - (+) Send an amount of data in non blocking mode (DMA) using HAL_UART_Transmit_DMA() - (+) At transmission end of half transfer HAL_UART_TxHalfCpltCallback is executed and user can - add his own code by customization of function pointer HAL_UART_TxHalfCpltCallback - (+) At transmission end of transfer HAL_UART_TxCpltCallback is executed and user can - add his own code by customization of function pointer HAL_UART_TxCpltCallback - (+) Receive an amount of data in non blocking mode (DMA) using HAL_UART_Receive_DMA() - (+) At reception end of half transfer HAL_UART_RxHalfCpltCallback is executed and user can - add his own code by customization of function pointer HAL_UART_RxHalfCpltCallback - (+) At reception end of transfer HAL_UART_RxCpltCallback is executed and user can - add his own code by customization of function pointer HAL_UART_RxCpltCallback - (+) In case of transfer Error, HAL_UART_ErrorCallback() function is executed and user can - add his own code by customization of function pointer HAL_UART_ErrorCallback - (+) Pause the DMA Transfer using HAL_UART_DMAPause() - (+) Resume the DMA Transfer using HAL_UART_DMAResume() - (+) Stop the DMA Transfer using HAL_UART_DMAStop() - - *** UART HAL driver macros list *** - ============================================= - [..] - Below the list of most used macros in UART HAL driver. - - (+) __HAL_UART_ENABLE: Enable the UART peripheral - (+) __HAL_UART_DISABLE: Disable the UART peripheral - (+) __HAL_UART_GET_FLAG : Check whether the specified UART flag is set or not - (+) __HAL_UART_CLEAR_FLAG : Clear the specified UART pending flag - (+) __HAL_UART_ENABLE_IT: Enable the specified UART interrupt - (+) __HAL_UART_DISABLE_IT: Disable the specified UART interrupt - (+) __HAL_UART_GET_IT_SOURCE: Check whether the specified UART interrupt has occurred or not - - [..] - (@) You can refer to the UART HAL driver header file for more useful macros - - @endverbatim - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal.h" - -/** @addtogroup STM32F2xx_HAL_Driver - * @{ - */ - -/** @defgroup UART UART - * @brief HAL UART module driver - * @{ - */ -#ifdef HAL_UART_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @addtogroup UART_Private_Constants - * @{ - */ -#define UART_TIMEOUT_VALUE 22000 -/** - * @} - */ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/** @addtogroup UART_Private_Functions UART Private Functions - * @{ - */ -static void UART_SetConfig (UART_HandleTypeDef *huart); -static HAL_StatusTypeDef UART_Transmit_IT(UART_HandleTypeDef *huart); -static HAL_StatusTypeDef UART_EndTransmit_IT(UART_HandleTypeDef *huart); -static HAL_StatusTypeDef UART_Receive_IT(UART_HandleTypeDef *huart); -static void UART_DMATransmitCplt(DMA_HandleTypeDef *hdma); -static void UART_DMATxHalfCplt(DMA_HandleTypeDef *hdma); -static void UART_DMAReceiveCplt(DMA_HandleTypeDef *hdma); -static void UART_DMARxHalfCplt(DMA_HandleTypeDef *hdma); -static void UART_DMAError(DMA_HandleTypeDef *hdma); -static HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status, uint32_t Timeout); -/** - * @} - */ - -/* Exported functions ---------------------------------------------------------*/ -/** @defgroup UART_Exported_Functions UART Exported Functions - * @{ - */ - -/** @defgroup UART_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * -@verbatim -=============================================================================== - ##### Initialization and Configuration functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to initialize the USARTx or the UARTy - in asynchronous mode. - (+) For the asynchronous mode only these parameters can be configured: - (++) Baud Rate - (++) Word Length - (++) Stop Bit - (++) Parity: If the parity is enabled, then the MSB bit of the data written - in the data register is transmitted but is changed by the parity bit. - Depending on the frame length defined by the M bit (8-bits or 9-bits), - please refer to Reference manual for possible UART frame formats. - (++) Hardware flow control - (++) Receiver/transmitter modes - (++) Over Sampling Method - [..] - The HAL_UART_Init(), HAL_HalfDuplex_Init(), HAL_LIN_Init() and HAL_MultiProcessor_Init() APIs - follow respectively the UART asynchronous, UART Half duplex, LIN and Multi-Processor - configuration procedures (details for the procedures are available in reference manual (RM0329)). - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the UART mode according to the specified parameters in - * the UART_InitTypeDef and create the associated handle. - * @param huart: pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart) -{ - /* Check the UART handle allocation */ - if(huart == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - if(huart->Init.HwFlowCtl != UART_HWCONTROL_NONE) - { - /* The hardware flow control is available only for USART1, USART2, USART3 and USART6 */ - assert_param(IS_UART_HWFLOW_INSTANCE(huart->Instance)); - assert_param(IS_UART_HARDWARE_FLOW_CONTROL(huart->Init.HwFlowCtl)); - } - else - { - assert_param(IS_UART_INSTANCE(huart->Instance)); - } - assert_param(IS_UART_WORD_LENGTH(huart->Init.WordLength)); - assert_param(IS_UART_OVERSAMPLING(huart->Init.OverSampling)); - - if(huart->State == HAL_UART_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - huart->Lock = HAL_UNLOCKED; - /* Init the low level hardware */ - HAL_UART_MspInit(huart); - } - - huart->State = HAL_UART_STATE_BUSY; - - /* Disable the peripheral */ - __HAL_UART_DISABLE(huart); - - /* Set the UART Communication parameters */ - UART_SetConfig(huart); - - /* In asynchronous mode, the following bits must be kept cleared: - - LINEN and CLKEN bits in the USART_CR2 register, - - SCEN, HDSEL and IREN bits in the USART_CR3 register.*/ - huart->Instance->CR2 &= ~(USART_CR2_LINEN | USART_CR2_CLKEN); - huart->Instance->CR3 &= ~(USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN); - - /* Enable the peripheral */ - __HAL_UART_ENABLE(huart); - - /* Initialize the UART state */ - huart->ErrorCode = HAL_UART_ERROR_NONE; - huart->State= HAL_UART_STATE_READY; - - return HAL_OK; -} - -/** - * @brief Initializes the half-duplex mode according to the specified - * parameters in the UART_InitTypeDef and create the associated handle. - * @param huart: pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_HalfDuplex_Init(UART_HandleTypeDef *huart) -{ - /* Check the UART handle allocation */ - if(huart == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_UART_INSTANCE(huart->Instance)); - assert_param(IS_UART_WORD_LENGTH(huart->Init.WordLength)); - assert_param(IS_UART_OVERSAMPLING(huart->Init.OverSampling)); - - if(huart->State == HAL_UART_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - huart->Lock = HAL_UNLOCKED; - /* Init the low level hardware */ - HAL_UART_MspInit(huart); - } - - huart->State = HAL_UART_STATE_BUSY; - - /* Disable the peripheral */ - __HAL_UART_DISABLE(huart); - - /* Set the UART Communication parameters */ - UART_SetConfig(huart); - - /* In half-duplex mode, the following bits must be kept cleared: - - LINEN and CLKEN bits in the USART_CR2 register, - - SCEN and IREN bits in the USART_CR3 register.*/ - huart->Instance->CR2 &= ~(USART_CR2_LINEN | USART_CR2_CLKEN); - huart->Instance->CR3 &= ~(USART_CR3_IREN | USART_CR3_SCEN); - - /* Enable the Half-Duplex mode by setting the HDSEL bit in the CR3 register */ - huart->Instance->CR3 |= USART_CR3_HDSEL; - - /* Enable the peripheral */ - __HAL_UART_ENABLE(huart); - - /* Initialize the UART state*/ - huart->ErrorCode = HAL_UART_ERROR_NONE; - huart->State= HAL_UART_STATE_READY; - - return HAL_OK; -} - -/** - * @brief Initializes the LIN mode according to the specified - * parameters in the UART_InitTypeDef and create the associated handle. - * @param huart: pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @param BreakDetectLength: Specifies the LIN break detection length. - * This parameter can be one of the following values: - * @arg UART_LINBREAKDETECTLENGTH_10B: 10-bit break detection - * @arg UART_LINBREAKDETECTLENGTH_11B: 11-bit break detection - * @retval HAL status - */ -HAL_StatusTypeDef HAL_LIN_Init(UART_HandleTypeDef *huart, uint32_t BreakDetectLength) -{ - /* Check the UART handle allocation */ - if(huart == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_UART_INSTANCE(huart->Instance)); - assert_param(IS_UART_LIN_BREAK_DETECT_LENGTH(BreakDetectLength)); - assert_param(IS_UART_LIN_WORD_LENGTH(huart->Init.WordLength)); - assert_param(IS_UART_LIN_OVERSAMPLING(huart->Init.OverSampling)); - - if(huart->State == HAL_UART_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - huart->Lock = HAL_UNLOCKED; - /* Init the low level hardware */ - HAL_UART_MspInit(huart); - } - - huart->State = HAL_UART_STATE_BUSY; - - /* Disable the peripheral */ - __HAL_UART_DISABLE(huart); - - /* Set the UART Communication parameters */ - UART_SetConfig(huart); - - /* In LIN mode, the following bits must be kept cleared: - - LINEN and CLKEN bits in the USART_CR2 register, - - SCEN and IREN bits in the USART_CR3 register.*/ - huart->Instance->CR2 &= ~(USART_CR2_CLKEN); - huart->Instance->CR3 &= ~(USART_CR3_HDSEL | USART_CR3_IREN | USART_CR3_SCEN); - - /* Enable the LIN mode by setting the LINEN bit in the CR2 register */ - huart->Instance->CR2 |= USART_CR2_LINEN; - - /* Set the USART LIN Break detection length. */ - huart->Instance->CR2 &= ~(USART_CR2_LBDL); - huart->Instance->CR2 |= BreakDetectLength; - - /* Enable the peripheral */ - __HAL_UART_ENABLE(huart); - - /* Initialize the UART state*/ - huart->ErrorCode = HAL_UART_ERROR_NONE; - huart->State= HAL_UART_STATE_READY; - - return HAL_OK; -} - -/** - * @brief Initializes the Multi-Processor mode according to the specified - * parameters in the UART_InitTypeDef and create the associated handle. - * @param huart: pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @param Address: USART address - * @param WakeUpMethod: specifies the USART wake-up method. - * This parameter can be one of the following values: - * @arg UART_WAKEUPMETHOD_IDLELINE: Wake-up by an idle line detection - * @arg UART_WAKEUPMETHOD_ADDRESSMARK: Wake-up by an address mark - * @retval HAL status - */ -HAL_StatusTypeDef HAL_MultiProcessor_Init(UART_HandleTypeDef *huart, uint8_t Address, uint32_t WakeUpMethod) -{ - /* Check the UART handle allocation */ - if(huart == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_UART_INSTANCE(huart->Instance)); - assert_param(IS_UART_WAKEUPMETHOD(WakeUpMethod)); - assert_param(IS_UART_ADDRESS(Address)); - assert_param(IS_UART_WORD_LENGTH(huart->Init.WordLength)); - assert_param(IS_UART_OVERSAMPLING(huart->Init.OverSampling)); - - if(huart->State == HAL_UART_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - huart->Lock = HAL_UNLOCKED; - /* Init the low level hardware */ - HAL_UART_MspInit(huart); - } - - huart->State = HAL_UART_STATE_BUSY; - - /* Disable the peripheral */ - __HAL_UART_DISABLE(huart); - - /* Set the UART Communication parameters */ - UART_SetConfig(huart); - - /* In Multi-Processor mode, the following bits must be kept cleared: - - LINEN and CLKEN bits in the USART_CR2 register, - - SCEN, HDSEL and IREN bits in the USART_CR3 register */ - huart->Instance->CR2 &= ~(USART_CR2_LINEN | USART_CR2_CLKEN); - huart->Instance->CR3 &= ~(USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN); - - /* Clear the USART address */ - huart->Instance->CR2 &= ~(USART_CR2_ADD); - /* Set the USART address node */ - huart->Instance->CR2 |= Address; - - /* Set the wake up method by setting the WAKE bit in the CR1 register */ - huart->Instance->CR1 &= ~(USART_CR1_WAKE); - huart->Instance->CR1 |= WakeUpMethod; - - /* Enable the peripheral */ - __HAL_UART_ENABLE(huart); - - /* Initialize the UART state */ - huart->ErrorCode = HAL_UART_ERROR_NONE; - huart->State= HAL_UART_STATE_READY; - - return HAL_OK; -} - -/** - * @brief DeInitializes the UART peripheral. - * @param huart: pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_UART_DeInit(UART_HandleTypeDef *huart) -{ - /* Check the UART handle allocation */ - if(huart == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_UART_INSTANCE(huart->Instance)); - - huart->State = HAL_UART_STATE_BUSY; - - /* DeInit the low level hardware */ - HAL_UART_MspDeInit(huart); - - huart->ErrorCode = HAL_UART_ERROR_NONE; - huart->State = HAL_UART_STATE_RESET; - - /* Process Lock */ - __HAL_UNLOCK(huart); - - return HAL_OK; -} - -/** - * @brief UART MSP Init. - * @param huart: pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval None - */ - __weak void HAL_UART_MspInit(UART_HandleTypeDef *huart) -{ - /* NOTE: This function Should not be modified, when the callback is needed, - the HAL_UART_MspInit could be implemented in the user file - */ -} - -/** - * @brief UART MSP DeInit. - * @param huart: pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval None - */ - __weak void HAL_UART_MspDeInit(UART_HandleTypeDef *huart) -{ - /* NOTE: This function Should not be modified, when the callback is needed, - the HAL_UART_MspDeInit could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup UART_Exported_Functions_Group2 IO operation functions - * @brief UART Transmit and Receive functions - * -@verbatim - ============================================================================== - ##### IO operation functions ##### - ============================================================================== - [..] - This subsection provides a set of functions allowing to manage the UART asynchronous - and Half duplex data transfers. - - (#) There are two modes of transfer: - (++) Blocking mode: The communication is performed in polling mode. - The HAL status of all data processing is returned by the same function - after finishing transfer. - (++) Non blocking mode: The communication is performed using Interrupts - or DMA, these APIs return the HAL status. - The end of the data processing will be indicated through the - dedicated UART IRQ when using Interrupt mode or the DMA IRQ when - using DMA mode. - The HAL_UART_TxCpltCallback(), HAL_UART_RxCpltCallback() user callbacks - will be executed respectively at the end of the transmit or receive process. - The HAL_UART_ErrorCallback() user callback will be executed when - a communication error is detected. - - (#) Blocking mode APIs are: - (++) HAL_UART_Transmit() - (++) HAL_UART_Receive() - - (#) Non Blocking mode APIs with Interrupt are: - (++) HAL_UART_Transmit_IT() - (++) HAL_UART_Receive_IT() - (++) HAL_UART_IRQHandler() - - (#) Non Blocking mode functions with DMA are: - (++) HAL_UART_Transmit_DMA() - (++) HAL_UART_Receive_DMA() - - (#) A set of Transfer Complete Callbacks are provided in non blocking mode: - (++) HAL_UART_TxCpltCallback() - (++) HAL_UART_RxCpltCallback() - (++) HAL_UART_ErrorCallback() - - [..] - (@) In the Half duplex communication, it is forbidden to run the transmit - and receive process in parallel, the UART state HAL_UART_STATE_BUSY_TX_RX - can't be useful. - -@endverbatim - * @{ - */ - -/** - * @brief Sends an amount of data in blocking mode. - * @param huart: pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @param pData: Pointer to data buffer - * @param Size: Amount of data to be sent - * @param Timeout: Timeout duration - * @retval HAL status - */ -HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout) -{ - uint16_t* tmp; - uint32_t tmp1 = 0; - - tmp1 = huart->State; - if((tmp1 == HAL_UART_STATE_READY) || (tmp1 == HAL_UART_STATE_BUSY_RX)) - { - if((pData == NULL ) || (Size == 0)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(huart); - - huart->ErrorCode = HAL_UART_ERROR_NONE; - /* Check if a non-blocking receive process is ongoing or not */ - if(huart->State == HAL_UART_STATE_BUSY_RX) - { - huart->State = HAL_UART_STATE_BUSY_TX_RX; - } - else - { - huart->State = HAL_UART_STATE_BUSY_TX; - } - - huart->TxXferSize = Size; - huart->TxXferCount = Size; - while(huart->TxXferCount > 0) - { - huart->TxXferCount--; - if(huart->Init.WordLength == UART_WORDLENGTH_9B) - { - if(UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TXE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - tmp = (uint16_t*) pData; - huart->Instance->DR = (*tmp & (uint16_t)0x01FF); - if(huart->Init.Parity == UART_PARITY_NONE) - { - pData +=2; - } - else - { - pData +=1; - } - } - else - { - if(UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TXE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - huart->Instance->DR = (*pData++ & (uint8_t)0xFF); - } - } - - if(UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TC, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Check if a non-blocking receive process is ongoing or not */ - if(huart->State == HAL_UART_STATE_BUSY_TX_RX) - { - huart->State = HAL_UART_STATE_BUSY_RX; - } - else - { - huart->State = HAL_UART_STATE_READY; - } - - /* Process Unlocked */ - __HAL_UNLOCK(huart); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Receives an amount of data in blocking mode. - * @param huart: pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @param pData: Pointer to data buffer - * @param Size: Amount of data to be received - * @param Timeout: Timeout duration - * @retval HAL status - */ -HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout) -{ - uint16_t* tmp; - uint32_t tmp1 = 0; - - tmp1 = huart->State; - if((tmp1 == HAL_UART_STATE_READY) || (tmp1 == HAL_UART_STATE_BUSY_TX)) - { - if((pData == NULL ) || (Size == 0)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(huart); - - huart->ErrorCode = HAL_UART_ERROR_NONE; - /* Check if a non-blocking transmit process is ongoing or not */ - if(huart->State == HAL_UART_STATE_BUSY_TX) - { - huart->State = HAL_UART_STATE_BUSY_TX_RX; - } - else - { - huart->State = HAL_UART_STATE_BUSY_RX; - } - - huart->RxXferSize = Size; - huart->RxXferCount = Size; - - /* Check the remain data to be received */ - while(huart->RxXferCount > 0) - { - huart->RxXferCount--; - if(huart->Init.WordLength == UART_WORDLENGTH_9B) - { - if(UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_RXNE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - tmp = (uint16_t*) pData ; - if(huart->Init.Parity == UART_PARITY_NONE) - { - *tmp = (uint16_t)(huart->Instance->DR & (uint16_t)0x01FF); - pData +=2; - } - else - { - *tmp = (uint16_t)(huart->Instance->DR & (uint16_t)0x00FF); - pData +=1; - } - - } - else - { - if(UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_RXNE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - if(huart->Init.Parity == UART_PARITY_NONE) - { - *pData++ = (uint8_t)(huart->Instance->DR & (uint8_t)0x00FF); - } - else - { - *pData++ = (uint8_t)(huart->Instance->DR & (uint8_t)0x007F); - } - - } - } - - /* Check if a non-blocking transmit process is ongoing or not */ - if(huart->State == HAL_UART_STATE_BUSY_TX_RX) - { - huart->State = HAL_UART_STATE_BUSY_TX; - } - else - { - huart->State = HAL_UART_STATE_READY; - } - /* Process Unlocked */ - __HAL_UNLOCK(huart); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Sends an amount of data in non blocking mode. - * @param huart: pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @param pData: Pointer to data buffer - * @param Size: Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) -{ - uint32_t tmp = 0; - - tmp = huart->State; - if((tmp == HAL_UART_STATE_READY) || (tmp == HAL_UART_STATE_BUSY_RX)) - { - if((pData == NULL ) || (Size == 0)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(huart); - - huart->pTxBuffPtr = pData; - huart->TxXferSize = Size; - huart->TxXferCount = Size; - - huart->ErrorCode = HAL_UART_ERROR_NONE; - /* Check if a receive process is ongoing or not */ - if(huart->State == HAL_UART_STATE_BUSY_RX) - { - huart->State = HAL_UART_STATE_BUSY_TX_RX; - } - else - { - huart->State = HAL_UART_STATE_BUSY_TX; - } - - /* Enable the UART Parity Error Interrupt */ - __HAL_UART_ENABLE_IT(huart, UART_IT_PE); - - /* Enable the UART Error Interrupt: (Frame error, noise error, overrun error) */ - __HAL_UART_ENABLE_IT(huart, UART_IT_ERR); - - /* Process Unlocked */ - __HAL_UNLOCK(huart); - - /* Enable the UART Transmit data register empty Interrupt */ - __HAL_UART_ENABLE_IT(huart, UART_IT_TXE); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Receives an amount of data in non blocking mode - * @param huart: pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @param pData: Pointer to data buffer - * @param Size: Amount of data to be received - * @retval HAL status - */ -HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) -{ - uint32_t tmp = 0; - - tmp = huart->State; - if((tmp == HAL_UART_STATE_READY) || (tmp == HAL_UART_STATE_BUSY_TX)) - { - if((pData == NULL ) || (Size == 0)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(huart); - - huart->pRxBuffPtr = pData; - huart->RxXferSize = Size; - huart->RxXferCount = Size; - - huart->ErrorCode = HAL_UART_ERROR_NONE; - /* Check if a transmit process is ongoing or not */ - if(huart->State == HAL_UART_STATE_BUSY_TX) - { - huart->State = HAL_UART_STATE_BUSY_TX_RX; - } - else - { - huart->State = HAL_UART_STATE_BUSY_RX; - } - - /* Enable the UART Parity Error Interrupt */ - __HAL_UART_ENABLE_IT(huart, UART_IT_PE); - - /* Enable the UART Error Interrupt: (Frame error, noise error, overrun error) */ - __HAL_UART_ENABLE_IT(huart, UART_IT_ERR); - - /* Process Unlocked */ - __HAL_UNLOCK(huart); - - /* Enable the UART Data Register not empty Interrupt */ - __HAL_UART_ENABLE_IT(huart, UART_IT_RXNE); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Sends an amount of data in non blocking mode. - * @param huart: pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @param pData: Pointer to data buffer - * @param Size: Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) -{ - uint32_t *tmp; - uint32_t tmp1 = 0; - - tmp1 = huart->State; - if((tmp1 == HAL_UART_STATE_READY) || (tmp1 == HAL_UART_STATE_BUSY_RX)) - { - if((pData == NULL ) || (Size == 0)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(huart); - - huart->pTxBuffPtr = pData; - huart->TxXferSize = Size; - huart->TxXferCount = Size; - - huart->ErrorCode = HAL_UART_ERROR_NONE; - /* Check if a receive process is ongoing or not */ - if(huart->State == HAL_UART_STATE_BUSY_RX) - { - huart->State = HAL_UART_STATE_BUSY_TX_RX; - } - else - { - huart->State = HAL_UART_STATE_BUSY_TX; - } - - /* Set the UART DMA transfer complete callback */ - huart->hdmatx->XferCpltCallback = UART_DMATransmitCplt; - - /* Set the UART DMA Half transfer complete callback */ - huart->hdmatx->XferHalfCpltCallback = UART_DMATxHalfCplt; - - /* Set the DMA error callback */ - huart->hdmatx->XferErrorCallback = UART_DMAError; - - /* Enable the UART transmit DMA Stream */ - tmp = (uint32_t*)&pData; - HAL_DMA_Start_IT(huart->hdmatx, *(uint32_t*)tmp, (uint32_t)&huart->Instance->DR, Size); - - /* Clear the TC flag in the SR register by writing 0 to it */ - __HAL_UART_CLEAR_FLAG(huart, UART_FLAG_TC); - - /* Enable the DMA transfer for transmit request by setting the DMAT bit - in the UART CR3 register */ - huart->Instance->CR3 |= USART_CR3_DMAT; - - /* Process Unlocked */ - __HAL_UNLOCK(huart); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Receives an amount of data in non blocking mode. - * @param huart: pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @param pData: Pointer to data buffer - * @param Size: Amount of data to be received - * @note When the UART parity is enabled (PCE = 1) the data received contain the parity bit. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) -{ - uint32_t *tmp; - uint32_t tmp1 = 0; - - tmp1 = huart->State; - if((tmp1 == HAL_UART_STATE_READY) || (tmp1 == HAL_UART_STATE_BUSY_TX)) - { - if((pData == NULL ) || (Size == 0)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(huart); - - huart->pRxBuffPtr = pData; - huart->RxXferSize = Size; - - huart->ErrorCode = HAL_UART_ERROR_NONE; - /* Check if a transmit process is ongoing or not */ - if(huart->State == HAL_UART_STATE_BUSY_TX) - { - huart->State = HAL_UART_STATE_BUSY_TX_RX; - } - else - { - huart->State = HAL_UART_STATE_BUSY_RX; - } - - /* Set the UART DMA transfer complete callback */ - huart->hdmarx->XferCpltCallback = UART_DMAReceiveCplt; - - /* Set the UART DMA Half transfer complete callback */ - huart->hdmarx->XferHalfCpltCallback = UART_DMARxHalfCplt; - - /* Set the DMA error callback */ - huart->hdmarx->XferErrorCallback = UART_DMAError; - - /* Enable the DMA Stream */ - tmp = (uint32_t*)&pData; - HAL_DMA_Start_IT(huart->hdmarx, (uint32_t)&huart->Instance->DR, *(uint32_t*)tmp, Size); - - /* Enable the DMA transfer for the receiver request by setting the DMAR bit - in the UART CR3 register */ - huart->Instance->CR3 |= USART_CR3_DMAR; - - /* Process Unlocked */ - __HAL_UNLOCK(huart); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Pauses the DMA Transfer. - * @param huart: pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_UART_DMAPause(UART_HandleTypeDef *huart) -{ - /* Process Locked */ - __HAL_LOCK(huart); - - if(huart->State == HAL_UART_STATE_BUSY_TX) - { - /* Disable the UART DMA Tx request */ - huart->Instance->CR3 &= (uint32_t)(~USART_CR3_DMAT); - } - else if(huart->State == HAL_UART_STATE_BUSY_RX) - { - /* Disable the UART DMA Rx request */ - huart->Instance->CR3 &= (uint32_t)(~USART_CR3_DMAR); - } - else if (huart->State == HAL_UART_STATE_BUSY_TX_RX) - { - /* Disable the UART DMA Tx & Rx requests */ - huart->Instance->CR3 &= (uint32_t)(~USART_CR3_DMAT); - huart->Instance->CR3 &= (uint32_t)(~USART_CR3_DMAR); - } - - /* Process Unlocked */ - __HAL_UNLOCK(huart); - - return HAL_OK; -} - -/** - * @brief Resumes the DMA Transfer. - * @param huart: pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_UART_DMAResume(UART_HandleTypeDef *huart) -{ - /* Process Locked */ - __HAL_LOCK(huart); - - if(huart->State == HAL_UART_STATE_BUSY_TX) - { - /* Enable the UART DMA Tx request */ - huart->Instance->CR3 |= USART_CR3_DMAT; - } - else if(huart->State == HAL_UART_STATE_BUSY_RX) - { - /* Clear the Overrun flag before resuming the Rx transfer*/ - __HAL_UART_CLEAR_OREFLAG(huart); - /* Enable the UART DMA Rx request */ - huart->Instance->CR3 |= USART_CR3_DMAR; - } - else if(huart->State == HAL_UART_STATE_BUSY_TX_RX) - { - /* Clear the Overrun flag before resuming the Rx transfer*/ - __HAL_UART_CLEAR_OREFLAG(huart); - /* Enable the UART DMA Tx & Rx request */ - huart->Instance->CR3 |= USART_CR3_DMAT; - huart->Instance->CR3 |= USART_CR3_DMAR; - } - - /* Process Unlocked */ - __HAL_UNLOCK(huart); - - return HAL_OK; -} - -/** - * @brief Stops the DMA Transfer. - * @param huart: pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_UART_DMAStop(UART_HandleTypeDef *huart) -{ - /* The Lock is not implemented on this API to allow the user application - to call the HAL UART API under callbacks HAL_UART_TxCpltCallback() / HAL_UART_RxCpltCallback(): - when calling HAL_DMA_Abort() API the DMA TX/RX Transfer complete interrupt is generated - and the correspond call back is executed HAL_UART_TxCpltCallback() / HAL_UART_RxCpltCallback() - */ - - /* Disable the UART Tx/Rx DMA requests */ - huart->Instance->CR3 &= ~USART_CR3_DMAT; - huart->Instance->CR3 &= ~USART_CR3_DMAR; - - /* Abort the UART DMA tx Stream */ - if(huart->hdmatx != NULL) - { - HAL_DMA_Abort(huart->hdmatx); - } - /* Abort the UART DMA rx Stream */ - if(huart->hdmarx != NULL) - { - HAL_DMA_Abort(huart->hdmarx); - } - - huart->State = HAL_UART_STATE_READY; - - return HAL_OK; -} - -/** - * @brief This function handles UART interrupt request. - * @param huart: pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval None - */ -void HAL_UART_IRQHandler(UART_HandleTypeDef *huart) -{ - uint32_t tmp1 = 0, tmp2 = 0; - - tmp1 = __HAL_UART_GET_FLAG(huart, UART_FLAG_PE); - tmp2 = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_PE); - /* UART parity error interrupt occurred ------------------------------------*/ - if((tmp1 != RESET) && (tmp2 != RESET)) - { - __HAL_UART_CLEAR_PEFLAG(huart); - - huart->ErrorCode |= HAL_UART_ERROR_PE; - } - - tmp1 = __HAL_UART_GET_FLAG(huart, UART_FLAG_FE); - tmp2 = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_ERR); - /* UART frame error interrupt occurred -------------------------------------*/ - if((tmp1 != RESET) && (tmp2 != RESET)) - { - __HAL_UART_CLEAR_FEFLAG(huart); - - huart->ErrorCode |= HAL_UART_ERROR_FE; - } - - tmp1 = __HAL_UART_GET_FLAG(huart, UART_FLAG_NE); - tmp2 = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_ERR); - /* UART noise error interrupt occurred -------------------------------------*/ - if((tmp1 != RESET) && (tmp2 != RESET)) - { - __HAL_UART_CLEAR_NEFLAG(huart); - - huart->ErrorCode |= HAL_UART_ERROR_NE; - } - - tmp1 = __HAL_UART_GET_FLAG(huart, UART_FLAG_ORE); - tmp2 = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_ERR); - /* UART Over-Run interrupt occurred ----------------------------------------*/ - if((tmp1 != RESET) && (tmp2 != RESET)) - { - __HAL_UART_CLEAR_OREFLAG(huart); - - huart->ErrorCode |= HAL_UART_ERROR_ORE; - } - - tmp1 = __HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE); - tmp2 = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_RXNE); - /* UART in mode Receiver ---------------------------------------------------*/ - if((tmp1 != RESET) && (tmp2 != RESET)) - { - UART_Receive_IT(huart); - } - - tmp1 = __HAL_UART_GET_FLAG(huart, UART_FLAG_TXE); - tmp2 = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_TXE); - /* UART in mode Transmitter ------------------------------------------------*/ - if((tmp1 != RESET) && (tmp2 != RESET)) - { - UART_Transmit_IT(huart); - } - - tmp1 = __HAL_UART_GET_FLAG(huart, UART_FLAG_TC); - tmp2 = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_TC); - /* UART in mode Transmitter end --------------------------------------------*/ - if((tmp1 != RESET) && (tmp2 != RESET)) - { - UART_EndTransmit_IT(huart); - } - - if(huart->ErrorCode != HAL_UART_ERROR_NONE) - { - /* Set the UART state ready to be able to start again the process */ - huart->State = HAL_UART_STATE_READY; - - HAL_UART_ErrorCallback(huart); - } -} - -/** - * @brief Tx Transfer completed callbacks. - * @param huart: pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval None - */ - __weak void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) -{ - /* NOTE: This function Should not be modified, when the callback is needed, - the HAL_UART_TxCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Tx Half Transfer completed callbacks. - * @param huart: pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval None - */ - __weak void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart) -{ - /* NOTE: This function Should not be modified, when the callback is needed, - the HAL_UART_TxCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Rx Transfer completed callbacks. - * @param huart: pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval None - */ -__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) -{ - /* NOTE: This function Should not be modified, when the callback is needed, - the HAL_UART_TxCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Rx Half Transfer completed callbacks. - * @param huart: pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval None - */ -__weak void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart) -{ - /* NOTE: This function Should not be modified, when the callback is needed, - the HAL_UART_TxCpltCallback could be implemented in the user file - */ -} - -/** - * @brief UART error callbacks. - * @param huart: pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval None - */ - __weak void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) -{ - /* NOTE: This function Should not be modified, when the callback is needed, - the HAL_UART_ErrorCallback could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup UART_Exported_Functions_Group3 Peripheral Control functions - * @brief UART control functions - * -@verbatim - ============================================================================== - ##### Peripheral Control functions ##### - ============================================================================== - [..] - This subsection provides a set of functions allowing to control the UART: - (+) HAL_LIN_SendBreak() API can be helpful to transmit the break character. - (+) HAL_MultiProcessor_EnterMuteMode() API can be helpful to enter the UART in mute mode. - (+) HAL_MultiProcessor_ExitMuteMode() API can be helpful to exit the UART mute mode by software. - -@endverbatim - * @{ - */ - -/** - * @brief Transmits break characters. - * @param huart: pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_LIN_SendBreak(UART_HandleTypeDef *huart) -{ - /* Check the parameters */ - assert_param(IS_UART_INSTANCE(huart->Instance)); - - /* Process Locked */ - __HAL_LOCK(huart); - - huart->State = HAL_UART_STATE_BUSY; - - /* Send break characters */ - huart->Instance->CR1 |= USART_CR1_SBK; - - huart->State = HAL_UART_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(huart); - - return HAL_OK; -} - -/** - * @brief Enters the UART in mute mode. - * @param huart: pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_MultiProcessor_EnterMuteMode(UART_HandleTypeDef *huart) -{ - /* Check the parameters */ - assert_param(IS_UART_INSTANCE(huart->Instance)); - - /* Process Locked */ - __HAL_LOCK(huart); - - huart->State = HAL_UART_STATE_BUSY; - - /* Enable the USART mute mode by setting the RWU bit in the CR1 register */ - huart->Instance->CR1 |= USART_CR1_RWU; - - huart->State = HAL_UART_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(huart); - - return HAL_OK; -} - -/** - * @brief Exits the UART mute mode: wake up software. - * @param huart: pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_MultiProcessor_ExitMuteMode(UART_HandleTypeDef *huart) -{ - /* Check the parameters */ - assert_param(IS_UART_INSTANCE(huart->Instance)); - - /* Process Locked */ - __HAL_LOCK(huart); - - huart->State = HAL_UART_STATE_BUSY; - - /* Disable the USART mute mode by clearing the RWU bit in the CR1 register */ - huart->Instance->CR1 &= (uint32_t)~((uint32_t)USART_CR1_RWU); - - huart->State = HAL_UART_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(huart); - - return HAL_OK; -} - -/** - * @brief Enables the UART transmitter and disables the UART receiver. - * @param huart: pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_HalfDuplex_EnableTransmitter(UART_HandleTypeDef *huart) -{ - uint32_t tmpreg = 0x00; - - /* Process Locked */ - __HAL_LOCK(huart); - - huart->State = HAL_UART_STATE_BUSY; - - /*-------------------------- USART CR1 Configuration -----------------------*/ - tmpreg = huart->Instance->CR1; - - /* Clear TE and RE bits */ - tmpreg &= (uint32_t)~((uint32_t)(USART_CR1_TE | USART_CR1_RE)); - - /* Enable the USART's transmit interface by setting the TE bit in the USART CR1 register */ - tmpreg |= (uint32_t)USART_CR1_TE; - - /* Write to USART CR1 */ - huart->Instance->CR1 = (uint32_t)tmpreg; - - huart->State = HAL_UART_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(huart); - - return HAL_OK; -} - -/** - * @brief Enables the UART receiver and disables the UART transmitter. - * @param huart: pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_HalfDuplex_EnableReceiver(UART_HandleTypeDef *huart) -{ - uint32_t tmpreg = 0x00; - - /* Process Locked */ - __HAL_LOCK(huart); - - huart->State = HAL_UART_STATE_BUSY; - - /*-------------------------- USART CR1 Configuration -----------------------*/ - tmpreg = huart->Instance->CR1; - - /* Clear TE and RE bits */ - tmpreg &= (uint32_t)~((uint32_t)(USART_CR1_TE | USART_CR1_RE)); - - /* Enable the USART's receive interface by setting the RE bit in the USART CR1 register */ - tmpreg |= (uint32_t)USART_CR1_RE; - - /* Write to USART CR1 */ - huart->Instance->CR1 = (uint32_t)tmpreg; - - huart->State = HAL_UART_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(huart); - - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup UART_Exported_Functions_Group4 Peripheral State and Errors functions - * @brief UART State and Errors functions - * -@verbatim - ============================================================================== - ##### Peripheral State and Errors functions ##### - ============================================================================== - [..] - This subsection provides a set of functions allowing to return the State of - UART communication process, return Peripheral Errors occurred during communication - process - (+) HAL_UART_GetState() API can be helpful to check in run-time the state of the UART peripheral. - (+) HAL_UART_GetError() check in run-time errors that could be occurred during communication. - -@endverbatim - * @{ - */ - -/** - * @brief Returns the UART state. - * @param huart: pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval HAL state - */ -HAL_UART_StateTypeDef HAL_UART_GetState(UART_HandleTypeDef *huart) -{ - return huart->State; -} - -/** -* @brief Return the UART error code -* @param huart : pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART. -* @retval UART Error Code -*/ -uint32_t HAL_UART_GetError(UART_HandleTypeDef *huart) -{ - return huart->ErrorCode; -} - -/** - * @} - */ - -/** - * @brief DMA UART transmit process complete callback. - * @param hdma: DMA handle - * @retval None - */ -static void UART_DMATransmitCplt(DMA_HandleTypeDef *hdma) -{ - UART_HandleTypeDef* huart = ( UART_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; - /* DMA Normal mode*/ - if((hdma->Instance->CR & DMA_SxCR_CIRC) == 0) - { - huart->TxXferCount = 0; - - /* Disable the DMA transfer for transmit request by setting the DMAT bit - in the UART CR3 register */ - huart->Instance->CR3 &= (uint32_t)~((uint32_t)USART_CR3_DMAT); - - /* Enable the UART Transmit Complete Interrupt */ - __HAL_UART_ENABLE_IT(huart, UART_IT_TC); - } - /* DMA Circular mode */ - else - { - HAL_UART_TxCpltCallback(huart); - } -} - -/** - * @brief DMA UART transmit process half complete callback - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void UART_DMATxHalfCplt(DMA_HandleTypeDef *hdma) -{ - UART_HandleTypeDef* huart = (UART_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent; - - HAL_UART_TxHalfCpltCallback(huart); -} - -/** - * @brief DMA UART receive process complete callback. - * @param hdma: DMA handle - * @retval None - */ -static void UART_DMAReceiveCplt(DMA_HandleTypeDef *hdma) -{ - UART_HandleTypeDef* huart = ( UART_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; - /* DMA Normal mode*/ - if((hdma->Instance->CR & DMA_SxCR_CIRC) == 0) - { - huart->RxXferCount = 0; - - /* Disable the DMA transfer for the receiver request by setting the DMAR bit - in the UART CR3 register */ - huart->Instance->CR3 &= (uint32_t)~((uint32_t)USART_CR3_DMAR); - - /* Check if a transmit process is ongoing or not */ - if(huart->State == HAL_UART_STATE_BUSY_TX_RX) - { - huart->State = HAL_UART_STATE_BUSY_TX; - } - else - { - huart->State = HAL_UART_STATE_READY; - } - } - HAL_UART_RxCpltCallback(huart); -} - -/** - * @brief DMA UART receive process half complete callback - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void UART_DMARxHalfCplt(DMA_HandleTypeDef *hdma) -{ - UART_HandleTypeDef* huart = (UART_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent; - - HAL_UART_RxHalfCpltCallback(huart); -} - -/** - * @brief DMA UART communication error callback. - * @param hdma: DMA handle - * @retval None - */ -static void UART_DMAError(DMA_HandleTypeDef *hdma) -{ - UART_HandleTypeDef* huart = ( UART_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; - huart->RxXferCount = 0; - huart->TxXferCount = 0; - huart->State= HAL_UART_STATE_READY; - huart->ErrorCode |= HAL_UART_ERROR_DMA; - HAL_UART_ErrorCallback(huart); -} - -/** - * @brief This function handles UART Communication Timeout. - * @param huart: pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @param Flag: specifies the UART flag to check. - * @param Status: The new Flag status (SET or RESET). - * @param Timeout: Timeout duration - * @retval HAL status - */ -static HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status, uint32_t Timeout) -{ - uint32_t tickstart = 0; - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait until flag is set */ - if(Status == RESET) - { - while(__HAL_UART_GET_FLAG(huart, Flag) == RESET) - { - /* Check for the Timeout */ - if(Timeout != HAL_MAX_DELAY) - { - if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout)) - { - /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */ - __HAL_UART_DISABLE_IT(huart, UART_IT_TXE); - __HAL_UART_DISABLE_IT(huart, UART_IT_RXNE); - __HAL_UART_DISABLE_IT(huart, UART_IT_PE); - __HAL_UART_DISABLE_IT(huart, UART_IT_ERR); - - huart->State= HAL_UART_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(huart); - - return HAL_TIMEOUT; - } - } - } - } - else - { - while(__HAL_UART_GET_FLAG(huart, Flag) != RESET) - { - /* Check for the Timeout */ - if(Timeout != HAL_MAX_DELAY) - { - if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout)) - { - /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */ - __HAL_UART_DISABLE_IT(huart, UART_IT_TXE); - __HAL_UART_DISABLE_IT(huart, UART_IT_RXNE); - __HAL_UART_DISABLE_IT(huart, UART_IT_PE); - __HAL_UART_DISABLE_IT(huart, UART_IT_ERR); - - huart->State= HAL_UART_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(huart); - - return HAL_TIMEOUT; - } - } - } - } - return HAL_OK; -} - -/** - * @brief Sends an amount of data in non blocking mode. - * @param huart: Pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval HAL status - */ -static HAL_StatusTypeDef UART_Transmit_IT(UART_HandleTypeDef *huart) -{ - uint16_t* tmp; - uint32_t tmp1 = 0; - - tmp1 = huart->State; - if((tmp1 == HAL_UART_STATE_BUSY_TX) || (tmp1 == HAL_UART_STATE_BUSY_TX_RX)) - { - if(huart->Init.WordLength == UART_WORDLENGTH_9B) - { - tmp = (uint16_t*) huart->pTxBuffPtr; - huart->Instance->DR = (uint16_t)(*tmp & (uint16_t)0x01FF); - if(huart->Init.Parity == UART_PARITY_NONE) - { - huart->pTxBuffPtr += 2; - } - else - { - huart->pTxBuffPtr += 1; - } - } - else - { - huart->Instance->DR = (uint8_t)(*huart->pTxBuffPtr++ & (uint8_t)0x00FF); - } - - if(--huart->TxXferCount == 0) - { - /* Disable the UART Transmit Complete Interrupt */ - __HAL_UART_DISABLE_IT(huart, UART_IT_TXE); - - /* Enable the UART Transmit Complete Interrupt */ - __HAL_UART_ENABLE_IT(huart, UART_IT_TC); - } - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - - -/** - * @brief Wraps up transmission in non blocking mode. - * @param huart: pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval HAL status - */ -static HAL_StatusTypeDef UART_EndTransmit_IT(UART_HandleTypeDef *huart) -{ - /* Disable the UART Transmit Complete Interrupt */ - __HAL_UART_DISABLE_IT(huart, UART_IT_TC); - - /* Check if a receive process is ongoing or not */ - if(huart->State == HAL_UART_STATE_BUSY_TX_RX) - { - huart->State = HAL_UART_STATE_BUSY_RX; - } - else - { - /* Disable the UART Parity Error Interrupt */ - __HAL_UART_DISABLE_IT(huart, UART_IT_PE); - - /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */ - __HAL_UART_DISABLE_IT(huart, UART_IT_ERR); - - huart->State = HAL_UART_STATE_READY; - } - - HAL_UART_TxCpltCallback(huart); - - return HAL_OK; -} - -/** - * @brief Receives an amount of data in non blocking mode - * @param huart: pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval HAL status - */ -static HAL_StatusTypeDef UART_Receive_IT(UART_HandleTypeDef *huart) -{ - uint16_t* tmp; - uint32_t tmp1 = 0; - - tmp1 = huart->State; - if((tmp1 == HAL_UART_STATE_BUSY_RX) || (tmp1 == HAL_UART_STATE_BUSY_TX_RX)) - { - if(huart->Init.WordLength == UART_WORDLENGTH_9B) - { - tmp = (uint16_t*) huart->pRxBuffPtr; - if(huart->Init.Parity == UART_PARITY_NONE) - { - *tmp = (uint16_t)(huart->Instance->DR & (uint16_t)0x01FF); - huart->pRxBuffPtr += 2; - } - else - { - *tmp = (uint16_t)(huart->Instance->DR & (uint16_t)0x00FF); - huart->pRxBuffPtr += 1; - } - } - else - { - if(huart->Init.Parity == UART_PARITY_NONE) - { - *huart->pRxBuffPtr++ = (uint8_t)(huart->Instance->DR & (uint8_t)0x00FF); - } - else - { - *huart->pRxBuffPtr++ = (uint8_t)(huart->Instance->DR & (uint8_t)0x007F); - } - } - - if(--huart->RxXferCount == 0) - { - __HAL_UART_DISABLE_IT(huart, UART_IT_RXNE); - - /* Check if a transmit process is ongoing or not */ - if(huart->State == HAL_UART_STATE_BUSY_TX_RX) - { - huart->State = HAL_UART_STATE_BUSY_TX; - } - else - { - /* Disable the UART Parity Error Interrupt */ - __HAL_UART_DISABLE_IT(huart, UART_IT_PE); - - /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */ - __HAL_UART_DISABLE_IT(huart, UART_IT_ERR); - - huart->State = HAL_UART_STATE_READY; - } - HAL_UART_RxCpltCallback(huart); - - return HAL_OK; - } - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Configures the UART peripheral. - * @param huart: pointer to a UART_HandleTypeDef structure that contains - * the configuration information for the specified UART module. - * @retval None - */ -static void UART_SetConfig(UART_HandleTypeDef *huart) -{ - uint32_t tmpreg = 0x00; - - /* Check the parameters */ - assert_param(IS_UART_BAUDRATE(huart->Init.BaudRate)); - assert_param(IS_UART_STOPBITS(huart->Init.StopBits)); - assert_param(IS_UART_PARITY(huart->Init.Parity)); - assert_param(IS_UART_MODE(huart->Init.Mode)); - - /*-------------------------- USART CR2 Configuration -----------------------*/ - tmpreg = huart->Instance->CR2; - - /* Clear STOP[13:12] bits */ - tmpreg &= (uint32_t)~((uint32_t)USART_CR2_STOP); - - /* Configure the UART Stop Bits: Set STOP[13:12] bits according to huart->Init.StopBits value */ - tmpreg |= (uint32_t)huart->Init.StopBits; - - /* Write to USART CR2 */ - huart->Instance->CR2 = (uint32_t)tmpreg; - - /*-------------------------- USART CR1 Configuration -----------------------*/ - tmpreg = huart->Instance->CR1; - - /* Clear M, PCE, PS, TE and RE bits */ - tmpreg &= (uint32_t)~((uint32_t)(USART_CR1_M | USART_CR1_PCE | USART_CR1_PS | USART_CR1_TE | \ - USART_CR1_RE | USART_CR1_OVER8)); - - /* Configure the UART Word Length, Parity and mode: - Set the M bits according to huart->Init.WordLength value - Set PCE and PS bits according to huart->Init.Parity value - Set TE and RE bits according to huart->Init.Mode value - Set OVER8 bit according to huart->Init.OverSampling value */ - tmpreg |= (uint32_t)huart->Init.WordLength | huart->Init.Parity | huart->Init.Mode | huart->Init.OverSampling; - - /* Write to USART CR1 */ - huart->Instance->CR1 = (uint32_t)tmpreg; - - /*-------------------------- USART CR3 Configuration -----------------------*/ - tmpreg = huart->Instance->CR3; - - /* Clear CTSE and RTSE bits */ - tmpreg &= (uint32_t)~((uint32_t)(USART_CR3_RTSE | USART_CR3_CTSE)); - - /* Configure the UART HFC: Set CTSE and RTSE bits according to huart->Init.HwFlowCtl value */ - tmpreg |= huart->Init.HwFlowCtl; - - /* Write to USART CR3 */ - huart->Instance->CR3 = (uint32_t)tmpreg; - - /* Check the Over Sampling */ - if(huart->Init.OverSampling == UART_OVERSAMPLING_8) - { - /*-------------------------- USART BRR Configuration ---------------------*/ - if((huart->Instance == USART1) || (huart->Instance == USART6)) - { - huart->Instance->BRR = UART_BRR_SAMPLING8(HAL_RCC_GetPCLK2Freq(), huart->Init.BaudRate); - } - else - { - huart->Instance->BRR = UART_BRR_SAMPLING8(HAL_RCC_GetPCLK1Freq(), huart->Init.BaudRate); - } - } - else - { - /*-------------------------- USART BRR Configuration ---------------------*/ - if((huart->Instance == USART1) || (huart->Instance == USART6)) - { - huart->Instance->BRR = UART_BRR_SAMPLING16(HAL_RCC_GetPCLK2Freq(), huart->Init.BaudRate); - } - else - { - huart->Instance->BRR = UART_BRR_SAMPLING16(HAL_RCC_GetPCLK1Freq(), huart->Init.BaudRate); - } - } -} - -/** - * @} - */ - -#endif /* HAL_UART_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_usart.c b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_usart.c deleted file mode 100755 index bb29216f..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_usart.c +++ /dev/null @@ -1,1857 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_hal_usart.c - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief USART HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the Universal Synchronous Asynchronous Receiver Transmitter (USART) peripheral: - * + Initialization and de-initialization functions - * + IO operation functions - * + Peripheral Control functions - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - The USART HAL driver can be used as follows: - - (#) Declare a USART_HandleTypeDef handle structure. - (#) Initialize the USART low level resources by implementing the HAL_USART_MspInit () API: - (##) Enable the USARTx interface clock. - (##) USART pins configuration: - (+++) Enable the clock for the USART GPIOs. - (+++) Configure these USART pins as alternate function pull-up. - (##) NVIC configuration if you need to use interrupt process (HAL_USART_Transmit_IT(), - HAL_USART_Receive_IT() and HAL_USART_TransmitReceive_IT() APIs): - (+++) Configure the USARTx interrupt priority. - (+++) Enable the NVIC USART IRQ handle. - (##) DMA Configuration if you need to use DMA process (HAL_USART_Transmit_DMA() - HAL_USART_Receive_IT() and HAL_USART_TransmitReceive_IT() APIs): - (+++) Declare a DMA handle structure for the Tx/Rx stream. - (+++) Enable the DMAx interface clock. - (+++) Configure the declared DMA handle structure with the required Tx/Rx parameters. - (+++) Configure the DMA Tx/Rx Stream. - (+++) Associate the initialized DMA handle to the USART DMA Tx/Rx handle. - (+++) Configure the priority and enable the NVIC for the transfer complete interrupt on the DMA Tx/Rx Stream. - - (#) Program the Baud Rate, Word Length, Stop Bit, Parity, Hardware - flow control and Mode(Receiver/Transmitter) in the husart Init structure. - - (#) Initialize the USART registers by calling the HAL_USART_Init() API: - (++) These APIs configures also the low level Hardware GPIO, CLOCK, CORTEX...etc) - by calling the customized HAL_USART_MspInit(&husart) API. - - -@@- The specific USART interrupts (Transmission complete interrupt, - RXNE interrupt and Error Interrupts) will be managed using the macros - __HAL_USART_ENABLE_IT() and __HAL_USART_DISABLE_IT() inside the transmit and receive process. - - (#) Three operation modes are available within this driver : - - *** Polling mode IO operation *** - ================================= - [..] - (+) Send an amount of data in blocking mode using HAL_USART_Transmit() - (+) Receive an amount of data in blocking mode using HAL_USART_Receive() - - *** Interrupt mode IO operation *** - =================================== - [..] - (+) Send an amount of data in non blocking mode using HAL_USART_Transmit_IT() - (+) At transmission end of transfer HAL_USART_TxHalfCpltCallback is executed and user can - add his own code by customization of function pointer HAL_USART_TxCpltCallback - (+) Receive an amount of data in non blocking mode using HAL_USART_Receive_IT() - (+) At reception end of transfer HAL_USART_RxCpltCallback is executed and user can - add his own code by customization of function pointer HAL_UART_RxCpltCallback - (+) In case of transfer Error, HAL_USART_ErrorCallback() function is executed and user can - add his own code by customization of function pointer HAL_USART_ErrorCallback - - *** DMA mode IO operation *** - ============================== - [..] - (+) Send an amount of data in non blocking mode (DMA) using HAL_USART_Transmit_DMA() - (+) At transmission end of half transfer HAL_USART_TxHalfCpltCallback is executed and user can - add his own code by customization of function pointer HAL_USART_TxHalfCpltCallback - (+) At transmission end of transfer HAL_USART_TxCpltCallback is executed and user can - add his own code by customization of function pointer HAL_USART_TxCpltCallback - (+) Receive an amount of data in non blocking mode (DMA) using HAL_USART_Receive_DMA() - (+) At reception end of half transfer HAL_USART_RxHalfCpltCallback is executed and user can - add his own code by customization of function pointer HAL_USART_RxHalfCpltCallback - (+) At reception end of transfer HAL_USART_RxCpltCallback is executed and user can - add his own code by customization of function pointer HAL_USART_RxCpltCallback - (+) In case of transfer Error, HAL_USART_ErrorCallback() function is executed and user can - add his own code by customization of function pointer HAL_USART_ErrorCallback - (+) Pause the DMA Transfer using HAL_USART_DMAPause() - (+) Resume the DMA Transfer using HAL_USART_DMAResume() - (+) Stop the DMA Transfer using HAL_USART_DMAStop() - - *** USART HAL driver macros list *** - ============================================= - [..] - Below the list of most used macros in USART HAL driver. - - (+) __HAL_USART_ENABLE: Enable the USART peripheral - (+) __HAL_USART_DISABLE: Disable the USART peripheral - (+) __HAL_USART_GET_FLAG : Check whether the specified USART flag is set or not - (+) __HAL_USART_CLEAR_FLAG : Clear the specified USART pending flag - (+) __HAL_USART_ENABLE_IT: Enable the specified USART interrupt - (+) __HAL_USART_DISABLE_IT: Disable the specified USART interrupt - - [..] - (@) You can refer to the USART HAL driver header file for more useful macros - - @endverbatim - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal.h" - -/** @addtogroup STM32F2xx_HAL_Driver - * @{ - */ - -/** @defgroup USART USART - * @brief HAL USART Synchronous module driver - * @{ - */ -#ifdef HAL_USART_MODULE_ENABLED -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/** @addtogroup USART_Private_Constants - * @{ - */ -#define DUMMY_DATA 0xFFFF -#define USART_TIMEOUT_VALUE 22000 -/** - * @} - */ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/** @addtogroup USART_Private_Functions - * @{ - */ -static HAL_StatusTypeDef USART_Transmit_IT(USART_HandleTypeDef *husart); -static HAL_StatusTypeDef USART_EndTransmit_IT(USART_HandleTypeDef *husart); -static HAL_StatusTypeDef USART_Receive_IT(USART_HandleTypeDef *husart); -static HAL_StatusTypeDef USART_TransmitReceive_IT(USART_HandleTypeDef *husart); -static void USART_SetConfig (USART_HandleTypeDef *husart); -static void USART_DMATransmitCplt(DMA_HandleTypeDef *hdma); -static void USART_DMATxHalfCplt(DMA_HandleTypeDef *hdma); -static void USART_DMAReceiveCplt(DMA_HandleTypeDef *hdma); -static void USART_DMARxHalfCplt(DMA_HandleTypeDef *hdma); -static void USART_DMAError(DMA_HandleTypeDef *hdma); -static HAL_StatusTypeDef USART_WaitOnFlagUntilTimeout(USART_HandleTypeDef *husart, uint32_t Flag, FlagStatus Status, uint32_t Timeout); -/** - * @} - */ - -/* Exported functions --------------------------------------------------------*/ -/** @defgroup USART_Exported_Functions USART Exported Functions - * @{ - */ - -/** @defgroup USART_Exported_Functions_Group1 USART Initialization and de-initialization functions - * @brief Initialization and Configuration functions - * -@verbatim - ============================================================================== - ##### Initialization and Configuration functions ##### - ============================================================================== - [..] - This subsection provides a set of functions allowing to initialize the USART - in asynchronous and in synchronous modes. - (+) For the asynchronous mode only these parameters can be configured: - (++) Baud Rate - (++) Word Length - (++) Stop Bit - (++) Parity: If the parity is enabled, then the MSB bit of the data written - in the data register is transmitted but is changed by the parity bit. - Depending on the frame length defined by the M bit (8-bits or 9-bits), - please refer to Reference manual for possible USART frame formats. - (++) USART polarity - (++) USART phase - (++) USART LastBit - (++) Receiver/transmitter modes - - [..] - The HAL_USART_Init() function follows the USART synchronous configuration - procedure (details for the procedure are available in reference manual (RM0329)). - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the USART mode according to the specified - * parameters in the USART_InitTypeDef and create the associated handle. - * @param husart: pointer to a USART_HandleTypeDef structure that contains - * the configuration information for the specified USART module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USART_Init(USART_HandleTypeDef *husart) -{ - /* Check the USART handle allocation */ - if(husart == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_USART_INSTANCE(husart->Instance)); - - if(husart->State == HAL_USART_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - husart->Lock = HAL_UNLOCKED; - /* Init the low level hardware */ - HAL_USART_MspInit(husart); - } - - husart->State = HAL_USART_STATE_BUSY; - - /* Set the USART Communication parameters */ - USART_SetConfig(husart); - - /* In USART mode, the following bits must be kept cleared: - - LINEN bit in the USART_CR2 register - - HDSEL, SCEN and IREN bits in the USART_CR3 register */ - husart->Instance->CR2 &= ~USART_CR2_LINEN; - husart->Instance->CR3 &= ~(USART_CR3_IREN | USART_CR3_SCEN | USART_CR3_HDSEL); - - /* Enable the Peripheral */ - __HAL_USART_ENABLE(husart); - - /* Initialize the USART state */ - husart->ErrorCode = HAL_USART_ERROR_NONE; - husart->State= HAL_USART_STATE_READY; - - return HAL_OK; -} - -/** - * @brief DeInitializes the USART peripheral. - * @param husart: pointer to a USART_HandleTypeDef structure that contains - * the configuration information for the specified USART module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USART_DeInit(USART_HandleTypeDef *husart) -{ - /* Check the USART handle allocation */ - if(husart == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_USART_INSTANCE(husart->Instance)); - - husart->State = HAL_USART_STATE_BUSY; - - /* Disable the Peripheral */ - __HAL_USART_DISABLE(husart); - - /* DeInit the low level hardware */ - HAL_USART_MspDeInit(husart); - - husart->ErrorCode = HAL_USART_ERROR_NONE; - husart->State = HAL_USART_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(husart); - - return HAL_OK; -} - -/** - * @brief USART MSP Init. - * @param husart: pointer to a USART_HandleTypeDef structure that contains - * the configuration information for the specified USART module. - * @retval None - */ - __weak void HAL_USART_MspInit(USART_HandleTypeDef *husart) -{ - /* NOTE: This function Should not be modified, when the callback is needed, - the HAL_USART_MspInit could be implemented in the user file - */ -} - -/** - * @brief USART MSP DeInit. - * @param husart: pointer to a USART_HandleTypeDef structure that contains - * the configuration information for the specified USART module. - * @retval None - */ - __weak void HAL_USART_MspDeInit(USART_HandleTypeDef *husart) -{ - /* NOTE: This function Should not be modified, when the callback is needed, - the HAL_USART_MspDeInit could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup USART_Exported_Functions_Group2 IO operation functions - * @brief USART Transmit and Receive functions - * -@verbatim - ============================================================================== - ##### IO operation functions ##### - ============================================================================== - [..] - This subsection provides a set of functions allowing to manage the USART synchronous - data transfers. - - [..] - The USART supports master mode only: it cannot receive or send data related to an input - clock (SCLK is always an output). - - (#) There are two modes of transfer: - (++) Blocking mode: The communication is performed in polling mode. - The HAL status of all data processing is returned by the same function - after finishing transfer. - (++) No-Blocking mode: The communication is performed using Interrupts - or DMA, These API's return the HAL status. - The end of the data processing will be indicated through the - dedicated USART IRQ when using Interrupt mode or the DMA IRQ when - using DMA mode. - The HAL_USART_TxCpltCallback(), HAL_USART_RxCpltCallback() and HAL_USART_TxRxCpltCallback() - user callbacks - will be executed respectively at the end of the transmit or Receive process - The HAL_USART_ErrorCallback() user callback will be executed when a communication - error is detected - - (#) Blocking mode APIs are : - (++) HAL_USART_Transmit() in simplex mode - (++) HAL_USART_Receive() in full duplex receive only - (++) HAL_USART_TransmitReceive() in full duplex mode - - (#) Non Blocking mode APIs with Interrupt are : - (++) HAL_USART_Transmit_IT()in simplex mode - (++) HAL_USART_Receive_IT() in full duplex receive only - (++) HAL_USART_TransmitReceive_IT() in full duplex mode - (++) HAL_USART_IRQHandler() - - (#) Non Blocking mode functions with DMA are : - (++) HAL_USART_Transmit_DMA()in simplex mode - (++) HAL_USART_Receive_DMA() in full duplex receive only - (++) HAL_USART_TransmitReceie_DMA() in full duplex mode - (++) HAL_USART_DMAPause() - (++) HAL_USART_DMAResume() - (++) HAL_USART_DMAStop() - - (#) A set of Transfer Complete Callbacks are provided in non Blocking mode: - (++) HAL_USART_TxHalfCpltCallback() - (++) HAL_USART_TxCpltCallback() - (++) HAL_USART_RxHalfCpltCallback() - (++) HAL_USART_RxCpltCallback() - (++) HAL_USART_ErrorCallback() - (++) HAL_USART_TxRxCpltCallback() - -@endverbatim - * @{ - */ - -/** - * @brief Simplex Send an amount of data in blocking mode. - * @param husart: pointer to a USART_HandleTypeDef structure that contains - * the configuration information for the specified USART module. - * @param pTxData: Pointer to data buffer - * @param Size: Amount of data to be sent - * @param Timeout: Timeout duration - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USART_Transmit(USART_HandleTypeDef *husart, uint8_t *pTxData, uint16_t Size, uint32_t Timeout) -{ - uint16_t* tmp; - - if(husart->State == HAL_USART_STATE_READY) - { - if((pTxData == NULL) || (Size == 0)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(husart); - - husart->ErrorCode = HAL_USART_ERROR_NONE; - husart->State = HAL_USART_STATE_BUSY_TX; - - husart->TxXferSize = Size; - husart->TxXferCount = Size; - while(husart->TxXferCount > 0) - { - husart->TxXferCount--; - if(husart->Init.WordLength == USART_WORDLENGTH_9B) - { - /* Wait for TC flag in order to write data in DR */ - if(USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TXE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - tmp = (uint16_t*) pTxData; - husart->Instance->DR = (*tmp & (uint16_t)0x01FF); - if(husart->Init.Parity == USART_PARITY_NONE) - { - pTxData += 2; - } - else - { - pTxData += 1; - } - } - else - { - if(USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TXE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - husart->Instance->DR = (*pTxData++ & (uint8_t)0xFF); - } - } - - if(USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TC, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - husart->State = HAL_USART_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Full-Duplex Receive an amount of data in blocking mode. - * @param husart: pointer to a USART_HandleTypeDef structure that contains - * the configuration information for the specified USART module. - * @param pRxData: Pointer to data buffer - * @param Size: Amount of data to be received - * @param Timeout: Timeout duration - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USART_Receive(USART_HandleTypeDef *husart, uint8_t *pRxData, uint16_t Size, uint32_t Timeout) -{ - uint16_t* tmp; - - if(husart->State == HAL_USART_STATE_READY) - { - if((pRxData == NULL) || (Size == 0)) - { - return HAL_ERROR; - } - /* Process Locked */ - __HAL_LOCK(husart); - - husart->ErrorCode = HAL_USART_ERROR_NONE; - husart->State = HAL_USART_STATE_BUSY_RX; - - husart->RxXferSize = Size; - husart->RxXferCount = Size; - /* Check the remain data to be received */ - while(husart->RxXferCount > 0) - { - husart->RxXferCount--; - if(husart->Init.WordLength == USART_WORDLENGTH_9B) - { - /* Wait until TXE flag is set to send dummy byte in order to generate the clock for the slave to send data */ - if(USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TXE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - /* Send dummy byte in order to generate clock */ - husart->Instance->DR = (DUMMY_DATA & (uint16_t)0x01FF); - - /* Wait for RXNE Flag */ - if(USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_RXNE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - tmp = (uint16_t*) pRxData ; - if(husart->Init.Parity == USART_PARITY_NONE) - { - *tmp = (uint16_t)(husart->Instance->DR & (uint16_t)0x01FF); - pRxData +=2; - } - else - { - *tmp = (uint16_t)(husart->Instance->DR & (uint16_t)0x00FF); - pRxData +=1; - } - } - else - { - /* Wait until TXE flag is set to send dummy byte in order to generate the clock for the slave to send data */ - if(USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TXE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - - /* Send Dummy Byte in order to generate clock */ - husart->Instance->DR = (DUMMY_DATA & (uint16_t)0x00FF); - - /* Wait until RXNE flag is set to receive the byte */ - if(USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_RXNE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - if(husart->Init.Parity == USART_PARITY_NONE) - { - /* Receive data */ - *pRxData++ = (uint8_t)(husart->Instance->DR & (uint8_t)0x00FF); - } - else - { - /* Receive data */ - *pRxData++ = (uint8_t)(husart->Instance->DR & (uint8_t)0x007F); - } - - } - } - - husart->State = HAL_USART_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Full-Duplex Send receive an amount of data in full-duplex mode (blocking mode). - * @param husart: pointer to a USART_HandleTypeDef structure that contains - * the configuration information for the specified USART module. - * @param pTxData: Pointer to data transmitted buffer - * @param pRxData: Pointer to data received buffer - * @param Size: Amount of data to be sent - * @param Timeout: Timeout duration - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USART_TransmitReceive(USART_HandleTypeDef *husart, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout) -{ - uint16_t* tmp; - - if(husart->State == HAL_USART_STATE_READY) - { - if((pTxData == NULL) || (pRxData == NULL) || (Size == 0)) - { - return HAL_ERROR; - } - /* Process Locked */ - __HAL_LOCK(husart); - - husart->ErrorCode = HAL_USART_ERROR_NONE; - husart->State = HAL_USART_STATE_BUSY_RX; - - husart->RxXferSize = Size; - husart->TxXferSize = Size; - husart->TxXferCount = Size; - husart->RxXferCount = Size; - - /* Check the remain data to be received */ - while(husart->TxXferCount > 0) - { - husart->TxXferCount--; - husart->RxXferCount--; - if(husart->Init.WordLength == USART_WORDLENGTH_9B) - { - /* Wait for TC flag in order to write data in DR */ - if(USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TXE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - tmp = (uint16_t*) pTxData; - husart->Instance->DR = (*tmp & (uint16_t)0x01FF); - if(husart->Init.Parity == USART_PARITY_NONE) - { - pTxData += 2; - } - else - { - pTxData += 1; - } - - /* Wait for RXNE Flag */ - if(USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_RXNE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - tmp = (uint16_t*) pRxData ; - if(husart->Init.Parity == USART_PARITY_NONE) - { - *tmp = (uint16_t)(husart->Instance->DR & (uint16_t)0x01FF); - pRxData += 2; - } - else - { - *tmp = (uint16_t)(husart->Instance->DR & (uint16_t)0x00FF); - pRxData += 1; - } - } - else - { - /* Wait for TC flag in order to write data in DR */ - if(USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TXE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - husart->Instance->DR = (*pTxData++ & (uint8_t)0x00FF); - - /* Wait for RXNE Flag */ - if(USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_RXNE, RESET, Timeout) != HAL_OK) - { - return HAL_TIMEOUT; - } - if(husart->Init.Parity == USART_PARITY_NONE) - { - /* Receive data */ - *pRxData++ = (uint8_t)(husart->Instance->DR & (uint8_t)0x00FF); - } - else - { - /* Receive data */ - *pRxData++ = (uint8_t)(husart->Instance->DR & (uint8_t)0x007F); - } - } - } - - husart->State = HAL_USART_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Simplex Send an amount of data in non-blocking mode. - * @param husart: pointer to a USART_HandleTypeDef structure that contains - * the configuration information for the specified USART module. - * @param pTxData: Pointer to data buffer - * @param Size: Amount of data to be sent - * @retval HAL status - * @note The USART errors are not managed to avoid the overrun error. - */ -HAL_StatusTypeDef HAL_USART_Transmit_IT(USART_HandleTypeDef *husart, uint8_t *pTxData, uint16_t Size) -{ - if(husart->State == HAL_USART_STATE_READY) - { - if((pTxData == NULL) || (Size == 0)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(husart); - - husart->pTxBuffPtr = pTxData; - husart->TxXferSize = Size; - husart->TxXferCount = Size; - - husart->ErrorCode = HAL_USART_ERROR_NONE; - husart->State = HAL_USART_STATE_BUSY_TX; - - /* The USART Error Interrupts: (Frame error, Noise error, Overrun error) - are not managed by the USART transmit process to avoid the overrun interrupt - when the USART mode is configured for transmit and receive "USART_MODE_TX_RX" - to benefit for the frame error and noise interrupts the USART mode should be - configured only for transmit "USART_MODE_TX" - The __HAL_USART_ENABLE_IT(husart, USART_IT_ERR) can be used to enable the Frame error, - Noise error interrupt */ - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - /* Enable the USART Transmit Data Register Empty Interrupt */ - __HAL_USART_ENABLE_IT(husart, USART_IT_TXE); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Simplex Receive an amount of data in non-blocking mode. - * @param husart: pointer to a USART_HandleTypeDef structure that contains - * the configuration information for the specified USART module. - * @param pRxData: Pointer to data buffer - * @param Size: Amount of data to be received - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USART_Receive_IT(USART_HandleTypeDef *husart, uint8_t *pRxData, uint16_t Size) -{ - if(husart->State == HAL_USART_STATE_READY) - { - if((pRxData == NULL) || (Size == 0)) - { - return HAL_ERROR; - } - /* Process Locked */ - __HAL_LOCK(husart); - - husart->pRxBuffPtr = pRxData; - husart->RxXferSize = Size; - husart->RxXferCount = Size; - - husart->ErrorCode = HAL_USART_ERROR_NONE; - husart->State = HAL_USART_STATE_BUSY_RX; - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - /* Enable the USART Data Register not empty Interrupt */ - __HAL_USART_ENABLE_IT(husart, USART_IT_RXNE); - - /* Enable the USART Parity Error Interrupt */ - __HAL_USART_ENABLE_IT(husart, USART_IT_PE); - - /* Enable the USART Error Interrupt: (Frame error, noise error, overrun error) */ - __HAL_USART_ENABLE_IT(husart, USART_IT_ERR); - - /* Send dummy byte in order to generate the clock for the slave to send data */ - husart->Instance->DR = (DUMMY_DATA & (uint16_t)0x01FF); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Full-Duplex Send receive an amount of data in full-duplex mode (non-blocking). - * @param husart: pointer to a USART_HandleTypeDef structure that contains - * the configuration information for the specified USART module. - * @param pTxData: Pointer to data transmitted buffer - * @param pRxData: Pointer to data received buffer - * @param Size: Amount of data to be received - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USART_TransmitReceive_IT(USART_HandleTypeDef *husart, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size) -{ - if(husart->State == HAL_USART_STATE_READY) - { - if((pTxData == NULL) || (pRxData == NULL) || (Size == 0)) - { - return HAL_ERROR; - } - /* Process Locked */ - __HAL_LOCK(husart); - - husart->pRxBuffPtr = pRxData; - husart->RxXferSize = Size; - husart->RxXferCount = Size; - husart->pTxBuffPtr = pTxData; - husart->TxXferSize = Size; - husart->TxXferCount = Size; - - husart->ErrorCode = HAL_USART_ERROR_NONE; - husart->State = HAL_USART_STATE_BUSY_TX_RX; - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - /* Enable the USART Data Register not empty Interrupt */ - __HAL_USART_ENABLE_IT(husart, USART_IT_RXNE); - - /* Enable the USART Parity Error Interrupt */ - __HAL_USART_ENABLE_IT(husart, USART_IT_PE); - - /* Enable the USART Error Interrupt: (Frame error, noise error, overrun error) */ - __HAL_USART_ENABLE_IT(husart, USART_IT_ERR); - - /* Enable the USART Transmit Data Register Empty Interrupt */ - __HAL_USART_ENABLE_IT(husart, USART_IT_TXE); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Simplex Send an amount of data in non-blocking mode. - * @param husart: pointer to a USART_HandleTypeDef structure that contains - * the configuration information for the specified USART module. - * @param pTxData: Pointer to data buffer - * @param Size: Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USART_Transmit_DMA(USART_HandleTypeDef *husart, uint8_t *pTxData, uint16_t Size) -{ - uint32_t *tmp; - - if(husart->State == HAL_USART_STATE_READY) - { - if((pTxData == NULL) || (Size == 0)) - { - return HAL_ERROR; - } - /* Process Locked */ - __HAL_LOCK(husart); - - husart->pTxBuffPtr = pTxData; - husart->TxXferSize = Size; - husart->TxXferCount = Size; - - husart->ErrorCode = HAL_USART_ERROR_NONE; - husart->State = HAL_USART_STATE_BUSY_TX; - - /* Set the USART DMA transfer complete callback */ - husart->hdmatx->XferCpltCallback = USART_DMATransmitCplt; - - /* Set the USART DMA Half transfer complete callback */ - husart->hdmatx->XferHalfCpltCallback = USART_DMATxHalfCplt; - - /* Set the DMA error callback */ - husart->hdmatx->XferErrorCallback = USART_DMAError; - - /* Enable the USART transmit DMA Stream */ - tmp = (uint32_t*)&pTxData; - HAL_DMA_Start_IT(husart->hdmatx, *(uint32_t*)tmp, (uint32_t)&husart->Instance->DR, Size); - - /* Clear the TC flag in the SR register by writing 0 to it */ - __HAL_USART_CLEAR_FLAG(husart, USART_FLAG_TC); - - /* Enable the DMA transfer for transmit request by setting the DMAT bit - in the USART CR3 register */ - husart->Instance->CR3 |= USART_CR3_DMAT; - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Full-Duplex Receive an amount of data in non-blocking mode. - * @param husart: pointer to a USART_HandleTypeDef structure that contains - * the configuration information for the specified USART module. - * @param pRxData: Pointer to data buffer - * @param Size: Amount of data to be received - * @retval HAL status - * @note The USART DMA transmit stream must be configured in order to generate the clock for the slave. - * @note When the USART parity is enabled (PCE = 1) the data received contain the parity bit. - */ -HAL_StatusTypeDef HAL_USART_Receive_DMA(USART_HandleTypeDef *husart, uint8_t *pRxData, uint16_t Size) -{ - uint32_t *tmp; - - if(husart->State == HAL_USART_STATE_READY) - { - if((pRxData == NULL) || (Size == 0)) - { - return HAL_ERROR; - } - - /* Process Locked */ - __HAL_LOCK(husart); - - husart->pRxBuffPtr = pRxData; - husart->RxXferSize = Size; - husart->pTxBuffPtr = pRxData; - husart->TxXferSize = Size; - - husart->ErrorCode = HAL_USART_ERROR_NONE; - husart->State = HAL_USART_STATE_BUSY_RX; - - /* Set the USART DMA Rx transfer complete callback */ - husart->hdmarx->XferCpltCallback = USART_DMAReceiveCplt; - - /* Set the USART DMA Half transfer complete callback */ - husart->hdmarx->XferHalfCpltCallback = USART_DMARxHalfCplt; - - /* Set the USART DMA Rx transfer error callback */ - husart->hdmarx->XferErrorCallback = USART_DMAError; - - /* Enable the USART receive DMA Stream */ - tmp = (uint32_t*)&pRxData; - HAL_DMA_Start_IT(husart->hdmarx, (uint32_t)&husart->Instance->DR, *(uint32_t*)tmp, Size); - - /* Enable the USART transmit DMA Stream: the transmit stream is used in order - to generate in the non-blocking mode the clock to the slave device, - this mode isn't a simplex receive mode but a full-duplex receive one */ - HAL_DMA_Start_IT(husart->hdmatx, *(uint32_t*)tmp, (uint32_t)&husart->Instance->DR, Size); - - /* Clear the Overrun flag just before enabling the DMA Rx request: mandatory for the second transfer - when using the USART in circular mode */ - __HAL_USART_CLEAR_OREFLAG(husart); - - /* Enable the DMA transfer for the receiver request by setting the DMAR bit - in the USART CR3 register */ - husart->Instance->CR3 |= USART_CR3_DMAR; - - /* Enable the DMA transfer for transmit request by setting the DMAT bit - in the USART CR3 register */ - husart->Instance->CR3 |= USART_CR3_DMAT; - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Full-Duplex Transmit Receive an amount of data in non-blocking mode. - * @param husart: pointer to a USART_HandleTypeDef structure that contains - * the configuration information for the specified USART module. - * @param pTxData: Pointer to data transmitted buffer - * @param pRxData: Pointer to data received buffer - * @param Size: Amount of data to be received - * @note When the USART parity is enabled (PCE = 1) the data received contain the parity bit. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USART_TransmitReceive_DMA(USART_HandleTypeDef *husart, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size) -{ - uint32_t *tmp; - - if(husart->State == HAL_USART_STATE_READY) - { - if((pTxData == NULL) || (pRxData == NULL) || (Size == 0)) - { - return HAL_ERROR; - } - /* Process Locked */ - __HAL_LOCK(husart); - - husart->pRxBuffPtr = pRxData; - husart->RxXferSize = Size; - husart->pTxBuffPtr = pTxData; - husart->TxXferSize = Size; - - husart->ErrorCode = HAL_USART_ERROR_NONE; - husart->State = HAL_USART_STATE_BUSY_TX_RX; - - /* Set the USART DMA Rx transfer complete callback */ - husart->hdmarx->XferCpltCallback = USART_DMAReceiveCplt; - - /* Set the USART DMA Half transfer complete callback */ - husart->hdmarx->XferHalfCpltCallback = USART_DMARxHalfCplt; - - /* Set the USART DMA Tx transfer complete callback */ - husart->hdmatx->XferCpltCallback = USART_DMATransmitCplt; - - /* Set the USART DMA Half transfer complete callback */ - husart->hdmatx->XferHalfCpltCallback = USART_DMATxHalfCplt; - - /* Set the USART DMA Tx transfer error callback */ - husart->hdmatx->XferErrorCallback = USART_DMAError; - - /* Set the USART DMA Rx transfer error callback */ - husart->hdmarx->XferErrorCallback = USART_DMAError; - - /* Enable the USART receive DMA Stream */ - tmp = (uint32_t*)&pRxData; - HAL_DMA_Start_IT(husart->hdmarx, (uint32_t)&husart->Instance->DR, *(uint32_t*)tmp, Size); - - /* Enable the USART transmit DMA Stream */ - tmp = (uint32_t*)&pTxData; - HAL_DMA_Start_IT(husart->hdmatx, *(uint32_t*)tmp, (uint32_t)&husart->Instance->DR, Size); - - /* Clear the TC flag in the SR register by writing 0 to it */ - __HAL_USART_CLEAR_FLAG(husart, USART_FLAG_TC); - - /* Clear the Overrun flag: mandatory for the second transfer in circular mode */ - __HAL_USART_CLEAR_OREFLAG(husart); - - /* Enable the DMA transfer for the receiver request by setting the DMAR bit - in the USART CR3 register */ - husart->Instance->CR3 |= USART_CR3_DMAR; - - /* Enable the DMA transfer for transmit request by setting the DMAT bit - in the USART CR3 register */ - husart->Instance->CR3 |= USART_CR3_DMAT; - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Pauses the DMA Transfer. - * @param husart: pointer to a USART_HandleTypeDef structure that contains - * the configuration information for the specified USART module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USART_DMAPause(USART_HandleTypeDef *husart) -{ - /* Process Locked */ - __HAL_LOCK(husart); - - /* Disable the USART DMA Tx request */ - husart->Instance->CR3 &= (uint32_t)(~USART_CR3_DMAT); - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - return HAL_OK; -} - -/** - * @brief Resumes the DMA Transfer. - * @param husart: pointer to a USART_HandleTypeDef structure that contains - * the configuration information for the specified USART module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USART_DMAResume(USART_HandleTypeDef *husart) -{ - /* Process Locked */ - __HAL_LOCK(husart); - - /* Enable the USART DMA Tx request */ - husart->Instance->CR3 |= USART_CR3_DMAT; - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - return HAL_OK; -} - -/** - * @brief Stops the DMA Transfer. - * @param husart: pointer to a USART_HandleTypeDef structure that contains - * the configuration information for the specified USART module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_USART_DMAStop(USART_HandleTypeDef *husart) -{ - /* The Lock is not implemented on this API to allow the user application - to call the HAL USART API under callbacks HAL_USART_TxCpltCallback() / HAL_USART_RxCpltCallback(): - when calling HAL_DMA_Abort() API the DMA TX/RX Transfer complete interrupt is generated - and the correspond call back is executed HAL_USART_TxCpltCallback() / HAL_USART_RxCpltCallback() - */ - - /* Abort the USART DMA Tx Stream */ - if(husart->hdmatx != NULL) - { - HAL_DMA_Abort(husart->hdmatx); - } - /* Abort the USART DMA Rx Stream */ - if(husart->hdmarx != NULL) - { - HAL_DMA_Abort(husart->hdmarx); - } - - /* Disable the USART Tx/Rx DMA requests */ - husart->Instance->CR3 &= ~USART_CR3_DMAT; - husart->Instance->CR3 &= ~USART_CR3_DMAR; - - husart->State = HAL_USART_STATE_READY; - - return HAL_OK; -} - -/** - * @brief This function handles USART interrupt request. - * @param husart: pointer to a USART_HandleTypeDef structure that contains - * the configuration information for the specified USART module. - * @retval None - */ -void HAL_USART_IRQHandler(USART_HandleTypeDef *husart) -{ - uint32_t tmp1 = 0, tmp2 = 0; - - tmp1 = __HAL_USART_GET_FLAG(husart, USART_FLAG_PE); - tmp2 = __HAL_USART_GET_IT_SOURCE(husart, USART_IT_PE); - /* USART parity error interrupt occurred -----------------------------------*/ - if((tmp1 != RESET) && (tmp2 != RESET)) - { - __HAL_USART_CLEAR_PEFLAG(husart); - husart->ErrorCode |= HAL_USART_ERROR_PE; - } - - tmp1 = __HAL_USART_GET_FLAG(husart, USART_FLAG_FE); - tmp2 = __HAL_USART_GET_IT_SOURCE(husart, USART_IT_ERR); - /* USART frame error interrupt occurred ------------------------------------*/ - if((tmp1 != RESET) && (tmp2 != RESET)) - { - __HAL_USART_CLEAR_FEFLAG(husart); - husart->ErrorCode |= HAL_USART_ERROR_FE; - } - - tmp1 = __HAL_USART_GET_FLAG(husart, USART_FLAG_NE); - tmp2 = __HAL_USART_GET_IT_SOURCE(husart, USART_IT_ERR); - /* USART noise error interrupt occurred ------------------------------------*/ - if((tmp1 != RESET) && (tmp2 != RESET)) - { - __HAL_USART_CLEAR_NEFLAG(husart); - husart->ErrorCode |= HAL_USART_ERROR_NE; - } - - tmp1 = __HAL_USART_GET_FLAG(husart, USART_FLAG_ORE); - tmp2 = __HAL_USART_GET_IT_SOURCE(husart, USART_IT_ERR); - /* USART Over-Run interrupt occurred ---------------------------------------*/ - if((tmp1 != RESET) && (tmp2 != RESET)) - { - __HAL_USART_CLEAR_OREFLAG(husart); - husart->ErrorCode |= HAL_USART_ERROR_ORE; - } - - if(husart->ErrorCode != HAL_USART_ERROR_NONE) - { - /* Set the USART state ready to be able to start again the process */ - husart->State = HAL_USART_STATE_READY; - - HAL_USART_ErrorCallback(husart); - } - - tmp1 = __HAL_USART_GET_FLAG(husart, USART_FLAG_RXNE); - tmp2 = __HAL_USART_GET_IT_SOURCE(husart, USART_IT_RXNE); - /* USART in mode Receiver --------------------------------------------------*/ - if((tmp1 != RESET) && (tmp2 != RESET)) - { - if(husart->State == HAL_USART_STATE_BUSY_RX) - { - USART_Receive_IT(husart); - } - else - { - USART_TransmitReceive_IT(husart); - } - } - - tmp1 = __HAL_USART_GET_FLAG(husart, USART_FLAG_TXE); - tmp2 = __HAL_USART_GET_IT_SOURCE(husart, USART_IT_TXE); - /* USART in mode Transmitter -----------------------------------------------*/ - if((tmp1 != RESET) && (tmp2 != RESET)) - { - if(husart->State == HAL_USART_STATE_BUSY_TX) - { - USART_Transmit_IT(husart); - } - else - { - USART_TransmitReceive_IT(husart); - } - } - - tmp1 = __HAL_USART_GET_FLAG(husart, USART_FLAG_TC); - tmp2 = __HAL_USART_GET_IT_SOURCE(husart, USART_IT_TC); - /* USART in mode Transmitter (transmission end) ----------------------------*/ - if((tmp1 != RESET) && (tmp2 != RESET)) - { - USART_EndTransmit_IT(husart); - } -} - -/** - * @brief Tx Transfer completed callbacks. - * @param husart: pointer to a USART_HandleTypeDef structure that contains - * the configuration information for the specified USART module. - * @retval None - */ - __weak void HAL_USART_TxCpltCallback(USART_HandleTypeDef *husart) -{ - /* NOTE: This function Should not be modified, when the callback is needed, - the HAL_USART_TxCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Tx Half Transfer completed callbacks. - * @param husart: pointer to a USART_HandleTypeDef structure that contains - * the configuration information for the specified USART module. - * @retval None - */ - __weak void HAL_USART_TxHalfCpltCallback(USART_HandleTypeDef *husart) -{ - /* NOTE: This function Should not be modified, when the callback is needed, - the HAL_USART_TxCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Rx Transfer completed callbacks. - * @param husart: pointer to a USART_HandleTypeDef structure that contains - * the configuration information for the specified USART module. - * @retval None - */ -__weak void HAL_USART_RxCpltCallback(USART_HandleTypeDef *husart) -{ - /* NOTE: This function Should not be modified, when the callback is needed, - the HAL_USART_TxCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Rx Half Transfer completed callbacks. - * @param husart: pointer to a USART_HandleTypeDef structure that contains - * the configuration information for the specified USART module. - * @retval None - */ -__weak void HAL_USART_RxHalfCpltCallback(USART_HandleTypeDef *husart) -{ - /* NOTE: This function Should not be modified, when the callback is needed, - the HAL_USART_TxCpltCallback could be implemented in the user file - */ -} - -/** - * @brief Tx/Rx Transfers completed callback for the non-blocking process. - * @param husart: pointer to a USART_HandleTypeDef structure that contains - * the configuration information for the specified USART module. - * @retval None - */ -__weak void HAL_USART_TxRxCpltCallback(USART_HandleTypeDef *husart) -{ - /* NOTE: This function Should not be modified, when the callback is needed, - the HAL_USART_TxCpltCallback could be implemented in the user file - */ -} - -/** - * @brief USART error callbacks. - * @param husart: pointer to a USART_HandleTypeDef structure that contains - * the configuration information for the specified USART module. - * @retval None - */ - __weak void HAL_USART_ErrorCallback(USART_HandleTypeDef *husart) -{ - /* NOTE: This function Should not be modified, when the callback is needed, - the HAL_USART_ErrorCallback could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup USART_Exported_Functions_Group3 Peripheral State and Errors functions - * @brief USART State and Errors functions - * -@verbatim - ============================================================================== - ##### Peripheral State and Errors functions ##### - ============================================================================== - [..] - This subsection provides a set of functions allowing to return the State of - USART communication - process, return Peripheral Errors occurred during communication process - (+) HAL_USART_GetState() API can be helpful to check in run-time the state - of the USART peripheral. - (+) HAL_USART_GetError() check in run-time errors that could be occurred during - communication. -@endverbatim - * @{ - */ - -/** - * @brief Returns the USART state. - * @param husart: pointer to a USART_HandleTypeDef structure that contains - * the configuration information for the specified USART module. - * @retval HAL state - */ -HAL_USART_StateTypeDef HAL_USART_GetState(USART_HandleTypeDef *husart) -{ - return husart->State; -} - -/** - * @brief Return the USART error code - * @param husart : pointer to a USART_HandleTypeDef structure that contains - * the configuration information for the specified USART. - * @retval USART Error Code - */ -uint32_t HAL_USART_GetError(USART_HandleTypeDef *husart) -{ - return husart->ErrorCode; -} - -/** - * @} - */ - - -/** - * @brief DMA USART transmit process complete callback. - * @param hdma: DMA handle - * @retval None - */ -static void USART_DMATransmitCplt(DMA_HandleTypeDef *hdma) -{ - USART_HandleTypeDef* husart = ( USART_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; - /* DMA Normal mode */ - if((hdma->Instance->CR & DMA_SxCR_CIRC) == 0) - { - husart->TxXferCount = 0; - if(husart->State == HAL_USART_STATE_BUSY_TX) - { - /* Disable the DMA transfer for transmit request by resetting the DMAT bit - in the USART CR3 register */ - CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAT); - - /* Enable the USART Transmit Complete Interrupt */ - __HAL_USART_ENABLE_IT(husart, USART_IT_TC); - } - } - /* DMA Circular mode */ - else - { - if(husart->State == HAL_USART_STATE_BUSY_TX) - { - HAL_USART_TxCpltCallback(husart); - } - } -} - -/** - * @brief DMA USART transmit process half complete callback - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void USART_DMATxHalfCplt(DMA_HandleTypeDef *hdma) -{ - USART_HandleTypeDef* husart = (USART_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent; - - HAL_USART_TxHalfCpltCallback(husart); -} - -/** - * @brief DMA USART receive process complete callback. - * @param hdma: DMA handle - * @retval None - */ -static void USART_DMAReceiveCplt(DMA_HandleTypeDef *hdma) -{ - USART_HandleTypeDef* husart = ( USART_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; - /* DMA Normal mode */ - if((hdma->Instance->CR & DMA_SxCR_CIRC) == 0) - { - husart->RxXferCount = 0; - if(husart->State == HAL_USART_STATE_BUSY_RX) - { - /* Disable the DMA transfer for the Transmit/receiver requests by setting the DMAT/DMAR bit - in the USART CR3 register */ - husart->Instance->CR3 &= ~(USART_CR3_DMAR); - - husart->State= HAL_USART_STATE_READY; - HAL_USART_RxCpltCallback(husart); - } - /* The USART state is HAL_USART_STATE_BUSY_TX_RX */ - else - { - /* Disable the DMA transfer for the Transmit/receiver requests by setting the DMAT/DMAR bit - in the USART CR3 register */ - husart->Instance->CR3 &= ~(USART_CR3_DMAR); - husart->Instance->CR3 &= ~(USART_CR3_DMAT); - - husart->State= HAL_USART_STATE_READY; - HAL_USART_TxRxCpltCallback(husart); - } - } - /* DMA circular mode */ - else - { - if(husart->State == HAL_USART_STATE_BUSY_RX) - { - HAL_USART_RxCpltCallback(husart); - } - /* The USART state is HAL_USART_STATE_BUSY_TX_RX */ - else - { - HAL_USART_TxRxCpltCallback(husart); - } - } -} - -/** - * @brief DMA USART receive process half complete callback - * @param hdma: pointer to a DMA_HandleTypeDef structure that contains - * the configuration information for the specified DMA module. - * @retval None - */ -static void USART_DMARxHalfCplt(DMA_HandleTypeDef *hdma) -{ - USART_HandleTypeDef* husart = (USART_HandleTypeDef*)((DMA_HandleTypeDef*)hdma)->Parent; - - HAL_USART_RxHalfCpltCallback(husart); -} - -/** - * @brief DMA USART communication error callback. - * @param hdma: DMA handle - * @retval None - */ -static void USART_DMAError(DMA_HandleTypeDef *hdma) -{ - USART_HandleTypeDef* husart = ( USART_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent; - - husart->RxXferCount = 0; - husart->TxXferCount = 0; - husart->ErrorCode |= HAL_USART_ERROR_DMA; - husart->State= HAL_USART_STATE_READY; - - HAL_USART_ErrorCallback(husart); -} - -/** - * @brief This function handles USART Communication Timeout. - * @param husart: pointer to a USART_HandleTypeDef structure that contains - * the configuration information for the specified USART module. - * @param Flag: specifies the USART flag to check. - * @param Status: The new Flag status (SET or RESET). - * @param Timeout: Timeout duration - * @retval HAL status - */ -static HAL_StatusTypeDef USART_WaitOnFlagUntilTimeout(USART_HandleTypeDef *husart, uint32_t Flag, FlagStatus Status, uint32_t Timeout) -{ - uint32_t tickstart = 0; - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait until flag is set */ - if(Status == RESET) - { - while(__HAL_USART_GET_FLAG(husart, Flag) == RESET) - { - /* Check for the Timeout */ - if(Timeout != HAL_MAX_DELAY) - { - if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout)) - { - /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */ - __HAL_USART_DISABLE_IT(husart, USART_IT_TXE); - __HAL_USART_DISABLE_IT(husart, USART_IT_RXNE); - __HAL_USART_DISABLE_IT(husart, USART_IT_PE); - __HAL_USART_DISABLE_IT(husart, USART_IT_ERR); - - husart->State= HAL_USART_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - return HAL_TIMEOUT; - } - } - } - } - else - { - while(__HAL_USART_GET_FLAG(husart, Flag) != RESET) - { - /* Check for the Timeout */ - if(Timeout != HAL_MAX_DELAY) - { - if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout)) - { - /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */ - __HAL_USART_DISABLE_IT(husart, USART_IT_TXE); - __HAL_USART_DISABLE_IT(husart, USART_IT_RXNE); - __HAL_USART_DISABLE_IT(husart, USART_IT_PE); - __HAL_USART_DISABLE_IT(husart, USART_IT_ERR); - - husart->State= HAL_USART_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(husart); - - return HAL_TIMEOUT; - } - } - } - } - return HAL_OK; -} - - -/** - * @brief Simplex Send an amount of data in non-blocking mode. - * @param husart: pointer to a USART_HandleTypeDef structure that contains - * the configuration information for the specified USART module. - * @retval HAL status - * @note The USART errors are not managed to avoid the overrun error. - */ -static HAL_StatusTypeDef USART_Transmit_IT(USART_HandleTypeDef *husart) -{ - uint16_t* tmp; - - if(husart->State == HAL_USART_STATE_BUSY_TX) - { - if(husart->Init.WordLength == USART_WORDLENGTH_9B) - { - tmp = (uint16_t*) husart->pTxBuffPtr; - husart->Instance->DR = (uint16_t)(*tmp & (uint16_t)0x01FF); - if(husart->Init.Parity == USART_PARITY_NONE) - { - husart->pTxBuffPtr += 2; - } - else - { - husart->pTxBuffPtr += 1; - } - } - else - { - husart->Instance->DR = (uint8_t)(*husart->pTxBuffPtr++ & (uint8_t)0x00FF); - } - - if(--husart->TxXferCount == 0) - { - /* Disable the USART Transmit data register empty Interrupt */ - __HAL_USART_DISABLE_IT(husart, USART_IT_TXE); - - /* Enable the USART Transmit Complete Interrupt */ - __HAL_USART_ENABLE_IT(husart, USART_IT_TC); - } - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Wraps up transmission in non blocking mode. - * @param husart: pointer to a USART_HandleTypeDef structure that contains - * the configuration information for the specified USART module. - * @retval HAL status - */ -static HAL_StatusTypeDef USART_EndTransmit_IT(USART_HandleTypeDef *husart) -{ - /* Disable the USART Transmit Complete Interrupt */ - __HAL_USART_DISABLE_IT(husart, USART_IT_TC); - - /* Disable the USART Error Interrupt: (Frame error, noise error, overrun error) */ - __HAL_USART_DISABLE_IT(husart, USART_IT_ERR); - - husart->State = HAL_USART_STATE_READY; - - HAL_USART_TxCpltCallback(husart); - - return HAL_OK; -} - -/** - * @brief Simplex Receive an amount of data in non-blocking mode. - * @param husart: pointer to a USART_HandleTypeDef structure that contains - * the configuration information for the specified USART module. - * @retval HAL status - */ -static HAL_StatusTypeDef USART_Receive_IT(USART_HandleTypeDef *husart) -{ - uint16_t* tmp; - if(husart->State == HAL_USART_STATE_BUSY_RX) - { - if(husart->Init.WordLength == USART_WORDLENGTH_9B) - { - tmp = (uint16_t*) husart->pRxBuffPtr; - if(husart->Init.Parity == USART_PARITY_NONE) - { - *tmp = (uint16_t)(husart->Instance->DR & (uint16_t)0x01FF); - husart->pRxBuffPtr += 2; - } - else - { - *tmp = (uint16_t)(husart->Instance->DR & (uint16_t)0x00FF); - husart->pRxBuffPtr += 1; - } - if(--husart->RxXferCount != 0x00) - { - /* Send dummy byte in order to generate the clock for the slave to send the next data */ - husart->Instance->DR = (DUMMY_DATA & (uint16_t)0x01FF); - } - } - else - { - if(husart->Init.Parity == USART_PARITY_NONE) - { - *husart->pRxBuffPtr++ = (uint8_t)(husart->Instance->DR & (uint8_t)0x00FF); - } - else - { - *husart->pRxBuffPtr++ = (uint8_t)(husart->Instance->DR & (uint8_t)0x007F); - } - - if(--husart->RxXferCount != 0x00) - { - /* Send dummy byte in order to generate the clock for the slave to send the next data */ - husart->Instance->DR = (DUMMY_DATA & (uint16_t)0x00FF); - } - } - - if(husart->RxXferCount == 0) - { - /* Disable the USART RXNE Interrupt */ - __HAL_USART_DISABLE_IT(husart, USART_IT_RXNE); - - /* Disable the USART Parity Error Interrupt */ - __HAL_USART_DISABLE_IT(husart, USART_IT_PE); - - /* Disable the USART Error Interrupt: (Frame error, noise error, overrun error) */ - __HAL_USART_DISABLE_IT(husart, USART_IT_ERR); - - husart->State = HAL_USART_STATE_READY; - HAL_USART_RxCpltCallback(husart); - - return HAL_OK; - } - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Full-Duplex Send receive an amount of data in full-duplex mode (non-blocking). - * @param husart: pointer to a USART_HandleTypeDef structure that contains - * the configuration information for the specified USART module. - * @retval HAL status - */ -static HAL_StatusTypeDef USART_TransmitReceive_IT(USART_HandleTypeDef *husart) -{ - uint16_t* tmp; - - if(husart->State == HAL_USART_STATE_BUSY_TX_RX) - { - if(husart->TxXferCount != 0x00) - { - if(__HAL_USART_GET_FLAG(husart, USART_FLAG_TXE) != RESET) - { - if(husart->Init.WordLength == USART_WORDLENGTH_9B) - { - tmp = (uint16_t*) husart->pTxBuffPtr; - husart->Instance->DR = (uint16_t)(*tmp & (uint16_t)0x01FF); - if(husart->Init.Parity == USART_PARITY_NONE) - { - husart->pTxBuffPtr += 2; - } - else - { - husart->pTxBuffPtr += 1; - } - } - else - { - husart->Instance->DR = (uint8_t)(*husart->pTxBuffPtr++ & (uint8_t)0x00FF); - } - husart->TxXferCount--; - - /* Check the latest data transmitted */ - if(husart->TxXferCount == 0) - { - __HAL_USART_DISABLE_IT(husart, USART_IT_TXE); - } - } - } - - if(husart->RxXferCount != 0x00) - { - if(__HAL_USART_GET_FLAG(husart, USART_FLAG_RXNE) != RESET) - { - if(husart->Init.WordLength == USART_WORDLENGTH_9B) - { - tmp = (uint16_t*) husart->pRxBuffPtr; - if(husart->Init.Parity == USART_PARITY_NONE) - { - *tmp = (uint16_t)(husart->Instance->DR & (uint16_t)0x01FF); - husart->pRxBuffPtr += 2; - } - else - { - *tmp = (uint16_t)(husart->Instance->DR & (uint16_t)0x00FF); - husart->pRxBuffPtr += 1; - } - } - else - { - if(husart->Init.Parity == USART_PARITY_NONE) - { - *husart->pRxBuffPtr++ = (uint8_t)(husart->Instance->DR & (uint8_t)0x00FF); - } - else - { - *husart->pRxBuffPtr++ = (uint8_t)(husart->Instance->DR & (uint8_t)0x007F); - } - } - husart->RxXferCount--; - } - } - - /* Check the latest data received */ - if(husart->RxXferCount == 0) - { - __HAL_USART_DISABLE_IT(husart, USART_IT_RXNE); - - /* Disable the USART Parity Error Interrupt */ - __HAL_USART_DISABLE_IT(husart, USART_IT_PE); - - /* Disable the USART Error Interrupt: (Frame error, noise error, overrun error) */ - __HAL_USART_DISABLE_IT(husart, USART_IT_ERR); - - husart->State = HAL_USART_STATE_READY; - - HAL_USART_TxRxCpltCallback(husart); - - return HAL_OK; - } - - return HAL_OK; - } - else - { - return HAL_BUSY; - } -} - -/** - * @brief Configures the USART peripheral. - * @param husart: pointer to a USART_HandleTypeDef structure that contains - * the configuration information for the specified USART module. - * @retval None - */ -static void USART_SetConfig(USART_HandleTypeDef *husart) -{ - uint32_t tmpreg = 0x00; - - /* Check the parameters */ - assert_param(IS_USART_INSTANCE(husart->Instance)); - assert_param(IS_USART_POLARITY(husart->Init.CLKPolarity)); - assert_param(IS_USART_PHASE(husart->Init.CLKPhase)); - assert_param(IS_USART_LASTBIT(husart->Init.CLKLastBit)); - assert_param(IS_USART_BAUDRATE(husart->Init.BaudRate)); - assert_param(IS_USART_WORD_LENGTH(husart->Init.WordLength)); - assert_param(IS_USART_STOPBITS(husart->Init.StopBits)); - assert_param(IS_USART_PARITY(husart->Init.Parity)); - assert_param(IS_USART_MODE(husart->Init.Mode)); - - /* The LBCL, CPOL and CPHA bits have to be selected when both the transmitter and the - receiver are disabled (TE=RE=0) to ensure that the clock pulses function correctly. */ - husart->Instance->CR1 &= (uint32_t)~((uint32_t)(USART_CR1_TE | USART_CR1_RE)); - - /*---------------------------- USART CR2 Configuration ---------------------*/ - tmpreg = husart->Instance->CR2; - /* Clear CLKEN, CPOL, CPHA and LBCL bits */ - tmpreg &= (uint32_t)~((uint32_t)(USART_CR2_CPHA | USART_CR2_CPOL | USART_CR2_CLKEN | USART_CR2_LBCL | USART_CR2_STOP)); - /* Configure the USART Clock, CPOL, CPHA and LastBit -----------------------*/ - /* Set CPOL bit according to husart->Init.CLKPolarity value */ - /* Set CPHA bit according to husart->Init.CLKPhase value */ - /* Set LBCL bit according to husart->Init.CLKLastBit value */ - /* Set Stop Bits: Set STOP[13:12] bits according to husart->Init.StopBits value */ - tmpreg |= (uint32_t)(USART_CLOCK_ENABLE| husart->Init.CLKPolarity | - husart->Init.CLKPhase| husart->Init.CLKLastBit | husart->Init.StopBits); - /* Write to USART CR2 */ - husart->Instance->CR2 = (uint32_t)tmpreg; - - /*-------------------------- USART CR1 Configuration -----------------------*/ - tmpreg = husart->Instance->CR1; - - /* Clear M, PCE, PS, TE, RE and OVER8 bits */ - tmpreg &= (uint32_t)~((uint32_t)(USART_CR1_M | USART_CR1_PCE | USART_CR1_PS | USART_CR1_TE | \ - USART_CR1_RE | USART_CR1_OVER8)); - - /* Configure the USART Word Length, Parity and mode: - Set the M bits according to husart->Init.WordLength value - Set PCE and PS bits according to husart->Init.Parity value - Set TE and RE bits according to husart->Init.Mode value - Force OVER8 bit to 1 in order to reach the max USART frequencies */ - tmpreg |= (uint32_t)husart->Init.WordLength | husart->Init.Parity | husart->Init.Mode | USART_CR1_OVER8; - - /* Write to USART CR1 */ - husart->Instance->CR1 = (uint32_t)tmpreg; - - /*-------------------------- USART CR3 Configuration -----------------------*/ - /* Clear CTSE and RTSE bits */ - husart->Instance->CR3 &= (uint32_t)~((uint32_t)(USART_CR3_RTSE | USART_CR3_CTSE)); - - /*-------------------------- USART BRR Configuration -----------------------*/ - if((husart->Instance == USART1) || (husart->Instance == USART6)) - { - husart->Instance->BRR = USART_BRR(HAL_RCC_GetPCLK2Freq(), husart->Init.BaudRate); - } - else - { - husart->Instance->BRR = USART_BRR(HAL_RCC_GetPCLK1Freq(), husart->Init.BaudRate); - } -} - -/** - * @} - */ - -#endif /* HAL_USART_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_wwdg.c b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_wwdg.c deleted file mode 100755 index 15d99b0c..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_wwdg.c +++ /dev/null @@ -1,454 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_hal_wwdg.c - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief WWDG HAL module driver. - * This file provides firmware functions to manage the following - * functionalities of the Window Watchdog (WWDG) peripheral: - * + Initialization and de-initialization functions - * + IO operation functions - * + Peripheral State functions - @verbatim - ============================================================================== - ##### WWDG specific features ##### - ============================================================================== - [..] - Once enabled the WWDG generates a system reset on expiry of a programmed - time period, unless the program refreshes the counter (downcounter) - before reaching 0x3F value (i.e. a reset is generated when the counter - value rolls over from 0x40 to 0x3F). - - (+) An MCU reset is also generated if the counter value is refreshed - before the counter has reached the refresh window value. This - implies that the counter must be refreshed in a limited window. - (+) Once enabled the WWDG cannot be disabled except by a system reset. - (+) WWDGRST flag in RCC_CSR register can be used to inform when a WWDG - reset occurs. - (+) The WWDG counter input clock is derived from the APB clock divided - by a programmable prescaler. - (+) WWDG clock (Hz) = PCLK1 / (4096 * Prescaler) - (+) WWDG timeout (mS) = 1000 * Counter / WWDG clock - (+) WWDG Counter refresh is allowed between the following limits : - (++) min time (mS) = 1000 * (Counter _ Window) / WWDG clock - (++) max time (mS) = 1000 * (Counter _ 0x40) / WWDG clock - - (+) Min-max timeout value at 50 MHz(PCLK1): 81.9 us / 41.9 ms - - - ##### How to use this driver ##### - ============================================================================== - [..] - (+) Enable WWDG APB1 clock using __HAL_RCC_WWDG_CLK_ENABLE(). - (+) Set the WWDG prescaler, refresh window and counter value - using HAL_WWDG_Init() function. - (+) Start the WWDG using HAL_WWDG_Start() function. - When the WWDG is enabled the counter value should be configured to - a value greater than 0x40 to prevent generating an immediate reset. - (+) Optionally you can enable the Early Wakeup Interrupt (EWI) which is - generated when the counter reaches 0x40, and then start the WWDG using - HAL_WWDG_Start_IT(). At EWI HAL_WWDG_WakeupCallback is executed and user can - add his own code by customization of function pointer HAL_WWDG_WakeupCallback - Once enabled, EWI interrupt cannot be disabled except by a system reset. - (+) Then the application program must refresh the WWDG counter at regular - intervals during normal operation to prevent an MCU reset, using - HAL_WWDG_Refresh() function. This operation must occur only when - the counter is lower than the refresh window value already programmed. - - *** WWDG HAL driver macros list *** - ================================== - [..] - Below the list of most used macros in WWDG HAL driver. - - (+) __HAL_WWDG_ENABLE: Enable the WWDG peripheral - (+) __HAL_WWDG_GET_FLAG: Get the selected WWDG's flag status - (+) __HAL_WWDG_CLEAR_FLAG: Clear the WWDG's pending flags - (+) __HAL_WWDG_ENABLE_IT: Enables the WWDG early wake-up interrupt - - @endverbatim - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal.h" - -/** @addtogroup STM32F2xx_HAL_Driver - * @{ - */ - -/** @defgroup WWDG WWDG - * @brief WWDG HAL module driver. - * @{ - */ - -#ifdef HAL_WWDG_MODULE_ENABLED - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Exported functions --------------------------------------------------------*/ -/** @defgroup WWDG_Exported_Functions WWDG Exported Functions - * @{ - */ - -/** @defgroup WWDG_Exported_Functions_Group1 Initialization and de-initialization functions - * @brief Initialization and Configuration functions. - * -@verbatim - ============================================================================== - ##### Initialization and de-initialization functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize the WWDG according to the specified parameters - in the WWDG_InitTypeDef and create the associated handle - (+) DeInitialize the WWDG peripheral - (+) Initialize the WWDG MSP - (+) DeInitialize the WWDG MSP - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the WWDG according to the specified - * parameters in the WWDG_InitTypeDef and creates the associated handle. - * @param hwwdg: pointer to a WWDG_HandleTypeDef structure that contains - * the configuration information for the specified WWDG module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_WWDG_Init(WWDG_HandleTypeDef *hwwdg) -{ - /* Check the WWDG handle allocation */ - if(hwwdg == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_WWDG_ALL_INSTANCE(hwwdg->Instance)); - assert_param(IS_WWDG_PRESCALER(hwwdg->Init.Prescaler)); - assert_param(IS_WWDG_WINDOW(hwwdg->Init.Window)); - assert_param(IS_WWDG_COUNTER(hwwdg->Init.Counter)); - - if(hwwdg->State == HAL_WWDG_STATE_RESET) - { - /* Allocate lock resource and initialize it */ - hwwdg->Lock = HAL_UNLOCKED; - /* Init the low level hardware */ - HAL_WWDG_MspInit(hwwdg); - } - - /* Change WWDG peripheral state */ - hwwdg->State = HAL_WWDG_STATE_BUSY; - - /* Set WWDG Prescaler and Window */ - MODIFY_REG(hwwdg->Instance->CFR, (WWDG_CFR_WDGTB | WWDG_CFR_W), (hwwdg->Init.Prescaler | hwwdg->Init.Window)); - /* Set WWDG Counter */ - MODIFY_REG(hwwdg->Instance->CR, WWDG_CR_T, hwwdg->Init.Counter); - - /* Change WWDG peripheral state */ - hwwdg->State = HAL_WWDG_STATE_READY; - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief DeInitializes the WWDG peripheral. - * @param hwwdg: pointer to a WWDG_HandleTypeDef structure that contains - * the configuration information for the specified WWDG module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_WWDG_DeInit(WWDG_HandleTypeDef *hwwdg) -{ - /* Check the WWDG handle allocation */ - if(hwwdg == NULL) - { - return HAL_ERROR; - } - - /* Check the parameters */ - assert_param(IS_WWDG_ALL_INSTANCE(hwwdg->Instance)); - - /* Change WWDG peripheral state */ - hwwdg->State = HAL_WWDG_STATE_BUSY; - - /* DeInit the low level hardware */ - HAL_WWDG_MspDeInit(hwwdg); - - /* Reset WWDG Control register */ - hwwdg->Instance->CR = (uint32_t)0x0000007F; - - /* Reset WWDG Configuration register */ - hwwdg->Instance->CFR = (uint32_t)0x0000007F; - - /* Reset WWDG Status register */ - hwwdg->Instance->SR = 0; - - /* Change WWDG peripheral state */ - hwwdg->State = HAL_WWDG_STATE_RESET; - - /* Release Lock */ - __HAL_UNLOCK(hwwdg); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Initializes the WWDG MSP. - * @param hwwdg: pointer to a WWDG_HandleTypeDef structure that contains - * the configuration information for the specified WWDG module. - * @retval None - */ -__weak void HAL_WWDG_MspInit(WWDG_HandleTypeDef *hwwdg) -{ - /* NOTE: This function Should not be modified, when the callback is needed, - the HAL_WWDG_MspInit could be implemented in the user file - */ -} - -/** - * @brief DeInitializes the WWDG MSP. - * @param hwwdg: pointer to a WWDG_HandleTypeDef structure that contains - * the configuration information for the specified WWDG module. - * @retval None - */ -__weak void HAL_WWDG_MspDeInit(WWDG_HandleTypeDef *hwwdg) -{ - /* NOTE: This function Should not be modified, when the callback is needed, - the HAL_WWDG_MspDeInit could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup WWDG_Exported_Functions_Group2 IO operation functions - * @brief IO operation functions - * -@verbatim - ============================================================================== - ##### IO operation functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Start the WWDG. - (+) Refresh the WWDG. - (+) Handle WWDG interrupt request. - -@endverbatim - * @{ - */ - -/** - * @brief Starts the WWDG. - * @param hwwdg: pointer to a WWDG_HandleTypeDef structure that contains - * the configuration information for the specified WWDG module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_WWDG_Start(WWDG_HandleTypeDef *hwwdg) -{ - /* Process Locked */ - __HAL_LOCK(hwwdg); - - /* Change WWDG peripheral state */ - hwwdg->State = HAL_WWDG_STATE_BUSY; - - /* Enable the peripheral */ - __HAL_WWDG_ENABLE(hwwdg); - - /* Change WWDG peripheral state */ - hwwdg->State = HAL_WWDG_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hwwdg); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Starts the WWDG with interrupt enabled. - * @param hwwdg: pointer to a WWDG_HandleTypeDef structure that contains - * the configuration information for the specified WWDG module. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_WWDG_Start_IT(WWDG_HandleTypeDef *hwwdg) -{ - /* Process Locked */ - __HAL_LOCK(hwwdg); - - /* Change WWDG peripheral state */ - hwwdg->State = HAL_WWDG_STATE_BUSY; - - /* Enable the Early Wakeup Interrupt */ - __HAL_WWDG_ENABLE_IT(hwwdg, WWDG_IT_EWI); - - /* Enable the peripheral */ - __HAL_WWDG_ENABLE(hwwdg); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Refreshes the WWDG. - * @param hwwdg: pointer to a WWDG_HandleTypeDef structure that contains - * the configuration information for the specified WWDG module. - * @param Counter: value of counter to put in WWDG counter - * @retval HAL status - */ -HAL_StatusTypeDef HAL_WWDG_Refresh(WWDG_HandleTypeDef *hwwdg, uint32_t Counter) -{ - /* Process Locked */ - __HAL_LOCK(hwwdg); - - /* Change WWDG peripheral state */ - hwwdg->State = HAL_WWDG_STATE_BUSY; - - /* Check the parameters */ - assert_param(IS_WWDG_COUNTER(Counter)); - - /* Write to WWDG CR the WWDG Counter value to refresh with */ - MODIFY_REG(hwwdg->Instance->CR, (uint32_t)WWDG_CR_T, Counter); - - /* Change WWDG peripheral state */ - hwwdg->State = HAL_WWDG_STATE_READY; - - /* Process Unlocked */ - __HAL_UNLOCK(hwwdg); - - /* Return function status */ - return HAL_OK; -} - -/** - * @brief Handles WWDG interrupt request. - * @note The Early Wakeup Interrupt (EWI) can be used if specific safety operations - * or data logging must be performed before the actual reset is generated. - * The EWI interrupt is enabled using __HAL_WWDG_ENABLE_IT() macro. - * When the downcounter reaches the value 0x40, and EWI interrupt is - * generated and the corresponding Interrupt Service Routine (ISR) can - * be used to trigger specific actions (such as communications or data - * logging), before resetting the device. - * @param hwwdg: pointer to a WWDG_HandleTypeDef structure that contains - * the configuration information for the specified WWDG module. - * @retval None - */ -void HAL_WWDG_IRQHandler(WWDG_HandleTypeDef *hwwdg) -{ - /* Check if Early Wakeup Interrupt is enable */ - if(__HAL_WWDG_GET_IT_SOURCE(hwwdg, WWDG_IT_EWI) != RESET) - { - /* Check if WWDG Early Wakeup Interrupt occurred */ - if(__HAL_WWDG_GET_FLAG(hwwdg, WWDG_FLAG_EWIF) != RESET) - { - /* Early Wakeup callback */ - HAL_WWDG_WakeupCallback(hwwdg); - - /* Change WWDG peripheral state */ - hwwdg->State = HAL_WWDG_STATE_READY; - - /* Clear the WWDG Early Wakeup flag */ - __HAL_WWDG_CLEAR_FLAG(hwwdg, WWDG_FLAG_EWIF); - - /* Process Unlocked */ - __HAL_UNLOCK(hwwdg); - } - } -} - -/** - * @brief Early Wakeup WWDG callback. - * @param hwwdg: pointer to a WWDG_HandleTypeDef structure that contains - * the configuration information for the specified WWDG module. - * @retval None - */ -__weak void HAL_WWDG_WakeupCallback(WWDG_HandleTypeDef* hwwdg) -{ - /* NOTE: This function Should not be modified, when the callback is needed, - the HAL_WWDG_WakeupCallback could be implemented in the user file - */ -} - -/** - * @} - */ - -/** @defgroup WWDG_Exported_Functions_Group3 Peripheral State functions - * @brief Peripheral State functions. - * -@verbatim - ============================================================================== - ##### Peripheral State functions ##### - ============================================================================== - [..] - This subsection permits to get in run-time the status of the peripheral - and the data flow. - -@endverbatim - * @{ - */ - -/** - * @brief Returns the WWDG state. - * @param hwwdg: pointer to a WWDG_HandleTypeDef structure that contains - * the configuration information for the specified WWDG module. - * @retval HAL state - */ -HAL_WWDG_StateTypeDef HAL_WWDG_GetState(WWDG_HandleTypeDef *hwwdg) -{ - return hwwdg->State; -} - -/** - * @} - */ - -/** - * @} - */ - -#endif /* HAL_WWDG_MODULE_ENABLED */ -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_fsmc.c b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_fsmc.c deleted file mode 100755 index 36719a34..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_fsmc.c +++ /dev/null @@ -1,954 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_ll_fsmc.c - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief FSMC Low Layer HAL module driver. - * - * This file provides firmware functions to manage the following - * functionalities of the Flexible Static Memory Controller (FSMC) peripheral memories: - * + Initialization/de-initialization functions - * + Peripheral Control functions - * + Peripheral State functions - * - @verbatim - ============================================================================== - ##### FSMC peripheral features ##### - ============================================================================== - [..] The Flexible static memory controller (FSMC) includes two memory controllers: - (+) The NOR/PSRAM memory controller - (+) The NAND/PC Card memory controller - - [..] The FSMC functional block makes the interface with synchronous and asynchronous static - memories and 16-bit PC memory cards. Its main purposes are: - (+) to translate AHB transactions into the appropriate external device protocol. - (+) to meet the access time requirements of the external memory devices. - - [..] All external memories share the addresses, data and control signals with the controller. - Each external device is accessed by means of a unique Chip Select. The FSMC performs - only one access at a time to an external device. - The main features of the FSMC controller are the following: - (+) Interface with static-memory mapped devices including: - (++) Static random access memory (SRAM). - (++) Read-only memory (ROM). - (++) NOR Flash memory/OneNAND Flash memory. - (++) PSRAM (4 memory banks). - (++) 16-bit PC Card compatible devices. - (++) Two banks of NAND Flash memory with ECC hardware to check up to 8 Kbytes of - data. - (+) Independent Chip Select control for each memory bank. - (+) Independent configuration for each memory bank. - - @endverbatim - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal.h" - -/** @addtogroup STM32F2xx_HAL_Driver - * @{ - */ - -/** @defgroup FSMC_LL FSMC Low Layer - * @brief FSMC driver modules - * @{ - */ - -#if defined (HAL_SRAM_MODULE_ENABLED) || defined(HAL_NOR_MODULE_ENABLED) || defined(HAL_NAND_MODULE_ENABLED) || defined(HAL_PCCARD_MODULE_ENABLED) - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/** @addtogroup FSMC_LL_Private_Functions - * @{ - */ - -/** @addtogroup FSMC_LL_NORSRAM - * @brief NORSRAM Controller functions - * - @verbatim - ============================================================================== - ##### How to use NORSRAM device driver ##### - ============================================================================== - - [..] - This driver contains a set of APIs to interface with the FSMC NORSRAM banks in order - to run the NORSRAM external devices. - - (+) FSMC NORSRAM bank reset using the function FSMC_NORSRAM_DeInit() - (+) FSMC NORSRAM bank control configuration using the function FSMC_NORSRAM_Init() - (+) FSMC NORSRAM bank timing configuration using the function FSMC_NORSRAM_Timing_Init() - (+) FSMC NORSRAM bank extended timing configuration using the function - FSMC_NORSRAM_Extended_Timing_Init() - (+) FSMC NORSRAM bank enable/disable write operation using the functions - FSMC_NORSRAM_WriteOperation_Enable()/FSMC_NORSRAM_WriteOperation_Disable() - -@endverbatim - * @{ - */ - -/** @addtogroup FSMC_LL_NORSRAM_Private_Functions_Group1 - * @brief Initialization and Configuration functions - * - @verbatim - ============================================================================== - ##### Initialization and de_initialization functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure the FSMC NORSRAM interface - (+) De-initialize the FSMC NORSRAM interface - (+) Configure the FSMC clock and associated GPIOs - -@endverbatim - * @{ - */ - -/** - * @brief Initialize the FSMC_NORSRAM device according to the specified - * control parameters in the FSMC_NORSRAM_InitTypeDef - * @param Device: Pointer to NORSRAM device instance - * @param Init: Pointer to NORSRAM Initialization structure - * @retval HAL status - */ -HAL_StatusTypeDef FSMC_NORSRAM_Init(FSMC_NORSRAM_TypeDef *Device, FSMC_NORSRAM_InitTypeDef* Init) -{ - uint32_t tmpr = 0; - - /* Check the parameters */ - assert_param(IS_FSMC_NORSRAM_BANK(Init->NSBank)); - assert_param(IS_FSMC_MUX(Init->DataAddressMux)); - assert_param(IS_FSMC_MEMORY(Init->MemoryType)); - assert_param(IS_FSMC_NORSRAM_MEMORY_WIDTH(Init->MemoryDataWidth)); - assert_param(IS_FSMC_BURSTMODE(Init->BurstAccessMode)); - assert_param(IS_FSMC_WAIT_POLARITY(Init->WaitSignalPolarity)); - assert_param(IS_FSMC_WRAP_MODE(Init->WrapMode)); - assert_param(IS_FSMC_WAIT_SIGNAL_ACTIVE(Init->WaitSignalActive)); - assert_param(IS_FSMC_WRITE_OPERATION(Init->WriteOperation)); - assert_param(IS_FSMC_WAITE_SIGNAL(Init->WaitSignal)); - assert_param(IS_FSMC_EXTENDED_MODE(Init->ExtendedMode)); - assert_param(IS_FSMC_ASYNWAIT(Init->AsynchronousWait)); - assert_param(IS_FSMC_WRITE_BURST(Init->WriteBurst)); - - /* Get the BTCR register value */ - tmpr = Device->BTCR[Init->NSBank]; - - /* Clear MBKEN, MUXEN, MTYP, MWID, FACCEN, BURSTEN, WAITPOL, WRAPMOD, WAITCFG, WREN, - WAITEN, EXTMOD, ASYNCWAIT, CBURSTRW and CCLKEN bits */ - tmpr &= ((uint32_t)~(FSMC_BCR1_MBKEN | FSMC_BCR1_MUXEN | FSMC_BCR1_MTYP | \ - FSMC_BCR1_MWID | FSMC_BCR1_FACCEN | FSMC_BCR1_BURSTEN | \ - FSMC_BCR1_WAITPOL | FSMC_BCR1_WRAPMOD | FSMC_BCR1_WAITCFG | \ - FSMC_BCR1_WREN | FSMC_BCR1_WAITEN | FSMC_BCR1_EXTMOD | \ - FSMC_BCR1_ASYNCWAIT | FSMC_BCR1_CBURSTRW)); - /* Set NORSRAM device control parameters */ - tmpr |= (uint32_t)(Init->DataAddressMux |\ - Init->MemoryType |\ - Init->MemoryDataWidth |\ - Init->BurstAccessMode |\ - Init->WaitSignalPolarity |\ - Init->WrapMode |\ - Init->WaitSignalActive |\ - Init->WriteOperation |\ - Init->WaitSignal |\ - Init->ExtendedMode |\ - Init->AsynchronousWait |\ - Init->WriteBurst - ); - - if(Init->MemoryType == FSMC_MEMORY_TYPE_NOR) - { - tmpr |= (uint32_t)FSMC_NORSRAM_FLASH_ACCESS_ENABLE; - } - - Device->BTCR[Init->NSBank] = tmpr; - - return HAL_OK; -} - -/** - * @brief DeInitialize the FSMC_NORSRAM peripheral - * @param Device: Pointer to NORSRAM device instance - * @param ExDevice: Pointer to NORSRAM extended mode device instance - * @param Bank: NORSRAM bank number - * @retval HAL status - */ -HAL_StatusTypeDef FSMC_NORSRAM_DeInit(FSMC_NORSRAM_TypeDef *Device, FSMC_NORSRAM_EXTENDED_TypeDef *ExDevice, uint32_t Bank) -{ - /* Check the parameters */ - assert_param(IS_FSMC_NORSRAM_DEVICE(Device)); - assert_param(IS_FSMC_NORSRAM_EXTENDED_DEVICE(ExDevice)); - - /* Disable the FSMC_NORSRAM device */ - __FSMC_NORSRAM_DISABLE(Device, Bank); - - /* De-initialize the FSMC_NORSRAM device */ - /* FSMC_NORSRAM_BANK1 */ - if(Bank == FSMC_NORSRAM_BANK1) - { - Device->BTCR[Bank] = 0x000030DB; - } - /* FSMC_NORSRAM_BANK2, FSMC_NORSRAM_BANK3 or FSMC_NORSRAM_BANK4 */ - else - { - Device->BTCR[Bank] = 0x000030D2; - } - - Device->BTCR[Bank + 1] = 0x0FFFFFFF; - ExDevice->BWTR[Bank] = 0x0FFFFFFF; - - return HAL_OK; -} - - -/** - * @brief Initialize the FSMC_NORSRAM Timing according to the specified - * parameters in the FSMC_NORSRAM_TimingTypeDef - * @param Device: Pointer to NORSRAM device instance - * @param Timing: Pointer to NORSRAM Timing structure - * @param Bank: NORSRAM bank number - * @retval HAL status - */ -HAL_StatusTypeDef FSMC_NORSRAM_Timing_Init(FSMC_NORSRAM_TypeDef *Device, FSMC_NORSRAM_TimingTypeDef *Timing, uint32_t Bank) -{ - uint32_t tmpr = 0; - - /* Check the parameters */ - assert_param(IS_FSMC_ADDRESS_SETUP_TIME(Timing->AddressSetupTime)); - assert_param(IS_FSMC_ADDRESS_HOLD_TIME(Timing->AddressHoldTime)); - assert_param(IS_FSMC_DATASETUP_TIME(Timing->DataSetupTime)); - assert_param(IS_FSMC_TURNAROUND_TIME(Timing->BusTurnAroundDuration)); - assert_param(IS_FSMC_CLK_DIV(Timing->CLKDivision)); - assert_param(IS_FSMC_DATA_LATENCY(Timing->DataLatency)); - assert_param(IS_FSMC_ACCESS_MODE(Timing->AccessMode)); - - /* Get the BTCR register value */ - tmpr = Device->BTCR[Bank + 1]; - - /* Clear ADDSET, ADDHLD, DATAST, BUSTURN, CLKDIV, DATLAT and ACCMOD bits */ - tmpr &= ((uint32_t)~(FSMC_BTR1_ADDSET | FSMC_BTR1_ADDHLD | FSMC_BTR1_DATAST | \ - FSMC_BTR1_BUSTURN | FSMC_BTR1_CLKDIV | FSMC_BTR1_DATLAT | \ - FSMC_BTR1_ACCMOD)); - - /* Set FSMC_NORSRAM device timing parameters */ - tmpr |= (uint32_t)(Timing->AddressSetupTime |\ - ((Timing->AddressHoldTime) << 4) |\ - ((Timing->DataSetupTime) << 8) |\ - ((Timing->BusTurnAroundDuration) << 16) |\ - (((Timing->CLKDivision)-1) << 20) |\ - (((Timing->DataLatency)-2) << 24) |\ - (Timing->AccessMode)); - - Device->BTCR[Bank + 1] = tmpr; - - return HAL_OK; -} - -/** - * @brief Initialize the FSMC_NORSRAM Extended mode Timing according to the specified - * parameters in the FSMC_NORSRAM_TimingTypeDef - * @param Device: Pointer to NORSRAM device instance - * @param Timing: Pointer to NORSRAM Timing structure - * @param Bank: NORSRAM bank number - * @retval HAL status - */ -HAL_StatusTypeDef FSMC_NORSRAM_Extended_Timing_Init(FSMC_NORSRAM_EXTENDED_TypeDef *Device, FSMC_NORSRAM_TimingTypeDef *Timing, uint32_t Bank, uint32_t ExtendedMode) -{ - uint32_t tmpr = 0; - - /* Set NORSRAM device timing register for write configuration, if extended mode is used */ - if(ExtendedMode == FSMC_EXTENDED_MODE_ENABLE) - { - /* Check the parameters */ - assert_param(IS_FSMC_ADDRESS_SETUP_TIME(Timing->AddressSetupTime)); - assert_param(IS_FSMC_ADDRESS_HOLD_TIME(Timing->AddressHoldTime)); - assert_param(IS_FSMC_DATASETUP_TIME(Timing->DataSetupTime)); - assert_param(IS_FSMC_TURNAROUND_TIME(Timing->BusTurnAroundDuration)); - assert_param(IS_FSMC_CLK_DIV(Timing->CLKDivision)); - assert_param(IS_FSMC_DATA_LATENCY(Timing->DataLatency)); - assert_param(IS_FSMC_ACCESS_MODE(Timing->AccessMode)); - - /* Get the BWTR register value */ - tmpr = Device->BWTR[Bank]; - - /* Clear ADDSET, ADDHLD, DATAST, BUSTURN, CLKDIV, DATLAT and ACCMOD bits */ - tmpr &= ((uint32_t)~(FSMC_BWTR1_ADDSET | FSMC_BWTR1_ADDHLD | FSMC_BWTR1_DATAST | \ - FSMC_BWTR1_BUSTURN | FSMC_BWTR1_CLKDIV | FSMC_BWTR1_DATLAT | \ - FSMC_BWTR1_ACCMOD)); - - tmpr |= (uint32_t)(Timing->AddressSetupTime |\ - ((Timing->AddressHoldTime) << 4) |\ - ((Timing->DataSetupTime) << 8) |\ - ((Timing->BusTurnAroundDuration) << 16) |\ - (((Timing->CLKDivision)-1) << 20) |\ - (((Timing->DataLatency)-2) << 24) |\ - (Timing->AccessMode)); - - Device->BWTR[Bank] = tmpr; - } - else - { - Device->BWTR[Bank] = 0x0FFFFFFF; - } - - return HAL_OK; -} -/** - * @} - */ - -/** @addtogroup FSMC_LL_NORSRAM_Private_Functions_Group2 - * @brief management functions - * -@verbatim - ============================================================================== - ##### FSMC_NORSRAM Control functions ##### - ============================================================================== - [..] - This subsection provides a set of functions allowing to control dynamically - the FSMC NORSRAM interface. - -@endverbatim - * @{ - */ - -/** - * @brief Enables dynamically FSMC_NORSRAM write operation. - * @param Device: Pointer to NORSRAM device instance - * @param Bank: NORSRAM bank number - * @retval HAL status - */ -HAL_StatusTypeDef FSMC_NORSRAM_WriteOperation_Enable(FSMC_NORSRAM_TypeDef *Device, uint32_t Bank) -{ - /* Enable write operation */ - Device->BTCR[Bank] |= FSMC_WRITE_OPERATION_ENABLE; - - return HAL_OK; -} - -/** - * @brief Disables dynamically FSMC_NORSRAM write operation. - * @param Device: Pointer to NORSRAM device instance - * @param Bank: NORSRAM bank number - * @retval HAL status - */ -HAL_StatusTypeDef FSMC_NORSRAM_WriteOperation_Disable(FSMC_NORSRAM_TypeDef *Device, uint32_t Bank) -{ - /* Disable write operation */ - Device->BTCR[Bank] &= ~FSMC_WRITE_OPERATION_ENABLE; - - return HAL_OK; -} -/** - * @} - */ - -/** - * @} - */ - -/** @addtogroup FSMC_LL_NAND - * @brief NAND Controller functions - * - @verbatim - ============================================================================== - ##### How to use NAND device driver ##### - ============================================================================== - [..] - This driver contains a set of APIs to interface with the FSMC NAND banks in order - to run the NAND external devices. - - (+) FSMC NAND bank reset using the function FSMC_NAND_DeInit() - (+) FSMC NAND bank control configuration using the function FSMC_NAND_Init() - (+) FSMC NAND bank common space timing configuration using the function - FSMC_NAND_CommonSpace_Timing_Init() - (+) FSMC NAND bank attribute space timing configuration using the function - FSMC_NAND_AttributeSpace_Timing_Init() - (+) FSMC NAND bank enable/disable ECC correction feature using the functions - FSMC_NAND_ECC_Enable()/FSMC_NAND_ECC_Disable() - (+) FSMC NAND bank get ECC correction code using the function FSMC_NAND_GetECC() - -@endverbatim - * @{ - */ - -/** @addtogroup FSMC_LL_NAND_Private_Functions_Group1 - * @brief Initialization and Configuration functions - * -@verbatim - ============================================================================== - ##### Initialization and de_initialization functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure the FSMC NAND interface - (+) De-initialize the FSMC NAND interface - (+) Configure the FSMC clock and associated GPIOs - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the FSMC_NAND device according to the specified - * control parameters in the FSMC_NAND_HandleTypeDef - * @param Device: Pointer to NAND device instance - * @param Init: Pointer to NAND Initialization structure - * @retval HAL status - */ -HAL_StatusTypeDef FSMC_NAND_Init(FSMC_NAND_TypeDef *Device, FSMC_NAND_InitTypeDef *Init) -{ - uint32_t tmpr = 0; - - /* Check the parameters */ - assert_param(IS_FSMC_NAND_BANK(Init->NandBank)); - assert_param(IS_FSMC_WAIT_FEATURE(Init->Waitfeature)); - assert_param(IS_FSMC_NAND_MEMORY_WIDTH(Init->MemoryDataWidth)); - assert_param(IS_FSMC_ECC_STATE(Init->EccComputation)); - assert_param(IS_FSMC_ECCPAGE_SIZE(Init->ECCPageSize)); - assert_param(IS_FSMC_TCLR_TIME(Init->TCLRSetupTime)); - assert_param(IS_FSMC_TAR_TIME(Init->TARSetupTime)); - - if(Init->NandBank == FSMC_NAND_BANK2) - { - /* Get the NAND bank 2 register value */ - tmpr = Device->PCR2; - } - else - { - /* Get the NAND bank 3 register value */ - tmpr = Device->PCR3; - } - - /* Clear PWAITEN, PBKEN, PTYP, PWID, ECCEN, TCLR, TAR and ECCPS bits */ - tmpr &= ((uint32_t)~(FSMC_PCR2_PWAITEN | FSMC_PCR2_PBKEN | FSMC_PCR2_PTYP | \ - FSMC_PCR2_PWID | FSMC_PCR2_ECCEN | FSMC_PCR2_TCLR | \ - FSMC_PCR2_TAR | FSMC_PCR2_ECCPS)); - - /* Set NAND device control parameters */ - tmpr |= (uint32_t)(Init->Waitfeature |\ - FSMC_PCR_MEMORY_TYPE_NAND |\ - Init->MemoryDataWidth |\ - Init->EccComputation |\ - Init->ECCPageSize |\ - ((Init->TCLRSetupTime) << 9) |\ - ((Init->TARSetupTime) << 13)); - - if(Init->NandBank == FSMC_NAND_BANK2) - { - /* NAND bank 2 registers configuration */ - Device->PCR2 = tmpr; - } - else - { - /* NAND bank 3 registers configuration */ - Device->PCR3 = tmpr; - } - - return HAL_OK; -} - -/** - * @brief Initializes the FSMC_NAND Common space Timing according to the specified - * parameters in the FSMC_NAND_PCC_TimingTypeDef - * @param Device: Pointer to NAND device instance - * @param Timing: Pointer to NAND timing structure - * @param Bank: NAND bank number - * @retval HAL status - */ -HAL_StatusTypeDef FSMC_NAND_CommonSpace_Timing_Init(FSMC_NAND_TypeDef *Device, FSMC_NAND_PCC_TimingTypeDef *Timing, uint32_t Bank) -{ - uint32_t tmpr = 0; - - /* Check the parameters */ - assert_param(IS_FSMC_SETUP_TIME(Timing->SetupTime)); - assert_param(IS_FSMC_WAIT_TIME(Timing->WaitSetupTime)); - assert_param(IS_FSMC_HOLD_TIME(Timing->HoldSetupTime)); - assert_param(IS_FSMC_HIZ_TIME(Timing->HiZSetupTime)); - - if(Bank == FSMC_NAND_BANK2) - { - /* Get the NAND bank 2 register value */ - tmpr = Device->PMEM2; - } - else - { - /* Get the NAND bank 3 register value */ - tmpr = Device->PMEM3; - } - - /* Clear MEMSETx, MEMWAITx, MEMHOLDx and MEMHIZx bits */ - tmpr &= ((uint32_t)~(FSMC_PMEM2_MEMSET2 | FSMC_PMEM2_MEMWAIT2 | FSMC_PMEM2_MEMHOLD2 | \ - FSMC_PMEM2_MEMHIZ2)); - - /* Set FSMC_NAND device timing parameters */ - tmpr |= (uint32_t)(Timing->SetupTime |\ - ((Timing->WaitSetupTime) << 8) |\ - ((Timing->HoldSetupTime) << 16) |\ - ((Timing->HiZSetupTime) << 24) - ); - - if(Bank == FSMC_NAND_BANK2) - { - /* NAND bank 2 registers configuration */ - Device->PMEM2 = tmpr; - } - else - { - /* NAND bank 3 registers configuration */ - Device->PMEM3 = tmpr; - } - - return HAL_OK; -} - -/** - * @brief Initializes the FSMC_NAND Attribute space Timing according to the specified - * parameters in the FSMC_NAND_PCC_TimingTypeDef - * @param Device: Pointer to NAND device instance - * @param Timing: Pointer to NAND timing structure - * @param Bank: NAND bank number - * @retval HAL status - */ -HAL_StatusTypeDef FSMC_NAND_AttributeSpace_Timing_Init(FSMC_NAND_TypeDef *Device, FSMC_NAND_PCC_TimingTypeDef *Timing, uint32_t Bank) -{ - uint32_t tmpr = 0; - - /* Check the parameters */ - assert_param(IS_FSMC_SETUP_TIME(Timing->SetupTime)); - assert_param(IS_FSMC_WAIT_TIME(Timing->WaitSetupTime)); - assert_param(IS_FSMC_HOLD_TIME(Timing->HoldSetupTime)); - assert_param(IS_FSMC_HIZ_TIME(Timing->HiZSetupTime)); - - if(Bank == FSMC_NAND_BANK2) - { - /* Get the NAND bank 2 register value */ - tmpr = Device->PATT2; - } - else - { - /* Get the NAND bank 3 register value */ - tmpr = Device->PATT3; - } - - /* Clear ATTSETx, ATTWAITx, ATTHOLDx and ATTHIZx bits */ - tmpr &= ((uint32_t)~(FSMC_PATT2_ATTSET2 | FSMC_PATT2_ATTWAIT2 | FSMC_PATT2_ATTHOLD2 | \ - FSMC_PATT2_ATTHIZ2)); - - /* Set FSMC_NAND device timing parameters */ - tmpr |= (uint32_t)(Timing->SetupTime |\ - ((Timing->WaitSetupTime) << 8) |\ - ((Timing->HoldSetupTime) << 16) |\ - ((Timing->HiZSetupTime) << 24) - ); - - if(Bank == FSMC_NAND_BANK2) - { - /* NAND bank 2 registers configuration */ - Device->PATT2 = tmpr; - } - else - { - /* NAND bank 3 registers configuration */ - Device->PATT3 = tmpr; - } - - return HAL_OK; -} - -/** - * @brief DeInitializes the FSMC_NAND device - * @param Device: Pointer to NAND device instance - * @param Bank: NAND bank number - * @retval HAL status - */ -HAL_StatusTypeDef FSMC_NAND_DeInit(FSMC_NAND_TypeDef *Device, uint32_t Bank) -{ - /* Disable the NAND Bank */ - __FSMC_NAND_DISABLE(Device, Bank); - - /* De-initialize the NAND Bank */ - if(Bank == FSMC_NAND_BANK2) - { - /* Set the FSMC_NAND_BANK2 registers to their reset values */ - Device->PCR2 = 0x00000018; - Device->SR2 = 0x00000040; - Device->PMEM2 = 0xFCFCFCFC; - Device->PATT2 = 0xFCFCFCFC; - } - /* FSMC_Bank3_NAND */ - else - { - /* Set the FSMC_NAND_BANK3 registers to their reset values */ - Device->PCR3 = 0x00000018; - Device->SR3 = 0x00000040; - Device->PMEM3 = 0xFCFCFCFC; - Device->PATT3 = 0xFCFCFCFC; - } - - return HAL_OK; -} -/** - * @} - */ - -/** @addtogroup FSMC_LL_NAND_Private_Functions_Group2 - * @brief management functions - * -@verbatim - ============================================================================== - ##### FSMC_NAND Control functions ##### - ============================================================================== - [..] - This subsection provides a set of functions allowing to control dynamically - the FSMC NAND interface. - -@endverbatim - * @{ - */ - -/** - * @brief Enables dynamically FSMC_NAND ECC feature. - * @param Device: Pointer to NAND device instance - * @param Bank: NAND bank number - * @retval HAL status - */ -HAL_StatusTypeDef FSMC_NAND_ECC_Enable(FSMC_NAND_TypeDef *Device, uint32_t Bank) -{ - /* Enable ECC feature */ - if(Bank == FSMC_NAND_BANK2) - { - Device->PCR2 |= FSMC_PCR2_ECCEN; - } - else - { - Device->PCR3 |= FSMC_PCR3_ECCEN; - } - - return HAL_OK; -} - -/** - * @brief Disables dynamically FSMC_NAND ECC feature. - * @param Device: Pointer to NAND device instance - * @param Bank: NAND bank number - * @retval HAL status - */ -HAL_StatusTypeDef FSMC_NAND_ECC_Disable(FSMC_NAND_TypeDef *Device, uint32_t Bank) -{ - /* Disable ECC feature */ - if(Bank == FSMC_NAND_BANK2) - { - Device->PCR2 &= ~FSMC_PCR2_ECCEN; - } - else - { - Device->PCR3 &= ~FSMC_PCR3_ECCEN; - } - - return HAL_OK; -} - -/** - * @brief Disables dynamically FSMC_NAND ECC feature. - * @param Device: Pointer to NAND device instance - * @param ECCval: Pointer to ECC value - * @param Bank: NAND bank number - * @param Timeout: Timeout wait value - * @retval HAL status - */ -HAL_StatusTypeDef FSMC_NAND_GetECC(FSMC_NAND_TypeDef *Device, uint32_t *ECCval, uint32_t Bank, uint32_t Timeout) -{ - uint32_t tickstart = 0; - - /* Check the parameters */ - assert_param(IS_FSMC_NAND_DEVICE(Device)); - assert_param(IS_FSMC_NAND_BANK(Bank)); - - /* Get tick */ - tickstart = HAL_GetTick(); - - /* Wait until FIFO is empty */ - while(__FSMC_NAND_GET_FLAG(Device, Bank, FSMC_FLAG_FEMPT) == RESET) - { - /* Check for the Timeout */ - if(Timeout != HAL_MAX_DELAY) - { - if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout)) - { - return HAL_TIMEOUT; - } - } - } - - if(Bank == FSMC_NAND_BANK2) - { - /* Get the ECCR2 register value */ - *ECCval = (uint32_t)Device->ECCR2; - } - else - { - /* Get the ECCR3 register value */ - *ECCval = (uint32_t)Device->ECCR3; - } - - return HAL_OK; -} - -/** - * @} - */ - -/** - * @} - */ - -/** @addtogroup FSMC_LL_PCCARD - * @brief PCCARD Controller functions - * - @verbatim - ============================================================================== - ##### How to use PCCARD device driver ##### - ============================================================================== - [..] - This driver contains a set of APIs to interface with the FSMC PCCARD bank in order - to run the PCCARD/compact flash external devices. - - (+) FSMC PCCARD bank reset using the function FSMC_PCCARD_DeInit() - (+) FSMC PCCARD bank control configuration using the function FSMC_PCCARD_Init() - (+) FSMC PCCARD bank common space timing configuration using the function - FSMC_PCCARD_CommonSpace_Timing_Init() - (+) FSMC PCCARD bank attribute space timing configuration using the function - FSMC_PCCARD_AttributeSpace_Timing_Init() - (+) FSMC PCCARD bank IO space timing configuration using the function - FSMC_PCCARD_IOSpace_Timing_Init() - -@endverbatim - * @{ - */ - -/** @addtogroup FSMC_LL_PCCARD_Private_Functions_Group1 - * @brief Initialization and Configuration functions - * -@verbatim - ============================================================================== - ##### Initialization and de_initialization functions ##### - ============================================================================== - [..] - This section provides functions allowing to: - (+) Initialize and configure the FSMC PCCARD interface - (+) De-initialize the FSMC PCCARD interface - (+) Configure the FSMC clock and associated GPIOs - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the FSMC_PCCARD device according to the specified - * control parameters in the FSMC_PCCARD_HandleTypeDef - * @param Device: Pointer to PCCARD device instance - * @param Init: Pointer to PCCARD Initialization structure - * @retval HAL status - */ -HAL_StatusTypeDef FSMC_PCCARD_Init(FSMC_PCCARD_TypeDef *Device, FSMC_PCCARD_InitTypeDef *Init) -{ - uint32_t tmpr = 0; - - /* Check the parameters */ - assert_param(IS_FSMC_WAIT_FEATURE(Init->Waitfeature)); - assert_param(IS_FSMC_TCLR_TIME(Init->TCLRSetupTime)); - assert_param(IS_FSMC_TAR_TIME(Init->TARSetupTime)); - - /* Get PCCARD control register value */ - tmpr = Device->PCR4; - - /* Clear TAR, TCLR, PWAITEN and PWID bits */ - tmpr &= ((uint32_t)~(FSMC_PCR4_TAR | FSMC_PCR4_TCLR | FSMC_PCR4_PWAITEN | \ - FSMC_PCR4_PWID)); - - /* Set FSMC_PCCARD device control parameters */ - tmpr |= (uint32_t)(Init->Waitfeature |\ - FSMC_NAND_PCC_MEM_BUS_WIDTH_16 |\ - (Init->TCLRSetupTime << 9) |\ - (Init->TARSetupTime << 13)); - - Device->PCR4 = tmpr; - - return HAL_OK; -} - -/** - * @brief Initializes the FSMC_PCCARD Common space Timing according to the specified - * parameters in the FSMC_NAND_PCC_TimingTypeDef - * @param Device: Pointer to PCCARD device instance - * @param Timing: Pointer to PCCARD timing structure - * @retval HAL status - */ -HAL_StatusTypeDef FSMC_PCCARD_CommonSpace_Timing_Init(FSMC_PCCARD_TypeDef *Device, FSMC_NAND_PCC_TimingTypeDef *Timing) -{ - uint32_t tmpr = 0; - - /* Check the parameters */ - assert_param(IS_FSMC_SETUP_TIME(Timing->SetupTime)); - assert_param(IS_FSMC_WAIT_TIME(Timing->WaitSetupTime)); - assert_param(IS_FSMC_HOLD_TIME(Timing->HoldSetupTime)); - assert_param(IS_FSMC_HIZ_TIME(Timing->HiZSetupTime)); - - /* Get PCCARD common space timing register value */ - tmpr = Device->PMEM4; - - /* Clear MEMSETx, MEMWAITx, MEMHOLDx and MEMHIZx bits */ - tmpr &= ((uint32_t)~(FSMC_PMEM4_MEMSET4 | FSMC_PMEM4_MEMWAIT4 | FSMC_PMEM4_MEMHOLD4 | \ - FSMC_PMEM4_MEMHIZ4)); - /* Set PCCARD timing parameters */ - tmpr |= (uint32_t)((Timing->SetupTime |\ - ((Timing->WaitSetupTime) << 8) |\ - (Timing->HoldSetupTime) << 16) |\ - ((Timing->HiZSetupTime) << 24)); - - Device->PMEM4 = tmpr; - - return HAL_OK; -} - -/** - * @brief Initializes the FSMC_PCCARD Attribute space Timing according to the specified - * parameters in the FSMC_NAND_PCC_TimingTypeDef - * @param Device: Pointer to PCCARD device instance - * @param Timing: Pointer to PCCARD timing structure - * @retval HAL status - */ -HAL_StatusTypeDef FSMC_PCCARD_AttributeSpace_Timing_Init(FSMC_PCCARD_TypeDef *Device, FSMC_NAND_PCC_TimingTypeDef *Timing) -{ - uint32_t tmpr = 0; - - /* Check the parameters */ - assert_param(IS_FSMC_SETUP_TIME(Timing->SetupTime)); - assert_param(IS_FSMC_WAIT_TIME(Timing->WaitSetupTime)); - assert_param(IS_FSMC_HOLD_TIME(Timing->HoldSetupTime)); - assert_param(IS_FSMC_HIZ_TIME(Timing->HiZSetupTime)); - - /* Get PCCARD timing parameters */ - tmpr = Device->PATT4; - - /* Clear ATTSETx, ATTWAITx, ATTHOLDx and ATTHIZx bits */ - tmpr &= ((uint32_t)~(FSMC_PATT4_ATTSET4 | FSMC_PATT4_ATTWAIT4 | FSMC_PATT4_ATTHOLD4 | \ - FSMC_PATT4_ATTHIZ4)); - - /* Set PCCARD timing parameters */ - tmpr |= (uint32_t)(Timing->SetupTime |\ - ((Timing->WaitSetupTime) << 8) |\ - ((Timing->HoldSetupTime) << 16) |\ - ((Timing->HiZSetupTime) << 24)); - Device->PATT4 = tmpr; - - return HAL_OK; -} - -/** - * @brief Initializes the FSMC_PCCARD IO space Timing according to the specified - * parameters in the FSMC_NAND_PCC_TimingTypeDef - * @param Device: Pointer to PCCARD device instance - * @param Timing: Pointer to PCCARD timing structure - * @retval HAL status - */ -HAL_StatusTypeDef FSMC_PCCARD_IOSpace_Timing_Init(FSMC_PCCARD_TypeDef *Device, FSMC_NAND_PCC_TimingTypeDef *Timing) -{ - uint32_t tmpr = 0; - - /* Check the parameters */ - assert_param(IS_FSMC_SETUP_TIME(Timing->SetupTime)); - assert_param(IS_FSMC_WAIT_TIME(Timing->WaitSetupTime)); - assert_param(IS_FSMC_HOLD_TIME(Timing->HoldSetupTime)); - assert_param(IS_FSMC_HIZ_TIME(Timing->HiZSetupTime)); - - /* Get FSMC_PCCARD device timing parameters */ - tmpr = Device->PIO4; - - /* Clear IOSET4, IOWAIT4, IOHOLD4 and IOHIZ4 bits */ - tmpr &= ((uint32_t)~(FSMC_PIO4_IOSET4 | FSMC_PIO4_IOWAIT4 | FSMC_PIO4_IOHOLD4 | \ - FSMC_PIO4_IOHIZ4)); - - /* Set FSMC_PCCARD device timing parameters */ - tmpr |= (uint32_t)(Timing->SetupTime |\ - ((Timing->WaitSetupTime) << 8) |\ - ((Timing->HoldSetupTime) << 16) |\ - ((Timing->HiZSetupTime) << 24)); - - Device->PIO4 = tmpr; - - return HAL_OK; -} - -/** - * @brief DeInitializes the FSMC_PCCARD device - * @param Device: Pointer to PCCARD device instance - * @retval HAL status - */ -HAL_StatusTypeDef FSMC_PCCARD_DeInit(FSMC_PCCARD_TypeDef *Device) -{ - /* Disable the FSMC_PCCARD device */ - __FSMC_PCCARD_DISABLE(Device); - - /* De-initialize the FSMC_PCCARD device */ - Device->PCR4 = 0x00000018; - Device->SR4 = 0x00000000; - Device->PMEM4 = 0xFCFCFCFC; - Device->PATT4 = 0xFCFCFCFC; - Device->PIO4 = 0xFCFCFCFC; - - return HAL_OK; -} -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ -#endif /* HAL_SRAM_MODULE_ENABLED || HAL_NOR_MODULE_ENABLED || HAL_NAND_MODULE_ENABLED || HAL_PCCARD_MODULE_ENABLED */ - -/** - * @} - */ - -/** - * @} - */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_sdmmc.c b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_sdmmc.c deleted file mode 100755 index e5f4a722..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_sdmmc.c +++ /dev/null @@ -1,505 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_ll_sdmmc.c - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief SDMMC Low Layer HAL module driver. - * - * This file provides firmware functions to manage the following - * functionalities of the SDMMC peripheral: - * + Initialization/de-initialization functions - * + I/O operation functions - * + Peripheral Control functions - * + Peripheral State functions - * - @verbatim - ============================================================================== - ##### SDMMC peripheral features ##### - ============================================================================== - [..] The SD/SDIO MMC card host interface (SDIO) provides an interface between the APB2 - peripheral bus and MultiMedia cards (MMCs), SD memory cards, SDIO cards and CE-ATA - devices. - - [..] The SDIO features include the following: - (+) Full compliance with MultiMedia Card System Specification Version 4.2. Card support - for three different databus modes: 1-bit (default), 4-bit and 8-bit - (+) Full compatibility with previous versions of MultiMedia Cards (forward compatibility) - (+) Full compliance with SD Memory Card Specifications Version 2.0 - (+) Full compliance with SD I/O Card Specification Version 2.0: card support for two - different data bus modes: 1-bit (default) and 4-bit - (+) Full support of the CE-ATA features (full compliance with CE-ATA digital protocol - Rev1.1) - (+) Data transfer up to 48 MHz for the 8 bit mode - (+) Data and command output enable signals to control external bidirectional drivers. - - - ##### How to use this driver ##### - ============================================================================== - [..] - This driver is a considered as a driver of service for external devices drivers - that interfaces with the SDIO peripheral. - According to the device used (SD card/ MMC card / SDIO card ...), a set of APIs - is used in the device's driver to perform SDIO operations and functionalities. - - This driver is almost transparent for the final user, it is only used to implement other - functionalities of the external device. - - [..] - (+) The SDIO clock (SDIOCLK = 48 MHz) is coming from a specific output of PLL - (PLL48CLK). Before start working with SDIO peripheral make sure that the - PLL is well configured. - The SDIO peripheral uses two clock signals: - (++) SDIO adapter clock (SDIOCLK = 48 MHz) - (++) APB2 bus clock (PCLK2) - - -@@- PCLK2 and SDIO_CK clock frequencies must respect the following condition: - Frequency(PCLK2) >= (3 / 8 x Frequency(SDIO_CK)) - - (+) Enable/Disable peripheral clock using RCC peripheral macros related to SDIO - peripheral. - - (+) Enable the Power ON State using the SDIO_PowerState_ON(SDIOx) - function and disable it using the function SDIO_PowerState_OFF(SDIOx). - - (+) Enable/Disable the clock using the __SDIO_ENABLE()/__SDIO_DISABLE() macros. - - (+) Enable/Disable the peripheral interrupts using the macros __SDIO_ENABLE_IT(hsdio, IT) - and __SDIO_DISABLE_IT(hsdio, IT) if you need to use interrupt mode. - - (+) When using the DMA mode - (++) Configure the DMA in the MSP layer of the external device - (++) Active the needed channel Request - (++) Enable the DMA using __SDIO_DMA_ENABLE() macro or Disable it using the macro - __SDIO_DMA_DISABLE(). - - (+) To control the CPSM (Command Path State Machine) and send - commands to the card use the SDIO_SendCommand(SDIOx), - SDIO_GetCommandResponse() and SDIO_GetResponse() functions. First, user has - to fill the command structure (pointer to SDIO_CmdInitTypeDef) according - to the selected command to be sent. - The parameters that should be filled are: - (++) Command Argument - (++) Command Index - (++) Command Response type - (++) Command Wait - (++) CPSM Status (Enable or Disable). - - -@@- To check if the command is well received, read the SDIO_CMDRESP - register using the SDIO_GetCommandResponse(). - The SDIO responses registers (SDIO_RESP1 to SDIO_RESP2), use the - SDIO_GetResponse() function. - - (+) To control the DPSM (Data Path State Machine) and send/receive - data to/from the card use the SDIO_DataConfig(), SDIO_GetDataCounter(), - SDIO_ReadFIFO(), DIO_WriteFIFO() and SDIO_GetFIFOCount() functions. - - *** Read Operations *** - ======================= - [..] - (#) First, user has to fill the data structure (pointer to - SDIO_DataInitTypeDef) according to the selected data type to be received. - The parameters that should be filled are: - (++) Data Timeout - (++) Data Length - (++) Data Block size - (++) Data Transfer direction: should be from card (To SDIO) - (++) Data Transfer mode - (++) DPSM Status (Enable or Disable) - - (#) Configure the SDIO resources to receive the data from the card - according to selected transfer mode (Refer to Step 8, 9 and 10). - - (#) Send the selected Read command (refer to step 11). - - (#) Use the SDIO flags/interrupts to check the transfer status. - - *** Write Operations *** - ======================== - [..] - (#) First, user has to fill the data structure (pointer to - SDIO_DataInitTypeDef) according to the selected data type to be received. - The parameters that should be filled are: - (++) Data Timeout - (++) Data Length - (++) Data Block size - (++) Data Transfer direction: should be to card (To CARD) - (++) Data Transfer mode - (++) DPSM Status (Enable or Disable) - - (#) Configure the SDIO resources to send the data to the card according to - selected transfer mode. - - (#) Send the selected Write command. - - (#) Use the SDIO flags/interrupts to check the transfer status. - - @endverbatim - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal.h" - -/** @addtogroup STM32F2xx_HAL_Driver - * @{ - */ - -/** @defgroup SDMMC_LL SDMMC Low Layer - * @brief Low layer module for SD and MMC driver - * @{ - */ - -#if defined (HAL_SD_MODULE_ENABLED) || defined(HAL_MMC_MODULE_ENABLED) - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup SDMMC_LL_Exported_Functions SDMMC_LL Exported Functions - * @{ - */ - -/** @defgroup HAL_SDMMC_LL_Group1 Initialization/de-initialization functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - ##### Initialization/de-initialization functions ##### - =============================================================================== - [..] This section provides functions allowing to: - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the SDIO according to the specified - * parameters in the SDIO_InitTypeDef and create the associated handle. - * @param SDIOx: Pointer to SDIO register base - * @param Init: SDIO initialization structure - * @retval HAL status - */ -HAL_StatusTypeDef SDIO_Init(SDIO_TypeDef *SDIOx, SDIO_InitTypeDef Init) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_SDIO_ALL_INSTANCE(SDIOx)); - assert_param(IS_SDIO_CLOCK_EDGE(Init.ClockEdge)); - assert_param(IS_SDIO_CLOCK_BYPASS(Init.ClockBypass)); - assert_param(IS_SDIO_CLOCK_POWER_SAVE(Init.ClockPowerSave)); - assert_param(IS_SDIO_BUS_WIDE(Init.BusWide)); - assert_param(IS_SDIO_HARDWARE_FLOW_CONTROL(Init.HardwareFlowControl)); - assert_param(IS_SDIO_CLKDIV(Init.ClockDiv)); - - /* Set SDIO configuration parameters */ - tmpreg |= (Init.ClockEdge |\ - Init.ClockBypass |\ - Init.ClockPowerSave |\ - Init.BusWide |\ - Init.HardwareFlowControl |\ - Init.ClockDiv - ); - - /* Write to SDIO CLKCR */ - MODIFY_REG(SDIOx->CLKCR, CLKCR_CLEAR_MASK, tmpreg); - - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup HAL_SDMMC_LL_Group2 I/O operation functions - * @brief Data transfers functions - * -@verbatim - =============================================================================== - ##### I/O operation functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to manage the SDIO data - transfers. - -@endverbatim - * @{ - */ - -/** - * @brief Read data (word) from Rx FIFO in blocking mode (polling) - * @param SDIOx: Pointer to SDIO register base - * @retval HAL status - */ -uint32_t SDIO_ReadFIFO(SDIO_TypeDef *SDIOx) -{ - /* Read data from Rx FIFO */ - return (SDIOx->FIFO); -} - -/** - * @brief Write data (word) to Tx FIFO in blocking mode (polling) - * @param SDIOx: Pointer to SDIO register base - * @param pWriteData: pointer to data to write - * @retval HAL status - */ -HAL_StatusTypeDef SDIO_WriteFIFO(SDIO_TypeDef *SDIOx, uint32_t *pWriteData) -{ - /* Write data to FIFO */ - SDIOx->FIFO = *pWriteData; - - return HAL_OK; -} - -/** - * @} - */ - -/** @defgroup HAL_SDMMC_LL_Group3 Peripheral Control functions - * @brief management functions - * -@verbatim - =============================================================================== - ##### Peripheral Control functions ##### - =============================================================================== - [..] - This subsection provides a set of functions allowing to control the SDIO data - transfers. - -@endverbatim - * @{ - */ - -/** - * @brief Set SDIO Power state to ON. - * @param SDIOx: Pointer to SDIO register base - * @retval HAL status - */ -HAL_StatusTypeDef SDIO_PowerState_ON(SDIO_TypeDef *SDIOx) -{ - /* Set power state to ON */ - SDIOx->POWER = SDIO_POWER_PWRCTRL; - - return HAL_OK; -} - -/** - * @brief Set SDIO Power state to OFF. - * @param SDIOx: Pointer to SDIO register base - * @retval HAL status - */ -HAL_StatusTypeDef SDIO_PowerState_OFF(SDIO_TypeDef *SDIOx) -{ - /* Set power state to OFF */ - SDIOx->POWER = (uint32_t)0x00000000; - - return HAL_OK; -} - -/** - * @brief Get SDIO Power state. - * @param SDIOx: Pointer to SDIO register base - * @retval Power status of the controller. The returned value can be one of the - * following values: - * - 0x00: Power OFF - * - 0x02: Power UP - * - 0x03: Power ON - */ -uint32_t SDIO_GetPowerState(SDIO_TypeDef *SDIOx) -{ - return (SDIOx->POWER & SDIO_POWER_PWRCTRL); -} - -/** - * @brief Configure the SDIO command path according to the specified parameters in - * SDIO_CmdInitTypeDef structure and send the command - * @param SDIOx: Pointer to SDIO register base - * @param SDIO_CmdInitStruct: pointer to a SDIO_CmdInitTypeDef structure that contains - * the configuration information for the SDIO command - * @retval HAL status - */ -HAL_StatusTypeDef SDIO_SendCommand(SDIO_TypeDef *SDIOx, SDIO_CmdInitTypeDef *SDIO_CmdInitStruct) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_SDIO_CMD_INDEX(SDIO_CmdInitStruct->CmdIndex)); - assert_param(IS_SDIO_RESPONSE(SDIO_CmdInitStruct->Response)); - assert_param(IS_SDIO_WAIT(SDIO_CmdInitStruct->WaitForInterrupt)); - assert_param(IS_SDIO_CPSM(SDIO_CmdInitStruct->CPSM)); - - /* Set the SDIO Argument value */ - SDIOx->ARG = SDIO_CmdInitStruct->Argument; - - /* Set SDIO command parameters */ - tmpreg |= (uint32_t)(SDIO_CmdInitStruct->CmdIndex |\ - SDIO_CmdInitStruct->Response |\ - SDIO_CmdInitStruct->WaitForInterrupt |\ - SDIO_CmdInitStruct->CPSM); - - /* Write to SDIO CMD register */ - MODIFY_REG(SDIOx->CMD, CMD_CLEAR_MASK, tmpreg); - - return HAL_OK; -} - -/** - * @brief Return the command index of last command for which response received - * @param SDIOx: Pointer to SDIO register base - * @retval Command index of the last command response received - */ -uint8_t SDIO_GetCommandResponse(SDIO_TypeDef *SDIOx) -{ - return (uint8_t)(SDIOx->RESPCMD); -} - - -/** - * @brief Return the response received from the card for the last command - * @param SDIO_RESP: Specifies the SDIO response register. - * This parameter can be one of the following values: - * @arg SDIO_RESP1: Response Register 1 - * @arg SDIO_RESP2: Response Register 2 - * @arg SDIO_RESP3: Response Register 3 - * @arg SDIO_RESP4: Response Register 4 - * @retval The Corresponding response register value - */ -uint32_t SDIO_GetResponse(uint32_t SDIO_RESP) -{ - __IO uint32_t tmp = 0; - - /* Check the parameters */ - assert_param(IS_SDIO_RESP(SDIO_RESP)); - - /* Get the response */ - tmp = SDIO_RESP_ADDR + SDIO_RESP; - - return (*(__IO uint32_t *) tmp); -} - -/** - * @brief Configure the SDIO data path according to the specified - * parameters in the SDIO_DataInitTypeDef. - * @param SDIOx: Pointer to SDIO register base - * @param SDIO_DataInitStruct : pointer to a SDIO_DataInitTypeDef structure - * that contains the configuration information for the SDIO command. - * @retval HAL status - */ -HAL_StatusTypeDef SDIO_DataConfig(SDIO_TypeDef *SDIOx, SDIO_DataInitTypeDef* SDIO_DataInitStruct) -{ - uint32_t tmpreg = 0; - - /* Check the parameters */ - assert_param(IS_SDIO_DATA_LENGTH(SDIO_DataInitStruct->DataLength)); - assert_param(IS_SDIO_BLOCK_SIZE(SDIO_DataInitStruct->DataBlockSize)); - assert_param(IS_SDIO_TRANSFER_DIR(SDIO_DataInitStruct->TransferDir)); - assert_param(IS_SDIO_TRANSFER_MODE(SDIO_DataInitStruct->TransferMode)); - assert_param(IS_SDIO_DPSM(SDIO_DataInitStruct->DPSM)); - - /* Set the SDIO Data Timeout value */ - SDIOx->DTIMER = SDIO_DataInitStruct->DataTimeOut; - - /* Set the SDIO DataLength value */ - SDIOx->DLEN = SDIO_DataInitStruct->DataLength; - - /* Set the SDIO data configuration parameters */ - tmpreg |= (uint32_t)(SDIO_DataInitStruct->DataBlockSize |\ - SDIO_DataInitStruct->TransferDir |\ - SDIO_DataInitStruct->TransferMode |\ - SDIO_DataInitStruct->DPSM); - - /* Write to SDIO DCTRL */ - MODIFY_REG(SDIOx->DCTRL, DCTRL_CLEAR_MASK, tmpreg); - - return HAL_OK; - -} - -/** - * @brief Returns number of remaining data bytes to be transferred. - * @param SDIOx: Pointer to SDIO register base - * @retval Number of remaining data bytes to be transferred - */ -uint32_t SDIO_GetDataCounter(SDIO_TypeDef *SDIOx) -{ - return (SDIOx->DCOUNT); -} - -/** - * @brief Get the FIFO data - * @param SDIOx: Pointer to SDIO register base - * @retval Data received - */ -uint32_t SDIO_GetFIFOCount(SDIO_TypeDef *SDIOx) -{ - return (SDIOx->FIFO); -} - - -/** - * @brief Sets one of the two options of inserting read wait interval. - * @param SDIO_ReadWaitMode: SD I/O Read Wait operation mode. - * This parameter can be: - * @arg SDIO_READ_WAIT_MODE_CLK: Read Wait control by stopping SDIOCLK - * @arg SDIO_READ_WAIT_MODE_DATA2: Read Wait control using SDIO_DATA2 - * @retval None - */ -HAL_StatusTypeDef SDIO_SetSDIOReadWaitMode(uint32_t SDIO_ReadWaitMode) -{ - /* Check the parameters */ - assert_param(IS_SDIO_READWAIT_MODE(SDIO_ReadWaitMode)); - - *(__IO uint32_t *)DCTRL_RWMOD_BB = SDIO_ReadWaitMode; - - return HAL_OK; -} - -/** - * @} - */ - -/** - * @} - */ - -#endif /* (HAL_SD_MODULE_ENABLED) || (HAL_MMC_MODULE_ENABLED) */ -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_usb.c b/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_usb.c deleted file mode 100755 index 074c9f00..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_usb.c +++ /dev/null @@ -1,1687 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_ll_usb.c - * @author MCD Application Team - * @version V1.1.0 - * @date 09-October-2015 - * @brief USB Low Layer HAL module driver. - * - * This file provides firmware functions to manage the following - * functionalities of the USB Peripheral Controller: - * + Initialization/de-initialization functions - * + I/O operation functions - * + Peripheral Control functions - * + Peripheral State functions - * - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - (#) Fill parameters of Init structure in USB_OTG_CfgTypeDef structure. - - (#) Call USB_CoreInit() API to initialize the USB Core peripheral. - - (#) The upper HAL HCD/PCD driver will call the right routines for its internal processes. - - @endverbatim - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal.h" - -/** @addtogroup STM32F2xx_LL_USB_DRIVER - * @{ - */ - -#if defined (HAL_PCD_MODULE_ENABLED) || defined (HAL_HCD_MODULE_ENABLED) - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -static HAL_StatusTypeDef USB_CoreReset(USB_OTG_GlobalTypeDef *USBx); - -/* Exported functions --------------------------------------------------------*/ - -/** @defgroup LL_USB_Exported_Functions USB Low Layer Exported Functions - * @{ - */ - -/** @defgroup LL_USB_Group1 Initialization/de-initialization functions - * @brief Initialization and Configuration functions - * -@verbatim - =============================================================================== - ##### Initialization/de-initialization functions ##### - =============================================================================== - [..] This section provides functions allowing to: - -@endverbatim - * @{ - */ - -/** - * @brief Initializes the USB Core - * @param USBx: USB Instance - * @param cfg : pointer to a USB_OTG_CfgTypeDef structure that contains - * the configuration information for the specified USBx peripheral. - * @retval HAL status - */ -HAL_StatusTypeDef USB_CoreInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cfg) -{ - if (cfg.phy_itface == USB_OTG_ULPI_PHY) - { - - USBx->GCCFG &= ~(USB_OTG_GCCFG_PWRDWN); - - /* Init The ULPI Interface */ - USBx->GUSBCFG &= ~(USB_OTG_GUSBCFG_TSDPS | USB_OTG_GUSBCFG_ULPIFSLS | USB_OTG_GUSBCFG_PHYSEL); - - /* Select vbus source */ - USBx->GUSBCFG &= ~(USB_OTG_GUSBCFG_ULPIEVBUSD | USB_OTG_GUSBCFG_ULPIEVBUSI); - if(cfg.use_external_vbus == 1) - { - USBx->GUSBCFG |= USB_OTG_GUSBCFG_ULPIEVBUSD; - } - /* Reset after a PHY select */ - USB_CoreReset(USBx); - } - else /* FS interface (embedded Phy) */ - { - /* Select FS Embedded PHY */ - USBx->GUSBCFG |= USB_OTG_GUSBCFG_PHYSEL; - - /* Reset after a PHY select and set Host mode */ - USB_CoreReset(USBx); - - /* Deactivate the power down*/ - USBx->GCCFG = USB_OTG_GCCFG_PWRDWN; - } - - if(cfg.dma_enable == ENABLE) - { - USBx->GAHBCFG |= (USB_OTG_GAHBCFG_HBSTLEN_1 | USB_OTG_GAHBCFG_HBSTLEN_2); - USBx->GAHBCFG |= USB_OTG_GAHBCFG_DMAEN; - } - - return HAL_OK; -} - -/** - * @brief USB_EnableGlobalInt - * Enables the controller's Global Int in the AHB Config reg - * @param USBx : Selected device - * @retval HAL status - */ -HAL_StatusTypeDef USB_EnableGlobalInt(USB_OTG_GlobalTypeDef *USBx) -{ - USBx->GAHBCFG |= USB_OTG_GAHBCFG_GINT; - return HAL_OK; -} - - -/** - * @brief USB_DisableGlobalInt - * Disable the controller's Global Int in the AHB Config reg - * @param USBx : Selected device - * @retval HAL status -*/ -HAL_StatusTypeDef USB_DisableGlobalInt(USB_OTG_GlobalTypeDef *USBx) -{ - USBx->GAHBCFG &= ~USB_OTG_GAHBCFG_GINT; - return HAL_OK; -} - -/** - * @brief USB_SetCurrentMode : Set functional mode - * @param USBx : Selected device - * @param mode : current core mode - * This parameter can be one of these values: - * @arg USB_OTG_DEVICE_MODE: Peripheral mode - * @arg USB_OTG_HOST_MODE: Host mode - * @arg USB_OTG_DRD_MODE: Dual Role Device mode - * @retval HAL status - */ -HAL_StatusTypeDef USB_SetCurrentMode(USB_OTG_GlobalTypeDef *USBx , USB_OTG_ModeTypeDef mode) -{ - USBx->GUSBCFG &= ~(USB_OTG_GUSBCFG_FHMOD | USB_OTG_GUSBCFG_FDMOD); - - if ( mode == USB_OTG_HOST_MODE) - { - USBx->GUSBCFG |= USB_OTG_GUSBCFG_FHMOD; - } - else if ( mode == USB_OTG_DEVICE_MODE) - { - USBx->GUSBCFG |= USB_OTG_GUSBCFG_FDMOD; - } - HAL_Delay(50); - - return HAL_OK; -} - -/** - * @brief USB_DevInit : Initializes the USB_OTG controller registers - * for device mode - * @param USBx : Selected device - * @param cfg : pointer to a USB_OTG_CfgTypeDef structure that contains - * the configuration information for the specified USBx peripheral. - * @retval HAL status - */ -HAL_StatusTypeDef USB_DevInit (USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cfg) -{ - uint32_t i = 0; - - /*Activate VBUS Sensing B */ - USBx->GCCFG |= USB_OTG_GCCFG_VBUSBSEN; - - if (cfg.vbus_sensing_enable == 0) - { - USBx->GCCFG |= USB_OTG_GCCFG_NOVBUSSENS; - } - - /* Restart the Phy Clock */ - USBx_PCGCCTL = 0; - - /* Device mode configuration */ - USBx_DEVICE->DCFG |= DCFG_FRAME_INTERVAL_80; - - if(cfg.phy_itface == USB_OTG_ULPI_PHY) - { - if(cfg.speed == USB_OTG_SPEED_HIGH) - { - /* Set High speed phy */ - USB_SetDevSpeed (USBx , USB_OTG_SPEED_HIGH); - } - else - { - /* set High speed phy in Full speed mode */ - USB_SetDevSpeed (USBx , USB_OTG_SPEED_HIGH_IN_FULL); - } - } - else - { - /* Set Full speed phy */ - USB_SetDevSpeed (USBx , USB_OTG_SPEED_FULL); - } - - /* Flush the FIFOs */ - USB_FlushTxFifo(USBx , 0x10); /* all Tx FIFOs */ - USB_FlushRxFifo(USBx); - - /* Clear all pending Device Interrupts */ - USBx_DEVICE->DIEPMSK = 0; - USBx_DEVICE->DOEPMSK = 0; - USBx_DEVICE->DAINT = 0xFFFFFFFF; - USBx_DEVICE->DAINTMSK = 0; - - for (i = 0; i < cfg.dev_endpoints; i++) - { - if ((USBx_INEP(i)->DIEPCTL & USB_OTG_DIEPCTL_EPENA) == USB_OTG_DIEPCTL_EPENA) - { - USBx_INEP(i)->DIEPCTL = (USB_OTG_DIEPCTL_EPDIS | USB_OTG_DIEPCTL_SNAK); - } - else - { - USBx_INEP(i)->DIEPCTL = 0; - } - - USBx_INEP(i)->DIEPTSIZ = 0; - USBx_INEP(i)->DIEPINT = 0xFF; - } - - for (i = 0; i < cfg.dev_endpoints; i++) - { - if ((USBx_OUTEP(i)->DOEPCTL & USB_OTG_DOEPCTL_EPENA) == USB_OTG_DOEPCTL_EPENA) - { - USBx_OUTEP(i)->DOEPCTL = (USB_OTG_DOEPCTL_EPDIS | USB_OTG_DOEPCTL_SNAK); - } - else - { - USBx_OUTEP(i)->DOEPCTL = 0; - } - - USBx_OUTEP(i)->DOEPTSIZ = 0; - USBx_OUTEP(i)->DOEPINT = 0xFF; - } - - USBx_DEVICE->DIEPMSK &= ~(USB_OTG_DIEPMSK_TXFURM); - - if (cfg.dma_enable == 1) - { - /*Set threshold parameters */ - USBx_DEVICE->DTHRCTL = (USB_OTG_DTHRCTL_TXTHRLEN_6 | USB_OTG_DTHRCTL_RXTHRLEN_6); - USBx_DEVICE->DTHRCTL |= (USB_OTG_DTHRCTL_RXTHREN | USB_OTG_DTHRCTL_ISOTHREN | USB_OTG_DTHRCTL_NONISOTHREN); - - i= USBx_DEVICE->DTHRCTL; - } - - /* Disable all interrupts. */ - USBx->GINTMSK = 0; - - /* Clear any pending interrupts */ - USBx->GINTSTS = 0xBFFFFFFF; - - /* Enable the common interrupts */ - if (cfg.dma_enable == DISABLE) - { - USBx->GINTMSK |= USB_OTG_GINTMSK_RXFLVLM; - } - - /* Enable interrupts matching to the Device mode ONLY */ - USBx->GINTMSK |= (USB_OTG_GINTMSK_USBSUSPM | USB_OTG_GINTMSK_USBRST |\ - USB_OTG_GINTMSK_ENUMDNEM | USB_OTG_GINTMSK_IEPINT |\ - USB_OTG_GINTMSK_OEPINT | USB_OTG_GINTMSK_IISOIXFRM|\ - USB_OTG_GINTMSK_PXFRM_IISOOXFRM | USB_OTG_GINTMSK_WUIM); - - if(cfg.Sof_enable) - { - USBx->GINTMSK |= USB_OTG_GINTMSK_SOFM; - } - - if (cfg.vbus_sensing_enable == ENABLE) - { - USBx->GINTMSK |= (USB_OTG_GINTMSK_SRQIM | USB_OTG_GINTMSK_OTGINT); - } - - return HAL_OK; -} - - -/** - * @brief USB_OTG_FlushTxFifo : Flush a Tx FIFO - * @param USBx : Selected device - * @param num : FIFO number - * This parameter can be a value from 1 to 15 - 15 means Flush all Tx FIFOs - * @retval HAL status - */ -HAL_StatusTypeDef USB_FlushTxFifo (USB_OTG_GlobalTypeDef *USBx, uint32_t num ) -{ - uint32_t count = 0; - - USBx->GRSTCTL = ( USB_OTG_GRSTCTL_TXFFLSH |(uint32_t)( num << 6)); - - do - { - if (++count > 200000) - { - return HAL_TIMEOUT; - } - } - while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_TXFFLSH) == USB_OTG_GRSTCTL_TXFFLSH); - - return HAL_OK; -} - - -/** - * @brief USB_FlushRxFifo : Flush Rx FIFO - * @param USBx : Selected device - * @retval HAL status - */ -HAL_StatusTypeDef USB_FlushRxFifo(USB_OTG_GlobalTypeDef *USBx) -{ - uint32_t count = 0; - - USBx->GRSTCTL = USB_OTG_GRSTCTL_RXFFLSH; - - do - { - if (++count > 200000) - { - return HAL_TIMEOUT; - } - } - while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_RXFFLSH) == USB_OTG_GRSTCTL_RXFFLSH); - - return HAL_OK; -} - -/** - * @brief USB_SetDevSpeed :Initializes the DevSpd field of DCFG register - * depending the PHY type and the enumeration speed of the device. - * @param USBx : Selected device - * @param speed : device speed - * This parameter can be one of these values: - * @arg USB_OTG_SPEED_HIGH: High speed mode - * @arg USB_OTG_SPEED_HIGH_IN_FULL: High speed core in Full Speed mode - * @arg USB_OTG_SPEED_FULL: Full speed mode - * @arg USB_OTG_SPEED_LOW: Low speed mode - * @retval Hal status - */ -HAL_StatusTypeDef USB_SetDevSpeed(USB_OTG_GlobalTypeDef *USBx , uint8_t speed) -{ - USBx_DEVICE->DCFG |= speed; - return HAL_OK; -} - -/** - * @brief USB_GetDevSpeed :Return the Dev Speed - * @param USBx : Selected device - * @retval speed : device speed - * This parameter can be one of these values: - * @arg USB_OTG_SPEED_HIGH: High speed mode - * @arg USB_OTG_SPEED_FULL: Full speed mode - * @arg USB_OTG_SPEED_LOW: Low speed mode - */ -uint8_t USB_GetDevSpeed(USB_OTG_GlobalTypeDef *USBx) -{ - uint8_t speed = 0; - - if((USBx_DEVICE->DSTS & USB_OTG_DSTS_ENUMSPD) == DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ) - { - speed = USB_OTG_SPEED_HIGH; - } - else if (((USBx_DEVICE->DSTS & USB_OTG_DSTS_ENUMSPD) == DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ)|| - ((USBx_DEVICE->DSTS & USB_OTG_DSTS_ENUMSPD) == DSTS_ENUMSPD_FS_PHY_48MHZ)) - { - speed = USB_OTG_SPEED_FULL; - } - else if((USBx_DEVICE->DSTS & USB_OTG_DSTS_ENUMSPD) == DSTS_ENUMSPD_LS_PHY_6MHZ) - { - speed = USB_OTG_SPEED_LOW; - } - - return speed; -} - -/** - * @brief Activate and configure an endpoint - * @param USBx : Selected device - * @param ep: pointer to endpoint structure - * @retval HAL status - */ -HAL_StatusTypeDef USB_ActivateEndpoint(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep) -{ - if (ep->is_in == 1) - { - USBx_DEVICE->DAINTMSK |= USB_OTG_DAINTMSK_IEPM & ((1 << (ep->num))); - - if (((USBx_INEP(ep->num)->DIEPCTL) & USB_OTG_DIEPCTL_USBAEP) == 0) - { - USBx_INEP(ep->num)->DIEPCTL |= ((ep->maxpacket & USB_OTG_DIEPCTL_MPSIZ ) | (ep->type << 18 ) |\ - ((ep->num) << 22 ) | (USB_OTG_DIEPCTL_SD0PID_SEVNFRM) | (USB_OTG_DIEPCTL_USBAEP)); - } - - } - else - { - USBx_DEVICE->DAINTMSK |= USB_OTG_DAINTMSK_OEPM & ((1 << (ep->num)) << 16); - - if (((USBx_OUTEP(ep->num)->DOEPCTL) & USB_OTG_DOEPCTL_USBAEP) == 0) - { - USBx_OUTEP(ep->num)->DOEPCTL |= ((ep->maxpacket & USB_OTG_DOEPCTL_MPSIZ ) | (ep->type << 18 ) |\ - (USB_OTG_DIEPCTL_SD0PID_SEVNFRM)| (USB_OTG_DOEPCTL_USBAEP)); - } - } - return HAL_OK; -} -/** - * @brief Activate and configure a dedicated endpoint - * @param USBx : Selected device - * @param ep: pointer to endpoint structure - * @retval HAL status - */ -HAL_StatusTypeDef USB_ActivateDedicatedEndpoint(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep) -{ - static __IO uint32_t debug = 0; - - /* Read DEPCTLn register */ - if (ep->is_in == 1) - { - if (((USBx_INEP(ep->num)->DIEPCTL) & USB_OTG_DIEPCTL_USBAEP) == 0) - { - USBx_INEP(ep->num)->DIEPCTL |= ((ep->maxpacket & USB_OTG_DIEPCTL_MPSIZ ) | (ep->type << 18 ) |\ - ((ep->num) << 22 ) | (USB_OTG_DIEPCTL_SD0PID_SEVNFRM) | (USB_OTG_DIEPCTL_USBAEP)); - } - - - debug |= ((ep->maxpacket & USB_OTG_DIEPCTL_MPSIZ ) | (ep->type << 18 ) |\ - ((ep->num) << 22 ) | (USB_OTG_DIEPCTL_SD0PID_SEVNFRM) | (USB_OTG_DIEPCTL_USBAEP)); - - USBx_DEVICE->DEACHMSK |= USB_OTG_DAINTMSK_IEPM & ((1 << (ep->num))); - } - else - { - if (((USBx_OUTEP(ep->num)->DOEPCTL) & USB_OTG_DOEPCTL_USBAEP) == 0) - { - USBx_OUTEP(ep->num)->DOEPCTL |= ((ep->maxpacket & USB_OTG_DOEPCTL_MPSIZ ) | (ep->type << 18 ) |\ - ((ep->num) << 22 ) | (USB_OTG_DOEPCTL_USBAEP)); - - debug = (uint32_t)(((uint32_t )USBx) + USB_OTG_OUT_ENDPOINT_BASE + (0)*USB_OTG_EP_REG_SIZE); - debug = (uint32_t )&USBx_OUTEP(ep->num)->DOEPCTL; - debug |= ((ep->maxpacket & USB_OTG_DOEPCTL_MPSIZ ) | (ep->type << 18 ) |\ - ((ep->num) << 22 ) | (USB_OTG_DOEPCTL_USBAEP)); - } - - USBx_DEVICE->DEACHMSK |= USB_OTG_DAINTMSK_OEPM & ((1 << (ep->num)) << 16); - } - - return HAL_OK; -} -/** - * @brief De-activate and de-initialize an endpoint - * @param USBx : Selected device - * @param ep: pointer to endpoint structure - * @retval HAL status - */ -HAL_StatusTypeDef USB_DeactivateEndpoint(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep) -{ - /* Read DEPCTLn register */ - if (ep->is_in == 1) - { - USBx_DEVICE->DEACHMSK &= ~(USB_OTG_DAINTMSK_IEPM & ((1 << (ep->num)))); - USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_IEPM & ((1 << (ep->num)))); - USBx_INEP(ep->num)->DIEPCTL &= ~ USB_OTG_DIEPCTL_USBAEP; - } - else - { - USBx_DEVICE->DEACHMSK &= ~(USB_OTG_DAINTMSK_OEPM & ((1 << (ep->num)) << 16)); - USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_OEPM & ((1 << (ep->num)) << 16)); - USBx_OUTEP(ep->num)->DOEPCTL &= ~USB_OTG_DOEPCTL_USBAEP; - } - return HAL_OK; -} - -/** - * @brief De-activate and de-initialize a dedicated endpoint - * @param USBx : Selected device - * @param ep: pointer to endpoint structure - * @retval HAL status - */ -HAL_StatusTypeDef USB_DeactivateDedicatedEndpoint(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep) -{ - /* Read DEPCTLn register */ - if (ep->is_in == 1) - { - USBx_INEP(ep->num)->DIEPCTL &= ~ USB_OTG_DIEPCTL_USBAEP; - USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_IEPM & ((1 << (ep->num)))); - } - else - { - USBx_OUTEP(ep->num)->DOEPCTL &= ~USB_OTG_DOEPCTL_USBAEP; - USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_OEPM & ((1 << (ep->num)) << 16)); - } - return HAL_OK; -} - -/** - * @brief USB_EPStartXfer : setup and starts a transfer over an EP - * @param USBx : Selected device - * @param ep: pointer to endpoint structure - * @param dma: USB dma enabled or disabled - * This parameter can be one of these values: - * 0 : DMA feature not used - * 1 : DMA feature used - * @retval HAL status - */ -HAL_StatusTypeDef USB_EPStartXfer(USB_OTG_GlobalTypeDef *USBx , USB_OTG_EPTypeDef *ep, uint8_t dma) -{ - uint16_t pktcnt = 0; - - /* IN endpoint */ - if (ep->is_in == 1) - { - /* Zero Length Packet? */ - if (ep->xfer_len == 0) - { - USBx_INEP(ep->num)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_PKTCNT); - USBx_INEP(ep->num)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_PKTCNT & (1 << 19)) ; - USBx_INEP(ep->num)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_XFRSIZ); - } - else - { - /* Program the transfer size and packet count - * as follows: xfersize = N * maxpacket + - * short_packet pktcnt = N + (short_packet - * exist ? 1 : 0) - */ - USBx_INEP(ep->num)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_XFRSIZ); - USBx_INEP(ep->num)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_PKTCNT); - USBx_INEP(ep->num)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_PKTCNT & (((ep->xfer_len + ep->maxpacket -1)/ ep->maxpacket) << 19)) ; - USBx_INEP(ep->num)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_XFRSIZ & ep->xfer_len); - - if (ep->type == EP_TYPE_ISOC) - { - USBx_INEP(ep->num)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_MULCNT); - USBx_INEP(ep->num)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_MULCNT & (1 << 29)); - } - } - - if (dma == 1) - { - USBx_INEP(ep->num)->DIEPDMA = (uint32_t)(ep->dma_addr); - } - else - { - if (ep->type != EP_TYPE_ISOC) - { - /* Enable the Tx FIFO Empty Interrupt for this EP */ - if (ep->xfer_len > 0) - { - USBx_DEVICE->DIEPEMPMSK |= 1 << ep->num; - } - } - } - - if (ep->type == EP_TYPE_ISOC) - { - if ((USBx_DEVICE->DSTS & ( 1 << 8 )) == 0) - { - USBx_INEP(ep->num)->DIEPCTL |= USB_OTG_DIEPCTL_SODDFRM; - } - else - { - USBx_INEP(ep->num)->DIEPCTL |= USB_OTG_DIEPCTL_SD0PID_SEVNFRM; - } - } - - /* EP enable, IN data in FIFO */ - USBx_INEP(ep->num)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA); - - if (ep->type == EP_TYPE_ISOC) - { - USB_WritePacket(USBx, ep->xfer_buff, ep->num, ep->xfer_len, dma); - } - } - else /* OUT endpoint */ - { - /* Program the transfer size and packet count as follows: - * pktcnt = N - * xfersize = N * maxpacket - */ - USBx_OUTEP(ep->num)->DOEPTSIZ &= ~(USB_OTG_DOEPTSIZ_XFRSIZ); - USBx_OUTEP(ep->num)->DOEPTSIZ &= ~(USB_OTG_DOEPTSIZ_PKTCNT); - - if (ep->xfer_len == 0) - { - USBx_OUTEP(ep->num)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_XFRSIZ & ep->maxpacket); - USBx_OUTEP(ep->num)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_PKTCNT & (1 << 19)) ; - } - else - { - pktcnt = (ep->xfer_len + ep->maxpacket -1)/ ep->maxpacket; - USBx_OUTEP(ep->num)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_PKTCNT & (pktcnt << 19)); ; - USBx_OUTEP(ep->num)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_XFRSIZ & (ep->maxpacket * pktcnt)); - } - - if (dma == 1) - { - USBx_OUTEP(ep->num)->DOEPDMA = (uint32_t)ep->xfer_buff; - } - - if (ep->type == EP_TYPE_ISOC) - { - if ((USBx_DEVICE->DSTS & ( 1 << 8 )) == 0) - { - USBx_OUTEP(ep->num)->DOEPCTL |= USB_OTG_DOEPCTL_SODDFRM; - } - else - { - USBx_OUTEP(ep->num)->DOEPCTL |= USB_OTG_DOEPCTL_SD0PID_SEVNFRM; - } - } - /* EP enable */ - USBx_OUTEP(ep->num)->DOEPCTL |= (USB_OTG_DOEPCTL_CNAK | USB_OTG_DOEPCTL_EPENA); - } - return HAL_OK; -} - -/** - * @brief USB_EP0StartXfer : setup and starts a transfer over the EP 0 - * @param USBx : Selected device - * @param ep: pointer to endpoint structure - * @param dma: USB dma enabled or disabled - * This parameter can be one of these values: - * 0 : DMA feature not used - * 1 : DMA feature used - * @retval HAL status - */ -HAL_StatusTypeDef USB_EP0StartXfer(USB_OTG_GlobalTypeDef *USBx , USB_OTG_EPTypeDef *ep, uint8_t dma) -{ - /* IN endpoint */ - if (ep->is_in == 1) - { - /* Zero Length Packet? */ - if (ep->xfer_len == 0) - { - USBx_INEP(ep->num)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_PKTCNT); - USBx_INEP(ep->num)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_PKTCNT & (1 << 19)) ; - USBx_INEP(ep->num)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_XFRSIZ); - } - else - { - /* Program the transfer size and packet count - * as follows: xfersize = N * maxpacket + - * short_packet pktcnt = N + (short_packet - * exist ? 1 : 0) - */ - USBx_INEP(ep->num)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_XFRSIZ); - USBx_INEP(ep->num)->DIEPTSIZ &= ~(USB_OTG_DIEPTSIZ_PKTCNT); - - if(ep->xfer_len > ep->maxpacket) - { - ep->xfer_len = ep->maxpacket; - } - USBx_INEP(ep->num)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_PKTCNT & (1 << 19)) ; - USBx_INEP(ep->num)->DIEPTSIZ |= (USB_OTG_DIEPTSIZ_XFRSIZ & ep->xfer_len); - - } - - if (dma == 1) - { - USBx_INEP(ep->num)->DIEPDMA = (uint32_t)(ep->dma_addr); - } - else - { - /* Enable the Tx FIFO Empty Interrupt for this EP */ - if (ep->xfer_len > 0) - { - USBx_DEVICE->DIEPEMPMSK |= 1 << (ep->num); - } - } - - /* EP enable, IN data in FIFO */ - USBx_INEP(ep->num)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA); - } - else /* OUT endpoint */ - { - /* Program the transfer size and packet count as follows: - * pktcnt = N - * xfersize = N * maxpacket - */ - USBx_OUTEP(ep->num)->DOEPTSIZ &= ~(USB_OTG_DOEPTSIZ_XFRSIZ); - USBx_OUTEP(ep->num)->DOEPTSIZ &= ~(USB_OTG_DOEPTSIZ_PKTCNT); - - if (ep->xfer_len > 0) - { - ep->xfer_len = ep->maxpacket; - } - - USBx_OUTEP(ep->num)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_PKTCNT & (1 << 19)); - USBx_OUTEP(ep->num)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_XFRSIZ & (ep->maxpacket)); - - - if (dma == 1) - { - USBx_OUTEP(ep->num)->DOEPDMA = (uint32_t)(ep->xfer_buff); - } - - /* EP enable */ - USBx_OUTEP(ep->num)->DOEPCTL |= (USB_OTG_DOEPCTL_CNAK | USB_OTG_DOEPCTL_EPENA); - } - return HAL_OK; -} - -/** - * @brief USB_WritePacket : Writes a packet into the Tx FIFO associated - * with the EP/channel - * @param USBx : Selected device - * @param src : pointer to source buffer - * @param ch_ep_num : endpoint or host channel number - * @param len : Number of bytes to write - * @param dma: USB dma enabled or disabled - * This parameter can be one of these values: - * 0 : DMA feature not used - * 1 : DMA feature used - * @retval HAL status - */ -HAL_StatusTypeDef USB_WritePacket(USB_OTG_GlobalTypeDef *USBx, uint8_t *src, uint8_t ch_ep_num, uint16_t len, uint8_t dma) -{ - uint32_t count32b= 0 , i= 0; - - if (dma == 0) - { - count32b = (len + 3) / 4; - for (i = 0; i < count32b; i++, src += 4) - { - USBx_DFIFO(ch_ep_num) = *((__packed uint32_t *)src); - } - } - return HAL_OK; -} - -/** - * @brief USB_ReadPacket : read a packet from the Tx FIFO associated - * with the EP/channel - * @param USBx : Selected device - * @param src : source pointer - * @param ch_ep_num : endpoint or host channel number - * @param len : Number of bytes to read - * @param dma: USB dma enabled or disabled - * This parameter can be one of these values: - * 0 : DMA feature not used - * 1 : DMA feature used - * @retval pointer to destination buffer - */ -void *USB_ReadPacket(USB_OTG_GlobalTypeDef *USBx, uint8_t *dest, uint16_t len) -{ - uint32_t i=0; - uint32_t count32b = (len + 3) / 4; - - for ( i = 0; i < count32b; i++, dest += 4 ) - { - *(__packed uint32_t *)dest = USBx_DFIFO(0); - - } - return ((void *)dest); -} - -/** - * @brief USB_EPSetStall : set a stall condition over an EP - * @param USBx : Selected device - * @param ep: pointer to endpoint structure - * @retval HAL status - */ -HAL_StatusTypeDef USB_EPSetStall(USB_OTG_GlobalTypeDef *USBx , USB_OTG_EPTypeDef *ep) -{ - if (ep->is_in == 1) - { - if (((USBx_INEP(ep->num)->DIEPCTL) & USB_OTG_DIEPCTL_EPENA) == 0) - { - USBx_INEP(ep->num)->DIEPCTL &= ~(USB_OTG_DIEPCTL_EPDIS); - } - USBx_INEP(ep->num)->DIEPCTL |= USB_OTG_DIEPCTL_STALL; - } - else - { - if (((USBx_OUTEP(ep->num)->DOEPCTL) & USB_OTG_DOEPCTL_EPENA) == 0) - { - USBx_OUTEP(ep->num)->DOEPCTL &= ~(USB_OTG_DOEPCTL_EPDIS); - } - USBx_OUTEP(ep->num)->DOEPCTL |= USB_OTG_DOEPCTL_STALL; - } - return HAL_OK; -} - - -/** - * @brief USB_EPClearStall : Clear a stall condition over an EP - * @param USBx : Selected device - * @param ep: pointer to endpoint structure - * @retval HAL status - */ -HAL_StatusTypeDef USB_EPClearStall(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef *ep) -{ - if (ep->is_in == 1) - { - USBx_INEP(ep->num)->DIEPCTL &= ~USB_OTG_DIEPCTL_STALL; - if (ep->type == EP_TYPE_INTR || ep->type == EP_TYPE_BULK) - { - USBx_INEP(ep->num)->DIEPCTL |= USB_OTG_DIEPCTL_SD0PID_SEVNFRM; /* DATA0 */ - } - } - else - { - USBx_OUTEP(ep->num)->DOEPCTL &= ~USB_OTG_DOEPCTL_STALL; - if (ep->type == EP_TYPE_INTR || ep->type == EP_TYPE_BULK) - { - USBx_OUTEP(ep->num)->DOEPCTL |= USB_OTG_DOEPCTL_SD0PID_SEVNFRM; /* DATA0 */ - } - } - return HAL_OK; -} - -/** - * @brief USB_StopDevice : Stop the usb device mode - * @param USBx : Selected device - * @retval HAL status - */ -HAL_StatusTypeDef USB_StopDevice(USB_OTG_GlobalTypeDef *USBx) -{ - uint32_t i; - - /* Clear Pending interrupt */ - for (i = 0; i < 15 ; i++) - { - USBx_INEP(i)->DIEPINT = 0xFF; - USBx_OUTEP(i)->DOEPINT = 0xFF; - } - USBx_DEVICE->DAINT = 0xFFFFFFFF; - - /* Clear interrupt masks */ - USBx_DEVICE->DIEPMSK = 0; - USBx_DEVICE->DOEPMSK = 0; - USBx_DEVICE->DAINTMSK = 0; - - /* Flush the FIFO */ - USB_FlushRxFifo(USBx); - USB_FlushTxFifo(USBx , 0x10 ); - - return HAL_OK; -} - -/** - * @brief USB_SetDevAddress : Stop the usb device mode - * @param USBx : Selected device - * @param address : new device address to be assigned - * This parameter can be a value from 0 to 255 - * @retval HAL status - */ -HAL_StatusTypeDef USB_SetDevAddress (USB_OTG_GlobalTypeDef *USBx, uint8_t address) -{ - USBx_DEVICE->DCFG &= ~ (USB_OTG_DCFG_DAD); - USBx_DEVICE->DCFG |= (address << 4) & USB_OTG_DCFG_DAD ; - - return HAL_OK; -} - -/** - * @brief USB_DevConnect : Connect the USB device by enabling the pull-up/pull-down - * @param USBx : Selected device - * @retval HAL status - */ -HAL_StatusTypeDef USB_DevConnect (USB_OTG_GlobalTypeDef *USBx) -{ - USBx_DEVICE->DCTL &= ~USB_OTG_DCTL_SDIS ; - HAL_Delay(3); - - return HAL_OK; -} - -/** - * @brief USB_DevDisconnect : Disconnect the USB device by disabling the pull-up/pull-down - * @param USBx : Selected device - * @retval HAL status - */ -HAL_StatusTypeDef USB_DevDisconnect (USB_OTG_GlobalTypeDef *USBx) -{ - USBx_DEVICE->DCTL |= USB_OTG_DCTL_SDIS ; - HAL_Delay(3); - - return HAL_OK; -} - -/** - * @brief USB_ReadInterrupts: return the global USB interrupt status - * @param USBx : Selected device - * @retval HAL status - */ -uint32_t USB_ReadInterrupts (USB_OTG_GlobalTypeDef *USBx) -{ - uint32_t v = 0; - - v = USBx->GINTSTS; - v &= USBx->GINTMSK; - return v; -} - -/** - * @brief USB_ReadDevAllOutEpInterrupt: return the USB device OUT endpoints interrupt status - * @param USBx : Selected device - * @retval HAL status - */ -uint32_t USB_ReadDevAllOutEpInterrupt (USB_OTG_GlobalTypeDef *USBx) -{ - uint32_t v; - v = USBx_DEVICE->DAINT; - v &= USBx_DEVICE->DAINTMSK; - return ((v & 0xffff0000) >> 16); -} - -/** - * @brief USB_ReadDevAllInEpInterrupt: return the USB device IN endpoints interrupt status - * @param USBx : Selected device - * @retval HAL status - */ -uint32_t USB_ReadDevAllInEpInterrupt (USB_OTG_GlobalTypeDef *USBx) -{ - uint32_t v; - v = USBx_DEVICE->DAINT; - v &= USBx_DEVICE->DAINTMSK; - return ((v & 0xFFFF)); -} - -/** - * @brief Returns Device OUT EP Interrupt register - * @param USBx : Selected device - * @param epnum : endpoint number - * This parameter can be a value from 0 to 15 - * @retval Device OUT EP Interrupt register - */ -uint32_t USB_ReadDevOutEPInterrupt (USB_OTG_GlobalTypeDef *USBx , uint8_t epnum) -{ - uint32_t v; - v = USBx_OUTEP(epnum)->DOEPINT; - v &= USBx_DEVICE->DOEPMSK; - return v; -} - -/** - * @brief Returns Device IN EP Interrupt register - * @param USBx : Selected device - * @param epnum : endpoint number - * This parameter can be a value from 0 to 15 - * @retval Device IN EP Interrupt register - */ -uint32_t USB_ReadDevInEPInterrupt (USB_OTG_GlobalTypeDef *USBx , uint8_t epnum) -{ - uint32_t v, msk, emp; - - msk = USBx_DEVICE->DIEPMSK; - emp = USBx_DEVICE->DIEPEMPMSK; - msk |= ((emp >> epnum) & 0x1) << 7; - v = USBx_INEP(epnum)->DIEPINT & msk; - return v; -} - -/** - * @brief USB_ClearInterrupts: clear a USB interrupt - * @param USBx : Selected device - * @param interrupt : interrupt flag - * @retval None - */ -void USB_ClearInterrupts (USB_OTG_GlobalTypeDef *USBx, uint32_t interrupt) -{ - USBx->GINTSTS |= interrupt; -} - -/** - * @brief Returns USB core mode - * @param USBx : Selected device - * @retval return core mode : Host or Device - * This parameter can be one of these values: - * 0 : Host - * 1 : Device - */ -uint32_t USB_GetMode(USB_OTG_GlobalTypeDef *USBx) -{ - return ((USBx->GINTSTS ) & 0x1); -} - - -/** - * @brief Activate EP0 for Setup transactions - * @param USBx : Selected device - * @retval HAL status - */ -HAL_StatusTypeDef USB_ActivateSetup (USB_OTG_GlobalTypeDef *USBx) -{ - /* Set the MPS of the IN EP based on the enumeration speed */ - USBx_INEP(0)->DIEPCTL &= ~USB_OTG_DIEPCTL_MPSIZ; - - if((USBx_DEVICE->DSTS & USB_OTG_DSTS_ENUMSPD) == DSTS_ENUMSPD_LS_PHY_6MHZ) - { - USBx_INEP(0)->DIEPCTL |= 3; - } - USBx_DEVICE->DCTL |= USB_OTG_DCTL_CGINAK; - - return HAL_OK; -} - - -/** - * @brief Prepare the EP0 to start the first control setup - * @param USBx : Selected device - * @param dma: USB dma enabled or disabled - * This parameter can be one of these values: - * 0 : DMA feature not used - * 1 : DMA feature used - * @param psetup : pointer to setup packet - * @retval HAL status - */ -HAL_StatusTypeDef USB_EP0_OutStart(USB_OTG_GlobalTypeDef *USBx, uint8_t dma, uint8_t *psetup) -{ - USBx_OUTEP(0)->DOEPTSIZ = 0; - USBx_OUTEP(0)->DOEPTSIZ |= (USB_OTG_DOEPTSIZ_PKTCNT & (1 << 19)) ; - USBx_OUTEP(0)->DOEPTSIZ |= (3 * 8); - USBx_OUTEP(0)->DOEPTSIZ |= USB_OTG_DOEPTSIZ_STUPCNT; - - if (dma == 1) - { - USBx_OUTEP(0)->DOEPDMA = (uint32_t)psetup; - /* EP enable */ - USBx_OUTEP(0)->DOEPCTL = 0x80008000; - } - - return HAL_OK; -} - - -/** - * @brief Reset the USB Core (needed after USB clock settings change) - * @param USBx : Selected device - * @retval HAL status - */ -static HAL_StatusTypeDef USB_CoreReset(USB_OTG_GlobalTypeDef *USBx) -{ - uint32_t count = 0; - - /* Wait for AHB master IDLE state. */ - do - { - if (++count > 200000) - { - return HAL_TIMEOUT; - } - } - while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_AHBIDL) == 0); - - /* Core Soft Reset */ - count = 0; - USBx->GRSTCTL |= USB_OTG_GRSTCTL_CSRST; - - do - { - if (++count > 200000) - { - return HAL_TIMEOUT; - } - } - while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_CSRST) == USB_OTG_GRSTCTL_CSRST); - - return HAL_OK; -} - - -/** - * @brief USB_HostInit : Initializes the USB OTG controller registers - * for Host mode - * @param USBx : Selected device - * @param cfg : pointer to a USB_OTG_CfgTypeDef structure that contains - * the configuration information for the specified USBx peripheral. - * @retval HAL status - */ -HAL_StatusTypeDef USB_HostInit (USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cfg) -{ - uint32_t i; - - /* Restart the Phy Clock */ - USBx_PCGCCTL = 0; - - /* no VBUS sensing*/ - USBx->GCCFG &=~ (USB_OTG_GCCFG_VBUSASEN); - USBx->GCCFG &=~ (USB_OTG_GCCFG_VBUSBSEN); - USBx->GCCFG |= USB_OTG_GCCFG_NOVBUSSENS; - - /* Disable the FS/LS support mode only */ - if((cfg.speed == USB_OTG_SPEED_FULL)&& - (USBx != USB_OTG_FS)) - { - USBx_HOST->HCFG |= USB_OTG_HCFG_FSLSS; - } - else - { - USBx_HOST->HCFG &= ~(USB_OTG_HCFG_FSLSS); - } - - /* Make sure the FIFOs are flushed. */ - USB_FlushTxFifo(USBx, 0x10 ); /* all Tx FIFOs */ - USB_FlushRxFifo(USBx); - - /* Clear all pending HC Interrupts */ - for (i = 0; i < cfg.Host_channels; i++) - { - USBx_HC(i)->HCINT = 0xFFFFFFFF; - USBx_HC(i)->HCINTMSK = 0; - } - - /* Enable VBUS driving */ - USB_DriveVbus(USBx, 1); - - HAL_Delay(200); - - /* Disable all interrupts. */ - USBx->GINTMSK = 0; - - /* Clear any pending interrupts */ - USBx->GINTSTS = 0xFFFFFFFF; - - if(USBx == USB_OTG_FS) - { - /* set Rx FIFO size */ - USBx->GRXFSIZ = (uint32_t )0x80; - USBx->DIEPTXF0_HNPTXFSIZ = (uint32_t )(((0x60 << 16)& USB_OTG_NPTXFD) | 0x80); - USBx->HPTXFSIZ = (uint32_t )(((0x40 << 16)& USB_OTG_HPTXFSIZ_PTXFD) | 0xE0); - } - else - { - /* set Rx FIFO size */ - USBx->GRXFSIZ = (uint32_t )0x200; - USBx->DIEPTXF0_HNPTXFSIZ = (uint32_t )(((0x100 << 16)& USB_OTG_NPTXFD) | 0x200); - USBx->HPTXFSIZ = (uint32_t )(((0xE0 << 16)& USB_OTG_HPTXFSIZ_PTXFD) | 0x300); - } - - /* Enable the common interrupts */ - if (cfg.dma_enable == DISABLE) - { - USBx->GINTMSK |= USB_OTG_GINTMSK_RXFLVLM; - } - - /* Enable interrupts matching to the Host mode ONLY */ - USBx->GINTMSK |= (USB_OTG_GINTMSK_PRTIM | USB_OTG_GINTMSK_HCIM |\ - USB_OTG_GINTMSK_SOFM |USB_OTG_GINTSTS_DISCINT|\ - USB_OTG_GINTMSK_PXFRM_IISOOXFRM | USB_OTG_GINTMSK_WUIM); - - return HAL_OK; -} - -/** - * @brief USB_InitFSLSPClkSel : Initializes the FSLSPClkSel field of the - * HCFG register on the PHY type and set the right frame interval - * @param USBx : Selected device - * @param freq : clock frequency - * This parameter can be one of these values: - * HCFG_48_MHZ : Full Speed 48 MHz Clock - * HCFG_6_MHZ : Low Speed 6 MHz Clock - * @retval HAL status - */ -HAL_StatusTypeDef USB_InitFSLSPClkSel(USB_OTG_GlobalTypeDef *USBx , uint8_t freq) -{ - USBx_HOST->HCFG &= ~(USB_OTG_HCFG_FSLSPCS); - USBx_HOST->HCFG |= (freq & USB_OTG_HCFG_FSLSPCS); - - if (freq == HCFG_48_MHZ) - { - USBx_HOST->HFIR = (uint32_t)48000; - } - else if (freq == HCFG_6_MHZ) - { - USBx_HOST->HFIR = (uint32_t)6000; - } - return HAL_OK; -} - -/** -* @brief USB_OTG_ResetPort : Reset Host Port - * @param USBx : Selected device - * @retval HAL status - * @note (1)The application must wait at least 10 ms - * before clearing the reset bit. - */ -HAL_StatusTypeDef USB_ResetPort(USB_OTG_GlobalTypeDef *USBx) -{ - __IO uint32_t hprt0; - - hprt0 = USBx_HPRT0; - - hprt0 &= ~(USB_OTG_HPRT_PENA | USB_OTG_HPRT_PCDET |\ - USB_OTG_HPRT_PENCHNG | USB_OTG_HPRT_POCCHNG ); - - USBx_HPRT0 = (USB_OTG_HPRT_PRST | hprt0); - HAL_Delay (10); /* See Note #1 */ - USBx_HPRT0 = ((~USB_OTG_HPRT_PRST) & hprt0); - return HAL_OK; -} - -/** - * @brief USB_DriveVbus : activate or de-activate vbus - * @param state : VBUS state - * This parameter can be one of these values: - * 0 : VBUS Active - * 1 : VBUS Inactive - * @retval HAL status -*/ -HAL_StatusTypeDef USB_DriveVbus (USB_OTG_GlobalTypeDef *USBx, uint8_t state) -{ - __IO uint32_t hprt0; - - hprt0 = USBx_HPRT0; - hprt0 &= ~(USB_OTG_HPRT_PENA | USB_OTG_HPRT_PCDET |\ - USB_OTG_HPRT_PENCHNG | USB_OTG_HPRT_POCCHNG ); - - if (((hprt0 & USB_OTG_HPRT_PPWR) == 0 ) && (state == 1 )) - { - USBx_HPRT0 = (USB_OTG_HPRT_PPWR | hprt0); - } - if (((hprt0 & USB_OTG_HPRT_PPWR) == USB_OTG_HPRT_PPWR) && (state == 0 )) - { - USBx_HPRT0 = ((~USB_OTG_HPRT_PPWR) & hprt0); - } - return HAL_OK; -} - -/** - * @brief Return Host Core speed - * @param USBx : Selected device - * @retval speed : Host speed - * This parameter can be one of these values: - * @arg USB_OTG_SPEED_HIGH: High speed mode - * @arg USB_OTG_SPEED_FULL: Full speed mode - * @arg USB_OTG_SPEED_LOW: Low speed mode - */ -uint32_t USB_GetHostSpeed (USB_OTG_GlobalTypeDef *USBx) -{ - __IO uint32_t hprt0; - - hprt0 = USBx_HPRT0; - return ((hprt0 & USB_OTG_HPRT_PSPD) >> 17); -} - -/** - * @brief Return Host Current Frame number - * @param USBx : Selected device - * @retval current frame number -*/ -uint32_t USB_GetCurrentFrame (USB_OTG_GlobalTypeDef *USBx) -{ - return (USBx_HOST->HFNUM & USB_OTG_HFNUM_FRNUM); -} - -/** - * @brief Initialize a host channel - * @param USBx : Selected device - * @param ch_num : Channel number - * This parameter can be a value from 1 to 15 - * @param epnum : Endpoint number - * This parameter can be a value from 1 to 15 - * @param dev_address : Current device address - * This parameter can be a value from 0 to 255 - * @param speed : Current device speed - * This parameter can be one of these values: - * @arg USB_OTG_SPEED_HIGH: High speed mode - * @arg USB_OTG_SPEED_FULL: Full speed mode - * @arg USB_OTG_SPEED_LOW: Low speed mode - * @param ep_type : Endpoint Type - * This parameter can be one of these values: - * @arg EP_TYPE_CTRL: Control type - * @arg EP_TYPE_ISOC: Isochronous type - * @arg EP_TYPE_BULK: Bulk type - * @arg EP_TYPE_INTR: Interrupt type - * @param mps : Max Packet Size - * This parameter can be a value from 0 to32K - * @retval HAL state - */ -HAL_StatusTypeDef USB_HC_Init(USB_OTG_GlobalTypeDef *USBx, - uint8_t ch_num, - uint8_t epnum, - uint8_t dev_address, - uint8_t speed, - uint8_t ep_type, - uint16_t mps) -{ - - /* Clear old interrupt conditions for this host channel. */ - USBx_HC(ch_num)->HCINT = 0xFFFFFFFF; - - /* Enable channel interrupts required for this transfer. */ - switch (ep_type) - { - case EP_TYPE_CTRL: - case EP_TYPE_BULK: - - USBx_HC(ch_num)->HCINTMSK = USB_OTG_HCINTMSK_XFRCM |\ - USB_OTG_HCINTMSK_STALLM |\ - USB_OTG_HCINTMSK_TXERRM |\ - USB_OTG_HCINTMSK_DTERRM |\ - USB_OTG_HCINTMSK_AHBERR |\ - USB_OTG_HCINTMSK_NAKM ; - - if (epnum & 0x80) - { - USBx_HC(ch_num)->HCINTMSK |= USB_OTG_HCINTMSK_BBERRM; - } - else - { - if(USBx != USB_OTG_FS) - { - USBx_HC(ch_num)->HCINTMSK |= (USB_OTG_HCINTMSK_NYET | USB_OTG_HCINTMSK_ACKM); - } - } - break; - - case EP_TYPE_INTR: - - USBx_HC(ch_num)->HCINTMSK = USB_OTG_HCINTMSK_XFRCM |\ - USB_OTG_HCINTMSK_STALLM |\ - USB_OTG_HCINTMSK_TXERRM |\ - USB_OTG_HCINTMSK_DTERRM |\ - USB_OTG_HCINTMSK_NAKM |\ - USB_OTG_HCINTMSK_AHBERR |\ - USB_OTG_HCINTMSK_FRMORM ; - - if (epnum & 0x80) - { - USBx_HC(ch_num)->HCINTMSK |= USB_OTG_HCINTMSK_BBERRM; - } - - break; - case EP_TYPE_ISOC: - - USBx_HC(ch_num)->HCINTMSK = USB_OTG_HCINTMSK_XFRCM |\ - USB_OTG_HCINTMSK_ACKM |\ - USB_OTG_HCINTMSK_AHBERR |\ - USB_OTG_HCINTMSK_FRMORM ; - - if (epnum & 0x80) - { - USBx_HC(ch_num)->HCINTMSK |= (USB_OTG_HCINTMSK_TXERRM | USB_OTG_HCINTMSK_BBERRM); - } - break; - } - - /* Enable the top level host channel interrupt. */ - USBx_HOST->HAINTMSK |= (1 << ch_num); - - /* Make sure host channel interrupts are enabled. */ - USBx->GINTMSK |= USB_OTG_GINTMSK_HCIM; - - /* Program the HCCHAR register */ - USBx_HC(ch_num)->HCCHAR = (((dev_address << 22) & USB_OTG_HCCHAR_DAD) |\ - (((epnum & 0x7F)<< 11) & USB_OTG_HCCHAR_EPNUM)|\ - ((((epnum & 0x80) == 0x80)<< 15) & USB_OTG_HCCHAR_EPDIR)|\ - (((speed == HPRT0_PRTSPD_LOW_SPEED)<< 17) & USB_OTG_HCCHAR_LSDEV)|\ - ((ep_type << 18) & USB_OTG_HCCHAR_EPTYP)|\ - (mps & USB_OTG_HCCHAR_MPSIZ)); - - if (ep_type == EP_TYPE_INTR) - { - USBx_HC(ch_num)->HCCHAR |= USB_OTG_HCCHAR_ODDFRM ; - } - - return HAL_OK; -} - -/** - * @brief Start a transfer over a host channel - * @param USBx : Selected device - * @param hc : pointer to host channel structure - * @param dma: USB dma enabled or disabled - * This parameter can be one of these values: - * 0 : DMA feature not used - * 1 : DMA feature used - * @retval HAL state - */ -#if defined (__CC_ARM) /*!< ARM Compiler */ -#pragma O0 -#elif defined (__GNUC__) /*!< GNU Compiler */ -#pragma GCC optimize ("O0") -#endif /* __CC_ARM */ -HAL_StatusTypeDef USB_HC_StartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_HCTypeDef *hc, uint8_t dma) -{ - uint8_t is_oddframe = 0; - uint16_t len_words = 0; - uint16_t num_packets = 0; - uint16_t max_hc_pkt_count = 256; - uint32_t tmpreg = 0; - - if((USBx != USB_OTG_FS) && (hc->speed == USB_OTG_SPEED_HIGH)) - { - if((dma == 0) && (hc->do_ping == 1)) - { - USB_DoPing(USBx, hc->ch_num); - return HAL_OK; - } - else if(dma == 1) - { - USBx_HC(hc->ch_num)->HCINTMSK &= ~(USB_OTG_HCINTMSK_NYET | USB_OTG_HCINTMSK_ACKM); - hc->do_ping = 0; - } - } - - /* Compute the expected number of packets associated to the transfer */ - if (hc->xfer_len > 0) - { - num_packets = (hc->xfer_len + hc->max_packet - 1) / hc->max_packet; - - if (num_packets > max_hc_pkt_count) - { - num_packets = max_hc_pkt_count; - hc->xfer_len = num_packets * hc->max_packet; - } - } - else - { - num_packets = 1; - } - if (hc->ep_is_in) - { - hc->xfer_len = num_packets * hc->max_packet; - } - - /* Initialize the HCTSIZn register */ - USBx_HC(hc->ch_num)->HCTSIZ = (((hc->xfer_len) & USB_OTG_HCTSIZ_XFRSIZ)) |\ - ((num_packets << 19) & USB_OTG_HCTSIZ_PKTCNT) |\ - (((hc->data_pid) << 29) & USB_OTG_HCTSIZ_DPID); - - if (dma) - { - /* xfer_buff MUST be 32-bits aligned */ - USBx_HC(hc->ch_num)->HCDMA = (uint32_t)hc->xfer_buff; - } - - is_oddframe = (USBx_HOST->HFNUM & 0x01) ? 0 : 1; - USBx_HC(hc->ch_num)->HCCHAR &= ~USB_OTG_HCCHAR_ODDFRM; - USBx_HC(hc->ch_num)->HCCHAR |= (is_oddframe << 29); - - /* Set host channel enable */ - tmpreg = USBx_HC(hc->ch_num)->HCCHAR; - tmpreg &= ~USB_OTG_HCCHAR_CHDIS; - tmpreg |= USB_OTG_HCCHAR_CHENA; - USBx_HC(hc->ch_num)->HCCHAR = tmpreg; - - if (dma == 0) /* Slave mode */ - { - if((hc->ep_is_in == 0) && (hc->xfer_len > 0)) - { - switch(hc->ep_type) - { - /* Non periodic transfer */ - case EP_TYPE_CTRL: - case EP_TYPE_BULK: - - len_words = (hc->xfer_len + 3) / 4; - - /* check if there is enough space in FIFO space */ - if(len_words > (USBx->HNPTXSTS & 0xFFFF)) - { - /* need to process data in nptxfempty interrupt */ - USBx->GINTMSK |= USB_OTG_GINTMSK_NPTXFEM; - } - break; - /* Periodic transfer */ - case EP_TYPE_INTR: - case EP_TYPE_ISOC: - len_words = (hc->xfer_len + 3) / 4; - /* check if there is enough space in FIFO space */ - if(len_words > (USBx_HOST->HPTXSTS & 0xFFFF)) /* split the transfer */ - { - /* need to process data in ptxfempty interrupt */ - USBx->GINTMSK |= USB_OTG_GINTMSK_PTXFEM; - } - break; - - default: - break; - } - - /* Write packet into the Tx FIFO. */ - USB_WritePacket(USBx, hc->xfer_buff, hc->ch_num, hc->xfer_len, 0); - } - } - - return HAL_OK; -} - -/** - * @brief Read all host channel interrupts status - * @param USBx : Selected device - * @retval HAL state - */ -uint32_t USB_HC_ReadInterrupt (USB_OTG_GlobalTypeDef *USBx) -{ - return ((USBx_HOST->HAINT) & 0xFFFF); -} - -/** - * @brief Halt a host channel - * @param USBx : Selected device - * @param hc_num : Host Channel number - * This parameter can be a value from 1 to 15 - * @retval HAL state - */ -HAL_StatusTypeDef USB_HC_Halt(USB_OTG_GlobalTypeDef *USBx , uint8_t hc_num) -{ - uint32_t count = 0; - - /* Check for space in the request queue to issue the halt. */ - if (((USBx_HC(hc_num)->HCCHAR) & (HCCHAR_CTRL << 18)) || ((USBx_HC(hc_num)->HCCHAR) & (HCCHAR_BULK << 18))) - { - USBx_HC(hc_num)->HCCHAR |= USB_OTG_HCCHAR_CHDIS; - - if ((USBx->HNPTXSTS & 0xFFFF) == 0) - { - USBx_HC(hc_num)->HCCHAR &= ~USB_OTG_HCCHAR_CHENA; - USBx_HC(hc_num)->HCCHAR |= USB_OTG_HCCHAR_CHENA; - USBx_HC(hc_num)->HCCHAR &= ~USB_OTG_HCCHAR_EPDIR; - do - { - if (++count > 1000) - { - break; - } - } - while ((USBx_HC(hc_num)->HCCHAR & USB_OTG_HCCHAR_CHENA) == USB_OTG_HCCHAR_CHENA); - } - else - { - USBx_HC(hc_num)->HCCHAR |= USB_OTG_HCCHAR_CHENA; - } - } - else - { - USBx_HC(hc_num)->HCCHAR |= USB_OTG_HCCHAR_CHDIS; - - if ((USBx_HOST->HPTXSTS & 0xFFFF) == 0) - { - USBx_HC(hc_num)->HCCHAR &= ~USB_OTG_HCCHAR_CHENA; - USBx_HC(hc_num)->HCCHAR |= USB_OTG_HCCHAR_CHENA; - USBx_HC(hc_num)->HCCHAR &= ~USB_OTG_HCCHAR_EPDIR; - do - { - if (++count > 1000) - { - break; - } - } - while ((USBx_HC(hc_num)->HCCHAR & USB_OTG_HCCHAR_CHENA) == USB_OTG_HCCHAR_CHENA); - } - else - { - USBx_HC(hc_num)->HCCHAR |= USB_OTG_HCCHAR_CHENA; - } - } - - return HAL_OK; -} - -/** - * @brief Initiate Do Ping protocol - * @param USBx : Selected device - * @param hc_num : Host Channel number - * This parameter can be a value from 1 to 15 - * @retval HAL state - */ -HAL_StatusTypeDef USB_DoPing(USB_OTG_GlobalTypeDef *USBx , uint8_t ch_num) -{ - uint8_t num_packets = 1; - uint32_t tmpreg = 0; - - USBx_HC(ch_num)->HCTSIZ = ((num_packets << 19) & USB_OTG_HCTSIZ_PKTCNT) |\ - USB_OTG_HCTSIZ_DOPING; - - /* Set host channel enable */ - tmpreg = USBx_HC(ch_num)->HCCHAR; - tmpreg &= ~USB_OTG_HCCHAR_CHDIS; - tmpreg |= USB_OTG_HCCHAR_CHENA; - USBx_HC(ch_num)->HCCHAR = tmpreg; - - return HAL_OK; -} - -/** - * @brief Stop Host Core - * @param USBx : Selected device - * @retval HAL state - */ -HAL_StatusTypeDef USB_StopHost(USB_OTG_GlobalTypeDef *USBx) -{ - uint8_t i; - uint32_t count = 0; - uint32_t value; - - USB_DisableGlobalInt(USBx); - - /* Flush FIFO */ - USB_FlushTxFifo(USBx, 0x10); - USB_FlushRxFifo(USBx); - - /* Flush out any leftover queued requests. */ - for (i = 0; i <= 15; i++) - { - - value = USBx_HC(i)->HCCHAR ; - value |= USB_OTG_HCCHAR_CHDIS; - value &= ~USB_OTG_HCCHAR_CHENA; - value &= ~USB_OTG_HCCHAR_EPDIR; - USBx_HC(i)->HCCHAR = value; - } - - /* Halt all channels to put them into a known state. */ - for (i = 0; i <= 15; i++) - { - value = USBx_HC(i)->HCCHAR ; - - value |= USB_OTG_HCCHAR_CHDIS; - value |= USB_OTG_HCCHAR_CHENA; - value &= ~USB_OTG_HCCHAR_EPDIR; - - USBx_HC(i)->HCCHAR = value; - do - { - if (++count > 1000) - { - break; - } - } - while ((USBx_HC(i)->HCCHAR & USB_OTG_HCCHAR_CHENA) == USB_OTG_HCCHAR_CHENA); - } - - /* Clear any pending Host interrupts */ - USBx_HOST->HAINT = 0xFFFFFFFF; - USBx->GINTSTS = 0xFFFFFFFF; - USB_EnableGlobalInt(USBx); - return HAL_OK; -} -/** - * @} - */ - -#endif /* defined (HAL_PCD_MODULE_ENABLED) || defined (HAL_HCD_MODULE_ENABLED) */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Inc/bsp_driver_sd.h b/STM32CubeMX/SCSI2SD-V6/Inc/bsp_driver_sd.h deleted file mode 100755 index 49a0a50c..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Inc/bsp_driver_sd.h +++ /dev/null @@ -1,104 +0,0 @@ -/** - ****************************************************************************** - * @file bsp_driver_sd.h (based on stm324x9i_eval_sd.h) - * @brief This file contains the common defines and functions prototypes for - * the bsp_driver_sd.c driver. - ****************************************************************************** - * - * COPYRIGHT(c) 2016 STMicroelectronics - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F2XX_SD_H -#define __STM32F2XX_SD_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal.h" - -/* Exported constants --------------------------------------------------------*/ - -/** - * @brief SD status structure definition - */ -#define MSD_OK 0x00 -#define MSD_ERROR 0x01 -#ifndef SD_CardInfo - #define SD_CardInfo HAL_SD_CardInfoTypedef -#endif - -/** @defgroup STM324x9I_EVAL_SD_Exported_Constants - * @{ - */ -#define SD_DATATIMEOUT ((uint32_t)0xFFFFFFFF) - -#define SD_PRESENT ((uint8_t)0x01) -#define SD_NOT_PRESENT ((uint8_t)0x00) - -/* USER CODE BEGIN 0 */ - -/* DMA definitions for SD DMA transfer */ -/* -#define __DMAx_TxRx_CLK_ENABLE __DMA2_CLK_ENABLE -#define SD_DMAx_Tx_CHANNEL DMA_CHANNEL_4 -#define SD_DMAx_Rx_CHANNEL DMA_CHANNEL_4 -#define SD_DMAx_Tx_STREAM DMA2_Stream6 -#define SD_DMAx_Rx_STREAM DMA2_Stream3 -#define SD_DMAx_Tx_IRQn DMA2_Stream6_IRQn -#define SD_DMAx_Rx_IRQn DMA2_Stream3_IRQn -#define SD_DMAx_Tx_IRQHandler DMA2_Stream6_IRQHandler -#define SD_DMAx_Rx_IRQHandler DMA2_Stream3_IRQHandler -*/ - -/* Exported functions --------------------------------------------------------*/ -uint8_t BSP_SD_Init(void); -uint8_t BSP_SD_ITConfig(void); -void BSP_SD_DetectIT(void); -__weak void BSP_SD_DetectCallback(void); -uint8_t BSP_SD_ReadBlocks(uint32_t *pData, uint64_t ReadAddr, uint32_t BlockSize, uint32_t NumOfBlocks); -uint8_t BSP_SD_WriteBlocks(uint32_t *pData, uint64_t WriteAddr, uint32_t BlockSize, uint32_t NumOfBlocks); -uint8_t BSP_SD_ReadBlocks_DMA(uint32_t *pData, uint64_t ReadAddr, uint32_t BlockSize, uint32_t NumOfBlocks); -uint8_t BSP_SD_WriteBlocks_DMA(uint32_t *pData, uint64_t WriteAddr, uint32_t BlockSize, uint32_t NumOfBlocks); -uint8_t BSP_SD_Erase(uint64_t StartAddr, uint64_t EndAddr); -void BSP_SD_IRQHandler(void); -void BSP_SD_DMA_Tx_IRQHandler(void); -void BSP_SD_DMA_Rx_IRQHandler(void); -HAL_SD_TransferStateTypedef BSP_SD_GetStatus(void); -void BSP_SD_GetCardInfo(HAL_SD_CardInfoTypedef *CardInfo); -uint8_t BSP_SD_IsDetected(void); -/* USER CODE END 0 */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F2XX_SD_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Inc/ffconf.h b/STM32CubeMX/SCSI2SD-V6/Inc/ffconf.h deleted file mode 100755 index 8fbd27d4..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Inc/ffconf.h +++ /dev/null @@ -1,276 +0,0 @@ -/*---------------------------------------------------------------------------/ -/ FatFs - FAT file system module configuration file R0.11 (C)ChaN, 2015 -/---------------------------------------------------------------------------*/ - -#ifndef _FFCONF -#define _FFCONF 32020 /* Revision ID */ - -/*-----------------------------------------------------------------------------/ -/ Additional user header to be used -/-----------------------------------------------------------------------------*/ -#include "stm32f2xx_hal.h" -#include "bsp_driver_sd.h" -#include "usbh_core.h" -#include "usbh_msc.h" - - /* Handle for USB Host */ -#define HOST_HANDLE hUsbHostHS - - -/*-----------------------------------------------------------------------------/ -/ Functions and Buffer Configurations -/-----------------------------------------------------------------------------*/ - -#define _FS_TINY 0 /* 0:Normal or 1:Tiny */ -/* This option switches tiny buffer configuration. (0:Normal or 1:Tiny) -/ At the tiny configuration, size of the file object (FIL) is reduced _MAX_SS -/ bytes. Instead of private sector buffer eliminated from the file object, -/ common sector buffer in the file system object (FATFS) is used for the file -/ data transfer. */ - -#define _FS_READONLY 0 /* 0:Read/Write or 1:Read only */ -/* This option switches read-only configuration. (0:Read/Write or 1:Read-only) -/ Read-only configuration removes writing API functions, f_write(), f_sync(), -/ f_unlink(), f_mkdir(), f_chmod(), f_rename(), f_truncate(), f_getfree() -/ and optional writing functions as well. */ - -#define _FS_MINIMIZE 0 /* 0 to 3 */ -/* This option defines minimization level to remove some basic API functions. -/ -/ 0: All basic functions are enabled. -/ 1: f_stat(), f_getfree(), f_unlink(), f_mkdir(), f_chmod(), f_utime(), -/ f_truncate() and f_rename() function are removed. -/ 2: f_opendir(), f_readdir() and f_closedir() are removed in addition to 1. -/ 3: f_lseek() function is removed in addition to 2. */ - -#define _USE_STRFUNC 2 /* 0:Disable or 1-2:Enable */ -/* This option switches string functions, f_gets(), f_putc(), f_puts() and -/ f_printf(). -/ -/ 0: Disable string functions. -/ 1: Enable without LF-CRLF conversion. -/ 2: Enable with LF-CRLF conversion. */ - -#define _USE_FIND 0 -/* This option switches filtered directory read feature and related functions, -/ f_findfirst() and f_findnext(). (0:Disable or 1:Enable) */ - -#define _USE_MKFS 1 -/* This option switches f_mkfs() function. (0:Disable or 1:Enable) */ - -#define _USE_FASTSEEK 1 -/* This option switches fast seek feature. (0:Disable or 1:Enable) */ - -#define _USE_LABEL 0 -/* This option switches volume label functions, f_getlabel() and f_setlabel(). -/ (0:Disable or 1:Enable) */ - -#define _USE_FORWARD 0 -/* This option switches f_forward() function. (0:Disable or 1:Enable) -/ To enable it, also _FS_TINY need to be set to 1. */ - -#define _USE_BUFF_WO_ALIGNMENT 1 -/* This option is available only for usbh diskio interface and allows to disable -/ the management of the unaligned buffer. -/ When STM32 USB OTG HS or FS IP is used with internal DMA enabled, this define -/ must be set to 0 to align data into 32bits through an internal scratch buffer -/ before being processed by the DMA . Otherwise (DMA not used), this define must -/ be set to 1 to avoid Data alignment and improve the performance. -/ Please note that if _USE_BUFF_WO_ALIGNMENT is set to 1 and an unaligned 32bits -/ buffer is forwarded to the FatFs Write/Read functions, an error will be returned. -/ (0: default value or 1: unaligned buffer return an error). */ -/*-----------------------------------------------------------------------------/ -/ Locale and Namespace Configurations -/-----------------------------------------------------------------------------*/ - -#define _CODE_PAGE 1252 -/* This option specifies the OEM code page to be used on the target system. -/ Incorrect setting of the code page can cause a file open failure. -/ -/ 932 - Japanese Shift_JIS (DBCS, OEM, Windows) -/ 936 - Simplified Chinese GBK (DBCS, OEM, Windows) -/ 949 - Korean (DBCS, OEM, Windows) -/ 950 - Traditional Chinese Big5 (DBCS, OEM, Windows) -/ 1250 - Central Europe (Windows) -/ 1251 - Cyrillic (Windows) -/ 1252 - Latin 1 (Windows) -/ 1253 - Greek (Windows) -/ 1254 - Turkish (Windows) -/ 1255 - Hebrew (Windows) -/ 1256 - Arabic (Windows) -/ 1257 - Baltic (Windows) -/ 1258 - Vietnam (OEM, Windows) -/ 437 - U.S. (OEM) -/ 720 - Arabic (OEM) -/ 737 - Greek (OEM) -/ 775 - Baltic (OEM) -/ 850 - Multilingual Latin 1 (OEM) -/ 858 - Multilingual Latin 1 + Euro (OEM) -/ 852 - Latin 2 (OEM) -/ 855 - Cyrillic (OEM) -/ 866 - Russian (OEM) -/ 857 - Turkish (OEM) -/ 862 - Hebrew (OEM) -/ 874 - Thai (OEM, Windows) -/ 1 - ASCII (No extended character. Valid for only non-LFN configuration.) */ - -#define _USE_LFN 3 /* 0 to 3 */ -#define _MAX_LFN 255 /* Maximum LFN length to handle (12 to 255) */ -/* The _USE_LFN option switches the LFN feature. -/ -/ 0: Disable LFN feature. _MAX_LFN has no effect. -/ 1: Enable LFN with static working buffer on the BSS. Always NOT thread-safe. -/ 2: Enable LFN with dynamic working buffer on the STACK. -/ 3: Enable LFN with dynamic working buffer on the HEAP. -/ -/ When enable the LFN feature, Unicode handling functions (option/unicode.c) must -/ be added to the project. The LFN working buffer occupies (_MAX_LFN + 1) * 2 bytes. -/ When use stack for the working buffer, take care on stack overflow. When use heap -/ memory for the working buffer, memory management functions, ff_memalloc() and -/ ff_memfree(), must be added to the project. */ - -#define _LFN_UNICODE 0 /* 0:ANSI/OEM or 1:Unicode */ -/* This option switches character encoding on the API. (0:ANSI/OEM or 1:Unicode) -/ To use Unicode string for the path name, enable LFN feature and set _LFN_UNICODE -/ to 1. This option also affects behavior of string I/O functions. */ - -#define _STRF_ENCODE 3 -/* When _LFN_UNICODE is 1, this option selects the character encoding on the file to -/ be read/written via string I/O functions, f_gets(), f_putc(), f_puts and f_printf(). -/ -/ 0: ANSI/OEM -/ 1: UTF-16LE -/ 2: UTF-16BE -/ 3: UTF-8 -/ -/ When _LFN_UNICODE is 0, this option has no effect. */ - -#define _FS_RPATH 0 /* 0 to 2 */ -/* This option configures relative path feature. -/ -/ 0: Disable relative path feature and remove related functions. -/ 1: Enable relative path feature. f_chdir() and f_chdrive() are available. -/ 2: f_getcwd() function is available in addition to 1. -/ -/ Note that directory items read via f_readdir() are affected by this option. */ - -/*---------------------------------------------------------------------------/ -/ Drive/Volume Configurations -/----------------------------------------------------------------------------*/ - -#define _VOLUMES 2 -/* Number of volumes (logical drives) to be used. */ - -/* USER CODE BEGIN Volumes */ -#define _STR_VOLUME_ID 0 /* 0:Use only 0-9 for drive ID, 1:Use strings for drive ID */ -#define _VOLUME_STRS "RAM","NAND","CF","SD1","SD2","USB1","USB2","USB3" -/* _STR_VOLUME_ID option switches string volume ID feature. -/ When _STR_VOLUME_ID is set to 1, also pre-defined strings can be used as drive -/ number in the path name. _VOLUME_STRS defines the drive ID strings for each -/ logical drives. Number of items must be equal to _VOLUMES. Valid characters for -/ the drive ID strings are: A-Z and 0-9. */ -/* USER CODE END Volumes */ - -#define _MULTI_PARTITION 1 /* 0:Single partition, 1:Multiple partition */ -/* This option switches multi-partition feature. By default (0), each logical drive -/ number is bound to the same physical drive number and only an FAT volume found on -/ the physical drive will be mounted. When multi-partition feature is enabled (1), -/ each logical drive number is bound to arbitrary physical drive and partition -/ listed in the VolToPart[]. Also f_fdisk() funciton will be available. */ - -#define _MIN_SS 512 /* 512, 1024, 2048 or 4096 */ -#define _MAX_SS 512 /* 512, 1024, 2048 or 4096 */ -/* These options configure the range of sector size to be supported. (512, 1024, -/ 2048 or 4096) Always set both 512 for most systems, all type of memory cards and -/ harddisk. But a larger value may be required for on-board flash memory and some -/ type of optical media. When _MAX_SS is larger than _MIN_SS, FatFs is configured -/ to variable sector size and GET_SECTOR_SIZE command must be implemented to the -/ disk_ioctl() function. */ - -#define _USE_TRIM 0 -/* This option switches ATA-TRIM feature. (0:Disable or 1:Enable) -/ To enable Trim feature, also CTRL_TRIM command should be implemented to the -/ disk_ioctl() function. */ - -#define _FS_NOFSINFO 0 /* 0,1,2 or 3 */ -/* If you need to know correct free space on the FAT32 volume, set bit 0 of this -/ option, and f_getfree() function at first time after volume mount will force -/ a full FAT scan. Bit 1 controls the use of last allocated cluster number. -/ -/ bit0=0: Use free cluster count in the FSINFO if available. -/ bit0=1: Do not trust free cluster count in the FSINFO. -/ bit1=0: Use last allocated cluster number in the FSINFO if available. -/ bit1=1: Do not trust last allocated cluster number in the FSINFO. -*/ - -/*---------------------------------------------------------------------------/ -/ System Configurations -/----------------------------------------------------------------------------*/ - -#define _FS_NORTC 0 -#define _NORTC_MON 6 -#define _NORTC_MDAY 4 -#define _NORTC_YEAR 2015 -/* The _FS_NORTC option switches timestamp feature. If the system does not have -/ an RTC function or valid timestamp is not needed, set _FS_NORTC to 1 to disable -/ the timestamp feature. All objects modified by FatFs will have a fixed timestamp -/ defined by _NORTC_MON, _NORTC_MDAY and _NORTC_YEAR. -/ When timestamp feature is enabled (_FS_NORTC == 0), get_fattime() function need -/ to be added to the project to read current time form RTC. _NORTC_MON, -/ _NORTC_MDAY and _NORTC_YEAR have no effect. -/ These options have no effect at read-only configuration (_FS_READONLY == 1). */ - -#define _FS_LOCK 2 /* 0:Disable or >=1:Enable */ -/* The _FS_LOCK option switches file lock feature to control duplicated file open -/ and illegal operation to open objects. This option must be 0 when _FS_READONLY -/ is 1. -/ -/ 0: Disable file lock feature. To avoid volume corruption, application program -/ should avoid illegal open, remove and rename to the open objects. -/ >0: Enable file lock feature. The value defines how many files/sub-directories -/ can be opened simultaneously under file lock control. Note that the file -/ lock feature is independent of re-entrancy. */ - -#define _FS_REENTRANT 0 /* 0:Disable or 1:Enable */ -#define _FS_TIMEOUT 1000 /* Timeout period in unit of time ticks */ -#define _SYNC_t osSemaphoreId -/* The _FS_REENTRANT option switches the re-entrancy (thread safe) of the FatFs -/ module itself. Note that regardless of this option, file access to different -/ volume is always re-entrant and volume control functions, f_mount(), f_mkfs() -/ and f_fdisk() function, are always not re-entrant. Only file/directory access -/ to the same volume is under control of this feature. -/ -/ 0: Disable re-entrancy. _FS_TIMEOUT and _SYNC_t have no effect. -/ 1: Enable re-entrancy. Also user provided synchronization handlers, -/ ff_req_grant(), ff_rel_grant(), ff_del_syncobj() and ff_cre_syncobj() -/ function, must be added to the project. Samples are available in -/ option/syscall.c. -/ -/ The _FS_TIMEOUT defines timeout period in unit of time tick. -/ The _SYNC_t defines O/S dependent sync object type. e.g. HANDLE, ID, OS_EVENT*, -/ SemaphoreHandle_t and etc.. */ - -#define _WORD_ACCESS 0 /* 0 or 1 */ -/* The _WORD_ACCESS option is an only platform dependent option. It defines -/ which access method is used to the word data on the FAT volume. -/ -/ 0: Byte-by-byte access. Always compatible with all platforms. -/ 1: Word access. Do not choose this unless under both the following conditions. -/ -/ * Address misaligned memory access is always allowed to ALL instructions. -/ * Byte order on the memory is little-endian. -/ -/ If it is the case, _WORD_ACCESS can also be set to 1 to reduce code size. -/ Following table shows allowable settings of some processor types. -/ -/ ARM7TDMI 0 ColdFire 0 V850E 0 -/ Cortex-M3 0 Z80 0/1 V850ES 0/1 -/ Cortex-M0 0 x86 0/1 TLCS-870 0/1 -/ AVR 0/1 RX600(LE) 0/1 TLCS-900 0/1 -/ AVR32 0 RL78 0 R32C 0 -/ PIC18 0/1 SH-2 0 M16C 0/1 -/ PIC24 0 H8S 0 MSP430 0 -/ PIC32 0 H8/300H 0 8051 0/1 -*/ - -#endif /* _FFCONF */ diff --git a/STM32CubeMX/SCSI2SD-V6/Inc/fsmc.h b/STM32CubeMX/SCSI2SD-V6/Inc/fsmc.h deleted file mode 100755 index 9e44a50d..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Inc/fsmc.h +++ /dev/null @@ -1,75 +0,0 @@ -/** - ****************************************************************************** - * File Name : FSMC.h - * Description : This file provides code for the configuration - * of the FSMC peripheral. - ****************************************************************************** - * - * COPYRIGHT(c) 2016 STMicroelectronics - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __FSMC_H -#define __FSMC_H -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal.h" - -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -extern SRAM_HandleTypeDef hsram1; - -/* USER CODE BEGIN Private defines */ - -/* USER CODE END Private defines */ - -void MX_FSMC_Init(void); -void HAL_SRAM_MspInit(SRAM_HandleTypeDef* hsram); -void HAL_SRAM_MspDeInit(SRAM_HandleTypeDef* hsram); - -/* USER CODE BEGIN Prototypes */ - -/* USER CODE END Prototypes */ - -#ifdef __cplusplus -} -#endif -#endif /*__FSMC_H */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Inc/gpio.h b/STM32CubeMX/SCSI2SD-V6/Inc/gpio.h deleted file mode 100755 index e5302d02..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Inc/gpio.h +++ /dev/null @@ -1,72 +0,0 @@ -/** - ****************************************************************************** - * File Name : gpio.h - * Description : This file contains all the functions prototypes for - * the gpio - ****************************************************************************** - * - * COPYRIGHT(c) 2016 STMicroelectronics - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __gpio_H -#define __gpio_H -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal.h" - -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -/* USER CODE BEGIN Private defines */ - -/* USER CODE END Private defines */ - -void MX_GPIO_Init(void); - -/* USER CODE BEGIN Prototypes */ - -/* USER CODE END Prototypes */ - -#ifdef __cplusplus -} -#endif -#endif /*__ pinoutConfig_H */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Inc/sdio.h b/STM32CubeMX/SCSI2SD-V6/Inc/sdio.h deleted file mode 100755 index f41bef01..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Inc/sdio.h +++ /dev/null @@ -1,74 +0,0 @@ -/** - ****************************************************************************** - * File Name : SDIO.h - * Description : This file provides code for the configuration - * of the SDIO instances. - ****************************************************************************** - * - * COPYRIGHT(c) 2016 STMicroelectronics - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __sdio_H -#define __sdio_H -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal.h" - -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -extern SD_HandleTypeDef hsd; -extern HAL_SD_CardInfoTypedef SDCardInfo; - -/* USER CODE BEGIN Private defines */ - -/* USER CODE END Private defines */ - -void MX_SDIO_SD_Init(void); - -/* USER CODE BEGIN Prototypes */ - -/* USER CODE END Prototypes */ - -#ifdef __cplusplus -} -#endif -#endif /*__ sdio_H */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Inc/spi.h b/STM32CubeMX/SCSI2SD-V6/Inc/spi.h deleted file mode 100755 index 42579f7b..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Inc/spi.h +++ /dev/null @@ -1,73 +0,0 @@ -/** - ****************************************************************************** - * File Name : SPI.h - * Description : This file provides code for the configuration - * of the SPI instances. - ****************************************************************************** - * - * COPYRIGHT(c) 2016 STMicroelectronics - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __spi_H -#define __spi_H -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal.h" - -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -extern SPI_HandleTypeDef hspi1; - -/* USER CODE BEGIN Private defines */ - -/* USER CODE END Private defines */ - -void MX_SPI1_Init(void); - -/* USER CODE BEGIN Prototypes */ - -/* USER CODE END Prototypes */ - -#ifdef __cplusplus -} -#endif -#endif /*__ spi_H */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Inc/stm32f2xx_hal_conf.h b/STM32CubeMX/SCSI2SD-V6/Inc/stm32f2xx_hal_conf.h deleted file mode 100755 index c899300d..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Inc/stm32f2xx_hal_conf.h +++ /dev/null @@ -1,382 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_hal_conf.h - * @brief HAL configuration file. - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2016 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F2xx_HAL_CONF_H -#define __STM32F2xx_HAL_CONF_H - -#ifdef __cplusplus - extern "C" { -#endif - -#include "mxconstants.h" - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -/* ########################## Module Selection ############################## */ -/** - * @brief This is the list of modules to be used in the HAL driver - */ -#define HAL_MODULE_ENABLED -//#define HAL_ADC_MODULE_ENABLED -//#define HAL_CAN_MODULE_ENABLED -//#define HAL_CRC_MODULE_ENABLED -//#define HAL_CRYP_MODULE_ENABLED -//#define HAL_DAC_MODULE_ENABLED -//#define HAL_DCMI_MODULE_ENABLED -//#define HAL_ETH_MODULE_ENABLED -//#define HAL_NAND_MODULE_ENABLED -//#define HAL_NOR_MODULE_ENABLED -//#define HAL_PCCARD_MODULE_ENABLED -#define HAL_SRAM_MODULE_ENABLED -//#define HAL_HASH_MODULE_ENABLED -//#define HAL_I2C_MODULE_ENABLED -//#define HAL_I2S_MODULE_ENABLED -//#define HAL_IWDG_MODULE_ENABLED -//#define HAL_RNG_MODULE_ENABLED -//#define HAL_RTC_MODULE_ENABLED -#define HAL_SD_MODULE_ENABLED -#define HAL_SPI_MODULE_ENABLED -#define HAL_TIM_MODULE_ENABLED -#define HAL_UART_MODULE_ENABLED -//#define HAL_USART_MODULE_ENABLED -//#define HAL_IRDA_MODULE_ENABLED -//#define HAL_SMARTCARD_MODULE_ENABLED -//#define HAL_WWDG_MODULE_ENABLED -#define HAL_PCD_MODULE_ENABLED -#define HAL_HCD_MODULE_ENABLED -#define HAL_GPIO_MODULE_ENABLED -#define HAL_DMA_MODULE_ENABLED -#define HAL_RCC_MODULE_ENABLED -#define HAL_FLASH_MODULE_ENABLED -#define HAL_PWR_MODULE_ENABLED -#define HAL_CORTEX_MODULE_ENABLED - -/* ########################## HSE/HSI Values adaptation ##################### */ -/** - * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. - * This value is used by the RCC HAL module to compute the system frequency - * (when HSE is used as system clock source, directly or through the PLL). - */ -#if !defined (HSE_VALUE) - #define HSE_VALUE ((uint32_t)20000000) /*!< Value of the External oscillator in Hz */ -#endif /* HSE_VALUE */ - -#if !defined (HSE_STARTUP_TIMEOUT) - #define HSE_STARTUP_TIMEOUT ((uint32_t)5000) /*!< Time out for HSE start up, in ms */ -#endif /* HSE_STARTUP_TIMEOUT */ - -/** - * @brief Internal High Speed oscillator (HSI) value. - * This value is used by the RCC HAL module to compute the system frequency - * (when HSI is used as system clock source, directly or through the PLL). - */ -#if !defined (HSI_VALUE) - #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/ -#endif /* HSI_VALUE */ - -/** - * @brief Internal Low Speed oscillator (LSI) value. - */ -#if !defined (LSI_VALUE) - #define LSI_VALUE ((uint32_t)32000) /*!< LSI Typical Value in Hz*/ -#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz - The real value may vary depending on the variations - in voltage and temperature.*/ -/** - * @brief External Low Speed oscillator (LSE) value. - */ -#if !defined (LSE_VALUE) - #define LSE_VALUE ((uint32_t)32768) /*!< Value of the External Low Speed oscillator in Hz */ -#endif /* LSE_VALUE */ - -/** - * @brief External clock source for I2S peripheral - * This value is used by the I2S HAL module to compute the I2S clock source - * frequency, this source is inserted directly through I2S_CKIN pad. - */ -#if !defined (EXTERNAL_CLOCK_VALUE) - #define EXTERNAL_CLOCK_VALUE ((uint32_t)12288000) /*!< Value of the External audio frequency in Hz*/ -#endif /* EXTERNAL_CLOCK_VALUE */ - -/* Tip: To avoid modifying this file each time you need to use different HSE, - === you can define the HSE value in your toolchain compiler preprocessor. */ - -/* ########################### System Configuration ######################### */ -/** - * @brief This is the HAL system configuration section - */ -#define VDD_VALUE ((uint32_t)3300) /*!< Value of VDD in mv */ -#define TICK_INT_PRIORITY ((uint32_t)0) /*!< tick interrupt priority */ -#define USE_RTOS 0 -#define PREFETCH_ENABLE 1 -#define INSTRUCTION_CACHE_ENABLE 1 -#define DATA_CACHE_ENABLE 1 - -/* ########################## Assert Selection ############################## */ -/** - * @brief Uncomment the line below to expanse the "assert_param" macro in the - * HAL drivers code - */ -/* #define USE_FULL_ASSERT 1 */ - -/* ################## Ethernet peripheral configuration ##################### */ - -/* Section 1 : Ethernet peripheral configuration */ - -/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */ -#define MAC_ADDR0 2 -#define MAC_ADDR1 0 -#define MAC_ADDR2 0 -#define MAC_ADDR3 0 -#define MAC_ADDR4 0 -#define MAC_ADDR5 0 - -/* Definition of the Ethernet driver buffers size and count */ -#define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */ -#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */ -#define ETH_RXBUFNB ((uint32_t)4) /* 4 Rx buffers of size ETH_RX_BUF_SIZE */ -#define ETH_TXBUFNB ((uint32_t)4) /* 4 Tx buffers of size ETH_TX_BUF_SIZE */ - -/* Section 2: PHY configuration section */ - -/* DP83848 PHY Address*/ -#define DP83848_PHY_ADDRESS 0x01 -/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/ -#define PHY_RESET_DELAY ((uint32_t)0x000000FF) -/* PHY Configuration delay */ -#define PHY_CONFIG_DELAY ((uint32_t)0x00000FFF) - -#define PHY_READ_TO ((uint32_t)0x0000FFFF) -#define PHY_WRITE_TO ((uint32_t)0x0000FFFF) - -/* Section 3: Common PHY Registers */ - -#define PHY_BCR ((uint16_t)0x00) /*!< Transceiver Basic Control Register */ -#define PHY_BSR ((uint16_t)0x01) /*!< Transceiver Basic Status Register */ - -#define PHY_RESET ((uint16_t)0x8000) /*!< PHY Reset */ -#define PHY_LOOPBACK ((uint16_t)0x4000) /*!< Select loop-back mode */ -#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100) /*!< Set the full-duplex mode at 100 Mb/s */ -#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000) /*!< Set the half-duplex mode at 100 Mb/s */ -#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100) /*!< Set the full-duplex mode at 10 Mb/s */ -#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000) /*!< Set the half-duplex mode at 10 Mb/s */ -#define PHY_AUTONEGOTIATION ((uint16_t)0x1000) /*!< Enable auto-negotiation function */ -#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200) /*!< Restart auto-negotiation function */ -#define PHY_POWERDOWN ((uint16_t)0x0800) /*!< Select the power down mode */ -#define PHY_ISOLATE ((uint16_t)0x0400) /*!< Isolate PHY from MII */ - -#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020) /*!< Auto-Negotiation process completed */ -#define PHY_LINKED_STATUS ((uint16_t)0x0004) /*!< Valid link established */ -#define PHY_JABBER_DETECTION ((uint16_t)0x0002) /*!< Jabber condition detected */ - -/* Section 4: Extended PHY Registers */ - -#define PHY_SR ((uint16_t)0x10) /*!< PHY status register Offset */ -#define PHY_MICR ((uint16_t)0x11) /*!< MII Interrupt Control Register */ -#define PHY_MISR ((uint16_t)0x12) /*!< MII Interrupt Status and Misc. Control Register */ - -#define PHY_LINK_STATUS ((uint16_t)0x0001) /*!< PHY Link mask */ -#define PHY_SPEED_STATUS ((uint16_t)0x0002) /*!< PHY Speed mask */ -#define PHY_DUPLEX_STATUS ((uint16_t)0x0004) /*!< PHY Duplex mask */ - -#define PHY_MICR_INT_EN ((uint16_t)0x0002) /*!< PHY Enable interrupts */ -#define PHY_MICR_INT_OE ((uint16_t)0x0001) /*!< PHY Enable output interrupt events */ - -#define PHY_MISR_LINK_INT_EN ((uint16_t)0x0020) /*!< Enable Interrupt on change of link status */ -#define PHY_LINK_INTERRUPT ((uint16_t)0x2000) /*!< PHY link status interrupt mask */ - -/* Includes ------------------------------------------------------------------*/ -/** - * @brief Include module's header file - */ - -#ifdef HAL_RCC_MODULE_ENABLED - #include "stm32f2xx_hal_rcc.h" -#endif /* HAL_RCC_MODULE_ENABLED */ - -#ifdef HAL_GPIO_MODULE_ENABLED - #include "stm32f2xx_hal_gpio.h" -#endif /* HAL_GPIO_MODULE_ENABLED */ - -#ifdef HAL_DMA_MODULE_ENABLED - #include "stm32f2xx_hal_dma.h" -#endif /* HAL_DMA_MODULE_ENABLED */ - -#ifdef HAL_CORTEX_MODULE_ENABLED - #include "stm32f2xx_hal_cortex.h" -#endif /* HAL_CORTEX_MODULE_ENABLED */ - -#ifdef HAL_ADC_MODULE_ENABLED - #include "stm32f2xx_hal_adc.h" -#endif /* HAL_ADC_MODULE_ENABLED */ - -#ifdef HAL_CAN_MODULE_ENABLED - #include "stm32f2xx_hal_can.h" -#endif /* HAL_CAN_MODULE_ENABLED */ - -#ifdef HAL_CRC_MODULE_ENABLED - #include "stm32f2xx_hal_crc.h" -#endif /* HAL_CRC_MODULE_ENABLED */ - -#ifdef HAL_CRYP_MODULE_ENABLED - #include "stm32f2xx_hal_cryp.h" -#endif /* HAL_CRYP_MODULE_ENABLED */ - -#ifdef HAL_DAC_MODULE_ENABLED - #include "stm32f2xx_hal_dac.h" -#endif /* HAL_DAC_MODULE_ENABLED */ - -#ifdef HAL_DCMI_MODULE_ENABLED - #include "stm32f2xx_hal_dcmi.h" -#endif /* HAL_DCMI_MODULE_ENABLED */ - -#ifdef HAL_ETH_MODULE_ENABLED - #include "stm32f2xx_hal_eth.h" -#endif /* HAL_ETH_MODULE_ENABLED */ - -#ifdef HAL_FLASH_MODULE_ENABLED - #include "stm32f2xx_hal_flash.h" -#endif /* HAL_FLASH_MODULE_ENABLED */ - -#ifdef HAL_SRAM_MODULE_ENABLED - #include "stm32f2xx_hal_sram.h" -#endif /* HAL_SRAM_MODULE_ENABLED */ - -#ifdef HAL_NOR_MODULE_ENABLED - #include "stm32f2xx_hal_nor.h" -#endif /* HAL_NOR_MODULE_ENABLED */ - -#ifdef HAL_NAND_MODULE_ENABLED - #include "stm32f2xx_hal_nand.h" -#endif /* HAL_NAND_MODULE_ENABLED */ - -#ifdef HAL_PCCARD_MODULE_ENABLED - #include "stm32f2xx_hal_pccard.h" -#endif /* HAL_PCCARD_MODULE_ENABLED */ - -#ifdef HAL_HASH_MODULE_ENABLED - #include "stm32f2xx_hal_hash.h" -#endif /* HAL_HASH_MODULE_ENABLED */ - -#ifdef HAL_I2C_MODULE_ENABLED - #include "stm32f2xx_hal_i2c.h" -#endif /* HAL_I2C_MODULE_ENABLED */ - -#ifdef HAL_I2S_MODULE_ENABLED - #include "stm32f2xx_hal_i2s.h" -#endif /* HAL_I2S_MODULE_ENABLED */ - -#ifdef HAL_IWDG_MODULE_ENABLED - #include "stm32f2xx_hal_iwdg.h" -#endif /* HAL_IWDG_MODULE_ENABLED */ - -#ifdef HAL_PWR_MODULE_ENABLED - #include "stm32f2xx_hal_pwr.h" -#endif /* HAL_PWR_MODULE_ENABLED */ - -#ifdef HAL_RNG_MODULE_ENABLED - #include "stm32f2xx_hal_rng.h" -#endif /* HAL_RNG_MODULE_ENABLED */ - -#ifdef HAL_RTC_MODULE_ENABLED - #include "stm32f2xx_hal_rtc.h" -#endif /* HAL_RTC_MODULE_ENABLED */ - -#ifdef HAL_SD_MODULE_ENABLED - #include "stm32f2xx_hal_sd.h" -#endif /* HAL_SD_MODULE_ENABLED */ - -#ifdef HAL_SPI_MODULE_ENABLED - #include "stm32f2xx_hal_spi.h" -#endif /* HAL_SPI_MODULE_ENABLED */ - -#ifdef HAL_TIM_MODULE_ENABLED - #include "stm32f2xx_hal_tim.h" -#endif /* HAL_TIM_MODULE_ENABLED */ - -#ifdef HAL_UART_MODULE_ENABLED - #include "stm32f2xx_hal_uart.h" -#endif /* HAL_UART_MODULE_ENABLED */ - -#ifdef HAL_USART_MODULE_ENABLED - #include "stm32f2xx_hal_usart.h" -#endif /* HAL_USART_MODULE_ENABLED */ - -#ifdef HAL_IRDA_MODULE_ENABLED - #include "stm32f2xx_hal_irda.h" -#endif /* HAL_IRDA_MODULE_ENABLED */ - -#ifdef HAL_SMARTCARD_MODULE_ENABLED - #include "stm32f2xx_hal_smartcard.h" -#endif /* HAL_SMARTCARD_MODULE_ENABLED */ - -#ifdef HAL_WWDG_MODULE_ENABLED - #include "stm32f2xx_hal_wwdg.h" -#endif /* HAL_WWDG_MODULE_ENABLED */ - -#ifdef HAL_PCD_MODULE_ENABLED - #include "stm32f2xx_hal_pcd.h" -#endif /* HAL_PCD_MODULE_ENABLED */ - -#ifdef HAL_HCD_MODULE_ENABLED - #include "stm32f2xx_hal_hcd.h" -#endif /* HAL_HCD_MODULE_ENABLED */ - -/* Exported macro ------------------------------------------------------------*/ -#ifdef USE_FULL_ASSERT -/** - * @brief The assert_param macro is used for function's parameters check. - * @param expr: If expr is false, it calls assert_failed function - * which reports the name of the source file and the source - * line number of the call that failed. - * If expr is true, it returns no value. - * @retval None - */ - #define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__)) -/* Exported functions ------------------------------------------------------- */ - void assert_failed(uint8_t* file, uint32_t line); -#else - #define assert_param(expr) ((void)0) -#endif /* USE_FULL_ASSERT */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F2xx_HAL_CONF_H */ - - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Inc/stm32f2xx_it.h b/STM32CubeMX/SCSI2SD-V6/Inc/stm32f2xx_it.h deleted file mode 100755 index 4c7075ab..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Inc/stm32f2xx_it.h +++ /dev/null @@ -1,63 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f2xx_it.h - * @brief This file contains the headers of the interrupt handlers. - ****************************************************************************** - * - * COPYRIGHT(c) 2016 STMicroelectronics - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F2xx_IT_H -#define __STM32F2xx_IT_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ - -void SysTick_Handler(void); -void EXTI3_IRQHandler(void); -void EXTI4_IRQHandler(void); -void SDIO_IRQHandler(void); -void DMA2_Stream3_IRQHandler(void); -void OTG_FS_IRQHandler(void); -void DMA2_Stream6_IRQHandler(void); -void OTG_HS_IRQHandler(void); - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F2xx_IT_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Inc/usart.h b/STM32CubeMX/SCSI2SD-V6/Inc/usart.h deleted file mode 100755 index 33869711..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Inc/usart.h +++ /dev/null @@ -1,73 +0,0 @@ -/** - ****************************************************************************** - * File Name : USART.h - * Description : This file provides code for the configuration - * of the USART instances. - ****************************************************************************** - * - * COPYRIGHT(c) 2016 STMicroelectronics - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __usart_H -#define __usart_H -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal.h" - -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -extern UART_HandleTypeDef huart3; - -/* USER CODE BEGIN Private defines */ - -/* USER CODE END Private defines */ - -void MX_USART3_UART_Init(void); - -/* USER CODE BEGIN Prototypes */ - -/* USER CODE END Prototypes */ - -#ifdef __cplusplus -} -#endif -#endif /*__ usart_H */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Inc/usb_device.h b/STM32CubeMX/SCSI2SD-V6/Inc/usb_device.h deleted file mode 100755 index e8edc842..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Inc/usb_device.h +++ /dev/null @@ -1,63 +0,0 @@ -/** - ****************************************************************************** - * @file : USB_DEVICE - * @version : v1.0_Cube - * @brief : Header for usb_device file. - ****************************************************************************** - * COPYRIGHT(c) 2016 STMicroelectronics - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** -*/ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __usb_device_H -#define __usb_device_H -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx.h" -#include "stm32f2xx_hal.h" -#include "usbd_def.h" - -extern USBD_HandleTypeDef hUsbDeviceFS; - -/* USB_Device init function */ -void MX_USB_DEVICE_Init(void); - -#ifdef __cplusplus -} -#endif -#endif /*__usb_device_H */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Inc/usb_host.h b/STM32CubeMX/SCSI2SD-V6/Inc/usb_host.h deleted file mode 100755 index c2df36fd..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Inc/usb_host.h +++ /dev/null @@ -1,68 +0,0 @@ -/** - ****************************************************************************** - * @file : USB_HOST - * @version : v1.0_Cube - * @brief : Header for usb_host file. - ****************************************************************************** - * COPYRIGHT(c) 2016 STMicroelectronics - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** -*/ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __usb_host_H -#define __usb_host_H -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx.h" -#include "stm32f2xx_hal.h" - -typedef enum { - APPLICATION_IDLE = 0, - APPLICATION_START, - APPLICATION_READY, - APPLICATION_DISCONNECT, -}ApplicationTypeDef; - -void MX_USB_HOST_Init(void); -void MX_USB_HOST_Process(void); - -#ifdef __cplusplus -} -#endif -#endif /*__usb_host_H */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Inc/usbd_conf.h b/STM32CubeMX/SCSI2SD-V6/Inc/usbd_conf.h deleted file mode 100755 index a2dcbcf1..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Inc/usbd_conf.h +++ /dev/null @@ -1,170 +0,0 @@ -/** - ****************************************************************************** - * @file : usbd_conf.h - * @version : v1.0_Cube - * @brief : Header for usbd_conf file. - ****************************************************************************** - * COPYRIGHT(c) 2016 STMicroelectronics - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** -*/ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_CONF__H__ -#define __USBD_CONF__H__ -#ifdef __cplusplus - extern "C" { -#endif -/* Includes ------------------------------------------------------------------*/ -#include -#include -#include -#include "stm32f2xx.h" -#include "stm32f2xx_hal.h" - -/** @addtogroup USBD_OTG_DRIVER - * @{ - */ - -/** @defgroup USBD_CONF - * @brief usb otg low level driver configuration file - * @{ - */ - -/** @defgroup USBD_CONF_Exported_Defines - * @{ - */ - -/*---------- -----------*/ -#define USBD_MAX_NUM_INTERFACES 2 -/*---------- -----------*/ -#define USBD_MAX_NUM_CONFIGURATION 1 -/*---------- -----------*/ -#define USBD_MAX_STR_DESC_SIZ 512 -/*---------- -----------*/ -#define USBD_SUPPORT_USER_STRING 0 -/*---------- -----------*/ -#define USBD_DEBUG_LEVEL 0 -/*---------- -----------*/ -#define USBD_LPM_ENABLED 0 -/*---------- -----------*/ -#define USBD_SELF_POWERED 1 - -/****************************************/ -/* #define for FS and HS identification */ -#define DEVICE_FS 0 -#define DEVICE_HS 1 - -/** @defgroup USBD_Exported_Macros - * @{ - */ - - /* Memory management macros */ -#define USBD_malloc malloc -#define USBD_free free -#define USBD_memset memset -#define USBD_memcpy memcpy - -#define USBD_Delay HAL_Delay - - /* DEBUG macros */ - -#if (USBD_DEBUG_LEVEL > 0) -#define USBD_UsrLog(...) printf(__VA_ARGS__);\ - printf("\n"); -#else -#define USBD_UsrLog(...) -#endif - - -#if (USBD_DEBUG_LEVEL > 1) - -#define USBD_ErrLog(...) printf("ERROR: ") ;\ - printf(__VA_ARGS__);\ - printf("\n"); -#else -#define USBD_ErrLog(...) -#endif - - -#if (USBD_DEBUG_LEVEL > 2) -#define USBD_DbgLog(...) printf("DEBUG : ") ;\ - printf(__VA_ARGS__);\ - printf("\n"); -#else -#define USBD_DbgLog(...) -#endif - -/** - * @} - */ - - - -/** - * @} - */ - -/** @defgroup USBD_CONF_Exported_Types - * @{ - */ -/** - * @} - */ - -/** @defgroup USBD_CONF_Exported_Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup USBD_CONF_Exported_Variables - * @{ - */ -/** - * @} - */ - -/** @defgroup USBD_CONF_Exported_FunctionsPrototype - * @{ - */ -/** - * @} - */ -#ifdef __cplusplus -} -#endif - -#endif //__USBD_CONF__H__ - -/** - * @} - */ - -/** - * @} - */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - diff --git a/STM32CubeMX/SCSI2SD-V6/Inc/usbd_desc.h b/STM32CubeMX/SCSI2SD-V6/Inc/usbd_desc.h deleted file mode 100755 index aff7527e..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Inc/usbd_desc.h +++ /dev/null @@ -1,103 +0,0 @@ -/** - ****************************************************************************** - * @file : usbd_desc.h - * @version : v1.0_Cube - * @brief : Header for usbd_desc file. - ****************************************************************************** - * COPYRIGHT(c) 2016 STMicroelectronics - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** -*/ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_DESC__H__ -#define __USBD_DESC__H__ - -#ifdef __cplusplus - extern "C" { -#endif -/* Includes ------------------------------------------------------------------*/ -#include "usbd_def.h" - -/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup USB_DESC - * @brief general defines for the usb device library file - * @{ - */ - -/** @defgroup USB_DESC_Exported_Defines - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_DESC_Exported_TypesDefinitions - * @{ - */ -/** - * @} - */ - -/** @defgroup USBD_DESC_Exported_Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup USBD_DESC_Exported_Variables - * @{ - */ -extern USBD_DescriptorsTypeDef FS_Desc; -/** - * @} - */ - -/** @defgroup USBD_DESC_Exported_FunctionsPrototype - * @{ - */ - -/** - * @} - */ -#ifdef __cplusplus -} -#endif - -#endif /* __USBD_DESC_H */ - -/** - * @} - */ - -/** -* @} -*/ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Inc/usbh_conf.h b/STM32CubeMX/SCSI2SD-V6/Inc/usbh_conf.h deleted file mode 100755 index d056faa7..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Inc/usbh_conf.h +++ /dev/null @@ -1,178 +0,0 @@ -/** - ****************************************************************************** - * @file : usbh_conf.h - * @version : v1.0_Cube - * @brief : Header for usbh_conf file. - ****************************************************************************** - * COPYRIGHT(c) 2016 STMicroelectronics - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** -*/ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBH_CONF__H__ -#define __USBH_CONF__H__ -#include -#include -#include -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx.h" -#include "stm32f2xx_hal.h" - -/** - MiddleWare name : USB_HOST - MiddleWare fileName : usbh_conf.h - MiddleWare version : -*/ -/*---------- -----------*/ -#define USBH_MAX_NUM_ENDPOINTS 2 - -/*---------- -----------*/ -#define USBH_MAX_NUM_INTERFACES 2 - -/*---------- -----------*/ -#define USBH_MAX_NUM_CONFIGURATION 1 - -/*---------- -----------*/ -#define USBH_KEEP_CFG_DESCRIPTOR 1 - -/*---------- -----------*/ -#define USBH_MAX_NUM_SUPPORTED_CLASS 1 - -/*---------- -----------*/ -#define USBH_MAX_SIZE_CONFIGURATION 256 - -/*---------- -----------*/ -#define USBH_MAX_DATA_BUFFER 512 - -/*---------- -----------*/ -#define USBH_DEBUG_LEVEL 0 - -/*---------- -----------*/ -#define USBH_USE_OS 0 - - - - -/****************************************/ -/* #define for FS and HS identification */ -#define HOST_HS 0 -#define HOST_FS 1 - -/** @defgroup USBH_Exported_Macros - * @{ - */ -#if (USBH_USE_OS == 1) - #include "cmsis_os.h" - #define USBH_PROCESS_PRIO osPriorityNormal - #define USBH_PROCESS_STACK_SIZE ((uint16_t)0) -#endif - - /* Memory management macros */ -#define USBH_malloc malloc -#define USBH_free free -#define USBH_memset memset -#define USBH_memcpy memcpy - - /* DEBUG macros */ - -#if (USBH_DEBUG_LEVEL > 0) -#define USBH_UsrLog(...) printf(__VA_ARGS__);\ - printf("\n"); -#else -#define USBH_UsrLog(...) -#endif - - -#if (USBH_DEBUG_LEVEL > 1) - -#define USBH_ErrLog(...) printf("ERROR: ") ;\ - printf(__VA_ARGS__);\ - printf("\n"); -#else -#define USBH_ErrLog(...) -#endif - - -#if (USBH_DEBUG_LEVEL > 2) -#define USBH_DbgLog(...) printf("DEBUG : ") ;\ - printf(__VA_ARGS__);\ - printf("\n"); -#else -#define USBH_DbgLog(...) -#endif - -/** - * @} - */ - - - -/** - * @} - */ - -/** @defgroup USBH_CONF_Exported_Types - * @{ - */ -/** - * @} - */ - -/** @defgroup USBH_CONF_Exported_Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup USBH_CONF_Exported_Variables - * @{ - */ -/** - * @} - */ - -/** @defgroup USBH_CONF_Exported_FunctionsPrototype - * @{ - */ -/** - * @} - */ - -#endif //__USBH_CONF__H__ - -/** - * @} - */ - -/** - * @} - */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - diff --git a/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_conf_template.h b/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_conf_template.h deleted file mode 100755 index e1dfcee1..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_conf_template.h +++ /dev/null @@ -1,169 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_conf_template.h - * @author MCD Application Team - * @version V2.4.1 - * @date 19-June-2015 - * @brief Header file for the usbd_conf_template.c file - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_CONF_TEMPLATE_H -#define __USBD_CONF_TEMPLATE_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32fxxx.h" /* replace 'stm32xxx' with your HAL driver header filename, ex: stm32f4xx.h */ -#include -#include -#include - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup USBD_CONF - * @brief USB device low level driver configuration file - * @{ - */ - -/** @defgroup USBD_CONF_Exported_Defines - * @{ - */ - -#define USBD_MAX_NUM_INTERFACES 1 -#define USBD_MAX_NUM_CONFIGURATION 1 -#define USBD_MAX_STR_DESC_SIZ 0x100 -#define USBD_SUPPORT_USER_STRING 0 -#define USBD_SELF_POWERED 1 -#define USBD_DEBUG_LEVEL 2 - -/* MSC Class Config */ -#define MSC_MEDIA_PACKET 8192 - -/* CDC Class Config */ -#define USBD_CDC_INTERVAL 2000 - - /* DFU Class Config */ -#define USBD_DFU_MAX_ITF_NUM 1 -#define USBD_DFU_XFERS_IZE 1024 - - /* AUDIO Class Config */ -#define USBD_AUDIO_FREQ 22100 - -/** @defgroup USBD_Exported_Macros - * @{ - */ - - /* Memory management macros */ -#define USBD_malloc malloc -#define USBD_free free -#define USBD_memset memset -#define USBD_memcpy memcpy - - /* DEBUG macros */ - - -#if (USBD_DEBUG_LEVEL > 0) -#define USBD_UsrLog(...) printf(__VA_ARGS__);\ - printf("\n"); -#else -#define USBD_UsrLog(...) -#endif - - -#if (USBD_DEBUG_LEVEL > 1) - -#define USBD_ErrLog(...) printf("ERROR: ") ;\ - printf(__VA_ARGS__);\ - printf("\n"); -#else -#define USBD_ErrLog(...) -#endif - - -#if (USBD_DEBUG_LEVEL > 2) -#define USBD_DbgLog(...) printf("DEBUG : ") ;\ - printf(__VA_ARGS__);\ - printf("\n"); -#else -#define USBD_DbgLog(...) -#endif - -/** - * @} - */ - - - -/** - * @} - */ - - -/** @defgroup USBD_CONF_Exported_Types - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_CONF_Exported_Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup USBD_CONF_Exported_Variables - * @{ - */ -/** - * @} - */ - -/** @defgroup USBD_CONF_Exported_FunctionsPrototype - * @{ - */ -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBD_CONF_TEMPLATE_H */ - - -/** - * @} - */ - -/** - * @} - */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - diff --git a/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h b/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h deleted file mode 100755 index d2d36c82..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h +++ /dev/null @@ -1,113 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_req.h - * @author MCD Application Team - * @version V2.4.1 - * @date 19-June-2015 - * @brief Header file for the usbd_req.c file - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_REQUEST_H -#define __USB_REQUEST_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_def.h" - - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup USBD_REQ - * @brief header file for the usbd_req.c file - * @{ - */ - -/** @defgroup USBD_REQ_Exported_Defines - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_REQ_Exported_Types - * @{ - */ -/** - * @} - */ - - - -/** @defgroup USBD_REQ_Exported_Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup USBD_REQ_Exported_Variables - * @{ - */ -/** - * @} - */ - -/** @defgroup USBD_REQ_Exported_FunctionsPrototype - * @{ - */ - -USBD_StatusTypeDef USBD_StdDevReq (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -USBD_StatusTypeDef USBD_StdItfReq (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -USBD_StatusTypeDef USBD_StdEPReq (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); - - -void USBD_CtlError (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); - -void USBD_ParseSetupRequest (USBD_SetupReqTypedef *req, uint8_t *pdata); - -void USBD_GetString (uint8_t *desc, uint8_t *unicode, uint16_t *len); -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USB_REQUEST_H */ - -/** - * @} - */ - -/** -* @} -*/ - - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_def.h b/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_def.h deleted file mode 100755 index 52bb19b0..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_def.h +++ /dev/null @@ -1,330 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_def.h - * @author MCD Application Team - * @version V2.4.1 - * @date 19-June-2015 - * @brief General defines for the usb device library - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_DEF_H -#define __USBD_DEF_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_conf.h" - -/** @addtogroup STM32_USBD_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup USB_DEF - * @brief general defines for the usb device library file - * @{ - */ - -/** @defgroup USB_DEF_Exported_Defines - * @{ - */ - -#ifndef NULL -#define NULL 0 -#endif - - -#define USB_LEN_DEV_QUALIFIER_DESC 0x0A -#define USB_LEN_DEV_DESC 0x12 -#define USB_LEN_CFG_DESC 0x09 -#define USB_LEN_IF_DESC 0x09 -#define USB_LEN_EP_DESC 0x07 -#define USB_LEN_OTG_DESC 0x03 -#define USB_LEN_LANGID_STR_DESC 0x04 -#define USB_LEN_OTHER_SPEED_DESC_SIZ 0x09 - -#define USBD_IDX_LANGID_STR 0x00 -#define USBD_IDX_MFC_STR 0x01 -#define USBD_IDX_PRODUCT_STR 0x02 -#define USBD_IDX_SERIAL_STR 0x03 -#define USBD_IDX_CONFIG_STR 0x04 -#define USBD_IDX_INTERFACE_STR 0x05 - -#define USB_REQ_TYPE_STANDARD 0x00 -#define USB_REQ_TYPE_CLASS 0x20 -#define USB_REQ_TYPE_VENDOR 0x40 -#define USB_REQ_TYPE_MASK 0x60 - -#define USB_REQ_RECIPIENT_DEVICE 0x00 -#define USB_REQ_RECIPIENT_INTERFACE 0x01 -#define USB_REQ_RECIPIENT_ENDPOINT 0x02 -#define USB_REQ_RECIPIENT_MASK 0x03 - -#define USB_REQ_GET_STATUS 0x00 -#define USB_REQ_CLEAR_FEATURE 0x01 -#define USB_REQ_SET_FEATURE 0x03 -#define USB_REQ_SET_ADDRESS 0x05 -#define USB_REQ_GET_DESCRIPTOR 0x06 -#define USB_REQ_SET_DESCRIPTOR 0x07 -#define USB_REQ_GET_CONFIGURATION 0x08 -#define USB_REQ_SET_CONFIGURATION 0x09 -#define USB_REQ_GET_INTERFACE 0x0A -#define USB_REQ_SET_INTERFACE 0x0B -#define USB_REQ_SYNCH_FRAME 0x0C - -#define USB_DESC_TYPE_DEVICE 1 -#define USB_DESC_TYPE_CONFIGURATION 2 -#define USB_DESC_TYPE_STRING 3 -#define USB_DESC_TYPE_INTERFACE 4 -#define USB_DESC_TYPE_ENDPOINT 5 -#define USB_DESC_TYPE_DEVICE_QUALIFIER 6 -#define USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION 7 -#define USB_DESC_TYPE_BOS 0x0F - -#define USB_CONFIG_REMOTE_WAKEUP 2 -#define USB_CONFIG_SELF_POWERED 1 - -#define USB_FEATURE_EP_HALT 0 -#define USB_FEATURE_REMOTE_WAKEUP 1 -#define USB_FEATURE_TEST_MODE 2 - -#define USB_DEVICE_CAPABITY_TYPE 0x10 - -#define USB_HS_MAX_PACKET_SIZE 512 -#define USB_FS_MAX_PACKET_SIZE 64 -#define USB_MAX_EP0_SIZE 64 - -/* Device Status */ -#define USBD_STATE_DEFAULT 1 -#define USBD_STATE_ADDRESSED 2 -#define USBD_STATE_CONFIGURED 3 -#define USBD_STATE_SUSPENDED 4 - - -/* EP0 State */ -#define USBD_EP0_IDLE 0 -#define USBD_EP0_SETUP 1 -#define USBD_EP0_DATA_IN 2 -#define USBD_EP0_DATA_OUT 3 -#define USBD_EP0_STATUS_IN 4 -#define USBD_EP0_STATUS_OUT 5 -#define USBD_EP0_STALL 6 - -#define USBD_EP_TYPE_CTRL 0 -#define USBD_EP_TYPE_ISOC 1 -#define USBD_EP_TYPE_BULK 2 -#define USBD_EP_TYPE_INTR 3 - - -/** - * @} - */ - - -/** @defgroup USBD_DEF_Exported_TypesDefinitions - * @{ - */ - -typedef struct usb_setup_req -{ - - uint8_t bmRequest; - uint8_t bRequest; - uint16_t wValue; - uint16_t wIndex; - uint16_t wLength; -}USBD_SetupReqTypedef; - -struct _USBD_HandleTypeDef; - -typedef struct _Device_cb -{ - uint8_t (*Init) (struct _USBD_HandleTypeDef *pdev , uint8_t cfgidx); - uint8_t (*DeInit) (struct _USBD_HandleTypeDef *pdev , uint8_t cfgidx); - /* Control Endpoints*/ - uint8_t (*Setup) (struct _USBD_HandleTypeDef *pdev , USBD_SetupReqTypedef *req); - uint8_t (*EP0_TxSent) (struct _USBD_HandleTypeDef *pdev ); - uint8_t (*EP0_RxReady) (struct _USBD_HandleTypeDef *pdev ); - /* Class Specific Endpoints*/ - uint8_t (*DataIn) (struct _USBD_HandleTypeDef *pdev , uint8_t epnum); - uint8_t (*DataOut) (struct _USBD_HandleTypeDef *pdev , uint8_t epnum); - uint8_t (*SOF) (struct _USBD_HandleTypeDef *pdev); - uint8_t (*IsoINIncomplete) (struct _USBD_HandleTypeDef *pdev , uint8_t epnum); - uint8_t (*IsoOUTIncomplete) (struct _USBD_HandleTypeDef *pdev , uint8_t epnum); - - uint8_t *(*GetHSConfigDescriptor)(uint16_t *length); - uint8_t *(*GetFSConfigDescriptor)(uint16_t *length); - uint8_t *(*GetOtherSpeedConfigDescriptor)(uint16_t *length); - uint8_t *(*GetDeviceQualifierDescriptor)(uint16_t *length); -#if (USBD_SUPPORT_USER_STRING == 1) - uint8_t *(*GetUsrStrDescriptor)(struct _USBD_HandleTypeDef *pdev ,uint8_t index, uint16_t *length); -#endif - -} USBD_ClassTypeDef; - -/* Following USB Device Speed */ -typedef enum -{ - USBD_SPEED_HIGH = 0, - USBD_SPEED_FULL = 1, - USBD_SPEED_LOW = 2, -}USBD_SpeedTypeDef; - -/* Following USB Device status */ -typedef enum { - USBD_OK = 0, - USBD_BUSY, - USBD_FAIL, -}USBD_StatusTypeDef; - -/* USB Device descriptors structure */ -typedef struct -{ - uint8_t *(*GetDeviceDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length); - uint8_t *(*GetLangIDStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length); - uint8_t *(*GetManufacturerStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length); - uint8_t *(*GetProductStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length); - uint8_t *(*GetSerialStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length); - uint8_t *(*GetConfigurationStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length); - uint8_t *(*GetInterfaceStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length); -#if (USBD_LPM_ENABLED == 1) - uint8_t *(*GetBOSDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length); -#endif -} USBD_DescriptorsTypeDef; - -/* USB Device handle structure */ -typedef struct -{ - uint32_t status; - uint32_t total_length; - uint32_t rem_length; - uint32_t maxpacket; -} USBD_EndpointTypeDef; - -/* USB Device handle structure */ -typedef struct _USBD_HandleTypeDef -{ - uint8_t id; - uint32_t dev_config; - uint32_t dev_default_config; - uint32_t dev_config_status; - USBD_SpeedTypeDef dev_speed; - USBD_EndpointTypeDef ep_in[15]; - USBD_EndpointTypeDef ep_out[15]; - uint32_t ep0_state; - uint32_t ep0_data_len; - uint8_t dev_state; - uint8_t dev_old_state; - uint8_t dev_address; - uint8_t dev_connection_status; - uint8_t dev_test_mode; - uint32_t dev_remote_wakeup; - - USBD_SetupReqTypedef request; - USBD_DescriptorsTypeDef *pDesc; - USBD_ClassTypeDef *pClass; - void *pClassData; - void *pUserData; - void *pData; -} USBD_HandleTypeDef; - -/** - * @} - */ - - - -/** @defgroup USBD_DEF_Exported_Macros - * @{ - */ -#define SWAPBYTE(addr) (((uint16_t)(*((uint8_t *)(addr)))) + \ - (((uint16_t)(*(((uint8_t *)(addr)) + 1))) << 8)) - -#define LOBYTE(x) ((uint8_t)(x & 0x00FF)) -#define HIBYTE(x) ((uint8_t)((x & 0xFF00) >>8)) -#define MIN(a, b) (((a) < (b)) ? (a) : (b)) -#define MAX(a, b) (((a) > (b)) ? (a) : (b)) - - -#if defined ( __GNUC__ ) - #ifndef __weak - #define __weak __attribute__((weak)) - #endif /* __weak */ - #ifndef __packed - #define __packed __attribute__((__packed__)) - #endif /* __packed */ -#endif /* __GNUC__ */ - - -/* In HS mode and when the DMA is used, all variables and data structures dealing - with the DMA during the transaction process should be 4-bytes aligned */ - -#if defined (__GNUC__) /* GNU Compiler */ - #define __ALIGN_END __attribute__ ((aligned (4))) - #define __ALIGN_BEGIN -#else - #define __ALIGN_END - #if defined (__CC_ARM) /* ARM Compiler */ - #define __ALIGN_BEGIN __align(4) - #elif defined (__ICCARM__) /* IAR Compiler */ - #define __ALIGN_BEGIN - #elif defined (__TASKING__) /* TASKING Compiler */ - #define __ALIGN_BEGIN __align(4) - #endif /* __CC_ARM */ -#endif /* __GNUC__ */ - - -/** - * @} - */ - -/** @defgroup USBD_DEF_Exported_Variables - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_DEF_Exported_FunctionsPrototype - * @{ - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBD_DEF_H */ - -/** - * @} - */ - -/** -* @} -*/ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ioreq.h b/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ioreq.h deleted file mode 100755 index 3cd921ea..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ioreq.h +++ /dev/null @@ -1,128 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_ioreq.h - * @author MCD Application Team - * @version V2.4.1 - * @date 19-June-2015 - * @brief Header file for the usbd_ioreq.c file - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_IOREQ_H -#define __USBD_IOREQ_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_def.h" -#include "usbd_core.h" - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup USBD_IOREQ - * @brief header file for the usbd_ioreq.c file - * @{ - */ - -/** @defgroup USBD_IOREQ_Exported_Defines - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_IOREQ_Exported_Types - * @{ - */ - - -/** - * @} - */ - - - -/** @defgroup USBD_IOREQ_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_IOREQ_Exported_Variables - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_IOREQ_Exported_FunctionsPrototype - * @{ - */ - -USBD_StatusTypeDef USBD_CtlSendData (USBD_HandleTypeDef *pdev, - uint8_t *buf, - uint16_t len); - -USBD_StatusTypeDef USBD_CtlContinueSendData (USBD_HandleTypeDef *pdev, - uint8_t *pbuf, - uint16_t len); - -USBD_StatusTypeDef USBD_CtlPrepareRx (USBD_HandleTypeDef *pdev, - uint8_t *pbuf, - uint16_t len); - -USBD_StatusTypeDef USBD_CtlContinueRx (USBD_HandleTypeDef *pdev, - uint8_t *pbuf, - uint16_t len); - -USBD_StatusTypeDef USBD_CtlSendStatus (USBD_HandleTypeDef *pdev); - -USBD_StatusTypeDef USBD_CtlReceiveStatus (USBD_HandleTypeDef *pdev); - -uint16_t USBD_GetRxCount (USBD_HandleTypeDef *pdev , - uint8_t epnum); - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBD_IOREQ_H */ - -/** - * @} - */ - -/** -* @} -*/ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c b/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c deleted file mode 100755 index 3af2b7c7..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c +++ /dev/null @@ -1,565 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_core.c - * @author MCD Application Team - * @version V2.4.1 - * @date 19-June-2015 - * @brief This file provides all the USBD core functions. - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_core.h" - -/** @addtogroup STM32_USBD_DEVICE_LIBRARY -* @{ -*/ - - -/** @defgroup USBD_CORE -* @brief usbd core module -* @{ -*/ - -/** @defgroup USBD_CORE_Private_TypesDefinitions -* @{ -*/ -/** -* @} -*/ - - -/** @defgroup USBD_CORE_Private_Defines -* @{ -*/ - -/** -* @} -*/ - - -/** @defgroup USBD_CORE_Private_Macros -* @{ -*/ -/** -* @} -*/ - - - - -/** @defgroup USBD_CORE_Private_FunctionPrototypes -* @{ -*/ - -/** -* @} -*/ - -/** @defgroup USBD_CORE_Private_Variables -* @{ -*/ - -/** -* @} -*/ - -/** @defgroup USBD_CORE_Private_Functions -* @{ -*/ - -/** -* @brief USBD_Init -* Initializes the device stack and load the class driver -* @param pdev: device instance -* @param pdesc: Descriptor structure address -* @param id: Low level core index -* @retval None -*/ -USBD_StatusTypeDef USBD_Init(USBD_HandleTypeDef *pdev, USBD_DescriptorsTypeDef *pdesc, uint8_t id) -{ - /* Check whether the USB Host handle is valid */ - if(pdev == NULL) - { - USBD_ErrLog("Invalid Device handle"); - return USBD_FAIL; - } - - /* Unlink previous class*/ - if(pdev->pClass != NULL) - { - pdev->pClass = NULL; - } - - /* Assign USBD Descriptors */ - if(pdesc != NULL) - { - pdev->pDesc = pdesc; - } - - /* Set Device initial State */ - pdev->dev_state = USBD_STATE_DEFAULT; - pdev->id = id; - /* Initialize low level driver */ - USBD_LL_Init(pdev); - - return USBD_OK; -} - -/** -* @brief USBD_DeInit -* Re-Initialize th device library -* @param pdev: device instance -* @retval status: status -*/ -USBD_StatusTypeDef USBD_DeInit(USBD_HandleTypeDef *pdev) -{ - /* Set Default State */ - pdev->dev_state = USBD_STATE_DEFAULT; - - /* Free Class Resources */ - pdev->pClass->DeInit(pdev, pdev->dev_config); - - /* Stop the low level driver */ - USBD_LL_Stop(pdev); - - /* Initialize low level driver */ - USBD_LL_DeInit(pdev); - - return USBD_OK; -} - - -/** - * @brief USBD_RegisterClass - * Link class driver to Device Core. - * @param pDevice : Device Handle - * @param pclass: Class handle - * @retval USBD Status - */ -USBD_StatusTypeDef USBD_RegisterClass(USBD_HandleTypeDef *pdev, USBD_ClassTypeDef *pclass) -{ - USBD_StatusTypeDef status = USBD_OK; - if(pclass != 0) - { - /* link the class to the USB Device handle */ - pdev->pClass = pclass; - status = USBD_OK; - } - else - { - USBD_ErrLog("Invalid Class handle"); - status = USBD_FAIL; - } - - return status; -} - -/** - * @brief USBD_Start - * Start the USB Device Core. - * @param pdev: Device Handle - * @retval USBD Status - */ -USBD_StatusTypeDef USBD_Start (USBD_HandleTypeDef *pdev) -{ - - /* Start the low level driver */ - USBD_LL_Start(pdev); - - return USBD_OK; -} - -/** - * @brief USBD_Stop - * Stop the USB Device Core. - * @param pdev: Device Handle - * @retval USBD Status - */ -USBD_StatusTypeDef USBD_Stop (USBD_HandleTypeDef *pdev) -{ - /* Free Class Resources */ - pdev->pClass->DeInit(pdev, pdev->dev_config); - - /* Stop the low level driver */ - USBD_LL_Stop(pdev); - - return USBD_OK; -} - -/** -* @brief USBD_RunTestMode -* Launch test mode process -* @param pdev: device instance -* @retval status -*/ -USBD_StatusTypeDef USBD_RunTestMode (USBD_HandleTypeDef *pdev) -{ - return USBD_OK; -} - - -/** -* @brief USBD_SetClassConfig -* Configure device and start the interface -* @param pdev: device instance -* @param cfgidx: configuration index -* @retval status -*/ - -USBD_StatusTypeDef USBD_SetClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx) -{ - USBD_StatusTypeDef ret = USBD_FAIL; - - if(pdev->pClass != NULL) - { - /* Set configuration and Start the Class*/ - if(pdev->pClass->Init(pdev, cfgidx) == 0) - { - ret = USBD_OK; - } - } - return ret; -} - -/** -* @brief USBD_ClrClassConfig -* Clear current configuration -* @param pdev: device instance -* @param cfgidx: configuration index -* @retval status: USBD_StatusTypeDef -*/ -USBD_StatusTypeDef USBD_ClrClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx) -{ - /* Clear configuration and De-initialize the Class process*/ - pdev->pClass->DeInit(pdev, cfgidx); - return USBD_OK; -} - - -/** -* @brief USBD_SetupStage -* Handle the setup stage -* @param pdev: device instance -* @retval status -*/ -USBD_StatusTypeDef USBD_LL_SetupStage(USBD_HandleTypeDef *pdev, uint8_t *psetup) -{ - - USBD_ParseSetupRequest(&pdev->request, psetup); - - pdev->ep0_state = USBD_EP0_SETUP; - pdev->ep0_data_len = pdev->request.wLength; - - switch (pdev->request.bmRequest & 0x1F) - { - case USB_REQ_RECIPIENT_DEVICE: - USBD_StdDevReq (pdev, &pdev->request); - break; - - case USB_REQ_RECIPIENT_INTERFACE: - USBD_StdItfReq(pdev, &pdev->request); - break; - - case USB_REQ_RECIPIENT_ENDPOINT: - USBD_StdEPReq(pdev, &pdev->request); - break; - - default: - USBD_LL_StallEP(pdev , pdev->request.bmRequest & 0x80); - break; - } - return USBD_OK; -} - -/** -* @brief USBD_DataOutStage -* Handle data OUT stage -* @param pdev: device instance -* @param epnum: endpoint index -* @retval status -*/ -USBD_StatusTypeDef USBD_LL_DataOutStage(USBD_HandleTypeDef *pdev , uint8_t epnum, uint8_t *pdata) -{ - USBD_EndpointTypeDef *pep; - - if(epnum == 0) - { - pep = &pdev->ep_out[0]; - - if ( pdev->ep0_state == USBD_EP0_DATA_OUT) - { - if(pep->rem_length > pep->maxpacket) - { - pep->rem_length -= pep->maxpacket; - - USBD_CtlContinueRx (pdev, - pdata, - MIN(pep->rem_length ,pep->maxpacket)); - } - else - { - if((pdev->pClass->EP0_RxReady != NULL)&& - (pdev->dev_state == USBD_STATE_CONFIGURED)) - { - pdev->pClass->EP0_RxReady(pdev); - } - USBD_CtlSendStatus(pdev); - } - } - } - else if((pdev->pClass->DataOut != NULL)&& - (pdev->dev_state == USBD_STATE_CONFIGURED)) - { - pdev->pClass->DataOut(pdev, epnum); - } - return USBD_OK; -} - -/** -* @brief USBD_DataInStage -* Handle data in stage -* @param pdev: device instance -* @param epnum: endpoint index -* @retval status -*/ -USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef *pdev ,uint8_t epnum, uint8_t *pdata) -{ - USBD_EndpointTypeDef *pep; - - if(epnum == 0) - { - pep = &pdev->ep_in[0]; - - if ( pdev->ep0_state == USBD_EP0_DATA_IN) - { - if(pep->rem_length > pep->maxpacket) - { - pep->rem_length -= pep->maxpacket; - - USBD_CtlContinueSendData (pdev, - pdata, - pep->rem_length); - - /* Prepare endpoint for premature end of transfer */ - USBD_LL_PrepareReceive (pdev, - 0, - NULL, - 0); - } - else - { /* last packet is MPS multiple, so send ZLP packet */ - if((pep->total_length % pep->maxpacket == 0) && - (pep->total_length >= pep->maxpacket) && - (pep->total_length < pdev->ep0_data_len )) - { - - USBD_CtlContinueSendData(pdev , NULL, 0); - pdev->ep0_data_len = 0; - - /* Prepare endpoint for premature end of transfer */ - USBD_LL_PrepareReceive (pdev, - 0, - NULL, - 0); - } - else - { - if((pdev->pClass->EP0_TxSent != NULL)&& - (pdev->dev_state == USBD_STATE_CONFIGURED)) - { - pdev->pClass->EP0_TxSent(pdev); - } - USBD_CtlReceiveStatus(pdev); - } - } - } - if (pdev->dev_test_mode == 1) - { - USBD_RunTestMode(pdev); - pdev->dev_test_mode = 0; - } - } - else if((pdev->pClass->DataIn != NULL)&& - (pdev->dev_state == USBD_STATE_CONFIGURED)) - { - pdev->pClass->DataIn(pdev, epnum); - } - return USBD_OK; -} - -/** -* @brief USBD_LL_Reset -* Handle Reset event -* @param pdev: device instance -* @retval status -*/ - -USBD_StatusTypeDef USBD_LL_Reset(USBD_HandleTypeDef *pdev) -{ - /* Open EP0 OUT */ - USBD_LL_OpenEP(pdev, - 0x00, - USBD_EP_TYPE_CTRL, - USB_MAX_EP0_SIZE); - - pdev->ep_out[0].maxpacket = USB_MAX_EP0_SIZE; - - /* Open EP0 IN */ - USBD_LL_OpenEP(pdev, - 0x80, - USBD_EP_TYPE_CTRL, - USB_MAX_EP0_SIZE); - - pdev->ep_in[0].maxpacket = USB_MAX_EP0_SIZE; - /* Upon Reset call user call back */ - pdev->dev_state = USBD_STATE_DEFAULT; - - if (pdev->pClassData) - pdev->pClass->DeInit(pdev, pdev->dev_config); - - - return USBD_OK; -} - - - - -/** -* @brief USBD_LL_Reset -* Handle Reset event -* @param pdev: device instance -* @retval status -*/ -USBD_StatusTypeDef USBD_LL_SetSpeed(USBD_HandleTypeDef *pdev, USBD_SpeedTypeDef speed) -{ - pdev->dev_speed = speed; - return USBD_OK; -} - -/** -* @brief USBD_Suspend -* Handle Suspend event -* @param pdev: device instance -* @retval status -*/ - -USBD_StatusTypeDef USBD_LL_Suspend(USBD_HandleTypeDef *pdev) -{ - pdev->dev_old_state = pdev->dev_state; - pdev->dev_state = USBD_STATE_SUSPENDED; - return USBD_OK; -} - -/** -* @brief USBD_Resume -* Handle Resume event -* @param pdev: device instance -* @retval status -*/ - -USBD_StatusTypeDef USBD_LL_Resume(USBD_HandleTypeDef *pdev) -{ - pdev->dev_state = pdev->dev_old_state; - return USBD_OK; -} - -/** -* @brief USBD_SOF -* Handle SOF event -* @param pdev: device instance -* @retval status -*/ - -USBD_StatusTypeDef USBD_LL_SOF(USBD_HandleTypeDef *pdev) -{ - if(pdev->dev_state == USBD_STATE_CONFIGURED) - { - if(pdev->pClass->SOF != NULL) - { - pdev->pClass->SOF(pdev); - } - } - return USBD_OK; -} - -/** -* @brief USBD_IsoINIncomplete -* Handle iso in incomplete event -* @param pdev: device instance -* @retval status -*/ -USBD_StatusTypeDef USBD_LL_IsoINIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum) -{ - return USBD_OK; -} - -/** -* @brief USBD_IsoOUTIncomplete -* Handle iso out incomplete event -* @param pdev: device instance -* @retval status -*/ -USBD_StatusTypeDef USBD_LL_IsoOUTIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum) -{ - return USBD_OK; -} - -/** -* @brief USBD_DevConnected -* Handle device connection event -* @param pdev: device instance -* @retval status -*/ -USBD_StatusTypeDef USBD_LL_DevConnected(USBD_HandleTypeDef *pdev) -{ - return USBD_OK; -} - -/** -* @brief USBD_DevDisconnected -* Handle device disconnection event -* @param pdev: device instance -* @retval status -*/ -USBD_StatusTypeDef USBD_LL_DevDisconnected(USBD_HandleTypeDef *pdev) -{ - /* Free Class Resources */ - pdev->dev_state = USBD_STATE_DEFAULT; - pdev->pClass->DeInit(pdev, pdev->dev_config); - - return USBD_OK; -} -/** -* @} -*/ - - -/** -* @} -*/ - - -/** -* @} -*/ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - diff --git a/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c b/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c deleted file mode 100755 index cd61d2f5..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c +++ /dev/null @@ -1,782 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_req.c - * @author MCD Application Team - * @version V2.4.1 - * @date 19-June-2015 - * @brief This file provides the standard USB requests following chapter 9. - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_ctlreq.h" -#include "usbd_ioreq.h" - - -/** @addtogroup STM32_USBD_STATE_DEVICE_LIBRARY - * @{ - */ - - -/** @defgroup USBD_REQ - * @brief USB standard requests module - * @{ - */ - -/** @defgroup USBD_REQ_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_REQ_Private_Defines - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBD_REQ_Private_Macros - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_REQ_Private_Variables - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_REQ_Private_FunctionPrototypes - * @{ - */ -static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req); - -static void USBD_SetAddress(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req); - -static void USBD_SetConfig(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req); - -static void USBD_GetConfig(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req); - -static void USBD_GetStatus(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req); - -static void USBD_SetFeature(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req); - -static void USBD_ClrFeature(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req); - -static uint8_t USBD_GetLen(uint8_t *buf); - -/** - * @} - */ - - -/** @defgroup USBD_REQ_Private_Functions - * @{ - */ - - -/** -* @brief USBD_StdDevReq -* Handle standard usb device requests -* @param pdev: device instance -* @param req: usb request -* @retval status -*/ -USBD_StatusTypeDef USBD_StdDevReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTypedef *req) -{ - USBD_StatusTypeDef ret = USBD_OK; - - switch (req->bRequest) - { - case USB_REQ_GET_DESCRIPTOR: - - USBD_GetDescriptor (pdev, req) ; - break; - - case USB_REQ_SET_ADDRESS: - USBD_SetAddress(pdev, req); - break; - - case USB_REQ_SET_CONFIGURATION: - USBD_SetConfig (pdev , req); - break; - - case USB_REQ_GET_CONFIGURATION: - USBD_GetConfig (pdev , req); - break; - - case USB_REQ_GET_STATUS: - USBD_GetStatus (pdev , req); - break; - - - case USB_REQ_SET_FEATURE: - USBD_SetFeature (pdev , req); - break; - - case USB_REQ_CLEAR_FEATURE: - USBD_ClrFeature (pdev , req); - break; - - default: - USBD_CtlError(pdev , req); - break; - } - - return ret; -} - -/** -* @brief USBD_StdItfReq -* Handle standard usb interface requests -* @param pdev: device instance -* @param req: usb request -* @retval status -*/ -USBD_StatusTypeDef USBD_StdItfReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTypedef *req) -{ - USBD_StatusTypeDef ret = USBD_OK; - - switch (pdev->dev_state) - { - case USBD_STATE_CONFIGURED: - - if (LOBYTE(req->wIndex) <= USBD_MAX_NUM_INTERFACES) - { - pdev->pClass->Setup (pdev, req); - - if((req->wLength == 0)&& (ret == USBD_OK)) - { - USBD_CtlSendStatus(pdev); - } - } - else - { - USBD_CtlError(pdev , req); - } - break; - - default: - USBD_CtlError(pdev , req); - break; - } - return USBD_OK; -} - -/** -* @brief USBD_StdEPReq -* Handle standard usb endpoint requests -* @param pdev: device instance -* @param req: usb request -* @retval status -*/ -USBD_StatusTypeDef USBD_StdEPReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTypedef *req) -{ - - uint8_t ep_addr; - USBD_StatusTypeDef ret = USBD_OK; - USBD_EndpointTypeDef *pep; - ep_addr = LOBYTE(req->wIndex); - - /* Check if it is a class request */ - if ((req->bmRequest & 0x60) == 0x20) - { - pdev->pClass->Setup (pdev, req); - - return USBD_OK; - } - - switch (req->bRequest) - { - - case USB_REQ_SET_FEATURE : - - switch (pdev->dev_state) - { - case USBD_STATE_ADDRESSED: - if ((ep_addr != 0x00) && (ep_addr != 0x80)) - { - USBD_LL_StallEP(pdev , ep_addr); - } - break; - - case USBD_STATE_CONFIGURED: - if (req->wValue == USB_FEATURE_EP_HALT) - { - if ((ep_addr != 0x00) && (ep_addr != 0x80)) - { - USBD_LL_StallEP(pdev , ep_addr); - - } - } - pdev->pClass->Setup (pdev, req); - USBD_CtlSendStatus(pdev); - - break; - - default: - USBD_CtlError(pdev , req); - break; - } - break; - - case USB_REQ_CLEAR_FEATURE : - - switch (pdev->dev_state) - { - case USBD_STATE_ADDRESSED: - if ((ep_addr != 0x00) && (ep_addr != 0x80)) - { - USBD_LL_StallEP(pdev , ep_addr); - } - break; - - case USBD_STATE_CONFIGURED: - if (req->wValue == USB_FEATURE_EP_HALT) - { - if ((ep_addr & 0x7F) != 0x00) - { - USBD_LL_ClearStallEP(pdev , ep_addr); - pdev->pClass->Setup (pdev, req); - } - USBD_CtlSendStatus(pdev); - } - break; - - default: - USBD_CtlError(pdev , req); - break; - } - break; - - case USB_REQ_GET_STATUS: - switch (pdev->dev_state) - { - case USBD_STATE_ADDRESSED: - if ((ep_addr & 0x7F) != 0x00) - { - USBD_LL_StallEP(pdev , ep_addr); - } - break; - - case USBD_STATE_CONFIGURED: - pep = ((ep_addr & 0x80) == 0x80) ? &pdev->ep_in[ep_addr & 0x7F]:\ - &pdev->ep_out[ep_addr & 0x7F]; - if(USBD_LL_IsStallEP(pdev, ep_addr)) - { - pep->status = 0x0001; - } - else - { - pep->status = 0x0000; - } - - USBD_CtlSendData (pdev, - (uint8_t *)&pep->status, - 2); - break; - - default: - USBD_CtlError(pdev , req); - break; - } - break; - - default: - break; - } - return ret; -} -/** -* @brief USBD_GetDescriptor -* Handle Get Descriptor requests -* @param pdev: device instance -* @param req: usb request -* @retval status -*/ -static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req) -{ - uint16_t len; - uint8_t *pbuf; - - - switch (req->wValue >> 8) - { -#if (USBD_LPM_ENABLED == 1) - case USB_DESC_TYPE_BOS: - pbuf = pdev->pDesc->GetBOSDescriptor(pdev->dev_speed, &len); - break; -#endif - case USB_DESC_TYPE_DEVICE: - pbuf = pdev->pDesc->GetDeviceDescriptor(pdev->dev_speed, &len); - break; - - case USB_DESC_TYPE_CONFIGURATION: - if(pdev->dev_speed == USBD_SPEED_HIGH ) - { - pbuf = (uint8_t *)pdev->pClass->GetHSConfigDescriptor(&len); - pbuf[1] = USB_DESC_TYPE_CONFIGURATION; - } - else - { - pbuf = (uint8_t *)pdev->pClass->GetFSConfigDescriptor(&len); - pbuf[1] = USB_DESC_TYPE_CONFIGURATION; - } - break; - - case USB_DESC_TYPE_STRING: - switch ((uint8_t)(req->wValue)) - { - case USBD_IDX_LANGID_STR: - pbuf = pdev->pDesc->GetLangIDStrDescriptor(pdev->dev_speed, &len); - break; - - case USBD_IDX_MFC_STR: - pbuf = pdev->pDesc->GetManufacturerStrDescriptor(pdev->dev_speed, &len); - break; - - case USBD_IDX_PRODUCT_STR: - pbuf = pdev->pDesc->GetProductStrDescriptor(pdev->dev_speed, &len); - break; - - case USBD_IDX_SERIAL_STR: - pbuf = pdev->pDesc->GetSerialStrDescriptor(pdev->dev_speed, &len); - break; - - case USBD_IDX_CONFIG_STR: - pbuf = pdev->pDesc->GetConfigurationStrDescriptor(pdev->dev_speed, &len); - break; - - case USBD_IDX_INTERFACE_STR: - pbuf = pdev->pDesc->GetInterfaceStrDescriptor(pdev->dev_speed, &len); - break; - - default: -#if (USBD_SUPPORT_USER_STRING == 1) - pbuf = pdev->pClass->GetUsrStrDescriptor(pdev, (req->wValue) , &len); - break; -#else - USBD_CtlError(pdev , req); - return; -#endif - } - break; - case USB_DESC_TYPE_DEVICE_QUALIFIER: - - if(pdev->dev_speed == USBD_SPEED_HIGH ) - { - pbuf = (uint8_t *)pdev->pClass->GetDeviceQualifierDescriptor(&len); - break; - } - else - { - USBD_CtlError(pdev , req); - return; - } - - case USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION: - if(pdev->dev_speed == USBD_SPEED_HIGH ) - { - pbuf = (uint8_t *)pdev->pClass->GetOtherSpeedConfigDescriptor(&len); - pbuf[1] = USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION; - break; - } - else - { - USBD_CtlError(pdev , req); - return; - } - - default: - USBD_CtlError(pdev , req); - return; - } - - if((len != 0)&& (req->wLength != 0)) - { - - len = MIN(len , req->wLength); - - USBD_CtlSendData (pdev, - pbuf, - len); - } - -} - -/** -* @brief USBD_SetAddress -* Set device address -* @param pdev: device instance -* @param req: usb request -* @retval status -*/ -static void USBD_SetAddress(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req) -{ - uint8_t dev_addr; - - if ((req->wIndex == 0) && (req->wLength == 0)) - { - dev_addr = (uint8_t)(req->wValue) & 0x7F; - - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - USBD_CtlError(pdev , req); - } - else - { - pdev->dev_address = dev_addr; - USBD_LL_SetUSBAddress(pdev, dev_addr); - USBD_CtlSendStatus(pdev); - - if (dev_addr != 0) - { - pdev->dev_state = USBD_STATE_ADDRESSED; - } - else - { - pdev->dev_state = USBD_STATE_DEFAULT; - } - } - } - else - { - USBD_CtlError(pdev , req); - } -} - -/** -* @brief USBD_SetConfig -* Handle Set device configuration request -* @param pdev: device instance -* @param req: usb request -* @retval status -*/ -static void USBD_SetConfig(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req) -{ - - static uint8_t cfgidx; - - cfgidx = (uint8_t)(req->wValue); - - if (cfgidx > USBD_MAX_NUM_CONFIGURATION ) - { - USBD_CtlError(pdev , req); - } - else - { - switch (pdev->dev_state) - { - case USBD_STATE_ADDRESSED: - if (cfgidx) - { - pdev->dev_config = cfgidx; - pdev->dev_state = USBD_STATE_CONFIGURED; - if(USBD_SetClassConfig(pdev , cfgidx) == USBD_FAIL) - { - USBD_CtlError(pdev , req); - return; - } - USBD_CtlSendStatus(pdev); - } - else - { - USBD_CtlSendStatus(pdev); - } - break; - - case USBD_STATE_CONFIGURED: - if (cfgidx == 0) - { - pdev->dev_state = USBD_STATE_ADDRESSED; - pdev->dev_config = cfgidx; - USBD_ClrClassConfig(pdev , cfgidx); - USBD_CtlSendStatus(pdev); - - } - else if (cfgidx != pdev->dev_config) - { - /* Clear old configuration */ - USBD_ClrClassConfig(pdev , pdev->dev_config); - - /* set new configuration */ - pdev->dev_config = cfgidx; - if(USBD_SetClassConfig(pdev , cfgidx) == USBD_FAIL) - { - USBD_CtlError(pdev , req); - return; - } - USBD_CtlSendStatus(pdev); - } - else - { - USBD_CtlSendStatus(pdev); - } - break; - - default: - USBD_CtlError(pdev , req); - break; - } - } -} - -/** -* @brief USBD_GetConfig -* Handle Get device configuration request -* @param pdev: device instance -* @param req: usb request -* @retval status -*/ -static void USBD_GetConfig(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req) -{ - - if (req->wLength != 1) - { - USBD_CtlError(pdev , req); - } - else - { - switch (pdev->dev_state ) - { - case USBD_STATE_ADDRESSED: - pdev->dev_default_config = 0; - USBD_CtlSendData (pdev, - (uint8_t *)&pdev->dev_default_config, - 1); - break; - - case USBD_STATE_CONFIGURED: - - USBD_CtlSendData (pdev, - (uint8_t *)&pdev->dev_config, - 1); - break; - - default: - USBD_CtlError(pdev , req); - break; - } - } -} - -/** -* @brief USBD_GetStatus -* Handle Get Status request -* @param pdev: device instance -* @param req: usb request -* @retval status -*/ -static void USBD_GetStatus(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req) -{ - - - switch (pdev->dev_state) - { - case USBD_STATE_ADDRESSED: - case USBD_STATE_CONFIGURED: - -#if ( USBD_SELF_POWERED == 1) - pdev->dev_config_status = USB_CONFIG_SELF_POWERED; -#else - pdev->dev_config_status = 0; -#endif - - if (pdev->dev_remote_wakeup) - { - pdev->dev_config_status |= USB_CONFIG_REMOTE_WAKEUP; - } - - USBD_CtlSendData (pdev, - (uint8_t *)& pdev->dev_config_status, - 2); - break; - - default : - USBD_CtlError(pdev , req); - break; - } -} - - -/** -* @brief USBD_SetFeature -* Handle Set device feature request -* @param pdev: device instance -* @param req: usb request -* @retval status -*/ -static void USBD_SetFeature(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req) -{ - - if (req->wValue == USB_FEATURE_REMOTE_WAKEUP) - { - pdev->dev_remote_wakeup = 1; - pdev->pClass->Setup (pdev, req); - USBD_CtlSendStatus(pdev); - } - -} - - -/** -* @brief USBD_ClrFeature -* Handle clear device feature request -* @param pdev: device instance -* @param req: usb request -* @retval status -*/ -static void USBD_ClrFeature(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req) -{ - switch (pdev->dev_state) - { - case USBD_STATE_ADDRESSED: - case USBD_STATE_CONFIGURED: - if (req->wValue == USB_FEATURE_REMOTE_WAKEUP) - { - pdev->dev_remote_wakeup = 0; - pdev->pClass->Setup (pdev, req); - USBD_CtlSendStatus(pdev); - } - break; - - default : - USBD_CtlError(pdev , req); - break; - } -} - -/** -* @brief USBD_ParseSetupRequest -* Copy buffer into setup structure -* @param pdev: device instance -* @param req: usb request -* @retval None -*/ - -void USBD_ParseSetupRequest(USBD_SetupReqTypedef *req, uint8_t *pdata) -{ - req->bmRequest = *(uint8_t *) (pdata); - req->bRequest = *(uint8_t *) (pdata + 1); - req->wValue = SWAPBYTE (pdata + 2); - req->wIndex = SWAPBYTE (pdata + 4); - req->wLength = SWAPBYTE (pdata + 6); - -} - -/** -* @brief USBD_CtlError -* Handle USB low level Error -* @param pdev: device instance -* @param req: usb request -* @retval None -*/ - -void USBD_CtlError( USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req) -{ - USBD_LL_StallEP(pdev , 0x80); - USBD_LL_StallEP(pdev , 0); -} - - -/** - * @brief USBD_GetString - * Convert Ascii string into unicode one - * @param desc : descriptor buffer - * @param unicode : Formatted string buffer (unicode) - * @param len : descriptor length - * @retval None - */ -void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len) -{ - uint8_t idx = 0; - - if (desc != NULL) - { - *len = USBD_GetLen(desc) * 2 + 2; - unicode[idx++] = *len; - unicode[idx++] = USB_DESC_TYPE_STRING; - - while (*desc != '\0') - { - unicode[idx++] = *desc++; - unicode[idx++] = 0x00; - } - } -} - -/** - * @brief USBD_GetLen - * return the string length - * @param buf : pointer to the ascii string buffer - * @retval string length - */ -static uint8_t USBD_GetLen(uint8_t *buf) -{ - uint8_t len = 0; - - while (*buf != '\0') - { - len++; - buf++; - } - - return len; -} -/** - * @} - */ - - -/** - * @} - */ - - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Inc/usbh_msc_scsi.h b/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Inc/usbh_msc_scsi.h deleted file mode 100755 index a70b0276..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Inc/usbh_msc_scsi.h +++ /dev/null @@ -1,226 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_msc_scsi.h - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief Header file for usbh_msc_scsi.c - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive ----------------------------------------------*/ -#ifndef __USBH_MSC_SCSI_H -#define __USBH_MSC_SCSI_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbh_core.h" - - -/** @addtogroup USBH_LIB - * @{ - */ - -/** @addtogroup USBH_CLASS - * @{ - */ - -/** @addtogroup USBH_MSC_CLASS - * @{ - */ - -/** @defgroup USBH_MSC_SCSI - * @brief This file is the Header file for usbh_msc_scsi.c - * @{ - */ - - -// Capacity data. -typedef struct -{ - uint32_t block_nbr; - uint16_t block_size; -} SCSI_CapacityTypeDef; - - -// Sense data. -typedef struct -{ - uint8_t key; - uint8_t asc; - uint8_t ascq; -} SCSI_SenseTypeDef; - -// INQUIRY data. -typedef struct -{ - uint8_t PeripheralQualifier; - uint8_t DeviceType; - uint8_t RemovableMedia; - uint8_t vendor_id[9]; - uint8_t product_id[17]; - uint8_t revision_id[5]; -}SCSI_StdInquiryDataTypeDef; - -/** @defgroup USBH_MSC_SCSI_Exported_Defines - * @{ - */ -#define OPCODE_TEST_UNIT_READY 0x00 -#define OPCODE_READ_CAPACITY10 0x25 -#define OPCODE_READ10 0x28 -#define OPCODE_WRITE10 0x2A -#define OPCODE_REQUEST_SENSE 0x03 -#define OPCODE_INQUIRY 0x12 - -#define DATA_LEN_MODE_TEST_UNIT_READY 0 -#define DATA_LEN_READ_CAPACITY10 8 -#define DATA_LEN_INQUIRY 36 -#define DATA_LEN_REQUEST_SENSE 14 - -#define CBW_CB_LENGTH 16 -#define CBW_LENGTH 10 - -/** @defgroup USBH_MSC_SCSI_Exported_Defines - * @{ - */ -#define SCSI_SENSE_KEY_NO_SENSE 0x00 -#define SCSI_SENSE_KEY_RECOVERED_ERROR 0x01 -#define SCSI_SENSE_KEY_NOT_READY 0x02 -#define SCSI_SENSE_KEY_MEDIUM_ERROR 0x03 -#define SCSI_SENSE_KEY_HARDWARE_ERROR 0x04 -#define SCSI_SENSE_KEY_ILLEGAL_REQUEST 0x05 -#define SCSI_SENSE_KEY_UNIT_ATTENTION 0x06 -#define SCSI_SENSE_KEY_DATA_PROTECT 0x07 -#define SCSI_SENSE_KEY_BLANK_CHECK 0x08 -#define SCSI_SENSE_KEY_VENDOR_SPECIFIC 0x09 -#define SCSI_SENSE_KEY_COPY_ABORTED 0x0A -#define SCSI_SENSE_KEY_ABORTED_COMMAND 0x0B -#define SCSI_SENSE_KEY_VOLUME_OVERFLOW 0x0D -#define SCSI_SENSE_KEY_MISCOMPARE 0x0E -/** - * @} - */ - - -/** @defgroup USBH_MSC_SCSI_Exported_Defines - * @{ - */ -#define SCSI_ASC_NO_ADDITIONAL_SENSE_INFORMATION 0x00 -#define SCSI_ASC_LOGICAL_UNIT_NOT_READY 0x04 -#define SCSI_ASC_INVALID_FIELD_IN_CDB 0x24 -#define SCSI_ASC_WRITE_PROTECTED 0x27 -#define SCSI_ASC_FORMAT_ERROR 0x31 -#define SCSI_ASC_INVALID_COMMAND_OPERATION_CODE 0x20 -#define SCSI_ASC_NOT_READY_TO_READY_CHANGE 0x28 -#define SCSI_ASC_MEDIUM_NOT_PRESENT 0x3A -/** - * @} - */ - - -/** @defgroup USBH_MSC_SCSI_Exported_Defines - * @{ - */ -#define SCSI_ASCQ_FORMAT_COMMAND_FAILED 0x01 -#define SCSI_ASCQ_INITIALIZING_COMMAND_REQUIRED 0x02 -#define SCSI_ASCQ_OPERATION_IN_PROGRESS 0x07 - -/** - * @} - */ - -/** @defgroup USBH_MSC_SCSI_Exported_Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup _Exported_Variables - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBH_MSC_SCSI_Exported_FunctionsPrototype - * @{ - */ -USBH_StatusTypeDef USBH_MSC_SCSI_TestUnitReady (USBH_HandleTypeDef *phost, - uint8_t lun); - -USBH_StatusTypeDef USBH_MSC_SCSI_ReadCapacity (USBH_HandleTypeDef *phost, - uint8_t lun, - SCSI_CapacityTypeDef *capacity); - -USBH_StatusTypeDef USBH_MSC_SCSI_Inquiry (USBH_HandleTypeDef *phost, - uint8_t lun, - SCSI_StdInquiryDataTypeDef *inquiry); - -USBH_StatusTypeDef USBH_MSC_SCSI_RequestSense (USBH_HandleTypeDef *phost, - uint8_t lun, - SCSI_SenseTypeDef *sense_data); - -USBH_StatusTypeDef USBH_MSC_SCSI_Write(USBH_HandleTypeDef *phost, - uint8_t lun, - uint32_t address, - uint8_t *pbuf, - uint32_t length); - -USBH_StatusTypeDef USBH_MSC_SCSI_Read(USBH_HandleTypeDef *phost, - uint8_t lun, - uint32_t address, - uint8_t *pbuf, - uint32_t length); - - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBH_MSC_SCSI_H */ - - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - diff --git a/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Src/usbh_msc.c b/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Src/usbh_msc.c deleted file mode 100755 index 1ea03d07..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Src/usbh_msc.c +++ /dev/null @@ -1,805 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_msc.c - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief This file implements the MSC class driver functions - * =================================================================== - * MSC Class Description - * =================================================================== - * This module manages the MSC class V1.0 following the "Universal - * Serial Bus Mass Storage Class (MSC) Bulk-Only Transport (BOT) Version 1.0 - * Sep. 31, 1999". - * This driver implements the following aspects of the specification: - * - Bulk-Only Transport protocol - * - Subclass : SCSI transparent command set (ref. SCSI Primary Commands - 3 (SPC-3)) - * - * @endverbatim - * - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ - -#include "usbh_msc.h" -#include "usbh_msc_bot.h" -#include "usbh_msc_scsi.h" - - -/** @addtogroup USBH_LIB - * @{ - */ - -/** @addtogroup USBH_CLASS - * @{ - */ - -/** @addtogroup USBH_MSC_CLASS - * @{ - */ - -/** @defgroup USBH_MSC_CORE - * @brief This file includes the mass storage related functions - * @{ - */ - - -/** @defgroup USBH_MSC_CORE_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ - -/** @defgroup USBH_MSC_CORE_Private_Defines - * @{ - */ -/** - * @} - */ - -/** @defgroup USBH_MSC_CORE_Private_Macros - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBH_MSC_CORE_Private_Variables - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBH_MSC_CORE_Private_FunctionPrototypes - * @{ - */ - -static USBH_StatusTypeDef USBH_MSC_InterfaceInit (USBH_HandleTypeDef *phost); - -static USBH_StatusTypeDef USBH_MSC_InterfaceDeInit (USBH_HandleTypeDef *phost); - -static USBH_StatusTypeDef USBH_MSC_Process(USBH_HandleTypeDef *phost); - -static USBH_StatusTypeDef USBH_MSC_ClassRequest(USBH_HandleTypeDef *phost); - -static USBH_StatusTypeDef USBH_MSC_SOFProcess(USBH_HandleTypeDef *phost); - -static USBH_StatusTypeDef USBH_MSC_RdWrProcess(USBH_HandleTypeDef *phost, uint8_t lun); - -USBH_ClassTypeDef USBH_msc = -{ - "MSC", - USB_MSC_CLASS, - USBH_MSC_InterfaceInit, - USBH_MSC_InterfaceDeInit, - USBH_MSC_ClassRequest, - USBH_MSC_Process, - USBH_MSC_SOFProcess, - NULL, -}; - - -/** - * @} - */ - - -/** @defgroup USBH_MSC_CORE_Exported_Variables - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBH_MSC_CORE_Private_Functions - * @{ - */ - - -/** - * @brief USBH_MSC_InterfaceInit - * The function init the MSC class. - * @param phost: Host handle - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_MSC_InterfaceInit (USBH_HandleTypeDef *phost) -{ - uint8_t interface = 0; - USBH_StatusTypeDef status = USBH_FAIL ; - MSC_HandleTypeDef *MSC_Handle; - - interface = USBH_FindInterface(phost, phost->pActiveClass->ClassCode, MSC_TRANSPARENT, MSC_BOT); - - if(interface == 0xFF) /* Not Valid Interface */ - { - USBH_DbgLog ("Cannot Find the interface for %s class.", phost->pActiveClass->Name); - status = USBH_FAIL; - } - else - { - USBH_SelectInterface (phost, interface); - - phost->pActiveClass->pData = (MSC_HandleTypeDef *)USBH_malloc (sizeof(MSC_HandleTypeDef)); - MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData; - - if(phost->device.CfgDesc.Itf_Desc[phost->device.current_interface].Ep_Desc[0].bEndpointAddress & 0x80) - { - MSC_Handle->InEp = (phost->device.CfgDesc.Itf_Desc[phost->device.current_interface].Ep_Desc[0].bEndpointAddress); - MSC_Handle->InEpSize = phost->device.CfgDesc.Itf_Desc[phost->device.current_interface].Ep_Desc[0].wMaxPacketSize; - } - else - { - MSC_Handle->OutEp = (phost->device.CfgDesc.Itf_Desc[phost->device.current_interface].Ep_Desc[0].bEndpointAddress); - MSC_Handle->OutEpSize = phost->device.CfgDesc.Itf_Desc[phost->device.current_interface].Ep_Desc[0].wMaxPacketSize; - } - - if(phost->device.CfgDesc.Itf_Desc[phost->device.current_interface].Ep_Desc[1].bEndpointAddress & 0x80) - { - MSC_Handle->InEp = (phost->device.CfgDesc.Itf_Desc[phost->device.current_interface].Ep_Desc[1].bEndpointAddress); - MSC_Handle->InEpSize = phost->device.CfgDesc.Itf_Desc[phost->device.current_interface].Ep_Desc[1].wMaxPacketSize; - } - else - { - MSC_Handle->OutEp = (phost->device.CfgDesc.Itf_Desc[phost->device.current_interface].Ep_Desc[1].bEndpointAddress); - MSC_Handle->OutEpSize = phost->device.CfgDesc.Itf_Desc[phost->device.current_interface].Ep_Desc[1].wMaxPacketSize; - } - - MSC_Handle->current_lun = 0; - MSC_Handle->rw_lun = 0; - MSC_Handle->state = MSC_INIT; - MSC_Handle->error = MSC_OK; - MSC_Handle->req_state = MSC_REQ_IDLE; - MSC_Handle->OutPipe = USBH_AllocPipe(phost, MSC_Handle->OutEp); - MSC_Handle->InPipe = USBH_AllocPipe(phost, MSC_Handle->InEp); - - USBH_MSC_BOT_Init(phost); - - /* De-Initialize LUNs information */ - USBH_memset(MSC_Handle->unit, 0, sizeof(MSC_Handle->unit)); - - /* Open the new channels */ - USBH_OpenPipe (phost, - MSC_Handle->OutPipe, - MSC_Handle->OutEp, - phost->device.address, - phost->device.speed, - USB_EP_TYPE_BULK, - MSC_Handle->OutEpSize); - - USBH_OpenPipe (phost, - MSC_Handle->InPipe, - MSC_Handle->InEp, - phost->device.address, - phost->device.speed, - USB_EP_TYPE_BULK, - MSC_Handle->InEpSize); - - - USBH_LL_SetToggle (phost, MSC_Handle->InPipe,0); - USBH_LL_SetToggle (phost, MSC_Handle->OutPipe,0); - status = USBH_OK; - } - return status; -} - -/** - * @brief USBH_MSC_InterfaceDeInit - * The function DeInit the Pipes used for the MSC class. - * @param phost: Host handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_MSC_InterfaceDeInit (USBH_HandleTypeDef *phost) -{ - MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData; - - if ( MSC_Handle->OutPipe) - { - USBH_ClosePipe(phost, MSC_Handle->OutPipe); - USBH_FreePipe (phost, MSC_Handle->OutPipe); - MSC_Handle->OutPipe = 0; /* Reset the Channel as Free */ - } - - if ( MSC_Handle->InPipe) - { - USBH_ClosePipe(phost, MSC_Handle->InPipe); - USBH_FreePipe (phost, MSC_Handle->InPipe); - MSC_Handle->InPipe = 0; /* Reset the Channel as Free */ - } - - if(phost->pActiveClass->pData) - { - USBH_free (phost->pActiveClass->pData); - phost->pActiveClass->pData = 0; - } - - return USBH_OK; -} - -/** - * @brief USBH_MSC_ClassRequest - * The function is responsible for handling Standard requests - * for MSC class. - * @param phost: Host handle - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_MSC_ClassRequest(USBH_HandleTypeDef *phost) -{ - MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData; - USBH_StatusTypeDef status = USBH_BUSY; - uint8_t i; - - /* Switch MSC REQ state machine */ - switch (MSC_Handle->req_state) - { - case MSC_REQ_IDLE: - case MSC_REQ_GET_MAX_LUN: - /* Issue GetMaxLUN request */ - status = USBH_MSC_BOT_REQ_GetMaxLUN(phost, (uint8_t *)&MSC_Handle->max_lun); - - /* When devices do not support the GetMaxLun request, this should - be considred as only one logical unit is supported */ - if(status == USBH_NOT_SUPPORTED) - { - MSC_Handle->max_lun = 0; - status = USBH_OK; - } - - if(status == USBH_OK) - { - MSC_Handle->max_lun = (uint8_t )(MSC_Handle->max_lun) + 1; - USBH_UsrLog ("Number of supported LUN: %lu", (int32_t)(MSC_Handle->max_lun)); - - for(i = 0; i < MSC_Handle->max_lun; i++) - { - MSC_Handle->unit[i].prev_ready_state = USBH_FAIL; - MSC_Handle->unit[i].state_changed = 0; - } - } - break; - - case MSC_REQ_ERROR : - /* a Clear Feature should be issued here */ - if(USBH_ClrFeature(phost, 0x00) == USBH_OK) - { - MSC_Handle->req_state = MSC_Handle->prev_req_state; - } - break; - - default: - break; - } - - return status; -} - -/** - * @brief USBH_MSC_Process - * The function is for managing state machine for MSC data transfers - * @param phost: Host handle - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_MSC_Process(USBH_HandleTypeDef *phost) -{ - MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData; - USBH_StatusTypeDef error = USBH_BUSY ; - USBH_StatusTypeDef scsi_status = USBH_BUSY ; - USBH_StatusTypeDef ready_status = USBH_BUSY ; - - switch (MSC_Handle->state) - { - case MSC_INIT: - - if(MSC_Handle->current_lun < MSC_Handle->max_lun) - { - - MSC_Handle->unit[MSC_Handle->current_lun].error = MSC_NOT_READY; - /* Switch MSC REQ state machine */ - switch (MSC_Handle->unit[MSC_Handle->current_lun].state) - { - case MSC_INIT: - USBH_UsrLog ("LUN #%d: ", MSC_Handle->current_lun); - MSC_Handle->unit[MSC_Handle->current_lun].state = MSC_READ_INQUIRY; - MSC_Handle->timer = phost->Timer; - - case MSC_READ_INQUIRY: - scsi_status = USBH_MSC_SCSI_Inquiry(phost, MSC_Handle->current_lun, &MSC_Handle->unit[MSC_Handle->current_lun].inquiry); - - if( scsi_status == USBH_OK) - { - USBH_UsrLog ("Inquiry Vendor : %s", MSC_Handle->unit[MSC_Handle->current_lun].inquiry.vendor_id); - USBH_UsrLog ("Inquiry Product : %s", MSC_Handle->unit[MSC_Handle->current_lun].inquiry.product_id); - USBH_UsrLog ("Inquiry Version : %s", MSC_Handle->unit[MSC_Handle->current_lun].inquiry.revision_id); - MSC_Handle->unit[MSC_Handle->current_lun].state = MSC_TEST_UNIT_READY; - } - if( scsi_status == USBH_FAIL) - { - MSC_Handle->unit[MSC_Handle->current_lun].state = MSC_REQUEST_SENSE; - } - else if(scsi_status == USBH_UNRECOVERED_ERROR) - { - MSC_Handle->unit[MSC_Handle->current_lun].state = MSC_IDLE; - MSC_Handle->unit[MSC_Handle->current_lun].error = MSC_ERROR; - } - break; - - case MSC_TEST_UNIT_READY: - ready_status = USBH_MSC_SCSI_TestUnitReady(phost, MSC_Handle->current_lun); - - if( ready_status == USBH_OK) - { - if( MSC_Handle->unit[MSC_Handle->current_lun].prev_ready_state != USBH_OK) - { - MSC_Handle->unit[MSC_Handle->current_lun].state_changed = 1; - USBH_UsrLog ("MSC Device ready"); - } - else - { - MSC_Handle->unit[MSC_Handle->current_lun].state_changed = 0; - } - MSC_Handle->unit[MSC_Handle->current_lun].state = MSC_READ_CAPACITY10; - MSC_Handle->unit[MSC_Handle->current_lun].error = MSC_OK; - MSC_Handle->unit[MSC_Handle->current_lun].prev_ready_state = USBH_OK; - } - if( ready_status == USBH_FAIL) - { - /* Media not ready, so try to check again during 10s */ - if( MSC_Handle->unit[MSC_Handle->current_lun].prev_ready_state != USBH_FAIL) - { - MSC_Handle->unit[MSC_Handle->current_lun].state_changed = 1; - USBH_UsrLog ("MSC Device NOT ready"); - } - else - { - MSC_Handle->unit[MSC_Handle->current_lun].state_changed = 0; - } - MSC_Handle->unit[MSC_Handle->current_lun].state = MSC_REQUEST_SENSE; - MSC_Handle->unit[MSC_Handle->current_lun].error = MSC_NOT_READY; - MSC_Handle->unit[MSC_Handle->current_lun].prev_ready_state = USBH_FAIL; - } - else if(ready_status == USBH_UNRECOVERED_ERROR) - { - MSC_Handle->unit[MSC_Handle->current_lun].state = MSC_IDLE; - MSC_Handle->unit[MSC_Handle->current_lun].error = MSC_ERROR; - } - break; - - case MSC_READ_CAPACITY10: - scsi_status = USBH_MSC_SCSI_ReadCapacity(phost,MSC_Handle->current_lun, &MSC_Handle->unit[MSC_Handle->current_lun].capacity) ; - - if(scsi_status == USBH_OK) - { - if(MSC_Handle->unit[MSC_Handle->current_lun].state_changed == 1) - { - USBH_UsrLog ("MSC Device capacity : %lu Bytes", \ - (int32_t)(MSC_Handle->unit[MSC_Handle->current_lun].capacity.block_nbr * MSC_Handle->unit[MSC_Handle->current_lun].capacity.block_size)); - USBH_UsrLog ("Block number : %lu", (int32_t)(MSC_Handle->unit[MSC_Handle->current_lun].capacity.block_nbr)); - USBH_UsrLog ("Block Size : %lu", (int32_t)(MSC_Handle->unit[MSC_Handle->current_lun].capacity.block_size)); - } - MSC_Handle->unit[MSC_Handle->current_lun].state = MSC_IDLE; - MSC_Handle->unit[MSC_Handle->current_lun].error = MSC_OK; - MSC_Handle->current_lun++; - } - else if( scsi_status == USBH_FAIL) - { - MSC_Handle->unit[MSC_Handle->current_lun].state = MSC_REQUEST_SENSE; - } - else if(scsi_status == USBH_UNRECOVERED_ERROR) - { - MSC_Handle->unit[MSC_Handle->current_lun].state = MSC_IDLE; - MSC_Handle->unit[MSC_Handle->current_lun].error = MSC_ERROR; - } - break; - - case MSC_REQUEST_SENSE: - scsi_status = USBH_MSC_SCSI_RequestSense(phost, MSC_Handle->current_lun, &MSC_Handle->unit[MSC_Handle->current_lun].sense); - - if( scsi_status == USBH_OK) - { - if((MSC_Handle->unit[MSC_Handle->current_lun].sense.key == SCSI_SENSE_KEY_UNIT_ATTENTION) || - (MSC_Handle->unit[MSC_Handle->current_lun].sense.key == SCSI_SENSE_KEY_NOT_READY) ) - { - - if((phost->Timer - MSC_Handle->timer) < 10000) - { - MSC_Handle->unit[MSC_Handle->current_lun].state = MSC_TEST_UNIT_READY; - break; - } - } - - USBH_UsrLog ("Sense Key : %x", MSC_Handle->unit[MSC_Handle->current_lun].sense.key); - USBH_UsrLog ("Additional Sense Code : %x", MSC_Handle->unit[MSC_Handle->current_lun].sense.asc); - USBH_UsrLog ("Additional Sense Code Qualifier: %x", MSC_Handle->unit[MSC_Handle->current_lun].sense.ascq); - MSC_Handle->unit[MSC_Handle->current_lun].state = MSC_IDLE; - MSC_Handle->current_lun++; - } - if( scsi_status == USBH_FAIL) - { - USBH_UsrLog ("MSC Device NOT ready"); - MSC_Handle->unit[MSC_Handle->current_lun].state = MSC_UNRECOVERED_ERROR; - } - else if(scsi_status == USBH_UNRECOVERED_ERROR) - { - MSC_Handle->unit[MSC_Handle->current_lun].state = MSC_IDLE; - MSC_Handle->unit[MSC_Handle->current_lun].error = MSC_ERROR; - } - break; - - case MSC_UNRECOVERED_ERROR: - MSC_Handle->current_lun++; - break; - - default: - break; - } - -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CLASS_EVENT, 0); -#endif - } - else - { - MSC_Handle->current_lun = 0; - MSC_Handle->state = MSC_IDLE; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CLASS_EVENT, 0); -#endif - phost->pUser(phost, HOST_USER_CLASS_ACTIVE); - } - break; - - case MSC_IDLE: - error = USBH_OK; - break; - - default: - break; - } - return error; -} - - -/** - * @brief USBH_MSC_SOFProcess - * The function is for SOF state - * @param phost: Host handle - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_MSC_SOFProcess(USBH_HandleTypeDef *phost) -{ - - return USBH_OK; -} -/** - * @brief USBH_MSC_RdWrProcess - * The function is for managing state machine for MSC I/O Process - * @param phost: Host handle - * @param lun: logical Unit Number - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_MSC_RdWrProcess(USBH_HandleTypeDef *phost, uint8_t lun) -{ - MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData; - USBH_StatusTypeDef error = USBH_BUSY ; - USBH_StatusTypeDef scsi_status = USBH_BUSY ; - - /* Switch MSC REQ state machine */ - switch (MSC_Handle->unit[lun].state) - { - - case MSC_READ: - scsi_status = USBH_MSC_SCSI_Read(phost,lun, 0, NULL, 0) ; - - if(scsi_status == USBH_OK) - { - MSC_Handle->unit[lun].state = MSC_IDLE; - error = USBH_OK; - } - else if( scsi_status == USBH_FAIL) - { - MSC_Handle->unit[lun].state = MSC_REQUEST_SENSE; - } - else if(scsi_status == USBH_UNRECOVERED_ERROR) - { - MSC_Handle->unit[lun].state = MSC_UNRECOVERED_ERROR; - error = USBH_FAIL; - } -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CLASS_EVENT, 0); -#endif - break; - - case MSC_WRITE: - scsi_status = USBH_MSC_SCSI_Write(phost,lun, 0, NULL, 0) ; - - if(scsi_status == USBH_OK) - { - MSC_Handle->unit[lun].state = MSC_IDLE; - error = USBH_OK; - } - else if( scsi_status == USBH_FAIL) - { - MSC_Handle->unit[lun].state = MSC_REQUEST_SENSE; - } - else if(scsi_status == USBH_UNRECOVERED_ERROR) - { - MSC_Handle->unit[lun].state = MSC_UNRECOVERED_ERROR; - error = USBH_FAIL; - } -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CLASS_EVENT, 0); -#endif - break; - - case MSC_REQUEST_SENSE: - scsi_status = USBH_MSC_SCSI_RequestSense(phost, lun, &MSC_Handle->unit[lun].sense); - - if( scsi_status == USBH_OK) - { - USBH_UsrLog ("Sense Key : %x", MSC_Handle->unit[lun].sense.key); - USBH_UsrLog ("Additional Sense Code : %x", MSC_Handle->unit[lun].sense.asc); - USBH_UsrLog ("Additional Sense Code Qualifier: %x", MSC_Handle->unit[lun].sense.ascq); - MSC_Handle->unit[lun].state = MSC_IDLE; - MSC_Handle->unit[lun].error = MSC_ERROR; - - error = USBH_FAIL; - } - if( scsi_status == USBH_FAIL) - { - USBH_UsrLog ("MSC Device NOT ready"); - } - else if(scsi_status == USBH_UNRECOVERED_ERROR) - { - MSC_Handle->unit[lun].state = MSC_UNRECOVERED_ERROR; - error = USBH_FAIL; - } -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CLASS_EVENT, 0); -#endif - break; - - default: - break; - - } - return error; -} - -/** - * @brief USBH_MSC_IsReady - * The function check if the MSC function is ready - * @param phost: Host handle - * @retval USBH Status - */ -uint8_t USBH_MSC_IsReady (USBH_HandleTypeDef *phost) -{ - MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData; - - if(phost->gState == HOST_CLASS) - { - return (MSC_Handle->state == MSC_IDLE); - } - else - { - return 0; - } -} - -/** - * @brief USBH_MSC_GetMaxLUN - * The function return the Max LUN supported - * @param phost: Host handle - * @retval logical Unit Number supported - */ -int8_t USBH_MSC_GetMaxLUN (USBH_HandleTypeDef *phost) -{ - MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData; - - if ((phost->gState == HOST_CLASS) && (MSC_Handle->state == MSC_IDLE)) - { - return MSC_Handle->max_lun; - } - return 0xFF; -} - -/** - * @brief USBH_MSC_UnitIsReady - * The function check whether a LUN is ready - * @param phost: Host handle - * @param lun: logical Unit Number - * @retval Lun status (0: not ready / 1: ready) - */ -uint8_t USBH_MSC_UnitIsReady (USBH_HandleTypeDef *phost, uint8_t lun) -{ - MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData; - - if(phost->gState == HOST_CLASS) - { - return (MSC_Handle->unit[lun].error == MSC_OK); - } - else - { - return 0; - } -} - -/** - * @brief USBH_MSC_GetLUNInfo - * The function return a LUN information - * @param phost: Host handle - * @param lun: logical Unit Number - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_MSC_GetLUNInfo(USBH_HandleTypeDef *phost, uint8_t lun, MSC_LUNTypeDef *info) -{ - MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData; - if(phost->gState == HOST_CLASS) - { - USBH_memcpy(info,&MSC_Handle->unit[lun], sizeof(MSC_LUNTypeDef)); - return USBH_OK; - } - else - { - return USBH_FAIL; - } -} - -/** - * @brief USBH_MSC_Read - * The function performs a Read operation - * @param phost: Host handle - * @param lun: logical Unit Number - * @param address: sector address - * @param pbuf: pointer to data - * @param length: number of sector to read - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_MSC_Read(USBH_HandleTypeDef *phost, - uint8_t lun, - uint32_t address, - uint8_t *pbuf, - uint32_t length) -{ - uint32_t timeout; - MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData; - - if ((phost->device.is_connected == 0) || - (phost->gState != HOST_CLASS) || - (MSC_Handle->unit[lun].state != MSC_IDLE)) - { - return USBH_FAIL; - } - MSC_Handle->state = MSC_READ; - MSC_Handle->unit[lun].state = MSC_READ; - MSC_Handle->rw_lun = lun; - USBH_MSC_SCSI_Read(phost, - lun, - address, - pbuf, - length); - - timeout = phost->Timer; - - while (USBH_MSC_RdWrProcess(phost, lun) == USBH_BUSY) - { - if(((phost->Timer - timeout) > (10000 * length)) || (phost->device.is_connected == 0)) - { - MSC_Handle->state = MSC_IDLE; - return USBH_FAIL; - } - } - MSC_Handle->state = MSC_IDLE; - return USBH_OK; -} - -/** - * @brief USBH_MSC_Write - * The function performs a Write operation - * @param phost: Host handle - * @param lun: logical Unit Number - * @param address: sector address - * @param pbuf: pointer to data - * @param length: number of sector to write - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_MSC_Write(USBH_HandleTypeDef *phost, - uint8_t lun, - uint32_t address, - uint8_t *pbuf, - uint32_t length) -{ - uint32_t timeout; - MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData; - - if ((phost->device.is_connected == 0) || - (phost->gState != HOST_CLASS) || - (MSC_Handle->unit[lun].state != MSC_IDLE)) - { - return USBH_FAIL; - } - MSC_Handle->state = MSC_WRITE; - MSC_Handle->unit[lun].state = MSC_WRITE; - MSC_Handle->rw_lun = lun; - USBH_MSC_SCSI_Write(phost, - lun, - address, - pbuf, - length); - - timeout = phost->Timer; - while (USBH_MSC_RdWrProcess(phost, lun) == USBH_BUSY) - { - if(((phost->Timer - timeout) > (10000 * length)) || (phost->device.is_connected == 0)) - { - MSC_Handle->state = MSC_IDLE; - return USBH_FAIL; - } - } - MSC_Handle->state = MSC_IDLE; - return USBH_OK; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Src/usbh_msc_bot.c b/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Src/usbh_msc_bot.c deleted file mode 100755 index 9d14dee4..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Src/usbh_msc_bot.c +++ /dev/null @@ -1,633 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_msc_bot.c - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief This file includes the BOT protocol related functions - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbh_msc_bot.h" -#include "usbh_msc.h" - -/** @addtogroup USBH_LIB -* @{ -*/ - -/** @addtogroup USBH_CLASS -* @{ -*/ - -/** @addtogroup USBH_MSC_CLASS -* @{ -*/ - -/** @defgroup USBH_MSC_BOT -* @brief This file includes the mass storage related functions -* @{ -*/ - - -/** @defgroup USBH_MSC_BOT_Private_TypesDefinitions -* @{ -*/ -/** -* @} -*/ - -/** @defgroup USBH_MSC_BOT_Private_Defines -* @{ -*/ -/** -* @} -*/ - -/** @defgroup USBH_MSC_BOT_Private_Macros -* @{ -*/ -/** -* @} -*/ - - -/** @defgroup USBH_MSC_BOT_Private_Variables -* @{ -*/ - -/** -* @} -*/ - - -/** @defgroup USBH_MSC_BOT_Private_FunctionPrototypes -* @{ -*/ -static USBH_StatusTypeDef USBH_MSC_BOT_Abort(USBH_HandleTypeDef *phost, uint8_t lun, uint8_t dir); -static BOT_CSWStatusTypeDef USBH_MSC_DecodeCSW(USBH_HandleTypeDef *phost); -/** -* @} -*/ - - -/** @defgroup USBH_MSC_BOT_Exported_Variables -* @{ -*/ -/** -* @} -*/ - - -/** @defgroup USBH_MSC_BOT_Private_Functions -* @{ -*/ - -/** - * @brief USBH_MSC_BOT_REQ_Reset - * The function the MSC BOT Reset request. - * @param phost: Host handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_MSC_BOT_REQ_Reset(USBH_HandleTypeDef *phost) -{ - - phost->Control.setup.b.bmRequestType = USB_H2D | USB_REQ_TYPE_CLASS | \ - USB_REQ_RECIPIENT_INTERFACE; - - phost->Control.setup.b.bRequest = USB_REQ_BOT_RESET; - phost->Control.setup.b.wValue.w = 0; - phost->Control.setup.b.wIndex.w = 0; - phost->Control.setup.b.wLength.w = 0; - - return USBH_CtlReq(phost, 0 , 0 ); -} - -/** - * @brief USBH_MSC_BOT_REQ_GetMaxLUN - * The function the MSC BOT GetMaxLUN request. - * @param phost: Host handle - * @param Maxlun: pointer to Maxlun variable - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_MSC_BOT_REQ_GetMaxLUN(USBH_HandleTypeDef *phost, uint8_t *Maxlun) -{ - phost->Control.setup.b.bmRequestType = USB_D2H | USB_REQ_TYPE_CLASS | \ - USB_REQ_RECIPIENT_INTERFACE; - - phost->Control.setup.b.bRequest = USB_REQ_GET_MAX_LUN; - phost->Control.setup.b.wValue.w = 0; - phost->Control.setup.b.wIndex.w = 0; - phost->Control.setup.b.wLength.w = 1; - - return USBH_CtlReq(phost, Maxlun , 1 ); -} - - - -/** - * @brief USBH_MSC_BOT_Init - * The function Initializes the BOT protocol. - * @param phost: Host handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_MSC_BOT_Init(USBH_HandleTypeDef *phost) -{ - - MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData; - - MSC_Handle->hbot.cbw.field.Signature = BOT_CBW_SIGNATURE; - MSC_Handle->hbot.cbw.field.Tag = BOT_CBW_TAG; - MSC_Handle->hbot.state = BOT_SEND_CBW; - MSC_Handle->hbot.cmd_state = BOT_CMD_SEND; - - return USBH_OK; -} - - - -/** - * @brief USBH_MSC_BOT_Process - * The function handle the BOT protocol. - * @param phost: Host handle - * @param lun: Logical Unit Number - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_MSC_BOT_Process (USBH_HandleTypeDef *phost, uint8_t lun) -{ - USBH_StatusTypeDef status = USBH_BUSY; - USBH_StatusTypeDef error = USBH_BUSY; - BOT_CSWStatusTypeDef CSW_Status = BOT_CSW_CMD_FAILED; - USBH_URBStateTypeDef URB_Status = USBH_URB_IDLE; - MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData; - uint8_t toggle = 0; - - switch (MSC_Handle->hbot.state) - { - case BOT_SEND_CBW: - MSC_Handle->hbot.cbw.field.LUN = lun; - MSC_Handle->hbot.state = BOT_SEND_CBW_WAIT; - USBH_BulkSendData (phost, - MSC_Handle->hbot.cbw.data, - BOT_CBW_LENGTH, - MSC_Handle->OutPipe, - 1); - - break; - - case BOT_SEND_CBW_WAIT: - - URB_Status = USBH_LL_GetURBState(phost, MSC_Handle->OutPipe); - - if(URB_Status == USBH_URB_DONE) - { - if ( MSC_Handle->hbot.cbw.field.DataTransferLength != 0 ) - { - /* If there is Data Transfer Stage */ - if (((MSC_Handle->hbot.cbw.field.Flags) & USB_REQ_DIR_MASK) == USB_D2H) - { - /* Data Direction is IN */ - MSC_Handle->hbot.state = BOT_DATA_IN; - } - else - { - /* Data Direction is OUT */ - MSC_Handle->hbot.state = BOT_DATA_OUT; - } - } - - else - {/* If there is NO Data Transfer Stage */ - MSC_Handle->hbot.state = BOT_RECEIVE_CSW; - } -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_URB_EVENT, 0); -#endif - - } - else if(URB_Status == USBH_URB_NOTREADY) - { - /* Re-send CBW */ - MSC_Handle->hbot.state = BOT_SEND_CBW; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_URB_EVENT, 0); -#endif - } - else if(URB_Status == USBH_URB_STALL) - { - MSC_Handle->hbot.state = BOT_ERROR_OUT; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_URB_EVENT, 0); -#endif - } - break; - - case BOT_DATA_IN: - /* Send first packet */ - USBH_BulkReceiveData (phost, - MSC_Handle->hbot.pbuf, - MSC_Handle->InEpSize , - MSC_Handle->InPipe); - - MSC_Handle->hbot.state = BOT_DATA_IN_WAIT; - - break; - - case BOT_DATA_IN_WAIT: - - URB_Status = USBH_LL_GetURBState(phost, MSC_Handle->InPipe); - - if(URB_Status == USBH_URB_DONE) - { - /* Adjust Data pointer and data length */ - if(MSC_Handle->hbot.cbw.field.DataTransferLength > MSC_Handle->InEpSize) - { - MSC_Handle->hbot.pbuf += MSC_Handle->InEpSize; - MSC_Handle->hbot.cbw.field.DataTransferLength -= MSC_Handle->InEpSize; - } - else - { - MSC_Handle->hbot.cbw.field.DataTransferLength = 0; - } - - /* More Data To be Received */ - if(MSC_Handle->hbot.cbw.field.DataTransferLength > 0) - { - /* Send next packet */ - USBH_BulkReceiveData (phost, - MSC_Handle->hbot.pbuf, - MSC_Handle->InEpSize , - MSC_Handle->InPipe); - - } - else - { - /* If value was 0, and successful transfer, then change the state */ - MSC_Handle->hbot.state = BOT_RECEIVE_CSW; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_URB_EVENT, 0); -#endif - } - } - else if(URB_Status == USBH_URB_STALL) - { - /* This is Data IN Stage STALL Condition */ - MSC_Handle->hbot.state = BOT_ERROR_IN; - - /* Refer to USB Mass-Storage Class : BOT (www.usb.org) - 6.7.2 Host expects to receive data from the device - 3. On a STALL condition receiving data, then: - The host shall accept the data received. - The host shall clear the Bulk-In pipe. - 4. The host shall attempt to receive a CSW.*/ - -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_URB_EVENT, 0); -#endif - } - break; - - case BOT_DATA_OUT: - - USBH_BulkSendData (phost, - MSC_Handle->hbot.pbuf, - MSC_Handle->OutEpSize , - MSC_Handle->OutPipe, - 1); - - - MSC_Handle->hbot.state = BOT_DATA_OUT_WAIT; - break; - - case BOT_DATA_OUT_WAIT: - URB_Status = USBH_LL_GetURBState(phost, MSC_Handle->OutPipe); - - if(URB_Status == USBH_URB_DONE) - { - /* Adjust Data pointer and data length */ - if(MSC_Handle->hbot.cbw.field.DataTransferLength > MSC_Handle->OutEpSize) - { - MSC_Handle->hbot.pbuf += MSC_Handle->OutEpSize; - MSC_Handle->hbot.cbw.field.DataTransferLength -= MSC_Handle->OutEpSize; - } - else - { - MSC_Handle->hbot.cbw.field.DataTransferLength = 0; - } - - /* More Data To be Sent */ - if(MSC_Handle->hbot.cbw.field.DataTransferLength > 0) - { - USBH_BulkSendData (phost, - MSC_Handle->hbot.pbuf, - MSC_Handle->OutEpSize , - MSC_Handle->OutPipe, - 1); - } - else - { - /* If value was 0, and successful transfer, then change the state */ - MSC_Handle->hbot.state = BOT_RECEIVE_CSW; - } -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_URB_EVENT, 0); -#endif - } - - else if(URB_Status == USBH_URB_NOTREADY) - { - /* Resend same data */ - MSC_Handle->hbot.state = BOT_DATA_OUT; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_URB_EVENT, 0); -#endif - } - - else if(URB_Status == USBH_URB_STALL) - { - MSC_Handle->hbot.state = BOT_ERROR_OUT; - - /* Refer to USB Mass-Storage Class : BOT (www.usb.org) - 6.7.3 Ho - Host expects to send data to the device - 3. On a STALL condition sending data, then: - " The host shall clear the Bulk-Out pipe. - 4. The host shall attempt to receive a CSW. - */ -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_URB_EVENT, 0); -#endif - } - break; - - case BOT_RECEIVE_CSW: - - USBH_BulkReceiveData (phost, - MSC_Handle->hbot.csw.data, - BOT_CSW_LENGTH , - MSC_Handle->InPipe); - - MSC_Handle->hbot.state = BOT_RECEIVE_CSW_WAIT; - break; - - case BOT_RECEIVE_CSW_WAIT: - - URB_Status = USBH_LL_GetURBState(phost, MSC_Handle->InPipe); - - /* Decode CSW */ - if(URB_Status == USBH_URB_DONE) - { - MSC_Handle->hbot.state = BOT_SEND_CBW; - MSC_Handle->hbot.cmd_state = BOT_CMD_SEND; - CSW_Status = USBH_MSC_DecodeCSW(phost); - - if(CSW_Status == BOT_CSW_CMD_PASSED) - { - status = USBH_OK; - } - else - { - status = USBH_FAIL; - } -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_URB_EVENT, 0); -#endif - } - else if(URB_Status == USBH_URB_STALL) - { - MSC_Handle->hbot.state = BOT_ERROR_IN; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_URB_EVENT, 0); -#endif - } - break; - - case BOT_ERROR_IN: - error = USBH_MSC_BOT_Abort(phost, lun, BOT_DIR_IN); - - if (error == USBH_OK) - { - MSC_Handle->hbot.state = BOT_RECEIVE_CSW; - } - else if (error == USBH_UNRECOVERED_ERROR) - { - /* This means that there is a STALL Error limit, Do Reset Recovery */ - MSC_Handle->hbot.state = BOT_UNRECOVERED_ERROR; - } - break; - - case BOT_ERROR_OUT: - error = USBH_MSC_BOT_Abort(phost, lun, BOT_DIR_OUT); - - if ( error == USBH_OK) - { - - toggle = USBH_LL_GetToggle(phost, MSC_Handle->OutPipe); - USBH_LL_SetToggle(phost, MSC_Handle->OutPipe, 1- toggle); - USBH_LL_SetToggle(phost, MSC_Handle->InPipe, 0); - MSC_Handle->hbot.state = BOT_ERROR_IN; - } - else if (error == USBH_UNRECOVERED_ERROR) - { - MSC_Handle->hbot.state = BOT_UNRECOVERED_ERROR; - } - break; - - - case BOT_UNRECOVERED_ERROR: - status = USBH_MSC_BOT_REQ_Reset(phost); - if ( status == USBH_OK) - { - MSC_Handle->hbot.state = BOT_SEND_CBW; - } - break; - - default: - break; - } - return status; -} - -/** - * @brief USBH_MSC_BOT_Abort - * The function handle the BOT Abort process. - * @param phost: Host handle - * @param lun: Logical Unit Number - * @param dir: direction (0: out / 1 : in) - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_MSC_BOT_Abort(USBH_HandleTypeDef *phost, uint8_t lun, uint8_t dir) -{ - USBH_StatusTypeDef status = USBH_FAIL; - MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData; - - switch (dir) - { - case BOT_DIR_IN : - /* send ClrFeture on Bulk IN endpoint */ - status = USBH_ClrFeature(phost, MSC_Handle->InEp); - - break; - - case BOT_DIR_OUT : - /*send ClrFeature on Bulk OUT endpoint */ - status = USBH_ClrFeature(phost, MSC_Handle->OutEp); - break; - - default: - break; - } - return status; -} - -/** - * @brief USBH_MSC_BOT_DecodeCSW - * This function decodes the CSW received by the device and updates the - * same to upper layer. - * @param phost: Host handle - * @retval USBH Status - * @notes - * Refer to USB Mass-Storage Class : BOT (www.usb.org) - * 6.3.1 Valid CSW Conditions : - * The host shall consider the CSW valid when: - * 1. dCSWSignature is equal to 53425355h - * 2. the CSW is 13 (Dh) bytes in length, - * 3. dCSWTag matches the dCBWTag from the corresponding CBW. - */ - -static BOT_CSWStatusTypeDef USBH_MSC_DecodeCSW(USBH_HandleTypeDef *phost) -{ - MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData; - BOT_CSWStatusTypeDef status = BOT_CSW_CMD_FAILED; - - /*Checking if the transfer length is different than 13*/ - if(USBH_LL_GetLastXferSize(phost, MSC_Handle->InPipe) != BOT_CSW_LENGTH) - { - /*(4) Hi > Dn (Host expects to receive data from the device, - Device intends to transfer no data) - (5) Hi > Di (Host expects to receive data from the device, - Device intends to send data to the host) - (9) Ho > Dn (Host expects to send data to the device, - Device intends to transfer no data) - (11) Ho > Do (Host expects to send data to the device, - Device intends to receive data from the host)*/ - - - status = BOT_CSW_PHASE_ERROR; - } - else - { /* CSW length is Correct */ - - /* Check validity of the CSW Signature and CSWStatus */ - if(MSC_Handle->hbot.csw.field.Signature == BOT_CSW_SIGNATURE) - {/* Check Condition 1. dCSWSignature is equal to 53425355h */ - - if(MSC_Handle->hbot.csw.field.Tag == MSC_Handle->hbot.cbw.field.Tag) - { - /* Check Condition 3. dCSWTag matches the dCBWTag from the - corresponding CBW */ - - if(MSC_Handle->hbot.csw.field.Status == 0) - { - /* Refer to USB Mass-Storage Class : BOT (www.usb.org) - - Hn Host expects no data transfers - Hi Host expects to receive data from the device - Ho Host expects to send data to the device - - Dn Device intends to transfer no data - Di Device intends to send data to the host - Do Device intends to receive data from the host - - Section 6.7 - (1) Hn = Dn (Host expects no data transfers, - Device intends to transfer no data) - (6) Hi = Di (Host expects to receive data from the device, - Device intends to send data to the host) - (12) Ho = Do (Host expects to send data to the device, - Device intends to receive data from the host) - - */ - - status = BOT_CSW_CMD_PASSED; - } - else if(MSC_Handle->hbot.csw.field.Status == 1) - { - status = BOT_CSW_CMD_FAILED; - } - - else if(MSC_Handle->hbot.csw.field.Status == 2) - { - /* Refer to USB Mass-Storage Class : BOT (www.usb.org) - Section 6.7 - (2) Hn < Di ( Host expects no data transfers, - Device intends to send data to the host) - (3) Hn < Do ( Host expects no data transfers, - Device intends to receive data from the host) - (7) Hi < Di ( Host expects to receive data from the device, - Device intends to send data to the host) - (8) Hi <> Do ( Host expects to receive data from the device, - Device intends to receive data from the host) - (10) Ho <> Di (Host expects to send data to the device, - Di Device intends to send data to the host) - (13) Ho < Do (Host expects to send data to the device, - Device intends to receive data from the host) - */ - - status = BOT_CSW_PHASE_ERROR; - } - } /* CSW Tag Matching is Checked */ - } /* CSW Signature Correct Checking */ - else - { - /* If the CSW Signature is not valid, We sall return the Phase Error to - Upper Layers for Reset Recovery */ - - status = BOT_CSW_PHASE_ERROR; - } - } /* CSW Length Check*/ - - return status; -} - - -/** -* @} -*/ - -/** -* @} -*/ - -/** -* @} -*/ - -/** -* @} -*/ - -/** -* @} -*/ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - - - diff --git a/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Src/usbh_msc_scsi.c b/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Src/usbh_msc_scsi.c deleted file mode 100755 index 40332e40..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Src/usbh_msc_scsi.c +++ /dev/null @@ -1,458 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_msc_scsi.c - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief This file implements the SCSI commands - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbh_msc.h" -#include "usbh_msc_scsi.h" -#include "usbh_msc_bot.h" - - -/** @addtogroup USBH_LIB - * @{ - */ - -/** @addtogroup USBH_CLASS - * @{ - */ - -/** @addtogroup USBH_MSC_CLASS - * @{ - */ - -/** @defgroup USBH_MSC_SCSI - * @brief This file includes the mass storage related functions - * @{ - */ - - -/** @defgroup USBH_MSC_SCSI_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBH_MSC_SCSI_Private_Defines - * @{ - */ -/** - * @} - */ - -/** @defgroup USBH_MSC_SCSI_Private_Macros - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBH_MSC_SCSI_Private_FunctionPrototypes - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBH_MSC_SCSI_Exported_Variables - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBH_MSC_SCSI_Private_Functions - * @{ - */ - - -/** - * @brief USBH_MSC_SCSI_TestUnitReady - * Issue TestUnitReady command. - * @param phost: Host handle - * @param lun: Logical Unit Number - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_MSC_SCSI_TestUnitReady (USBH_HandleTypeDef *phost, - uint8_t lun) -{ - USBH_StatusTypeDef error = USBH_FAIL ; - MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData; - - switch(MSC_Handle->hbot.cmd_state) - { - case BOT_CMD_SEND: - - /*Prepare the CBW and relevent field*/ - MSC_Handle->hbot.cbw.field.DataTransferLength = DATA_LEN_MODE_TEST_UNIT_READY; - MSC_Handle->hbot.cbw.field.Flags = USB_EP_DIR_OUT; - MSC_Handle->hbot.cbw.field.CBLength = CBW_LENGTH; - - USBH_memset(MSC_Handle->hbot.cbw.field.CB, 0, CBW_CB_LENGTH); - MSC_Handle->hbot.cbw.field.CB[0] = OPCODE_TEST_UNIT_READY; - - MSC_Handle->hbot.state = BOT_SEND_CBW; - MSC_Handle->hbot.cmd_state = BOT_CMD_WAIT; - error = USBH_BUSY; - break; - - case BOT_CMD_WAIT: - error = USBH_MSC_BOT_Process(phost, lun); - break; - - default: - break; - } - - return error; -} - -/** - * @brief USBH_MSC_SCSI_ReadCapacity - * Issue Read Capacity command. - * @param phost: Host handle - * @param lun: Logical Unit Number - * @param capacity: pointer to the capacity structure - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_MSC_SCSI_ReadCapacity (USBH_HandleTypeDef *phost, - uint8_t lun, - SCSI_CapacityTypeDef *capacity) -{ - USBH_StatusTypeDef error = USBH_BUSY ; - MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData; - - switch(MSC_Handle->hbot.cmd_state) - { - case BOT_CMD_SEND: - - /*Prepare the CBW and relevent field*/ - MSC_Handle->hbot.cbw.field.DataTransferLength = DATA_LEN_READ_CAPACITY10; - MSC_Handle->hbot.cbw.field.Flags = USB_EP_DIR_IN; - MSC_Handle->hbot.cbw.field.CBLength = CBW_LENGTH; - - USBH_memset(MSC_Handle->hbot.cbw.field.CB, 0, CBW_CB_LENGTH); - MSC_Handle->hbot.cbw.field.CB[0] = OPCODE_READ_CAPACITY10; - - MSC_Handle->hbot.state = BOT_SEND_CBW; - - MSC_Handle->hbot.cmd_state = BOT_CMD_WAIT; - MSC_Handle->hbot.pbuf = (uint8_t *)MSC_Handle->hbot.data; - error = USBH_BUSY; - break; - - case BOT_CMD_WAIT: - - error = USBH_MSC_BOT_Process(phost, lun); - - if(error == USBH_OK) - { - /*assign the capacity*/ - capacity->block_nbr = MSC_Handle->hbot.pbuf[3] | (MSC_Handle->hbot.pbuf[2] << 8) |\ - (MSC_Handle->hbot.pbuf[1] << 16) | (MSC_Handle->hbot.pbuf[0] << 24); - - /*assign the page length*/ - capacity->block_size = MSC_Handle->hbot.pbuf[7] | (MSC_Handle->hbot.pbuf[6] << 8); - } - break; - - default: - break; - } - - return error; -} - -/** - * @brief USBH_MSC_SCSI_Inquiry - * Issue Inquiry command. - * @param phost: Host handle - * @param lun: Logical Unit Number - * @param capacity: pointer to the inquiry structure - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_MSC_SCSI_Inquiry (USBH_HandleTypeDef *phost, - uint8_t lun, - SCSI_StdInquiryDataTypeDef *inquiry) -{ - USBH_StatusTypeDef error = USBH_FAIL ; - MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData; - switch(MSC_Handle->hbot.cmd_state) - { - case BOT_CMD_SEND: - - /*Prepare the CBW and relevent field*/ - MSC_Handle->hbot.cbw.field.DataTransferLength = DATA_LEN_INQUIRY; - MSC_Handle->hbot.cbw.field.Flags = USB_EP_DIR_IN; - MSC_Handle->hbot.cbw.field.CBLength = CBW_LENGTH; - - USBH_memset(MSC_Handle->hbot.cbw.field.CB, 0, CBW_LENGTH); - MSC_Handle->hbot.cbw.field.CB[0] = OPCODE_INQUIRY; - MSC_Handle->hbot.cbw.field.CB[1] = (lun << 5); - MSC_Handle->hbot.cbw.field.CB[2] = 0; - MSC_Handle->hbot.cbw.field.CB[3] = 0; - MSC_Handle->hbot.cbw.field.CB[4] = 0x24; - MSC_Handle->hbot.cbw.field.CB[5] = 0; - - MSC_Handle->hbot.state = BOT_SEND_CBW; - - MSC_Handle->hbot.cmd_state = BOT_CMD_WAIT; - MSC_Handle->hbot.pbuf = (uint8_t *)MSC_Handle->hbot.data; - error = USBH_BUSY; - break; - - case BOT_CMD_WAIT: - - error = USBH_MSC_BOT_Process(phost, lun); - - if(error == USBH_OK) - { - USBH_memset(inquiry, 0, sizeof(SCSI_StdInquiryDataTypeDef)); - /*assign Inquiry Data */ - inquiry->DeviceType = MSC_Handle->hbot.pbuf[0] & 0x1F; - inquiry->PeripheralQualifier = MSC_Handle->hbot.pbuf[0] >> 5; - inquiry->RemovableMedia = (MSC_Handle->hbot.pbuf[1] & 0x80)== 0x80; - USBH_memcpy (inquiry->vendor_id, &MSC_Handle->hbot.pbuf[8], 8); - USBH_memcpy (inquiry->product_id, &MSC_Handle->hbot.pbuf[16], 16); - USBH_memcpy (inquiry->revision_id, &MSC_Handle->hbot.pbuf[32], 4); - } - break; - - default: - break; - } - - return error; -} - -/** - * @brief USBH_MSC_SCSI_RequestSense - * Issue RequestSense command. - * @param phost: Host handle - * @param lun: Logical Unit Number - * @param capacity: pointer to the sense data structure - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_MSC_SCSI_RequestSense (USBH_HandleTypeDef *phost, - uint8_t lun, - SCSI_SenseTypeDef *sense_data) -{ - USBH_StatusTypeDef error = USBH_FAIL ; - MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData; - - switch(MSC_Handle->hbot.cmd_state) - { - case BOT_CMD_SEND: - - /*Prepare the CBW and relevent field*/ - MSC_Handle->hbot.cbw.field.DataTransferLength = DATA_LEN_REQUEST_SENSE; - MSC_Handle->hbot.cbw.field.Flags = USB_EP_DIR_IN; - MSC_Handle->hbot.cbw.field.CBLength = CBW_LENGTH; - - USBH_memset(MSC_Handle->hbot.cbw.field.CB, 0, CBW_CB_LENGTH); - MSC_Handle->hbot.cbw.field.CB[0] = OPCODE_REQUEST_SENSE; - MSC_Handle->hbot.cbw.field.CB[1] = (lun << 5); - MSC_Handle->hbot.cbw.field.CB[2] = 0; - MSC_Handle->hbot.cbw.field.CB[3] = 0; - MSC_Handle->hbot.cbw.field.CB[4] = DATA_LEN_REQUEST_SENSE; - MSC_Handle->hbot.cbw.field.CB[5] = 0; - - MSC_Handle->hbot.state = BOT_SEND_CBW; - MSC_Handle->hbot.cmd_state = BOT_CMD_WAIT; - MSC_Handle->hbot.pbuf = (uint8_t *)MSC_Handle->hbot.data; - error = USBH_BUSY; - break; - - case BOT_CMD_WAIT: - - error = USBH_MSC_BOT_Process(phost, lun); - - if(error == USBH_OK) - { - sense_data->key = MSC_Handle->hbot.pbuf[2] & 0x0F; - sense_data->asc = MSC_Handle->hbot.pbuf[12]; - sense_data->ascq = MSC_Handle->hbot.pbuf[13]; - } - break; - - default: - break; - } - - return error; -} - -/** - * @brief USBH_MSC_SCSI_Write - * Issue write10 command. - * @param phost: Host handle - * @param lun: Logical Unit Number - * @param address: sector address - * @param pbuf: pointer to data - * @param length: number of sector to write - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_MSC_SCSI_Write(USBH_HandleTypeDef *phost, - uint8_t lun, - uint32_t address, - uint8_t *pbuf, - uint32_t length) -{ - USBH_StatusTypeDef error = USBH_FAIL ; - - MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData; - - switch(MSC_Handle->hbot.cmd_state) - { - case BOT_CMD_SEND: - - /*Prepare the CBW and relevent field*/ - MSC_Handle->hbot.cbw.field.DataTransferLength = length * 512; - MSC_Handle->hbot.cbw.field.Flags = USB_EP_DIR_OUT; - MSC_Handle->hbot.cbw.field.CBLength = CBW_LENGTH; - - USBH_memset(MSC_Handle->hbot.cbw.field.CB, 0, CBW_CB_LENGTH); - MSC_Handle->hbot.cbw.field.CB[0] = OPCODE_WRITE10; - - /*logical block address*/ - MSC_Handle->hbot.cbw.field.CB[2] = (((uint8_t*)&address)[3]); - MSC_Handle->hbot.cbw.field.CB[3] = (((uint8_t*)&address)[2]); - MSC_Handle->hbot.cbw.field.CB[4] = (((uint8_t*)&address)[1]); - MSC_Handle->hbot.cbw.field.CB[5] = (((uint8_t*)&address)[0]); - - - /*Transfer length */ - MSC_Handle->hbot.cbw.field.CB[7] = (((uint8_t *)&length)[1]) ; - MSC_Handle->hbot.cbw.field.CB[8] = (((uint8_t *)&length)[0]) ; - - - MSC_Handle->hbot.state = BOT_SEND_CBW; - MSC_Handle->hbot.cmd_state = BOT_CMD_WAIT; - MSC_Handle->hbot.pbuf = pbuf; - error = USBH_BUSY; - break; - - case BOT_CMD_WAIT: - error = USBH_MSC_BOT_Process(phost, lun); - break; - - default: - break; - } - - return error; -} - -/** - * @brief USBH_MSC_SCSI_Read - * Issue Read10 command. - * @param phost: Host handle - * @param lun: Logical Unit Number - * @param address: sector address - * @param pbuf: pointer to data - * @param length: number of sector to read - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_MSC_SCSI_Read(USBH_HandleTypeDef *phost, - uint8_t lun, - uint32_t address, - uint8_t *pbuf, - uint32_t length) -{ - USBH_StatusTypeDef error = USBH_FAIL ; - MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData; - - switch(MSC_Handle->hbot.cmd_state) - { - case BOT_CMD_SEND: - - /*Prepare the CBW and relevent field*/ - MSC_Handle->hbot.cbw.field.DataTransferLength = length * 512; - MSC_Handle->hbot.cbw.field.Flags = USB_EP_DIR_IN; - MSC_Handle->hbot.cbw.field.CBLength = CBW_LENGTH; - - USBH_memset(MSC_Handle->hbot.cbw.field.CB, 0, CBW_CB_LENGTH); - MSC_Handle->hbot.cbw.field.CB[0] = OPCODE_READ10; - - /*logical block address*/ - MSC_Handle->hbot.cbw.field.CB[2] = (((uint8_t*)&address)[3]); - MSC_Handle->hbot.cbw.field.CB[3] = (((uint8_t*)&address)[2]); - MSC_Handle->hbot.cbw.field.CB[4] = (((uint8_t*)&address)[1]); - MSC_Handle->hbot.cbw.field.CB[5] = (((uint8_t*)&address)[0]); - - - /*Transfer length */ - MSC_Handle->hbot.cbw.field.CB[7] = (((uint8_t *)&length)[1]) ; - MSC_Handle->hbot.cbw.field.CB[8] = (((uint8_t *)&length)[0]) ; - - - MSC_Handle->hbot.state = BOT_SEND_CBW; - MSC_Handle->hbot.cmd_state = BOT_CMD_WAIT; - MSC_Handle->hbot.pbuf = pbuf; - error = USBH_BUSY; - break; - - case BOT_CMD_WAIT: - error = USBH_MSC_BOT_Process(phost, lun); - break; - - default: - break; - } - - return error; -} - - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - - - diff --git a/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_conf_template.h b/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_conf_template.h deleted file mode 100755 index 1bc2cecd..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_conf_template.h +++ /dev/null @@ -1,157 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_conf_template.h - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief Header file for usbh_conf_template.c - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBH_CONF_TEMPLATE_H -#define __USBH_CONF_TEMPLATE_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f4xx.h" -#include -#include -#include - -/** @addtogroup USBH_OTG_DRIVER - * @{ - */ - -/** @defgroup USBH_CONF - * @brief usb otg low level driver configuration file - * @{ - */ - -/** @defgroup USBH_CONF_Exported_Defines - * @{ - */ - -#define USBH_MAX_NUM_ENDPOINTS 2 -#define USBH_MAX_NUM_INTERFACES 2 -#define USBH_MAX_NUM_CONFIGURATION 1 -#define USBH_KEEP_CFG_DESCRIPTOR 1 -#define USBH_MAX_NUM_SUPPORTED_CLASS 1 -#define USBH_MAX_SIZE_CONFIGURATION 0x200 -#define USBH_MAX_DATA_BUFFER 0x200 -#define USBH_DEBUG_LEVEL 2 -#define USBH_USE_OS 1 - -/** @defgroup USBH_Exported_Macros - * @{ - */ - - /* Memory management macros */ -#define USBH_malloc malloc -#define USBH_free free -#define USBH_memset memset -#define USBH_memcpy memcpy - - /* DEBUG macros */ - - -#if (USBH_DEBUG_LEVEL > 0) -#define USBH_UsrLog(...) printf(__VA_ARGS__);\ - printf("\n"); -#else -#define USBH_UsrLog(...) -#endif - - -#if (USBH_DEBUG_LEVEL > 1) - -#define USBH_ErrLog(...) printf("ERROR: ") ;\ - printf(__VA_ARGS__);\ - printf("\n"); -#else -#define USBH_ErrLog(...) -#endif - - -#if (USBH_DEBUG_LEVEL > 2) -#define USBH_DbgLog(...) printf("DEBUG : ") ;\ - printf(__VA_ARGS__);\ - printf("\n"); -#else -#define USBH_DbgLog(...) -#endif - -/** - * @} - */ - -/** - * @} - */ - - -/** @defgroup USBH_CONF_Exported_Types - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBH_CONF_Exported_Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup USBH_CONF_Exported_Variables - * @{ - */ -/** - * @} - */ - -/** @defgroup USBH_CONF_Exported_FunctionsPrototype - * @{ - */ -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBH_CONF_TEMPLATE_H */ - - -/** - * @} - */ - -/** - * @} - */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - diff --git a/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_core.h b/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_core.h deleted file mode 100755 index 9a96169a..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_core.h +++ /dev/null @@ -1,169 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_core.h - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief Header file for usbh_core.c - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive ----------------------------------------------*/ -#ifndef __USBH_CORE_H -#define __USBH_CORE_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbh_conf.h" -#include "usbh_def.h" -#include "usbh_ioreq.h" -#include "usbh_pipes.h" -#include "usbh_ctlreq.h" - -/** @addtogroup USBH_LIB - * @{ - */ - -/** @addtogroup USBH_LIB_CORE -* @{ -*/ - -/** @defgroup USBH_CORE - * @brief This file is the Header file for usbh_core.c - * @{ - */ - - -/** @defgroup USBH_CORE_Exported_Defines - * @{ - */ - -/** - * @} - */ -#define HOST_USER_SELECT_CONFIGURATION 1 -#define HOST_USER_CLASS_ACTIVE 2 -#define HOST_USER_CLASS_SELECTED 3 -#define HOST_USER_CONNECTION 4 -#define HOST_USER_DISCONNECTION 5 -#define HOST_USER_UNRECOVERED_ERROR 6 - - -/** - * @} - */ - - - -/** @defgroup USBH_CORE_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBH_CORE_Exported_Variables - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBH_CORE_Exported_FunctionsPrototype - * @{ - */ - - -USBH_StatusTypeDef USBH_Init(USBH_HandleTypeDef *phost, void (*pUsrFunc)(USBH_HandleTypeDef *phost, uint8_t ), uint8_t id); -USBH_StatusTypeDef USBH_DeInit(USBH_HandleTypeDef *phost); -USBH_StatusTypeDef USBH_RegisterClass(USBH_HandleTypeDef *phost, USBH_ClassTypeDef *pclass); -USBH_StatusTypeDef USBH_SelectInterface(USBH_HandleTypeDef *phost, uint8_t interface); -uint8_t USBH_FindInterface(USBH_HandleTypeDef *phost, - uint8_t Class, - uint8_t SubClass, - uint8_t Protocol); -uint8_t USBH_GetActiveClass(USBH_HandleTypeDef *phost); - -uint8_t USBH_FindInterfaceIndex(USBH_HandleTypeDef *phost, - uint8_t interface_number, - uint8_t alt_settings); - -USBH_StatusTypeDef USBH_Start (USBH_HandleTypeDef *phost); -USBH_StatusTypeDef USBH_Stop (USBH_HandleTypeDef *phost); -USBH_StatusTypeDef USBH_Process (USBH_HandleTypeDef *phost); -USBH_StatusTypeDef USBH_ReEnumerate (USBH_HandleTypeDef *phost); - -/* USBH Low Level Driver */ -USBH_StatusTypeDef USBH_LL_Init (USBH_HandleTypeDef *phost); -USBH_StatusTypeDef USBH_LL_DeInit (USBH_HandleTypeDef *phost); -USBH_StatusTypeDef USBH_LL_Start (USBH_HandleTypeDef *phost); -USBH_StatusTypeDef USBH_LL_Stop (USBH_HandleTypeDef *phost); - -USBH_StatusTypeDef USBH_LL_Connect (USBH_HandleTypeDef *phost); -USBH_StatusTypeDef USBH_LL_Disconnect (USBH_HandleTypeDef *phost); -USBH_SpeedTypeDef USBH_LL_GetSpeed (USBH_HandleTypeDef *phost); -USBH_StatusTypeDef USBH_LL_ResetPort (USBH_HandleTypeDef *phost); -uint32_t USBH_LL_GetLastXferSize (USBH_HandleTypeDef *phost, uint8_t ); -USBH_StatusTypeDef USBH_LL_DriverVBUS (USBH_HandleTypeDef *phost, uint8_t ); - -USBH_StatusTypeDef USBH_LL_OpenPipe (USBH_HandleTypeDef *phost, uint8_t, uint8_t, uint8_t, uint8_t , uint8_t, uint16_t ); -USBH_StatusTypeDef USBH_LL_ClosePipe (USBH_HandleTypeDef *phost, uint8_t ); -USBH_StatusTypeDef USBH_LL_SubmitURB (USBH_HandleTypeDef *phost, uint8_t, uint8_t,uint8_t, uint8_t, uint8_t*, uint16_t, uint8_t ); -USBH_URBStateTypeDef USBH_LL_GetURBState (USBH_HandleTypeDef *phost, uint8_t ); -#if (USBH_USE_OS == 1) -USBH_StatusTypeDef USBH_LL_NotifyURBChange (USBH_HandleTypeDef *phost); -#endif -USBH_StatusTypeDef USBH_LL_SetToggle (USBH_HandleTypeDef *phost, uint8_t , uint8_t ); -uint8_t USBH_LL_GetToggle (USBH_HandleTypeDef *phost, uint8_t ); - -/* USBH Time base */ -void USBH_Delay (uint32_t Delay); -void USBH_LL_SetTimer (USBH_HandleTypeDef *phost, uint32_t ); -void USBH_LL_IncTimer (USBH_HandleTypeDef *phost); -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBH_CORE_H */ -/** - * @} - */ - -/** - * @} - */ - -/** -* @} -*/ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - - - diff --git a/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_ctlreq.h b/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_ctlreq.h deleted file mode 100755 index 1d0e2026..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_ctlreq.h +++ /dev/null @@ -1,155 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_ctlreq.h - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief Header file for usbh_ctlreq.c - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive ----------------------------------------------*/ -#ifndef __USBH_CTLREQ_H -#define __USBH_CTLREQ_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbh_core.h" - -/** @addtogroup USBH_LIB - * @{ - */ - -/** @addtogroup USBH_LIB_CORE -* @{ -*/ - -/** @defgroup USBH_CTLREQ - * @brief This file is the - * @{ - */ - - -/** @defgroup USBH_CTLREQ_Exported_Defines - * @{ - */ -/*Standard Feature Selector for clear feature command*/ -#define FEATURE_SELECTOR_ENDPOINT 0X00 -#define FEATURE_SELECTOR_DEVICE 0X01 - - -#define INTERFACE_DESC_TYPE 0x04 -#define ENDPOINT_DESC_TYPE 0x05 -#define INTERFACE_DESC_SIZE 0x09 - -/** - * @} - */ - - -/** @defgroup USBH_CTLREQ_Exported_Types - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBH_CTLREQ_Exported_Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup USBH_CTLREQ_Exported_Variables - * @{ - */ -extern uint8_t USBH_CfgDesc[512]; -/** - * @} - */ - -/** @defgroup USBH_CTLREQ_Exported_FunctionsPrototype - * @{ - */ -USBH_StatusTypeDef USBH_CtlReq (USBH_HandleTypeDef *phost, - uint8_t *buff, - uint16_t length); - -USBH_StatusTypeDef USBH_GetDescriptor(USBH_HandleTypeDef *phost, - uint8_t req_type, - uint16_t value_idx, - uint8_t* buff, - uint16_t length ); - -USBH_StatusTypeDef USBH_Get_DevDesc(USBH_HandleTypeDef *phost, - uint8_t length); - -USBH_StatusTypeDef USBH_Get_StringDesc(USBH_HandleTypeDef *phost, - uint8_t string_index, - uint8_t *buff, - uint16_t length); - -USBH_StatusTypeDef USBH_SetCfg(USBH_HandleTypeDef *phost, - uint16_t configuration_value); - -USBH_StatusTypeDef USBH_Get_CfgDesc(USBH_HandleTypeDef *phost, - uint16_t length); - -USBH_StatusTypeDef USBH_SetAddress(USBH_HandleTypeDef *phost, - uint8_t DeviceAddress); - -USBH_StatusTypeDef USBH_SetInterface(USBH_HandleTypeDef *phost, - uint8_t ep_num, uint8_t altSetting); - -USBH_StatusTypeDef USBH_ClrFeature(USBH_HandleTypeDef *phost, - uint8_t ep_num); - -USBH_DescHeader_t *USBH_GetNextDesc (uint8_t *pbuf, - uint16_t *ptr); -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBH_CTLREQ_H */ - -/** - * @} - */ - -/** - * @} - */ - -/** -* @} -*/ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - - diff --git a/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_def.h b/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_def.h deleted file mode 100755 index acc19092..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_def.h +++ /dev/null @@ -1,490 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_def.h - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief Definitions used in the USB host library - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive ----------------------------------------------*/ -#ifndef USBH_DEF_H -#define USBH_DEF_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbh_conf.h" - -/** @addtogroup USBH_LIB - * @{ - */ - -/** @addtogroup USBH_LIB_CORE -* @{ -*/ - -/** @defgroup USBH_DEF - * @brief This file is includes USB descriptors - * @{ - */ - -#ifndef NULL -#define NULL 0 -#endif - -#ifndef FALSE -#define FALSE 0 -#endif - -#ifndef TRUE -#define TRUE 1 -#endif - - -#define ValBit(VAR,POS) (VAR & (1 << POS)) -#define SetBit(VAR,POS) (VAR |= (1 << POS)) -#define ClrBit(VAR,POS) (VAR &= ((1 << POS)^255)) - -#define LE16(addr) (((uint16_t)(*((uint8_t *)(addr))))\ - + (((uint16_t)(*(((uint8_t *)(addr)) + 1))) << 8)) - -#define LE16S(addr) (uint16_t)(LE16((addr))) - -#define LE32(addr) ((((uint32_t)(*(((uint8_t *)(addr)) + 0))) + \ - (((uint32_t)(*(((uint8_t *)(addr)) + 1))) << 8) + \ - (((uint32_t)(*(((uint8_t *)(addr)) + 2))) << 16) + \ - (((uint32_t)(*(((uint8_t *)(addr)) + 3))) << 24))) - -#define LE64(addr) ((((uint64_t)(*(((uint8_t *)(addr)) + 0))) + \ - (((uint64_t)(*(((uint8_t *)(addr)) + 1))) << 8) +\ - (((uint64_t)(*(((uint8_t *)(addr)) + 2))) << 16) +\ - (((uint64_t)(*(((uint8_t *)(addr)) + 3))) << 24) +\ - (((uint64_t)(*(((uint8_t *)(addr)) + 4))) << 32) +\ - (((uint64_t)(*(((uint8_t *)(addr)) + 5))) << 40) +\ - (((uint64_t)(*(((uint8_t *)(addr)) + 6))) << 48) +\ - (((uint64_t)(*(((uint8_t *)(addr)) + 7))) << 56))) - - -#define LE24(addr) ((((uint32_t)(*(((uint8_t *)(addr)) + 0))) + \ - (((uint32_t)(*(((uint8_t *)(addr)) + 1))) << 8) + \ - (((uint32_t)(*(((uint8_t *)(addr)) + 2))) << 16))) - - -#define LE32S(addr) (int32_t)(LE32((addr))) - - - -#define USB_LEN_DESC_HDR 0x02 -#define USB_LEN_DEV_DESC 0x12 -#define USB_LEN_CFG_DESC 0x09 -#define USB_LEN_IF_DESC 0x09 -#define USB_LEN_EP_DESC 0x07 -#define USB_LEN_OTG_DESC 0x03 -#define USB_LEN_SETUP_PKT 0x08 - -/* bmRequestType :D7 Data Phase Transfer Direction */ -#define USB_REQ_DIR_MASK 0x80 -#define USB_H2D 0x00 -#define USB_D2H 0x80 - -/* bmRequestType D6..5 Type */ -#define USB_REQ_TYPE_STANDARD 0x00 -#define USB_REQ_TYPE_CLASS 0x20 -#define USB_REQ_TYPE_VENDOR 0x40 -#define USB_REQ_TYPE_RESERVED 0x60 - -/* bmRequestType D4..0 Recipient */ -#define USB_REQ_RECIPIENT_DEVICE 0x00 -#define USB_REQ_RECIPIENT_INTERFACE 0x01 -#define USB_REQ_RECIPIENT_ENDPOINT 0x02 -#define USB_REQ_RECIPIENT_OTHER 0x03 - -/* Table 9-4. Standard Request Codes */ -/* bRequest , Value */ -#define USB_REQ_GET_STATUS 0x00 -#define USB_REQ_CLEAR_FEATURE 0x01 -#define USB_REQ_SET_FEATURE 0x03 -#define USB_REQ_SET_ADDRESS 0x05 -#define USB_REQ_GET_DESCRIPTOR 0x06 -#define USB_REQ_SET_DESCRIPTOR 0x07 -#define USB_REQ_GET_CONFIGURATION 0x08 -#define USB_REQ_SET_CONFIGURATION 0x09 -#define USB_REQ_GET_INTERFACE 0x0A -#define USB_REQ_SET_INTERFACE 0x0B -#define USB_REQ_SYNCH_FRAME 0x0C - -/* Table 9-5. Descriptor Types of USB Specifications */ -#define USB_DESC_TYPE_DEVICE 1 -#define USB_DESC_TYPE_CONFIGURATION 2 -#define USB_DESC_TYPE_STRING 3 -#define USB_DESC_TYPE_INTERFACE 4 -#define USB_DESC_TYPE_ENDPOINT 5 -#define USB_DESC_TYPE_DEVICE_QUALIFIER 6 -#define USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION 7 -#define USB_DESC_TYPE_INTERFACE_POWER 8 -#define USB_DESC_TYPE_HID 0x21 -#define USB_DESC_TYPE_HID_REPORT 0x22 - - -#define USB_DEVICE_DESC_SIZE 18 -#define USB_CONFIGURATION_DESC_SIZE 9 -#define USB_HID_DESC_SIZE 9 -#define USB_INTERFACE_DESC_SIZE 9 -#define USB_ENDPOINT_DESC_SIZE 7 - -/* Descriptor Type and Descriptor Index */ -/* Use the following values when calling the function USBH_GetDescriptor */ -#define USB_DESC_DEVICE ((USB_DESC_TYPE_DEVICE << 8) & 0xFF00) -#define USB_DESC_CONFIGURATION ((USB_DESC_TYPE_CONFIGURATION << 8) & 0xFF00) -#define USB_DESC_STRING ((USB_DESC_TYPE_STRING << 8) & 0xFF00) -#define USB_DESC_INTERFACE ((USB_DESC_TYPE_INTERFACE << 8) & 0xFF00) -#define USB_DESC_ENDPOINT ((USB_DESC_TYPE_INTERFACE << 8) & 0xFF00) -#define USB_DESC_DEVICE_QUALIFIER ((USB_DESC_TYPE_DEVICE_QUALIFIER << 8) & 0xFF00) -#define USB_DESC_OTHER_SPEED_CONFIGURATION ((USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION << 8) & 0xFF00) -#define USB_DESC_INTERFACE_POWER ((USB_DESC_TYPE_INTERFACE_POWER << 8) & 0xFF00) -#define USB_DESC_HID_REPORT ((USB_DESC_TYPE_HID_REPORT << 8) & 0xFF00) -#define USB_DESC_HID ((USB_DESC_TYPE_HID << 8) & 0xFF00) - - -#define USB_EP_TYPE_CTRL 0x00 -#define USB_EP_TYPE_ISOC 0x01 -#define USB_EP_TYPE_BULK 0x02 -#define USB_EP_TYPE_INTR 0x03 - -#define USB_EP_DIR_OUT 0x00 -#define USB_EP_DIR_IN 0x80 -#define USB_EP_DIR_MSK 0x80 - -#ifndef USBH_MAX_PIPES_NBR - #define USBH_MAX_PIPES_NBR 15 -#endif /* USBH_MAX_PIPES_NBR */ - -#define USBH_DEVICE_ADDRESS_DEFAULT 0 -#define USBH_MAX_ERROR_COUNT 2 -#define USBH_DEVICE_ADDRESS 1 - - -/** - * @} - */ - - -#define USBH_CONFIGURATION_DESCRIPTOR_SIZE (USB_CONFIGURATION_DESC_SIZE \ - + USB_INTERFACE_DESC_SIZE\ - + (USBH_MAX_NUM_ENDPOINTS * USB_ENDPOINT_DESC_SIZE)) - - -#define CONFIG_DESC_wTOTAL_LENGTH (ConfigurationDescriptorData.ConfigDescfield.\ - ConfigurationDescriptor.wTotalLength) - - -typedef union -{ - uint16_t w; - struct BW - { - uint8_t msb; - uint8_t lsb; - } - bw; -} -uint16_t_uint8_t; - - -typedef union _USB_Setup -{ - uint32_t d8[2]; - - struct _SetupPkt_Struc - { - uint8_t bmRequestType; - uint8_t bRequest; - uint16_t_uint8_t wValue; - uint16_t_uint8_t wIndex; - uint16_t_uint8_t wLength; - } b; -} -USB_Setup_TypeDef; - -typedef struct _DescHeader -{ - uint8_t bLength; - uint8_t bDescriptorType; -} -USBH_DescHeader_t; - -typedef struct _DeviceDescriptor -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint16_t bcdUSB; /* USB Specification Number which device complies too */ - uint8_t bDeviceClass; - uint8_t bDeviceSubClass; - uint8_t bDeviceProtocol; - /* If equal to Zero, each interface specifies its own class - code if equal to 0xFF, the class code is vendor specified. - Otherwise field is valid Class Code.*/ - uint8_t bMaxPacketSize; - uint16_t idVendor; /* Vendor ID (Assigned by USB Org) */ - uint16_t idProduct; /* Product ID (Assigned by Manufacturer) */ - uint16_t bcdDevice; /* Device Release Number */ - uint8_t iManufacturer; /* Index of Manufacturer String Descriptor */ - uint8_t iProduct; /* Index of Product String Descriptor */ - uint8_t iSerialNumber; /* Index of Serial Number String Descriptor */ - uint8_t bNumConfigurations; /* Number of Possible Configurations */ -} -USBH_DevDescTypeDef; - -typedef struct _EndpointDescriptor -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bEndpointAddress; /* indicates what endpoint this descriptor is describing */ - uint8_t bmAttributes; /* specifies the transfer type. */ - uint16_t wMaxPacketSize; /* Maximum Packet Size this endpoint is capable of sending or receiving */ - uint8_t bInterval; /* is used to specify the polling interval of certain transfers. */ -} -USBH_EpDescTypeDef; - -typedef struct _InterfaceDescriptor -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bInterfaceNumber; - uint8_t bAlternateSetting; /* Value used to select alternative setting */ - uint8_t bNumEndpoints; /* Number of Endpoints used for this interface */ - uint8_t bInterfaceClass; /* Class Code (Assigned by USB Org) */ - uint8_t bInterfaceSubClass; /* Subclass Code (Assigned by USB Org) */ - uint8_t bInterfaceProtocol; /* Protocol Code */ - uint8_t iInterface; /* Index of String Descriptor Describing this interface */ - USBH_EpDescTypeDef Ep_Desc[USBH_MAX_NUM_ENDPOINTS]; -} -USBH_InterfaceDescTypeDef; - - -typedef struct _ConfigurationDescriptor -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint16_t wTotalLength; /* Total Length of Data Returned */ - uint8_t bNumInterfaces; /* Number of Interfaces */ - uint8_t bConfigurationValue; /* Value to use as an argument to select this configuration*/ - uint8_t iConfiguration; /*Index of String Descriptor Describing this configuration */ - uint8_t bmAttributes; /* D7 Bus Powered , D6 Self Powered, D5 Remote Wakeup , D4..0 Reserved (0)*/ - uint8_t bMaxPower; /*Maximum Power Consumption */ - USBH_InterfaceDescTypeDef Itf_Desc[USBH_MAX_NUM_INTERFACES]; -} -USBH_CfgDescTypeDef; - - -/* Following USB Host status */ -typedef enum -{ - USBH_OK = 0, - USBH_BUSY, - USBH_FAIL, - USBH_NOT_SUPPORTED, - USBH_UNRECOVERED_ERROR, - USBH_ERROR_SPEED_UNKNOWN, -}USBH_StatusTypeDef; - - -/** @defgroup USBH_CORE_Exported_Types - * @{ - */ - -typedef enum -{ - USBH_SPEED_HIGH = 0, - USBH_SPEED_FULL = 1, - USBH_SPEED_LOW = 2, - -}USBH_SpeedTypeDef; - -/* Following states are used for gState */ -typedef enum -{ - HOST_IDLE =0, - HOST_DEV_WAIT_FOR_ATTACHMENT, - HOST_DEV_ATTACHED, - HOST_DEV_DISCONNECTED, - HOST_DETECT_DEVICE_SPEED, - HOST_ENUMERATION, - HOST_CLASS_REQUEST, - HOST_INPUT, - HOST_SET_CONFIGURATION, - HOST_CHECK_CLASS, - HOST_CLASS, - HOST_SUSPENDED, - HOST_ABORT_STATE, -}HOST_StateTypeDef; - -/* Following states are used for EnumerationState */ -typedef enum -{ - ENUM_IDLE = 0, - ENUM_GET_FULL_DEV_DESC, - ENUM_SET_ADDR, - ENUM_GET_CFG_DESC, - ENUM_GET_FULL_CFG_DESC, - ENUM_GET_MFC_STRING_DESC, - ENUM_GET_PRODUCT_STRING_DESC, - ENUM_GET_SERIALNUM_STRING_DESC, -} ENUM_StateTypeDef; - -/* Following states are used for CtrlXferStateMachine */ -typedef enum -{ - CTRL_IDLE =0, - CTRL_SETUP, - CTRL_SETUP_WAIT, - CTRL_DATA_IN, - CTRL_DATA_IN_WAIT, - CTRL_DATA_OUT, - CTRL_DATA_OUT_WAIT, - CTRL_STATUS_IN, - CTRL_STATUS_IN_WAIT, - CTRL_STATUS_OUT, - CTRL_STATUS_OUT_WAIT, - CTRL_ERROR, - CTRL_STALLED, - CTRL_COMPLETE -}CTRL_StateTypeDef; - - -/* Following states are used for RequestState */ -typedef enum -{ - CMD_IDLE =0, - CMD_SEND, - CMD_WAIT -} CMD_StateTypeDef; - -typedef enum { - USBH_URB_IDLE = 0, - USBH_URB_DONE, - USBH_URB_NOTREADY, - USBH_URB_NYET, - USBH_URB_ERROR, - USBH_URB_STALL -}USBH_URBStateTypeDef; - -typedef enum -{ - USBH_PORT_EVENT = 1, - USBH_URB_EVENT, - USBH_CONTROL_EVENT, - USBH_CLASS_EVENT, - USBH_STATE_CHANGED_EVENT, -} -USBH_OSEventTypeDef; - -/* Control request structure */ -typedef struct -{ - uint8_t pipe_in; - uint8_t pipe_out; - uint8_t pipe_size; - uint8_t *buff; - uint16_t length; - uint16_t timer; - USB_Setup_TypeDef setup; - CTRL_StateTypeDef state; - uint8_t errorcount; - -} USBH_CtrlTypeDef; - -/* Attached device structure */ -typedef struct -{ -#if (USBH_KEEP_CFG_DESCRIPTOR == 1) - uint8_t CfgDesc_Raw[USBH_MAX_SIZE_CONFIGURATION]; -#endif - uint8_t Data[USBH_MAX_DATA_BUFFER]; - uint8_t address; - uint8_t speed; - __IO uint8_t is_connected; - uint8_t current_interface; - USBH_DevDescTypeDef DevDesc; - USBH_CfgDescTypeDef CfgDesc; - -}USBH_DeviceTypeDef; - -struct _USBH_HandleTypeDef; - -/* USB Host Class structure */ -typedef struct -{ - const char *Name; - uint8_t ClassCode; - USBH_StatusTypeDef (*Init) (struct _USBH_HandleTypeDef *phost); - USBH_StatusTypeDef (*DeInit) (struct _USBH_HandleTypeDef *phost); - USBH_StatusTypeDef (*Requests) (struct _USBH_HandleTypeDef *phost); - USBH_StatusTypeDef (*BgndProcess) (struct _USBH_HandleTypeDef *phost); - USBH_StatusTypeDef (*SOFProcess) (struct _USBH_HandleTypeDef *phost); - void* pData; -} USBH_ClassTypeDef; - -/* USB Host handle structure */ -typedef struct _USBH_HandleTypeDef -{ - __IO HOST_StateTypeDef gState; /* Host State Machine Value */ - ENUM_StateTypeDef EnumState; /* Enumeration state Machine */ - CMD_StateTypeDef RequestState; - USBH_CtrlTypeDef Control; - USBH_DeviceTypeDef device; - USBH_ClassTypeDef* pClass[USBH_MAX_NUM_SUPPORTED_CLASS]; - USBH_ClassTypeDef* pActiveClass; - uint32_t ClassNumber; - uint32_t Pipes[15]; - __IO uint32_t Timer; - uint8_t id; - void* pData; - void (* pUser )(struct _USBH_HandleTypeDef *pHandle, uint8_t id); - -#if (USBH_USE_OS == 1) - osMessageQId os_event; - osThreadId thread; -#endif - -} USBH_HandleTypeDef; - - -#if defined ( __GNUC__ ) - #ifndef __weak - #define __weak __attribute__((weak)) - #endif /* __weak */ - #ifndef __packed - #define __packed __attribute__((__packed__)) - #endif /* __packed */ -#endif /* __GNUC__ */ - -#ifdef __cplusplus -} -#endif - -#endif /* USBH_DEF_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - diff --git a/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_ioreq.h b/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_ioreq.h deleted file mode 100755 index 2cd4a193..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_ioreq.h +++ /dev/null @@ -1,168 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_ioreq.h - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief Header file for usbh_ioreq.c - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive ----------------------------------------------*/ -#ifndef __USBH_IOREQ_H -#define __USBH_IOREQ_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbh_conf.h" -#include "usbh_core.h" - -/** @addtogroup USBH_LIB - * @{ - */ - -/** @addtogroup USBH_LIB_CORE -* @{ -*/ - -/** @defgroup USBH_IOREQ - * @brief This file is the header file for usbh_ioreq.c - * @{ - */ - - -/** @defgroup USBH_IOREQ_Exported_Defines - * @{ - */ - -#define USBH_PID_SETUP 0 -#define USBH_PID_DATA 1 - -#define USBH_EP_CONTROL 0 -#define USBH_EP_ISO 1 -#define USBH_EP_BULK 2 -#define USBH_EP_INTERRUPT 3 - -#define USBH_SETUP_PKT_SIZE 8 -/** - * @} - */ - - -/** @defgroup USBH_IOREQ_Exported_Types - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBH_IOREQ_Exported_Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup USBH_IOREQ_Exported_Variables - * @{ - */ -/** - * @} - */ - -/** @defgroup USBH_IOREQ_Exported_FunctionsPrototype - * @{ - */ -USBH_StatusTypeDef USBH_CtlSendSetup (USBH_HandleTypeDef *phost, - uint8_t *buff, - uint8_t hc_num); - -USBH_StatusTypeDef USBH_CtlSendData (USBH_HandleTypeDef *phost, - uint8_t *buff, - uint16_t length, - uint8_t hc_num, - uint8_t do_ping ); - -USBH_StatusTypeDef USBH_CtlReceiveData(USBH_HandleTypeDef *phost, - uint8_t *buff, - uint16_t length, - uint8_t hc_num); - -USBH_StatusTypeDef USBH_BulkReceiveData(USBH_HandleTypeDef *phost, - uint8_t *buff, - uint16_t length, - uint8_t hc_num); - -USBH_StatusTypeDef USBH_BulkSendData (USBH_HandleTypeDef *phost, - uint8_t *buff, - uint16_t length, - uint8_t hc_num, - uint8_t do_ping ); - -USBH_StatusTypeDef USBH_InterruptReceiveData(USBH_HandleTypeDef *phost, - uint8_t *buff, - uint8_t length, - uint8_t hc_num); - -USBH_StatusTypeDef USBH_InterruptSendData(USBH_HandleTypeDef *phost, - uint8_t *buff, - uint8_t length, - uint8_t hc_num); - - -USBH_StatusTypeDef USBH_IsocReceiveData(USBH_HandleTypeDef *phost, - uint8_t *buff, - uint32_t length, - uint8_t hc_num); - - -USBH_StatusTypeDef USBH_IsocSendData(USBH_HandleTypeDef *phost, - uint8_t *buff, - uint32_t length, - uint8_t hc_num); -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBH_IOREQ_H */ - -/** - * @} - */ - -/** - * @} - */ - -/** -* @} -*/ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - - diff --git a/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_pipes.h b/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_pipes.h deleted file mode 100755 index 5ba4aa13..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Core/Inc/usbh_pipes.h +++ /dev/null @@ -1,131 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_pipes.h - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief Header file for usbh_pipes.c - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Define to prevent recursive ----------------------------------------------*/ -#ifndef __USBH_PIPES_H -#define __USBH_PIPES_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbh_core.h" - -/** @addtogroup USBH_LIB - * @{ - */ - -/** @addtogroup USBH_LIB_CORE -* @{ -*/ - -/** @defgroup USBH_PIPES - * @brief This file is the header file for usbh_pipes.c - * @{ - */ - -/** @defgroup USBH_PIPES_Exported_Defines - * @{ - */ -/** - * @} - */ - -/** @defgroup USBH_PIPES_Exported_Types - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBH_PIPES_Exported_Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup USBH_PIPES_Exported_Variables - * @{ - */ -/** - * @} - */ - -/** @defgroup USBH_PIPES_Exported_FunctionsPrototype - * @{ - */ - -USBH_StatusTypeDef USBH_OpenPipe (USBH_HandleTypeDef *phost, - uint8_t ch_num, - uint8_t epnum, - uint8_t dev_address, - uint8_t speed, - uint8_t ep_type, - uint16_t mps); - -USBH_StatusTypeDef USBH_ClosePipe (USBH_HandleTypeDef *phost, - uint8_t pipe_num); - -uint8_t USBH_AllocPipe (USBH_HandleTypeDef *phost, - uint8_t ep_addr); - -USBH_StatusTypeDef USBH_FreePipe (USBH_HandleTypeDef *phost, - uint8_t idx); - - - - -/** - * @} - */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __USBH_PIPES_H */ - - -/** - * @} - */ - -/** - * @} - */ - -/** -* @} -*/ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - - diff --git a/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_conf_template.c b/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_conf_template.c deleted file mode 100755 index 611b2fd1..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_conf_template.c +++ /dev/null @@ -1,271 +0,0 @@ -/** - ****************************************************************************** - * @file usb_bsp.c - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief This file implements the board support package for the USB host library - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbh_core.h" - -/** - * @brief USBH_LL_Init - * Initialize the Low Level portion of the Host driver. - * @param phost: Host handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_LL_Init (USBH_HandleTypeDef *phost) -{ - - return USBH_OK; -} - -/** - * @brief USBH_LL_DeInit - * De-Initialize the Low Level portion of the Host driver. - * @param phost: Host handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_LL_DeInit (USBH_HandleTypeDef *phost) -{ - - return USBH_OK; -} - -/** - * @brief USBH_LL_Start - * Start the Low Level portion of the Host driver. - * @param phost: Host handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_LL_Start(USBH_HandleTypeDef *phost) -{ - - return USBH_OK; -} - -/** - * @brief USBH_LL_Stop - * Stop the Low Level portion of the Host driver. - * @param phost: Host handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_LL_Stop (USBH_HandleTypeDef *phost) -{ - - return USBH_OK; -} - -/** - * @brief USBH_LL_GetSpeed - * Return the USB Host Speed from the Low Level Driver. - * @param phost: Host handle - * @retval USBH Speeds - */ -USBH_SpeedTypeDef USBH_LL_GetSpeed (USBH_HandleTypeDef *phost) -{ - USBH_SpeedTypeDef speed = USBH_SPEED_FULL; - - - return speed; -} - -/** - * @brief USBH_LL_ResetPort - * Reset the Host Port of the Low Level Driver. - * @param phost: Host handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_LL_ResetPort (USBH_HandleTypeDef *phost) -{ - - return USBH_OK; -} - -/** - * @brief USBH_LL_GetLastXferSize - * Return the last transferred packet size. - * @param phost: Host handle - * @param pipe: Pipe index - * @retval Packet Size - */ -uint32_t USBH_LL_GetLastXferSize (USBH_HandleTypeDef *phost, uint8_t pipe) -{ - return 0; -} - -/** - * @brief USBH_LL_OpenPipe - * Open a pipe of the Low Level Driver. - * @param phost: Host handle - * @param pipe_num: Pipe index - * @param epnum: Endpoint Number - * @param dev_address: Device USB address - * @param speed: Device Speed - * @param ep_type: Endpoint Type - * @param mps: Endpoint Max Packet Size - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_LL_OpenPipe (USBH_HandleTypeDef *phost, - uint8_t pipe_num, - uint8_t epnum, - uint8_t dev_address, - uint8_t speed, - uint8_t ep_type, - uint16_t mps) -{ - - return USBH_OK; -} - -/** - * @brief USBH_LL_ClosePipe - * Close a pipe of the Low Level Driver. - * @param phost: Host handle - * @param pipe_num: Pipe index - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_LL_ClosePipe (USBH_HandleTypeDef *phost, uint8_t pipe) -{ - return USBH_OK; -} - -/** - * @brief USBH_LL_SubmitURB - * Submit a new URB to the low level driver. - * @param phost: Host handle - * @param pipe: Pipe index - * This parameter can be a value from 1 to 15 - * @param direction : Channel number - * This parameter can be one of the these values: - * 0 : Output - * 1 : Input - * @param ep_type : Endpoint Type - * This parameter can be one of the these values: - * @arg EP_TYPE_CTRL: Control type - * @arg EP_TYPE_ISOC: Isochronous type - * @arg EP_TYPE_BULK: Bulk type - * @arg EP_TYPE_INTR: Interrupt type - * @param token : Endpoint Type - * This parameter can be one of the these values: - * @arg 0: PID_SETUP - * @arg 1: PID_DATA - * @param pbuff : pointer to URB data - * @param length : Length of URB data - * @param do_ping : activate do ping protocol (for high speed only) - * This parameter can be one of the these values: - * 0 : do ping inactive - * 1 : do ping active - * @retval Status - */ - -USBH_StatusTypeDef USBH_LL_SubmitURB (USBH_HandleTypeDef *phost, - uint8_t pipe, - uint8_t direction , - uint8_t ep_type, - uint8_t token, - uint8_t* pbuff, - uint16_t length, - uint8_t do_ping ) -{ - - return USBH_OK; -} - -/** - * @brief USBH_LL_GetURBState - * Get a URB state from the low level driver. - * @param phost: Host handle - * @param pipe: Pipe index - * This parameter can be a value from 1 to 15 - * @retval URB state - * This parameter can be one of the these values: - * @arg URB_IDLE - * @arg URB_DONE - * @arg URB_NOTREADY - * @arg URB_NYET - * @arg URB_ERROR - * @arg URB_STALL - */ -USBH_URBStateTypeDef USBH_LL_GetURBState (USBH_HandleTypeDef *phost, uint8_t pipe) -{ - return USBH_URB_IDLE; -} - -/** - * @brief USBH_LL_DriverVBUS - * Drive VBUS. - * @param phost: Host handle - * @param state : VBUS state - * This parameter can be one of the these values: - * 0 : VBUS Active - * 1 : VBUS Inactive - * @retval Status - */ - -USBH_StatusTypeDef USBH_LL_DriverVBUS (USBH_HandleTypeDef *phost, uint8_t state) -{ - - return USBH_OK; -} - -/** - * @brief USBH_LL_SetToggle - * Set toggle for a pipe. - * @param phost: Host handle - * @param pipe: Pipe index - * @param pipe_num: Pipe index - * @param toggle: toggle (0/1) - * @retval Status - */ -USBH_StatusTypeDef USBH_LL_SetToggle (USBH_HandleTypeDef *phost, uint8_t pipe, uint8_t toggle) -{ - - return USBH_OK; -} - -/** - * @brief USBH_LL_GetToggle - * Return the current toggle of a pipe. - * @param phost: Host handle - * @param pipe: Pipe index - * @retval toggle (0/1) - */ -uint8_t USBH_LL_GetToggle (USBH_HandleTypeDef *phost, uint8_t pipe) -{ - uint8_t toggle = 0; - - - return toggle; -} -/** - * @brief USBH_Delay - * Delay routine for the USB Host Library - * @param Delay: Delay in ms - * @retval None - */ -void USBH_Delay (uint32_t Delay) -{ - -} -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_core.c b/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_core.c deleted file mode 100755 index 4ba78458..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_core.c +++ /dev/null @@ -1,933 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_core.c - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief This file implements the functions for the core state machine process - * the enumeration and the control transfer process - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ -/* Includes ------------------------------------------------------------------*/ - -#include "usbh_core.h" - - -/** @addtogroup USBH_LIB - * @{ - */ - -/** @addtogroup USBH_LIB_CORE - * @{ - */ - -/** @defgroup USBH_CORE - * @brief This file handles the basic enumeration when a device is connected - * to the host. - * @{ - */ - - -/** @defgroup USBH_CORE_Private_Defines - * @{ - */ -#define USBH_ADDRESS_DEFAULT 0 -#define USBH_ADDRESS_ASSIGNED 1 -#define USBH_MPS_DEFAULT 0x40 -/** - * @} - */ - -/** @defgroup USBH_CORE_Private_Macros - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBH_CORE_Private_Variables - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBH_CORE_Private_Functions - * @{ - */ -static USBH_StatusTypeDef USBH_HandleEnum (USBH_HandleTypeDef *phost); -static void USBH_HandleSof (USBH_HandleTypeDef *phost); -static USBH_StatusTypeDef DeInitStateMachine(USBH_HandleTypeDef *phost); - -#if (USBH_USE_OS == 1) -static void USBH_Process_OS(void const * argument); -#endif - -/** - * @brief HCD_Init - * Initialize the HOST Core. - * @param phost: Host Handle - * @param pUsrFunc: User Callback - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_Init(USBH_HandleTypeDef *phost, void (*pUsrFunc)(USBH_HandleTypeDef *phost, uint8_t ), uint8_t id) -{ - /* Check whether the USB Host handle is valid */ - if(phost == NULL) - { - USBH_ErrLog("Invalid Host handle"); - return USBH_FAIL; - } - - /* Set DRiver ID */ - phost->id = id; - - /* Unlink class*/ - phost->pActiveClass = NULL; - phost->ClassNumber = 0; - - /* Restore default states and prepare EP0 */ - DeInitStateMachine(phost); - - /* Assign User process */ - if(pUsrFunc != NULL) - { - phost->pUser = pUsrFunc; - } - -#if (USBH_USE_OS == 1) - - /* Create USB Host Queue */ - osMessageQDef(USBH_Queue, 10, uint16_t); - phost->os_event = osMessageCreate (osMessageQ(USBH_Queue), NULL); - - /*Create USB Host Task */ -#if defined (USBH_PROCESS_STACK_SIZE) - osThreadDef(USBH_Thread, USBH_Process_OS, USBH_PROCESS_PRIO, 0, USBH_PROCESS_STACK_SIZE); -#else - osThreadDef(USBH_Thread, USBH_Process_OS, USBH_PROCESS_PRIO, 0, 8 * configMINIMAL_STACK_SIZE); -#endif - phost->thread = osThreadCreate (osThread(USBH_Thread), phost); -#endif - - /* Initialize low level driver */ - USBH_LL_Init(phost); - return USBH_OK; -} - -/** - * @brief HCD_Init - * De-Initialize the Host portion of the driver. - * @param phost: Host Handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_DeInit(USBH_HandleTypeDef *phost) -{ - DeInitStateMachine(phost); - - if(phost->pData != NULL) - { - phost->pActiveClass->pData = NULL; - USBH_LL_Stop(phost); - } - - return USBH_OK; -} - -/** - * @brief DeInitStateMachine - * De-Initialize the Host state machine. - * @param phost: Host Handle - * @retval USBH Status - */ -static USBH_StatusTypeDef DeInitStateMachine(USBH_HandleTypeDef *phost) -{ - uint32_t i = 0; - - /* Clear Pipes flags*/ - for ( ; i < USBH_MAX_PIPES_NBR; i++) - { - phost->Pipes[i] = 0; - } - - for(i = 0; i< USBH_MAX_DATA_BUFFER; i++) - { - phost->device.Data[i] = 0; - } - - phost->gState = HOST_IDLE; - phost->EnumState = ENUM_IDLE; - phost->RequestState = CMD_SEND; - phost->Timer = 0; - - phost->Control.state = CTRL_SETUP; - phost->Control.pipe_size = USBH_MPS_DEFAULT; - phost->Control.errorcount = 0; - - phost->device.address = USBH_ADDRESS_DEFAULT; - phost->device.speed = USBH_SPEED_FULL; - - return USBH_OK; -} - -/** - * @brief USBH_RegisterClass - * Link class driver to Host Core. - * @param phost : Host Handle - * @param pclass: Class handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_RegisterClass(USBH_HandleTypeDef *phost, USBH_ClassTypeDef *pclass) -{ - USBH_StatusTypeDef status = USBH_OK; - - if(pclass != 0) - { - if(phost->ClassNumber < USBH_MAX_NUM_SUPPORTED_CLASS) - { - /* link the class to the USB Host handle */ - phost->pClass[phost->ClassNumber++] = pclass; - status = USBH_OK; - } - else - { - USBH_ErrLog("Max Class Number reached"); - status = USBH_FAIL; - } - } - else - { - USBH_ErrLog("Invalid Class handle"); - status = USBH_FAIL; - } - - return status; -} - -/** - * @brief USBH_SelectInterface - * Select current interface. - * @param phost: Host Handle - * @param interface: Interface number - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_SelectInterface(USBH_HandleTypeDef *phost, uint8_t interface) -{ - USBH_StatusTypeDef status = USBH_OK; - - if(interface < phost->device.CfgDesc.bNumInterfaces) - { - phost->device.current_interface = interface; - USBH_UsrLog ("Switching to Interface (#%d)", interface); - USBH_UsrLog ("Class : %xh", phost->device.CfgDesc.Itf_Desc[interface].bInterfaceClass ); - USBH_UsrLog ("SubClass : %xh", phost->device.CfgDesc.Itf_Desc[interface].bInterfaceSubClass ); - USBH_UsrLog ("Protocol : %xh", phost->device.CfgDesc.Itf_Desc[interface].bInterfaceProtocol ); - } - else - { - USBH_ErrLog ("Cannot Select This Interface."); - status = USBH_FAIL; - } - return status; -} - -/** - * @brief USBH_GetActiveClass - * Return Device Class. - * @param phost: Host Handle - * @param interface: Interface index - * @retval Class Code - */ -uint8_t USBH_GetActiveClass(USBH_HandleTypeDef *phost) -{ - return (phost->device.CfgDesc.Itf_Desc[0].bInterfaceClass); -} -/** - * @brief USBH_FindInterface - * Find the interface index for a specific class. - * @param phost: Host Handle - * @param Class: Class code - * @param SubClass: SubClass code - * @param Protocol: Protocol code - * @retval interface index in the configuration structure - * @note : (1)interface index 0xFF means interface index not found - */ -uint8_t USBH_FindInterface(USBH_HandleTypeDef *phost, uint8_t Class, uint8_t SubClass, uint8_t Protocol) -{ - USBH_InterfaceDescTypeDef *pif ; - USBH_CfgDescTypeDef *pcfg ; - int8_t if_ix = 0; - - pif = (USBH_InterfaceDescTypeDef *)0; - pcfg = &phost->device.CfgDesc; - - while (if_ix < USBH_MAX_NUM_INTERFACES) - { - pif = &pcfg->Itf_Desc[if_ix]; - if(((pif->bInterfaceClass == Class) || (Class == 0xFF))&& - ((pif->bInterfaceSubClass == SubClass) || (SubClass == 0xFF))&& - ((pif->bInterfaceProtocol == Protocol) || (Protocol == 0xFF))) - { - return if_ix; - } - if_ix++; - } - return 0xFF; -} - -/** - * @brief USBH_FindInterfaceIndex - * Find the interface index for a specific class interface and alternate setting number. - * @param phost: Host Handle - * @param interface_number: interface number - * @param alt_settings : alternate setting number - * @retval interface index in the configuration structure - * @note : (1)interface index 0xFF means interface index not found - */ -uint8_t USBH_FindInterfaceIndex(USBH_HandleTypeDef *phost, uint8_t interface_number, uint8_t alt_settings) -{ - USBH_InterfaceDescTypeDef *pif ; - USBH_CfgDescTypeDef *pcfg ; - int8_t if_ix = 0; - - pif = (USBH_InterfaceDescTypeDef *)0; - pcfg = &phost->device.CfgDesc; - - while (if_ix < USBH_MAX_NUM_INTERFACES) - { - pif = &pcfg->Itf_Desc[if_ix]; - if((pif->bInterfaceNumber == interface_number) && (pif->bAlternateSetting == alt_settings)) - { - return if_ix; - } - if_ix++; - } - return 0xFF; -} - -/** - * @brief USBH_Start - * Start the USB Host Core. - * @param phost: Host Handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_Start (USBH_HandleTypeDef *phost) -{ - /* Start the low level driver */ - USBH_LL_Start(phost); - - /* Activate VBUS on the port */ - USBH_LL_DriverVBUS (phost, TRUE); - - return USBH_OK; -} - -/** - * @brief USBH_Stop - * Stop the USB Host Core. - * @param phost: Host Handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_Stop (USBH_HandleTypeDef *phost) -{ - /* Stop and cleanup the low level driver */ - USBH_LL_Stop(phost); - - /* DeActivate VBUS on the port */ - USBH_LL_DriverVBUS (phost, FALSE); - - /* FRee Control Pipes */ - USBH_FreePipe (phost, phost->Control.pipe_in); - USBH_FreePipe (phost, phost->Control.pipe_out); - - return USBH_OK; -} - -/** - * @brief HCD_ReEnumerate - * Perform a new Enumeration phase. - * @param phost: Host Handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_ReEnumerate (USBH_HandleTypeDef *phost) -{ - /*Stop Host */ - USBH_Stop(phost); - - /*Device has disconnected, so wait for 200 ms */ - USBH_Delay(200); - - /* Set State machines in default state */ - DeInitStateMachine(phost); - - /* Start again the host */ - USBH_Start(phost); - -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_PORT_EVENT, 0); -#endif - return USBH_OK; -} - -/** - * @brief USBH_Process - * Background process of the USB Core. - * @param phost: Host Handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_Process(USBH_HandleTypeDef *phost) -{ - __IO USBH_StatusTypeDef status = USBH_FAIL; - uint8_t idx = 0; - - switch (phost->gState) - { - case HOST_IDLE : - - if (phost->device.is_connected) - { - /* Wait for 200 ms after connection */ - phost->gState = HOST_DEV_WAIT_FOR_ATTACHMENT; - USBH_Delay(200); - USBH_LL_ResetPort(phost); -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_PORT_EVENT, 0); -#endif - } - break; - - case HOST_DEV_WAIT_FOR_ATTACHMENT: - break; - - case HOST_DEV_ATTACHED : - - USBH_UsrLog("USB Device Attached"); - - /* Wait for 100 ms after Reset */ - USBH_Delay(100); - - phost->device.speed = USBH_LL_GetSpeed(phost); - - phost->gState = HOST_ENUMERATION; - - phost->Control.pipe_out = USBH_AllocPipe (phost, 0x00); - phost->Control.pipe_in = USBH_AllocPipe (phost, 0x80); - - - /* Open Control pipes */ - USBH_OpenPipe (phost, - phost->Control.pipe_in, - 0x80, - phost->device.address, - phost->device.speed, - USBH_EP_CONTROL, - phost->Control.pipe_size); - - /* Open Control pipes */ - USBH_OpenPipe (phost, - phost->Control.pipe_out, - 0x00, - phost->device.address, - phost->device.speed, - USBH_EP_CONTROL, - phost->Control.pipe_size); - -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_PORT_EVENT, 0); -#endif - - break; - - case HOST_ENUMERATION: - /* Check for enumeration status */ - if ( USBH_HandleEnum(phost) == USBH_OK) - { - /* The function shall return USBH_OK when full enumeration is complete */ - USBH_UsrLog ("Enumeration done."); - phost->device.current_interface = 0; - if(phost->device.DevDesc.bNumConfigurations == 1) - { - USBH_UsrLog ("This device has only 1 configuration."); - phost->gState = HOST_SET_CONFIGURATION; - - } - else - { - phost->gState = HOST_INPUT; - } - - } - break; - - case HOST_INPUT: - { - /* user callback for end of device basic enumeration */ - if(phost->pUser != NULL) - { - phost->pUser(phost, HOST_USER_SELECT_CONFIGURATION); - phost->gState = HOST_SET_CONFIGURATION; - -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_STATE_CHANGED_EVENT, 0); -#endif - } - } - break; - - case HOST_SET_CONFIGURATION: - /* set configuration */ - if (USBH_SetCfg(phost, phost->device.CfgDesc.bConfigurationValue) == USBH_OK) - { - phost->gState = HOST_CHECK_CLASS; - USBH_UsrLog ("Default configuration set."); - - } - - break; - - case HOST_CHECK_CLASS: - - if(phost->ClassNumber == 0) - { - USBH_UsrLog ("No Class has been registered."); - } - else - { - phost->pActiveClass = NULL; - - for (idx = 0; idx < USBH_MAX_NUM_SUPPORTED_CLASS ; idx ++) - { - if(phost->pClass[idx]->ClassCode == phost->device.CfgDesc.Itf_Desc[0].bInterfaceClass) - { - phost->pActiveClass = phost->pClass[idx]; - } - } - - if(phost->pActiveClass != NULL) - { - if(phost->pActiveClass->Init(phost)== USBH_OK) - { - phost->gState = HOST_CLASS_REQUEST; - USBH_UsrLog ("%s class started.", phost->pActiveClass->Name); - - /* Inform user that a class has been activated */ - phost->pUser(phost, HOST_USER_CLASS_SELECTED); - } - else - { - phost->gState = HOST_ABORT_STATE; - USBH_UsrLog ("Device not supporting %s class.", phost->pActiveClass->Name); - } - } - else - { - phost->gState = HOST_ABORT_STATE; - USBH_UsrLog ("No registered class for this device."); - } - } - -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_STATE_CHANGED_EVENT, 0); -#endif - break; - - case HOST_CLASS_REQUEST: - /* process class standard control requests state machine */ - if(phost->pActiveClass != NULL) - { - status = phost->pActiveClass->Requests(phost); - - if(status == USBH_OK) - { - phost->gState = HOST_CLASS; - } - } - else - { - phost->gState = HOST_ABORT_STATE; - USBH_ErrLog ("Invalid Class Driver."); - -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_STATE_CHANGED_EVENT, 0); -#endif - } - - break; - case HOST_CLASS: - /* process class state machine */ - if(phost->pActiveClass != NULL) - { - phost->pActiveClass->BgndProcess(phost); - } - break; - - case HOST_DEV_DISCONNECTED : - - DeInitStateMachine(phost); - - /* Re-Initilaize Host for new Enumeration */ - if(phost->pActiveClass != NULL) - { - phost->pActiveClass->DeInit(phost); - phost->pActiveClass = NULL; - } - break; - - case HOST_ABORT_STATE: - default : - break; - } - return USBH_OK; -} - - -/** - * @brief USBH_HandleEnum - * This function includes the complete enumeration process - * @param phost: Host Handle - * @retval USBH_Status - */ -static USBH_StatusTypeDef USBH_HandleEnum (USBH_HandleTypeDef *phost) -{ - USBH_StatusTypeDef Status = USBH_BUSY; - - switch (phost->EnumState) - { - case ENUM_IDLE: - /* Get Device Desc for only 1st 8 bytes : To get EP0 MaxPacketSize */ - if ( USBH_Get_DevDesc(phost, 8) == USBH_OK) - { - phost->Control.pipe_size = phost->device.DevDesc.bMaxPacketSize; - - phost->EnumState = ENUM_GET_FULL_DEV_DESC; - - /* modify control channels configuration for MaxPacket size */ - USBH_OpenPipe (phost, - phost->Control.pipe_in, - 0x80, - phost->device.address, - phost->device.speed, - USBH_EP_CONTROL, - phost->Control.pipe_size); - - /* Open Control pipes */ - USBH_OpenPipe (phost, - phost->Control.pipe_out, - 0x00, - phost->device.address, - phost->device.speed, - USBH_EP_CONTROL, - phost->Control.pipe_size); - - } - break; - - case ENUM_GET_FULL_DEV_DESC: - /* Get FULL Device Desc */ - if ( USBH_Get_DevDesc(phost, USB_DEVICE_DESC_SIZE)== USBH_OK) - { - USBH_UsrLog("PID: %xh", phost->device.DevDesc.idProduct ); - USBH_UsrLog("VID: %xh", phost->device.DevDesc.idVendor ); - - phost->EnumState = ENUM_SET_ADDR; - - } - break; - - case ENUM_SET_ADDR: - /* set address */ - if ( USBH_SetAddress(phost, USBH_DEVICE_ADDRESS) == USBH_OK) - { - USBH_Delay(2); - phost->device.address = USBH_DEVICE_ADDRESS; - - /* user callback for device address assigned */ - USBH_UsrLog("Address (#%d) assigned.", phost->device.address); - phost->EnumState = ENUM_GET_CFG_DESC; - - /* modify control channels to update device address */ - USBH_OpenPipe (phost, - phost->Control.pipe_in, - 0x80, - phost->device.address, - phost->device.speed, - USBH_EP_CONTROL, - phost->Control.pipe_size); - - /* Open Control pipes */ - USBH_OpenPipe (phost, - phost->Control.pipe_out, - 0x00, - phost->device.address, - phost->device.speed, - USBH_EP_CONTROL, - phost->Control.pipe_size); - } - break; - - case ENUM_GET_CFG_DESC: - /* get standard configuration descriptor */ - if ( USBH_Get_CfgDesc(phost, - USB_CONFIGURATION_DESC_SIZE) == USBH_OK) - { - phost->EnumState = ENUM_GET_FULL_CFG_DESC; - } - break; - - case ENUM_GET_FULL_CFG_DESC: - /* get FULL config descriptor (config, interface, endpoints) */ - if (USBH_Get_CfgDesc(phost, - phost->device.CfgDesc.wTotalLength) == USBH_OK) - { - phost->EnumState = ENUM_GET_MFC_STRING_DESC; - } - break; - - case ENUM_GET_MFC_STRING_DESC: - if (phost->device.DevDesc.iManufacturer != 0) - { /* Check that Manufacturer String is available */ - - if ( USBH_Get_StringDesc(phost, - phost->device.DevDesc.iManufacturer, - phost->device.Data , - 0xff) == USBH_OK) - { - /* User callback for Manufacturing string */ - USBH_UsrLog("Manufacturer : %s", (char *)phost->device.Data); - phost->EnumState = ENUM_GET_PRODUCT_STRING_DESC; - -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_STATE_CHANGED_EVENT, 0); -#endif - } - } - else - { - USBH_UsrLog("Manufacturer : N/A"); - phost->EnumState = ENUM_GET_PRODUCT_STRING_DESC; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_STATE_CHANGED_EVENT, 0); -#endif - } - break; - - case ENUM_GET_PRODUCT_STRING_DESC: - if (phost->device.DevDesc.iProduct != 0) - { /* Check that Product string is available */ - if ( USBH_Get_StringDesc(phost, - phost->device.DevDesc.iProduct, - phost->device.Data, - 0xff) == USBH_OK) - { - /* User callback for Product string */ - USBH_UsrLog("Product : %s", (char *)phost->device.Data); - phost->EnumState = ENUM_GET_SERIALNUM_STRING_DESC; - } - } - else - { - USBH_UsrLog("Product : N/A"); - phost->EnumState = ENUM_GET_SERIALNUM_STRING_DESC; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_STATE_CHANGED_EVENT, 0); -#endif - } - break; - - case ENUM_GET_SERIALNUM_STRING_DESC: - if (phost->device.DevDesc.iSerialNumber != 0) - { /* Check that Serial number string is available */ - if ( USBH_Get_StringDesc(phost, - phost->device.DevDesc.iSerialNumber, - phost->device.Data, - 0xff) == USBH_OK) - { - /* User callback for Serial number string */ - USBH_UsrLog("Serial Number : %s", (char *)phost->device.Data); - Status = USBH_OK; - } - } - else - { - USBH_UsrLog("Serial Number : N/A"); - Status = USBH_OK; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_STATE_CHANGED_EVENT, 0); -#endif - } - break; - - default: - break; - } - return Status; -} - -/** - * @brief USBH_LL_SetTimer - * Set the initial Host Timer tick - * @param phost: Host Handle - * @retval None - */ -void USBH_LL_SetTimer (USBH_HandleTypeDef *phost, uint32_t time) -{ - phost->Timer = time; -} -/** - * @brief USBH_LL_IncTimer - * Increment Host Timer tick - * @param phost: Host Handle - * @retval None - */ -void USBH_LL_IncTimer (USBH_HandleTypeDef *phost) -{ - phost->Timer ++; - USBH_HandleSof(phost); -} - -/** - * @brief USBH_HandleSof - * Call SOF process - * @param phost: Host Handle - * @retval None - */ -void USBH_HandleSof (USBH_HandleTypeDef *phost) -{ - if((phost->gState == HOST_CLASS)&&(phost->pActiveClass != NULL)) - { - phost->pActiveClass->SOFProcess(phost); - } -} -/** - * @brief USBH_LL_Connect - * Handle USB Host connexion event - * @param phost: Host Handle - * @retval USBH_Status - */ -USBH_StatusTypeDef USBH_LL_Connect (USBH_HandleTypeDef *phost) -{ - if(phost->gState == HOST_IDLE ) - { - phost->device.is_connected = 1; - - if(phost->pUser != NULL) - { - phost->pUser(phost, HOST_USER_CONNECTION); - } - } - else if(phost->gState == HOST_DEV_WAIT_FOR_ATTACHMENT ) - { - phost->gState = HOST_DEV_ATTACHED ; - } -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_PORT_EVENT, 0); -#endif - - return USBH_OK; -} - -/** - * @brief USBH_LL_Disconnect - * Handle USB Host disconnection event - * @param phost: Host Handle - * @retval USBH_Status - */ -USBH_StatusTypeDef USBH_LL_Disconnect (USBH_HandleTypeDef *phost) -{ - /*Stop Host */ - USBH_LL_Stop(phost); - - /* FRee Control Pipes */ - USBH_FreePipe (phost, phost->Control.pipe_in); - USBH_FreePipe (phost, phost->Control.pipe_out); - - phost->device.is_connected = 0; - - if(phost->pUser != NULL) - { - phost->pUser(phost, HOST_USER_DISCONNECTION); - } - USBH_UsrLog("USB Device disconnected"); - - /* Start the low level driver */ - USBH_LL_Start(phost); - - phost->gState = HOST_DEV_DISCONNECTED; - -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_PORT_EVENT, 0); -#endif - - return USBH_OK; -} - - -#if (USBH_USE_OS == 1) -/** - * @brief USB Host Thread task - * @param pvParameters not used - * @retval None - */ -static void USBH_Process_OS(void const * argument) -{ - osEvent event; - - for(;;) - { - event = osMessageGet(((USBH_HandleTypeDef *)argument)->os_event, osWaitForever ); - - if( event.status == osEventMessage ) - { - USBH_Process((USBH_HandleTypeDef *)argument); - } - } -} - -/** -* @brief USBH_LL_NotifyURBChange -* Notify URB state Change -* @param phost: Host handle -* @retval USBH Status -*/ -USBH_StatusTypeDef USBH_LL_NotifyURBChange (USBH_HandleTypeDef *phost) -{ - osMessagePut ( phost->os_event, USBH_URB_EVENT, 0); - return USBH_OK; -} -#endif -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_ctlreq.c b/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_ctlreq.c deleted file mode 100755 index c915caf5..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_ctlreq.c +++ /dev/null @@ -1,881 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_ctlreq.c - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief This file implements the control requests for device enumeration - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ -/* Includes ------------------------------------------------------------------*/ - -#include "usbh_ctlreq.h" - -/** @addtogroup USBH_LIB -* @{ -*/ - -/** @addtogroup USBH_LIB_CORE -* @{ -*/ - -/** @defgroup USBH_CTLREQ -* @brief This file implements the standard requests for device enumeration -* @{ -*/ - - -/** @defgroup USBH_CTLREQ_Private_Defines -* @{ -*/ -/** -* @} -*/ - - -/** @defgroup USBH_CTLREQ_Private_TypesDefinitions -* @{ -*/ -/** -* @} -*/ - - - -/** @defgroup USBH_CTLREQ_Private_Macros -* @{ -*/ -/** -* @} -*/ - - -/** @defgroup USBH_CTLREQ_Private_Variables -* @{ -*/ -/** -* @} -*/ - -/** @defgroup USBH_CTLREQ_Private_FunctionPrototypes -* @{ -*/ -static USBH_StatusTypeDef USBH_HandleControl (USBH_HandleTypeDef *phost); - -static void USBH_ParseDevDesc (USBH_DevDescTypeDef* , uint8_t *buf, uint16_t length); - -static void USBH_ParseCfgDesc (USBH_CfgDescTypeDef* cfg_desc, - uint8_t *buf, - uint16_t length); - - -static void USBH_ParseEPDesc (USBH_EpDescTypeDef *ep_descriptor, uint8_t *buf); -static void USBH_ParseStringDesc (uint8_t* psrc, uint8_t* pdest, uint16_t length); -static void USBH_ParseInterfaceDesc (USBH_InterfaceDescTypeDef *if_descriptor, uint8_t *buf); - - -/** -* @} -*/ - - -/** @defgroup USBH_CTLREQ_Private_Functions -* @{ -*/ - - -/** - * @brief USBH_Get_DevDesc - * Issue Get Device Descriptor command to the device. Once the response - * received, it parses the device descriptor and updates the status. - * @param phost: Host Handle - * @param length: Length of the descriptor - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_Get_DevDesc(USBH_HandleTypeDef *phost, uint8_t length) -{ - USBH_StatusTypeDef status; - - if((status = USBH_GetDescriptor(phost, - USB_REQ_RECIPIENT_DEVICE | USB_REQ_TYPE_STANDARD, - USB_DESC_DEVICE, - phost->device.Data, - length)) == USBH_OK) - { - /* Commands successfully sent and Response Received */ - USBH_ParseDevDesc(&phost->device.DevDesc, phost->device.Data, length); - } - return status; -} - -/** - * @brief USBH_Get_CfgDesc - * Issues Configuration Descriptor to the device. Once the response - * received, it parses the configuration descriptor and updates the - * status. - * @param phost: Host Handle - * @param length: Length of the descriptor - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_Get_CfgDesc(USBH_HandleTypeDef *phost, - uint16_t length) - -{ - USBH_StatusTypeDef status; - uint8_t *pData; -#if (USBH_KEEP_CFG_DESCRIPTOR == 1) - pData = phost->device.CfgDesc_Raw; -#else - pData = phost->device.Data; -#endif - if((status = USBH_GetDescriptor(phost, - USB_REQ_RECIPIENT_DEVICE | USB_REQ_TYPE_STANDARD, - USB_DESC_CONFIGURATION, - pData, - length)) == USBH_OK) - { - - /* Commands successfully sent and Response Received */ - USBH_ParseCfgDesc (&phost->device.CfgDesc, - pData, - length); - - } - return status; -} - - -/** - * @brief USBH_Get_StringDesc - * Issues string Descriptor command to the device. Once the response - * received, it parses the string descriptor and updates the status. - * @param phost: Host Handle - * @param string_index: String index for the descriptor - * @param buff: Buffer address for the descriptor - * @param length: Length of the descriptor - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_Get_StringDesc(USBH_HandleTypeDef *phost, - uint8_t string_index, - uint8_t *buff, - uint16_t length) -{ - USBH_StatusTypeDef status; - if((status = USBH_GetDescriptor(phost, - USB_REQ_RECIPIENT_DEVICE | USB_REQ_TYPE_STANDARD, - USB_DESC_STRING | string_index, - phost->device.Data, - length)) == USBH_OK) - { - /* Commands successfully sent and Response Received */ - USBH_ParseStringDesc(phost->device.Data,buff, length); - } - return status; -} - -/** - * @brief USBH_GetDescriptor - * Issues Descriptor command to the device. Once the response received, - * it parses the descriptor and updates the status. - * @param phost: Host Handle - * @param req_type: Descriptor type - * @param value_idx: Value for the GetDescriptr request - * @param buff: Buffer to store the descriptor - * @param length: Length of the descriptor - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_GetDescriptor(USBH_HandleTypeDef *phost, - uint8_t req_type, - uint16_t value_idx, - uint8_t* buff, - uint16_t length ) -{ - if(phost->RequestState == CMD_SEND) - { - phost->Control.setup.b.bmRequestType = USB_D2H | req_type; - phost->Control.setup.b.bRequest = USB_REQ_GET_DESCRIPTOR; - phost->Control.setup.b.wValue.w = value_idx; - - if ((value_idx & 0xff00) == USB_DESC_STRING) - { - phost->Control.setup.b.wIndex.w = 0x0409; - } - else - { - phost->Control.setup.b.wIndex.w = 0; - } - phost->Control.setup.b.wLength.w = length; - } - return USBH_CtlReq(phost, buff , length ); -} - -/** - * @brief USBH_SetAddress - * This command sets the address to the connected device - * @param phost: Host Handle - * @param DeviceAddress: Device address to assign - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_SetAddress(USBH_HandleTypeDef *phost, - uint8_t DeviceAddress) -{ - if(phost->RequestState == CMD_SEND) - { - phost->Control.setup.b.bmRequestType = USB_H2D | USB_REQ_RECIPIENT_DEVICE | \ - USB_REQ_TYPE_STANDARD; - - phost->Control.setup.b.bRequest = USB_REQ_SET_ADDRESS; - - phost->Control.setup.b.wValue.w = (uint16_t)DeviceAddress; - phost->Control.setup.b.wIndex.w = 0; - phost->Control.setup.b.wLength.w = 0; - } - return USBH_CtlReq(phost, 0 , 0 ); -} - -/** - * @brief USBH_SetCfg - * The command sets the configuration value to the connected device - * @param phost: Host Handle - * @param cfg_idx: Configuration value - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_SetCfg(USBH_HandleTypeDef *phost, - uint16_t cfg_idx) -{ - if(phost->RequestState == CMD_SEND) - { - phost->Control.setup.b.bmRequestType = USB_H2D | USB_REQ_RECIPIENT_DEVICE |\ - USB_REQ_TYPE_STANDARD; - phost->Control.setup.b.bRequest = USB_REQ_SET_CONFIGURATION; - phost->Control.setup.b.wValue.w = cfg_idx; - phost->Control.setup.b.wIndex.w = 0; - phost->Control.setup.b.wLength.w = 0; - } - - return USBH_CtlReq(phost, 0 , 0 ); -} - -/** - * @brief USBH_SetInterface - * The command sets the Interface value to the connected device - * @param phost: Host Handle - * @param altSetting: Interface value - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_SetInterface(USBH_HandleTypeDef *phost, - uint8_t ep_num, uint8_t altSetting) -{ - - if(phost->RequestState == CMD_SEND) - { - phost->Control.setup.b.bmRequestType = USB_H2D | USB_REQ_RECIPIENT_INTERFACE | \ - USB_REQ_TYPE_STANDARD; - - phost->Control.setup.b.bRequest = USB_REQ_SET_INTERFACE; - phost->Control.setup.b.wValue.w = altSetting; - phost->Control.setup.b.wIndex.w = ep_num; - phost->Control.setup.b.wLength.w = 0; - } - return USBH_CtlReq(phost, 0 , 0 ); -} - -/** - * @brief USBH_ClrFeature - * This request is used to clear or disable a specific feature. - * @param phost: Host Handle - * @param ep_num: endpoint number - * @param hc_num: Host channel number - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_ClrFeature(USBH_HandleTypeDef *phost, - uint8_t ep_num) -{ - if(phost->RequestState == CMD_SEND) - { - phost->Control.setup.b.bmRequestType = USB_H2D | - USB_REQ_RECIPIENT_ENDPOINT | - USB_REQ_TYPE_STANDARD; - - phost->Control.setup.b.bRequest = USB_REQ_CLEAR_FEATURE; - phost->Control.setup.b.wValue.w = FEATURE_SELECTOR_ENDPOINT; - phost->Control.setup.b.wIndex.w = ep_num; - phost->Control.setup.b.wLength.w = 0; - } - return USBH_CtlReq(phost, 0 , 0 ); -} - -/** - * @brief USBH_ParseDevDesc - * This function Parses the device descriptor - * @param dev_desc: device_descriptor destination address - * @param buf: Buffer where the source descriptor is available - * @param length: Length of the descriptor - * @retval None - */ -static void USBH_ParseDevDesc (USBH_DevDescTypeDef* dev_desc, - uint8_t *buf, - uint16_t length) -{ - dev_desc->bLength = *(uint8_t *) (buf + 0); - dev_desc->bDescriptorType = *(uint8_t *) (buf + 1); - dev_desc->bcdUSB = LE16 (buf + 2); - dev_desc->bDeviceClass = *(uint8_t *) (buf + 4); - dev_desc->bDeviceSubClass = *(uint8_t *) (buf + 5); - dev_desc->bDeviceProtocol = *(uint8_t *) (buf + 6); - dev_desc->bMaxPacketSize = *(uint8_t *) (buf + 7); - - if (length > 8) - { /* For 1st time after device connection, Host may issue only 8 bytes for - Device Descriptor Length */ - dev_desc->idVendor = LE16 (buf + 8); - dev_desc->idProduct = LE16 (buf + 10); - dev_desc->bcdDevice = LE16 (buf + 12); - dev_desc->iManufacturer = *(uint8_t *) (buf + 14); - dev_desc->iProduct = *(uint8_t *) (buf + 15); - dev_desc->iSerialNumber = *(uint8_t *) (buf + 16); - dev_desc->bNumConfigurations = *(uint8_t *) (buf + 17); - } -} - -/** - * @brief USBH_ParseCfgDesc - * This function Parses the configuration descriptor - * @param cfg_desc: Configuration Descriptor address - * @param buf: Buffer where the source descriptor is available - * @param length: Length of the descriptor - * @retval None - */ -static void USBH_ParseCfgDesc (USBH_CfgDescTypeDef* cfg_desc, - uint8_t *buf, - uint16_t length) -{ - USBH_InterfaceDescTypeDef *pif ; - USBH_EpDescTypeDef *pep; - USBH_DescHeader_t *pdesc = (USBH_DescHeader_t *)buf; - uint16_t ptr; - int8_t if_ix = 0; - int8_t ep_ix = 0; - - pdesc = (USBH_DescHeader_t *)buf; - - /* Parse configuration descriptor */ - cfg_desc->bLength = *(uint8_t *) (buf + 0); - cfg_desc->bDescriptorType = *(uint8_t *) (buf + 1); - cfg_desc->wTotalLength = LE16 (buf + 2); - cfg_desc->bNumInterfaces = *(uint8_t *) (buf + 4); - cfg_desc->bConfigurationValue = *(uint8_t *) (buf + 5); - cfg_desc->iConfiguration = *(uint8_t *) (buf + 6); - cfg_desc->bmAttributes = *(uint8_t *) (buf + 7); - cfg_desc->bMaxPower = *(uint8_t *) (buf + 8); - - - if (length > USB_CONFIGURATION_DESC_SIZE) - { - ptr = USB_LEN_CFG_DESC; - pif = (USBH_InterfaceDescTypeDef *)0; - - - while ((if_ix < USBH_MAX_NUM_INTERFACES ) && (ptr < cfg_desc->wTotalLength)) - { - pdesc = USBH_GetNextDesc((uint8_t *)pdesc, &ptr); - if (pdesc->bDescriptorType == USB_DESC_TYPE_INTERFACE) - { - pif = &cfg_desc->Itf_Desc[if_ix]; - USBH_ParseInterfaceDesc (pif, (uint8_t *)pdesc); - - ep_ix = 0; - pep = (USBH_EpDescTypeDef *)0; - while ((ep_ix < pif->bNumEndpoints) && (ptr < cfg_desc->wTotalLength)) - { - pdesc = USBH_GetNextDesc((uint8_t*) pdesc, &ptr); - if (pdesc->bDescriptorType == USB_DESC_TYPE_ENDPOINT) - { - pep = &cfg_desc->Itf_Desc[if_ix].Ep_Desc[ep_ix]; - USBH_ParseEPDesc (pep, (uint8_t *)pdesc); - ep_ix++; - } - } - if_ix++; - } - } - } -} - - - -/** - * @brief USBH_ParseInterfaceDesc - * This function Parses the interface descriptor - * @param if_descriptor : Interface descriptor destination - * @param buf: Buffer where the descriptor data is available - * @retval None - */ -static void USBH_ParseInterfaceDesc (USBH_InterfaceDescTypeDef *if_descriptor, - uint8_t *buf) -{ - if_descriptor->bLength = *(uint8_t *) (buf + 0); - if_descriptor->bDescriptorType = *(uint8_t *) (buf + 1); - if_descriptor->bInterfaceNumber = *(uint8_t *) (buf + 2); - if_descriptor->bAlternateSetting = *(uint8_t *) (buf + 3); - if_descriptor->bNumEndpoints = *(uint8_t *) (buf + 4); - if_descriptor->bInterfaceClass = *(uint8_t *) (buf + 5); - if_descriptor->bInterfaceSubClass = *(uint8_t *) (buf + 6); - if_descriptor->bInterfaceProtocol = *(uint8_t *) (buf + 7); - if_descriptor->iInterface = *(uint8_t *) (buf + 8); -} - -/** - * @brief USBH_ParseEPDesc - * This function Parses the endpoint descriptor - * @param ep_descriptor: Endpoint descriptor destination address - * @param buf: Buffer where the parsed descriptor stored - * @retval None - */ -static void USBH_ParseEPDesc (USBH_EpDescTypeDef *ep_descriptor, - uint8_t *buf) -{ - - ep_descriptor->bLength = *(uint8_t *) (buf + 0); - ep_descriptor->bDescriptorType = *(uint8_t *) (buf + 1); - ep_descriptor->bEndpointAddress = *(uint8_t *) (buf + 2); - ep_descriptor->bmAttributes = *(uint8_t *) (buf + 3); - ep_descriptor->wMaxPacketSize = LE16 (buf + 4); - ep_descriptor->bInterval = *(uint8_t *) (buf + 6); -} - -/** - * @brief USBH_ParseStringDesc - * This function Parses the string descriptor - * @param psrc: Source pointer containing the descriptor data - * @param pdest: Destination address pointer - * @param length: Length of the descriptor - * @retval None - */ -static void USBH_ParseStringDesc (uint8_t* psrc, - uint8_t* pdest, - uint16_t length) -{ - uint16_t strlength; - uint16_t idx; - - /* The UNICODE string descriptor is not NULL-terminated. The string length is - computed by substracting two from the value of the first byte of the descriptor. - */ - - /* Check which is lower size, the Size of string or the length of bytes read - from the device */ - - if ( psrc[1] == USB_DESC_TYPE_STRING) - { /* Make sure the Descriptor is String Type */ - - /* psrc[0] contains Size of Descriptor, subtract 2 to get the length of string */ - strlength = ( ( (psrc[0]-2) <= length) ? (psrc[0]-2) :length); - psrc += 2; /* Adjust the offset ignoring the String Len and Descriptor type */ - - for (idx = 0; idx < strlength; idx+=2 ) - {/* Copy Only the string and ignore the UNICODE ID, hence add the src */ - *pdest = psrc[idx]; - pdest++; - } - *pdest = 0; /* mark end of string */ - } -} - -/** - * @brief USBH_GetNextDesc - * This function return the next descriptor header - * @param buf: Buffer where the cfg descriptor is available - * @param ptr: data pointer inside the cfg descriptor - * @retval next header - */ -USBH_DescHeader_t *USBH_GetNextDesc (uint8_t *pbuf, uint16_t *ptr) -{ - USBH_DescHeader_t *pnext; - - *ptr += ((USBH_DescHeader_t *)pbuf)->bLength; - pnext = (USBH_DescHeader_t *)((uint8_t *)pbuf + \ - ((USBH_DescHeader_t *)pbuf)->bLength); - - return(pnext); -} - - -/** - * @brief USBH_CtlReq - * USBH_CtlReq sends a control request and provide the status after - * completion of the request - * @param phost: Host Handle - * @param req: Setup Request Structure - * @param buff: data buffer address to store the response - * @param length: length of the response - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_CtlReq (USBH_HandleTypeDef *phost, - uint8_t *buff, - uint16_t length) -{ - USBH_StatusTypeDef status; - status = USBH_BUSY; - - switch (phost->RequestState) - { - case CMD_SEND: - /* Start a SETUP transfer */ - phost->Control.buff = buff; - phost->Control.length = length; - phost->Control.state = CTRL_SETUP; - phost->RequestState = CMD_WAIT; - status = USBH_BUSY; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CONTROL_EVENT, 0); -#endif - break; - - case CMD_WAIT: - status = USBH_HandleControl(phost); - if (status == USBH_OK) - { - /* Commands successfully sent and Response Received */ - phost->RequestState = CMD_SEND; - phost->Control.state =CTRL_IDLE; - status = USBH_OK; - } - else if (status == USBH_FAIL) - { - /* Failure Mode */ - phost->RequestState = CMD_SEND; - status = USBH_FAIL; - } - break; - - default: - break; - } - return status; -} - -/** - * @brief USBH_HandleControl - * Handles the USB control transfer state machine - * @param phost: Host Handle - * @retval USBH Status - */ -static USBH_StatusTypeDef USBH_HandleControl (USBH_HandleTypeDef *phost) -{ - uint8_t direction; - USBH_StatusTypeDef status = USBH_BUSY; - USBH_URBStateTypeDef URB_Status = USBH_URB_IDLE; - - switch (phost->Control.state) - { - case CTRL_SETUP: - /* send a SETUP packet */ - USBH_CtlSendSetup (phost, - (uint8_t *)phost->Control.setup.d8 , - phost->Control.pipe_out); - - phost->Control.state = CTRL_SETUP_WAIT; - break; - - case CTRL_SETUP_WAIT: - - URB_Status = USBH_LL_GetURBState(phost, phost->Control.pipe_out); - /* case SETUP packet sent successfully */ - if(URB_Status == USBH_URB_DONE) - { - direction = (phost->Control.setup.b.bmRequestType & USB_REQ_DIR_MASK); - - /* check if there is a data stage */ - if (phost->Control.setup.b.wLength.w != 0 ) - { - if (direction == USB_D2H) - { - /* Data Direction is IN */ - phost->Control.state = CTRL_DATA_IN; - } - else - { - /* Data Direction is OUT */ - phost->Control.state = CTRL_DATA_OUT; - } - } - /* No DATA stage */ - else - { - /* If there is No Data Transfer Stage */ - if (direction == USB_D2H) - { - /* Data Direction is IN */ - phost->Control.state = CTRL_STATUS_OUT; - } - else - { - /* Data Direction is OUT */ - phost->Control.state = CTRL_STATUS_IN; - } - } -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CONTROL_EVENT, 0); -#endif - } - else if(URB_Status == USBH_URB_ERROR) - { - phost->Control.state = CTRL_ERROR; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CONTROL_EVENT, 0); -#endif - } - break; - - case CTRL_DATA_IN: - /* Issue an IN token */ - phost->Control.timer = phost->Timer; - USBH_CtlReceiveData(phost, - phost->Control.buff, - phost->Control.length, - phost->Control.pipe_in); - - phost->Control.state = CTRL_DATA_IN_WAIT; - break; - - case CTRL_DATA_IN_WAIT: - - URB_Status = USBH_LL_GetURBState(phost , phost->Control.pipe_in); - - /* check is DATA packet transferred successfully */ - if (URB_Status == USBH_URB_DONE) - { - phost->Control.state = CTRL_STATUS_OUT; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CONTROL_EVENT, 0); -#endif - } - - /* manage error cases*/ - if (URB_Status == USBH_URB_STALL) - { - /* In stall case, return to previous machine state*/ - status = USBH_NOT_SUPPORTED; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CONTROL_EVENT, 0); -#endif - } - else if (URB_Status == USBH_URB_ERROR) - { - /* Device error */ - phost->Control.state = CTRL_ERROR; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CONTROL_EVENT, 0); -#endif - } - break; - - case CTRL_DATA_OUT: - - USBH_CtlSendData (phost, - phost->Control.buff, - phost->Control.length , - phost->Control.pipe_out, - 1); - phost->Control.timer = phost->Timer; - phost->Control.state = CTRL_DATA_OUT_WAIT; - break; - - case CTRL_DATA_OUT_WAIT: - - URB_Status = USBH_LL_GetURBState(phost , phost->Control.pipe_out); - - if (URB_Status == USBH_URB_DONE) - { /* If the Setup Pkt is sent successful, then change the state */ - phost->Control.state = CTRL_STATUS_IN; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CONTROL_EVENT, 0); -#endif - } - - /* handle error cases */ - else if (URB_Status == USBH_URB_STALL) - { - /* In stall case, return to previous machine state*/ - phost->Control.state = CTRL_STALLED; - status = USBH_NOT_SUPPORTED; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CONTROL_EVENT, 0); -#endif - } - else if (URB_Status == USBH_URB_NOTREADY) - { - /* Nack received from device */ - phost->Control.state = CTRL_DATA_OUT; - -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CONTROL_EVENT, 0); -#endif - } - else if (URB_Status == USBH_URB_ERROR) - { - /* device error */ - phost->Control.state = CTRL_ERROR; - status = USBH_FAIL; - -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CONTROL_EVENT, 0); -#endif - } - break; - - - case CTRL_STATUS_IN: - /* Send 0 bytes out packet */ - USBH_CtlReceiveData (phost, - 0, - 0, - phost->Control.pipe_in); - phost->Control.timer = phost->Timer; - phost->Control.state = CTRL_STATUS_IN_WAIT; - - break; - - case CTRL_STATUS_IN_WAIT: - - URB_Status = USBH_LL_GetURBState(phost , phost->Control.pipe_in); - - if ( URB_Status == USBH_URB_DONE) - { /* Control transfers completed, Exit the State Machine */ - phost->Control.state = CTRL_COMPLETE; - status = USBH_OK; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CONTROL_EVENT, 0); -#endif - } - - else if (URB_Status == USBH_URB_ERROR) - { - phost->Control.state = CTRL_ERROR; -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CONTROL_EVENT, 0); -#endif - } - else if(URB_Status == USBH_URB_STALL) - { - /* Control transfers completed, Exit the State Machine */ - status = USBH_NOT_SUPPORTED; - -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CONTROL_EVENT, 0); -#endif - } - break; - - case CTRL_STATUS_OUT: - USBH_CtlSendData (phost, - 0, - 0, - phost->Control.pipe_out, - 1); - phost->Control.timer = phost->Timer; - phost->Control.state = CTRL_STATUS_OUT_WAIT; - break; - - case CTRL_STATUS_OUT_WAIT: - - URB_Status = USBH_LL_GetURBState(phost , phost->Control.pipe_out); - if (URB_Status == USBH_URB_DONE) - { - status = USBH_OK; - phost->Control.state = CTRL_COMPLETE; - -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CONTROL_EVENT, 0); -#endif - } - else if (URB_Status == USBH_URB_NOTREADY) - { - phost->Control.state = CTRL_STATUS_OUT; - -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CONTROL_EVENT, 0); -#endif - } - else if (URB_Status == USBH_URB_ERROR) - { - phost->Control.state = CTRL_ERROR; - -#if (USBH_USE_OS == 1) - osMessagePut ( phost->os_event, USBH_CONTROL_EVENT, 0); -#endif - } - break; - - case CTRL_ERROR: - /* - After a halt condition is encountered or an error is detected by the - host, a control endpoint is allowed to recover by accepting the next Setup - PID; i.e., recovery actions via some other pipe are not required for control - endpoints. For the Default Control Pipe, a device reset will ultimately be - required to clear the halt or error condition if the next Setup PID is not - accepted. - */ - if (++ phost->Control.errorcount <= USBH_MAX_ERROR_COUNT) - { - /* try to recover control */ - USBH_LL_Stop(phost); - - /* Do the transmission again, starting from SETUP Packet */ - phost->Control.state = CTRL_SETUP; - phost->RequestState = CMD_SEND; - } - else - { - phost->pUser(phost, HOST_USER_UNRECOVERED_ERROR); - phost->Control.errorcount = 0; - USBH_ErrLog("Control error"); - status = USBH_FAIL; - } - break; - - default: - break; - } - return status; -} - -/** -* @} -*/ - -/** -* @} -*/ - -/** -* @} -*/ - -/** -* @} -*/ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - - - - diff --git a/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_ioreq.c b/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_ioreq.c deleted file mode 100755 index dc61a4cb..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Middlewares/ST/STM32_USB_Host_Library/Core/Src/usbh_ioreq.c +++ /dev/null @@ -1,358 +0,0 @@ -/** - ****************************************************************************** - * @file usbh_ioreq.c - * @author MCD Application Team - * @version V3.2.2 - * @date 07-July-2015 - * @brief This file handles the issuing of the USB transactions - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2015 STMicroelectronics

- * - * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.st.com/software_license_agreement_liberty_v2 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ****************************************************************************** - */ -/* Includes ------------------------------------------------------------------*/ - -#include "usbh_ioreq.h" - -/** @addtogroup USBH_LIB - * @{ - */ - -/** @addtogroup USBH_LIB_CORE -* @{ -*/ - -/** @defgroup USBH_IOREQ - * @brief This file handles the standard protocol processing (USB v2.0) - * @{ - */ - - -/** @defgroup USBH_IOREQ_Private_Defines - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBH_IOREQ_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ - - - -/** @defgroup USBH_IOREQ_Private_Macros - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBH_IOREQ_Private_Variables - * @{ - */ -/** - * @} - */ -/** @defgroup USBH_IOREQ_Private_FunctionPrototypes - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBH_IOREQ_Private_Functions - * @{ - */ - - - -/** - * @brief USBH_CtlSendSetup - * Sends the Setup Packet to the Device - * @param phost: Host Handle - * @param buff: Buffer pointer from which the Data will be send to Device - * @param pipe_num: Pipe Number - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_CtlSendSetup (USBH_HandleTypeDef *phost, - uint8_t *buff, - uint8_t pipe_num) -{ - - USBH_LL_SubmitURB (phost, /* Driver handle */ - pipe_num, /* Pipe index */ - 0, /* Direction : OUT */ - USBH_EP_CONTROL, /* EP type */ - USBH_PID_SETUP, /* Type setup */ - buff, /* data buffer */ - USBH_SETUP_PKT_SIZE, /* data length */ - 0); - return USBH_OK; -} - - -/** - * @brief USBH_CtlSendData - * Sends a data Packet to the Device - * @param phost: Host Handle - * @param buff: Buffer pointer from which the Data will be sent to Device - * @param length: Length of the data to be sent - * @param pipe_num: Pipe Number - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_CtlSendData (USBH_HandleTypeDef *phost, - uint8_t *buff, - uint16_t length, - uint8_t pipe_num, - uint8_t do_ping ) -{ - if(phost->device.speed != USBH_SPEED_HIGH) - { - do_ping = 0; - } - - USBH_LL_SubmitURB (phost, /* Driver handle */ - pipe_num, /* Pipe index */ - 0, /* Direction : OUT */ - USBH_EP_CONTROL, /* EP type */ - USBH_PID_DATA, /* Type Data */ - buff, /* data buffer */ - length, /* data length */ - do_ping); /* do ping (HS Only)*/ - - return USBH_OK; -} - - -/** - * @brief USBH_CtlReceiveData - * Receives the Device Response to the Setup Packet - * @param phost: Host Handle - * @param buff: Buffer pointer in which the response needs to be copied - * @param length: Length of the data to be received - * @param pipe_num: Pipe Number - * @retval USBH Status. - */ -USBH_StatusTypeDef USBH_CtlReceiveData(USBH_HandleTypeDef *phost, - uint8_t* buff, - uint16_t length, - uint8_t pipe_num) -{ - USBH_LL_SubmitURB (phost, /* Driver handle */ - pipe_num, /* Pipe index */ - 1, /* Direction : IN */ - USBH_EP_CONTROL, /* EP type */ - USBH_PID_DATA, /* Type Data */ - buff, /* data buffer */ - length, /* data length */ - 0); - return USBH_OK; - -} - - -/** - * @brief USBH_BulkSendData - * Sends the Bulk Packet to the device - * @param phost: Host Handle - * @param buff: Buffer pointer from which the Data will be sent to Device - * @param length: Length of the data to be sent - * @param pipe_num: Pipe Number - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_BulkSendData (USBH_HandleTypeDef *phost, - uint8_t *buff, - uint16_t length, - uint8_t pipe_num, - uint8_t do_ping ) -{ - if(phost->device.speed != USBH_SPEED_HIGH) - { - do_ping = 0; - } - - USBH_LL_SubmitURB (phost, /* Driver handle */ - pipe_num, /* Pipe index */ - 0, /* Direction : IN */ - USBH_EP_BULK, /* EP type */ - USBH_PID_DATA, /* Type Data */ - buff, /* data buffer */ - length, /* data length */ - do_ping); /* do ping (HS Only)*/ - return USBH_OK; -} - - -/** - * @brief USBH_BulkReceiveData - * Receives IN bulk packet from device - * @param phost: Host Handle - * @param buff: Buffer pointer in which the received data packet to be copied - * @param length: Length of the data to be received - * @param pipe_num: Pipe Number - * @retval USBH Status. - */ -USBH_StatusTypeDef USBH_BulkReceiveData(USBH_HandleTypeDef *phost, - uint8_t *buff, - uint16_t length, - uint8_t pipe_num) -{ - USBH_LL_SubmitURB (phost, /* Driver handle */ - pipe_num, /* Pipe index */ - 1, /* Direction : IN */ - USBH_EP_BULK, /* EP type */ - USBH_PID_DATA, /* Type Data */ - buff, /* data buffer */ - length, /* data length */ - 0); - return USBH_OK; -} - - -/** - * @brief USBH_InterruptReceiveData - * Receives the Device Response to the Interrupt IN token - * @param phost: Host Handle - * @param buff: Buffer pointer in which the response needs to be copied - * @param length: Length of the data to be received - * @param pipe_num: Pipe Number - * @retval USBH Status. - */ -USBH_StatusTypeDef USBH_InterruptReceiveData(USBH_HandleTypeDef *phost, - uint8_t *buff, - uint8_t length, - uint8_t pipe_num) -{ - USBH_LL_SubmitURB (phost, /* Driver handle */ - pipe_num, /* Pipe index */ - 1, /* Direction : IN */ - USBH_EP_INTERRUPT, /* EP type */ - USBH_PID_DATA, /* Type Data */ - buff, /* data buffer */ - length, /* data length */ - 0); - - return USBH_OK; -} - -/** - * @brief USBH_InterruptSendData - * Sends the data on Interrupt OUT Endpoint - * @param phost: Host Handle - * @param buff: Buffer pointer from where the data needs to be copied - * @param length: Length of the data to be sent - * @param pipe_num: Pipe Number - * @retval USBH Status. - */ -USBH_StatusTypeDef USBH_InterruptSendData(USBH_HandleTypeDef *phost, - uint8_t *buff, - uint8_t length, - uint8_t pipe_num) -{ - USBH_LL_SubmitURB (phost, /* Driver handle */ - pipe_num, /* Pipe index */ - 0, /* Direction : OUT */ - USBH_EP_INTERRUPT, /* EP type */ - USBH_PID_DATA, /* Type Data */ - buff, /* data buffer */ - length, /* data length */ - 0); - - return USBH_OK; -} - -/** - * @brief USBH_IsocReceiveData - * Receives the Device Response to the Isochronous IN token - * @param phost: Host Handle - * @param buff: Buffer pointer in which the response needs to be copied - * @param length: Length of the data to be received - * @param pipe_num: Pipe Number - * @retval USBH Status. - */ -USBH_StatusTypeDef USBH_IsocReceiveData(USBH_HandleTypeDef *phost, - uint8_t *buff, - uint32_t length, - uint8_t pipe_num) -{ - USBH_LL_SubmitURB (phost, /* Driver handle */ - pipe_num, /* Pipe index */ - 1, /* Direction : IN */ - USBH_EP_ISO, /* EP type */ - USBH_PID_DATA, /* Type Data */ - buff, /* data buffer */ - length, /* data length */ - 0); - - - return USBH_OK; -} - -/** - * @brief USBH_IsocSendData - * Sends the data on Isochronous OUT Endpoint - * @param phost: Host Handle - * @param buff: Buffer pointer from where the data needs to be copied - * @param length: Length of the data to be sent - * @param pipe_num: Pipe Number - * @retval USBH Status. - */ -USBH_StatusTypeDef USBH_IsocSendData(USBH_HandleTypeDef *phost, - uint8_t *buff, - uint32_t length, - uint8_t pipe_num) -{ - USBH_LL_SubmitURB (phost, /* Driver handle */ - pipe_num, /* Pipe index */ - 0, /* Direction : OUT */ - USBH_EP_ISO, /* EP type */ - USBH_PID_DATA, /* Type Data */ - buff, /* data buffer */ - length, /* data length */ - 0); - - return USBH_OK; -} -/** -* @} -*/ - -/** -* @} -*/ - -/** -* @} -*/ - -/** -* @} -*/ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - - - diff --git a/STM32CubeMX/SCSI2SD-V6/Src/bsp_driver_sd.c b/STM32CubeMX/SCSI2SD-V6/Src/bsp_driver_sd.c deleted file mode 100755 index 1a990160..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Src/bsp_driver_sd.c +++ /dev/null @@ -1,308 +0,0 @@ -/** - ****************************************************************************** - * @file bsp_driver_sd.c (based on stm324x9i_eval_sd.c) - * @brief This file includes a generic uSD card driver. - ****************************************************************************** - * - * COPYRIGHT(c) 2016 STMicroelectronics - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ -#define BUS_4BITS 1 -/* USER CODE BEGIN 0 */ -/* Includes ------------------------------------------------------------------*/ -#include "bsp_driver_sd.h" - -/* Extern variables ---------------------------------------------------------*/ - -extern SD_HandleTypeDef hsd; -extern HAL_SD_CardInfoTypedef SDCardInfo; - -/** - * @brief Initializes the SD card device. - * @param None - * @retval SD status - */ -uint8_t BSP_SD_Init(void) -{ - uint8_t SD_state = MSD_OK; - /* Check if the SD card is plugged in the slot */ - if (BSP_SD_IsDetected() != SD_PRESENT) - { - return MSD_ERROR; - } - SD_state = HAL_SD_Init(&hsd, &SDCardInfo); -#ifdef BUS_4BITS - if (SD_state == MSD_OK) - { - if (HAL_SD_WideBusOperation_Config(&hsd, SDIO_BUS_WIDE_4B) != SD_OK) - { - SD_state = MSD_ERROR; - } - else - { - SD_state = MSD_OK; - } - } -#endif - return SD_state; -} - -/** - * @brief Configures Interrupt mode for SD detection pin. - * @param None - * @retval Returns 0 in success otherwise 1. - */ -uint8_t BSP_SD_ITConfig(void) -{ - /* TBI: add user code here depending on the hardware configuration used */ - - return 0; -} - -/** @brief SD detect IT treatment - * @param None - * @retval None - */ -void BSP_SD_DetectIT(void) -{ - /* TBI: add user code here depending on the hardware configuration used */ -} - -/** @brief SD detect IT detection callback - * @param None - * @retval None - */ -__weak void BSP_SD_DetectCallback(void) -{ - /* NOTE: This function Should not be modified, when the callback is needed, - the SD_DetectCallback could be implemented in the user file - */ - -} - -/** - * @brief Reads block(s) from a specified address in an SD card, in polling mode. - * @param pData: Pointer to the buffer that will contain the data to transmit - * @param ReadAddr: Address from where data is to be read - * @param BlockSize: SD card data block size, that should be 512 - * @param NumOfBlocks: Number of SD blocks to read - * @retval SD status - */ -uint8_t BSP_SD_ReadBlocks(uint32_t *pData, uint64_t ReadAddr, uint32_t BlockSize, uint32_t NumOfBlocks) -{ - if(HAL_SD_ReadBlocks_DMA(&hsd, pData, ReadAddr, BlockSize, NumOfBlocks) != SD_OK) - { - return MSD_ERROR; - } - else - { - return MSD_OK; - } -} - -/** - * @brief Writes block(s) to a specified address in an SD card, in polling mode. - * @param pData: Pointer to the buffer that will contain the data to transmit - * @param WriteAddr: Address from where data is to be written - * @param BlockSize: SD card data block size, that should be 512 - * @param NumOfBlocks: Number of SD blocks to write - * @retval SD status - */ -uint8_t BSP_SD_WriteBlocks(uint32_t *pData, uint64_t WriteAddr, uint32_t BlockSize, uint32_t NumOfBlocks) -{ - if(HAL_SD_WriteBlocks_DMA(&hsd, pData, WriteAddr, BlockSize, NumOfBlocks) != SD_OK) - { - return MSD_ERROR; - } - else - { - return MSD_OK; - } -} - -/** - * @brief Reads block(s) from a specified address in an SD card, in DMA mode. - * @param pData: Pointer to the buffer that will contain the data to transmit - * @param ReadAddr: Address from where data is to be read - * @param BlockSize: SD card data block size, that should be 512 - * @param NumOfBlocks: Number of SD blocks to read - * @retval SD status - */ -uint8_t BSP_SD_ReadBlocks_DMA(uint32_t *pData, uint64_t ReadAddr, uint32_t BlockSize, uint32_t NumOfBlocks) -{ - uint8_t SD_state = MSD_OK; - - /* Read block(s) in DMA transfer mode */ - if(HAL_SD_ReadBlocks_DMA(&hsd, pData, ReadAddr, BlockSize, NumOfBlocks) != SD_OK) - { - SD_state = MSD_ERROR; - } - - /* Wait until transfer is complete */ - if(SD_state == MSD_OK) - { - if(HAL_SD_CheckReadOperation(&hsd, (uint32_t)SD_DATATIMEOUT) != SD_OK) - { - SD_state = MSD_ERROR; - } - else - { - SD_state = MSD_OK; - } - } - - return SD_state; -} - -/** - * @brief Writes block(s) to a specified address in an SD card, in DMA mode. - * @param pData: Pointer to the buffer that will contain the data to transmit - * @param WriteAddr: Address from where data is to be written - * @param BlockSize: SD card data block size, that should be 512 - * @param NumOfBlocks: Number of SD blocks to write - * @retval SD status - */ -uint8_t BSP_SD_WriteBlocks_DMA(uint32_t *pData, uint64_t WriteAddr, uint32_t BlockSize, uint32_t NumOfBlocks) -{ - uint8_t SD_state = SD_OK; - - /* Write block(s) in DMA transfer mode */ - if(HAL_SD_WriteBlocks_DMA(&hsd, pData, WriteAddr, BlockSize, NumOfBlocks) != SD_OK) - { - SD_state = MSD_ERROR; - } - - /* Wait until transfer is complete */ - if(SD_state == MSD_OK) - { - if(HAL_SD_CheckWriteOperation(&hsd, (uint32_t)SD_DATATIMEOUT) != SD_OK) - { - SD_state = MSD_ERROR; - } - else - { - SD_state = MSD_OK; - } - } - - return SD_state; -} - -/** - * @brief Erases the specified memory area of the given SD card. - * @param StartAddr: Start byte address - * @param EndAddr: End byte address - * @retval SD status - */ -uint8_t BSP_SD_Erase(uint64_t StartAddr, uint64_t EndAddr) -{ - if(HAL_SD_Erase(&hsd, StartAddr, EndAddr) != SD_OK) - { - return MSD_ERROR; - } - else - { - return MSD_OK; - } -} - -/** - * @brief Handles SD card interrupt request. - * @param None - * @retval None - */ -void BSP_SD_IRQHandler(void) -{ - HAL_SD_IRQHandler(&hsd); -} - -/** - * @brief Handles SD DMA Tx transfer interrupt request. - * @param None - * @retval None - */ -void BSP_SD_DMA_Tx_IRQHandler(void) -{ - HAL_DMA_IRQHandler(hsd.hdmatx); -} - -/** - * @brief Handles SD DMA Rx transfer interrupt request. - * @param None - * @retval None - */ -void BSP_SD_DMA_Rx_IRQHandler(void) -{ - HAL_DMA_IRQHandler(hsd.hdmarx); -} - -/** - * @brief Gets the current SD card data status. - * @param None - * @retval Data transfer state. - * This value can be one of the following values: - * @arg SD_TRANSFER_OK: No data transfer is acting - * @arg SD_TRANSFER_BUSY: Data transfer is acting - * @arg SD_TRANSFER_ERROR: Data transfer error - */ -HAL_SD_TransferStateTypedef BSP_SD_GetStatus(void) -{ - return(HAL_SD_GetStatus(&hsd)); -} - -/** - * @brief Get SD information about specific SD card. - * @param CardInfo: Pointer to HAL_SD_CardInfoTypedef structure - * @retval None - */ -void BSP_SD_GetCardInfo(HAL_SD_CardInfoTypedef* CardInfo) -{ - /* Get SD card Information */ - HAL_SD_Get_CardInfo(&hsd, CardInfo); -} -/* USER CODE END 0 */ - -/** - * @brief Detects if SD card is correctly plugged in the memory slot or not. - * @param None - * @retval Returns if SD is detected or not - */ -uint8_t BSP_SD_IsDetected(void) -{ - __IO uint8_t status = SD_PRESENT; - - /* USER CODE BEGIN 1 */ - /* user code can be inserted here */ - /* USER CODE END 1 */ - - return status; -} - -/* USER CODE BEGIN AdditionalCode */ -/* user code can be inserted here */ -/* USER CODE END AdditionalCode */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Src/main.c b/STM32CubeMX/SCSI2SD-V6/Src/main.c deleted file mode 100755 index a80e0781..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Src/main.c +++ /dev/null @@ -1,186 +0,0 @@ -/** - ****************************************************************************** - * File Name : main.c - * Description : Main program body - ****************************************************************************** - * - * COPYRIGHT(c) 2016 STMicroelectronics - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal.h" -#include "sdio.h" -#include "spi.h" -#include "usart.h" -#include "usb_device.h" -#include "usb_host.h" -#include "gpio.h" -#include "fsmc.h" - -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -/* Private variables ---------------------------------------------------------*/ - -/* USER CODE BEGIN PV */ -/* Private variables ---------------------------------------------------------*/ - -/* USER CODE END PV */ - -/* Private function prototypes -----------------------------------------------*/ -void SystemClock_Config(void); -void MX_USB_HOST_Process(void); - -/* USER CODE BEGIN PFP */ -/* Private function prototypes -----------------------------------------------*/ -void mainEarlyInit(); -void mainInit(); -void mainLoop(); - - -/* USER CODE END PFP */ - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -int main(void) -{ - - /* USER CODE BEGIN 1 */ - mainEarlyInit(); - - - /* USER CODE END 1 */ - - /* MCU Configuration----------------------------------------------------------*/ - - /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ - HAL_Init(); - - /* Configure the system clock */ - SystemClock_Config(); - - /* Initialize all configured peripherals */ - MX_GPIO_Init(); - MX_FSMC_Init(); - MX_SDIO_SD_Init(); - MX_SPI1_Init(); - MX_USART3_UART_Init(); // Not used, but we don't want the pins floating. - // MX_USB_HOST_Init(); // Not used, pins set to GPIO - - /* USER CODE BEGIN 2 */ - mainInit(); - - /* USER CODE END 2 */ - - /* Infinite loop */ - /* USER CODE BEGIN WHILE */ - while (1) - { - /* USER CODE END WHILE */ - //MX_USB_HOST_Process(); - - /* USER CODE BEGIN 3 */ - mainLoop(); - - - } - /* USER CODE END 3 */ - -} - -/** System Clock Configuration -*/ -void SystemClock_Config(void) -{ - - RCC_OscInitTypeDef RCC_OscInitStruct; - RCC_ClkInitTypeDef RCC_ClkInitStruct; - - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; - RCC_OscInitStruct.HSEState = RCC_HSE_ON; - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; - RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; - - RCC_OscInitStruct.PLL.PLLM = 20; - RCC_OscInitStruct.PLL.PLLN = 432; - RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; - RCC_OscInitStruct.PLL.PLLQ = 9; - HAL_RCC_OscConfig(&RCC_OscInitStruct); - - RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1 - |RCC_CLOCKTYPE_PCLK2; - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; - RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; - RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; - RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; - HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3); - - HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_PLLCLK, RCC_MCODIV_1); - - HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); - - HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); - - /* SysTick_IRQn interrupt configuration */ - HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); -} - -/* USER CODE BEGIN 4 */ - -/* USER CODE END 4 */ - -#ifdef USE_FULL_ASSERT - -/** - * @brief Reports the name of the source file and the source line number - * where the assert_param error has occurred. - * @param file: pointer to the source file name - * @param line: assert_param error line source number - * @retval None - */ -void assert_failed(uint8_t* file, uint32_t line) -{ - /* USER CODE BEGIN 6 */ - /* User can add his own implementation to report the file name and line number, - ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ - /* USER CODE END 6 */ - -} - -#endif - -/** - * @} - */ - -/** - * @} -*/ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Src/spi.c b/STM32CubeMX/SCSI2SD-V6/Src/spi.c deleted file mode 100755 index 25e0745e..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Src/spi.c +++ /dev/null @@ -1,133 +0,0 @@ -/** - ****************************************************************************** - * File Name : SPI.c - * Description : This file provides code for the configuration - * of the SPI instances. - ****************************************************************************** - * - * COPYRIGHT(c) 2016 STMicroelectronics - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "spi.h" - -#include "gpio.h" - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -SPI_HandleTypeDef hspi1; - -/* SPI1 init function */ -void MX_SPI1_Init(void) -{ - - hspi1.Instance = SPI1; - hspi1.Init.Mode = SPI_MODE_MASTER; - hspi1.Init.Direction = SPI_DIRECTION_2LINES; - hspi1.Init.DataSize = SPI_DATASIZE_8BIT; - hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH; - hspi1.Init.CLKPhase = SPI_PHASE_2EDGE; - hspi1.Init.NSS = SPI_NSS_SOFT; - // (96MHz / 2) / 4 = 12MHz. FPGA device allows up to 25MHz write - hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4; - hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; - hspi1.Init.TIMode = SPI_TIMODE_DISABLED; - hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLED; - hspi1.Init.CRCPolynomial = 10; - HAL_SPI_Init(&hspi1); - -} - -void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi) -{ - - GPIO_InitTypeDef GPIO_InitStruct; - if(hspi->Instance==SPI1) - { - /* USER CODE BEGIN SPI1_MspInit 0 */ - - /* USER CODE END SPI1_MspInit 0 */ - /* Peripheral clock enable */ - __SPI1_CLK_ENABLE(); - - /**SPI1 GPIO Configuration - PA5 ------> SPI1_SCK - PA6 ------> SPI1_MISO - PA7 ------> SPI1_MOSI - */ - GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - /* USER CODE BEGIN SPI1_MspInit 1 */ - - /* USER CODE END SPI1_MspInit 1 */ - } -} - -void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi) -{ - - if(hspi->Instance==SPI1) - { - /* USER CODE BEGIN SPI1_MspDeInit 0 */ - - /* USER CODE END SPI1_MspDeInit 0 */ - /* Peripheral clock disable */ - __SPI1_CLK_DISABLE(); - - /**SPI1 GPIO Configuration - PA5 ------> SPI1_SCK - PA6 ------> SPI1_MISO - PA7 ------> SPI1_MOSI - */ - HAL_GPIO_DeInit(GPIOA, GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7); - - } - /* USER CODE BEGIN SPI1_MspDeInit 1 */ - - /* USER CODE END SPI1_MspDeInit 1 */ -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Src/stm32f2xx_hal_msp.c b/STM32CubeMX/SCSI2SD-V6/Src/stm32f2xx_hal_msp.c deleted file mode 100755 index b7ab0a3b..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Src/stm32f2xx_hal_msp.c +++ /dev/null @@ -1,73 +0,0 @@ -/** - ****************************************************************************** - * File Name : stm32f2xx_hal_msp.c - * Description : This file provides code for the MSP Initialization - * and de-Initialization codes. - ****************************************************************************** - * - * COPYRIGHT(c) 2016 STMicroelectronics - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx_hal.h" - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -/** - * Initializes the Global MSP. - */ -void HAL_MspInit(void) -{ - /* USER CODE BEGIN MspInit 0 */ - - /* USER CODE END MspInit 0 */ - - HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4); - - /* System interrupt init*/ - /* SysTick_IRQn interrupt configuration */ - HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); - - /* USER CODE BEGIN MspInit 1 */ - - /* USER CODE END MspInit 1 */ -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Src/usb_device.c b/STM32CubeMX/SCSI2SD-V6/Src/usb_device.c deleted file mode 100755 index b2886265..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Src/usb_device.c +++ /dev/null @@ -1,64 +0,0 @@ -/** - ****************************************************************************** - * @file : USB_DEVICE - * @version : v1.0_Cube - * @brief : This file implements the USB Device - ****************************************************************************** - * - * COPYRIGHT(c) 2016 STMicroelectronics - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** -*/ - -/* Includes ------------------------------------------------------------------*/ - -#include "usb_device.h" -#include "usbd_core.h" -#include "usbd_desc.h" -#include "usbd_hid.h" - -/* USB Device Core handle declaration */ -USBD_HandleTypeDef hUsbDeviceFS; - -/* init function */ -void MX_USB_DEVICE_Init(void) -{ - /* Init Device Library,Add Supported Class and Start the library*/ - USBD_Init(&hUsbDeviceFS, &FS_Desc, DEVICE_FS); - - USBD_RegisterClass(&hUsbDeviceFS, &USBD_HID); - - USBD_Start(&hUsbDeviceFS); - -} -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Src/usb_host.c b/STM32CubeMX/SCSI2SD-V6/Src/usb_host.c deleted file mode 100755 index ca344e76..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Src/usb_host.c +++ /dev/null @@ -1,120 +0,0 @@ -/** - ****************************************************************************** - * @file : USB_HOST - * @version : v1.0_Cube - * @brief : This file implements the USB Host - ****************************************************************************** - * COPYRIGHT(c) 2016 STMicroelectronics - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** -*/ - -/* Includes ------------------------------------------------------------------*/ - -#include "usb_host.h" -#include "usbh_core.h" -#include "usbh_msc.h" - -/* USB Host Core handle declaration */ -USBH_HandleTypeDef hUsbHostHS; -ApplicationTypeDef Appli_state = APPLICATION_IDLE; - -/** -* -- Insert your variables declaration here -- -*/ -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -/* -* user callbak declaration -*/ -static void USBH_UserProcess (USBH_HandleTypeDef *phost, uint8_t id); - -/** -* -- Insert your external function declaration here -- -*/ -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ - -/* init function */ -void MX_USB_HOST_Init(void) -{ - /* Init Host Library,Add Supported Class and Start the library*/ - USBH_Init(&hUsbHostHS, USBH_UserProcess, HOST_HS); - - USBH_RegisterClass(&hUsbHostHS, USBH_MSC_CLASS); - - USBH_Start(&hUsbHostHS); -} - -/* - * Background task -*/ -void MX_USB_HOST_Process() -{ - /* USB Host Background task */ - USBH_Process(&hUsbHostHS); -} -/* - * user callbak definition -*/ -static void USBH_UserProcess (USBH_HandleTypeDef *phost, uint8_t id) -{ - - /* USER CODE BEGIN 2 */ - switch(id) - { - case HOST_USER_SELECT_CONFIGURATION: - break; - - case HOST_USER_DISCONNECTION: - Appli_state = APPLICATION_DISCONNECT; - break; - - case HOST_USER_CLASS_ACTIVE: - Appli_state = APPLICATION_READY; - break; - - case HOST_USER_CONNECTION: - Appli_state = APPLICATION_START; - break; - - default: - break; - } - /* USER CODE END 2 */ -} - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Src/usbd_conf.c b/STM32CubeMX/SCSI2SD-V6/Src/usbd_conf.c deleted file mode 100755 index 07387caa..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Src/usbd_conf.c +++ /dev/null @@ -1,511 +0,0 @@ -/** - ****************************************************************************** - * @file : usbd_conf.c - * @version : v1.0_Cube - * @brief : This file implements the board support package for the USB device library - ****************************************************************************** - * - * COPYRIGHT(c) 2016 STMicroelectronics - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** -*/ -/* Includes ------------------------------------------------------------------*/ -#include "stm32f2xx.h" -#include "stm32f2xx_hal.h" -#include "usbd_def.h" -#include "usbd_core.h" - -PCD_HandleTypeDef hpcd_USB_OTG_FS; - -/* External functions --------------------------------------------------------*/ -void SystemClock_Config(void); - -/* USER CODE BEGIN 0 */ -/* USER CODE END 0 */ - -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -/* USER CODE BEGIN 1 */ -/* USER CODE END 1 */ - -/******************************************************************************* - LL Driver Callbacks (PCD -> USB Device Library) -*******************************************************************************/ -/* MSP Init */ - -void HAL_PCD_MspInit(PCD_HandleTypeDef* hpcd) -{ - GPIO_InitTypeDef GPIO_InitStruct; - if(hpcd->Instance==USB_OTG_FS) - { - /* USER CODE BEGIN USB_OTG_FS_MspInit 0 */ - - /* USER CODE END USB_OTG_FS_MspInit 0 */ - - /**USB_OTG_FS GPIO Configuration - PA9 ------> USB_OTG_FS_VBUS - PA11 ------> USB_OTG_FS_DM - PA12 ------> USB_OTG_FS_DP - */ - GPIO_InitStruct.Pin = GPIO_PIN_9; - GPIO_InitStruct.Mode = GPIO_MODE_INPUT; - GPIO_InitStruct.Pull = GPIO_NOPULL; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - /* Peripheral clock enable */ - __USB_OTG_FS_CLK_ENABLE(); - - /* Peripheral interrupt init*/ - HAL_NVIC_SetPriority(OTG_FS_IRQn, 0, 0); - HAL_NVIC_EnableIRQ(OTG_FS_IRQn); - /* USER CODE BEGIN USB_OTG_FS_MspInit 1 */ - - /* USER CODE END USB_OTG_FS_MspInit 1 */ - } -} - -void HAL_PCD_MspDeInit(PCD_HandleTypeDef* hpcd) -{ - if(hpcd->Instance==USB_OTG_FS) - { - /* USER CODE BEGIN USB_OTG_FS_MspDeInit 0 */ - - /* USER CODE END USB_OTG_FS_MspDeInit 0 */ - /* Peripheral clock disable */ - __USB_OTG_FS_CLK_DISABLE(); - - /**USB_OTG_FS GPIO Configuration - PA9 ------> USB_OTG_FS_VBUS - PA11 ------> USB_OTG_FS_DM - PA12 ------> USB_OTG_FS_DP - */ - // HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_11|GPIO_PIN_12); - // MM: Don't let pins float. - GPIO_InitTypeDef GPIO_InitStruct; - GPIO_InitStruct.Pin = GPIO_PIN_9; - GPIO_InitStruct.Mode = GPIO_MODE_INPUT; - GPIO_InitStruct.Pull = GPIO_PULLDOWN; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12; - GPIO_InitStruct.Mode = GPIO_MODE_INPUT; - GPIO_InitStruct.Pull = GPIO_PULLDOWN; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - /* Peripheral interrupt Deinit*/ - HAL_NVIC_DisableIRQ(OTG_FS_IRQn); - - /* USER CODE BEGIN USB_OTG_FS_MspDeInit 1 */ - - /* USER CODE END USB_OTG_FS_MspDeInit 1 */ - } -} - -/** - * @brief Setup stage callback - * @param hpcd: PCD handle - * @retval None - */ -void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd) -{ - USBD_LL_SetupStage(hpcd->pData, (uint8_t *)hpcd->Setup); -} - -/** - * @brief Data Out stage callback. - * @param hpcd: PCD handle - * @param epnum: Endpoint Number - * @retval None - */ -void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) -{ - USBD_LL_DataOutStage(hpcd->pData, epnum, hpcd->OUT_ep[epnum].xfer_buff); -} - -/** - * @brief Data In stage callback.. - * @param hpcd: PCD handle - * @param epnum: Endpoint Number - * @retval None - */ -void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) -{ - USBD_LL_DataInStage(hpcd->pData, epnum, hpcd->IN_ep[epnum].xfer_buff); -} - -/** - * @brief SOF callback. - * @param hpcd: PCD handle - * @retval None - */ -void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd) -{ - USBD_LL_SOF(hpcd->pData); -} - -/** - * @brief Reset callback. - * @param hpcd: PCD handle - * @retval None - */ -void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd) -{ - USBD_SpeedTypeDef speed = USBD_SPEED_FULL; - - /*Set USB Current Speed*/ - switch (hpcd->Init.speed) - { - case PCD_SPEED_HIGH: - speed = USBD_SPEED_HIGH; - break; - case PCD_SPEED_FULL: - speed = USBD_SPEED_FULL; - break; - - default: - speed = USBD_SPEED_FULL; - break; - } - USBD_LL_SetSpeed(hpcd->pData, speed); - - /*Reset Device*/ - USBD_LL_Reset(hpcd->pData); -} - -/** - * @brief Suspend callback. - * When Low power mode is enabled the debug cannot be used (IAR, Keil doesn't support it) - * @param hpcd: PCD handle - * @retval None - */ -void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd) -{ - /* Inform USB library that core enters in suspend Mode */ - USBD_LL_Suspend(hpcd->pData); - __HAL_PCD_GATE_PHYCLOCK(hpcd); - /*Enter in STOP mode */ - /* USER CODE BEGIN 2 */ - if (hpcd->Init.low_power_enable) - { - /* Set SLEEPDEEP bit and SleepOnExit of Cortex System Control Register */ - SCB->SCR |= (uint32_t)((uint32_t)(SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk)); - } - /* USER CODE END 2 */ -} - -/** - * @brief Resume callback. - When Low power mode is enabled the debug cannot be used (IAR, Keil doesn't support it) - * @param hpcd: PCD handle - * @retval None - */ -void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd) -{ - /* USER CODE BEGIN 3 */ - /* USER CODE END 3 */ - USBD_LL_Resume(hpcd->pData); -} - -/** - * @brief ISOC Out Incomplete callback. - * @param hpcd: PCD handle - * @param epnum: Endpoint Number - * @retval None - */ -void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) -{ - USBD_LL_IsoOUTIncomplete(hpcd->pData, epnum); -} - -/** - * @brief ISOC In Incomplete callback. - * @param hpcd: PCD handle - * @param epnum: Endpoint Number - * @retval None - */ -void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) -{ - USBD_LL_IsoINIncomplete(hpcd->pData, epnum); -} - -/** - * @brief Connect callback. - * @param hpcd: PCD handle - * @retval None - */ -void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd) -{ - USBD_LL_DevConnected(hpcd->pData); -} - -/** - * @brief Disconnect callback. - * @param hpcd: PCD handle - * @retval None - */ -void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd) -{ - USBD_LL_DevDisconnected(hpcd->pData); -} - -/******************************************************************************* - LL Driver Interface (USB Device Library --> PCD) -*******************************************************************************/ -/** - * @brief Initializes the Low Level portion of the Device driver. - * @param pdev: Device handle - * @retval USBD Status - */ -USBD_StatusTypeDef USBD_LL_Init (USBD_HandleTypeDef *pdev) -{ - /* Init USB_IP */ - if (pdev->id == DEVICE_FS) { - /* Link The driver to the stack */ - hpcd_USB_OTG_FS.pData = pdev; - pdev->pData = &hpcd_USB_OTG_FS; - - hpcd_USB_OTG_FS.Instance = USB_OTG_FS; - hpcd_USB_OTG_FS.Init.dev_endpoints = 7; - hpcd_USB_OTG_FS.Init.speed = PCD_SPEED_FULL; - hpcd_USB_OTG_FS.Init.dma_enable = DISABLE; - hpcd_USB_OTG_FS.Init.ep0_mps = DEP0CTL_MPS_64; - hpcd_USB_OTG_FS.Init.phy_itface = PCD_PHY_EMBEDDED; - hpcd_USB_OTG_FS.Init.Sof_enable = DISABLE; - hpcd_USB_OTG_FS.Init.low_power_enable = DISABLE; - hpcd_USB_OTG_FS.Init.vbus_sensing_enable = ENABLE; - hpcd_USB_OTG_FS.Init.use_dedicated_ep1 = DISABLE; - HAL_PCD_Init(&hpcd_USB_OTG_FS); - - // Sum of all FIFOs must be <= 320. - HAL_PCD_SetRxFiFo(&hpcd_USB_OTG_FS, 0x80); - HAL_PCD_SetTxFiFo(&hpcd_USB_OTG_FS, 0, 0x40); - HAL_PCD_SetTxFiFo(&hpcd_USB_OTG_FS, 1, 0x40); - HAL_PCD_SetTxFiFo(&hpcd_USB_OTG_FS, 2, 0x40); - } - return USBD_OK; -} - -/** - * @brief De-Initializes the Low Level portion of the Device driver. - * @param pdev: Device handle - * @retval USBD Status - */ -USBD_StatusTypeDef USBD_LL_DeInit (USBD_HandleTypeDef *pdev) -{ - HAL_PCD_DeInit(pdev->pData); - return USBD_OK; -} - -/** - * @brief Starts the Low Level portion of the Device driver. - * @param pdev: Device handle - * @retval USBD Status - */ -USBD_StatusTypeDef USBD_LL_Start(USBD_HandleTypeDef *pdev) -{ - HAL_PCD_Start(pdev->pData); - return USBD_OK; -} - -/** - * @brief Stops the Low Level portion of the Device driver. - * @param pdev: Device handle - * @retval USBD Status - */ -USBD_StatusTypeDef USBD_LL_Stop (USBD_HandleTypeDef *pdev) -{ - HAL_PCD_Stop(pdev->pData); - return USBD_OK; -} - -/** - * @brief Opens an endpoint of the Low Level Driver. - * @param pdev: Device handle - * @param ep_addr: Endpoint Number - * @param ep_type: Endpoint Type - * @param ep_mps: Endpoint Max Packet Size - * @retval USBD Status - */ -USBD_StatusTypeDef USBD_LL_OpenEP (USBD_HandleTypeDef *pdev, - uint8_t ep_addr, - uint8_t ep_type, - uint16_t ep_mps) -{ - - HAL_PCD_EP_Open(pdev->pData, - ep_addr, - ep_mps, - ep_type); - - return USBD_OK; -} - -/** - * @brief Closes an endpoint of the Low Level Driver. - * @param pdev: Device handle - * @param ep_addr: Endpoint Number - * @retval USBD Status - */ -USBD_StatusTypeDef USBD_LL_CloseEP (USBD_HandleTypeDef *pdev, uint8_t ep_addr) -{ - - HAL_PCD_EP_Close(pdev->pData, ep_addr); - return USBD_OK; -} - -/** - * @brief Flushes an endpoint of the Low Level Driver. - * @param pdev: Device handle - * @param ep_addr: Endpoint Number - * @retval USBD Status - */ -USBD_StatusTypeDef USBD_LL_FlushEP (USBD_HandleTypeDef *pdev, uint8_t ep_addr) -{ - - HAL_PCD_EP_Flush(pdev->pData, ep_addr); - return USBD_OK; -} - -/** - * @brief Sets a Stall condition on an endpoint of the Low Level Driver. - * @param pdev: Device handle - * @param ep_addr: Endpoint Number - * @retval USBD Status - */ -USBD_StatusTypeDef USBD_LL_StallEP (USBD_HandleTypeDef *pdev, uint8_t ep_addr) -{ - - HAL_PCD_EP_SetStall(pdev->pData, ep_addr); - return USBD_OK; -} - -/** - * @brief Clears a Stall condition on an endpoint of the Low Level Driver. - * @param pdev: Device handle - * @param ep_addr: Endpoint Number - * @retval USBD Status - */ -USBD_StatusTypeDef USBD_LL_ClearStallEP (USBD_HandleTypeDef *pdev, uint8_t ep_addr) -{ - - HAL_PCD_EP_ClrStall(pdev->pData, ep_addr); - return USBD_OK; -} - -/** - * @brief Returns Stall condition. - * @param pdev: Device handle - * @param ep_addr: Endpoint Number - * @retval Stall (1: Yes, 0: No) - */ -uint8_t USBD_LL_IsStallEP (USBD_HandleTypeDef *pdev, uint8_t ep_addr) -{ - PCD_HandleTypeDef *hpcd = pdev->pData; - - if((ep_addr & 0x80) == 0x80) - { - return hpcd->IN_ep[ep_addr & 0x7F].is_stall; - } - else - { - return hpcd->OUT_ep[ep_addr & 0x7F].is_stall; - } -} -/** - * @brief Assigns a USB address to the device. - * @param pdev: Device handle - * @param ep_addr: Endpoint Number - * @retval USBD Status - */ -USBD_StatusTypeDef USBD_LL_SetUSBAddress (USBD_HandleTypeDef *pdev, uint8_t dev_addr) -{ - - HAL_PCD_SetAddress(pdev->pData, dev_addr); - return USBD_OK; -} - -/** - * @brief Transmits data over an endpoint. - * @param pdev: Device handle - * @param ep_addr: Endpoint Number - * @param pbuf: Pointer to data to be sent - * @param size: Data size - * @retval USBD Status - */ -USBD_StatusTypeDef USBD_LL_Transmit (USBD_HandleTypeDef *pdev, - uint8_t ep_addr, - uint8_t *pbuf, - uint16_t size) -{ - - HAL_PCD_EP_Transmit(pdev->pData, ep_addr, pbuf, size); - return USBD_OK; -} - -/** - * @brief Prepares an endpoint for reception. - * @param pdev: Device handle - * @param ep_addr: Endpoint Number - * @param pbuf: Pointer to data to be received - * @param size: Data size - * @retval USBD Status - */ -USBD_StatusTypeDef USBD_LL_PrepareReceive(USBD_HandleTypeDef *pdev, - uint8_t ep_addr, - uint8_t *pbuf, - uint16_t size) -{ - - HAL_PCD_EP_Receive(pdev->pData, ep_addr, pbuf, size); - return USBD_OK; -} - -/** - * @brief Returns the last transfered packet size. - * @param pdev: Device handle - * @param ep_addr: Endpoint Number - * @retval Recived Data Size - */ -uint32_t USBD_LL_GetRxDataSize (USBD_HandleTypeDef *pdev, uint8_t ep_addr) -{ - return HAL_PCD_EP_GetRxCount(pdev->pData, ep_addr); -} -/** - * @brief Delays routine for the USB Device Library. - * @param Delay: Delay in ms - * @retval None - */ -void USBD_LL_Delay (uint32_t Delay) -{ - HAL_Delay(Delay); -} -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Src/usbd_desc.c b/STM32CubeMX/SCSI2SD-V6/Src/usbd_desc.c deleted file mode 100755 index ea7bf98d..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Src/usbd_desc.c +++ /dev/null @@ -1,296 +0,0 @@ -/** - ****************************************************************************** - * @file : usbd_desc.c - * @version : v1.0_Cube - * @brief : This file implements the USB Device descriptors - ****************************************************************************** - * - * COPYRIGHT(c) 2016 STMicroelectronics - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** -*/ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_core.h" -#include "usbd_desc.h" -#include "usbd_conf.h" - -/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup USBD_DESC - * @brief USBD descriptors module - * @{ - */ - -/** @defgroup USBD_DESC_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ - -/** @defgroup USBD_DESC_Private_Defines - * @{ - */ -#define USBD_VID 1155 -#define USBD_LANGID_STRING 1033 -#define USBD_MANUFACTURER_STRING "STMicroelectronics" -#define USBD_PID_FS 22315 -#define USBD_PRODUCT_STRING_FS "STM32 Human interface" -/* USER CODE BEGIN SERIALNUMBER_STRING_FS */ -#define USBD_SERIALNUMBER_STRING_FS "00000000001A" -/* USER CODE END SERIALNUMBER_STRING_FS */ -#define USBD_CONFIGURATION_STRING_FS "HID Config" -#define USBD_INTERFACE_STRING_FS "HID Interface" - -/** - * @} - */ - -/** @defgroup USBD_DESC_Private_Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup USBD_DESC_Private_Variables - * @{ - */ -uint8_t * USBD_FS_DeviceDescriptor( USBD_SpeedTypeDef speed , uint16_t *length); -uint8_t * USBD_FS_LangIDStrDescriptor( USBD_SpeedTypeDef speed , uint16_t *length); -uint8_t * USBD_FS_ManufacturerStrDescriptor ( USBD_SpeedTypeDef speed , uint16_t *length); -uint8_t * USBD_FS_ProductStrDescriptor ( USBD_SpeedTypeDef speed , uint16_t *length); -uint8_t * USBD_FS_SerialStrDescriptor( USBD_SpeedTypeDef speed , uint16_t *length); -uint8_t * USBD_FS_ConfigStrDescriptor( USBD_SpeedTypeDef speed , uint16_t *length); -uint8_t * USBD_FS_InterfaceStrDescriptor( USBD_SpeedTypeDef speed , uint16_t *length); - -#ifdef USB_SUPPORT_USER_STRING_DESC -uint8_t * USBD_FS_USRStringDesc (USBD_SpeedTypeDef speed, uint8_t idx , uint16_t *length); -#endif /* USB_SUPPORT_USER_STRING_DESC */ - -USBD_DescriptorsTypeDef FS_Desc = -{ - USBD_FS_DeviceDescriptor, - USBD_FS_LangIDStrDescriptor, - USBD_FS_ManufacturerStrDescriptor, - USBD_FS_ProductStrDescriptor, - USBD_FS_SerialStrDescriptor, - USBD_FS_ConfigStrDescriptor, - USBD_FS_InterfaceStrDescriptor, -}; - -#if defined ( __ICCARM__ ) /*!< IAR Compiler */ - #pragma data_alignment=4 -#endif -/* USB Standard Device Descriptor */ -__ALIGN_BEGIN uint8_t USBD_FS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END = - { - 0x12, /*bLength */ - USB_DESC_TYPE_DEVICE, /*bDescriptorType*/ - 0x00, /* bcdUSB */ - 0x02, - 0x00, /*bDeviceClass*/ - 0x00, /*bDeviceSubClass*/ - 0x00, /*bDeviceProtocol*/ - USB_MAX_EP0_SIZE, /*bMaxPacketSize*/ - LOBYTE(USBD_VID), /*idVendor*/ - HIBYTE(USBD_VID), /*idVendor*/ - LOBYTE(USBD_PID_FS), /*idVendor*/ - HIBYTE(USBD_PID_FS), /*idVendor*/ - 0x00, /*bcdDevice rel. 2.00*/ - 0x02, - USBD_IDX_MFC_STR, /*Index of manufacturer string*/ - USBD_IDX_PRODUCT_STR, /*Index of product string*/ - USBD_IDX_SERIAL_STR, /*Index of serial number string*/ - USBD_MAX_NUM_CONFIGURATION /*bNumConfigurations*/ - } ; -/* USB_DeviceDescriptor */ - -#if defined ( __ICCARM__ ) /*!< IAR Compiler */ - #pragma data_alignment=4 -#endif - -/* USB Standard Device Descriptor */ -__ALIGN_BEGIN uint8_t USBD_LangIDDesc[USB_LEN_LANGID_STR_DESC] __ALIGN_END = -{ - USB_LEN_LANGID_STR_DESC, - USB_DESC_TYPE_STRING, - LOBYTE(USBD_LANGID_STRING), - HIBYTE(USBD_LANGID_STRING), -}; - -#if defined ( __ICCARM__ ) /*!< IAR Compiler */ - #pragma data_alignment=4 -#endif -__ALIGN_BEGIN uint8_t USBD_StrDesc[USBD_MAX_STR_DESC_SIZ] __ALIGN_END; -/** - * @} - */ - -/** @defgroup USBD_DESC_Private_FunctionPrototypes - * @{ - */ -/** - * @} - */ - -/** @defgroup USBD_DESC_Private_Functions - * @{ - */ - -/** -* @brief USBD_FS_DeviceDescriptor -* return the device descriptor -* @param speed : current device speed -* @param length : pointer to data length variable -* @retval pointer to descriptor buffer -*/ -uint8_t * USBD_FS_DeviceDescriptor( USBD_SpeedTypeDef speed , uint16_t *length) -{ - *length = sizeof(USBD_FS_DeviceDesc); - return USBD_FS_DeviceDesc; -} - -/** -* @brief USBD_FS_LangIDStrDescriptor -* return the LangID string descriptor -* @param speed : current device speed -* @param length : pointer to data length variable -* @retval pointer to descriptor buffer -*/ -uint8_t * USBD_FS_LangIDStrDescriptor( USBD_SpeedTypeDef speed , uint16_t *length) -{ - *length = sizeof(USBD_LangIDDesc); - return USBD_LangIDDesc; -} - -/** -* @brief USBD_FS_ProductStrDescriptor -* return the product string descriptor -* @param speed : current device speed -* @param length : pointer to data length variable -* @retval pointer to descriptor buffer -*/ -uint8_t * USBD_FS_ProductStrDescriptor( USBD_SpeedTypeDef speed , uint16_t *length) -{ - if(speed == 0) - { - USBD_GetString (USBD_PRODUCT_STRING_FS, USBD_StrDesc, length); - } - else - { - USBD_GetString (USBD_PRODUCT_STRING_FS, USBD_StrDesc, length); - } - return USBD_StrDesc; -} - -/** -* @brief USBD_FS_ManufacturerStrDescriptor -* return the manufacturer string descriptor -* @param speed : current device speed -* @param length : pointer to data length variable -* @retval pointer to descriptor buffer -*/ -uint8_t * USBD_FS_ManufacturerStrDescriptor( USBD_SpeedTypeDef speed , uint16_t *length) -{ - USBD_GetString (USBD_MANUFACTURER_STRING, USBD_StrDesc, length); - return USBD_StrDesc; -} - -/** -* @brief USBD_FS_SerialStrDescriptor -* return the serial number string descriptor -* @param speed : current device speed -* @param length : pointer to data length variable -* @retval pointer to descriptor buffer -*/ -uint8_t * USBD_FS_SerialStrDescriptor( USBD_SpeedTypeDef speed , uint16_t *length) -{ - if(speed == USBD_SPEED_HIGH) - { - USBD_GetString (USBD_SERIALNUMBER_STRING_FS, USBD_StrDesc, length); - } - else - { - USBD_GetString (USBD_SERIALNUMBER_STRING_FS, USBD_StrDesc, length); - } - return USBD_StrDesc; -} - -/** -* @brief USBD_FS_ConfigStrDescriptor -* return the configuration string descriptor -* @param speed : current device speed -* @param length : pointer to data length variable -* @retval pointer to descriptor buffer -*/ -uint8_t * USBD_FS_ConfigStrDescriptor( USBD_SpeedTypeDef speed , uint16_t *length) -{ - if(speed == USBD_SPEED_HIGH) - { - USBD_GetString (USBD_CONFIGURATION_STRING_FS, USBD_StrDesc, length); - } - else - { - USBD_GetString (USBD_CONFIGURATION_STRING_FS, USBD_StrDesc, length); - } - return USBD_StrDesc; -} - -/** -* @brief USBD_HS_InterfaceStrDescriptor -* return the interface string descriptor -* @param speed : current device speed -* @param length : pointer to data length variable -* @retval pointer to descriptor buffer -*/ -uint8_t * USBD_FS_InterfaceStrDescriptor( USBD_SpeedTypeDef speed , uint16_t *length) -{ - if(speed == 0) - { - USBD_GetString (USBD_INTERFACE_STRING_FS, USBD_StrDesc, length); - } - else - { - USBD_GetString (USBD_INTERFACE_STRING_FS, USBD_StrDesc, length); - } - return USBD_StrDesc; -} -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/SCSI2SD-V6/Src/usbh_conf.c b/STM32CubeMX/SCSI2SD-V6/Src/usbh_conf.c deleted file mode 100755 index 3e203781..00000000 --- a/STM32CubeMX/SCSI2SD-V6/Src/usbh_conf.c +++ /dev/null @@ -1,476 +0,0 @@ -/** - ****************************************************************************** - * @file : usbh_conf.c - * @version : v1.0_Cube - * @brief : This file implements the board support package for the USB host library - ****************************************************************************** - * COPYRIGHT(c) 2016 STMicroelectronics - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** -*/ -/* Includes ------------------------------------------------------------------*/ -#include "usbh_core.h" - -HCD_HandleTypeDef hhcd_USB_OTG_HS; - -/******************************************************************************* - LL Driver Callbacks (HCD -> USB Host Library) -*******************************************************************************/ -/* MSP Init */ - -void HAL_HCD_MspInit(HCD_HandleTypeDef* hhcd) -{ - GPIO_InitTypeDef GPIO_InitStruct; - if(hhcd->Instance==USB_OTG_HS) - { - /* USER CODE BEGIN USB_OTG_HS_MspInit 0 */ - - /* USER CODE END USB_OTG_HS_MspInit 0 */ - - /**USB_OTG_HS GPIO Configuration - PB14 ------> USB_OTG_HS_DM - PB15 ------> USB_OTG_HS_DP - */ - GPIO_InitStruct.Pin = GPIO_PIN_14|GPIO_PIN_15; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF12_OTG_HS_FS; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - /* Peripheral clock enable */ - __USB_OTG_HS_CLK_ENABLE(); - - /* Peripheral interrupt init*/ - HAL_NVIC_SetPriority(OTG_HS_IRQn, 0, 0); - HAL_NVIC_EnableIRQ(OTG_HS_IRQn); - /* USER CODE BEGIN USB_OTG_HS_MspInit 1 */ - - /* USER CODE END USB_OTG_HS_MspInit 1 */ - } -} - -void HAL_HCD_MspDeInit(HCD_HandleTypeDef* hhcd) -{ - if(hhcd->Instance==USB_OTG_HS) - { - /* USER CODE BEGIN USB_OTG_HS_MspDeInit 0 */ - - /* USER CODE END USB_OTG_HS_MspDeInit 0 */ - /* Peripheral clock disable */ - __USB_OTG_HS_CLK_DISABLE(); - - /**USB_OTG_HS GPIO Configuration - PB14 ------> USB_OTG_HS_DM - PB15 ------> USB_OTG_HS_DP - */ - HAL_GPIO_DeInit(GPIOB, GPIO_PIN_14|GPIO_PIN_15); - - /* Peripheral interrupt Deinit*/ - HAL_NVIC_DisableIRQ(OTG_HS_IRQn); - - /* USER CODE BEGIN USB_OTG_HS_MspDeInit 1 */ - - /* USER CODE END USB_OTG_HS_MspDeInit 1 */ - } -} - -/** - * @brief SOF callback. - * @param hhcd: HCD handle - * @retval None - */ -void HAL_HCD_SOF_Callback(HCD_HandleTypeDef *hhcd) -{ - USBH_LL_IncTimer (hhcd->pData); -} - -/** - * @brief SOF callback. - * @param hhcd: HCD handle - * @retval None - */ -void HAL_HCD_Connect_Callback(HCD_HandleTypeDef *hhcd) -{ - USBH_LL_Connect(hhcd->pData); -} - -/** - * @brief SOF callback. - * @param hhcd: HCD handle - * @retval None - */ -void HAL_HCD_Disconnect_Callback(HCD_HandleTypeDef *hhcd) -{ - USBH_LL_Disconnect(hhcd->pData); -} - -/** - * @brief Notify URB state change callback. - * @param hhcd: HCD handle - * @retval None - */ -void HAL_HCD_HC_NotifyURBChange_Callback(HCD_HandleTypeDef *hhcd, uint8_t chnum, HCD_URBStateTypeDef urb_state) -{ - /* To be used with OS to sync URB state with the global state machine */ -#if (USBH_USE_OS == 1) - USBH_LL_NotifyURBChange(hhcd->pData); -#endif -} -/******************************************************************************* - LL Driver Interface (USB Host Library --> HCD) -*******************************************************************************/ -/** - * @brief USBH_LL_Init - * Initialize the Low Level portion of the Host driver. - * @param phost: Host handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_LL_Init (USBH_HandleTypeDef *phost) -{ - /* Init USB_IP */ - if (phost->id == HOST_HS) { - /* Link The driver to the stack */ - hhcd_USB_OTG_HS.pData = phost; - phost->pData = &hhcd_USB_OTG_HS; - - hhcd_USB_OTG_HS.Instance = USB_OTG_HS; - hhcd_USB_OTG_HS.Init.Host_channels = 12; - hhcd_USB_OTG_HS.Init.speed = HCD_SPEED_FULL; - hhcd_USB_OTG_HS.Init.dma_enable = DISABLE; - hhcd_USB_OTG_HS.Init.phy_itface = USB_OTG_EMBEDDED_PHY; - hhcd_USB_OTG_HS.Init.Sof_enable = DISABLE; - hhcd_USB_OTG_HS.Init.low_power_enable = DISABLE; - hhcd_USB_OTG_HS.Init.vbus_sensing_enable = DISABLE; - hhcd_USB_OTG_HS.Init.use_external_vbus = DISABLE; - HAL_HCD_Init(&hhcd_USB_OTG_HS); - - USBH_LL_SetTimer (phost, HAL_HCD_GetCurrentFrame(&hhcd_USB_OTG_HS)); - } - return USBH_OK; -} - -/** - * @brief USBH_LL_DeInit - * De-Initialize the Low Level portion of the Host driver. - * @param phost: Host handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_LL_DeInit (USBH_HandleTypeDef *phost) -{ - HAL_HCD_DeInit(phost->pData); - return USBH_OK; -} - -/** - * @brief USBH_LL_Start - * Start the Low Level portion of the Host driver. - * @param phost: Host handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_LL_Start(USBH_HandleTypeDef *phost) -{ - HAL_HCD_Start(phost->pData); - return USBH_OK; -} - -/** - * @brief USBH_LL_Stop - * Stop the Low Level portion of the Host driver. - * @param phost: Host handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_LL_Stop (USBH_HandleTypeDef *phost) -{ - HAL_HCD_Stop(phost->pData); - return USBH_OK; -} - -/** - * @brief USBH_LL_GetSpeed - * Return the USB Host Speed from the Low Level Driver. - * @param phost: Host handle - * @retval USBH Speeds - */ -USBH_SpeedTypeDef USBH_LL_GetSpeed (USBH_HandleTypeDef *phost) -{ - USBH_SpeedTypeDef speed = USBH_SPEED_FULL; - - switch (HAL_HCD_GetCurrentSpeed(phost->pData)) - { - case 0 : - speed = USBH_SPEED_HIGH; - break; - - case 1 : - speed = USBH_SPEED_FULL; - break; - - case 2 : - speed = USBH_SPEED_LOW; - break; - - default: - speed = USBH_SPEED_FULL; - break; - } - return speed; -} - -/** - * @brief USBH_LL_ResetPort - * Reset the Host Port of the Low Level Driver. - * @param phost: Host handle - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_LL_ResetPort (USBH_HandleTypeDef *phost) -{ - HAL_HCD_ResetPort(phost->pData); - return USBH_OK; -} - -/** - * @brief USBH_LL_GetLastXferSize - * Return the last transfered packet size. - * @param phost: Host handle - * @param pipe: Pipe index - * @retval Packet Size - */ -uint32_t USBH_LL_GetLastXferSize (USBH_HandleTypeDef *phost, uint8_t pipe) -{ - return HAL_HCD_HC_GetXferCount(phost->pData, pipe); -} - -/** - * @brief USBH_LL_OpenPipe - * Open a pipe of the Low Level Driver. - * @param phost: Host handle - * @param pipe_num: Pipe index - * @param epnum: Endpoint Number - * @param dev_address: Device USB address - * @param speed: Device Speed - * @param ep_type: Endpoint Type - * @param mps: Endpoint Max Packet Size - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_LL_OpenPipe (USBH_HandleTypeDef *phost, - uint8_t pipe_num, - uint8_t epnum, - uint8_t dev_address, - uint8_t speed, - uint8_t ep_type, - uint16_t mps) -{ - HAL_HCD_HC_Init(phost->pData, - pipe_num, - epnum, - dev_address, - speed, - ep_type, - mps); - return USBH_OK; -} - -/** - * @brief USBH_LL_ClosePipe - * Close a pipe of the Low Level Driver. - * @param phost: Host handle - * @param pipe_num: Pipe index - * @retval USBH Status - */ -USBH_StatusTypeDef USBH_LL_ClosePipe (USBH_HandleTypeDef *phost, uint8_t pipe) -{ - HAL_HCD_HC_Halt(phost->pData, pipe); - return USBH_OK; -} - -/** - * @brief USBH_LL_SubmitURB - * Submit a new URB to the low level driver. - * @param phost: Host handle - * @param pipe: Pipe index - * This parameter can be a value from 1 to 15 - * @param direction : Channel number - * This parameter can be one of the these values: - * 0 : Output - * 1 : Input - * @param ep_type : Endpoint Type - * This parameter can be one of the these values: - * @arg EP_TYPE_CTRL: Control type - * @arg EP_TYPE_ISOC: Isochrounous type - * @arg EP_TYPE_BULK: Bulk type - * @arg EP_TYPE_INTR: Interrupt type - * @param token : Endpoint Type - * This parameter can be one of the these values: - * @arg 0: PID_SETUP - * @arg 1: PID_DATA - * @param pbuff : pointer to URB data - * @param length : Length of URB data - * @param do_ping : activate do ping protocol (for high speed only) - * This parameter can be one of the these values: - * 0 : do ping inactive - * 1 : do ping active - * @retval Status - */ - -USBH_StatusTypeDef USBH_LL_SubmitURB (USBH_HandleTypeDef *phost, - uint8_t pipe, - uint8_t direction , - uint8_t ep_type, - uint8_t token, - uint8_t* pbuff, - uint16_t length, - uint8_t do_ping ) -{ - HAL_HCD_HC_SubmitRequest (phost->pData, - pipe, - direction , - ep_type, - token, - pbuff, - length, - do_ping); - return USBH_OK; -} - -/** - * @brief USBH_LL_GetURBState - * Get a URB state from the low level driver. - * @param phost: Host handle - * @param pipe: Pipe index - * This parameter can be a value from 1 to 15 - * @retval URB state - * This parameter can be one of the these values: - * @arg URB_IDLE - * @arg URB_DONE - * @arg URB_NOTREADY - * @arg URB_NYET - * @arg URB_ERROR - * @arg URB_STALL - */ -USBH_URBStateTypeDef USBH_LL_GetURBState (USBH_HandleTypeDef *phost, uint8_t pipe) -{ - return (USBH_URBStateTypeDef)HAL_HCD_HC_GetURBState (phost->pData, pipe); -} - -/** - * @brief USBH_LL_DriverVBUS - * Drive VBUS. - * @param phost: Host handle - * @param state : VBUS state - * This parameter can be one of the these values: - * 0 : VBUS Active - * 1 : VBUS Inactive - * @retval Status - */ -USBH_StatusTypeDef USBH_LL_DriverVBUS (USBH_HandleTypeDef *phost, uint8_t state) -{ - - /* USER CODE BEGIN 0 */ - /* USER CODE END 0*/ - if (phost->id == HOST_HS) - { - if (state == 0) - { - /* Drive high Charge pump */ - /* ToDo: Add IOE driver control */ - /* USER CODE BEGIN DRIVE_HIGH_CHARGE_FOR_HS */ - - /* USER CODE END DRIVE_HIGH_CHARGE_FOR_HS */ - } - else - { - /* Drive low Charge pump */ - /* ToDo: Add IOE driver control */ - /* USER CODE BEGIN DRIVE_LOW_CHARGE_FOR_HS */ - - /* USER CODE BEGIN DRIVE_LOW_CHARGE_FOR_HS */ - } - } - HAL_Delay(200); - return USBH_OK; -} - -/** - * @brief USBH_LL_SetToggle - * Set toggle for a pipe. - * @param phost: Host handle - * @param pipe: Pipe index - * @param pipe_num: Pipe index - * @param toggle: toggle (0/1) - * @retval Status - */ -USBH_StatusTypeDef USBH_LL_SetToggle (USBH_HandleTypeDef *phost, uint8_t pipe, uint8_t toggle) -{ - HCD_HandleTypeDef *pHandle; - pHandle = phost->pData; - - if(pHandle->hc[pipe].ep_is_in) - { - pHandle->hc[pipe].toggle_in = toggle; - } - else - { - pHandle->hc[pipe].toggle_out = toggle; - } - - return USBH_OK; -} - -/** - * @brief USBH_LL_GetToggle - * Return the current toggle of a pipe. - * @param phost: Host handle - * @param pipe: Pipe index - * @retval toggle (0/1) - */ -uint8_t USBH_LL_GetToggle (USBH_HandleTypeDef *phost, uint8_t pipe) -{ - uint8_t toggle = 0; - HCD_HandleTypeDef *pHandle; - pHandle = phost->pData; - - if(pHandle->hc[pipe].ep_is_in) - { - toggle = pHandle->hc[pipe].toggle_in; - } - else - { - toggle = pHandle->hc[pipe].toggle_out; - } - return toggle; -} - -/** - * @brief USBH_Delay - * Delay routine for the USB Host Library - * @param Delay: Delay in ms - * @retval None - */ -void USBH_Delay (uint32_t Delay) -{ - HAL_Delay(Delay); -} -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/STM32CubeMX/readme.txt b/STM32CubeMX/readme.txt deleted file mode 100644 index eeff68b9..00000000 --- a/STM32CubeMX/readme.txt +++ /dev/null @@ -1,4 +0,0 @@ -The STM32CubeMX project file is out-of-date. -I've modified some of the generated files, so re-generating via -STM32CubeMX is likely to break the firmware. - diff --git a/STM32CubeMX/revF/.mxproject b/STM32CubeMX/revF/.mxproject new file mode 100644 index 00000000..7b0bf64a --- /dev/null +++ b/STM32CubeMX/revF/.mxproject @@ -0,0 +1,14 @@ +[PreviousGenFiles] +HeaderPath=C:/Users/Michael/projects/SCSI2SD-V6/STM32CubeMX/revF/Inc +SourcePath=C:/Users/Michael/projects/SCSI2SD-V6/STM32CubeMX/revF/Src +SourceFiles=gpio.h;dma.h;ffconf.h;bsp_driver_sd.h;fatfs.h;fsmc.h;sdio.h;spi.h;tim.h;usart.h;usb_device.h;usbd_conf.h;usbd_desc.h;usbd_storage_if.h;usb_host.h;usbh_conf.h;stm32f2xx_it.h;stm32f2xx_hal_conf.h;mxconstants.h;gpio.c;dma.c;bsp_driver_sd.c;fatfs.c;fsmc.c;sdio.c;spi.c;tim.c;usart.c;usb_device.c;usbd_conf.c;usbd_desc.c;usbd_storage_if.c;usb_host.c;usbh_conf.c;stm32f2xx_it.c;stm32f2xx_hal_msp.c;main.c;sys.c; +HeaderFiles=gpio.h;dma.h;ffconf.h;bsp_driver_sd.h;fatfs.h;fsmc.h;sdio.h;spi.h;tim.h;usart.h;usb_device.h;usbd_conf.h;usbd_desc.h;usbd_storage_if.h;usb_host.h;usbh_conf.h;stm32f2xx_it.h;stm32f2xx_hal_conf.h;;sys.h;main.h; + +[PreviousLibFiles] +LibFiles=Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_pcd_ex.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_pcd.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_usb.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_def.h;Drivers/STM32F2xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_rcc.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_rcc_ex.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_cortex.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_flash.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_flash_ex.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_pwr.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_pwr_ex.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_gpio.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_gpio_ex.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_dma.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_dma_ex.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_exti.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_fsmc.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_sram.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_sdmmc.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_sd.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_spi.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_tim.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_tim_ex.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_uart.h;Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_core.h;Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h;Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_def.h;Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ioreq.h;Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc.h;Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc_bot.h;Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc_data.h;Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc_scsi.h;Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_pcd_ex.c;Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_pcd.c;Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_usb.c;Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal.c;Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_rcc.c;Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_rcc_ex.c;Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_cortex.c;Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_flash.c;Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_flash_ex.c;Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_pwr.c;Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_pwr_ex.c;Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_gpio.c;Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_dma.c;Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_dma_ex.c;Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_exti.c;Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_fsmc.c;Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_sram.c;Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_sdmmc.c;Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_sd.c;Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_spi.c;Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_tim.c;Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_tim_ex.c;Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_uart.c;Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c;Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c;Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c;Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc.c;Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc_bot.c;Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc_data.c;Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc_scsi.c;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_pcd_ex.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_pcd.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_usb.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_def.h;Drivers/STM32F2xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_rcc.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_rcc_ex.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_cortex.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_flash.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_flash_ex.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_pwr.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_pwr_ex.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_gpio.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_gpio_ex.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_dma.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_dma_ex.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_exti.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_fsmc.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_sram.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_ll_sdmmc.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_sd.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_spi.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_tim.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_tim_ex.h;Drivers/STM32F2xx_HAL_Driver/Inc/stm32f2xx_hal_uart.h;Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_core.h;Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h;Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_def.h;Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_ioreq.h;Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc.h;Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc_bot.h;Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc_data.h;Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc_scsi.h;Drivers/CMSIS/Device/ST/STM32F2xx/Include/stm32f205xx.h;Drivers/CMSIS/Device/ST/STM32F2xx/Include/stm32f2xx.h;Drivers/CMSIS/Device/ST/STM32F2xx/Include/system_stm32f2xx.h;Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/system_stm32f2xx.c;Drivers/CMSIS/Include/cmsis_armcc.h;Drivers/CMSIS/Include/cmsis_armclang.h;Drivers/CMSIS/Include/cmsis_compiler.h;Drivers/CMSIS/Include/cmsis_gcc.h;Drivers/CMSIS/Include/cmsis_iccarm.h;Drivers/CMSIS/Include/cmsis_version.h;Drivers/CMSIS/Include/core_armv8mbl.h;Drivers/CMSIS/Include/core_armv8mml.h;Drivers/CMSIS/Include/core_cm0.h;Drivers/CMSIS/Include/core_cm0plus.h;Drivers/CMSIS/Include/core_cm1.h;Drivers/CMSIS/Include/core_cm23.h;Drivers/CMSIS/Include/core_cm3.h;Drivers/CMSIS/Include/core_cm33.h;Drivers/CMSIS/Include/core_cm4.h;Drivers/CMSIS/Include/core_cm7.h;Drivers/CMSIS/Include/core_sc000.h;Drivers/CMSIS/Include/core_sc300.h;Drivers/CMSIS/Include/mpu_armv7.h;Drivers/CMSIS/Include/mpu_armv8.h;Drivers/CMSIS/Include/tz_context.h; + +[PreviousUsedTStudioFiles] +HeaderPath=..\Drivers\STM32F2xx_HAL_Driver\Inc;..\Drivers\STM32F2xx_HAL_Driver\Inc\Legacy;..\Middlewares\ST\STM32_USB_Device_Library\Core\Inc;..\Middlewares\ST\STM32_USB_Device_Library\Class\MSC\Inc;..\Drivers\CMSIS\Device\ST\STM32F2xx\Include;..\Drivers\CMSIS\Include;..\Inc; +SourceFiles=..\Src\main.c;..\Src\gpio.c;..\Src\dma.c;..\Src\fsmc.c;..\Src\sdio.c;..\Src\spi.c;..\Src\sys.c;..\Src\tim.c;..\Src\usart.c;..\Src\usb_device.c;..\Src\usbd_conf.c;..\Src\usbd_desc.c;..\Src\usbd_storage_if.c;..\Src\stm32f2xx_it.c;..\Src\stm32f2xx_hal_msp.c;..\Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_pcd_ex.c;..\Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_pcd.c;..\Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_usb.c;..\Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal.c;..\Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_rcc.c;..\Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_rcc_ex.c;..\Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_cortex.c;..\Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_flash.c;..\Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_flash_ex.c;..\Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_pwr.c;..\Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_pwr_ex.c;..\Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_gpio.c;..\Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_dma.c;..\Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_dma_ex.c;..\Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_exti.c;..\Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_fsmc.c;..\Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_sram.c;..\Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_sdmmc.c;..\Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_sd.c;..\Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_spi.c;..\Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_tim.c;..\Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_tim_ex.c;..\Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_uart.c;..\Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c;..\Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c;..\Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c;..\Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc.c;..\Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc_bot.c;..\Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc_data.c;..\Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc_scsi.c;..\\Src/system_stm32f2xx.c;..\Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_pcd_ex.c;..\Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_pcd.c;..\Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_usb.c;..\Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal.c;..\Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_rcc.c;..\Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_rcc_ex.c;..\Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_cortex.c;..\Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_flash.c;..\Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_flash_ex.c;..\Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_pwr.c;..\Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_pwr_ex.c;..\Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_gpio.c;..\Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_dma.c;..\Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_dma_ex.c;..\Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_exti.c;..\Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_fsmc.c;..\Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_sram.c;..\Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_ll_sdmmc.c;..\Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_sd.c;..\Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_spi.c;..\Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_tim.c;..\Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_tim_ex.c;..\Drivers/STM32F2xx_HAL_Driver/Src/stm32f2xx_hal_uart.c;..\Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c;..\Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c;..\Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c;..\Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc.c;..\Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc_bot.c;..\Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc_data.c;..\Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc_scsi.c;..\\Src/system_stm32f2xx.c;..\Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/system_stm32f2xx.c;;..\Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c;..\Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c;..\Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c;..\Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc.c;..\Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc_bot.c;..\Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc_data.c;..\Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc_scsi.c; +CDefines=__weak:__attribute__((weak));__packed:__attribute__((__packed__));USE_HAL_DRIVER;STM32F205xx;USE_HAL_DRIVER;USE_HAL_DRIVER; + diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/cmsis_armcc.h b/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/cmsis_armcc.h new file mode 100644 index 00000000..4d9d0645 --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/cmsis_armcc.h @@ -0,0 +1,865 @@ +/**************************************************************************//** + * @file cmsis_armcc.h + * @brief CMSIS compiler ARMCC (Arm Compiler 5) header file + * @version V5.0.4 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CMSIS_ARMCC_H +#define __CMSIS_ARMCC_H + + +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 400677) + #error "Please use Arm Compiler Toolchain V4.0.677 or later!" +#endif + +/* CMSIS compiler control architecture macros */ +#if ((defined (__TARGET_ARCH_6_M ) && (__TARGET_ARCH_6_M == 1)) || \ + (defined (__TARGET_ARCH_6S_M ) && (__TARGET_ARCH_6S_M == 1)) ) + #define __ARM_ARCH_6M__ 1 +#endif + +#if (defined (__TARGET_ARCH_7_M ) && (__TARGET_ARCH_7_M == 1)) + #define __ARM_ARCH_7M__ 1 +#endif + +#if (defined (__TARGET_ARCH_7E_M) && (__TARGET_ARCH_7E_M == 1)) + #define __ARM_ARCH_7EM__ 1 +#endif + + /* __ARM_ARCH_8M_BASE__ not applicable */ + /* __ARM_ARCH_8M_MAIN__ not applicable */ + + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM __asm +#endif +#ifndef __INLINE + #define __INLINE __inline +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static __inline +#endif +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE static __forceinline +#endif +#ifndef __NO_RETURN + #define __NO_RETURN __declspec(noreturn) +#endif +#ifndef __USED + #define __USED __attribute__((used)) +#endif +#ifndef __WEAK + #define __WEAK __attribute__((weak)) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed)) +#endif +#ifndef __PACKED_STRUCT + #define __PACKED_STRUCT __packed struct +#endif +#ifndef __PACKED_UNION + #define __PACKED_UNION __packed union +#endif +#ifndef __UNALIGNED_UINT32 /* deprecated */ + #define __UNALIGNED_UINT32(x) (*((__packed uint32_t *)(x))) +#endif +#ifndef __UNALIGNED_UINT16_WRITE + #define __UNALIGNED_UINT16_WRITE(addr, val) ((*((__packed uint16_t *)(addr))) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ + #define __UNALIGNED_UINT16_READ(addr) (*((const __packed uint16_t *)(addr))) +#endif +#ifndef __UNALIGNED_UINT32_WRITE + #define __UNALIGNED_UINT32_WRITE(addr, val) ((*((__packed uint32_t *)(addr))) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #define __UNALIGNED_UINT32_READ(addr) (*((const __packed uint32_t *)(addr))) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +/** + \brief Enable IRQ Interrupts + \details Enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __enable_irq(); */ + + +/** + \brief Disable IRQ Interrupts + \details Disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __disable_irq(); */ + +/** + \brief Get Control Register + \details Returns the content of the Control Register. + \return Control Register value + */ +__STATIC_INLINE uint32_t __get_CONTROL(void) +{ + register uint32_t __regControl __ASM("control"); + return(__regControl); +} + + +/** + \brief Set Control Register + \details Writes the given value to the Control Register. + \param [in] control Control Register value to set + */ +__STATIC_INLINE void __set_CONTROL(uint32_t control) +{ + register uint32_t __regControl __ASM("control"); + __regControl = control; +} + + +/** + \brief Get IPSR Register + \details Returns the content of the IPSR Register. + \return IPSR Register value + */ +__STATIC_INLINE uint32_t __get_IPSR(void) +{ + register uint32_t __regIPSR __ASM("ipsr"); + return(__regIPSR); +} + + +/** + \brief Get APSR Register + \details Returns the content of the APSR Register. + \return APSR Register value + */ +__STATIC_INLINE uint32_t __get_APSR(void) +{ + register uint32_t __regAPSR __ASM("apsr"); + return(__regAPSR); +} + + +/** + \brief Get xPSR Register + \details Returns the content of the xPSR Register. + \return xPSR Register value + */ +__STATIC_INLINE uint32_t __get_xPSR(void) +{ + register uint32_t __regXPSR __ASM("xpsr"); + return(__regXPSR); +} + + +/** + \brief Get Process Stack Pointer + \details Returns the current value of the Process Stack Pointer (PSP). + \return PSP Register value + */ +__STATIC_INLINE uint32_t __get_PSP(void) +{ + register uint32_t __regProcessStackPointer __ASM("psp"); + return(__regProcessStackPointer); +} + + +/** + \brief Set Process Stack Pointer + \details Assigns the given value to the Process Stack Pointer (PSP). + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_INLINE void __set_PSP(uint32_t topOfProcStack) +{ + register uint32_t __regProcessStackPointer __ASM("psp"); + __regProcessStackPointer = topOfProcStack; +} + + +/** + \brief Get Main Stack Pointer + \details Returns the current value of the Main Stack Pointer (MSP). + \return MSP Register value + */ +__STATIC_INLINE uint32_t __get_MSP(void) +{ + register uint32_t __regMainStackPointer __ASM("msp"); + return(__regMainStackPointer); +} + + +/** + \brief Set Main Stack Pointer + \details Assigns the given value to the Main Stack Pointer (MSP). + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) +{ + register uint32_t __regMainStackPointer __ASM("msp"); + __regMainStackPointer = topOfMainStack; +} + + +/** + \brief Get Priority Mask + \details Returns the current state of the priority mask bit from the Priority Mask Register. + \return Priority Mask value + */ +__STATIC_INLINE uint32_t __get_PRIMASK(void) +{ + register uint32_t __regPriMask __ASM("primask"); + return(__regPriMask); +} + + +/** + \brief Set Priority Mask + \details Assigns the given value to the Priority Mask Register. + \param [in] priMask Priority Mask + */ +__STATIC_INLINE void __set_PRIMASK(uint32_t priMask) +{ + register uint32_t __regPriMask __ASM("primask"); + __regPriMask = (priMask); +} + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + +/** + \brief Enable FIQ + \details Enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __enable_fault_irq __enable_fiq + + +/** + \brief Disable FIQ + \details Disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __disable_fault_irq __disable_fiq + + +/** + \brief Get Base Priority + \details Returns the current value of the Base Priority register. + \return Base Priority register value + */ +__STATIC_INLINE uint32_t __get_BASEPRI(void) +{ + register uint32_t __regBasePri __ASM("basepri"); + return(__regBasePri); +} + + +/** + \brief Set Base Priority + \details Assigns the given value to the Base Priority register. + \param [in] basePri Base Priority value to set + */ +__STATIC_INLINE void __set_BASEPRI(uint32_t basePri) +{ + register uint32_t __regBasePri __ASM("basepri"); + __regBasePri = (basePri & 0xFFU); +} + + +/** + \brief Set Base Priority with condition + \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, + or the new value increases the BASEPRI priority level. + \param [in] basePri Base Priority value to set + */ +__STATIC_INLINE void __set_BASEPRI_MAX(uint32_t basePri) +{ + register uint32_t __regBasePriMax __ASM("basepri_max"); + __regBasePriMax = (basePri & 0xFFU); +} + + +/** + \brief Get Fault Mask + \details Returns the current value of the Fault Mask register. + \return Fault Mask register value + */ +__STATIC_INLINE uint32_t __get_FAULTMASK(void) +{ + register uint32_t __regFaultMask __ASM("faultmask"); + return(__regFaultMask); +} + + +/** + \brief Set Fault Mask + \details Assigns the given value to the Fault Mask register. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask) +{ + register uint32_t __regFaultMask __ASM("faultmask"); + __regFaultMask = (faultMask & (uint32_t)1U); +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ + + +/** + \brief Get FPSCR + \details Returns the current value of the Floating Point Status/Control register. + \return Floating Point Status/Control register value + */ +__STATIC_INLINE uint32_t __get_FPSCR(void) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + register uint32_t __regfpscr __ASM("fpscr"); + return(__regfpscr); +#else + return(0U); +#endif +} + + +/** + \brief Set FPSCR + \details Assigns the given value to the Floating Point Status/Control register. + \param [in] fpscr Floating Point Status/Control value to set + */ +__STATIC_INLINE void __set_FPSCR(uint32_t fpscr) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + register uint32_t __regfpscr __ASM("fpscr"); + __regfpscr = (fpscr); +#else + (void)fpscr; +#endif +} + + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +/** + \brief No Operation + \details No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP __nop + + +/** + \brief Wait For Interrupt + \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. + */ +#define __WFI __wfi + + +/** + \brief Wait For Event + \details Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE __wfe + + +/** + \brief Send Event + \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV __sev + + +/** + \brief Instruction Synchronization Barrier + \details Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or memory, + after the instruction has been completed. + */ +#define __ISB() do {\ + __schedule_barrier();\ + __isb(0xF);\ + __schedule_barrier();\ + } while (0U) + +/** + \brief Data Synchronization Barrier + \details Acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +#define __DSB() do {\ + __schedule_barrier();\ + __dsb(0xF);\ + __schedule_barrier();\ + } while (0U) + +/** + \brief Data Memory Barrier + \details Ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +#define __DMB() do {\ + __schedule_barrier();\ + __dmb(0xF);\ + __schedule_barrier();\ + } while (0U) + + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV __rev + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. + \param [in] value Value to reverse + \return Reversed value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value) +{ + rev16 r0, r0 + bx lr +} +#endif + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. + \param [in] value Value to reverse + \return Reversed value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int16_t __REVSH(int16_t value) +{ + revsh r0, r0 + bx lr +} +#endif + + +/** + \brief Rotate Right in unsigned value (32 bit) + \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + \param [in] op1 Value to rotate + \param [in] op2 Number of Bits to rotate + \return Rotated value + */ +#define __ROR __ror + + +/** + \brief Breakpoint + \details Causes the processor to enter Debug state. + Debug tools can use this to investigate system state when the instruction at a particular address is reached. + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __breakpoint(value) + + +/** + \brief Reverse bit order of value + \details Reverses the bit order of the given value. + \param [in] value Value to reverse + \return Reversed value + */ +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + #define __RBIT __rbit +#else +__attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value) +{ + uint32_t result; + uint32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */ + + result = value; /* r will be reversed bits of v; first get LSB of v */ + for (value >>= 1U; value != 0U; value >>= 1U) + { + result <<= 1U; + result |= value & 1U; + s--; + } + result <<= s; /* shift when v's highest bits are zero */ + return result; +} +#endif + + +/** + \brief Count leading zeros + \details Counts the number of leading zeros of a data value. + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +#define __CLZ __clz + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr)) +#else + #define __LDREXB(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint8_t ) __ldrex(ptr)) _Pragma("pop") +#endif + + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __LDREXH(ptr) ((uint16_t) __ldrex(ptr)) +#else + #define __LDREXH(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint16_t) __ldrex(ptr)) _Pragma("pop") +#endif + + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr)) +#else + #define __LDREXW(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint32_t ) __ldrex(ptr)) _Pragma("pop") +#endif + + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __STREXB(value, ptr) __strex(value, ptr) +#else + #define __STREXB(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") +#endif + + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __STREXH(value, ptr) __strex(value, ptr) +#else + #define __STREXH(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") +#endif + + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __STREXW(value, ptr) __strex(value, ptr) +#else + #define __STREXW(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") +#endif + + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +#define __CLREX __clrex + + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT __ssat + + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT __usat + + +/** + \brief Rotate Right with Extend (32 bit) + \details Moves each bit of a bitstring right by one bit. + The carry input is shifted in at the left end of the bitstring. + \param [in] value Value to rotate + \return Rotated value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".rrx_text"))) __STATIC_INLINE __ASM uint32_t __RRX(uint32_t value) +{ + rrx r0, r0 + bx lr +} +#endif + + +/** + \brief LDRT Unprivileged (8 bit) + \details Executes a Unprivileged LDRT instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDRBT(ptr) ((uint8_t ) __ldrt(ptr)) + + +/** + \brief LDRT Unprivileged (16 bit) + \details Executes a Unprivileged LDRT instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDRHT(ptr) ((uint16_t) __ldrt(ptr)) + + +/** + \brief LDRT Unprivileged (32 bit) + \details Executes a Unprivileged LDRT instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDRT(ptr) ((uint32_t ) __ldrt(ptr)) + + +/** + \brief STRT Unprivileged (8 bit) + \details Executes a Unprivileged STRT instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +#define __STRBT(value, ptr) __strt(value, ptr) + + +/** + \brief STRT Unprivileged (16 bit) + \details Executes a Unprivileged STRT instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +#define __STRHT(value, ptr) __strt(value, ptr) + + +/** + \brief STRT Unprivileged (32 bit) + \details Executes a Unprivileged STRT instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +#define __STRT(value, ptr) __strt(value, ptr) + +#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +__attribute__((always_inline)) __STATIC_INLINE int32_t __SSAT(int32_t val, uint32_t sat) +{ + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; +} + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __USAT(int32_t val, uint32_t sat) +{ + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +#if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + +#define __SADD8 __sadd8 +#define __QADD8 __qadd8 +#define __SHADD8 __shadd8 +#define __UADD8 __uadd8 +#define __UQADD8 __uqadd8 +#define __UHADD8 __uhadd8 +#define __SSUB8 __ssub8 +#define __QSUB8 __qsub8 +#define __SHSUB8 __shsub8 +#define __USUB8 __usub8 +#define __UQSUB8 __uqsub8 +#define __UHSUB8 __uhsub8 +#define __SADD16 __sadd16 +#define __QADD16 __qadd16 +#define __SHADD16 __shadd16 +#define __UADD16 __uadd16 +#define __UQADD16 __uqadd16 +#define __UHADD16 __uhadd16 +#define __SSUB16 __ssub16 +#define __QSUB16 __qsub16 +#define __SHSUB16 __shsub16 +#define __USUB16 __usub16 +#define __UQSUB16 __uqsub16 +#define __UHSUB16 __uhsub16 +#define __SASX __sasx +#define __QASX __qasx +#define __SHASX __shasx +#define __UASX __uasx +#define __UQASX __uqasx +#define __UHASX __uhasx +#define __SSAX __ssax +#define __QSAX __qsax +#define __SHSAX __shsax +#define __USAX __usax +#define __UQSAX __uqsax +#define __UHSAX __uhsax +#define __USAD8 __usad8 +#define __USADA8 __usada8 +#define __SSAT16 __ssat16 +#define __USAT16 __usat16 +#define __UXTB16 __uxtb16 +#define __UXTAB16 __uxtab16 +#define __SXTB16 __sxtb16 +#define __SXTAB16 __sxtab16 +#define __SMUAD __smuad +#define __SMUADX __smuadx +#define __SMLAD __smlad +#define __SMLADX __smladx +#define __SMLALD __smlald +#define __SMLALDX __smlaldx +#define __SMUSD __smusd +#define __SMUSDX __smusdx +#define __SMLSD __smlsd +#define __SMLSDX __smlsdx +#define __SMLSLD __smlsld +#define __SMLSLDX __smlsldx +#define __SEL __sel +#define __QADD __qadd +#define __QSUB __qsub + +#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ + ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) + +#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ + ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) + +#define __SMMLA(ARG1,ARG2,ARG3) ( (int32_t)((((int64_t)(ARG1) * (ARG2)) + \ + ((int64_t)(ARG3) << 32U) ) >> 32U)) + +#endif /* ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ +/*@} end of group CMSIS_SIMD_intrinsics */ + + +#endif /* __CMSIS_ARMCC_H */ diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/cmsis_armclang.h b/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/cmsis_armclang.h new file mode 100644 index 00000000..162a400e --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/cmsis_armclang.h @@ -0,0 +1,1869 @@ +/**************************************************************************//** + * @file cmsis_armclang.h + * @brief CMSIS compiler armclang (Arm Compiler 6) header file + * @version V5.0.4 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*lint -esym(9058, IRQn)*/ /* disable MISRA 2012 Rule 2.4 for IRQn */ + +#ifndef __CMSIS_ARMCLANG_H +#define __CMSIS_ARMCLANG_H + +#pragma clang system_header /* treat file as system include file */ + +#ifndef __ARM_COMPAT_H +#include /* Compatibility header for Arm Compiler 5 intrinsics */ +#endif + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM __asm +#endif +#ifndef __INLINE + #define __INLINE __inline +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static __inline +#endif +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __attribute__((always_inline)) static __inline +#endif +#ifndef __NO_RETURN + #define __NO_RETURN __attribute__((__noreturn__)) +#endif +#ifndef __USED + #define __USED __attribute__((used)) +#endif +#ifndef __WEAK + #define __WEAK __attribute__((weak)) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_UNION + #define __PACKED_UNION union __attribute__((packed, aligned(1))) +#endif +#ifndef __UNALIGNED_UINT32 /* deprecated */ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32 */ + struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) +#endif +#ifndef __UNALIGNED_UINT16_WRITE + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT16_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_WRITE */ + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT16_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_READ */ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) +#endif +#ifndef __UNALIGNED_UINT32_WRITE + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_WRITE */ + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_READ */ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif + + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +/** + \brief Enable IRQ Interrupts + \details Enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __enable_irq(); see arm_compat.h */ + + +/** + \brief Disable IRQ Interrupts + \details Disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __disable_irq(); see arm_compat.h */ + + +/** + \brief Get Control Register + \details Returns the content of the Control Register. + \return Control Register value + */ +__STATIC_FORCEINLINE uint32_t __get_CONTROL(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Control Register (non-secure) + \details Returns the content of the non-secure Control Register when in secure mode. + \return non-secure Control Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Control Register + \details Writes the given value to the Control Register. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) +{ + __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Control Register (non-secure) + \details Writes the given value to the non-secure Control Register when in secure state. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) +{ + __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); +} +#endif + + +/** + \brief Get IPSR Register + \details Returns the content of the IPSR Register. + \return IPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_IPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get APSR Register + \details Returns the content of the APSR Register. + \return APSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_APSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, apsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get xPSR Register + \details Returns the content of the xPSR Register. + \return xPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_xPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get Process Stack Pointer + \details Returns the current value of the Process Stack Pointer (PSP). + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSP(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, psp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer (non-secure) + \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state. + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Process Stack Pointer + \details Assigns the given value to the Process Stack Pointer (PSP). + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state. + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); +} +#endif + + +/** + \brief Get Main Stack Pointer + \details Returns the current value of the Main Stack Pointer (MSP). + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSP(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, msp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer (non-secure) + \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state. + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Main Stack Pointer + \details Assigns the given value to the Main Stack Pointer (MSP). + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); +} +#endif + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Stack Pointer (non-secure) + \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. + \return SP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); + return(result); +} + + +/** + \brief Set Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. + \param [in] topOfStack Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) +{ + __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); +} +#endif + + +/** + \brief Get Priority Mask + \details Returns the current state of the priority mask bit from the Priority Mask Register. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Priority Mask (non-secure) + \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Priority Mask + \details Assigns the given value to the Priority Mask Register. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) +{ + __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Priority Mask (non-secure) + \details Assigns the given value to the non-secure Priority Mask Register when in secure state. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) +{ + __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); +} +#endif + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Enable FIQ + \details Enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __enable_fault_irq __enable_fiq /* see arm_compat.h */ + + +/** + \brief Disable FIQ + \details Disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __disable_fault_irq __disable_fiq /* see arm_compat.h */ + + +/** + \brief Get Base Priority + \details Returns the current value of the Base Priority register. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Base Priority (non-secure) + \details Returns the current value of the non-secure Base Priority register when in secure state. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Base Priority + \details Assigns the given value to the Base Priority register. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) +{ + __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Base Priority (non-secure) + \details Assigns the given value to the non-secure Base Priority register when in secure state. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); +} +#endif + + +/** + \brief Set Base Priority with condition + \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, + or the new value increases the BASEPRI priority level. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); +} + + +/** + \brief Get Fault Mask + \details Returns the current value of the Fault Mask register. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Fault Mask (non-secure) + \details Returns the current value of the non-secure Fault Mask register when in secure state. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Fault Mask + \details Assigns the given value to the Fault Mask register. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Fault Mask (non-secure) + \details Assigns the given value to the non-secure Fault Mask register when in secure state. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); +} +#endif + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + +/** + \brief Get Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, psplim" : "=r" (result) ); + return result; +#endif +} + +#if (defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); +#endif +} +#endif + + +/** + \brief Get Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, msplim" : "=r" (result) ); + return result; +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state. + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). + \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state. + \param [in] MainStackPtrLimit Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); +#endif +} +#endif + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + +/** + \brief Get FPSCR + \details Returns the current value of the Floating Point Status/Control register. + \return Floating Point Status/Control register value + */ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#define __get_FPSCR (uint32_t)__builtin_arm_get_fpscr +#else +#define __get_FPSCR() ((uint32_t)0U) +#endif + +/** + \brief Set FPSCR + \details Assigns the given value to the Floating Point Status/Control register. + \param [in] fpscr Floating Point Status/Control value to set + */ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#define __set_FPSCR __builtin_arm_set_fpscr +#else +#define __set_FPSCR(x) ((void)(x)) +#endif + + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +/* Define macros for porting to both thumb1 and thumb2. + * For thumb1, use low register (r0-r7), specified by constraint "l" + * Otherwise, use general registers, specified by constraint "r" */ +#if defined (__thumb__) && !defined (__thumb2__) +#define __CMSIS_GCC_OUT_REG(r) "=l" (r) +#define __CMSIS_GCC_USE_REG(r) "l" (r) +#else +#define __CMSIS_GCC_OUT_REG(r) "=r" (r) +#define __CMSIS_GCC_USE_REG(r) "r" (r) +#endif + +/** + \brief No Operation + \details No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP __builtin_arm_nop + +/** + \brief Wait For Interrupt + \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. + */ +#define __WFI __builtin_arm_wfi + + +/** + \brief Wait For Event + \details Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE __builtin_arm_wfe + + +/** + \brief Send Event + \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV __builtin_arm_sev + + +/** + \brief Instruction Synchronization Barrier + \details Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or memory, + after the instruction has been completed. + */ +#define __ISB() __builtin_arm_isb(0xF); + +/** + \brief Data Synchronization Barrier + \details Acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +#define __DSB() __builtin_arm_dsb(0xF); + + +/** + \brief Data Memory Barrier + \details Ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +#define __DMB() __builtin_arm_dmb(0xF); + + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV(value) __builtin_bswap32(value) + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV16(value) __ROR(__REV(value), 16) + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REVSH(value) (int16_t)__builtin_bswap16(value) + + +/** + \brief Rotate Right in unsigned value (32 bit) + \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + \param [in] op1 Value to rotate + \param [in] op2 Number of Bits to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) +{ + op2 %= 32U; + if (op2 == 0U) + { + return op1; + } + return (op1 >> op2) | (op1 << (32U - op2)); +} + + +/** + \brief Breakpoint + \details Causes the processor to enter Debug state. + Debug tools can use this to investigate system state when the instruction at a particular address is reached. + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __ASM volatile ("bkpt "#value) + + +/** + \brief Reverse bit order of value + \details Reverses the bit order of the given value. + \param [in] value Value to reverse + \return Reversed value + */ +#define __RBIT __builtin_arm_rbit + +/** + \brief Count leading zeros + \details Counts the number of leading zeros of a data value. + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +#define __CLZ (uint8_t)__builtin_clz + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDREXB (uint8_t)__builtin_arm_ldrex + + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDREXH (uint16_t)__builtin_arm_ldrex + + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDREXW (uint32_t)__builtin_arm_ldrex + + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXB (uint32_t)__builtin_arm_strex + + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXH (uint32_t)__builtin_arm_strex + + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXW (uint32_t)__builtin_arm_strex + + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +#define __CLREX __builtin_arm_clrex + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT __builtin_arm_ssat + + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT __builtin_arm_usat + + +/** + \brief Rotate Right with Extend (32 bit) + \details Moves each bit of a bitstring right by one bit. + The carry input is shifted in at the left end of the bitstring. + \param [in] value Value to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __RRX(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +} + + +/** + \brief LDRT Unprivileged (8 bit) + \details Executes a Unprivileged LDRT instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (16 bit) + \details Executes a Unprivileged LDRT instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (32 bit) + \details Executes a Unprivileged LDRT instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief STRT Unprivileged (8 bit) + \details Executes a Unprivileged STRT instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (16 bit) + \details Executes a Unprivileged STRT instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (32 bit) + \details Executes a Unprivileged STRT instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) ); +} + +#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +__STATIC_FORCEINLINE int32_t __SSAT(int32_t val, uint32_t sat) +{ + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; +} + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +__STATIC_FORCEINLINE uint32_t __USAT(int32_t val, uint32_t sat) +{ + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief Load-Acquire (8 bit) + \details Executes a LDAB instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); +} + + +/** + \brief Load-Acquire (16 bit) + \details Executes a LDAH instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); +} + + +/** + \brief Load-Acquire (32 bit) + \details Executes a LDA instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief Store-Release (8 bit) + \details Executes a STLB instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (16 bit) + \details Executes a STLH instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (32 bit) + \details Executes a STL instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Load-Acquire Exclusive (8 bit) + \details Executes a LDAB exclusive instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDAEXB (uint8_t)__builtin_arm_ldaex + + +/** + \brief Load-Acquire Exclusive (16 bit) + \details Executes a LDAH exclusive instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDAEXH (uint16_t)__builtin_arm_ldaex + + +/** + \brief Load-Acquire Exclusive (32 bit) + \details Executes a LDA exclusive instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDAEX (uint32_t)__builtin_arm_ldaex + + +/** + \brief Store-Release Exclusive (8 bit) + \details Executes a STLB exclusive instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEXB (uint32_t)__builtin_arm_stlex + + +/** + \brief Store-Release Exclusive (16 bit) + \details Executes a STLH exclusive instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEXH (uint32_t)__builtin_arm_stlex + + +/** + \brief Store-Release Exclusive (32 bit) + \details Executes a STL exclusive instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEX (uint32_t)__builtin_arm_stlex + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) + +__STATIC_FORCEINLINE uint32_t __SADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__STATIC_FORCEINLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__STATIC_FORCEINLINE uint32_t __SADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USAD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#define __SSAT16(ARG1,ARG2) \ +({ \ + int32_t __RES, __ARG1 = (ARG1); \ + __ASM ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +#define __USAT16(ARG1,ARG2) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +__STATIC_FORCEINLINE uint32_t __UXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile ("uxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile ("sxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint64_t __SMLALD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint64_t __SMLALDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint64_t __SMLSLD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint64_t __SMLSLDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint32_t __SEL (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE int32_t __QADD( int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE int32_t __QSUB( int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +#if 0 +#define __PKHBT(ARG1,ARG2,ARG3) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ + __ASM ("pkhbt %0, %1, %2, lsl %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ + __RES; \ + }) + +#define __PKHTB(ARG1,ARG2,ARG3) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ + if (ARG3 == 0) \ + __ASM ("pkhtb %0, %1, %2" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2) ); \ + else \ + __ASM ("pkhtb %0, %1, %2, asr %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ + __RES; \ + }) +#endif + +#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ + ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) + +#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ + ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) + +__STATIC_FORCEINLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) +{ + int32_t result; + + __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#endif /* (__ARM_FEATURE_DSP == 1) */ +/*@} end of group CMSIS_SIMD_intrinsics */ + + +#endif /* __CMSIS_ARMCLANG_H */ diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/cmsis_compiler.h b/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/cmsis_compiler.h new file mode 100644 index 00000000..94212eb8 --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/cmsis_compiler.h @@ -0,0 +1,266 @@ +/**************************************************************************//** + * @file cmsis_compiler.h + * @brief CMSIS compiler generic header file + * @version V5.0.4 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CMSIS_COMPILER_H +#define __CMSIS_COMPILER_H + +#include + +/* + * Arm Compiler 4/5 + */ +#if defined ( __CC_ARM ) + #include "cmsis_armcc.h" + + +/* + * Arm Compiler 6 (armclang) + */ +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #include "cmsis_armclang.h" + + +/* + * GNU Compiler + */ +#elif defined ( __GNUC__ ) + #include "cmsis_gcc.h" + + +/* + * IAR Compiler + */ +#elif defined ( __ICCARM__ ) + #include + + +/* + * TI Arm Compiler + */ +#elif defined ( __TI_ARM__ ) + #include + + #ifndef __ASM + #define __ASM __asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __STATIC_INLINE + #endif + #ifndef __NO_RETURN + #define __NO_RETURN __attribute__((noreturn)) + #endif + #ifndef __USED + #define __USED __attribute__((used)) + #endif + #ifndef __WEAK + #define __WEAK __attribute__((weak)) + #endif + #ifndef __PACKED + #define __PACKED __attribute__((packed)) + #endif + #ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __attribute__((packed)) + #endif + #ifndef __PACKED_UNION + #define __PACKED_UNION union __attribute__((packed)) + #endif + #ifndef __UNALIGNED_UINT32 /* deprecated */ + struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __UNALIGNED_UINT16_WRITE + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void*)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT16_READ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) + #endif + #ifndef __UNALIGNED_UINT32_WRITE + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT32_READ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) + #endif + #ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) + #endif + #ifndef __RESTRICT + #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. + #define __RESTRICT + #endif + + +/* + * TASKING Compiler + */ +#elif defined ( __TASKING__ ) + /* + * The CMSIS functions have been implemented as intrinsics in the compiler. + * Please use "carm -?i" to get an up to date list of all intrinsics, + * Including the CMSIS ones. + */ + + #ifndef __ASM + #define __ASM __asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __STATIC_INLINE + #endif + #ifndef __NO_RETURN + #define __NO_RETURN __attribute__((noreturn)) + #endif + #ifndef __USED + #define __USED __attribute__((used)) + #endif + #ifndef __WEAK + #define __WEAK __attribute__((weak)) + #endif + #ifndef __PACKED + #define __PACKED __packed__ + #endif + #ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __packed__ + #endif + #ifndef __PACKED_UNION + #define __PACKED_UNION union __packed__ + #endif + #ifndef __UNALIGNED_UINT32 /* deprecated */ + struct __packed__ T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __UNALIGNED_UINT16_WRITE + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT16_READ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) + #endif + #ifndef __UNALIGNED_UINT32_WRITE + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT32_READ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) + #endif + #ifndef __ALIGNED + #define __ALIGNED(x) __align(x) + #endif + #ifndef __RESTRICT + #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. + #define __RESTRICT + #endif + + +/* + * COSMIC Compiler + */ +#elif defined ( __CSMC__ ) + #include + + #ifndef __ASM + #define __ASM _asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __STATIC_INLINE + #endif + #ifndef __NO_RETURN + // NO RETURN is automatically detected hence no warning here + #define __NO_RETURN + #endif + #ifndef __USED + #warning No compiler specific solution for __USED. __USED is ignored. + #define __USED + #endif + #ifndef __WEAK + #define __WEAK __weak + #endif + #ifndef __PACKED + #define __PACKED @packed + #endif + #ifndef __PACKED_STRUCT + #define __PACKED_STRUCT @packed struct + #endif + #ifndef __PACKED_UNION + #define __PACKED_UNION @packed union + #endif + #ifndef __UNALIGNED_UINT32 /* deprecated */ + @packed struct T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __UNALIGNED_UINT16_WRITE + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT16_READ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) + #endif + #ifndef __UNALIGNED_UINT32_WRITE + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT32_READ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) + #endif + #ifndef __ALIGNED + #warning No compiler specific solution for __ALIGNED. __ALIGNED is ignored. + #define __ALIGNED(x) + #endif + #ifndef __RESTRICT + #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. + #define __RESTRICT + #endif + + +#else + #error Unknown compiler. +#endif + + +#endif /* __CMSIS_COMPILER_H */ + diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/cmsis_gcc.h b/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/cmsis_gcc.h new file mode 100644 index 00000000..2d9db15a --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/cmsis_gcc.h @@ -0,0 +1,2085 @@ +/**************************************************************************//** + * @file cmsis_gcc.h + * @brief CMSIS compiler GCC header file + * @version V5.0.4 + * @date 09. April 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CMSIS_GCC_H +#define __CMSIS_GCC_H + +/* ignore some GCC warnings */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wsign-conversion" +#pragma GCC diagnostic ignored "-Wconversion" +#pragma GCC diagnostic ignored "-Wunused-parameter" + +/* Fallback for __has_builtin */ +#ifndef __has_builtin + #define __has_builtin(x) (0) +#endif + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM __asm +#endif +#ifndef __INLINE + #define __INLINE inline +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline +#endif +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __attribute__((always_inline)) static inline +#endif +#ifndef __NO_RETURN + #define __NO_RETURN __attribute__((__noreturn__)) +#endif +#ifndef __USED + #define __USED __attribute__((used)) +#endif +#ifndef __WEAK + #define __WEAK __attribute__((weak)) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_UNION + #define __PACKED_UNION union __attribute__((packed, aligned(1))) +#endif +#ifndef __UNALIGNED_UINT32 /* deprecated */ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) +#endif +#ifndef __UNALIGNED_UINT16_WRITE + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) +#endif +#ifndef __UNALIGNED_UINT32_WRITE + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif + + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +/** + \brief Enable IRQ Interrupts + \details Enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __enable_irq(void) +{ + __ASM volatile ("cpsie i" : : : "memory"); +} + + +/** + \brief Disable IRQ Interrupts + \details Disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __disable_irq(void) +{ + __ASM volatile ("cpsid i" : : : "memory"); +} + + +/** + \brief Get Control Register + \details Returns the content of the Control Register. + \return Control Register value + */ +__STATIC_FORCEINLINE uint32_t __get_CONTROL(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Control Register (non-secure) + \details Returns the content of the non-secure Control Register when in secure mode. + \return non-secure Control Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Control Register + \details Writes the given value to the Control Register. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) +{ + __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Control Register (non-secure) + \details Writes the given value to the non-secure Control Register when in secure state. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) +{ + __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); +} +#endif + + +/** + \brief Get IPSR Register + \details Returns the content of the IPSR Register. + \return IPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_IPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get APSR Register + \details Returns the content of the APSR Register. + \return APSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_APSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, apsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get xPSR Register + \details Returns the content of the xPSR Register. + \return xPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_xPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get Process Stack Pointer + \details Returns the current value of the Process Stack Pointer (PSP). + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSP(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, psp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer (non-secure) + \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state. + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Process Stack Pointer + \details Assigns the given value to the Process Stack Pointer (PSP). + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state. + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); +} +#endif + + +/** + \brief Get Main Stack Pointer + \details Returns the current value of the Main Stack Pointer (MSP). + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSP(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, msp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer (non-secure) + \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state. + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Main Stack Pointer + \details Assigns the given value to the Main Stack Pointer (MSP). + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); +} +#endif + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Stack Pointer (non-secure) + \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. + \return SP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); + return(result); +} + + +/** + \brief Set Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. + \param [in] topOfStack Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) +{ + __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); +} +#endif + + +/** + \brief Get Priority Mask + \details Returns the current state of the priority mask bit from the Priority Mask Register. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask" : "=r" (result) :: "memory"); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Priority Mask (non-secure) + \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask_ns" : "=r" (result) :: "memory"); + return(result); +} +#endif + + +/** + \brief Set Priority Mask + \details Assigns the given value to the Priority Mask Register. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) +{ + __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Priority Mask (non-secure) + \details Assigns the given value to the non-secure Priority Mask Register when in secure state. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) +{ + __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); +} +#endif + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Enable FIQ + \details Enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __enable_fault_irq(void) +{ + __ASM volatile ("cpsie f" : : : "memory"); +} + + +/** + \brief Disable FIQ + \details Disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __disable_fault_irq(void) +{ + __ASM volatile ("cpsid f" : : : "memory"); +} + + +/** + \brief Get Base Priority + \details Returns the current value of the Base Priority register. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Base Priority (non-secure) + \details Returns the current value of the non-secure Base Priority register when in secure state. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Base Priority + \details Assigns the given value to the Base Priority register. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) +{ + __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Base Priority (non-secure) + \details Assigns the given value to the non-secure Base Priority register when in secure state. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); +} +#endif + + +/** + \brief Set Base Priority with condition + \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, + or the new value increases the BASEPRI priority level. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); +} + + +/** + \brief Get Fault Mask + \details Returns the current value of the Fault Mask register. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Fault Mask (non-secure) + \details Returns the current value of the non-secure Fault Mask register when in secure state. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Fault Mask + \details Assigns the given value to the Fault Mask register. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Fault Mask (non-secure) + \details Assigns the given value to the non-secure Fault Mask register when in secure state. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); +} +#endif + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + +/** + \brief Get Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, psplim" : "=r" (result) ); + return result; +#endif +} + +#if (defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); +#endif +} +#endif + + +/** + \brief Get Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, msplim" : "=r" (result) ); + return result; +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state. + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). + \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state. + \param [in] MainStackPtrLimit Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); +#endif +} +#endif + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + + +/** + \brief Get FPSCR + \details Returns the current value of the Floating Point Status/Control register. + \return Floating Point Status/Control register value + */ +__STATIC_FORCEINLINE uint32_t __get_FPSCR(void) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#if __has_builtin(__builtin_arm_get_fpscr) +// Re-enable using built-in when GCC has been fixed +// || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) + /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ + return __builtin_arm_get_fpscr(); +#else + uint32_t result; + + __ASM volatile ("VMRS %0, fpscr" : "=r" (result) ); + return(result); +#endif +#else + return(0U); +#endif +} + + +/** + \brief Set FPSCR + \details Assigns the given value to the Floating Point Status/Control register. + \param [in] fpscr Floating Point Status/Control value to set + */ +__STATIC_FORCEINLINE void __set_FPSCR(uint32_t fpscr) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#if __has_builtin(__builtin_arm_set_fpscr) +// Re-enable using built-in when GCC has been fixed +// || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) + /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ + __builtin_arm_set_fpscr(fpscr); +#else + __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc", "memory"); +#endif +#else + (void)fpscr; +#endif +} + + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +/* Define macros for porting to both thumb1 and thumb2. + * For thumb1, use low register (r0-r7), specified by constraint "l" + * Otherwise, use general registers, specified by constraint "r" */ +#if defined (__thumb__) && !defined (__thumb2__) +#define __CMSIS_GCC_OUT_REG(r) "=l" (r) +#define __CMSIS_GCC_RW_REG(r) "+l" (r) +#define __CMSIS_GCC_USE_REG(r) "l" (r) +#else +#define __CMSIS_GCC_OUT_REG(r) "=r" (r) +#define __CMSIS_GCC_RW_REG(r) "+r" (r) +#define __CMSIS_GCC_USE_REG(r) "r" (r) +#endif + +/** + \brief No Operation + \details No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP() __ASM volatile ("nop") + +/** + \brief Wait For Interrupt + \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. + */ +#define __WFI() __ASM volatile ("wfi") + + +/** + \brief Wait For Event + \details Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE() __ASM volatile ("wfe") + + +/** + \brief Send Event + \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV() __ASM volatile ("sev") + + +/** + \brief Instruction Synchronization Barrier + \details Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or memory, + after the instruction has been completed. + */ +__STATIC_FORCEINLINE void __ISB(void) +{ + __ASM volatile ("isb 0xF":::"memory"); +} + + +/** + \brief Data Synchronization Barrier + \details Acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +__STATIC_FORCEINLINE void __DSB(void) +{ + __ASM volatile ("dsb 0xF":::"memory"); +} + + +/** + \brief Data Memory Barrier + \details Ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +__STATIC_FORCEINLINE void __DMB(void) +{ + __ASM volatile ("dmb 0xF":::"memory"); +} + + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE uint32_t __REV(uint32_t value) +{ +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) + return __builtin_bswap32(value); +#else + uint32_t result; + + __ASM volatile ("rev %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return result; +#endif +} + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE uint32_t __REV16(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rev16 %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return result; +} + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE int16_t __REVSH(int16_t value) +{ +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + return (int16_t)__builtin_bswap16(value); +#else + int16_t result; + + __ASM volatile ("revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return result; +#endif +} + + +/** + \brief Rotate Right in unsigned value (32 bit) + \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + \param [in] op1 Value to rotate + \param [in] op2 Number of Bits to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) +{ + op2 %= 32U; + if (op2 == 0U) + { + return op1; + } + return (op1 >> op2) | (op1 << (32U - op2)); +} + + +/** + \brief Breakpoint + \details Causes the processor to enter Debug state. + Debug tools can use this to investigate system state when the instruction at a particular address is reached. + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __ASM volatile ("bkpt "#value) + + +/** + \brief Reverse bit order of value + \details Reverses the bit order of the given value. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE uint32_t __RBIT(uint32_t value) +{ + uint32_t result; + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); +#else + uint32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */ + + result = value; /* r will be reversed bits of v; first get LSB of v */ + for (value >>= 1U; value != 0U; value >>= 1U) + { + result <<= 1U; + result |= value & 1U; + s--; + } + result <<= s; /* shift when v's highest bits are zero */ +#endif + return result; +} + + +/** + \brief Count leading zeros + \details Counts the number of leading zeros of a data value. + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +#define __CLZ (uint8_t)__builtin_clz + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDREXB(volatile uint8_t *addr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrexb %0, %1" : "=r" (result) : "Q" (*addr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); +#endif + return ((uint8_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDREXH(volatile uint16_t *addr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrexh %0, %1" : "=r" (result) : "Q" (*addr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); +#endif + return ((uint16_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDREXW(volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) ); + return(result); +} + + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr) +{ + uint32_t result; + + __ASM volatile ("strexb %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr) +{ + uint32_t result; + + __ASM volatile ("strexh %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) ); + return(result); +} + + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +__STATIC_FORCEINLINE void __CLREX(void) +{ + __ASM volatile ("clrex" ::: "memory"); +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] ARG1 Value to be saturated + \param [in] ARG2 Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT(ARG1,ARG2) \ +__extension__ \ +({ \ + int32_t __RES, __ARG1 = (ARG1); \ + __ASM ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] ARG1 Value to be saturated + \param [in] ARG2 Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT(ARG1,ARG2) \ + __extension__ \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + + +/** + \brief Rotate Right with Extend (32 bit) + \details Moves each bit of a bitstring right by one bit. + The carry input is shifted in at the left end of the bitstring. + \param [in] value Value to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __RRX(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +} + + +/** + \brief LDRT Unprivileged (8 bit) + \details Executes a Unprivileged LDRT instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrbt %0, [%1]" : "=r" (result) : "r" (ptr) : "memory" ); +#endif + return ((uint8_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (16 bit) + \details Executes a Unprivileged LDRT instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrht %0, [%1]" : "=r" (result) : "r" (ptr) : "memory" ); +#endif + return ((uint16_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (32 bit) + \details Executes a Unprivileged LDRT instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief STRT Unprivileged (8 bit) + \details Executes a Unprivileged STRT instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (16 bit) + \details Executes a Unprivileged STRT instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (32 bit) + \details Executes a Unprivileged STRT instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) ); +} + +#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +__STATIC_FORCEINLINE int32_t __SSAT(int32_t val, uint32_t sat) +{ + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; +} + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +__STATIC_FORCEINLINE uint32_t __USAT(int32_t val, uint32_t sat) +{ + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief Load-Acquire (8 bit) + \details Executes a LDAB instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); +} + + +/** + \brief Load-Acquire (16 bit) + \details Executes a LDAH instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); +} + + +/** + \brief Load-Acquire (32 bit) + \details Executes a LDA instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief Store-Release (8 bit) + \details Executes a STLB instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (16 bit) + \details Executes a STLH instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (32 bit) + \details Executes a STL instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Load-Acquire Exclusive (8 bit) + \details Executes a LDAB exclusive instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDAEXB(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldaexb %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); +} + + +/** + \brief Load-Acquire Exclusive (16 bit) + \details Executes a LDAH exclusive instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDAEXH(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldaexh %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); +} + + +/** + \brief Load-Acquire Exclusive (32 bit) + \details Executes a LDA exclusive instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDAEX(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldaex %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief Store-Release Exclusive (8 bit) + \details Executes a STLB exclusive instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STLEXB(uint8_t value, volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("stlexb %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief Store-Release Exclusive (16 bit) + \details Executes a STLH exclusive instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STLEXH(uint16_t value, volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("stlexh %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief Store-Release Exclusive (32 bit) + \details Executes a STL exclusive instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STLEX(uint32_t value, volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("stlex %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) ); + return(result); +} + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) + +__STATIC_FORCEINLINE uint32_t __SADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__STATIC_FORCEINLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__STATIC_FORCEINLINE uint32_t __SADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USAD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#define __SSAT16(ARG1,ARG2) \ +({ \ + int32_t __RES, __ARG1 = (ARG1); \ + __ASM ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +#define __USAT16(ARG1,ARG2) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +__STATIC_FORCEINLINE uint32_t __UXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile ("uxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile ("sxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint64_t __SMLALD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint64_t __SMLALDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint64_t __SMLSLD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint64_t __SMLSLDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint32_t __SEL (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE int32_t __QADD( int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE int32_t __QSUB( int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +#if 0 +#define __PKHBT(ARG1,ARG2,ARG3) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ + __ASM ("pkhbt %0, %1, %2, lsl %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ + __RES; \ + }) + +#define __PKHTB(ARG1,ARG2,ARG3) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ + if (ARG3 == 0) \ + __ASM ("pkhtb %0, %1, %2" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2) ); \ + else \ + __ASM ("pkhtb %0, %1, %2, asr %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ + __RES; \ + }) +#endif + +#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ + ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) + +#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ + ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) + +__STATIC_FORCEINLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) +{ + int32_t result; + + __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#endif /* (__ARM_FEATURE_DSP == 1) */ +/*@} end of group CMSIS_SIMD_intrinsics */ + + +#pragma GCC diagnostic pop + +#endif /* __CMSIS_GCC_H */ diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/cmsis_iccarm.h b/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/cmsis_iccarm.h new file mode 100644 index 00000000..11c4af0e --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/cmsis_iccarm.h @@ -0,0 +1,935 @@ +/**************************************************************************//** + * @file cmsis_iccarm.h + * @brief CMSIS compiler ICCARM (IAR Compiler for Arm) header file + * @version V5.0.7 + * @date 19. June 2018 + ******************************************************************************/ + +//------------------------------------------------------------------------------ +// +// Copyright (c) 2017-2018 IAR Systems +// +// Licensed under the Apache License, Version 2.0 (the "License") +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//------------------------------------------------------------------------------ + + +#ifndef __CMSIS_ICCARM_H__ +#define __CMSIS_ICCARM_H__ + +#ifndef __ICCARM__ + #error This file should only be compiled by ICCARM +#endif + +#pragma system_include + +#define __IAR_FT _Pragma("inline=forced") __intrinsic + +#if (__VER__ >= 8000000) + #define __ICCARM_V8 1 +#else + #define __ICCARM_V8 0 +#endif + +#ifndef __ALIGNED + #if __ICCARM_V8 + #define __ALIGNED(x) __attribute__((aligned(x))) + #elif (__VER__ >= 7080000) + /* Needs IAR language extensions */ + #define __ALIGNED(x) __attribute__((aligned(x))) + #else + #warning No compiler specific solution for __ALIGNED.__ALIGNED is ignored. + #define __ALIGNED(x) + #endif +#endif + + +/* Define compiler macros for CPU architecture, used in CMSIS 5. + */ +#if __ARM_ARCH_6M__ || __ARM_ARCH_7M__ || __ARM_ARCH_7EM__ || __ARM_ARCH_8M_BASE__ || __ARM_ARCH_8M_MAIN__ +/* Macros already defined */ +#else + #if defined(__ARM8M_MAINLINE__) || defined(__ARM8EM_MAINLINE__) + #define __ARM_ARCH_8M_MAIN__ 1 + #elif defined(__ARM8M_BASELINE__) + #define __ARM_ARCH_8M_BASE__ 1 + #elif defined(__ARM_ARCH_PROFILE) && __ARM_ARCH_PROFILE == 'M' + #if __ARM_ARCH == 6 + #define __ARM_ARCH_6M__ 1 + #elif __ARM_ARCH == 7 + #if __ARM_FEATURE_DSP + #define __ARM_ARCH_7EM__ 1 + #else + #define __ARM_ARCH_7M__ 1 + #endif + #endif /* __ARM_ARCH */ + #endif /* __ARM_ARCH_PROFILE == 'M' */ +#endif + +/* Alternativ core deduction for older ICCARM's */ +#if !defined(__ARM_ARCH_6M__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7EM__) && \ + !defined(__ARM_ARCH_8M_BASE__) && !defined(__ARM_ARCH_8M_MAIN__) + #if defined(__ARM6M__) && (__CORE__ == __ARM6M__) + #define __ARM_ARCH_6M__ 1 + #elif defined(__ARM7M__) && (__CORE__ == __ARM7M__) + #define __ARM_ARCH_7M__ 1 + #elif defined(__ARM7EM__) && (__CORE__ == __ARM7EM__) + #define __ARM_ARCH_7EM__ 1 + #elif defined(__ARM8M_BASELINE__) && (__CORE == __ARM8M_BASELINE__) + #define __ARM_ARCH_8M_BASE__ 1 + #elif defined(__ARM8M_MAINLINE__) && (__CORE == __ARM8M_MAINLINE__) + #define __ARM_ARCH_8M_MAIN__ 1 + #elif defined(__ARM8EM_MAINLINE__) && (__CORE == __ARM8EM_MAINLINE__) + #define __ARM_ARCH_8M_MAIN__ 1 + #else + #error "Unknown target." + #endif +#endif + + + +#if defined(__ARM_ARCH_6M__) && __ARM_ARCH_6M__==1 + #define __IAR_M0_FAMILY 1 +#elif defined(__ARM_ARCH_8M_BASE__) && __ARM_ARCH_8M_BASE__==1 + #define __IAR_M0_FAMILY 1 +#else + #define __IAR_M0_FAMILY 0 +#endif + + +#ifndef __ASM + #define __ASM __asm +#endif + +#ifndef __INLINE + #define __INLINE inline +#endif + +#ifndef __NO_RETURN + #if __ICCARM_V8 + #define __NO_RETURN __attribute__((__noreturn__)) + #else + #define __NO_RETURN _Pragma("object_attribute=__noreturn") + #endif +#endif + +#ifndef __PACKED + #if __ICCARM_V8 + #define __PACKED __attribute__((packed, aligned(1))) + #else + /* Needs IAR language extensions */ + #define __PACKED __packed + #endif +#endif + +#ifndef __PACKED_STRUCT + #if __ICCARM_V8 + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) + #else + /* Needs IAR language extensions */ + #define __PACKED_STRUCT __packed struct + #endif +#endif + +#ifndef __PACKED_UNION + #if __ICCARM_V8 + #define __PACKED_UNION union __attribute__((packed, aligned(1))) + #else + /* Needs IAR language extensions */ + #define __PACKED_UNION __packed union + #endif +#endif + +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif + +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline +#endif + +#ifndef __FORCEINLINE + #define __FORCEINLINE _Pragma("inline=forced") +#endif + +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __FORCEINLINE __STATIC_INLINE +#endif + +#ifndef __UNALIGNED_UINT16_READ +#pragma language=save +#pragma language=extended +__IAR_FT uint16_t __iar_uint16_read(void const *ptr) +{ + return *(__packed uint16_t*)(ptr); +} +#pragma language=restore +#define __UNALIGNED_UINT16_READ(PTR) __iar_uint16_read(PTR) +#endif + + +#ifndef __UNALIGNED_UINT16_WRITE +#pragma language=save +#pragma language=extended +__IAR_FT void __iar_uint16_write(void const *ptr, uint16_t val) +{ + *(__packed uint16_t*)(ptr) = val;; +} +#pragma language=restore +#define __UNALIGNED_UINT16_WRITE(PTR,VAL) __iar_uint16_write(PTR,VAL) +#endif + +#ifndef __UNALIGNED_UINT32_READ +#pragma language=save +#pragma language=extended +__IAR_FT uint32_t __iar_uint32_read(void const *ptr) +{ + return *(__packed uint32_t*)(ptr); +} +#pragma language=restore +#define __UNALIGNED_UINT32_READ(PTR) __iar_uint32_read(PTR) +#endif + +#ifndef __UNALIGNED_UINT32_WRITE +#pragma language=save +#pragma language=extended +__IAR_FT void __iar_uint32_write(void const *ptr, uint32_t val) +{ + *(__packed uint32_t*)(ptr) = val;; +} +#pragma language=restore +#define __UNALIGNED_UINT32_WRITE(PTR,VAL) __iar_uint32_write(PTR,VAL) +#endif + +#ifndef __UNALIGNED_UINT32 /* deprecated */ +#pragma language=save +#pragma language=extended +__packed struct __iar_u32 { uint32_t v; }; +#pragma language=restore +#define __UNALIGNED_UINT32(PTR) (((struct __iar_u32 *)(PTR))->v) +#endif + +#ifndef __USED + #if __ICCARM_V8 + #define __USED __attribute__((used)) + #else + #define __USED _Pragma("__root") + #endif +#endif + +#ifndef __WEAK + #if __ICCARM_V8 + #define __WEAK __attribute__((weak)) + #else + #define __WEAK _Pragma("__weak") + #endif +#endif + + +#ifndef __ICCARM_INTRINSICS_VERSION__ + #define __ICCARM_INTRINSICS_VERSION__ 0 +#endif + +#if __ICCARM_INTRINSICS_VERSION__ == 2 + + #if defined(__CLZ) + #undef __CLZ + #endif + #if defined(__REVSH) + #undef __REVSH + #endif + #if defined(__RBIT) + #undef __RBIT + #endif + #if defined(__SSAT) + #undef __SSAT + #endif + #if defined(__USAT) + #undef __USAT + #endif + + #include "iccarm_builtin.h" + + #define __disable_fault_irq __iar_builtin_disable_fiq + #define __disable_irq __iar_builtin_disable_interrupt + #define __enable_fault_irq __iar_builtin_enable_fiq + #define __enable_irq __iar_builtin_enable_interrupt + #define __arm_rsr __iar_builtin_rsr + #define __arm_wsr __iar_builtin_wsr + + + #define __get_APSR() (__arm_rsr("APSR")) + #define __get_BASEPRI() (__arm_rsr("BASEPRI")) + #define __get_CONTROL() (__arm_rsr("CONTROL")) + #define __get_FAULTMASK() (__arm_rsr("FAULTMASK")) + + #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + #define __get_FPSCR() (__arm_rsr("FPSCR")) + #define __set_FPSCR(VALUE) (__arm_wsr("FPSCR", (VALUE))) + #else + #define __get_FPSCR() ( 0 ) + #define __set_FPSCR(VALUE) ((void)VALUE) + #endif + + #define __get_IPSR() (__arm_rsr("IPSR")) + #define __get_MSP() (__arm_rsr("MSP")) + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + #define __get_MSPLIM() (0U) + #else + #define __get_MSPLIM() (__arm_rsr("MSPLIM")) + #endif + #define __get_PRIMASK() (__arm_rsr("PRIMASK")) + #define __get_PSP() (__arm_rsr("PSP")) + + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + #define __get_PSPLIM() (0U) + #else + #define __get_PSPLIM() (__arm_rsr("PSPLIM")) + #endif + + #define __get_xPSR() (__arm_rsr("xPSR")) + + #define __set_BASEPRI(VALUE) (__arm_wsr("BASEPRI", (VALUE))) + #define __set_BASEPRI_MAX(VALUE) (__arm_wsr("BASEPRI_MAX", (VALUE))) + #define __set_CONTROL(VALUE) (__arm_wsr("CONTROL", (VALUE))) + #define __set_FAULTMASK(VALUE) (__arm_wsr("FAULTMASK", (VALUE))) + #define __set_MSP(VALUE) (__arm_wsr("MSP", (VALUE))) + + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + #define __set_MSPLIM(VALUE) ((void)(VALUE)) + #else + #define __set_MSPLIM(VALUE) (__arm_wsr("MSPLIM", (VALUE))) + #endif + #define __set_PRIMASK(VALUE) (__arm_wsr("PRIMASK", (VALUE))) + #define __set_PSP(VALUE) (__arm_wsr("PSP", (VALUE))) + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + #define __set_PSPLIM(VALUE) ((void)(VALUE)) + #else + #define __set_PSPLIM(VALUE) (__arm_wsr("PSPLIM", (VALUE))) + #endif + + #define __TZ_get_CONTROL_NS() (__arm_rsr("CONTROL_NS")) + #define __TZ_set_CONTROL_NS(VALUE) (__arm_wsr("CONTROL_NS", (VALUE))) + #define __TZ_get_PSP_NS() (__arm_rsr("PSP_NS")) + #define __TZ_set_PSP_NS(VALUE) (__arm_wsr("PSP_NS", (VALUE))) + #define __TZ_get_MSP_NS() (__arm_rsr("MSP_NS")) + #define __TZ_set_MSP_NS(VALUE) (__arm_wsr("MSP_NS", (VALUE))) + #define __TZ_get_SP_NS() (__arm_rsr("SP_NS")) + #define __TZ_set_SP_NS(VALUE) (__arm_wsr("SP_NS", (VALUE))) + #define __TZ_get_PRIMASK_NS() (__arm_rsr("PRIMASK_NS")) + #define __TZ_set_PRIMASK_NS(VALUE) (__arm_wsr("PRIMASK_NS", (VALUE))) + #define __TZ_get_BASEPRI_NS() (__arm_rsr("BASEPRI_NS")) + #define __TZ_set_BASEPRI_NS(VALUE) (__arm_wsr("BASEPRI_NS", (VALUE))) + #define __TZ_get_FAULTMASK_NS() (__arm_rsr("FAULTMASK_NS")) + #define __TZ_set_FAULTMASK_NS(VALUE)(__arm_wsr("FAULTMASK_NS", (VALUE))) + + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + #define __TZ_get_PSPLIM_NS() (0U) + #define __TZ_set_PSPLIM_NS(VALUE) ((void)(VALUE)) + #else + #define __TZ_get_PSPLIM_NS() (__arm_rsr("PSPLIM_NS")) + #define __TZ_set_PSPLIM_NS(VALUE) (__arm_wsr("PSPLIM_NS", (VALUE))) + #endif + + #define __TZ_get_MSPLIM_NS() (__arm_rsr("MSPLIM_NS")) + #define __TZ_set_MSPLIM_NS(VALUE) (__arm_wsr("MSPLIM_NS", (VALUE))) + + #define __NOP __iar_builtin_no_operation + + #define __CLZ __iar_builtin_CLZ + #define __CLREX __iar_builtin_CLREX + + #define __DMB __iar_builtin_DMB + #define __DSB __iar_builtin_DSB + #define __ISB __iar_builtin_ISB + + #define __LDREXB __iar_builtin_LDREXB + #define __LDREXH __iar_builtin_LDREXH + #define __LDREXW __iar_builtin_LDREX + + #define __RBIT __iar_builtin_RBIT + #define __REV __iar_builtin_REV + #define __REV16 __iar_builtin_REV16 + + __IAR_FT int16_t __REVSH(int16_t val) + { + return (int16_t) __iar_builtin_REVSH(val); + } + + #define __ROR __iar_builtin_ROR + #define __RRX __iar_builtin_RRX + + #define __SEV __iar_builtin_SEV + + #if !__IAR_M0_FAMILY + #define __SSAT __iar_builtin_SSAT + #endif + + #define __STREXB __iar_builtin_STREXB + #define __STREXH __iar_builtin_STREXH + #define __STREXW __iar_builtin_STREX + + #if !__IAR_M0_FAMILY + #define __USAT __iar_builtin_USAT + #endif + + #define __WFE __iar_builtin_WFE + #define __WFI __iar_builtin_WFI + + #if __ARM_MEDIA__ + #define __SADD8 __iar_builtin_SADD8 + #define __QADD8 __iar_builtin_QADD8 + #define __SHADD8 __iar_builtin_SHADD8 + #define __UADD8 __iar_builtin_UADD8 + #define __UQADD8 __iar_builtin_UQADD8 + #define __UHADD8 __iar_builtin_UHADD8 + #define __SSUB8 __iar_builtin_SSUB8 + #define __QSUB8 __iar_builtin_QSUB8 + #define __SHSUB8 __iar_builtin_SHSUB8 + #define __USUB8 __iar_builtin_USUB8 + #define __UQSUB8 __iar_builtin_UQSUB8 + #define __UHSUB8 __iar_builtin_UHSUB8 + #define __SADD16 __iar_builtin_SADD16 + #define __QADD16 __iar_builtin_QADD16 + #define __SHADD16 __iar_builtin_SHADD16 + #define __UADD16 __iar_builtin_UADD16 + #define __UQADD16 __iar_builtin_UQADD16 + #define __UHADD16 __iar_builtin_UHADD16 + #define __SSUB16 __iar_builtin_SSUB16 + #define __QSUB16 __iar_builtin_QSUB16 + #define __SHSUB16 __iar_builtin_SHSUB16 + #define __USUB16 __iar_builtin_USUB16 + #define __UQSUB16 __iar_builtin_UQSUB16 + #define __UHSUB16 __iar_builtin_UHSUB16 + #define __SASX __iar_builtin_SASX + #define __QASX __iar_builtin_QASX + #define __SHASX __iar_builtin_SHASX + #define __UASX __iar_builtin_UASX + #define __UQASX __iar_builtin_UQASX + #define __UHASX __iar_builtin_UHASX + #define __SSAX __iar_builtin_SSAX + #define __QSAX __iar_builtin_QSAX + #define __SHSAX __iar_builtin_SHSAX + #define __USAX __iar_builtin_USAX + #define __UQSAX __iar_builtin_UQSAX + #define __UHSAX __iar_builtin_UHSAX + #define __USAD8 __iar_builtin_USAD8 + #define __USADA8 __iar_builtin_USADA8 + #define __SSAT16 __iar_builtin_SSAT16 + #define __USAT16 __iar_builtin_USAT16 + #define __UXTB16 __iar_builtin_UXTB16 + #define __UXTAB16 __iar_builtin_UXTAB16 + #define __SXTB16 __iar_builtin_SXTB16 + #define __SXTAB16 __iar_builtin_SXTAB16 + #define __SMUAD __iar_builtin_SMUAD + #define __SMUADX __iar_builtin_SMUADX + #define __SMMLA __iar_builtin_SMMLA + #define __SMLAD __iar_builtin_SMLAD + #define __SMLADX __iar_builtin_SMLADX + #define __SMLALD __iar_builtin_SMLALD + #define __SMLALDX __iar_builtin_SMLALDX + #define __SMUSD __iar_builtin_SMUSD + #define __SMUSDX __iar_builtin_SMUSDX + #define __SMLSD __iar_builtin_SMLSD + #define __SMLSDX __iar_builtin_SMLSDX + #define __SMLSLD __iar_builtin_SMLSLD + #define __SMLSLDX __iar_builtin_SMLSLDX + #define __SEL __iar_builtin_SEL + #define __QADD __iar_builtin_QADD + #define __QSUB __iar_builtin_QSUB + #define __PKHBT __iar_builtin_PKHBT + #define __PKHTB __iar_builtin_PKHTB + #endif + +#else /* __ICCARM_INTRINSICS_VERSION__ == 2 */ + + #if __IAR_M0_FAMILY + /* Avoid clash between intrinsics.h and arm_math.h when compiling for Cortex-M0. */ + #define __CLZ __cmsis_iar_clz_not_active + #define __SSAT __cmsis_iar_ssat_not_active + #define __USAT __cmsis_iar_usat_not_active + #define __RBIT __cmsis_iar_rbit_not_active + #define __get_APSR __cmsis_iar_get_APSR_not_active + #endif + + + #if (!((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) )) + #define __get_FPSCR __cmsis_iar_get_FPSR_not_active + #define __set_FPSCR __cmsis_iar_set_FPSR_not_active + #endif + + #ifdef __INTRINSICS_INCLUDED + #error intrinsics.h is already included previously! + #endif + + #include + + #if __IAR_M0_FAMILY + /* Avoid clash between intrinsics.h and arm_math.h when compiling for Cortex-M0. */ + #undef __CLZ + #undef __SSAT + #undef __USAT + #undef __RBIT + #undef __get_APSR + + __STATIC_INLINE uint8_t __CLZ(uint32_t data) + { + if (data == 0U) { return 32U; } + + uint32_t count = 0U; + uint32_t mask = 0x80000000U; + + while ((data & mask) == 0U) + { + count += 1U; + mask = mask >> 1U; + } + return count; + } + + __STATIC_INLINE uint32_t __RBIT(uint32_t v) + { + uint8_t sc = 31U; + uint32_t r = v; + for (v >>= 1U; v; v >>= 1U) + { + r <<= 1U; + r |= v & 1U; + sc--; + } + return (r << sc); + } + + __STATIC_INLINE uint32_t __get_APSR(void) + { + uint32_t res; + __asm("MRS %0,APSR" : "=r" (res)); + return res; + } + + #endif + + #if (!((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) )) + #undef __get_FPSCR + #undef __set_FPSCR + #define __get_FPSCR() (0) + #define __set_FPSCR(VALUE) ((void)VALUE) + #endif + + #pragma diag_suppress=Pe940 + #pragma diag_suppress=Pe177 + + #define __enable_irq __enable_interrupt + #define __disable_irq __disable_interrupt + #define __NOP __no_operation + + #define __get_xPSR __get_PSR + + #if (!defined(__ARM_ARCH_6M__) || __ARM_ARCH_6M__==0) + + __IAR_FT uint32_t __LDREXW(uint32_t volatile *ptr) + { + return __LDREX((unsigned long *)ptr); + } + + __IAR_FT uint32_t __STREXW(uint32_t value, uint32_t volatile *ptr) + { + return __STREX(value, (unsigned long *)ptr); + } + #endif + + + /* __CORTEX_M is defined in core_cm0.h, core_cm3.h and core_cm4.h. */ + #if (__CORTEX_M >= 0x03) + + __IAR_FT uint32_t __RRX(uint32_t value) + { + uint32_t result; + __ASM("RRX %0, %1" : "=r"(result) : "r" (value) : "cc"); + return(result); + } + + __IAR_FT void __set_BASEPRI_MAX(uint32_t value) + { + __asm volatile("MSR BASEPRI_MAX,%0"::"r" (value)); + } + + + #define __enable_fault_irq __enable_fiq + #define __disable_fault_irq __disable_fiq + + + #endif /* (__CORTEX_M >= 0x03) */ + + __IAR_FT uint32_t __ROR(uint32_t op1, uint32_t op2) + { + return (op1 >> op2) | (op1 << ((sizeof(op1)*8)-op2)); + } + + #if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + + __IAR_FT uint32_t __get_MSPLIM(void) + { + uint32_t res; + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + res = 0U; + #else + __asm volatile("MRS %0,MSPLIM" : "=r" (res)); + #endif + return res; + } + + __IAR_FT void __set_MSPLIM(uint32_t value) + { + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)value; + #else + __asm volatile("MSR MSPLIM,%0" :: "r" (value)); + #endif + } + + __IAR_FT uint32_t __get_PSPLIM(void) + { + uint32_t res; + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + res = 0U; + #else + __asm volatile("MRS %0,PSPLIM" : "=r" (res)); + #endif + return res; + } + + __IAR_FT void __set_PSPLIM(uint32_t value) + { + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)value; + #else + __asm volatile("MSR PSPLIM,%0" :: "r" (value)); + #endif + } + + __IAR_FT uint32_t __TZ_get_CONTROL_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,CONTROL_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_CONTROL_NS(uint32_t value) + { + __asm volatile("MSR CONTROL_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_PSP_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,PSP_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_PSP_NS(uint32_t value) + { + __asm volatile("MSR PSP_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_MSP_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,MSP_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_MSP_NS(uint32_t value) + { + __asm volatile("MSR MSP_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_SP_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,SP_NS" : "=r" (res)); + return res; + } + __IAR_FT void __TZ_set_SP_NS(uint32_t value) + { + __asm volatile("MSR SP_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_PRIMASK_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,PRIMASK_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_PRIMASK_NS(uint32_t value) + { + __asm volatile("MSR PRIMASK_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_BASEPRI_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,BASEPRI_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_BASEPRI_NS(uint32_t value) + { + __asm volatile("MSR BASEPRI_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_FAULTMASK_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,FAULTMASK_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_FAULTMASK_NS(uint32_t value) + { + __asm volatile("MSR FAULTMASK_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_PSPLIM_NS(void) + { + uint32_t res; + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + res = 0U; + #else + __asm volatile("MRS %0,PSPLIM_NS" : "=r" (res)); + #endif + return res; + } + + __IAR_FT void __TZ_set_PSPLIM_NS(uint32_t value) + { + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)value; + #else + __asm volatile("MSR PSPLIM_NS,%0" :: "r" (value)); + #endif + } + + __IAR_FT uint32_t __TZ_get_MSPLIM_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,MSPLIM_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_MSPLIM_NS(uint32_t value) + { + __asm volatile("MSR MSPLIM_NS,%0" :: "r" (value)); + } + + #endif /* __ARM_ARCH_8M_MAIN__ or __ARM_ARCH_8M_BASE__ */ + +#endif /* __ICCARM_INTRINSICS_VERSION__ == 2 */ + +#define __BKPT(value) __asm volatile ("BKPT %0" : : "i"(value)) + +#if __IAR_M0_FAMILY + __STATIC_INLINE int32_t __SSAT(int32_t val, uint32_t sat) + { + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; + } + + __STATIC_INLINE uint32_t __USAT(int32_t val, uint32_t sat) + { + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; + } +#endif + +#if (__CORTEX_M >= 0x03) /* __CORTEX_M is defined in core_cm0.h, core_cm3.h and core_cm4.h. */ + + __IAR_FT uint8_t __LDRBT(volatile uint8_t *addr) + { + uint32_t res; + __ASM("LDRBT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); + return ((uint8_t)res); + } + + __IAR_FT uint16_t __LDRHT(volatile uint16_t *addr) + { + uint32_t res; + __ASM("LDRHT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); + return ((uint16_t)res); + } + + __IAR_FT uint32_t __LDRT(volatile uint32_t *addr) + { + uint32_t res; + __ASM("LDRT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); + return res; + } + + __IAR_FT void __STRBT(uint8_t value, volatile uint8_t *addr) + { + __ASM("STRBT %1, [%0]" : : "r" (addr), "r" ((uint32_t)value) : "memory"); + } + + __IAR_FT void __STRHT(uint16_t value, volatile uint16_t *addr) + { + __ASM("STRHT %1, [%0]" : : "r" (addr), "r" ((uint32_t)value) : "memory"); + } + + __IAR_FT void __STRT(uint32_t value, volatile uint32_t *addr) + { + __ASM("STRT %1, [%0]" : : "r" (addr), "r" (value) : "memory"); + } + +#endif /* (__CORTEX_M >= 0x03) */ + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + + + __IAR_FT uint8_t __LDAB(volatile uint8_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAB %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return ((uint8_t)res); + } + + __IAR_FT uint16_t __LDAH(volatile uint16_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAH %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return ((uint16_t)res); + } + + __IAR_FT uint32_t __LDA(volatile uint32_t *ptr) + { + uint32_t res; + __ASM volatile ("LDA %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return res; + } + + __IAR_FT void __STLB(uint8_t value, volatile uint8_t *ptr) + { + __ASM volatile ("STLB %1, [%0]" :: "r" (ptr), "r" (value) : "memory"); + } + + __IAR_FT void __STLH(uint16_t value, volatile uint16_t *ptr) + { + __ASM volatile ("STLH %1, [%0]" :: "r" (ptr), "r" (value) : "memory"); + } + + __IAR_FT void __STL(uint32_t value, volatile uint32_t *ptr) + { + __ASM volatile ("STL %1, [%0]" :: "r" (ptr), "r" (value) : "memory"); + } + + __IAR_FT uint8_t __LDAEXB(volatile uint8_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAEXB %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return ((uint8_t)res); + } + + __IAR_FT uint16_t __LDAEXH(volatile uint16_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAEXH %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return ((uint16_t)res); + } + + __IAR_FT uint32_t __LDAEX(volatile uint32_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAEX %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return res; + } + + __IAR_FT uint32_t __STLEXB(uint8_t value, volatile uint8_t *ptr) + { + uint32_t res; + __ASM volatile ("STLEXB %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory"); + return res; + } + + __IAR_FT uint32_t __STLEXH(uint16_t value, volatile uint16_t *ptr) + { + uint32_t res; + __ASM volatile ("STLEXH %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory"); + return res; + } + + __IAR_FT uint32_t __STLEX(uint32_t value, volatile uint32_t *ptr) + { + uint32_t res; + __ASM volatile ("STLEX %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory"); + return res; + } + +#endif /* __ARM_ARCH_8M_MAIN__ or __ARM_ARCH_8M_BASE__ */ + +#undef __IAR_FT +#undef __IAR_M0_FAMILY +#undef __ICCARM_V8 + +#pragma diag_default=Pe940 +#pragma diag_default=Pe177 + +#endif /* __CMSIS_ICCARM_H__ */ diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/cmsis_version.h b/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/cmsis_version.h new file mode 100644 index 00000000..660f612a --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/cmsis_version.h @@ -0,0 +1,39 @@ +/**************************************************************************//** + * @file cmsis_version.h + * @brief CMSIS Core(M) Version definitions + * @version V5.0.2 + * @date 19. April 2017 + ******************************************************************************/ +/* + * Copyright (c) 2009-2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CMSIS_VERSION_H +#define __CMSIS_VERSION_H + +/* CMSIS Version definitions */ +#define __CM_CMSIS_VERSION_MAIN ( 5U) /*!< [31:16] CMSIS Core(M) main version */ +#define __CM_CMSIS_VERSION_SUB ( 1U) /*!< [15:0] CMSIS Core(M) sub version */ +#define __CM_CMSIS_VERSION ((__CM_CMSIS_VERSION_MAIN << 16U) | \ + __CM_CMSIS_VERSION_SUB ) /*!< CMSIS Core(M) version number */ +#endif diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/core_armv8mbl.h b/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/core_armv8mbl.h new file mode 100644 index 00000000..251e4ede --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/core_armv8mbl.h @@ -0,0 +1,1918 @@ +/**************************************************************************//** + * @file core_armv8mbl.h + * @brief CMSIS Armv8-M Baseline Core Peripheral Access Layer Header File + * @version V5.0.7 + * @date 22. June 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_ARMV8MBL_H_GENERIC +#define __CORE_ARMV8MBL_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_ARMv8MBL + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS definitions */ +#define __ARMv8MBL_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __ARMv8MBL_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __ARMv8MBL_CMSIS_VERSION ((__ARMv8MBL_CMSIS_VERSION_MAIN << 16U) | \ + __ARMv8MBL_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M ( 2U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_ARMV8MBL_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_ARMV8MBL_H_DEPENDANT +#define __CORE_ARMV8MBL_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __ARMv8MBL_REV + #define __ARMv8MBL_REV 0x0000U + #warning "__ARMv8MBL_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __SAUREGION_PRESENT + #define __SAUREGION_PRESENT 0U + #warning "__SAUREGION_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __VTOR_PRESENT + #define __VTOR_PRESENT 0U + #warning "__VTOR_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif + + #ifndef __ETM_PRESENT + #define __ETM_PRESENT 0U + #warning "__ETM_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MTB_PRESENT + #define __MTB_PRESENT 0U + #warning "__MTB_PRESENT not defined in device header file; using default!" + #endif + +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group ARMv8MBL */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core SAU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[16U]; + __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[16U]; + __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[16U]; + __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[16U]; + __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[16U]; + __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ + uint32_t RESERVED5[16U]; + __IOM uint32_t IPR[124U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ +#else + uint32_t RESERVED0; +#endif + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + uint32_t RESERVED1; + __IOM uint32_t SHPR[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ +#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ + +#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ +#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ + +#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ +#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ +#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ +#endif + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ +#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ + +#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ +#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ + +#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ +#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ +#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ + +#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ +#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ +#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ +#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ + +#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ +#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + uint32_t RESERVED0[6U]; + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + uint32_t RESERVED3[1U]; + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED4[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + uint32_t RESERVED5[1U]; + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED6[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + uint32_t RESERVED7[1U]; + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED8[1U]; + __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ + uint32_t RESERVED9[1U]; + __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ + uint32_t RESERVED10[1U]; + __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ + uint32_t RESERVED11[1U]; + __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ + uint32_t RESERVED12[1U]; + __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ + uint32_t RESERVED13[1U]; + __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ + uint32_t RESERVED14[1U]; + __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ + uint32_t RESERVED15[1U]; + __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ + uint32_t RESERVED16[1U]; + __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ + uint32_t RESERVED17[1U]; + __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ + uint32_t RESERVED18[1U]; + __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ + uint32_t RESERVED19[1U]; + __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ + uint32_t RESERVED20[1U]; + __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ + uint32_t RESERVED21[1U]; + __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ + uint32_t RESERVED22[1U]; + __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ + uint32_t RESERVED23[1U]; + __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ + uint32_t RESERVED24[1U]; + __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ + uint32_t RESERVED25[1U]; + __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ + uint32_t RESERVED26[1U]; + __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ + uint32_t RESERVED27[1U]; + __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ + uint32_t RESERVED28[1U]; + __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ + uint32_t RESERVED29[1U]; + __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ + uint32_t RESERVED30[1U]; + __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ + uint32_t RESERVED31[1U]; + __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ +#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ + +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ +#define DWT_FUNCTION_ACTION_Msk (0x3UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ + +#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ +#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Sizes Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Sizes Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ + uint32_t RESERVED3[809U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) Software Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) Software Lock Status Register */ + uint32_t RESERVED4[4U]; + __IM uint32_t TYPE; /*!< Offset: 0xFC8 (R/ ) Device Identifier Register */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Register */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_SWOSCALER_Pos 0U /*!< TPI ACPR: SWOSCALER Position */ +#define TPI_ACPR_SWOSCALER_Msk (0xFFFFUL /*<< TPI_ACPR_SWOSCALER_Pos*/) /*!< TPI ACPR: SWOSCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ +#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI Periodic Synchronization Control Register Definitions */ +#define TPI_PSCR_PSCount_Pos 0U /*!< TPI PSCR: PSCount Position */ +#define TPI_PSCR_PSCount_Msk (0x1FUL /*<< TPI_PSCR_PSCount_Pos*/) /*!< TPI PSCR: TPSCount Mask */ + +/* TPI Software Lock Status Register Definitions */ +#define TPI_LSR_nTT_Pos 1U /*!< TPI LSR: Not thirty-two bit. Position */ +#define TPI_LSR_nTT_Msk (0x1UL << TPI_LSR_nTT_Pos) /*!< TPI LSR: Not thirty-two bit. Mask */ + +#define TPI_LSR_SLK_Pos 1U /*!< TPI LSR: Software Lock status Position */ +#define TPI_LSR_SLK_Msk (0x1UL << TPI_LSR_SLK_Pos) /*!< TPI LSR: Software Lock status Mask */ + +#define TPI_LSR_SLI_Pos 0U /*!< TPI LSR: Software Lock implemented Position */ +#define TPI_LSR_SLI_Msk (0x1UL /*<< TPI_LSR_SLI_Pos*/) /*!< TPI LSR: Software Lock implemented Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFO depth Position */ +#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFO depth Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ + uint32_t RESERVED0[7U]; + union { + __IOM uint32_t MAIR[2]; + struct { + __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ + __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ + }; + }; +} MPU_Type; + +#define MPU_TYPE_RALIASES 1U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ +#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ + +#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ +#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ + +#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ +#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ + +#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ +#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ + +/* MPU Region Limit Address Register Definitions */ +#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ +#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ + +#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ +#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ + +#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: EN Position */ +#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: EN Mask */ + +/* MPU Memory Attribute Indirection Register 0 Definitions */ +#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ +#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ + +#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ +#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ + +#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ +#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ + +#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ +#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ + +/* MPU Memory Attribute Indirection Register 1 Definitions */ +#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ +#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ + +#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ +#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ + +#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ +#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ + +#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ +#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SAU Security Attribution Unit (SAU) + \brief Type definitions for the Security Attribution Unit (SAU) + @{ + */ + +/** + \brief Structure type to access the Security Attribution Unit (SAU). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ + __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ +#endif +} SAU_Type; + +/* SAU Control Register Definitions */ +#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ +#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ + +#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ +#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ + +/* SAU Type Register Definitions */ +#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ +#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ + +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) +/* SAU Region Number Register Definitions */ +#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ +#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ + +/* SAU Region Base Address Register Definitions */ +#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ +#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ + +/* SAU Region Limit Address Register Definitions */ +#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ +#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ + +#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ +#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ + +#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ +#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ + +#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ + +/*@} end of group CMSIS_SAU */ +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + uint32_t RESERVED4[1U]; + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< CoreDebug DHCSR: S_RESTART_ST Position */ +#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< CoreDebug DHCSR: S_RESTART_ST Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register */ +#define CoreDebug_DEMCR_DWTENA_Pos 24U /*!< CoreDebug DEMCR: DWTENA Position */ +#define CoreDebug_DEMCR_DWTENA_Msk (1UL << CoreDebug_DEMCR_DWTENA_Pos) /*!< CoreDebug DEMCR: DWTENA Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/* Debug Authentication Control Register Definitions */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ + +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ + +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< CoreDebug DAUTHCTRL: INTSPIDEN Position */ +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPIDEN Mask */ + +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< CoreDebug DAUTHCTRL: SPIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< CoreDebug DAUTHCTRL: SPIDENSEL Mask */ + +/* Debug Security Control and Status Register Definitions */ +#define CoreDebug_DSCSR_CDS_Pos 16U /*!< CoreDebug DSCSR: CDS Position */ +#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< CoreDebug DSCSR: CDS Mask */ + +#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< CoreDebug DSCSR: SBRSEL Position */ +#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< CoreDebug DSCSR: SBRSEL Mask */ + +#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< CoreDebug DSCSR: SBRSELEN Position */ +#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< CoreDebug DSCSR: SBRSELEN Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ + #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ + #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ + #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ + #define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ + #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ + #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ + #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + + + #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ + #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ + #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ + #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ + #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< Core Debug configuration struct */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ + #endif + + #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ + #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ + #endif + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ + #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< Core Debug Base Address (non-secure address space) */ + #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ + #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ + #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ + + #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ + #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ + #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ + #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< Core Debug configuration struct (non-secure address space) */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ + #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ + #endif + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* Special LR values for Secure/Non-Secure call handling and exception handling */ + +/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ +#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ + +/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ +#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ +#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ +#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ +#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ +#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ +#define EXC_RETURN_SPSEL (0x00000002UL) /* bit [1] stack pointer used to restore context: 0=MSP 1=PSP */ +#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ + +/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ +#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ +#else +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ +#endif + + +/* Interrupt Priorities are WORD accessible only under Armv6-M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + +#define __NVIC_SetPriorityGrouping(X) (void)(X) +#define __NVIC_GetPriorityGrouping() (0U) + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Interrupt Target State + \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + \return 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Target State + \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Clear Interrupt Target State + \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + If VTOR is not present address 0 must be mapped to SRAM. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t *vectors = (uint32_t *)SCB->VTOR; +#else + uint32_t *vectors = (uint32_t *)0x0U; +#endif + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t *vectors = (uint32_t *)SCB->VTOR; +#else + uint32_t *vectors = (uint32_t *)0x0U; +#endif + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Enable Interrupt (non-secure) + \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status (non-secure) + \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt (non-secure) + \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Pending Interrupt (non-secure) + \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt (non-secure) + \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt (non-secure) + \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt (non-secure) + \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority (non-secure) + \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every non-secure processor exception. + */ +__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC_NS->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB_NS->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB_NS->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority (non-secure) + \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB_NS->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv8.h" + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ########################## SAU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SAUFunctions SAU Functions + \brief Functions that configure the SAU. + @{ + */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + +/** + \brief Enable SAU + \details Enables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Enable(void) +{ + SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); +} + + + +/** + \brief Disable SAU + \details Disables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Disable(void) +{ + SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); +} + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_SAUFunctions */ + + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief System Tick Configuration (non-secure) + \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function TZ_SysTick_Config_NS is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + + */ +__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_ARMV8MBL_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/core_armv8mml.h b/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/core_armv8mml.h new file mode 100644 index 00000000..3a3148ea --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/core_armv8mml.h @@ -0,0 +1,2927 @@ +/**************************************************************************//** + * @file core_armv8mml.h + * @brief CMSIS Armv8-M Mainline Core Peripheral Access Layer Header File + * @version V5.0.7 + * @date 06. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_ARMV8MML_H_GENERIC +#define __CORE_ARMV8MML_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_ARMv8MML + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS Armv8MML definitions */ +#define __ARMv8MML_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __ARMv8MML_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __ARMv8MML_CMSIS_VERSION ((__ARMv8MML_CMSIS_VERSION_MAIN << 16U) | \ + __ARMv8MML_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (81U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. +*/ +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined(__ARM_FEATURE_DSP) + #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined(__ARM_FEATURE_DSP) + #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined(__ARM_FEATURE_DSP) + #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined(__ARM_FEATURE_DSP) + #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_ARMV8MML_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_ARMV8MML_H_DEPENDANT +#define __CORE_ARMV8MML_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __ARMv8MML_REV + #define __ARMv8MML_REV 0x0000U + #warning "__ARMv8MML_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __SAUREGION_PRESENT + #define __SAUREGION_PRESENT 0U + #warning "__SAUREGION_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __DSP_PRESENT + #define __DSP_PRESENT 0U + #warning "__DSP_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group ARMv8MML */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core SAU Register + - Core FPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + +#define APSR_GE_Pos 16U /*!< APSR: GE Position */ +#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ +#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ +#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ + uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ + uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ + uint32_t _reserved1:28; /*!< bit: 4..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ +#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ + +#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ +#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ + +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[16U]; + __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[16U]; + __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[16U]; + __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[16U]; + __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[16U]; + __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ + uint32_t RESERVED5[16U]; + __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED6[580U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ID_ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ID_ISAR[6U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ + __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ + __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ + __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ + __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ + uint32_t RESERVED3[92U]; + __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ + uint32_t RESERVED4[15U]; + __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ + uint32_t RESERVED5[1U]; + __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ + uint32_t RESERVED6[1U]; + __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ + __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ + __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ + __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ + __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ + __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ + __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ + __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ + uint32_t RESERVED7[6U]; + __IOM uint32_t ITCMCR; /*!< Offset: 0x290 (R/W) Instruction Tightly-Coupled Memory Control Register */ + __IOM uint32_t DTCMCR; /*!< Offset: 0x294 (R/W) Data Tightly-Coupled Memory Control Registers */ + __IOM uint32_t AHBPCR; /*!< Offset: 0x298 (R/W) AHBP Control Register */ + __IOM uint32_t CACR; /*!< Offset: 0x29C (R/W) L1 Cache Control Register */ + __IOM uint32_t AHBSCR; /*!< Offset: 0x2A0 (R/W) AHB Slave Control Register */ + uint32_t RESERVED8[1U]; + __IOM uint32_t ABFSR; /*!< Offset: 0x2A8 (R/W) Auxiliary Bus Fault Status Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ +#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ + +#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ +#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ + +#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ +#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ +#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ +#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ + +#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ +#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ +#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ +#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ + +#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ +#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ +#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ +#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ +#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ + +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ +#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ + +#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ +#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ +#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MLSPERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ +#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ +#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ +#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/* SCB Non-Secure Access Control Register Definitions */ +#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ +#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ + +#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ +#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ + +#define SCB_NSACR_CPn_Pos 0U /*!< SCB NSACR: CPn Position */ +#define SCB_NSACR_CPn_Msk (1UL /*<< SCB_NSACR_CPn_Pos*/) /*!< SCB NSACR: CPn Mask */ + +/* SCB Cache Level ID Register Definitions */ +#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ +#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ + +#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ +#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ + +/* SCB Cache Type Register Definitions */ +#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ +#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ + +#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ +#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ + +#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ +#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ + +#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ +#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ + +#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ +#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ + +/* SCB Cache Size ID Register Definitions */ +#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ +#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ + +#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ +#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ + +#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ +#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ + +#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ +#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ + +#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ +#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ + +#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ +#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ + +#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ +#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ + +/* SCB Cache Size Selection Register Definitions */ +#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ +#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ + +#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ +#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ + +/* SCB Software Triggered Interrupt Register Definitions */ +#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ +#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ + +/* SCB D-Cache Invalidate by Set-way Register Definitions */ +#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ +#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ + +#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ +#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ + +/* SCB D-Cache Clean by Set-way Register Definitions */ +#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ +#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ + +#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ +#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ + +/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ +#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ +#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ + +#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ +#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ + +/* Instruction Tightly-Coupled Memory Control Register Definitions */ +#define SCB_ITCMCR_SZ_Pos 3U /*!< SCB ITCMCR: SZ Position */ +#define SCB_ITCMCR_SZ_Msk (0xFUL << SCB_ITCMCR_SZ_Pos) /*!< SCB ITCMCR: SZ Mask */ + +#define SCB_ITCMCR_RETEN_Pos 2U /*!< SCB ITCMCR: RETEN Position */ +#define SCB_ITCMCR_RETEN_Msk (1UL << SCB_ITCMCR_RETEN_Pos) /*!< SCB ITCMCR: RETEN Mask */ + +#define SCB_ITCMCR_RMW_Pos 1U /*!< SCB ITCMCR: RMW Position */ +#define SCB_ITCMCR_RMW_Msk (1UL << SCB_ITCMCR_RMW_Pos) /*!< SCB ITCMCR: RMW Mask */ + +#define SCB_ITCMCR_EN_Pos 0U /*!< SCB ITCMCR: EN Position */ +#define SCB_ITCMCR_EN_Msk (1UL /*<< SCB_ITCMCR_EN_Pos*/) /*!< SCB ITCMCR: EN Mask */ + +/* Data Tightly-Coupled Memory Control Register Definitions */ +#define SCB_DTCMCR_SZ_Pos 3U /*!< SCB DTCMCR: SZ Position */ +#define SCB_DTCMCR_SZ_Msk (0xFUL << SCB_DTCMCR_SZ_Pos) /*!< SCB DTCMCR: SZ Mask */ + +#define SCB_DTCMCR_RETEN_Pos 2U /*!< SCB DTCMCR: RETEN Position */ +#define SCB_DTCMCR_RETEN_Msk (1UL << SCB_DTCMCR_RETEN_Pos) /*!< SCB DTCMCR: RETEN Mask */ + +#define SCB_DTCMCR_RMW_Pos 1U /*!< SCB DTCMCR: RMW Position */ +#define SCB_DTCMCR_RMW_Msk (1UL << SCB_DTCMCR_RMW_Pos) /*!< SCB DTCMCR: RMW Mask */ + +#define SCB_DTCMCR_EN_Pos 0U /*!< SCB DTCMCR: EN Position */ +#define SCB_DTCMCR_EN_Msk (1UL /*<< SCB_DTCMCR_EN_Pos*/) /*!< SCB DTCMCR: EN Mask */ + +/* AHBP Control Register Definitions */ +#define SCB_AHBPCR_SZ_Pos 1U /*!< SCB AHBPCR: SZ Position */ +#define SCB_AHBPCR_SZ_Msk (7UL << SCB_AHBPCR_SZ_Pos) /*!< SCB AHBPCR: SZ Mask */ + +#define SCB_AHBPCR_EN_Pos 0U /*!< SCB AHBPCR: EN Position */ +#define SCB_AHBPCR_EN_Msk (1UL /*<< SCB_AHBPCR_EN_Pos*/) /*!< SCB AHBPCR: EN Mask */ + +/* L1 Cache Control Register Definitions */ +#define SCB_CACR_FORCEWT_Pos 2U /*!< SCB CACR: FORCEWT Position */ +#define SCB_CACR_FORCEWT_Msk (1UL << SCB_CACR_FORCEWT_Pos) /*!< SCB CACR: FORCEWT Mask */ + +#define SCB_CACR_ECCEN_Pos 1U /*!< SCB CACR: ECCEN Position */ +#define SCB_CACR_ECCEN_Msk (1UL << SCB_CACR_ECCEN_Pos) /*!< SCB CACR: ECCEN Mask */ + +#define SCB_CACR_SIWT_Pos 0U /*!< SCB CACR: SIWT Position */ +#define SCB_CACR_SIWT_Msk (1UL /*<< SCB_CACR_SIWT_Pos*/) /*!< SCB CACR: SIWT Mask */ + +/* AHBS Control Register Definitions */ +#define SCB_AHBSCR_INITCOUNT_Pos 11U /*!< SCB AHBSCR: INITCOUNT Position */ +#define SCB_AHBSCR_INITCOUNT_Msk (0x1FUL << SCB_AHBPCR_INITCOUNT_Pos) /*!< SCB AHBSCR: INITCOUNT Mask */ + +#define SCB_AHBSCR_TPRI_Pos 2U /*!< SCB AHBSCR: TPRI Position */ +#define SCB_AHBSCR_TPRI_Msk (0x1FFUL << SCB_AHBPCR_TPRI_Pos) /*!< SCB AHBSCR: TPRI Mask */ + +#define SCB_AHBSCR_CTL_Pos 0U /*!< SCB AHBSCR: CTL Position*/ +#define SCB_AHBSCR_CTL_Msk (3UL /*<< SCB_AHBPCR_CTL_Pos*/) /*!< SCB AHBSCR: CTL Mask */ + +/* Auxiliary Bus Fault Status Register Definitions */ +#define SCB_ABFSR_AXIMTYPE_Pos 8U /*!< SCB ABFSR: AXIMTYPE Position*/ +#define SCB_ABFSR_AXIMTYPE_Msk (3UL << SCB_ABFSR_AXIMTYPE_Pos) /*!< SCB ABFSR: AXIMTYPE Mask */ + +#define SCB_ABFSR_EPPB_Pos 4U /*!< SCB ABFSR: EPPB Position*/ +#define SCB_ABFSR_EPPB_Msk (1UL << SCB_ABFSR_EPPB_Pos) /*!< SCB ABFSR: EPPB Mask */ + +#define SCB_ABFSR_AXIM_Pos 3U /*!< SCB ABFSR: AXIM Position*/ +#define SCB_ABFSR_AXIM_Msk (1UL << SCB_ABFSR_AXIM_Pos) /*!< SCB ABFSR: AXIM Mask */ + +#define SCB_ABFSR_AHBP_Pos 2U /*!< SCB ABFSR: AHBP Position*/ +#define SCB_ABFSR_AHBP_Msk (1UL << SCB_ABFSR_AHBP_Pos) /*!< SCB ABFSR: AHBP Mask */ + +#define SCB_ABFSR_DTCM_Pos 1U /*!< SCB ABFSR: DTCM Position*/ +#define SCB_ABFSR_DTCM_Msk (1UL << SCB_ABFSR_DTCM_Pos) /*!< SCB ABFSR: DTCM Mask */ + +#define SCB_ABFSR_ITCM_Pos 0U /*!< SCB ABFSR: ITCM Position*/ +#define SCB_ABFSR_ITCM_Msk (1UL /*<< SCB_ABFSR_ITCM_Pos*/) /*!< SCB ABFSR: ITCM Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ + __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[29U]; + __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ + __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ + __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ + uint32_t RESERVED6[4U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Stimulus Port Register Definitions */ +#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ +#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ + +#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ +#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TRACEBUSID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TRACEBUSID_Msk (0x7FUL << ITM_TCR_TRACEBUSID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPRESCALE_Pos 8U /*!< ITM TCR: TSPRESCALE Position */ +#define ITM_TCR_TSPRESCALE_Msk (3UL << ITM_TCR_TSPRESCALE_Pos) /*!< ITM TCR: TSPRESCALE Mask */ + +#define ITM_TCR_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ +#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Integration Write Register Definitions */ +#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ +#define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ + +/* ITM Integration Read Register Definitions */ +#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ +#define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ + +/* ITM Integration Mode Control Register Definitions */ +#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ +#define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + uint32_t RESERVED3[1U]; + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED4[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + uint32_t RESERVED5[1U]; + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED6[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + uint32_t RESERVED7[1U]; + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED8[1U]; + __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ + uint32_t RESERVED9[1U]; + __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ + uint32_t RESERVED10[1U]; + __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ + uint32_t RESERVED11[1U]; + __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ + uint32_t RESERVED12[1U]; + __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ + uint32_t RESERVED13[1U]; + __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ + uint32_t RESERVED14[1U]; + __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ + uint32_t RESERVED15[1U]; + __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ + uint32_t RESERVED16[1U]; + __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ + uint32_t RESERVED17[1U]; + __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ + uint32_t RESERVED18[1U]; + __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ + uint32_t RESERVED19[1U]; + __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ + uint32_t RESERVED20[1U]; + __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ + uint32_t RESERVED21[1U]; + __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ + uint32_t RESERVED22[1U]; + __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ + uint32_t RESERVED23[1U]; + __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ + uint32_t RESERVED24[1U]; + __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ + uint32_t RESERVED25[1U]; + __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ + uint32_t RESERVED26[1U]; + __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ + uint32_t RESERVED27[1U]; + __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ + uint32_t RESERVED28[1U]; + __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ + uint32_t RESERVED29[1U]; + __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ + uint32_t RESERVED30[1U]; + __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ + uint32_t RESERVED31[1U]; + __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ + uint32_t RESERVED32[934U]; + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ + uint32_t RESERVED33[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ +#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ +#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ + +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ +#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ + +#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ +#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Sizes Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Sizes Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ + uint32_t RESERVED3[809U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) Software Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) Software Lock Status Register */ + uint32_t RESERVED4[4U]; + __IM uint32_t TYPE; /*!< Offset: 0xFC8 (R/ ) Device Identifier Register */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Register */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_SWOSCALER_Pos 0U /*!< TPI ACPR: SWOSCALER Position */ +#define TPI_ACPR_SWOSCALER_Msk (0xFFFFUL /*<< TPI_ACPR_SWOSCALER_Pos*/) /*!< TPI ACPR: SWOSCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ +#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI Periodic Synchronization Control Register Definitions */ +#define TPI_PSCR_PSCount_Pos 0U /*!< TPI PSCR: PSCount Position */ +#define TPI_PSCR_PSCount_Msk (0x1FUL /*<< TPI_PSCR_PSCount_Pos*/) /*!< TPI PSCR: TPSCount Mask */ + +/* TPI Software Lock Status Register Definitions */ +#define TPI_LSR_nTT_Pos 1U /*!< TPI LSR: Not thirty-two bit. Position */ +#define TPI_LSR_nTT_Msk (0x1UL << TPI_LSR_nTT_Pos) /*!< TPI LSR: Not thirty-two bit. Mask */ + +#define TPI_LSR_SLK_Pos 1U /*!< TPI LSR: Software Lock status Position */ +#define TPI_LSR_SLK_Msk (0x1UL << TPI_LSR_SLK_Pos) /*!< TPI LSR: Software Lock status Mask */ + +#define TPI_LSR_SLI_Pos 0U /*!< TPI LSR: Software Lock implemented Position */ +#define TPI_LSR_SLI_Msk (0x1UL /*<< TPI_LSR_SLI_Pos*/) /*!< TPI LSR: Software Lock implemented Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFO depth Position */ +#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFO depth Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ + __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ + __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ + __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ + uint32_t RESERVED0[1]; + union { + __IOM uint32_t MAIR[2]; + struct { + __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ + __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ + }; + }; +} MPU_Type; + +#define MPU_TYPE_RALIASES 4U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ +#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ + +#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ +#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ + +#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ +#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ + +#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ +#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ + +/* MPU Region Limit Address Register Definitions */ +#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ +#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ + +#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ +#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ + +#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ +#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ + +/* MPU Memory Attribute Indirection Register 0 Definitions */ +#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ +#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ + +#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ +#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ + +#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ +#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ + +#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ +#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ + +/* MPU Memory Attribute Indirection Register 1 Definitions */ +#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ +#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ + +#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ +#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ + +#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ +#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ + +#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ +#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SAU Security Attribution Unit (SAU) + \brief Type definitions for the Security Attribution Unit (SAU) + @{ + */ + +/** + \brief Structure type to access the Security Attribution Unit (SAU). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ + __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ +#else + uint32_t RESERVED0[3]; +#endif + __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ + __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ +} SAU_Type; + +/* SAU Control Register Definitions */ +#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ +#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ + +#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ +#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ + +/* SAU Type Register Definitions */ +#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ +#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ + +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) +/* SAU Region Number Register Definitions */ +#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ +#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ + +/* SAU Region Base Address Register Definitions */ +#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ +#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ + +/* SAU Region Limit Address Register Definitions */ +#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ +#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ + +#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ +#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ + +#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ +#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ + +#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ + +/* Secure Fault Status Register Definitions */ +#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ +#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ + +#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ +#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ + +#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ +#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ + +#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ +#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ + +#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ +#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ + +#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ +#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ + +#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ +#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ + +#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ +#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ + +/*@} end of group CMSIS_SAU */ +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_FPU Floating Point Unit (FPU) + \brief Type definitions for the Floating Point Unit (FPU) + @{ + */ + +/** + \brief Structure type to access the Floating Point Unit (FPU). + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ + __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ + __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ + __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ +} FPU_Type; + +/* Floating-Point Context Control Register Definitions */ +#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ +#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ + +#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ +#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ + +#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ +#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ + +#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ +#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ + +#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ +#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ + +#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ +#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ + +#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ +#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ + +#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ +#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ + +#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ +#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ + +#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ +#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ + +#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ +#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ + +#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ +#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ + +#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ +#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ + +#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ +#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ + +#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ +#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ + +#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ +#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ + +#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ +#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ + +/* Floating-Point Context Address Register Definitions */ +#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ +#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ + +/* Floating-Point Default Status Control Register Definitions */ +#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ +#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ + +#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ +#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ + +#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ +#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ + +#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ +#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ + +/* Media and FP Feature Register 0 Definitions */ +#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ +#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ + +#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ +#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ + +#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ +#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ + +#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ +#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ + +#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ +#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ + +#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ +#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ + +#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ +#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ + +#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ +#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ + +/* Media and FP Feature Register 1 Definitions */ +#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ +#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ + +#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ +#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ + +#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ +#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ + +#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ +#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ + +/*@} end of group CMSIS_FPU */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + uint32_t RESERVED4[1U]; + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< CoreDebug DHCSR: S_RESTART_ST Position */ +#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< CoreDebug DHCSR: S_RESTART_ST Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/* Debug Authentication Control Register Definitions */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ + +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ + +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< CoreDebug DAUTHCTRL: INTSPIDEN Position */ +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPIDEN Mask */ + +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< CoreDebug DAUTHCTRL: SPIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< CoreDebug DAUTHCTRL: SPIDENSEL Mask */ + +/* Debug Security Control and Status Register Definitions */ +#define CoreDebug_DSCSR_CDS_Pos 16U /*!< CoreDebug DSCSR: CDS Position */ +#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< CoreDebug DSCSR: CDS Mask */ + +#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< CoreDebug DSCSR: SBRSEL Position */ +#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< CoreDebug DSCSR: SBRSEL Mask */ + +#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< CoreDebug DSCSR: SBRSELEN Position */ +#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< CoreDebug DSCSR: SBRSELEN Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ + #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ + #define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ + #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ + #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ + #define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ + #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ + #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ + #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + + #define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ + #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ + #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ + #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + #define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ + #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ + #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ + #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< Core Debug configuration struct */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ + #endif + + #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ + #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ + #endif + + #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ + #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ + #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< Core Debug Base Address (non-secure address space) */ + #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ + #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ + #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ + + #define SCnSCB_NS ((SCnSCB_Type *) SCS_BASE_NS ) /*!< System control Register not in SCB(non-secure address space) */ + #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ + #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ + #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ + #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< Core Debug configuration struct (non-secure address space) */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ + #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ + #endif + + #define FPU_BASE_NS (SCS_BASE_NS + 0x0F30UL) /*!< Floating Point Unit (non-secure address space) */ + #define FPU_NS ((FPU_Type *) FPU_BASE_NS ) /*!< Floating Point Unit (non-secure address space) */ + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* Special LR values for Secure/Non-Secure call handling and exception handling */ + +/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ +#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ + +/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ +#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ +#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ +#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ +#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ +#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ +#define EXC_RETURN_SPSEL (0x00000002UL) /* bit [1] stack pointer used to restore context: 0=MSP 1=PSP */ +#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ + +/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ +#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ +#else +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ +#endif + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << 8U) ); /* Insert write key and priorty group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Interrupt Target State + \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + \return 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Target State + \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Clear Interrupt Target State + \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Set Priority Grouping (non-secure) + \details Sets the non-secure priority grouping field when in secure state using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB_NS->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << 8U) ); /* Insert write key and priorty group */ + SCB_NS->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping (non-secure) + \details Reads the priority grouping field from the non-secure NVIC when in secure state. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) +{ + return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt (non-secure) + \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status (non-secure) + \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt (non-secure) + \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Pending Interrupt (non-secure) + \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt (non-secure) + \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt (non-secure) + \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt (non-secure) + \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority (non-secure) + \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every non-secure processor exception. + */ +__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority (non-secure) + \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC_NS->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv8.h" + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + uint32_t mvfr0; + + mvfr0 = FPU->MVFR0; + if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) + { + return 2U; /* Double + Single precision FPU */ + } + else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) + { + return 1U; /* Single precision FPU */ + } + else + { + return 0U; /* No FPU */ + } +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ########################## SAU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SAUFunctions SAU Functions + \brief Functions that configure the SAU. + @{ + */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + +/** + \brief Enable SAU + \details Enables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Enable(void) +{ + SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); +} + + + +/** + \brief Disable SAU + \details Disables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Disable(void) +{ + SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); +} + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_SAUFunctions */ + + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief System Tick Configuration (non-secure) + \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function TZ_SysTick_Config_NS is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + + */ +__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_ARMV8MML_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/core_cm0.h b/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/core_cm0.h new file mode 100644 index 00000000..f929bba0 --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/core_cm0.h @@ -0,0 +1,949 @@ +/**************************************************************************//** + * @file core_cm0.h + * @brief CMSIS Cortex-M0 Core Peripheral Access Layer Header File + * @version V5.0.5 + * @date 28. May 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM0_H_GENERIC +#define __CORE_CM0_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M0 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM0 definitions */ +#define __CM0_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM0_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM0_CMSIS_VERSION ((__CM0_CMSIS_VERSION_MAIN << 16U) | \ + __CM0_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (0U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM0_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM0_H_DEPENDANT +#define __CORE_CM0_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM0_REV + #define __CM0_REV 0x0000U + #warning "__CM0_REV not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M0 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t _reserved0:1; /*!< bit: 0 Reserved */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[31U]; + __IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[31U]; + __IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[31U]; + __IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[31U]; + uint32_t RESERVED4[64U]; + __IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + uint32_t RESERVED0; + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + uint32_t RESERVED1; + __IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Cortex-M0 Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. + Therefore they are not covered by the Cortex-M0 header file. + @{ + */ +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ +/*#define NVIC_GetActive __NVIC_GetActive not available for Cortex-M0 */ + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* The following EXC_RETURN values are saved the LR on exception entry */ +#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ +#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ +#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ + + +/* Interrupt Priorities are WORD accessible only under Armv6-M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + +#define __NVIC_SetPriorityGrouping(X) (void)(X) +#define __NVIC_GetPriorityGrouping() (0U) + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + Address 0 must be mapped to SRAM. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)0x0U; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)0x0U; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM0_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/core_cm0plus.h b/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/core_cm0plus.h new file mode 100644 index 00000000..424011ac --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/core_cm0plus.h @@ -0,0 +1,1083 @@ +/**************************************************************************//** + * @file core_cm0plus.h + * @brief CMSIS Cortex-M0+ Core Peripheral Access Layer Header File + * @version V5.0.6 + * @date 28. May 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM0PLUS_H_GENERIC +#define __CORE_CM0PLUS_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex-M0+ + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM0+ definitions */ +#define __CM0PLUS_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM0PLUS_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM0PLUS_CMSIS_VERSION ((__CM0PLUS_CMSIS_VERSION_MAIN << 16U) | \ + __CM0PLUS_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (0U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM0PLUS_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM0PLUS_H_DEPENDANT +#define __CORE_CM0PLUS_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM0PLUS_REV + #define __CM0PLUS_REV 0x0000U + #warning "__CM0PLUS_REV not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __VTOR_PRESENT + #define __VTOR_PRESENT 0U + #warning "__VTOR_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex-M0+ */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core MPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[31U]; + __IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[31U]; + __IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[31U]; + __IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[31U]; + uint32_t RESERVED4[64U]; + __IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ +#else + uint32_t RESERVED0; +#endif + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + uint32_t RESERVED1; + __IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) +/* SCB Interrupt Control State Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 8U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0xFFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ +#endif + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ +} MPU_Type; + +#define MPU_TYPE_RALIASES 1U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 8U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0xFFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register Definitions */ +#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ + +#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ + +#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ + +#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ + +#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ + +#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ + +#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Cortex-M0+ Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. + Therefore they are not covered by the Cortex-M0+ header file. + @{ + */ +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ +/*#define NVIC_GetActive __NVIC_GetActive not available for Cortex-M0+ */ + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* The following EXC_RETURN values are saved the LR on exception entry */ +#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ +#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ +#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ + + +/* Interrupt Priorities are WORD accessible only under Armv6-M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + +#define __NVIC_SetPriorityGrouping(X) (void)(X) +#define __NVIC_GetPriorityGrouping() (0U) + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + If VTOR is not present address 0 must be mapped to SRAM. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t *vectors = (uint32_t *)SCB->VTOR; +#else + uint32_t *vectors = (uint32_t *)0x0U; +#endif + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t *vectors = (uint32_t *)SCB->VTOR; +#else + uint32_t *vectors = (uint32_t *)0x0U; +#endif + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; + +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv7.h" + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM0PLUS_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/core_cm1.h b/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/core_cm1.h new file mode 100644 index 00000000..0ed678e3 --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/core_cm1.h @@ -0,0 +1,976 @@ +/**************************************************************************//** + * @file core_cm1.h + * @brief CMSIS Cortex-M1 Core Peripheral Access Layer Header File + * @version V1.0.0 + * @date 23. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM1_H_GENERIC +#define __CORE_CM1_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M1 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM1 definitions */ +#define __CM1_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM1_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM1_CMSIS_VERSION ((__CM1_CMSIS_VERSION_MAIN << 16U) | \ + __CM1_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (1U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM1_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM1_H_DEPENDANT +#define __CORE_CM1_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM1_REV + #define __CM1_REV 0x0100U + #warning "__CM1_REV not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M1 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t _reserved0:1; /*!< bit: 0 Reserved */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[31U]; + __IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[31U]; + __IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[31U]; + __IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[31U]; + uint32_t RESERVED4[64U]; + __IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + uint32_t RESERVED0; + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + uint32_t RESERVED1; + __IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ +} SCnSCB_Type; + +/* Auxiliary Control Register Definitions */ +#define SCnSCB_ACTLR_ITCMUAEN_Pos 4U /*!< ACTLR: Instruction TCM Upper Alias Enable Position */ +#define SCnSCB_ACTLR_ITCMUAEN_Msk (1UL << SCnSCB_ACTLR_ITCMUAEN_Pos) /*!< ACTLR: Instruction TCM Upper Alias Enable Mask */ + +#define SCnSCB_ACTLR_ITCMLAEN_Pos 3U /*!< ACTLR: Instruction TCM Lower Alias Enable Position */ +#define SCnSCB_ACTLR_ITCMLAEN_Msk (1UL << SCnSCB_ACTLR_ITCMLAEN_Pos) /*!< ACTLR: Instruction TCM Lower Alias Enable Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Cortex-M1 Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. + Therefore they are not covered by the Cortex-M1 header file. + @{ + */ +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ +/*#define NVIC_GetActive __NVIC_GetActive not available for Cortex-M1 */ + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* The following EXC_RETURN values are saved the LR on exception entry */ +#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ +#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ +#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ + + +/* Interrupt Priorities are WORD accessible only under Armv6-M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + +#define __NVIC_SetPriorityGrouping(X) (void)(X) +#define __NVIC_GetPriorityGrouping() (0U) + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + Address 0 must be mapped to SRAM. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)0x0U; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)0x0U; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM1_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/core_cm23.h b/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/core_cm23.h new file mode 100644 index 00000000..acbc5dfe --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/core_cm23.h @@ -0,0 +1,1993 @@ +/**************************************************************************//** + * @file core_cm23.h + * @brief CMSIS Cortex-M23 Core Peripheral Access Layer Header File + * @version V5.0.7 + * @date 22. June 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM23_H_GENERIC +#define __CORE_CM23_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M23 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS definitions */ +#define __CM23_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM23_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM23_CMSIS_VERSION ((__CM23_CMSIS_VERSION_MAIN << 16U) | \ + __CM23_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (23U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM23_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM23_H_DEPENDANT +#define __CORE_CM23_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM23_REV + #define __CM23_REV 0x0000U + #warning "__CM23_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __SAUREGION_PRESENT + #define __SAUREGION_PRESENT 0U + #warning "__SAUREGION_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __VTOR_PRESENT + #define __VTOR_PRESENT 0U + #warning "__VTOR_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif + + #ifndef __ETM_PRESENT + #define __ETM_PRESENT 0U + #warning "__ETM_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MTB_PRESENT + #define __MTB_PRESENT 0U + #warning "__MTB_PRESENT not defined in device header file; using default!" + #endif + +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M23 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core SAU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[16U]; + __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[16U]; + __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[16U]; + __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[16U]; + __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[16U]; + __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ + uint32_t RESERVED5[16U]; + __IOM uint32_t IPR[124U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ +#else + uint32_t RESERVED0; +#endif + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + uint32_t RESERVED1; + __IOM uint32_t SHPR[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ +#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ + +#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ +#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ + +#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ +#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ +#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ +#endif + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ +#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ + +#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ +#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ + +#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ +#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ +#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ + +#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ +#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ +#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ +#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ + +#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ +#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + uint32_t RESERVED0[6U]; + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + uint32_t RESERVED3[1U]; + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED4[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + uint32_t RESERVED5[1U]; + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED6[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + uint32_t RESERVED7[1U]; + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED8[1U]; + __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ + uint32_t RESERVED9[1U]; + __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ + uint32_t RESERVED10[1U]; + __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ + uint32_t RESERVED11[1U]; + __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ + uint32_t RESERVED12[1U]; + __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ + uint32_t RESERVED13[1U]; + __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ + uint32_t RESERVED14[1U]; + __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ + uint32_t RESERVED15[1U]; + __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ + uint32_t RESERVED16[1U]; + __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ + uint32_t RESERVED17[1U]; + __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ + uint32_t RESERVED18[1U]; + __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ + uint32_t RESERVED19[1U]; + __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ + uint32_t RESERVED20[1U]; + __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ + uint32_t RESERVED21[1U]; + __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ + uint32_t RESERVED22[1U]; + __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ + uint32_t RESERVED23[1U]; + __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ + uint32_t RESERVED24[1U]; + __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ + uint32_t RESERVED25[1U]; + __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ + uint32_t RESERVED26[1U]; + __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ + uint32_t RESERVED27[1U]; + __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ + uint32_t RESERVED28[1U]; + __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ + uint32_t RESERVED29[1U]; + __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ + uint32_t RESERVED30[1U]; + __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ + uint32_t RESERVED31[1U]; + __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ +#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ + +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ +#define DWT_FUNCTION_ACTION_Msk (0x3UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ + +#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ +#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ + __IM uint32_t ITFTTD0; /*!< Offset: 0xEEC (R/ ) Integration Test FIFO Test Data 0 Register */ + __IOM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/W) Integration Test ATB Control Register 2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) Integration Test ATB Control Register 0 */ + __IM uint32_t ITFTTD1; /*!< Offset: 0xEFC (R/ ) Integration Test FIFO Test Data 1 Register */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) Device Configuration Register */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Identifier Register */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ +#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration Test FIFO Test Data 0 Register Definitions */ +#define TPI_ITFTTD0_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD0: ATB Interface 2 ATVALIDPosition */ +#define TPI_ITFTTD0_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 2 ATVALID Mask */ + +#define TPI_ITFTTD0_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD0: ATB Interface 2 byte count Position */ +#define TPI_ITFTTD0_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 2 byte count Mask */ + +#define TPI_ITFTTD0_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Position */ +#define TPI_ITFTTD0_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Mask */ + +#define TPI_ITFTTD0_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD0: ATB Interface 1 byte count Position */ +#define TPI_ITFTTD0_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 1 byte countt Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data2_Pos 16U /*!< TPI ITFTTD0: ATB Interface 1 data2 Position */ +#define TPI_ITFTTD0_ATB_IF1_data2_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data2 Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data1_Pos 8U /*!< TPI ITFTTD0: ATB Interface 1 data1 Position */ +#define TPI_ITFTTD0_ATB_IF1_data1_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data1 Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data0_Pos 0U /*!< TPI ITFTTD0: ATB Interface 1 data0 Position */ +#define TPI_ITFTTD0_ATB_IF1_data0_Msk (0xFFUL /*<< TPI_ITFTTD0_ATB_IF1_data0_Pos*/) /*!< TPI ITFTTD0: ATB Interface 1 data0 Mask */ + +/* TPI Integration Test ATB Control Register 2 Register Definitions */ +#define TPI_ITATBCTR2_AFVALID2S_Pos 1U /*!< TPI ITATBCTR2: AFVALID2S Position */ +#define TPI_ITATBCTR2_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID2S_Pos) /*!< TPI ITATBCTR2: AFVALID2SS Mask */ + +#define TPI_ITATBCTR2_AFVALID1S_Pos 1U /*!< TPI ITATBCTR2: AFVALID1S Position */ +#define TPI_ITATBCTR2_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID1S_Pos) /*!< TPI ITATBCTR2: AFVALID1SS Mask */ + +#define TPI_ITATBCTR2_ATREADY2S_Pos 0U /*!< TPI ITATBCTR2: ATREADY2S Position */ +#define TPI_ITATBCTR2_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2S_Pos*/) /*!< TPI ITATBCTR2: ATREADY2S Mask */ + +#define TPI_ITATBCTR2_ATREADY1S_Pos 0U /*!< TPI ITATBCTR2: ATREADY1S Position */ +#define TPI_ITATBCTR2_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1S_Pos*/) /*!< TPI ITATBCTR2: ATREADY1S Mask */ + +/* TPI Integration Test FIFO Test Data 1 Register Definitions */ +#define TPI_ITFTTD1_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Position */ +#define TPI_ITFTTD1_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Mask */ + +#define TPI_ITFTTD1_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD1: ATB Interface 2 byte count Position */ +#define TPI_ITFTTD1_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 2 byte count Mask */ + +#define TPI_ITFTTD1_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Position */ +#define TPI_ITFTTD1_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Mask */ + +#define TPI_ITFTTD1_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD1: ATB Interface 1 byte count Position */ +#define TPI_ITFTTD1_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 1 byte countt Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data2_Pos 16U /*!< TPI ITFTTD1: ATB Interface 2 data2 Position */ +#define TPI_ITFTTD1_ATB_IF2_data2_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data2 Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data1_Pos 8U /*!< TPI ITFTTD1: ATB Interface 2 data1 Position */ +#define TPI_ITFTTD1_ATB_IF2_data1_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data1 Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data0_Pos 0U /*!< TPI ITFTTD1: ATB Interface 2 data0 Position */ +#define TPI_ITFTTD1_ATB_IF2_data0_Msk (0xFFUL /*<< TPI_ITFTTD1_ATB_IF2_data0_Pos*/) /*!< TPI ITFTTD1: ATB Interface 2 data0 Mask */ + +/* TPI Integration Test ATB Control Register 0 Definitions */ +#define TPI_ITATBCTR0_AFVALID2S_Pos 1U /*!< TPI ITATBCTR0: AFVALID2S Position */ +#define TPI_ITATBCTR0_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID2S_Pos) /*!< TPI ITATBCTR0: AFVALID2SS Mask */ + +#define TPI_ITATBCTR0_AFVALID1S_Pos 1U /*!< TPI ITATBCTR0: AFVALID1S Position */ +#define TPI_ITATBCTR0_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID1S_Pos) /*!< TPI ITATBCTR0: AFVALID1SS Mask */ + +#define TPI_ITATBCTR0_ATREADY2S_Pos 0U /*!< TPI ITATBCTR0: ATREADY2S Position */ +#define TPI_ITATBCTR0_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2S_Pos*/) /*!< TPI ITATBCTR0: ATREADY2S Mask */ + +#define TPI_ITATBCTR0_ATREADY1S_Pos 0U /*!< TPI ITATBCTR0: ATREADY1S Position */ +#define TPI_ITATBCTR0_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1S_Pos*/) /*!< TPI ITATBCTR0: ATREADY1S Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFOSZ Position */ +#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFOSZ Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x3FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ + uint32_t RESERVED0[7U]; + union { + __IOM uint32_t MAIR[2]; + struct { + __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ + __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ + }; + }; +} MPU_Type; + +#define MPU_TYPE_RALIASES 1U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ +#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ + +#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ +#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ + +#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ +#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ + +#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ +#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ + +/* MPU Region Limit Address Register Definitions */ +#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ +#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ + +#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ +#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ + +#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: EN Position */ +#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: EN Mask */ + +/* MPU Memory Attribute Indirection Register 0 Definitions */ +#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ +#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ + +#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ +#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ + +#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ +#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ + +#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ +#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ + +/* MPU Memory Attribute Indirection Register 1 Definitions */ +#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ +#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ + +#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ +#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ + +#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ +#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ + +#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ +#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SAU Security Attribution Unit (SAU) + \brief Type definitions for the Security Attribution Unit (SAU) + @{ + */ + +/** + \brief Structure type to access the Security Attribution Unit (SAU). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ + __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ +#endif +} SAU_Type; + +/* SAU Control Register Definitions */ +#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ +#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ + +#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ +#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ + +/* SAU Type Register Definitions */ +#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ +#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ + +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) +/* SAU Region Number Register Definitions */ +#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ +#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ + +/* SAU Region Base Address Register Definitions */ +#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ +#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ + +/* SAU Region Limit Address Register Definitions */ +#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ +#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ + +#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ +#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ + +#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ +#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ + +#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ + +/*@} end of group CMSIS_SAU */ +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + uint32_t RESERVED4[1U]; + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< CoreDebug DHCSR: S_RESTART_ST Position */ +#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< CoreDebug DHCSR: S_RESTART_ST Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register */ +#define CoreDebug_DEMCR_DWTENA_Pos 24U /*!< CoreDebug DEMCR: DWTENA Position */ +#define CoreDebug_DEMCR_DWTENA_Msk (1UL << CoreDebug_DEMCR_DWTENA_Pos) /*!< CoreDebug DEMCR: DWTENA Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/* Debug Authentication Control Register Definitions */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ + +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ + +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< CoreDebug DAUTHCTRL: INTSPIDEN Position */ +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPIDEN Mask */ + +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< CoreDebug DAUTHCTRL: SPIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< CoreDebug DAUTHCTRL: SPIDENSEL Mask */ + +/* Debug Security Control and Status Register Definitions */ +#define CoreDebug_DSCSR_CDS_Pos 16U /*!< CoreDebug DSCSR: CDS Position */ +#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< CoreDebug DSCSR: CDS Mask */ + +#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< CoreDebug DSCSR: SBRSEL Position */ +#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< CoreDebug DSCSR: SBRSEL Mask */ + +#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< CoreDebug DSCSR: SBRSELEN Position */ +#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< CoreDebug DSCSR: SBRSELEN Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ + #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ + #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ + #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ + #define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ + #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ + #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ + #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + + + #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ + #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ + #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ + #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ + #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< Core Debug configuration struct */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ + #endif + + #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ + #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ + #endif + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ + #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< Core Debug Base Address (non-secure address space) */ + #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ + #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ + #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ + + #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ + #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ + #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ + #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< Core Debug configuration struct (non-secure address space) */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ + #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ + #endif + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else +/*#define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping not available for Cortex-M23 */ +/*#define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping not available for Cortex-M23 */ + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* Special LR values for Secure/Non-Secure call handling and exception handling */ + +/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ +#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ + +/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ +#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ +#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ +#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ +#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ +#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ +#define EXC_RETURN_SPSEL (0x00000002UL) /* bit [1] stack pointer used to restore context: 0=MSP 1=PSP */ +#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ + +/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ +#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ +#else +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ +#endif + + +/* Interrupt Priorities are WORD accessible only under Armv6-M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + +#define __NVIC_SetPriorityGrouping(X) (void)(X) +#define __NVIC_GetPriorityGrouping() (0U) + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Interrupt Target State + \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + \return 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Target State + \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Clear Interrupt Target State + \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + If VTOR is not present address 0 must be mapped to SRAM. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t *vectors = (uint32_t *)SCB->VTOR; +#else + uint32_t *vectors = (uint32_t *)0x0U; +#endif + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t *vectors = (uint32_t *)SCB->VTOR; +#else + uint32_t *vectors = (uint32_t *)0x0U; +#endif + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Enable Interrupt (non-secure) + \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status (non-secure) + \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt (non-secure) + \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Pending Interrupt (non-secure) + \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt (non-secure) + \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt (non-secure) + \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt (non-secure) + \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority (non-secure) + \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every non-secure processor exception. + */ +__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC_NS->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB_NS->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB_NS->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority (non-secure) + \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB_NS->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv8.h" + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ########################## SAU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SAUFunctions SAU Functions + \brief Functions that configure the SAU. + @{ + */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + +/** + \brief Enable SAU + \details Enables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Enable(void) +{ + SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); +} + + + +/** + \brief Disable SAU + \details Disables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Disable(void) +{ + SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); +} + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_SAUFunctions */ + + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief System Tick Configuration (non-secure) + \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function TZ_SysTick_Config_NS is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + + */ +__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM23_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Include/core_cm3.h b/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/core_cm3.h old mode 100755 new mode 100644 similarity index 51% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Include/core_cm3.h rename to STM32CubeMX/revF/Drivers/CMSIS/Core/Include/core_cm3.h index 092ee23d..74bff64b --- a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Include/core_cm3.h +++ b/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/core_cm3.h @@ -1,52 +1,44 @@ /**************************************************************************//** * @file core_cm3.h * @brief CMSIS Cortex-M3 Core Peripheral Access Layer Header File - * @version V4.10 - * @date 18. March 2015 + * @version V5.0.8 + * @date 04. June 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. * - * @note + * SPDX-License-Identifier: Apache-2.0 * - ******************************************************************************/ -/* Copyright (c) 2009 - 2015 ARM LIMITED - - All rights reserved. - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - Neither the name of ARM nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - * - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - ---------------------------------------------------------------------------*/ - - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ #endif #ifndef __CORE_CM3_H_GENERIC #define __CORE_CM3_H_GENERIC +#include + #ifdef __cplusplus extern "C" { #endif -/** \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions CMSIS violates the following MISRA-C:2004 rules: \li Required Rule 8.5, object/function definition in header file.
@@ -63,74 +55,49 @@ /******************************************************************************* * CMSIS definitions ******************************************************************************/ -/** \ingroup Cortex_M3 +/** + \ingroup Cortex_M3 @{ */ -/* CMSIS CM3 definitions */ -#define __CM3_CMSIS_VERSION_MAIN (0x04) /*!< [31:16] CMSIS HAL main version */ -#define __CM3_CMSIS_VERSION_SUB (0x00) /*!< [15:0] CMSIS HAL sub version */ -#define __CM3_CMSIS_VERSION ((__CM3_CMSIS_VERSION_MAIN << 16) | \ - __CM3_CMSIS_VERSION_SUB ) /*!< CMSIS HAL version number */ - -#define __CORTEX_M (0x03) /*!< Cortex-M Core */ - - -#if defined ( __CC_ARM ) - #define __ASM __asm /*!< asm keyword for ARM Compiler */ - #define __INLINE __inline /*!< inline keyword for ARM Compiler */ - #define __STATIC_INLINE static __inline - -#elif defined ( __GNUC__ ) - #define __ASM __asm /*!< asm keyword for GNU Compiler */ - #define __INLINE inline /*!< inline keyword for GNU Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __ICCARM__ ) - #define __ASM __asm /*!< asm keyword for IAR Compiler */ - #define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */ - #define __STATIC_INLINE static inline - -#elif defined ( __TMS470__ ) - #define __ASM __asm /*!< asm keyword for TI CCS Compiler */ - #define __STATIC_INLINE static inline +#include "cmsis_version.h" -#elif defined ( __TASKING__ ) - #define __ASM __asm /*!< asm keyword for TASKING Compiler */ - #define __INLINE inline /*!< inline keyword for TASKING Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __CSMC__ ) - #define __packed - #define __ASM _asm /*!< asm keyword for COSMIC Compiler */ - #define __INLINE inline /*use -pc99 on compile line !< inline keyword for COSMIC Compiler */ - #define __STATIC_INLINE static inline +/* CMSIS CM3 definitions */ +#define __CM3_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM3_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM3_CMSIS_VERSION ((__CM3_CMSIS_VERSION_MAIN << 16U) | \ + __CM3_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ -#endif +#define __CORTEX_M (3U) /*!< Cortex-M Core */ /** __FPU_USED indicates whether an FPU is used or not. This core does not support an FPU at all */ -#define __FPU_USED 0 +#define __FPU_USED 0U #if defined ( __CC_ARM ) #if defined __TARGET_FPU_VFP - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" #endif #elif defined ( __GNUC__ ) #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" #endif #elif defined ( __ICCARM__ ) #if defined __ARMVFP__ - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" #endif -#elif defined ( __TMS470__ ) - #if defined __TI__VFP_SUPPORT____ - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" #endif #elif defined ( __TASKING__ ) @@ -138,15 +105,15 @@ #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" #endif -#elif defined ( __CSMC__ ) /* Cosmic */ - #if ( __CSMC__ & 0x400) // FPU present for parser +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" #endif + #endif -#include /* standard types definitions */ -#include /* Core Instruction Access */ -#include /* Core Function Access */ +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + #ifdef __cplusplus } @@ -166,22 +133,22 @@ /* check device defines and use defaults */ #if defined __CHECK_DEVICE_DEFINES #ifndef __CM3_REV - #define __CM3_REV 0x0200 + #define __CM3_REV 0x0200U #warning "__CM3_REV not defined in device header file; using default!" #endif #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0 + #define __MPU_PRESENT 0U #warning "__MPU_PRESENT not defined in device header file; using default!" #endif #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 4 + #define __NVIC_PRIO_BITS 3U #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" #endif #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0 + #define __Vendor_SysTickConfig 0U #warning "__Vendor_SysTickConfig not defined in device header file; using default!" #endif #endif @@ -195,12 +162,17 @@ \li for automatic generation of peripheral register debug information. */ #ifdef __cplusplus - #define __I volatile /*!< Defines 'read only' permissions */ + #define __I volatile /*!< Defines 'read only' permissions */ #else - #define __I volatile const /*!< Defines 'read only' permissions */ + #define __I volatile const /*!< Defines 'read only' permissions */ #endif -#define __O volatile /*!< Defines 'write only' permissions */ -#define __IO volatile /*!< Defines 'read / write' permissions */ +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ /*@} end of group Cortex_M3 */ @@ -216,1101 +188,1219 @@ - Core Debug Register - Core MPU Register ******************************************************************************/ -/** \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. */ -/** \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. @{ */ -/** \brief Union type to access the Application Program Status Register (APSR). +/** + \brief Union type to access the Application Program Status Register (APSR). */ typedef union { struct { - uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ + uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ } APSR_Type; /* APSR Register Definitions */ -#define APSR_N_Pos 31 /*!< APSR: N Position */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ #define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ -#define APSR_Z_Pos 30 /*!< APSR: Z Position */ +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ #define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ -#define APSR_C_Pos 29 /*!< APSR: C Position */ +#define APSR_C_Pos 29U /*!< APSR: C Position */ #define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ -#define APSR_V_Pos 28 /*!< APSR: V Position */ +#define APSR_V_Pos 28U /*!< APSR: V Position */ #define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ -#define APSR_Q_Pos 27 /*!< APSR: Q Position */ +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ #define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ -/** \brief Union type to access the Interrupt Program Status Register (IPSR). +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). */ typedef union { struct { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ } IPSR_Type; /* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0 /*!< IPSR: ISR Position */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ #define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ -/** \brief Union type to access the Special-Purpose Program Status Registers (xPSR). +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). */ typedef union { struct { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:1; /*!< bit: 9 Reserved */ + uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ + uint32_t _reserved1:8; /*!< bit: 16..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit */ + uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ } xPSR_Type; /* xPSR Register Definitions */ -#define xPSR_N_Pos 31 /*!< xPSR: N Position */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ #define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ -#define xPSR_Z_Pos 30 /*!< xPSR: Z Position */ +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ #define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ -#define xPSR_C_Pos 29 /*!< xPSR: C Position */ +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ #define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ -#define xPSR_V_Pos 28 /*!< xPSR: V Position */ +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ #define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ -#define xPSR_Q_Pos 27 /*!< xPSR: Q Position */ +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ #define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ -#define xPSR_IT_Pos 25 /*!< xPSR: IT Position */ -#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ +#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ +#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ -#define xPSR_T_Pos 24 /*!< xPSR: T Position */ +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ #define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ -#define xPSR_ISR_Pos 0 /*!< xPSR: ISR Position */ +#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ +#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ #define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ -/** \brief Union type to access the Control Registers (CONTROL). +/** + \brief Union type to access the Control Registers (CONTROL). */ typedef union { struct { uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ } CONTROL_Type; /* CONTROL Register Definitions */ -#define CONTROL_SPSEL_Pos 1 /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ #define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ -#define CONTROL_nPRIV_Pos 0 /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ #define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ /*@} end of group CMSIS_CORE */ -/** \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers @{ */ -/** \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). */ typedef struct { - __IO uint32_t ISER[8]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[24]; - __IO uint32_t ICER[8]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[24]; - __IO uint32_t ISPR[8]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[24]; - __IO uint32_t ICPR[8]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[24]; - __IO uint32_t IABR[8]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[56]; - __IO uint8_t IP[240]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED5[644]; - __O uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ + __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[24U]; + __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[24U]; + __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[24U]; + __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[24U]; + __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[56U]; + __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED5[644U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ } NVIC_Type; /* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0 /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ #define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ /*@} end of group CMSIS_NVIC */ -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers @{ */ -/** \brief Structure type to access the System Control Block (SCB). +/** + \brief Structure type to access the System Control Block (SCB). */ typedef struct { - __I uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IO uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IO uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IO uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IO uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IO uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - __IO uint8_t SHP[12]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IO uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IO uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IO uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IO uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IO uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IO uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IO uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __I uint32_t PFR[2]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __I uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __I uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __I uint32_t MMFR[4]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __I uint32_t ISAR[5]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - uint32_t RESERVED0[5]; - __IO uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHP[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + uint32_t RESERVED0[5U]; + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ } SCB_Type; /* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24 /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ #define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ -#define SCB_CPUID_VARIANT_Pos 20 /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ #define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ -#define SCB_CPUID_ARCHITECTURE_Pos 16 /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ #define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ -#define SCB_CPUID_PARTNO_Pos 4 /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ #define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ -#define SCB_CPUID_REVISION_Pos 0 /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ #define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ /* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31 /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ #define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ -#define SCB_ICSR_PENDSVSET_Pos 28 /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ #define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ -#define SCB_ICSR_PENDSVCLR_Pos 27 /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ #define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ -#define SCB_ICSR_PENDSTSET_Pos 26 /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ #define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ -#define SCB_ICSR_PENDSTCLR_Pos 25 /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ #define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ -#define SCB_ICSR_ISRPREEMPT_Pos 23 /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ #define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ -#define SCB_ICSR_ISRPENDING_Pos 22 /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ #define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ -#define SCB_ICSR_VECTPENDING_Pos 12 /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ #define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ -#define SCB_ICSR_RETTOBASE_Pos 11 /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ #define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ -#define SCB_ICSR_VECTACTIVE_Pos 0 /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ #define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ /* SCB Vector Table Offset Register Definitions */ -#if (__CM3_REV < 0x0201) /* core r2p1 */ -#define SCB_VTOR_TBLBASE_Pos 29 /*!< SCB VTOR: TBLBASE Position */ +#if defined (__CM3_REV) && (__CM3_REV < 0x0201U) /* core r2p1 */ +#define SCB_VTOR_TBLBASE_Pos 29U /*!< SCB VTOR: TBLBASE Position */ #define SCB_VTOR_TBLBASE_Msk (1UL << SCB_VTOR_TBLBASE_Pos) /*!< SCB VTOR: TBLBASE Mask */ -#define SCB_VTOR_TBLOFF_Pos 7 /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ #define SCB_VTOR_TBLOFF_Msk (0x3FFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ #else -#define SCB_VTOR_TBLOFF_Pos 7 /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ #define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ #endif /* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16 /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ #define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ -#define SCB_AIRCR_VECTKEYSTAT_Pos 16 /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ #define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ -#define SCB_AIRCR_ENDIANESS_Pos 15 /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ #define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ -#define SCB_AIRCR_PRIGROUP_Pos 8 /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ #define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ -#define SCB_AIRCR_SYSRESETREQ_Pos 2 /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ #define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1 /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ #define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ -#define SCB_AIRCR_VECTRESET_Pos 0 /*!< SCB AIRCR: VECTRESET Position */ +#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ #define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */ /* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4 /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ #define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ -#define SCB_SCR_SLEEPDEEP_Pos 2 /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ #define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ -#define SCB_SCR_SLEEPONEXIT_Pos 1 /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ #define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ /* SCB Configuration Control Register Definitions */ -#define SCB_CCR_STKALIGN_Pos 9 /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ #define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ -#define SCB_CCR_BFHFNMIGN_Pos 8 /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ #define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ -#define SCB_CCR_DIV_0_TRP_Pos 4 /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ #define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ -#define SCB_CCR_UNALIGN_TRP_Pos 3 /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ #define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ -#define SCB_CCR_USERSETMPEND_Pos 1 /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ #define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ -#define SCB_CCR_NONBASETHRDENA_Pos 0 /*!< SCB CCR: NONBASETHRDENA Position */ +#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ #define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ /* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_USGFAULTENA_Pos 18 /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ #define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ -#define SCB_SHCSR_BUSFAULTENA_Pos 17 /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ #define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ -#define SCB_SHCSR_MEMFAULTENA_Pos 16 /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ #define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ -#define SCB_SHCSR_SVCALLPENDED_Pos 15 /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ #define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14 /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ #define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13 /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ #define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ -#define SCB_SHCSR_USGFAULTPENDED_Pos 12 /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ #define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ -#define SCB_SHCSR_SYSTICKACT_Pos 11 /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ #define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ -#define SCB_SHCSR_PENDSVACT_Pos 10 /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ #define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ -#define SCB_SHCSR_MONITORACT_Pos 8 /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ #define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ -#define SCB_SHCSR_SVCALLACT_Pos 7 /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ #define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ -#define SCB_SHCSR_USGFAULTACT_Pos 3 /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ #define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ -#define SCB_SHCSR_BUSFAULTACT_Pos 1 /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ #define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ -#define SCB_SHCSR_MEMFAULTACT_Pos 0 /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ #define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ -/* SCB Configurable Fault Status Registers Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16 /*!< SCB CFSR: Usage Fault Status Register Position */ +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ #define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ -#define SCB_CFSR_BUSFAULTSR_Pos 8 /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ #define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ -#define SCB_CFSR_MEMFAULTSR_Pos 0 /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ #define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ -/* SCB Hard Fault Status Registers Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31 /*!< SCB HFSR: DEBUGEVT Position */ +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ #define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ -#define SCB_HFSR_FORCED_Pos 30 /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ #define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ -#define SCB_HFSR_VECTTBL_Pos 1 /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ #define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ /* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4 /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ #define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ -#define SCB_DFSR_VCATCH_Pos 3 /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ #define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ -#define SCB_DFSR_DWTTRAP_Pos 2 /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ #define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ -#define SCB_DFSR_BKPT_Pos 1 /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ #define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ -#define SCB_DFSR_HALTED_Pos 0 /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ #define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ /*@} end of group CMSIS_SCB */ -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) - \brief Type definitions for the System Control and ID Register not in the SCB +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB @{ */ -/** \brief Structure type to access the System Control and ID Register not in the SCB. +/** + \brief Structure type to access the System Control and ID Register not in the SCB. */ typedef struct { - uint32_t RESERVED0[1]; - __I uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ -#if ((defined __CM3_REV) && (__CM3_REV >= 0x200)) - __IO uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ +#if defined (__CM3_REV) && (__CM3_REV >= 0x200U) + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ #else - uint32_t RESERVED1[1]; + uint32_t RESERVED1[1U]; #endif } SCnSCB_Type; /* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0 /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ #define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ /* Auxiliary Control Register Definitions */ -#define SCnSCB_ACTLR_DISFOLD_Pos 2 /*!< ACTLR: DISFOLD Position */ +#define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ #define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ -#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1 /*!< ACTLR: DISDEFWBUF Position */ +#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1U /*!< ACTLR: DISDEFWBUF Position */ #define SCnSCB_ACTLR_DISDEFWBUF_Msk (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos) /*!< ACTLR: DISDEFWBUF Mask */ -#define SCnSCB_ACTLR_DISMCYCINT_Pos 0 /*!< ACTLR: DISMCYCINT Position */ +#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ #define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ /*@} end of group CMSIS_SCnotSCB */ -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. @{ */ -/** \brief Structure type to access the System Timer (SysTick). +/** + \brief Structure type to access the System Timer (SysTick). */ typedef struct { - __IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IO uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IO uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __I uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ } SysTick_Type; /* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16 /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ #define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ -#define SysTick_CTRL_CLKSOURCE_Pos 2 /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ #define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ -#define SysTick_CTRL_TICKINT_Pos 1 /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ #define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ -#define SysTick_CTRL_ENABLE_Pos 0 /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ #define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ /* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0 /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ #define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ /* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0 /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ #define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ /* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31 /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ #define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ -#define SysTick_CALIB_SKEW_Pos 30 /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ #define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ -#define SysTick_CALIB_TENMS_Pos 0 /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ #define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ /*@} end of group CMSIS_SysTick */ -/** \ingroup CMSIS_core_register - \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) @{ */ -/** \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). */ typedef struct { - __O union + __OM union { - __O uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __O uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __O uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864]; - __IO uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15]; - __IO uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15]; - __IO uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[29]; - __O uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ - __I uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ - __IO uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ - uint32_t RESERVED4[43]; - __O uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __I uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[6]; - __I uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __I uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __I uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __I uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __I uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __I uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __I uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __I uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __I uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __I uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __I uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __I uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[29U]; + __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ + __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ + __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[6U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ } ITM_Type; /* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0 /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ /* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23 /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ #define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ -#define ITM_TCR_TraceBusID_Pos 16 /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ #define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ -#define ITM_TCR_GTSFREQ_Pos 10 /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ #define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ -#define ITM_TCR_TSPrescale_Pos 8 /*!< ITM TCR: TSPrescale Position */ +#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ #define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ -#define ITM_TCR_SWOENA_Pos 4 /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ #define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ -#define ITM_TCR_DWTENA_Pos 3 /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ #define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ -#define ITM_TCR_SYNCENA_Pos 2 /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ #define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ -#define ITM_TCR_TSENA_Pos 1 /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ #define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ -#define ITM_TCR_ITMENA_Pos 0 /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ #define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ /* ITM Integration Write Register Definitions */ -#define ITM_IWR_ATVALIDM_Pos 0 /*!< ITM IWR: ATVALIDM Position */ +#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ #define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ /* ITM Integration Read Register Definitions */ -#define ITM_IRR_ATREADYM_Pos 0 /*!< ITM IRR: ATREADYM Position */ +#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ #define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ /* ITM Integration Mode Control Register Definitions */ -#define ITM_IMCR_INTEGRATION_Pos 0 /*!< ITM IMCR: INTEGRATION Position */ +#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ #define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION Mask */ /* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2 /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ #define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ -#define ITM_LSR_Access_Pos 1 /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ #define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ -#define ITM_LSR_Present_Pos 0 /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ #define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ /*@}*/ /* end of group CMSIS_ITM */ -/** \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) @{ */ -/** \brief Structure type to access the Data Watchpoint and Trace Register (DWT). +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). */ typedef struct { - __IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IO uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IO uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IO uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IO uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IO uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IO uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __I uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IO uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - __IO uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ - __IO uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED0[1]; - __IO uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - __IO uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ - __IO uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED1[1]; - __IO uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - __IO uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ - __IO uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED2[1]; - __IO uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - __IO uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ - __IO uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED0[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ } DWT_Type; /* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28 /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ #define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ -#define DWT_CTRL_NOTRCPKT_Pos 27 /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ #define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ -#define DWT_CTRL_NOEXTTRIG_Pos 26 /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ #define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ -#define DWT_CTRL_NOCYCCNT_Pos 25 /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ #define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ -#define DWT_CTRL_NOPRFCNT_Pos 24 /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ #define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ -#define DWT_CTRL_CYCEVTENA_Pos 22 /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ #define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ -#define DWT_CTRL_FOLDEVTENA_Pos 21 /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ #define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ -#define DWT_CTRL_LSUEVTENA_Pos 20 /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ #define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ -#define DWT_CTRL_SLEEPEVTENA_Pos 19 /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ #define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ -#define DWT_CTRL_EXCEVTENA_Pos 18 /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ #define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ -#define DWT_CTRL_CPIEVTENA_Pos 17 /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ #define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ -#define DWT_CTRL_EXCTRCENA_Pos 16 /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ #define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ -#define DWT_CTRL_PCSAMPLENA_Pos 12 /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ #define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ -#define DWT_CTRL_SYNCTAP_Pos 10 /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ #define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ -#define DWT_CTRL_CYCTAP_Pos 9 /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ #define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ -#define DWT_CTRL_POSTINIT_Pos 5 /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ #define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ -#define DWT_CTRL_POSTPRESET_Pos 1 /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ #define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ -#define DWT_CTRL_CYCCNTENA_Pos 0 /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ #define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ /* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0 /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ #define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ /* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0 /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ #define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ /* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0 /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ #define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ /* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0 /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ #define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ /* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0 /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ #define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ /* DWT Comparator Mask Register Definitions */ -#define DWT_MASK_MASK_Pos 0 /*!< DWT MASK: MASK Position */ +#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ #define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ /* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_MATCHED_Pos 24 /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ #define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ -#define DWT_FUNCTION_DATAVADDR1_Pos 16 /*!< DWT FUNCTION: DATAVADDR1 Position */ +#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ #define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ -#define DWT_FUNCTION_DATAVADDR0_Pos 12 /*!< DWT FUNCTION: DATAVADDR0 Position */ +#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ #define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ -#define DWT_FUNCTION_DATAVSIZE_Pos 10 /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ #define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ -#define DWT_FUNCTION_LNK1ENA_Pos 9 /*!< DWT FUNCTION: LNK1ENA Position */ +#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ #define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ -#define DWT_FUNCTION_DATAVMATCH_Pos 8 /*!< DWT FUNCTION: DATAVMATCH Position */ +#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ #define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ -#define DWT_FUNCTION_CYCMATCH_Pos 7 /*!< DWT FUNCTION: CYCMATCH Position */ +#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ #define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ -#define DWT_FUNCTION_EMITRANGE_Pos 5 /*!< DWT FUNCTION: EMITRANGE Position */ +#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ #define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ -#define DWT_FUNCTION_FUNCTION_Pos 0 /*!< DWT FUNCTION: FUNCTION Position */ +#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ #define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ /*@}*/ /* end of group CMSIS_DWT */ -/** \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) @{ */ -/** \brief Structure type to access the Trace Port Interface Register (TPI). +/** + \brief Structure type to access the Trace Port Interface Register (TPI). */ typedef struct { - __IO uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ - __IO uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ - uint32_t RESERVED0[2]; - __IO uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55]; - __IO uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131]; - __I uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IO uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __I uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ - uint32_t RESERVED3[759]; - __I uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER */ - __I uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ - __I uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ - uint32_t RESERVED4[1]; - __I uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ - __I uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ - __IO uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ - uint32_t RESERVED5[39]; - __IO uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ - __IO uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ - uint32_t RESERVED7[8]; - __I uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ - __I uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ + __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ + __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ + __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ } TPI_Type; /* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_PRESCALER_Pos 0 /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ #define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ /* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0 /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ #define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ /* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3 /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ #define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ -#define TPI_FFSR_TCPresent_Pos 2 /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ #define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ -#define TPI_FFSR_FtStopped_Pos 1 /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ #define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ -#define TPI_FFSR_FlInProg_Pos 0 /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ #define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ /* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8 /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ #define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ -#define TPI_FFCR_EnFCont_Pos 1 /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ #define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ /* TPI TRIGGER Register Definitions */ -#define TPI_TRIGGER_TRIGGER_Pos 0 /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ #define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ /* TPI Integration ETM Data Register Definitions (FIFO0) */ -#define TPI_FIFO0_ITM_ATVALID_Pos 29 /*!< TPI FIFO0: ITM_ATVALID Position */ +#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ #define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ -#define TPI_FIFO0_ITM_bytecount_Pos 27 /*!< TPI FIFO0: ITM_bytecount Position */ +#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ #define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ -#define TPI_FIFO0_ETM_ATVALID_Pos 26 /*!< TPI FIFO0: ETM_ATVALID Position */ +#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ #define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ -#define TPI_FIFO0_ETM_bytecount_Pos 24 /*!< TPI FIFO0: ETM_bytecount Position */ +#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ #define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ -#define TPI_FIFO0_ETM2_Pos 16 /*!< TPI FIFO0: ETM2 Position */ +#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ #define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ -#define TPI_FIFO0_ETM1_Pos 8 /*!< TPI FIFO0: ETM1 Position */ +#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ #define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ -#define TPI_FIFO0_ETM0_Pos 0 /*!< TPI FIFO0: ETM0 Position */ +#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ #define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ /* TPI ITATBCTR2 Register Definitions */ -#define TPI_ITATBCTR2_ATREADY_Pos 0 /*!< TPI ITATBCTR2: ATREADY Position */ -#define TPI_ITATBCTR2_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY_Pos*/) /*!< TPI ITATBCTR2: ATREADY Mask */ +#define TPI_ITATBCTR2_ATREADY2_Pos 0U /*!< TPI ITATBCTR2: ATREADY2 Position */ +#define TPI_ITATBCTR2_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2_Pos*/) /*!< TPI ITATBCTR2: ATREADY2 Mask */ + +#define TPI_ITATBCTR2_ATREADY1_Pos 0U /*!< TPI ITATBCTR2: ATREADY1 Position */ +#define TPI_ITATBCTR2_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1_Pos*/) /*!< TPI ITATBCTR2: ATREADY1 Mask */ /* TPI Integration ITM Data Register Definitions (FIFO1) */ -#define TPI_FIFO1_ITM_ATVALID_Pos 29 /*!< TPI FIFO1: ITM_ATVALID Position */ +#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ #define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ -#define TPI_FIFO1_ITM_bytecount_Pos 27 /*!< TPI FIFO1: ITM_bytecount Position */ +#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ #define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ -#define TPI_FIFO1_ETM_ATVALID_Pos 26 /*!< TPI FIFO1: ETM_ATVALID Position */ +#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ #define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ -#define TPI_FIFO1_ETM_bytecount_Pos 24 /*!< TPI FIFO1: ETM_bytecount Position */ +#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ #define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ -#define TPI_FIFO1_ITM2_Pos 16 /*!< TPI FIFO1: ITM2 Position */ +#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ #define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ -#define TPI_FIFO1_ITM1_Pos 8 /*!< TPI FIFO1: ITM1 Position */ +#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ #define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ -#define TPI_FIFO1_ITM0_Pos 0 /*!< TPI FIFO1: ITM0 Position */ +#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ #define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ /* TPI ITATBCTR0 Register Definitions */ -#define TPI_ITATBCTR0_ATREADY_Pos 0 /*!< TPI ITATBCTR0: ATREADY Position */ -#define TPI_ITATBCTR0_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY_Pos*/) /*!< TPI ITATBCTR0: ATREADY Mask */ +#define TPI_ITATBCTR0_ATREADY2_Pos 0U /*!< TPI ITATBCTR0: ATREADY2 Position */ +#define TPI_ITATBCTR0_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2_Pos*/) /*!< TPI ITATBCTR0: ATREADY2 Mask */ + +#define TPI_ITATBCTR0_ATREADY1_Pos 0U /*!< TPI ITATBCTR0: ATREADY1 Position */ +#define TPI_ITATBCTR0_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1_Pos*/) /*!< TPI ITATBCTR0: ATREADY1 Mask */ /* TPI Integration Mode Control Register Definitions */ -#define TPI_ITCTRL_Mode_Pos 0 /*!< TPI ITCTRL: Mode Position */ -#define TPI_ITCTRL_Mode_Msk (0x1UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ /* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11 /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ #define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ -#define TPI_DEVID_MANCVALID_Pos 10 /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ #define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ -#define TPI_DEVID_PTINVALID_Pos 9 /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ #define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ -#define TPI_DEVID_MinBufSz_Pos 6 /*!< TPI DEVID: MinBufSz Position */ +#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ #define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ -#define TPI_DEVID_AsynClkIn_Pos 5 /*!< TPI DEVID: AsynClkIn Position */ +#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ #define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ -#define TPI_DEVID_NrTraceInput_Pos 0 /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ #define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ /* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_MajorType_Pos 4 /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -#define TPI_DEVTYPE_SubType_Pos 0 /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ #define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + /*@}*/ /* end of group CMSIS_TPI */ -#if (__MPU_PRESENT == 1) -/** \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) @{ */ -/** \brief Structure type to access the Memory Protection Unit (MPU). +/** + \brief Structure type to access the Memory Protection Unit (MPU). */ typedef struct { - __I uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IO uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IO uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IO uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IO uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ - __IO uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ - __IO uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ - __IO uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ - __IO uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ - __IO uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ - __IO uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ + __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ + __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ + __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ } MPU_Type; -/* MPU Type Register */ -#define MPU_TYPE_IREGION_Pos 16 /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_RALIASES 4U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ #define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ -#define MPU_TYPE_DREGION_Pos 8 /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ #define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ -#define MPU_TYPE_SEPARATE_Pos 0 /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ #define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ -/* MPU Control Register */ -#define MPU_CTRL_PRIVDEFENA_Pos 2 /*!< MPU CTRL: PRIVDEFENA Position */ +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ #define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ -#define MPU_CTRL_HFNMIENA_Pos 1 /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ #define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ -#define MPU_CTRL_ENABLE_Pos 0 /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ #define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ -/* MPU Region Number Register */ -#define MPU_RNR_REGION_Pos 0 /*!< MPU RNR: REGION Position */ +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ #define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ -/* MPU Region Base Address Register */ -#define MPU_RBAR_ADDR_Pos 5 /*!< MPU RBAR: ADDR Position */ +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ #define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ -#define MPU_RBAR_VALID_Pos 4 /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ #define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ -#define MPU_RBAR_REGION_Pos 0 /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ #define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ -/* MPU Region Attribute and Size Register */ -#define MPU_RASR_ATTRS_Pos 16 /*!< MPU RASR: MPU Region Attribute field Position */ +/* MPU Region Attribute and Size Register Definitions */ +#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ #define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ -#define MPU_RASR_XN_Pos 28 /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ #define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ -#define MPU_RASR_AP_Pos 24 /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ #define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ -#define MPU_RASR_TEX_Pos 19 /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ #define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ -#define MPU_RASR_S_Pos 18 /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ #define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ -#define MPU_RASR_C_Pos 17 /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ #define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ -#define MPU_RASR_B_Pos 16 /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ #define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ -#define MPU_RASR_SRD_Pos 8 /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ #define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ -#define MPU_RASR_SIZE_Pos 1 /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ #define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ -#define MPU_RASR_ENABLE_Pos 0 /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ #define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ /*@} end of group CMSIS_MPU */ #endif -/** \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers @{ */ -/** \brief Structure type to access the Core Debug Register (CoreDebug). +/** + \brief Structure type to access the Core Debug Register (CoreDebug). */ typedef struct { - __IO uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __O uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IO uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IO uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ } CoreDebug_Type; -/* Debug Halting Control and Status Register */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16 /*!< CoreDebug DHCSR: DBGKEY Position */ +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ #define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25 /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ #define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24 /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ #define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19 /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ #define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ -#define CoreDebug_DHCSR_S_SLEEP_Pos 18 /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ #define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ -#define CoreDebug_DHCSR_S_HALT_Pos 17 /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ #define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ -#define CoreDebug_DHCSR_S_REGRDY_Pos 16 /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ #define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5 /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ #define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3 /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ #define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ -#define CoreDebug_DHCSR_C_STEP_Pos 2 /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ #define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ -#define CoreDebug_DHCSR_C_HALT_Pos 1 /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ #define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0 /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ #define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ -/* Debug Core Register Selector Register */ -#define CoreDebug_DCRSR_REGWnR_Pos 16 /*!< CoreDebug DCRSR: REGWnR Position */ +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ #define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ -#define CoreDebug_DCRSR_REGSEL_Pos 0 /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ #define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ -/* Debug Exception and Monitor Control Register */ -#define CoreDebug_DEMCR_TRCENA_Pos 24 /*!< CoreDebug DEMCR: TRCENA Position */ +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ #define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ -#define CoreDebug_DEMCR_MON_REQ_Pos 19 /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ #define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ -#define CoreDebug_DEMCR_MON_STEP_Pos 18 /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ #define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ -#define CoreDebug_DEMCR_MON_PEND_Pos 17 /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ #define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ -#define CoreDebug_DEMCR_MON_EN_Pos 16 /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ #define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10 /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ #define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ -#define CoreDebug_DEMCR_VC_INTERR_Pos 9 /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ #define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8 /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ #define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ -#define CoreDebug_DEMCR_VC_STATERR_Pos 7 /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ #define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6 /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ #define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5 /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ #define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ -#define CoreDebug_DEMCR_VC_MMERR_Pos 4 /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ #define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0 /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ #define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ /*@} end of group CMSIS_CoreDebug */ -/** \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. @{ */ -/* Memory mapping of Cortex-M3 Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ -#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ -#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ -#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ +#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ +#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ +#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ #define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ -#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ -#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ -#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ -#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ - -#if (__MPU_PRESENT == 1) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ +#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ +#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ +#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ +#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ #endif /*@} */ @@ -1325,187 +1415,273 @@ typedef struct - Core Debug Functions - Core Register Access Functions ******************************************************************************/ -/** \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference */ /* ########################## NVIC functions #################################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ */ -/** \brief Set Priority Grouping +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 - The function sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. +/* The following EXC_RETURN values are saved the LR on exception entry */ +#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ +#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ +#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. */ -__STATIC_INLINE void NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) { uint32_t reg_value; uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ reg_value = (reg_value | ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << 8) ); /* Insert write key and priorty group */ + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ SCB->AIRCR = reg_value; } -/** \brief Get Priority Grouping - - The function reads the priority grouping field from the NVIC Interrupt Controller. - - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). */ -__STATIC_INLINE uint32_t NVIC_GetPriorityGrouping(void) +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) { return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); } -/** \brief Enable External Interrupt - - The function enables a device-specific interrupt in the NVIC interrupt controller. - - \param [in] IRQn External interrupt number. Value cannot be negative. +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. */ -__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) { - NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } } -/** \brief Disable External Interrupt - - The function disables a device-specific interrupt in the NVIC interrupt controller. - - \param [in] IRQn External interrupt number. Value cannot be negative. +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. */ -__STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) { - NVIC->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } } -/** \brief Get Pending Interrupt - - The function reads the pending register in the NVIC and returns the pending bit - for the specified interrupt. - - \param [in] IRQn Interrupt number. - - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. */ -__STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) { - return((uint32_t)(((NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } } -/** \brief Set Pending Interrupt - - The function sets the pending bit of an external interrupt. - - \param [in] IRQn Interrupt number. Value cannot be negative. +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. */ -__STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) { - NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } } -/** \brief Clear Pending Interrupt - - The function clears the pending bit of an external interrupt. - - \param [in] IRQn External interrupt number. Value cannot be negative. +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. */ -__STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) { - NVIC->ICPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } } -/** \brief Get Active Interrupt - - The function reads the active register in NVIC and returns the active bit. - - \param [in] IRQn Interrupt number. - - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. */ -__STATIC_INLINE uint32_t NVIC_GetActive(IRQn_Type IRQn) +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) { - return((uint32_t)(((NVIC->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } } -/** \brief Set Interrupt Priority - - The function sets the priority of an interrupt. - - \note The priority cannot be set for every core interrupt. - - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. */ -__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) { - if((int32_t)IRQn < 0) { - SCB->SHP[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8 - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); } - else { - NVIC->IP[((uint32_t)(int32_t)IRQn)] = (uint8_t)((priority << (8 - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + else + { + return(0U); } } -/** \brief Get Interrupt Priority - - The function reads the priority of an interrupt. The interrupt - number can be positive to specify an external (device specific) - interrupt, or negative to specify an internal (core) interrupt. +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} - \param [in] IRQn Interrupt number. - \return Interrupt Priority. Value is aligned automatically to the implemented - priority bits of the microcontroller. +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. */ -__STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) { - if((int32_t)IRQn < 0) { - return(((uint32_t)SCB->SHP[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] >> (8 - __NVIC_PRIO_BITS))); + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IP[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); } - else { - return(((uint32_t)NVIC->IP[((uint32_t)(int32_t)IRQn)] >> (8 - __NVIC_PRIO_BITS))); + else + { + return(((uint32_t)SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); } } -/** \brief Encode Priority - - The function encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). */ __STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) { @@ -1523,19 +1699,18 @@ __STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t P } -/** \brief Decode Priority - - The function decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority) +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) { uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ uint32_t PreemptPriorityBits; @@ -1549,11 +1724,42 @@ __STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGr } -/** \brief System Reset +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + - The function initiates a system reset request to reset the MCU. +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function */ -__STATIC_INLINE void NVIC_SystemReset(void) +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) { __DSB(); /* Ensure all outstanding memory accesses included buffered write are completed before reset */ @@ -1561,40 +1767,76 @@ __STATIC_INLINE void NVIC_SystemReset(void) (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ __DSB(); /* Ensure completion of memory access */ - while(1) { __NOP(); } /* wait until reset */ + + for(;;) /* wait until reset */ + { + __NOP(); + } } /*@} end of CMSIS_Core_NVICFunctions */ +/* ########################## MPU functions #################################### */ +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/* ################################## SysTick function ############################################ */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. +#include "mpu_armv7.h" + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. @{ */ -#if (__Vendor_SysTickConfig == 0) +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + -/** \brief System Tick Configuration +/*@} end of CMSIS_Core_FpuFunctions */ - The function initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. */ __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) { - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) { return (1UL); } /* Reload value impossible */ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ @@ -1612,49 +1854,52 @@ __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) /* ##################################### Debug In/Output function ########################################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. @{ */ -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY 0x5AA55AA5 /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** \brief ITM Send Character - - The function transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - \param [in] ch Character to transmit. - \returns Character to transmit. +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. */ __STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) { if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ { - while (ITM->PORT[0].u32 == 0UL) { __NOP(); } - ITM->PORT[0].u8 = (uint8_t)ch; + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; } return (ch); } -/** \brief ITM Receive Character - - The function inputs a character via the external variable \ref ITM_RxBuffer. - - \return Received character. - \return -1 No character pending. +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) { +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ int32_t ch = -1; /* no character available */ - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) { + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { ch = ITM_RxBuffer; ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ } @@ -1663,19 +1908,22 @@ __STATIC_INLINE int32_t ITM_ReceiveChar (void) { } -/** \brief ITM Check Character - - The function checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - - \return 0 No character available. - \return 1 Character available. +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. */ -__STATIC_INLINE int32_t ITM_CheckChar (void) { +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) { - return (0); /* no character available */ - } else { - return (1); /* character available */ + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ } } diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/core_cm33.h b/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/core_cm33.h new file mode 100644 index 00000000..6cd2db77 --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/core_cm33.h @@ -0,0 +1,3002 @@ +/**************************************************************************//** + * @file core_cm33.h + * @brief CMSIS Cortex-M33 Core Peripheral Access Layer Header File + * @version V5.0.9 + * @date 06. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM33_H_GENERIC +#define __CORE_CM33_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M33 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM33 definitions */ +#define __CM33_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM33_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM33_CMSIS_VERSION ((__CM33_CMSIS_VERSION_MAIN << 16U) | \ + __CM33_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (33U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. +*/ +#if defined ( __CC_ARM ) + #if defined (__TARGET_FPU_VFP) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) + #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined (__ARM_PCS_VFP) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) + #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) + #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __ICCARM__ ) + #if defined (__ARMVFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) + #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __TI_ARM__ ) + #if defined (__TI_VFP_SUPPORT__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TASKING__ ) + #if defined (__FPU_VFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM33_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM33_H_DEPENDANT +#define __CORE_CM33_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM33_REV + #define __CM33_REV 0x0000U + #warning "__CM33_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __SAUREGION_PRESENT + #define __SAUREGION_PRESENT 0U + #warning "__SAUREGION_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __DSP_PRESENT + #define __DSP_PRESENT 0U + #warning "__DSP_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M33 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core SAU Register + - Core FPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + +#define APSR_GE_Pos 16U /*!< APSR: GE Position */ +#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ +#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ +#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ + uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ + uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ + uint32_t _reserved1:28; /*!< bit: 4..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ +#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ + +#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ +#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ + +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[16U]; + __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[16U]; + __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[16U]; + __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[16U]; + __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[16U]; + __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ + uint32_t RESERVED5[16U]; + __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED6[580U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ID_ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ID_ISAR[6U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ + __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ + __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ + __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ + __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ + uint32_t RESERVED3[92U]; + __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ + uint32_t RESERVED4[15U]; + __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ + uint32_t RESERVED5[1U]; + __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ + uint32_t RESERVED6[1U]; + __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ + __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ + __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ + __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ + __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ + __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ + __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ + __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ + uint32_t RESERVED7[6U]; + __IOM uint32_t ITCMCR; /*!< Offset: 0x290 (R/W) Instruction Tightly-Coupled Memory Control Register */ + __IOM uint32_t DTCMCR; /*!< Offset: 0x294 (R/W) Data Tightly-Coupled Memory Control Registers */ + __IOM uint32_t AHBPCR; /*!< Offset: 0x298 (R/W) AHBP Control Register */ + __IOM uint32_t CACR; /*!< Offset: 0x29C (R/W) L1 Cache Control Register */ + __IOM uint32_t AHBSCR; /*!< Offset: 0x2A0 (R/W) AHB Slave Control Register */ + uint32_t RESERVED8[1U]; + __IOM uint32_t ABFSR; /*!< Offset: 0x2A8 (R/W) Auxiliary Bus Fault Status Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ +#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ + +#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ +#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ + +#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ +#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ +#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ +#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ + +#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ +#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ +#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ +#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ + +#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ +#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ +#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ +#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ +#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ + +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ +#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ + +#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ +#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ +#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MLSPERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ +#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ +#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ +#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/* SCB Non-Secure Access Control Register Definitions */ +#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ +#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ + +#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ +#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ + +#define SCB_NSACR_CPn_Pos 0U /*!< SCB NSACR: CPn Position */ +#define SCB_NSACR_CPn_Msk (1UL /*<< SCB_NSACR_CPn_Pos*/) /*!< SCB NSACR: CPn Mask */ + +/* SCB Cache Level ID Register Definitions */ +#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ +#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ + +#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ +#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ + +/* SCB Cache Type Register Definitions */ +#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ +#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ + +#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ +#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ + +#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ +#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ + +#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ +#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ + +#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ +#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ + +/* SCB Cache Size ID Register Definitions */ +#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ +#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ + +#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ +#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ + +#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ +#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ + +#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ +#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ + +#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ +#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ + +#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ +#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ + +#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ +#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ + +/* SCB Cache Size Selection Register Definitions */ +#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ +#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ + +#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ +#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ + +/* SCB Software Triggered Interrupt Register Definitions */ +#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ +#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ + +/* SCB D-Cache Invalidate by Set-way Register Definitions */ +#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ +#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ + +#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ +#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ + +/* SCB D-Cache Clean by Set-way Register Definitions */ +#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ +#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ + +#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ +#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ + +/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ +#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ +#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ + +#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ +#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ + +/* Instruction Tightly-Coupled Memory Control Register Definitions */ +#define SCB_ITCMCR_SZ_Pos 3U /*!< SCB ITCMCR: SZ Position */ +#define SCB_ITCMCR_SZ_Msk (0xFUL << SCB_ITCMCR_SZ_Pos) /*!< SCB ITCMCR: SZ Mask */ + +#define SCB_ITCMCR_RETEN_Pos 2U /*!< SCB ITCMCR: RETEN Position */ +#define SCB_ITCMCR_RETEN_Msk (1UL << SCB_ITCMCR_RETEN_Pos) /*!< SCB ITCMCR: RETEN Mask */ + +#define SCB_ITCMCR_RMW_Pos 1U /*!< SCB ITCMCR: RMW Position */ +#define SCB_ITCMCR_RMW_Msk (1UL << SCB_ITCMCR_RMW_Pos) /*!< SCB ITCMCR: RMW Mask */ + +#define SCB_ITCMCR_EN_Pos 0U /*!< SCB ITCMCR: EN Position */ +#define SCB_ITCMCR_EN_Msk (1UL /*<< SCB_ITCMCR_EN_Pos*/) /*!< SCB ITCMCR: EN Mask */ + +/* Data Tightly-Coupled Memory Control Register Definitions */ +#define SCB_DTCMCR_SZ_Pos 3U /*!< SCB DTCMCR: SZ Position */ +#define SCB_DTCMCR_SZ_Msk (0xFUL << SCB_DTCMCR_SZ_Pos) /*!< SCB DTCMCR: SZ Mask */ + +#define SCB_DTCMCR_RETEN_Pos 2U /*!< SCB DTCMCR: RETEN Position */ +#define SCB_DTCMCR_RETEN_Msk (1UL << SCB_DTCMCR_RETEN_Pos) /*!< SCB DTCMCR: RETEN Mask */ + +#define SCB_DTCMCR_RMW_Pos 1U /*!< SCB DTCMCR: RMW Position */ +#define SCB_DTCMCR_RMW_Msk (1UL << SCB_DTCMCR_RMW_Pos) /*!< SCB DTCMCR: RMW Mask */ + +#define SCB_DTCMCR_EN_Pos 0U /*!< SCB DTCMCR: EN Position */ +#define SCB_DTCMCR_EN_Msk (1UL /*<< SCB_DTCMCR_EN_Pos*/) /*!< SCB DTCMCR: EN Mask */ + +/* AHBP Control Register Definitions */ +#define SCB_AHBPCR_SZ_Pos 1U /*!< SCB AHBPCR: SZ Position */ +#define SCB_AHBPCR_SZ_Msk (7UL << SCB_AHBPCR_SZ_Pos) /*!< SCB AHBPCR: SZ Mask */ + +#define SCB_AHBPCR_EN_Pos 0U /*!< SCB AHBPCR: EN Position */ +#define SCB_AHBPCR_EN_Msk (1UL /*<< SCB_AHBPCR_EN_Pos*/) /*!< SCB AHBPCR: EN Mask */ + +/* L1 Cache Control Register Definitions */ +#define SCB_CACR_FORCEWT_Pos 2U /*!< SCB CACR: FORCEWT Position */ +#define SCB_CACR_FORCEWT_Msk (1UL << SCB_CACR_FORCEWT_Pos) /*!< SCB CACR: FORCEWT Mask */ + +#define SCB_CACR_ECCEN_Pos 1U /*!< SCB CACR: ECCEN Position */ +#define SCB_CACR_ECCEN_Msk (1UL << SCB_CACR_ECCEN_Pos) /*!< SCB CACR: ECCEN Mask */ + +#define SCB_CACR_SIWT_Pos 0U /*!< SCB CACR: SIWT Position */ +#define SCB_CACR_SIWT_Msk (1UL /*<< SCB_CACR_SIWT_Pos*/) /*!< SCB CACR: SIWT Mask */ + +/* AHBS Control Register Definitions */ +#define SCB_AHBSCR_INITCOUNT_Pos 11U /*!< SCB AHBSCR: INITCOUNT Position */ +#define SCB_AHBSCR_INITCOUNT_Msk (0x1FUL << SCB_AHBPCR_INITCOUNT_Pos) /*!< SCB AHBSCR: INITCOUNT Mask */ + +#define SCB_AHBSCR_TPRI_Pos 2U /*!< SCB AHBSCR: TPRI Position */ +#define SCB_AHBSCR_TPRI_Msk (0x1FFUL << SCB_AHBPCR_TPRI_Pos) /*!< SCB AHBSCR: TPRI Mask */ + +#define SCB_AHBSCR_CTL_Pos 0U /*!< SCB AHBSCR: CTL Position*/ +#define SCB_AHBSCR_CTL_Msk (3UL /*<< SCB_AHBPCR_CTL_Pos*/) /*!< SCB AHBSCR: CTL Mask */ + +/* Auxiliary Bus Fault Status Register Definitions */ +#define SCB_ABFSR_AXIMTYPE_Pos 8U /*!< SCB ABFSR: AXIMTYPE Position*/ +#define SCB_ABFSR_AXIMTYPE_Msk (3UL << SCB_ABFSR_AXIMTYPE_Pos) /*!< SCB ABFSR: AXIMTYPE Mask */ + +#define SCB_ABFSR_EPPB_Pos 4U /*!< SCB ABFSR: EPPB Position*/ +#define SCB_ABFSR_EPPB_Msk (1UL << SCB_ABFSR_EPPB_Pos) /*!< SCB ABFSR: EPPB Mask */ + +#define SCB_ABFSR_AXIM_Pos 3U /*!< SCB ABFSR: AXIM Position*/ +#define SCB_ABFSR_AXIM_Msk (1UL << SCB_ABFSR_AXIM_Pos) /*!< SCB ABFSR: AXIM Mask */ + +#define SCB_ABFSR_AHBP_Pos 2U /*!< SCB ABFSR: AHBP Position*/ +#define SCB_ABFSR_AHBP_Msk (1UL << SCB_ABFSR_AHBP_Pos) /*!< SCB ABFSR: AHBP Mask */ + +#define SCB_ABFSR_DTCM_Pos 1U /*!< SCB ABFSR: DTCM Position*/ +#define SCB_ABFSR_DTCM_Msk (1UL << SCB_ABFSR_DTCM_Pos) /*!< SCB ABFSR: DTCM Mask */ + +#define SCB_ABFSR_ITCM_Pos 0U /*!< SCB ABFSR: ITCM Position*/ +#define SCB_ABFSR_ITCM_Msk (1UL /*<< SCB_ABFSR_ITCM_Pos*/) /*!< SCB ABFSR: ITCM Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ + __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[29U]; + __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ + __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ + __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ + uint32_t RESERVED6[4U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Stimulus Port Register Definitions */ +#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ +#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ + +#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ +#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TRACEBUSID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TRACEBUSID_Msk (0x7FUL << ITM_TCR_TRACEBUSID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPRESCALE_Pos 8U /*!< ITM TCR: TSPRESCALE Position */ +#define ITM_TCR_TSPRESCALE_Msk (3UL << ITM_TCR_TSPRESCALE_Pos) /*!< ITM TCR: TSPRESCALE Mask */ + +#define ITM_TCR_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ +#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Integration Write Register Definitions */ +#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ +#define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ + +/* ITM Integration Read Register Definitions */ +#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ +#define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ + +/* ITM Integration Mode Control Register Definitions */ +#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ +#define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + uint32_t RESERVED3[1U]; + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED4[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + uint32_t RESERVED5[1U]; + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED6[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + uint32_t RESERVED7[1U]; + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED8[1U]; + __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ + uint32_t RESERVED9[1U]; + __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ + uint32_t RESERVED10[1U]; + __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ + uint32_t RESERVED11[1U]; + __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ + uint32_t RESERVED12[1U]; + __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ + uint32_t RESERVED13[1U]; + __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ + uint32_t RESERVED14[1U]; + __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ + uint32_t RESERVED15[1U]; + __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ + uint32_t RESERVED16[1U]; + __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ + uint32_t RESERVED17[1U]; + __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ + uint32_t RESERVED18[1U]; + __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ + uint32_t RESERVED19[1U]; + __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ + uint32_t RESERVED20[1U]; + __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ + uint32_t RESERVED21[1U]; + __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ + uint32_t RESERVED22[1U]; + __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ + uint32_t RESERVED23[1U]; + __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ + uint32_t RESERVED24[1U]; + __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ + uint32_t RESERVED25[1U]; + __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ + uint32_t RESERVED26[1U]; + __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ + uint32_t RESERVED27[1U]; + __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ + uint32_t RESERVED28[1U]; + __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ + uint32_t RESERVED29[1U]; + __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ + uint32_t RESERVED30[1U]; + __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ + uint32_t RESERVED31[1U]; + __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ + uint32_t RESERVED32[934U]; + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ + uint32_t RESERVED33[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ +#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ +#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ + +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ +#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ + +#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ +#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ + __IM uint32_t ITFTTD0; /*!< Offset: 0xEEC (R/ ) Integration Test FIFO Test Data 0 Register */ + __IOM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/W) Integration Test ATB Control Register 2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) Integration Test ATB Control Register 0 */ + __IM uint32_t ITFTTD1; /*!< Offset: 0xEFC (R/ ) Integration Test FIFO Test Data 1 Register */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) Device Configuration Register */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Identifier Register */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ +#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration Test FIFO Test Data 0 Register Definitions */ +#define TPI_ITFTTD0_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD0: ATB Interface 2 ATVALIDPosition */ +#define TPI_ITFTTD0_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 2 ATVALID Mask */ + +#define TPI_ITFTTD0_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD0: ATB Interface 2 byte count Position */ +#define TPI_ITFTTD0_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 2 byte count Mask */ + +#define TPI_ITFTTD0_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Position */ +#define TPI_ITFTTD0_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Mask */ + +#define TPI_ITFTTD0_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD0: ATB Interface 1 byte count Position */ +#define TPI_ITFTTD0_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 1 byte countt Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data2_Pos 16U /*!< TPI ITFTTD0: ATB Interface 1 data2 Position */ +#define TPI_ITFTTD0_ATB_IF1_data2_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data2 Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data1_Pos 8U /*!< TPI ITFTTD0: ATB Interface 1 data1 Position */ +#define TPI_ITFTTD0_ATB_IF1_data1_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data1 Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data0_Pos 0U /*!< TPI ITFTTD0: ATB Interface 1 data0 Position */ +#define TPI_ITFTTD0_ATB_IF1_data0_Msk (0xFFUL /*<< TPI_ITFTTD0_ATB_IF1_data0_Pos*/) /*!< TPI ITFTTD0: ATB Interface 1 data0 Mask */ + +/* TPI Integration Test ATB Control Register 2 Register Definitions */ +#define TPI_ITATBCTR2_AFVALID2S_Pos 1U /*!< TPI ITATBCTR2: AFVALID2S Position */ +#define TPI_ITATBCTR2_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID2S_Pos) /*!< TPI ITATBCTR2: AFVALID2SS Mask */ + +#define TPI_ITATBCTR2_AFVALID1S_Pos 1U /*!< TPI ITATBCTR2: AFVALID1S Position */ +#define TPI_ITATBCTR2_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID1S_Pos) /*!< TPI ITATBCTR2: AFVALID1SS Mask */ + +#define TPI_ITATBCTR2_ATREADY2S_Pos 0U /*!< TPI ITATBCTR2: ATREADY2S Position */ +#define TPI_ITATBCTR2_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2S_Pos*/) /*!< TPI ITATBCTR2: ATREADY2S Mask */ + +#define TPI_ITATBCTR2_ATREADY1S_Pos 0U /*!< TPI ITATBCTR2: ATREADY1S Position */ +#define TPI_ITATBCTR2_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1S_Pos*/) /*!< TPI ITATBCTR2: ATREADY1S Mask */ + +/* TPI Integration Test FIFO Test Data 1 Register Definitions */ +#define TPI_ITFTTD1_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Position */ +#define TPI_ITFTTD1_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Mask */ + +#define TPI_ITFTTD1_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD1: ATB Interface 2 byte count Position */ +#define TPI_ITFTTD1_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 2 byte count Mask */ + +#define TPI_ITFTTD1_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Position */ +#define TPI_ITFTTD1_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Mask */ + +#define TPI_ITFTTD1_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD1: ATB Interface 1 byte count Position */ +#define TPI_ITFTTD1_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 1 byte countt Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data2_Pos 16U /*!< TPI ITFTTD1: ATB Interface 2 data2 Position */ +#define TPI_ITFTTD1_ATB_IF2_data2_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data2 Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data1_Pos 8U /*!< TPI ITFTTD1: ATB Interface 2 data1 Position */ +#define TPI_ITFTTD1_ATB_IF2_data1_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data1 Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data0_Pos 0U /*!< TPI ITFTTD1: ATB Interface 2 data0 Position */ +#define TPI_ITFTTD1_ATB_IF2_data0_Msk (0xFFUL /*<< TPI_ITFTTD1_ATB_IF2_data0_Pos*/) /*!< TPI ITFTTD1: ATB Interface 2 data0 Mask */ + +/* TPI Integration Test ATB Control Register 0 Definitions */ +#define TPI_ITATBCTR0_AFVALID2S_Pos 1U /*!< TPI ITATBCTR0: AFVALID2S Position */ +#define TPI_ITATBCTR0_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID2S_Pos) /*!< TPI ITATBCTR0: AFVALID2SS Mask */ + +#define TPI_ITATBCTR0_AFVALID1S_Pos 1U /*!< TPI ITATBCTR0: AFVALID1S Position */ +#define TPI_ITATBCTR0_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID1S_Pos) /*!< TPI ITATBCTR0: AFVALID1SS Mask */ + +#define TPI_ITATBCTR0_ATREADY2S_Pos 0U /*!< TPI ITATBCTR0: ATREADY2S Position */ +#define TPI_ITATBCTR0_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2S_Pos*/) /*!< TPI ITATBCTR0: ATREADY2S Mask */ + +#define TPI_ITATBCTR0_ATREADY1S_Pos 0U /*!< TPI ITATBCTR0: ATREADY1S Position */ +#define TPI_ITATBCTR0_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1S_Pos*/) /*!< TPI ITATBCTR0: ATREADY1S Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFOSZ Position */ +#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFOSZ Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x3FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ + __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ + __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ + __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ + uint32_t RESERVED0[1]; + union { + __IOM uint32_t MAIR[2]; + struct { + __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ + __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ + }; + }; +} MPU_Type; + +#define MPU_TYPE_RALIASES 4U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ +#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ + +#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ +#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ + +#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ +#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ + +#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ +#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ + +/* MPU Region Limit Address Register Definitions */ +#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ +#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ + +#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ +#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ + +#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ +#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ + +/* MPU Memory Attribute Indirection Register 0 Definitions */ +#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ +#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ + +#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ +#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ + +#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ +#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ + +#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ +#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ + +/* MPU Memory Attribute Indirection Register 1 Definitions */ +#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ +#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ + +#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ +#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ + +#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ +#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ + +#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ +#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SAU Security Attribution Unit (SAU) + \brief Type definitions for the Security Attribution Unit (SAU) + @{ + */ + +/** + \brief Structure type to access the Security Attribution Unit (SAU). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ + __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ +#else + uint32_t RESERVED0[3]; +#endif + __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ + __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ +} SAU_Type; + +/* SAU Control Register Definitions */ +#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ +#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ + +#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ +#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ + +/* SAU Type Register Definitions */ +#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ +#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ + +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) +/* SAU Region Number Register Definitions */ +#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ +#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ + +/* SAU Region Base Address Register Definitions */ +#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ +#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ + +/* SAU Region Limit Address Register Definitions */ +#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ +#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ + +#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ +#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ + +#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ +#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ + +#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ + +/* Secure Fault Status Register Definitions */ +#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ +#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ + +#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ +#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ + +#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ +#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ + +#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ +#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ + +#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ +#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ + +#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ +#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ + +#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ +#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ + +#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ +#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ + +/*@} end of group CMSIS_SAU */ +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_FPU Floating Point Unit (FPU) + \brief Type definitions for the Floating Point Unit (FPU) + @{ + */ + +/** + \brief Structure type to access the Floating Point Unit (FPU). + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ + __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ + __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ + __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ +} FPU_Type; + +/* Floating-Point Context Control Register Definitions */ +#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ +#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ + +#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ +#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ + +#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ +#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ + +#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ +#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ + +#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ +#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ + +#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ +#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ + +#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ +#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ + +#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ +#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ + +#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ +#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ + +#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ +#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ + +#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ +#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ + +#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ +#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ + +#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ +#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ + +#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ +#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ + +#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ +#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ + +#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ +#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ + +#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ +#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ + +/* Floating-Point Context Address Register Definitions */ +#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ +#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ + +/* Floating-Point Default Status Control Register Definitions */ +#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ +#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ + +#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ +#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ + +#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ +#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ + +#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ +#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ + +/* Media and FP Feature Register 0 Definitions */ +#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ +#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ + +#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ +#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ + +#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ +#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ + +#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ +#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ + +#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ +#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ + +#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ +#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ + +#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ +#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ + +#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ +#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ + +/* Media and FP Feature Register 1 Definitions */ +#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ +#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ + +#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ +#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ + +#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ +#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ + +#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ +#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ + +/*@} end of group CMSIS_FPU */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + uint32_t RESERVED4[1U]; + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< CoreDebug DHCSR: S_RESTART_ST Position */ +#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< CoreDebug DHCSR: S_RESTART_ST Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/* Debug Authentication Control Register Definitions */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ + +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ + +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< CoreDebug DAUTHCTRL: INTSPIDEN Position */ +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPIDEN Mask */ + +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< CoreDebug DAUTHCTRL: SPIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< CoreDebug DAUTHCTRL: SPIDENSEL Mask */ + +/* Debug Security Control and Status Register Definitions */ +#define CoreDebug_DSCSR_CDS_Pos 16U /*!< CoreDebug DSCSR: CDS Position */ +#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< CoreDebug DSCSR: CDS Mask */ + +#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< CoreDebug DSCSR: SBRSEL Position */ +#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< CoreDebug DSCSR: SBRSEL Mask */ + +#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< CoreDebug DSCSR: SBRSELEN Position */ +#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< CoreDebug DSCSR: SBRSELEN Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ + #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ + #define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ + #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ + #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ + #define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ + #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ + #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ + #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + + #define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ + #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ + #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ + #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + #define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ + #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ + #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ + #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< Core Debug configuration struct */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ + #endif + + #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ + #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ + #endif + + #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ + #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ + #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< Core Debug Base Address (non-secure address space) */ + #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ + #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ + #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ + + #define SCnSCB_NS ((SCnSCB_Type *) SCS_BASE_NS ) /*!< System control Register not in SCB(non-secure address space) */ + #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ + #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ + #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ + #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< Core Debug configuration struct (non-secure address space) */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ + #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ + #endif + + #define FPU_BASE_NS (SCS_BASE_NS + 0x0F30UL) /*!< Floating Point Unit (non-secure address space) */ + #define FPU_NS ((FPU_Type *) FPU_BASE_NS ) /*!< Floating Point Unit (non-secure address space) */ + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* Special LR values for Secure/Non-Secure call handling and exception handling */ + +/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ +#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ + +/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ +#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ +#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ +#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ +#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ +#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ +#define EXC_RETURN_SPSEL (0x00000002UL) /* bit [1] stack pointer used to restore context: 0=MSP 1=PSP */ +#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ + +/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ +#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ +#else +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ +#endif + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << 8U) ); /* Insert write key and priority group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Interrupt Target State + \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + \return 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Target State + \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Clear Interrupt Target State + \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Set Priority Grouping (non-secure) + \details Sets the non-secure priority grouping field when in secure state using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB_NS->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ + SCB_NS->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping (non-secure) + \details Reads the priority grouping field from the non-secure NVIC when in secure state. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) +{ + return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt (non-secure) + \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status (non-secure) + \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt (non-secure) + \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Pending Interrupt (non-secure) + \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt (non-secure) + \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt (non-secure) + \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt (non-secure) + \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority (non-secure) + \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every non-secure processor exception. + */ +__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority (non-secure) + \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC_NS->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv8.h" + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + uint32_t mvfr0; + + mvfr0 = FPU->MVFR0; + if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) + { + return 2U; /* Double + Single precision FPU */ + } + else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) + { + return 1U; /* Single precision FPU */ + } + else + { + return 0U; /* No FPU */ + } +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ########################## SAU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SAUFunctions SAU Functions + \brief Functions that configure the SAU. + @{ + */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + +/** + \brief Enable SAU + \details Enables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Enable(void) +{ + SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); +} + + + +/** + \brief Disable SAU + \details Disables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Disable(void) +{ + SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); +} + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_SAUFunctions */ + + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief System Tick Configuration (non-secure) + \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function TZ_SysTick_Config_NS is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + + */ +__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM33_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Include/core_cm4.h b/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/core_cm4.h old mode 100755 new mode 100644 similarity index 51% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Include/core_cm4.h rename to STM32CubeMX/revF/Drivers/CMSIS/Core/Include/core_cm4.h index 9749c27d..7d568735 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Include/core_cm4.h +++ b/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/core_cm4.h @@ -1,52 +1,44 @@ /**************************************************************************//** * @file core_cm4.h * @brief CMSIS Cortex-M4 Core Peripheral Access Layer Header File - * @version V4.10 - * @date 18. March 2015 + * @version V5.0.8 + * @date 04. June 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. * - * @note + * SPDX-License-Identifier: Apache-2.0 * - ******************************************************************************/ -/* Copyright (c) 2009 - 2015 ARM LIMITED - - All rights reserved. - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - Neither the name of ARM nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - * - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - ---------------------------------------------------------------------------*/ - - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ #endif #ifndef __CORE_CM4_H_GENERIC #define __CORE_CM4_H_GENERIC +#include + #ifdef __cplusplus extern "C" { #endif -/** \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions CMSIS violates the following MISRA-C:2004 rules: \li Required Rule 8.5, object/function definition in header file.
@@ -63,131 +55,112 @@ /******************************************************************************* * CMSIS definitions ******************************************************************************/ -/** \ingroup Cortex_M4 +/** + \ingroup Cortex_M4 @{ */ -/* CMSIS CM4 definitions */ -#define __CM4_CMSIS_VERSION_MAIN (0x04) /*!< [31:16] CMSIS HAL main version */ -#define __CM4_CMSIS_VERSION_SUB (0x00) /*!< [15:0] CMSIS HAL sub version */ -#define __CM4_CMSIS_VERSION ((__CM4_CMSIS_VERSION_MAIN << 16) | \ - __CM4_CMSIS_VERSION_SUB ) /*!< CMSIS HAL version number */ - -#define __CORTEX_M (0x04) /*!< Cortex-M Core */ - - -#if defined ( __CC_ARM ) - #define __ASM __asm /*!< asm keyword for ARM Compiler */ - #define __INLINE __inline /*!< inline keyword for ARM Compiler */ - #define __STATIC_INLINE static __inline - -#elif defined ( __GNUC__ ) - #define __ASM __asm /*!< asm keyword for GNU Compiler */ - #define __INLINE inline /*!< inline keyword for GNU Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __ICCARM__ ) - #define __ASM __asm /*!< asm keyword for IAR Compiler */ - #define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */ - #define __STATIC_INLINE static inline - -#elif defined ( __TMS470__ ) - #define __ASM __asm /*!< asm keyword for TI CCS Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __TASKING__ ) - #define __ASM __asm /*!< asm keyword for TASKING Compiler */ - #define __INLINE inline /*!< inline keyword for TASKING Compiler */ - #define __STATIC_INLINE static inline +#include "cmsis_version.h" -#elif defined ( __CSMC__ ) - #define __packed - #define __ASM _asm /*!< asm keyword for COSMIC Compiler */ - #define __INLINE inline /*use -pc99 on compile line !< inline keyword for COSMIC Compiler */ - #define __STATIC_INLINE static inline +/* CMSIS CM4 definitions */ +#define __CM4_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM4_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM4_CMSIS_VERSION ((__CM4_CMSIS_VERSION_MAIN << 16U) | \ + __CM4_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ -#endif +#define __CORTEX_M (4U) /*!< Cortex-M Core */ /** __FPU_USED indicates whether an FPU is used or not. For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. */ #if defined ( __CC_ARM ) #if defined __TARGET_FPU_VFP - #if (__FPU_PRESENT == 1) - #define __FPU_USED 1 + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U #else #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0 + #define __FPU_USED 0U #endif #else - #define __FPU_USED 0 + #define __FPU_USED 0U #endif #elif defined ( __GNUC__ ) #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #if (__FPU_PRESENT == 1) - #define __FPU_USED 1 + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U #else - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0 + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U #endif #else - #define __FPU_USED 0 + #define __FPU_USED 0U #endif #elif defined ( __ICCARM__ ) #if defined __ARMVFP__ - #if (__FPU_PRESENT == 1) - #define __FPU_USED 1 + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U #else - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0 + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U #endif #else - #define __FPU_USED 0 + #define __FPU_USED 0U #endif -#elif defined ( __TMS470__ ) +#elif defined ( __TI_ARM__ ) #if defined __TI_VFP_SUPPORT__ - #if (__FPU_PRESENT == 1) - #define __FPU_USED 1 + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U #else - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0 + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U #endif #else - #define __FPU_USED 0 + #define __FPU_USED 0U #endif #elif defined ( __TASKING__ ) #if defined __FPU_VFP__ - #if (__FPU_PRESENT == 1) - #define __FPU_USED 1 + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U #else #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0 + #define __FPU_USED 0U #endif #else - #define __FPU_USED 0 + #define __FPU_USED 0U #endif -#elif defined ( __CSMC__ ) /* Cosmic */ - #if ( __CSMC__ & 0x400) // FPU present for parser - #if (__FPU_PRESENT == 1) - #define __FPU_USED 1 +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U #else #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0 + #define __FPU_USED 0U #endif #else - #define __FPU_USED 0 + #define __FPU_USED 0U #endif + #endif -#include /* standard types definitions */ -#include /* Core Instruction Access */ -#include /* Core Function Access */ -#include /* Compiler specific SIMD Intrinsics */ +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + #ifdef __cplusplus } @@ -207,27 +180,27 @@ /* check device defines and use defaults */ #if defined __CHECK_DEVICE_DEFINES #ifndef __CM4_REV - #define __CM4_REV 0x0000 + #define __CM4_REV 0x0000U #warning "__CM4_REV not defined in device header file; using default!" #endif #ifndef __FPU_PRESENT - #define __FPU_PRESENT 0 + #define __FPU_PRESENT 0U #warning "__FPU_PRESENT not defined in device header file; using default!" #endif #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0 + #define __MPU_PRESENT 0U #warning "__MPU_PRESENT not defined in device header file; using default!" #endif #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 4 + #define __NVIC_PRIO_BITS 3U #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" #endif #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0 + #define __Vendor_SysTickConfig 0U #warning "__Vendor_SysTickConfig not defined in device header file; using default!" #endif #endif @@ -241,12 +214,17 @@ \li for automatic generation of peripheral register debug information. */ #ifdef __cplusplus - #define __I volatile /*!< Defines 'read only' permissions */ + #define __I volatile /*!< Defines 'read only' permissions */ #else - #define __I volatile const /*!< Defines 'read only' permissions */ + #define __I volatile const /*!< Defines 'read only' permissions */ #endif -#define __O volatile /*!< Defines 'write only' permissions */ -#define __IO volatile /*!< Defines 'read / write' permissions */ +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ /*@} end of group Cortex_M4 */ @@ -263,1220 +241,1341 @@ - Core MPU Register - Core FPU Register ******************************************************************************/ -/** \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. */ -/** \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. @{ */ -/** \brief Union type to access the Application Program Status Register (APSR). +/** + \brief Union type to access the Application Program Status Register (APSR). */ typedef union { struct { - uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ + uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ } APSR_Type; /* APSR Register Definitions */ -#define APSR_N_Pos 31 /*!< APSR: N Position */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ #define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ -#define APSR_Z_Pos 30 /*!< APSR: Z Position */ +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ #define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ -#define APSR_C_Pos 29 /*!< APSR: C Position */ +#define APSR_C_Pos 29U /*!< APSR: C Position */ #define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ -#define APSR_V_Pos 28 /*!< APSR: V Position */ +#define APSR_V_Pos 28U /*!< APSR: V Position */ #define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ -#define APSR_Q_Pos 27 /*!< APSR: Q Position */ +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ #define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ -#define APSR_GE_Pos 16 /*!< APSR: GE Position */ +#define APSR_GE_Pos 16U /*!< APSR: GE Position */ #define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ -/** \brief Union type to access the Interrupt Program Status Register (IPSR). +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). */ typedef union { struct { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ } IPSR_Type; /* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0 /*!< IPSR: ISR Position */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ #define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ -/** \brief Union type to access the Special-Purpose Program Status Registers (xPSR). +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). */ typedef union { struct { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:1; /*!< bit: 9 Reserved */ + uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit */ + uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ } xPSR_Type; /* xPSR Register Definitions */ -#define xPSR_N_Pos 31 /*!< xPSR: N Position */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ #define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ -#define xPSR_Z_Pos 30 /*!< xPSR: Z Position */ +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ #define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ -#define xPSR_C_Pos 29 /*!< xPSR: C Position */ +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ #define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ -#define xPSR_V_Pos 28 /*!< xPSR: V Position */ +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ #define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ -#define xPSR_Q_Pos 27 /*!< xPSR: Q Position */ +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ #define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ -#define xPSR_IT_Pos 25 /*!< xPSR: IT Position */ -#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ +#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ +#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ -#define xPSR_T_Pos 24 /*!< xPSR: T Position */ +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ #define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ -#define xPSR_GE_Pos 16 /*!< xPSR: GE Position */ +#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ #define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ -#define xPSR_ISR_Pos 0 /*!< xPSR: ISR Position */ +#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ +#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ #define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ -/** \brief Union type to access the Control Registers (CONTROL). +/** + \brief Union type to access the Control Registers (CONTROL). */ typedef union { struct { uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ - uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ + uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ } CONTROL_Type; /* CONTROL Register Definitions */ -#define CONTROL_FPCA_Pos 2 /*!< CONTROL: FPCA Position */ +#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ #define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ -#define CONTROL_SPSEL_Pos 1 /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ #define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ -#define CONTROL_nPRIV_Pos 0 /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ #define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ /*@} end of group CMSIS_CORE */ -/** \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers @{ */ -/** \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). */ typedef struct { - __IO uint32_t ISER[8]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[24]; - __IO uint32_t ICER[8]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[24]; - __IO uint32_t ISPR[8]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[24]; - __IO uint32_t ICPR[8]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[24]; - __IO uint32_t IABR[8]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[56]; - __IO uint8_t IP[240]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED5[644]; - __O uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ + __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[24U]; + __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[24U]; + __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[24U]; + __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[24U]; + __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[56U]; + __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED5[644U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ } NVIC_Type; /* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0 /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ #define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ /*@} end of group CMSIS_NVIC */ -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers @{ */ -/** \brief Structure type to access the System Control Block (SCB). +/** + \brief Structure type to access the System Control Block (SCB). */ typedef struct { - __I uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IO uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IO uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IO uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IO uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IO uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - __IO uint8_t SHP[12]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IO uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IO uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IO uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IO uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IO uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IO uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IO uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __I uint32_t PFR[2]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __I uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __I uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __I uint32_t MMFR[4]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __I uint32_t ISAR[5]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - uint32_t RESERVED0[5]; - __IO uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHP[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + uint32_t RESERVED0[5U]; + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ } SCB_Type; /* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24 /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ #define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ -#define SCB_CPUID_VARIANT_Pos 20 /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ #define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ -#define SCB_CPUID_ARCHITECTURE_Pos 16 /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ #define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ -#define SCB_CPUID_PARTNO_Pos 4 /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ #define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ -#define SCB_CPUID_REVISION_Pos 0 /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ #define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ /* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31 /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ #define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ -#define SCB_ICSR_PENDSVSET_Pos 28 /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ #define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ -#define SCB_ICSR_PENDSVCLR_Pos 27 /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ #define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ -#define SCB_ICSR_PENDSTSET_Pos 26 /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ #define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ -#define SCB_ICSR_PENDSTCLR_Pos 25 /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ #define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ -#define SCB_ICSR_ISRPREEMPT_Pos 23 /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ #define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ -#define SCB_ICSR_ISRPENDING_Pos 22 /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ #define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ -#define SCB_ICSR_VECTPENDING_Pos 12 /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ #define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ -#define SCB_ICSR_RETTOBASE_Pos 11 /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ #define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ -#define SCB_ICSR_VECTACTIVE_Pos 0 /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ #define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ /* SCB Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7 /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ #define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ /* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16 /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ #define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ -#define SCB_AIRCR_VECTKEYSTAT_Pos 16 /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ #define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ -#define SCB_AIRCR_ENDIANESS_Pos 15 /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ #define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ -#define SCB_AIRCR_PRIGROUP_Pos 8 /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ #define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ -#define SCB_AIRCR_SYSRESETREQ_Pos 2 /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ #define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1 /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ #define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ -#define SCB_AIRCR_VECTRESET_Pos 0 /*!< SCB AIRCR: VECTRESET Position */ +#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ #define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */ /* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4 /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ #define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ -#define SCB_SCR_SLEEPDEEP_Pos 2 /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ #define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ -#define SCB_SCR_SLEEPONEXIT_Pos 1 /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ #define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ /* SCB Configuration Control Register Definitions */ -#define SCB_CCR_STKALIGN_Pos 9 /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ #define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ -#define SCB_CCR_BFHFNMIGN_Pos 8 /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ #define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ -#define SCB_CCR_DIV_0_TRP_Pos 4 /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ #define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ -#define SCB_CCR_UNALIGN_TRP_Pos 3 /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ #define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ -#define SCB_CCR_USERSETMPEND_Pos 1 /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ #define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ -#define SCB_CCR_NONBASETHRDENA_Pos 0 /*!< SCB CCR: NONBASETHRDENA Position */ +#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ #define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ /* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_USGFAULTENA_Pos 18 /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ #define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ -#define SCB_SHCSR_BUSFAULTENA_Pos 17 /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ #define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ -#define SCB_SHCSR_MEMFAULTENA_Pos 16 /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ #define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ -#define SCB_SHCSR_SVCALLPENDED_Pos 15 /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ #define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14 /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ #define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13 /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ #define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ -#define SCB_SHCSR_USGFAULTPENDED_Pos 12 /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ #define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ -#define SCB_SHCSR_SYSTICKACT_Pos 11 /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ #define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ -#define SCB_SHCSR_PENDSVACT_Pos 10 /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ #define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ -#define SCB_SHCSR_MONITORACT_Pos 8 /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ #define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ -#define SCB_SHCSR_SVCALLACT_Pos 7 /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ #define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ -#define SCB_SHCSR_USGFAULTACT_Pos 3 /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ #define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ -#define SCB_SHCSR_BUSFAULTACT_Pos 1 /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ #define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ -#define SCB_SHCSR_MEMFAULTACT_Pos 0 /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ #define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ -/* SCB Configurable Fault Status Registers Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16 /*!< SCB CFSR: Usage Fault Status Register Position */ +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ #define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ -#define SCB_CFSR_BUSFAULTSR_Pos 8 /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ #define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ -#define SCB_CFSR_MEMFAULTSR_Pos 0 /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ #define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ -/* SCB Hard Fault Status Registers Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31 /*!< SCB HFSR: DEBUGEVT Position */ +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MLSPERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ +#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ +#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ #define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ -#define SCB_HFSR_FORCED_Pos 30 /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ #define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ -#define SCB_HFSR_VECTTBL_Pos 1 /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ #define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ /* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4 /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ #define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ -#define SCB_DFSR_VCATCH_Pos 3 /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ #define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ -#define SCB_DFSR_DWTTRAP_Pos 2 /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ #define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ -#define SCB_DFSR_BKPT_Pos 1 /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ #define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ -#define SCB_DFSR_HALTED_Pos 0 /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ #define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ /*@} end of group CMSIS_SCB */ -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) - \brief Type definitions for the System Control and ID Register not in the SCB +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB @{ */ -/** \brief Structure type to access the System Control and ID Register not in the SCB. +/** + \brief Structure type to access the System Control and ID Register not in the SCB. */ typedef struct { - uint32_t RESERVED0[1]; - __I uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ - __IO uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ } SCnSCB_Type; /* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0 /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ #define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ /* Auxiliary Control Register Definitions */ -#define SCnSCB_ACTLR_DISOOFP_Pos 9 /*!< ACTLR: DISOOFP Position */ +#define SCnSCB_ACTLR_DISOOFP_Pos 9U /*!< ACTLR: DISOOFP Position */ #define SCnSCB_ACTLR_DISOOFP_Msk (1UL << SCnSCB_ACTLR_DISOOFP_Pos) /*!< ACTLR: DISOOFP Mask */ -#define SCnSCB_ACTLR_DISFPCA_Pos 8 /*!< ACTLR: DISFPCA Position */ +#define SCnSCB_ACTLR_DISFPCA_Pos 8U /*!< ACTLR: DISFPCA Position */ #define SCnSCB_ACTLR_DISFPCA_Msk (1UL << SCnSCB_ACTLR_DISFPCA_Pos) /*!< ACTLR: DISFPCA Mask */ -#define SCnSCB_ACTLR_DISFOLD_Pos 2 /*!< ACTLR: DISFOLD Position */ +#define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ #define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ -#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1 /*!< ACTLR: DISDEFWBUF Position */ +#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1U /*!< ACTLR: DISDEFWBUF Position */ #define SCnSCB_ACTLR_DISDEFWBUF_Msk (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos) /*!< ACTLR: DISDEFWBUF Mask */ -#define SCnSCB_ACTLR_DISMCYCINT_Pos 0 /*!< ACTLR: DISMCYCINT Position */ +#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ #define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ /*@} end of group CMSIS_SCnotSCB */ -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. @{ */ -/** \brief Structure type to access the System Timer (SysTick). +/** + \brief Structure type to access the System Timer (SysTick). */ typedef struct { - __IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IO uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IO uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __I uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ } SysTick_Type; /* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16 /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ #define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ -#define SysTick_CTRL_CLKSOURCE_Pos 2 /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ #define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ -#define SysTick_CTRL_TICKINT_Pos 1 /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ #define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ -#define SysTick_CTRL_ENABLE_Pos 0 /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ #define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ /* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0 /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ #define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ /* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0 /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ #define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ /* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31 /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ #define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ -#define SysTick_CALIB_SKEW_Pos 30 /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ #define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ -#define SysTick_CALIB_TENMS_Pos 0 /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ #define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ /*@} end of group CMSIS_SysTick */ -/** \ingroup CMSIS_core_register - \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) @{ */ -/** \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). */ typedef struct { - __O union + __OM union { - __O uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __O uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __O uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864]; - __IO uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15]; - __IO uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15]; - __IO uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[29]; - __O uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ - __I uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ - __IO uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ - uint32_t RESERVED4[43]; - __O uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __I uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[6]; - __I uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __I uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __I uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __I uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __I uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __I uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __I uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __I uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __I uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __I uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __I uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __I uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[29U]; + __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ + __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ + __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[6U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ } ITM_Type; /* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0 /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ /* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23 /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ #define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ -#define ITM_TCR_TraceBusID_Pos 16 /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ #define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ -#define ITM_TCR_GTSFREQ_Pos 10 /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ #define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ -#define ITM_TCR_TSPrescale_Pos 8 /*!< ITM TCR: TSPrescale Position */ +#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ #define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ -#define ITM_TCR_SWOENA_Pos 4 /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ #define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ -#define ITM_TCR_DWTENA_Pos 3 /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ #define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ -#define ITM_TCR_SYNCENA_Pos 2 /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ #define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ -#define ITM_TCR_TSENA_Pos 1 /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ #define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ -#define ITM_TCR_ITMENA_Pos 0 /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ #define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ /* ITM Integration Write Register Definitions */ -#define ITM_IWR_ATVALIDM_Pos 0 /*!< ITM IWR: ATVALIDM Position */ +#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ #define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ /* ITM Integration Read Register Definitions */ -#define ITM_IRR_ATREADYM_Pos 0 /*!< ITM IRR: ATREADYM Position */ +#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ #define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ /* ITM Integration Mode Control Register Definitions */ -#define ITM_IMCR_INTEGRATION_Pos 0 /*!< ITM IMCR: INTEGRATION Position */ +#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ #define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION Mask */ /* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2 /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ #define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ -#define ITM_LSR_Access_Pos 1 /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ #define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ -#define ITM_LSR_Present_Pos 0 /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ #define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ /*@}*/ /* end of group CMSIS_ITM */ -/** \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) @{ */ -/** \brief Structure type to access the Data Watchpoint and Trace Register (DWT). +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). */ typedef struct { - __IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IO uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IO uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IO uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IO uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IO uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IO uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __I uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IO uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - __IO uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ - __IO uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED0[1]; - __IO uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - __IO uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ - __IO uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED1[1]; - __IO uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - __IO uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ - __IO uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED2[1]; - __IO uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - __IO uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ - __IO uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED0[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ } DWT_Type; /* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28 /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ #define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ -#define DWT_CTRL_NOTRCPKT_Pos 27 /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ #define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ -#define DWT_CTRL_NOEXTTRIG_Pos 26 /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ #define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ -#define DWT_CTRL_NOCYCCNT_Pos 25 /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ #define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ -#define DWT_CTRL_NOPRFCNT_Pos 24 /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ #define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ -#define DWT_CTRL_CYCEVTENA_Pos 22 /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ #define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ -#define DWT_CTRL_FOLDEVTENA_Pos 21 /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ #define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ -#define DWT_CTRL_LSUEVTENA_Pos 20 /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ #define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ -#define DWT_CTRL_SLEEPEVTENA_Pos 19 /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ #define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ -#define DWT_CTRL_EXCEVTENA_Pos 18 /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ #define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ -#define DWT_CTRL_CPIEVTENA_Pos 17 /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ #define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ -#define DWT_CTRL_EXCTRCENA_Pos 16 /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ #define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ -#define DWT_CTRL_PCSAMPLENA_Pos 12 /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ #define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ -#define DWT_CTRL_SYNCTAP_Pos 10 /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ #define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ -#define DWT_CTRL_CYCTAP_Pos 9 /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ #define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ -#define DWT_CTRL_POSTINIT_Pos 5 /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ #define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ -#define DWT_CTRL_POSTPRESET_Pos 1 /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ #define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ -#define DWT_CTRL_CYCCNTENA_Pos 0 /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ #define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ /* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0 /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ #define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ /* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0 /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ #define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ /* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0 /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ #define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ /* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0 /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ #define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ /* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0 /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ #define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ /* DWT Comparator Mask Register Definitions */ -#define DWT_MASK_MASK_Pos 0 /*!< DWT MASK: MASK Position */ +#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ #define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ /* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_MATCHED_Pos 24 /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ #define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ -#define DWT_FUNCTION_DATAVADDR1_Pos 16 /*!< DWT FUNCTION: DATAVADDR1 Position */ +#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ #define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ -#define DWT_FUNCTION_DATAVADDR0_Pos 12 /*!< DWT FUNCTION: DATAVADDR0 Position */ +#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ #define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ -#define DWT_FUNCTION_DATAVSIZE_Pos 10 /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ #define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ -#define DWT_FUNCTION_LNK1ENA_Pos 9 /*!< DWT FUNCTION: LNK1ENA Position */ +#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ #define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ -#define DWT_FUNCTION_DATAVMATCH_Pos 8 /*!< DWT FUNCTION: DATAVMATCH Position */ +#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ #define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ -#define DWT_FUNCTION_CYCMATCH_Pos 7 /*!< DWT FUNCTION: CYCMATCH Position */ +#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ #define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ -#define DWT_FUNCTION_EMITRANGE_Pos 5 /*!< DWT FUNCTION: EMITRANGE Position */ +#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ #define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ -#define DWT_FUNCTION_FUNCTION_Pos 0 /*!< DWT FUNCTION: FUNCTION Position */ +#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ #define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ /*@}*/ /* end of group CMSIS_DWT */ -/** \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) @{ */ -/** \brief Structure type to access the Trace Port Interface Register (TPI). +/** + \brief Structure type to access the Trace Port Interface Register (TPI). */ typedef struct { - __IO uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ - __IO uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ - uint32_t RESERVED0[2]; - __IO uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55]; - __IO uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131]; - __I uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IO uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __I uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ - uint32_t RESERVED3[759]; - __I uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER */ - __I uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ - __I uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ - uint32_t RESERVED4[1]; - __I uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ - __I uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ - __IO uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ - uint32_t RESERVED5[39]; - __IO uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ - __IO uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ - uint32_t RESERVED7[8]; - __I uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ - __I uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ + __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ + __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ + __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ } TPI_Type; /* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_PRESCALER_Pos 0 /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ #define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ /* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0 /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ #define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ /* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3 /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ #define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ -#define TPI_FFSR_TCPresent_Pos 2 /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ #define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ -#define TPI_FFSR_FtStopped_Pos 1 /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ #define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ -#define TPI_FFSR_FlInProg_Pos 0 /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ #define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ /* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8 /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ #define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ -#define TPI_FFCR_EnFCont_Pos 1 /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ #define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ /* TPI TRIGGER Register Definitions */ -#define TPI_TRIGGER_TRIGGER_Pos 0 /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ #define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ /* TPI Integration ETM Data Register Definitions (FIFO0) */ -#define TPI_FIFO0_ITM_ATVALID_Pos 29 /*!< TPI FIFO0: ITM_ATVALID Position */ +#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ #define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ -#define TPI_FIFO0_ITM_bytecount_Pos 27 /*!< TPI FIFO0: ITM_bytecount Position */ +#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ #define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ -#define TPI_FIFO0_ETM_ATVALID_Pos 26 /*!< TPI FIFO0: ETM_ATVALID Position */ +#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ #define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ -#define TPI_FIFO0_ETM_bytecount_Pos 24 /*!< TPI FIFO0: ETM_bytecount Position */ +#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ #define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ -#define TPI_FIFO0_ETM2_Pos 16 /*!< TPI FIFO0: ETM2 Position */ +#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ #define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ -#define TPI_FIFO0_ETM1_Pos 8 /*!< TPI FIFO0: ETM1 Position */ +#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ #define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ -#define TPI_FIFO0_ETM0_Pos 0 /*!< TPI FIFO0: ETM0 Position */ +#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ #define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ /* TPI ITATBCTR2 Register Definitions */ -#define TPI_ITATBCTR2_ATREADY_Pos 0 /*!< TPI ITATBCTR2: ATREADY Position */ -#define TPI_ITATBCTR2_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY_Pos*/) /*!< TPI ITATBCTR2: ATREADY Mask */ +#define TPI_ITATBCTR2_ATREADY2_Pos 0U /*!< TPI ITATBCTR2: ATREADY2 Position */ +#define TPI_ITATBCTR2_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2_Pos*/) /*!< TPI ITATBCTR2: ATREADY2 Mask */ + +#define TPI_ITATBCTR2_ATREADY1_Pos 0U /*!< TPI ITATBCTR2: ATREADY1 Position */ +#define TPI_ITATBCTR2_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1_Pos*/) /*!< TPI ITATBCTR2: ATREADY1 Mask */ /* TPI Integration ITM Data Register Definitions (FIFO1) */ -#define TPI_FIFO1_ITM_ATVALID_Pos 29 /*!< TPI FIFO1: ITM_ATVALID Position */ +#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ #define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ -#define TPI_FIFO1_ITM_bytecount_Pos 27 /*!< TPI FIFO1: ITM_bytecount Position */ +#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ #define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ -#define TPI_FIFO1_ETM_ATVALID_Pos 26 /*!< TPI FIFO1: ETM_ATVALID Position */ +#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ #define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ -#define TPI_FIFO1_ETM_bytecount_Pos 24 /*!< TPI FIFO1: ETM_bytecount Position */ +#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ #define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ -#define TPI_FIFO1_ITM2_Pos 16 /*!< TPI FIFO1: ITM2 Position */ +#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ #define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ -#define TPI_FIFO1_ITM1_Pos 8 /*!< TPI FIFO1: ITM1 Position */ +#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ #define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ -#define TPI_FIFO1_ITM0_Pos 0 /*!< TPI FIFO1: ITM0 Position */ +#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ #define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ /* TPI ITATBCTR0 Register Definitions */ -#define TPI_ITATBCTR0_ATREADY_Pos 0 /*!< TPI ITATBCTR0: ATREADY Position */ -#define TPI_ITATBCTR0_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY_Pos*/) /*!< TPI ITATBCTR0: ATREADY Mask */ +#define TPI_ITATBCTR0_ATREADY2_Pos 0U /*!< TPI ITATBCTR0: ATREADY2 Position */ +#define TPI_ITATBCTR0_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2_Pos*/) /*!< TPI ITATBCTR0: ATREADY2 Mask */ + +#define TPI_ITATBCTR0_ATREADY1_Pos 0U /*!< TPI ITATBCTR0: ATREADY1 Position */ +#define TPI_ITATBCTR0_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1_Pos*/) /*!< TPI ITATBCTR0: ATREADY1 Mask */ /* TPI Integration Mode Control Register Definitions */ -#define TPI_ITCTRL_Mode_Pos 0 /*!< TPI ITCTRL: Mode Position */ -#define TPI_ITCTRL_Mode_Msk (0x1UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ /* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11 /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ #define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ -#define TPI_DEVID_MANCVALID_Pos 10 /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ #define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ -#define TPI_DEVID_PTINVALID_Pos 9 /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ #define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ -#define TPI_DEVID_MinBufSz_Pos 6 /*!< TPI DEVID: MinBufSz Position */ +#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ #define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ -#define TPI_DEVID_AsynClkIn_Pos 5 /*!< TPI DEVID: AsynClkIn Position */ +#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ #define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ -#define TPI_DEVID_NrTraceInput_Pos 0 /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ #define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ /* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_MajorType_Pos 4 /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -#define TPI_DEVTYPE_SubType_Pos 0 /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ #define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + /*@}*/ /* end of group CMSIS_TPI */ -#if (__MPU_PRESENT == 1) -/** \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) @{ */ -/** \brief Structure type to access the Memory Protection Unit (MPU). +/** + \brief Structure type to access the Memory Protection Unit (MPU). */ typedef struct { - __I uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IO uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IO uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IO uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IO uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ - __IO uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ - __IO uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ - __IO uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ - __IO uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ - __IO uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ - __IO uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ + __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ + __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ + __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ } MPU_Type; -/* MPU Type Register */ -#define MPU_TYPE_IREGION_Pos 16 /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_RALIASES 4U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ #define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ -#define MPU_TYPE_DREGION_Pos 8 /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ #define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ -#define MPU_TYPE_SEPARATE_Pos 0 /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ #define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ -/* MPU Control Register */ -#define MPU_CTRL_PRIVDEFENA_Pos 2 /*!< MPU CTRL: PRIVDEFENA Position */ +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ #define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ -#define MPU_CTRL_HFNMIENA_Pos 1 /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ #define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ -#define MPU_CTRL_ENABLE_Pos 0 /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ #define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ -/* MPU Region Number Register */ -#define MPU_RNR_REGION_Pos 0 /*!< MPU RNR: REGION Position */ +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ #define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ -/* MPU Region Base Address Register */ -#define MPU_RBAR_ADDR_Pos 5 /*!< MPU RBAR: ADDR Position */ +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ #define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ -#define MPU_RBAR_VALID_Pos 4 /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ #define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ -#define MPU_RBAR_REGION_Pos 0 /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ #define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ -/* MPU Region Attribute and Size Register */ -#define MPU_RASR_ATTRS_Pos 16 /*!< MPU RASR: MPU Region Attribute field Position */ +/* MPU Region Attribute and Size Register Definitions */ +#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ #define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ -#define MPU_RASR_XN_Pos 28 /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ #define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ -#define MPU_RASR_AP_Pos 24 /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ #define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ -#define MPU_RASR_TEX_Pos 19 /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ #define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ -#define MPU_RASR_S_Pos 18 /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ #define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ -#define MPU_RASR_C_Pos 17 /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ #define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ -#define MPU_RASR_B_Pos 16 /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ #define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ -#define MPU_RASR_SRD_Pos 8 /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ #define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ -#define MPU_RASR_SIZE_Pos 1 /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ #define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ -#define MPU_RASR_ENABLE_Pos 0 /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ #define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ /*@} end of group CMSIS_MPU */ -#endif +#endif /* defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) */ -#if (__FPU_PRESENT == 1) -/** \ingroup CMSIS_core_register - \defgroup CMSIS_FPU Floating Point Unit (FPU) - \brief Type definitions for the Floating Point Unit (FPU) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_FPU Floating Point Unit (FPU) + \brief Type definitions for the Floating Point Unit (FPU) @{ */ -/** \brief Structure type to access the Floating Point Unit (FPU). +/** + \brief Structure type to access the Floating Point Unit (FPU). */ typedef struct { - uint32_t RESERVED0[1]; - __IO uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ - __IO uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ - __IO uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ - __I uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ - __I uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ + uint32_t RESERVED0[1U]; + __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ + __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ + __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ + __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ } FPU_Type; -/* Floating-Point Context Control Register */ -#define FPU_FPCCR_ASPEN_Pos 31 /*!< FPCCR: ASPEN bit Position */ +/* Floating-Point Context Control Register Definitions */ +#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ #define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ -#define FPU_FPCCR_LSPEN_Pos 30 /*!< FPCCR: LSPEN Position */ +#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ #define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ -#define FPU_FPCCR_MONRDY_Pos 8 /*!< FPCCR: MONRDY Position */ +#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ #define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ -#define FPU_FPCCR_BFRDY_Pos 6 /*!< FPCCR: BFRDY Position */ +#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ #define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ -#define FPU_FPCCR_MMRDY_Pos 5 /*!< FPCCR: MMRDY Position */ +#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ #define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ -#define FPU_FPCCR_HFRDY_Pos 4 /*!< FPCCR: HFRDY Position */ +#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ #define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ -#define FPU_FPCCR_THREAD_Pos 3 /*!< FPCCR: processor mode bit Position */ +#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ #define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ -#define FPU_FPCCR_USER_Pos 1 /*!< FPCCR: privilege level bit Position */ +#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ #define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ -#define FPU_FPCCR_LSPACT_Pos 0 /*!< FPCCR: Lazy state preservation active bit Position */ +#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ #define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ -/* Floating-Point Context Address Register */ -#define FPU_FPCAR_ADDRESS_Pos 3 /*!< FPCAR: ADDRESS bit Position */ +/* Floating-Point Context Address Register Definitions */ +#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ #define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ -/* Floating-Point Default Status Control Register */ -#define FPU_FPDSCR_AHP_Pos 26 /*!< FPDSCR: AHP bit Position */ +/* Floating-Point Default Status Control Register Definitions */ +#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ #define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ -#define FPU_FPDSCR_DN_Pos 25 /*!< FPDSCR: DN bit Position */ +#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ #define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ -#define FPU_FPDSCR_FZ_Pos 24 /*!< FPDSCR: FZ bit Position */ +#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ #define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ -#define FPU_FPDSCR_RMode_Pos 22 /*!< FPDSCR: RMode bit Position */ +#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ #define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ -/* Media and FP Feature Register 0 */ -#define FPU_MVFR0_FP_rounding_modes_Pos 28 /*!< MVFR0: FP rounding modes bits Position */ +/* Media and FP Feature Register 0 Definitions */ +#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ #define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ -#define FPU_MVFR0_Short_vectors_Pos 24 /*!< MVFR0: Short vectors bits Position */ +#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ #define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ -#define FPU_MVFR0_Square_root_Pos 20 /*!< MVFR0: Square root bits Position */ +#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ #define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ -#define FPU_MVFR0_Divide_Pos 16 /*!< MVFR0: Divide bits Position */ +#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ #define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ -#define FPU_MVFR0_FP_excep_trapping_Pos 12 /*!< MVFR0: FP exception trapping bits Position */ +#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ #define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ -#define FPU_MVFR0_Double_precision_Pos 8 /*!< MVFR0: Double-precision bits Position */ +#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ #define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ -#define FPU_MVFR0_Single_precision_Pos 4 /*!< MVFR0: Single-precision bits Position */ +#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ #define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ -#define FPU_MVFR0_A_SIMD_registers_Pos 0 /*!< MVFR0: A_SIMD registers bits Position */ +#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ #define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ -/* Media and FP Feature Register 1 */ -#define FPU_MVFR1_FP_fused_MAC_Pos 28 /*!< MVFR1: FP fused MAC bits Position */ +/* Media and FP Feature Register 1 Definitions */ +#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ #define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ -#define FPU_MVFR1_FP_HPFP_Pos 24 /*!< MVFR1: FP HPFP bits Position */ +#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ #define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ -#define FPU_MVFR1_D_NaN_mode_Pos 4 /*!< MVFR1: D_NaN mode bits Position */ +#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ #define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ -#define FPU_MVFR1_FtZ_mode_Pos 0 /*!< MVFR1: FtZ mode bits Position */ +#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ #define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ /*@} end of group CMSIS_FPU */ -#endif -/** \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers @{ */ -/** \brief Structure type to access the Core Debug Register (CoreDebug). +/** + \brief Structure type to access the Core Debug Register (CoreDebug). */ typedef struct { - __IO uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __O uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IO uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IO uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ } CoreDebug_Type; -/* Debug Halting Control and Status Register */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16 /*!< CoreDebug DHCSR: DBGKEY Position */ +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ #define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25 /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ #define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24 /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ #define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19 /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ #define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ -#define CoreDebug_DHCSR_S_SLEEP_Pos 18 /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ #define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ -#define CoreDebug_DHCSR_S_HALT_Pos 17 /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ #define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ -#define CoreDebug_DHCSR_S_REGRDY_Pos 16 /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ #define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5 /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ #define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3 /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ #define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ -#define CoreDebug_DHCSR_C_STEP_Pos 2 /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ #define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ -#define CoreDebug_DHCSR_C_HALT_Pos 1 /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ #define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0 /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ #define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ -/* Debug Core Register Selector Register */ -#define CoreDebug_DCRSR_REGWnR_Pos 16 /*!< CoreDebug DCRSR: REGWnR Position */ +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ #define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ -#define CoreDebug_DCRSR_REGSEL_Pos 0 /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ #define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ -/* Debug Exception and Monitor Control Register */ -#define CoreDebug_DEMCR_TRCENA_Pos 24 /*!< CoreDebug DEMCR: TRCENA Position */ +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ #define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ -#define CoreDebug_DEMCR_MON_REQ_Pos 19 /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ #define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ -#define CoreDebug_DEMCR_MON_STEP_Pos 18 /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ #define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ -#define CoreDebug_DEMCR_MON_PEND_Pos 17 /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ #define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ -#define CoreDebug_DEMCR_MON_EN_Pos 16 /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ #define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10 /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ #define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ -#define CoreDebug_DEMCR_VC_INTERR_Pos 9 /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ #define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8 /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ #define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ -#define CoreDebug_DEMCR_VC_STATERR_Pos 7 /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ #define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6 /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ #define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5 /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ #define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ -#define CoreDebug_DEMCR_VC_MMERR_Pos 4 /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ #define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0 /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ #define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ /*@} end of group CMSIS_CoreDebug */ -/** \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). @{ */ -/* Memory mapping of Cortex-M4 Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ -#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ -#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ -#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ +#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ +#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ +#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ #define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ -#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ -#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ -#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ -#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ - -#if (__MPU_PRESENT == 1) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ +#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ +#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ +#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ +#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ #endif -#if (__FPU_PRESENT == 1) - #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ - #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ -#endif +#define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ +#define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ /*@} */ @@ -1490,187 +1589,276 @@ typedef struct - Core Debug Functions - Core Register Access Functions ******************************************************************************/ -/** \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference */ /* ########################## NVIC functions #################################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ */ -/** \brief Set Priority Grouping +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + - The function sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. +/* The following EXC_RETURN values are saved the LR on exception entry */ +#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ +#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ +#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ +#define EXC_RETURN_HANDLER_FPU (0xFFFFFFE1UL) /* return to Handler mode, uses MSP after return, restore floating-point state */ +#define EXC_RETURN_THREAD_MSP_FPU (0xFFFFFFE9UL) /* return to Thread mode, uses MSP after return, restore floating-point state */ +#define EXC_RETURN_THREAD_PSP_FPU (0xFFFFFFEDUL) /* return to Thread mode, uses PSP after return, restore floating-point state */ - \param [in] PriorityGroup Priority grouping field. + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. */ -__STATIC_INLINE void NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) { uint32_t reg_value; uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ reg_value = (reg_value | ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << 8) ); /* Insert write key and priorty group */ + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ SCB->AIRCR = reg_value; } -/** \brief Get Priority Grouping - - The function reads the priority grouping field from the NVIC Interrupt Controller. - - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). */ -__STATIC_INLINE uint32_t NVIC_GetPriorityGrouping(void) +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) { return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); } -/** \brief Enable External Interrupt - - The function enables a device-specific interrupt in the NVIC interrupt controller. - - \param [in] IRQn External interrupt number. Value cannot be negative. +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. */ -__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) { - NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } } -/** \brief Disable External Interrupt - - The function disables a device-specific interrupt in the NVIC interrupt controller. - - \param [in] IRQn External interrupt number. Value cannot be negative. +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. */ -__STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) { - NVIC->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } } -/** \brief Get Pending Interrupt - - The function reads the pending register in the NVIC and returns the pending bit - for the specified interrupt. - - \param [in] IRQn Interrupt number. - - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. */ -__STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) { - return((uint32_t)(((NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } } -/** \brief Set Pending Interrupt - - The function sets the pending bit of an external interrupt. - - \param [in] IRQn Interrupt number. Value cannot be negative. +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. */ -__STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) { - NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } } -/** \brief Clear Pending Interrupt - - The function clears the pending bit of an external interrupt. - - \param [in] IRQn External interrupt number. Value cannot be negative. +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. */ -__STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) { - NVIC->ICPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } } -/** \brief Get Active Interrupt - - The function reads the active register in NVIC and returns the active bit. - - \param [in] IRQn Interrupt number. - - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. */ -__STATIC_INLINE uint32_t NVIC_GetActive(IRQn_Type IRQn) +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) { - return((uint32_t)(((NVIC->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } } -/** \brief Set Interrupt Priority - - The function sets the priority of an interrupt. - - \note The priority cannot be set for every core interrupt. - - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. */ -__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) { - if((int32_t)IRQn < 0) { - SCB->SHP[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8 - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); } - else { - NVIC->IP[((uint32_t)(int32_t)IRQn)] = (uint8_t)((priority << (8 - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + else + { + return(0U); } } -/** \brief Get Interrupt Priority - - The function reads the priority of an interrupt. The interrupt - number can be positive to specify an external (device specific) - interrupt, or negative to specify an internal (core) interrupt. +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} - \param [in] IRQn Interrupt number. - \return Interrupt Priority. Value is aligned automatically to the implemented - priority bits of the microcontroller. +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. */ -__STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) { - if((int32_t)IRQn < 0) { - return(((uint32_t)SCB->SHP[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] >> (8 - __NVIC_PRIO_BITS))); + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IP[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); } - else { - return(((uint32_t)NVIC->IP[((uint32_t)(int32_t)IRQn)] >> (8 - __NVIC_PRIO_BITS))); + else + { + return(((uint32_t)SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); } } -/** \brief Encode Priority - - The function encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). */ __STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) { @@ -1688,19 +1876,18 @@ __STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t P } -/** \brief Decode Priority - - The function decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority) +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) { uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ uint32_t PreemptPriorityBits; @@ -1714,11 +1901,42 @@ __STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGr } -/** \brief System Reset +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + - The function initiates a system reset request to reset the MCU. +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. */ -__STATIC_INLINE void NVIC_SystemReset(void) +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) { __DSB(); /* Ensure all outstanding memory accesses included buffered write are completed before reset */ @@ -1726,40 +1944,87 @@ __STATIC_INLINE void NVIC_SystemReset(void) (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ __DSB(); /* Ensure completion of memory access */ - while(1) { __NOP(); } /* wait until reset */ + + for(;;) /* wait until reset */ + { + __NOP(); + } } /*@} end of CMSIS_Core_NVICFunctions */ +/* ########################## MPU functions #################################### */ +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) -/* ################################## SysTick function ############################################ */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. +#include "mpu_armv7.h" + +#endif + + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. @{ */ -#if (__Vendor_SysTickConfig == 0) +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + uint32_t mvfr0; + + mvfr0 = FPU->MVFR0; + if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) + { + return 1U; /* Single precision FPU */ + } + else + { + return 0U; /* No FPU */ + } +} + -/** \brief System Tick Configuration +/*@} end of CMSIS_Core_FpuFunctions */ - The function initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. */ __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) { - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) { return (1UL); } /* Reload value impossible */ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ @@ -1777,49 +2042,52 @@ __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) /* ##################################### Debug In/Output function ########################################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. @{ */ -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY 0x5AA55AA5 /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** \brief ITM Send Character +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - The function transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - \param [in] ch Character to transmit. - - \returns Character to transmit. +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. */ __STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) { if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ { - while (ITM->PORT[0].u32 == 0UL) { __NOP(); } - ITM->PORT[0].u8 = (uint8_t)ch; + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; } return (ch); } -/** \brief ITM Receive Character - - The function inputs a character via the external variable \ref ITM_RxBuffer. - - \return Received character. - \return -1 No character pending. +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) { +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ int32_t ch = -1; /* no character available */ - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) { + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { ch = ITM_RxBuffer; ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ } @@ -1828,19 +2096,22 @@ __STATIC_INLINE int32_t ITM_ReceiveChar (void) { } -/** \brief ITM Check Character - - The function checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - - \return 0 No character available. - \return 1 Character available. +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. */ -__STATIC_INLINE int32_t ITM_CheckChar (void) { +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) { - return (0); /* no character available */ - } else { - return (1); /* character available */ + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ } } diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Include/core_cm7.h b/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/core_cm7.h old mode 100755 new mode 100644 similarity index 50% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Include/core_cm7.h rename to STM32CubeMX/revF/Drivers/CMSIS/Core/Include/core_cm7.h index 842e323f..a14dc623 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Include/core_cm7.h +++ b/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/core_cm7.h @@ -1,52 +1,44 @@ /**************************************************************************//** * @file core_cm7.h * @brief CMSIS Cortex-M7 Core Peripheral Access Layer Header File - * @version V4.10 - * @date 18. March 2015 + * @version V5.0.8 + * @date 04. June 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. * - * @note + * SPDX-License-Identifier: Apache-2.0 * - ******************************************************************************/ -/* Copyright (c) 2009 - 2015 ARM LIMITED - - All rights reserved. - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - Neither the name of ARM nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - * - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - ---------------------------------------------------------------------------*/ - - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ #endif #ifndef __CORE_CM7_H_GENERIC #define __CORE_CM7_H_GENERIC +#include + #ifdef __cplusplus extern "C" { #endif -/** \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions CMSIS violates the following MISRA-C:2004 rules: \li Required Rule 8.5, object/function definition in header file.
@@ -63,131 +55,112 @@ /******************************************************************************* * CMSIS definitions ******************************************************************************/ -/** \ingroup Cortex_M7 +/** + \ingroup Cortex_M7 @{ */ -/* CMSIS CM7 definitions */ -#define __CM7_CMSIS_VERSION_MAIN (0x04) /*!< [31:16] CMSIS HAL main version */ -#define __CM7_CMSIS_VERSION_SUB (0x00) /*!< [15:0] CMSIS HAL sub version */ -#define __CM7_CMSIS_VERSION ((__CM7_CMSIS_VERSION_MAIN << 16) | \ - __CM7_CMSIS_VERSION_SUB ) /*!< CMSIS HAL version number */ - -#define __CORTEX_M (0x07) /*!< Cortex-M Core */ - - -#if defined ( __CC_ARM ) - #define __ASM __asm /*!< asm keyword for ARM Compiler */ - #define __INLINE __inline /*!< inline keyword for ARM Compiler */ - #define __STATIC_INLINE static __inline - -#elif defined ( __GNUC__ ) - #define __ASM __asm /*!< asm keyword for GNU Compiler */ - #define __INLINE inline /*!< inline keyword for GNU Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __ICCARM__ ) - #define __ASM __asm /*!< asm keyword for IAR Compiler */ - #define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */ - #define __STATIC_INLINE static inline - -#elif defined ( __TMS470__ ) - #define __ASM __asm /*!< asm keyword for TI CCS Compiler */ - #define __STATIC_INLINE static inline +#include "cmsis_version.h" -#elif defined ( __TASKING__ ) - #define __ASM __asm /*!< asm keyword for TASKING Compiler */ - #define __INLINE inline /*!< inline keyword for TASKING Compiler */ - #define __STATIC_INLINE static inline +/* CMSIS CM7 definitions */ +#define __CM7_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM7_CMSIS_VERSION_SUB ( __CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM7_CMSIS_VERSION ((__CM7_CMSIS_VERSION_MAIN << 16U) | \ + __CM7_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ -#elif defined ( __CSMC__ ) - #define __packed - #define __ASM _asm /*!< asm keyword for COSMIC Compiler */ - #define __INLINE inline /*use -pc99 on compile line !< inline keyword for COSMIC Compiler */ - #define __STATIC_INLINE static inline - -#endif +#define __CORTEX_M (7U) /*!< Cortex-M Core */ /** __FPU_USED indicates whether an FPU is used or not. For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. */ #if defined ( __CC_ARM ) #if defined __TARGET_FPU_VFP - #if (__FPU_PRESENT == 1) - #define __FPU_USED 1 + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U #else #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0 + #define __FPU_USED 0U #endif #else - #define __FPU_USED 0 + #define __FPU_USED 0U #endif #elif defined ( __GNUC__ ) #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #if (__FPU_PRESENT == 1) - #define __FPU_USED 1 + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U #else - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0 + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U #endif #else - #define __FPU_USED 0 + #define __FPU_USED 0U #endif #elif defined ( __ICCARM__ ) #if defined __ARMVFP__ - #if (__FPU_PRESENT == 1) - #define __FPU_USED 1 + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U #else - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0 + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U #endif #else - #define __FPU_USED 0 + #define __FPU_USED 0U #endif -#elif defined ( __TMS470__ ) +#elif defined ( __TI_ARM__ ) #if defined __TI_VFP_SUPPORT__ - #if (__FPU_PRESENT == 1) - #define __FPU_USED 1 + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U #else - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0 + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U #endif #else - #define __FPU_USED 0 + #define __FPU_USED 0U #endif #elif defined ( __TASKING__ ) #if defined __FPU_VFP__ - #if (__FPU_PRESENT == 1) - #define __FPU_USED 1 + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U #else #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0 + #define __FPU_USED 0U #endif #else - #define __FPU_USED 0 + #define __FPU_USED 0U #endif -#elif defined ( __CSMC__ ) /* Cosmic */ - #if ( __CSMC__ & 0x400) // FPU present for parser - #if (__FPU_PRESENT == 1) - #define __FPU_USED 1 +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U #else #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #define __FPU_USED 0 + #define __FPU_USED 0U #endif #else - #define __FPU_USED 0 + #define __FPU_USED 0U #endif + #endif -#include /* standard types definitions */ -#include /* Core Instruction Access */ -#include /* Core Function Access */ -#include /* Compiler specific SIMD Intrinsics */ +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + #ifdef __cplusplus } @@ -207,42 +180,42 @@ /* check device defines and use defaults */ #if defined __CHECK_DEVICE_DEFINES #ifndef __CM7_REV - #define __CM7_REV 0x0000 + #define __CM7_REV 0x0000U #warning "__CM7_REV not defined in device header file; using default!" #endif #ifndef __FPU_PRESENT - #define __FPU_PRESENT 0 + #define __FPU_PRESENT 0U #warning "__FPU_PRESENT not defined in device header file; using default!" #endif #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0 + #define __MPU_PRESENT 0U #warning "__MPU_PRESENT not defined in device header file; using default!" #endif #ifndef __ICACHE_PRESENT - #define __ICACHE_PRESENT 0 + #define __ICACHE_PRESENT 0U #warning "__ICACHE_PRESENT not defined in device header file; using default!" #endif #ifndef __DCACHE_PRESENT - #define __DCACHE_PRESENT 0 + #define __DCACHE_PRESENT 0U #warning "__DCACHE_PRESENT not defined in device header file; using default!" #endif #ifndef __DTCM_PRESENT - #define __DTCM_PRESENT 0 + #define __DTCM_PRESENT 0U #warning "__DTCM_PRESENT not defined in device header file; using default!" #endif #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 3 + #define __NVIC_PRIO_BITS 3U #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" #endif #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0 + #define __Vendor_SysTickConfig 0U #warning "__Vendor_SysTickConfig not defined in device header file; using default!" #endif #endif @@ -256,12 +229,17 @@ \li for automatic generation of peripheral register debug information. */ #ifdef __cplusplus - #define __I volatile /*!< Defines 'read only' permissions */ + #define __I volatile /*!< Defines 'read only' permissions */ #else - #define __I volatile const /*!< Defines 'read only' permissions */ + #define __I volatile const /*!< Defines 'read only' permissions */ #endif -#define __O volatile /*!< Defines 'write only' permissions */ -#define __IO volatile /*!< Defines 'read / write' permissions */ +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ /*@} end of group Cortex_M7 */ @@ -278,1392 +256,1534 @@ - Core MPU Register - Core FPU Register ******************************************************************************/ -/** \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. */ -/** \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. @{ */ -/** \brief Union type to access the Application Program Status Register (APSR). +/** + \brief Union type to access the Application Program Status Register (APSR). */ typedef union { struct { - uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ + uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ } APSR_Type; /* APSR Register Definitions */ -#define APSR_N_Pos 31 /*!< APSR: N Position */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ #define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ -#define APSR_Z_Pos 30 /*!< APSR: Z Position */ +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ #define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ -#define APSR_C_Pos 29 /*!< APSR: C Position */ +#define APSR_C_Pos 29U /*!< APSR: C Position */ #define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ -#define APSR_V_Pos 28 /*!< APSR: V Position */ +#define APSR_V_Pos 28U /*!< APSR: V Position */ #define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ -#define APSR_Q_Pos 27 /*!< APSR: Q Position */ +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ #define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ -#define APSR_GE_Pos 16 /*!< APSR: GE Position */ +#define APSR_GE_Pos 16U /*!< APSR: GE Position */ #define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ -/** \brief Union type to access the Interrupt Program Status Register (IPSR). +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). */ typedef union { struct { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ } IPSR_Type; /* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0 /*!< IPSR: ISR Position */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ #define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ -/** \brief Union type to access the Special-Purpose Program Status Registers (xPSR). +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). */ typedef union { struct { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ - uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ - uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:1; /*!< bit: 9 Reserved */ + uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit */ + uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ } xPSR_Type; /* xPSR Register Definitions */ -#define xPSR_N_Pos 31 /*!< xPSR: N Position */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ #define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ -#define xPSR_Z_Pos 30 /*!< xPSR: Z Position */ +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ #define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ -#define xPSR_C_Pos 29 /*!< xPSR: C Position */ +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ #define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ -#define xPSR_V_Pos 28 /*!< xPSR: V Position */ +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ #define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ -#define xPSR_Q_Pos 27 /*!< xPSR: Q Position */ +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ #define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ -#define xPSR_IT_Pos 25 /*!< xPSR: IT Position */ -#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ +#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ +#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ -#define xPSR_T_Pos 24 /*!< xPSR: T Position */ +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ #define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ -#define xPSR_GE_Pos 16 /*!< xPSR: GE Position */ +#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ #define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ -#define xPSR_ISR_Pos 0 /*!< xPSR: ISR Position */ +#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ +#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ #define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ -/** \brief Union type to access the Control Registers (CONTROL). +/** + \brief Union type to access the Control Registers (CONTROL). */ typedef union { struct { uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ - uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ + uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ } CONTROL_Type; /* CONTROL Register Definitions */ -#define CONTROL_FPCA_Pos 2 /*!< CONTROL: FPCA Position */ +#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ #define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ -#define CONTROL_SPSEL_Pos 1 /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ #define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ -#define CONTROL_nPRIV_Pos 0 /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ #define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ /*@} end of group CMSIS_CORE */ -/** \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers @{ */ -/** \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). */ typedef struct { - __IO uint32_t ISER[8]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[24]; - __IO uint32_t ICER[8]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[24]; - __IO uint32_t ISPR[8]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[24]; - __IO uint32_t ICPR[8]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[24]; - __IO uint32_t IABR[8]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[56]; - __IO uint8_t IP[240]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED5[644]; - __O uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ + __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[24U]; + __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[24U]; + __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[24U]; + __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[24U]; + __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[56U]; + __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED5[644U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ } NVIC_Type; /* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0 /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ #define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ /*@} end of group CMSIS_NVIC */ -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers @{ */ -/** \brief Structure type to access the System Control Block (SCB). +/** + \brief Structure type to access the System Control Block (SCB). */ typedef struct { - __I uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IO uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IO uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IO uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IO uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IO uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - __IO uint8_t SHPR[12]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IO uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IO uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IO uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IO uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IO uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IO uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IO uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __I uint32_t ID_PFR[2]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __I uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __I uint32_t ID_AFR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __I uint32_t ID_MFR[4]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __I uint32_t ID_ISAR[5]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - uint32_t RESERVED0[1]; - __I uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ - __I uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ - __I uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ - __IO uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ - __IO uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ - uint32_t RESERVED3[93]; - __O uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ - uint32_t RESERVED4[15]; - __I uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ - __I uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ - __I uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 1 */ - uint32_t RESERVED5[1]; - __O uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ - uint32_t RESERVED6[1]; - __O uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ - __O uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ - __O uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ - __O uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ - __O uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ - __O uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ - __O uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ - __O uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ - uint32_t RESERVED7[6]; - __IO uint32_t ITCMCR; /*!< Offset: 0x290 (R/W) Instruction Tightly-Coupled Memory Control Register */ - __IO uint32_t DTCMCR; /*!< Offset: 0x294 (R/W) Data Tightly-Coupled Memory Control Registers */ - __IO uint32_t AHBPCR; /*!< Offset: 0x298 (R/W) AHBP Control Register */ - __IO uint32_t CACR; /*!< Offset: 0x29C (R/W) L1 Cache Control Register */ - __IO uint32_t AHBSCR; /*!< Offset: 0x2A0 (R/W) AHB Slave Control Register */ - uint32_t RESERVED8[1]; - __IO uint32_t ABFSR; /*!< Offset: 0x2A8 (R/W) Auxiliary Bus Fault Status Register */ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ID_AFR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t ID_MFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ID_ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + uint32_t RESERVED0[1U]; + __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ + __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ + __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ + __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ + uint32_t RESERVED3[93U]; + __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ + uint32_t RESERVED4[15U]; + __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ + uint32_t RESERVED5[1U]; + __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ + uint32_t RESERVED6[1U]; + __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ + __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ + __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ + __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ + __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ + __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ + __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ + __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ + uint32_t RESERVED7[6U]; + __IOM uint32_t ITCMCR; /*!< Offset: 0x290 (R/W) Instruction Tightly-Coupled Memory Control Register */ + __IOM uint32_t DTCMCR; /*!< Offset: 0x294 (R/W) Data Tightly-Coupled Memory Control Registers */ + __IOM uint32_t AHBPCR; /*!< Offset: 0x298 (R/W) AHBP Control Register */ + __IOM uint32_t CACR; /*!< Offset: 0x29C (R/W) L1 Cache Control Register */ + __IOM uint32_t AHBSCR; /*!< Offset: 0x2A0 (R/W) AHB Slave Control Register */ + uint32_t RESERVED8[1U]; + __IOM uint32_t ABFSR; /*!< Offset: 0x2A8 (R/W) Auxiliary Bus Fault Status Register */ } SCB_Type; /* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24 /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ #define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ -#define SCB_CPUID_VARIANT_Pos 20 /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ #define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ -#define SCB_CPUID_ARCHITECTURE_Pos 16 /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ #define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ -#define SCB_CPUID_PARTNO_Pos 4 /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ #define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ -#define SCB_CPUID_REVISION_Pos 0 /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ #define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ /* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31 /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ #define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ -#define SCB_ICSR_PENDSVSET_Pos 28 /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ #define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ -#define SCB_ICSR_PENDSVCLR_Pos 27 /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ #define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ -#define SCB_ICSR_PENDSTSET_Pos 26 /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ #define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ -#define SCB_ICSR_PENDSTCLR_Pos 25 /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ #define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ -#define SCB_ICSR_ISRPREEMPT_Pos 23 /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ #define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ -#define SCB_ICSR_ISRPENDING_Pos 22 /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ #define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ -#define SCB_ICSR_VECTPENDING_Pos 12 /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ #define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ -#define SCB_ICSR_RETTOBASE_Pos 11 /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ #define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ -#define SCB_ICSR_VECTACTIVE_Pos 0 /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ #define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ /* SCB Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLOFF_Pos 7 /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ #define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ /* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16 /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ #define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ -#define SCB_AIRCR_VECTKEYSTAT_Pos 16 /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ #define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ -#define SCB_AIRCR_ENDIANESS_Pos 15 /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ #define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ -#define SCB_AIRCR_PRIGROUP_Pos 8 /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ #define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ -#define SCB_AIRCR_SYSRESETREQ_Pos 2 /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ #define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1 /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ #define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ -#define SCB_AIRCR_VECTRESET_Pos 0 /*!< SCB AIRCR: VECTRESET Position */ +#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ #define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */ /* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4 /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ #define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ -#define SCB_SCR_SLEEPDEEP_Pos 2 /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ #define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ -#define SCB_SCR_SLEEPONEXIT_Pos 1 /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ #define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ /* SCB Configuration Control Register Definitions */ -#define SCB_CCR_BP_Pos 18 /*!< SCB CCR: Branch prediction enable bit Position */ +#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: Branch prediction enable bit Position */ #define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: Branch prediction enable bit Mask */ -#define SCB_CCR_IC_Pos 17 /*!< SCB CCR: Instruction cache enable bit Position */ +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: Instruction cache enable bit Position */ #define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: Instruction cache enable bit Mask */ -#define SCB_CCR_DC_Pos 16 /*!< SCB CCR: Cache enable bit Position */ +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: Cache enable bit Position */ #define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: Cache enable bit Mask */ -#define SCB_CCR_STKALIGN_Pos 9 /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ #define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ -#define SCB_CCR_BFHFNMIGN_Pos 8 /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ #define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ -#define SCB_CCR_DIV_0_TRP_Pos 4 /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ #define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ -#define SCB_CCR_UNALIGN_TRP_Pos 3 /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ #define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ -#define SCB_CCR_USERSETMPEND_Pos 1 /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ #define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ -#define SCB_CCR_NONBASETHRDENA_Pos 0 /*!< SCB CCR: NONBASETHRDENA Position */ +#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ #define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ /* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_USGFAULTENA_Pos 18 /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ #define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ -#define SCB_SHCSR_BUSFAULTENA_Pos 17 /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ #define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ -#define SCB_SHCSR_MEMFAULTENA_Pos 16 /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ #define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ -#define SCB_SHCSR_SVCALLPENDED_Pos 15 /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ #define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14 /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ #define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13 /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ #define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ -#define SCB_SHCSR_USGFAULTPENDED_Pos 12 /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ #define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ -#define SCB_SHCSR_SYSTICKACT_Pos 11 /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ #define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ -#define SCB_SHCSR_PENDSVACT_Pos 10 /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ #define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ -#define SCB_SHCSR_MONITORACT_Pos 8 /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ #define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ -#define SCB_SHCSR_SVCALLACT_Pos 7 /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ #define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ -#define SCB_SHCSR_USGFAULTACT_Pos 3 /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ #define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ -#define SCB_SHCSR_BUSFAULTACT_Pos 1 /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ #define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ -#define SCB_SHCSR_MEMFAULTACT_Pos 0 /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ #define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ -/* SCB Configurable Fault Status Registers Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16 /*!< SCB CFSR: Usage Fault Status Register Position */ +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ #define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ -#define SCB_CFSR_BUSFAULTSR_Pos 8 /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ #define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ -#define SCB_CFSR_MEMFAULTSR_Pos 0 /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ #define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ -/* SCB Hard Fault Status Registers Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31 /*!< SCB HFSR: DEBUGEVT Position */ +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MLSPERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ +#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ +#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ #define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ -#define SCB_HFSR_FORCED_Pos 30 /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ #define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ -#define SCB_HFSR_VECTTBL_Pos 1 /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ #define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ /* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4 /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ #define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ -#define SCB_DFSR_VCATCH_Pos 3 /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ #define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ -#define SCB_DFSR_DWTTRAP_Pos 2 /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ #define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ -#define SCB_DFSR_BKPT_Pos 1 /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ #define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ -#define SCB_DFSR_HALTED_Pos 0 /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ #define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ -/* Cache Level ID register */ -#define SCB_CLIDR_LOUU_Pos 27 /*!< SCB CLIDR: LoUU Position */ +/* SCB Cache Level ID Register Definitions */ +#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ #define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ -#define SCB_CLIDR_LOC_Pos 24 /*!< SCB CLIDR: LoC Position */ -#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_FORMAT_Pos) /*!< SCB CLIDR: LoC Mask */ +#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ +#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ -/* Cache Type register */ -#define SCB_CTR_FORMAT_Pos 29 /*!< SCB CTR: Format Position */ +/* SCB Cache Type Register Definitions */ +#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ #define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ -#define SCB_CTR_CWG_Pos 24 /*!< SCB CTR: CWG Position */ +#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ #define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ -#define SCB_CTR_ERG_Pos 20 /*!< SCB CTR: ERG Position */ +#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ #define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ -#define SCB_CTR_DMINLINE_Pos 16 /*!< SCB CTR: DminLine Position */ +#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ #define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ -#define SCB_CTR_IMINLINE_Pos 0 /*!< SCB CTR: ImInLine Position */ +#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ #define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ -/* Cache Size ID Register */ -#define SCB_CCSIDR_WT_Pos 31 /*!< SCB CCSIDR: WT Position */ -#define SCB_CCSIDR_WT_Msk (7UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ +/* SCB Cache Size ID Register Definitions */ +#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ +#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ -#define SCB_CCSIDR_WB_Pos 30 /*!< SCB CCSIDR: WB Position */ -#define SCB_CCSIDR_WB_Msk (7UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ +#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ +#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ -#define SCB_CCSIDR_RA_Pos 29 /*!< SCB CCSIDR: RA Position */ -#define SCB_CCSIDR_RA_Msk (7UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ +#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ +#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ -#define SCB_CCSIDR_WA_Pos 28 /*!< SCB CCSIDR: WA Position */ -#define SCB_CCSIDR_WA_Msk (7UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ +#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ +#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ -#define SCB_CCSIDR_NUMSETS_Pos 13 /*!< SCB CCSIDR: NumSets Position */ +#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ #define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ -#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3 /*!< SCB CCSIDR: Associativity Position */ +#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ #define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ -#define SCB_CCSIDR_LINESIZE_Pos 0 /*!< SCB CCSIDR: LineSize Position */ +#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ #define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ -/* Cache Size Selection Register */ -#define SCB_CSSELR_LEVEL_Pos 1 /*!< SCB CSSELR: Level Position */ +/* SCB Cache Size Selection Register Definitions */ +#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ #define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ -#define SCB_CSSELR_IND_Pos 0 /*!< SCB CSSELR: InD Position */ +#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ #define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ -/* SCB Software Triggered Interrupt Register */ -#define SCB_STIR_INTID_Pos 0 /*!< SCB STIR: INTID Position */ +/* SCB Software Triggered Interrupt Register Definitions */ +#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ #define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ -/* Instruction Tightly-Coupled Memory Control Register*/ -#define SCB_ITCMCR_SZ_Pos 3 /*!< SCB ITCMCR: SZ Position */ +/* SCB D-Cache Invalidate by Set-way Register Definitions */ +#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ +#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ + +#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ +#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ + +/* SCB D-Cache Clean by Set-way Register Definitions */ +#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ +#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ + +#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ +#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ + +/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ +#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ +#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ + +#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ +#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ + +/* Instruction Tightly-Coupled Memory Control Register Definitions */ +#define SCB_ITCMCR_SZ_Pos 3U /*!< SCB ITCMCR: SZ Position */ #define SCB_ITCMCR_SZ_Msk (0xFUL << SCB_ITCMCR_SZ_Pos) /*!< SCB ITCMCR: SZ Mask */ -#define SCB_ITCMCR_RETEN_Pos 2 /*!< SCB ITCMCR: RETEN Position */ +#define SCB_ITCMCR_RETEN_Pos 2U /*!< SCB ITCMCR: RETEN Position */ #define SCB_ITCMCR_RETEN_Msk (1UL << SCB_ITCMCR_RETEN_Pos) /*!< SCB ITCMCR: RETEN Mask */ -#define SCB_ITCMCR_RMW_Pos 1 /*!< SCB ITCMCR: RMW Position */ +#define SCB_ITCMCR_RMW_Pos 1U /*!< SCB ITCMCR: RMW Position */ #define SCB_ITCMCR_RMW_Msk (1UL << SCB_ITCMCR_RMW_Pos) /*!< SCB ITCMCR: RMW Mask */ -#define SCB_ITCMCR_EN_Pos 0 /*!< SCB ITCMCR: EN Position */ +#define SCB_ITCMCR_EN_Pos 0U /*!< SCB ITCMCR: EN Position */ #define SCB_ITCMCR_EN_Msk (1UL /*<< SCB_ITCMCR_EN_Pos*/) /*!< SCB ITCMCR: EN Mask */ -/* Data Tightly-Coupled Memory Control Registers */ -#define SCB_DTCMCR_SZ_Pos 3 /*!< SCB DTCMCR: SZ Position */ +/* Data Tightly-Coupled Memory Control Register Definitions */ +#define SCB_DTCMCR_SZ_Pos 3U /*!< SCB DTCMCR: SZ Position */ #define SCB_DTCMCR_SZ_Msk (0xFUL << SCB_DTCMCR_SZ_Pos) /*!< SCB DTCMCR: SZ Mask */ -#define SCB_DTCMCR_RETEN_Pos 2 /*!< SCB DTCMCR: RETEN Position */ +#define SCB_DTCMCR_RETEN_Pos 2U /*!< SCB DTCMCR: RETEN Position */ #define SCB_DTCMCR_RETEN_Msk (1UL << SCB_DTCMCR_RETEN_Pos) /*!< SCB DTCMCR: RETEN Mask */ -#define SCB_DTCMCR_RMW_Pos 1 /*!< SCB DTCMCR: RMW Position */ +#define SCB_DTCMCR_RMW_Pos 1U /*!< SCB DTCMCR: RMW Position */ #define SCB_DTCMCR_RMW_Msk (1UL << SCB_DTCMCR_RMW_Pos) /*!< SCB DTCMCR: RMW Mask */ -#define SCB_DTCMCR_EN_Pos 0 /*!< SCB DTCMCR: EN Position */ +#define SCB_DTCMCR_EN_Pos 0U /*!< SCB DTCMCR: EN Position */ #define SCB_DTCMCR_EN_Msk (1UL /*<< SCB_DTCMCR_EN_Pos*/) /*!< SCB DTCMCR: EN Mask */ -/* AHBP Control Register */ -#define SCB_AHBPCR_SZ_Pos 1 /*!< SCB AHBPCR: SZ Position */ +/* AHBP Control Register Definitions */ +#define SCB_AHBPCR_SZ_Pos 1U /*!< SCB AHBPCR: SZ Position */ #define SCB_AHBPCR_SZ_Msk (7UL << SCB_AHBPCR_SZ_Pos) /*!< SCB AHBPCR: SZ Mask */ -#define SCB_AHBPCR_EN_Pos 0 /*!< SCB AHBPCR: EN Position */ +#define SCB_AHBPCR_EN_Pos 0U /*!< SCB AHBPCR: EN Position */ #define SCB_AHBPCR_EN_Msk (1UL /*<< SCB_AHBPCR_EN_Pos*/) /*!< SCB AHBPCR: EN Mask */ -/* L1 Cache Control Register */ -#define SCB_CACR_FORCEWT_Pos 2 /*!< SCB CACR: FORCEWT Position */ +/* L1 Cache Control Register Definitions */ +#define SCB_CACR_FORCEWT_Pos 2U /*!< SCB CACR: FORCEWT Position */ #define SCB_CACR_FORCEWT_Msk (1UL << SCB_CACR_FORCEWT_Pos) /*!< SCB CACR: FORCEWT Mask */ -#define SCB_CACR_ECCEN_Pos 1 /*!< SCB CACR: ECCEN Position */ +#define SCB_CACR_ECCEN_Pos 1U /*!< SCB CACR: ECCEN Position */ #define SCB_CACR_ECCEN_Msk (1UL << SCB_CACR_ECCEN_Pos) /*!< SCB CACR: ECCEN Mask */ -#define SCB_CACR_SIWT_Pos 0 /*!< SCB CACR: SIWT Position */ +#define SCB_CACR_SIWT_Pos 0U /*!< SCB CACR: SIWT Position */ #define SCB_CACR_SIWT_Msk (1UL /*<< SCB_CACR_SIWT_Pos*/) /*!< SCB CACR: SIWT Mask */ -/* AHBS control register */ -#define SCB_AHBSCR_INITCOUNT_Pos 11 /*!< SCB AHBSCR: INITCOUNT Position */ +/* AHBS Control Register Definitions */ +#define SCB_AHBSCR_INITCOUNT_Pos 11U /*!< SCB AHBSCR: INITCOUNT Position */ #define SCB_AHBSCR_INITCOUNT_Msk (0x1FUL << SCB_AHBPCR_INITCOUNT_Pos) /*!< SCB AHBSCR: INITCOUNT Mask */ -#define SCB_AHBSCR_TPRI_Pos 2 /*!< SCB AHBSCR: TPRI Position */ +#define SCB_AHBSCR_TPRI_Pos 2U /*!< SCB AHBSCR: TPRI Position */ #define SCB_AHBSCR_TPRI_Msk (0x1FFUL << SCB_AHBPCR_TPRI_Pos) /*!< SCB AHBSCR: TPRI Mask */ -#define SCB_AHBSCR_CTL_Pos 0 /*!< SCB AHBSCR: CTL Position*/ +#define SCB_AHBSCR_CTL_Pos 0U /*!< SCB AHBSCR: CTL Position*/ #define SCB_AHBSCR_CTL_Msk (3UL /*<< SCB_AHBPCR_CTL_Pos*/) /*!< SCB AHBSCR: CTL Mask */ -/* Auxiliary Bus Fault Status Register */ -#define SCB_ABFSR_AXIMTYPE_Pos 8 /*!< SCB ABFSR: AXIMTYPE Position*/ +/* Auxiliary Bus Fault Status Register Definitions */ +#define SCB_ABFSR_AXIMTYPE_Pos 8U /*!< SCB ABFSR: AXIMTYPE Position*/ #define SCB_ABFSR_AXIMTYPE_Msk (3UL << SCB_ABFSR_AXIMTYPE_Pos) /*!< SCB ABFSR: AXIMTYPE Mask */ -#define SCB_ABFSR_EPPB_Pos 4 /*!< SCB ABFSR: EPPB Position*/ +#define SCB_ABFSR_EPPB_Pos 4U /*!< SCB ABFSR: EPPB Position*/ #define SCB_ABFSR_EPPB_Msk (1UL << SCB_ABFSR_EPPB_Pos) /*!< SCB ABFSR: EPPB Mask */ -#define SCB_ABFSR_AXIM_Pos 3 /*!< SCB ABFSR: AXIM Position*/ +#define SCB_ABFSR_AXIM_Pos 3U /*!< SCB ABFSR: AXIM Position*/ #define SCB_ABFSR_AXIM_Msk (1UL << SCB_ABFSR_AXIM_Pos) /*!< SCB ABFSR: AXIM Mask */ -#define SCB_ABFSR_AHBP_Pos 2 /*!< SCB ABFSR: AHBP Position*/ +#define SCB_ABFSR_AHBP_Pos 2U /*!< SCB ABFSR: AHBP Position*/ #define SCB_ABFSR_AHBP_Msk (1UL << SCB_ABFSR_AHBP_Pos) /*!< SCB ABFSR: AHBP Mask */ -#define SCB_ABFSR_DTCM_Pos 1 /*!< SCB ABFSR: DTCM Position*/ +#define SCB_ABFSR_DTCM_Pos 1U /*!< SCB ABFSR: DTCM Position*/ #define SCB_ABFSR_DTCM_Msk (1UL << SCB_ABFSR_DTCM_Pos) /*!< SCB ABFSR: DTCM Mask */ -#define SCB_ABFSR_ITCM_Pos 0 /*!< SCB ABFSR: ITCM Position*/ +#define SCB_ABFSR_ITCM_Pos 0U /*!< SCB ABFSR: ITCM Position*/ #define SCB_ABFSR_ITCM_Msk (1UL /*<< SCB_ABFSR_ITCM_Pos*/) /*!< SCB ABFSR: ITCM Mask */ /*@} end of group CMSIS_SCB */ -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) - \brief Type definitions for the System Control and ID Register not in the SCB +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB @{ */ -/** \brief Structure type to access the System Control and ID Register not in the SCB. +/** + \brief Structure type to access the System Control and ID Register not in the SCB. */ typedef struct { - uint32_t RESERVED0[1]; - __I uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ - __IO uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ } SCnSCB_Type; /* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0 /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ #define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ /* Auxiliary Control Register Definitions */ -#define SCnSCB_ACTLR_DISITMATBFLUSH_Pos 12 /*!< ACTLR: DISITMATBFLUSH Position */ +#define SCnSCB_ACTLR_DISITMATBFLUSH_Pos 12U /*!< ACTLR: DISITMATBFLUSH Position */ #define SCnSCB_ACTLR_DISITMATBFLUSH_Msk (1UL << SCnSCB_ACTLR_DISITMATBFLUSH_Pos) /*!< ACTLR: DISITMATBFLUSH Mask */ -#define SCnSCB_ACTLR_DISRAMODE_Pos 11 /*!< ACTLR: DISRAMODE Position */ +#define SCnSCB_ACTLR_DISRAMODE_Pos 11U /*!< ACTLR: DISRAMODE Position */ #define SCnSCB_ACTLR_DISRAMODE_Msk (1UL << SCnSCB_ACTLR_DISRAMODE_Pos) /*!< ACTLR: DISRAMODE Mask */ -#define SCnSCB_ACTLR_FPEXCODIS_Pos 10 /*!< ACTLR: FPEXCODIS Position */ +#define SCnSCB_ACTLR_FPEXCODIS_Pos 10U /*!< ACTLR: FPEXCODIS Position */ #define SCnSCB_ACTLR_FPEXCODIS_Msk (1UL << SCnSCB_ACTLR_FPEXCODIS_Pos) /*!< ACTLR: FPEXCODIS Mask */ -#define SCnSCB_ACTLR_DISFOLD_Pos 2 /*!< ACTLR: DISFOLD Position */ +#define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ #define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ -#define SCnSCB_ACTLR_DISMCYCINT_Pos 0 /*!< ACTLR: DISMCYCINT Position */ +#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ #define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ /*@} end of group CMSIS_SCnotSCB */ -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. @{ */ -/** \brief Structure type to access the System Timer (SysTick). +/** + \brief Structure type to access the System Timer (SysTick). */ typedef struct { - __IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IO uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IO uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __I uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ } SysTick_Type; /* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16 /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ #define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ -#define SysTick_CTRL_CLKSOURCE_Pos 2 /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ #define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ -#define SysTick_CTRL_TICKINT_Pos 1 /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ #define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ -#define SysTick_CTRL_ENABLE_Pos 0 /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ #define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ /* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0 /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ #define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ /* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0 /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ #define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ /* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31 /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ #define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ -#define SysTick_CALIB_SKEW_Pos 30 /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ #define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ -#define SysTick_CALIB_TENMS_Pos 0 /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ #define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ /*@} end of group CMSIS_SysTick */ -/** \ingroup CMSIS_core_register - \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) @{ */ -/** \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). */ typedef struct { - __O union + __OM union { - __O uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __O uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __O uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864]; - __IO uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15]; - __IO uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15]; - __IO uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[29]; - __O uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ - __I uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ - __IO uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ - uint32_t RESERVED4[43]; - __O uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __I uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[6]; - __I uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __I uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __I uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __I uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __I uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __I uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __I uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __I uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __I uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __I uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __I uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __I uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[29U]; + __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ + __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ + __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[6U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ } ITM_Type; /* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0 /*!< ITM TPR: PRIVMASK Position */ -#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ /* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23 /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ #define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ -#define ITM_TCR_TraceBusID_Pos 16 /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ #define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ -#define ITM_TCR_GTSFREQ_Pos 10 /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ #define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ -#define ITM_TCR_TSPrescale_Pos 8 /*!< ITM TCR: TSPrescale Position */ +#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ #define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ -#define ITM_TCR_SWOENA_Pos 4 /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ #define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ -#define ITM_TCR_DWTENA_Pos 3 /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ #define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ -#define ITM_TCR_SYNCENA_Pos 2 /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ #define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ -#define ITM_TCR_TSENA_Pos 1 /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ #define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ -#define ITM_TCR_ITMENA_Pos 0 /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ #define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ /* ITM Integration Write Register Definitions */ -#define ITM_IWR_ATVALIDM_Pos 0 /*!< ITM IWR: ATVALIDM Position */ +#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ #define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ /* ITM Integration Read Register Definitions */ -#define ITM_IRR_ATREADYM_Pos 0 /*!< ITM IRR: ATREADYM Position */ +#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ #define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ /* ITM Integration Mode Control Register Definitions */ -#define ITM_IMCR_INTEGRATION_Pos 0 /*!< ITM IMCR: INTEGRATION Position */ +#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ #define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION Mask */ /* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2 /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ #define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ -#define ITM_LSR_Access_Pos 1 /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ #define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ -#define ITM_LSR_Present_Pos 0 /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ #define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ /*@}*/ /* end of group CMSIS_ITM */ -/** \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) @{ */ -/** \brief Structure type to access the Data Watchpoint and Trace Register (DWT). +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). */ typedef struct { - __IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IO uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IO uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IO uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IO uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IO uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IO uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __I uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IO uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - __IO uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ - __IO uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED0[1]; - __IO uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - __IO uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ - __IO uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED1[1]; - __IO uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - __IO uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ - __IO uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED2[1]; - __IO uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - __IO uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ - __IO uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ - uint32_t RESERVED3[981]; - __O uint32_t LAR; /*!< Offset: 0xFB0 ( W) Lock Access Register */ - __I uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED0[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED3[981U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( W) Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ } DWT_Type; /* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28 /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ #define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ -#define DWT_CTRL_NOTRCPKT_Pos 27 /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ #define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ -#define DWT_CTRL_NOEXTTRIG_Pos 26 /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ #define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ -#define DWT_CTRL_NOCYCCNT_Pos 25 /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ #define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ -#define DWT_CTRL_NOPRFCNT_Pos 24 /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ #define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ -#define DWT_CTRL_CYCEVTENA_Pos 22 /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ #define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ -#define DWT_CTRL_FOLDEVTENA_Pos 21 /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ #define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ -#define DWT_CTRL_LSUEVTENA_Pos 20 /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ #define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ -#define DWT_CTRL_SLEEPEVTENA_Pos 19 /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ #define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ -#define DWT_CTRL_EXCEVTENA_Pos 18 /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ #define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ -#define DWT_CTRL_CPIEVTENA_Pos 17 /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ #define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ -#define DWT_CTRL_EXCTRCENA_Pos 16 /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ #define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ -#define DWT_CTRL_PCSAMPLENA_Pos 12 /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ #define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ -#define DWT_CTRL_SYNCTAP_Pos 10 /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ #define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ -#define DWT_CTRL_CYCTAP_Pos 9 /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ #define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ -#define DWT_CTRL_POSTINIT_Pos 5 /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ #define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ -#define DWT_CTRL_POSTPRESET_Pos 1 /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ #define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ -#define DWT_CTRL_CYCCNTENA_Pos 0 /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ #define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ /* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0 /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ #define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ /* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0 /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ #define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ /* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0 /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ #define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ /* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0 /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ #define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ /* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0 /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ #define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ /* DWT Comparator Mask Register Definitions */ -#define DWT_MASK_MASK_Pos 0 /*!< DWT MASK: MASK Position */ +#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ #define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ /* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_MATCHED_Pos 24 /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ #define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ -#define DWT_FUNCTION_DATAVADDR1_Pos 16 /*!< DWT FUNCTION: DATAVADDR1 Position */ +#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ #define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ -#define DWT_FUNCTION_DATAVADDR0_Pos 12 /*!< DWT FUNCTION: DATAVADDR0 Position */ +#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ #define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ -#define DWT_FUNCTION_DATAVSIZE_Pos 10 /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ #define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ -#define DWT_FUNCTION_LNK1ENA_Pos 9 /*!< DWT FUNCTION: LNK1ENA Position */ +#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ #define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ -#define DWT_FUNCTION_DATAVMATCH_Pos 8 /*!< DWT FUNCTION: DATAVMATCH Position */ +#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ #define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ -#define DWT_FUNCTION_CYCMATCH_Pos 7 /*!< DWT FUNCTION: CYCMATCH Position */ +#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ #define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ -#define DWT_FUNCTION_EMITRANGE_Pos 5 /*!< DWT FUNCTION: EMITRANGE Position */ +#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ #define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ -#define DWT_FUNCTION_FUNCTION_Pos 0 /*!< DWT FUNCTION: FUNCTION Position */ +#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ #define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ /*@}*/ /* end of group CMSIS_DWT */ -/** \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) @{ */ -/** \brief Structure type to access the Trace Port Interface Register (TPI). +/** + \brief Structure type to access the Trace Port Interface Register (TPI). */ typedef struct { - __IO uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ - __IO uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ - uint32_t RESERVED0[2]; - __IO uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55]; - __IO uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131]; - __I uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IO uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __I uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ - uint32_t RESERVED3[759]; - __I uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER */ - __I uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ - __I uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ - uint32_t RESERVED4[1]; - __I uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ - __I uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ - __IO uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ - uint32_t RESERVED5[39]; - __IO uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ - __IO uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ - uint32_t RESERVED7[8]; - __I uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ - __I uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ + __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ + __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ + __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ } TPI_Type; /* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_PRESCALER_Pos 0 /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ #define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ /* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0 /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ #define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ /* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3 /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ #define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ -#define TPI_FFSR_TCPresent_Pos 2 /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ #define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ -#define TPI_FFSR_FtStopped_Pos 1 /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ #define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ -#define TPI_FFSR_FlInProg_Pos 0 /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ #define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ /* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8 /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ #define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ -#define TPI_FFCR_EnFCont_Pos 1 /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ #define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ /* TPI TRIGGER Register Definitions */ -#define TPI_TRIGGER_TRIGGER_Pos 0 /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ #define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ /* TPI Integration ETM Data Register Definitions (FIFO0) */ -#define TPI_FIFO0_ITM_ATVALID_Pos 29 /*!< TPI FIFO0: ITM_ATVALID Position */ +#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ #define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ -#define TPI_FIFO0_ITM_bytecount_Pos 27 /*!< TPI FIFO0: ITM_bytecount Position */ +#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ #define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ -#define TPI_FIFO0_ETM_ATVALID_Pos 26 /*!< TPI FIFO0: ETM_ATVALID Position */ +#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ #define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ -#define TPI_FIFO0_ETM_bytecount_Pos 24 /*!< TPI FIFO0: ETM_bytecount Position */ +#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ #define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ -#define TPI_FIFO0_ETM2_Pos 16 /*!< TPI FIFO0: ETM2 Position */ +#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ #define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ -#define TPI_FIFO0_ETM1_Pos 8 /*!< TPI FIFO0: ETM1 Position */ +#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ #define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ -#define TPI_FIFO0_ETM0_Pos 0 /*!< TPI FIFO0: ETM0 Position */ +#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ #define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ /* TPI ITATBCTR2 Register Definitions */ -#define TPI_ITATBCTR2_ATREADY_Pos 0 /*!< TPI ITATBCTR2: ATREADY Position */ -#define TPI_ITATBCTR2_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY_Pos*/) /*!< TPI ITATBCTR2: ATREADY Mask */ +#define TPI_ITATBCTR2_ATREADY2_Pos 0U /*!< TPI ITATBCTR2: ATREADY2 Position */ +#define TPI_ITATBCTR2_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2_Pos*/) /*!< TPI ITATBCTR2: ATREADY2 Mask */ + +#define TPI_ITATBCTR2_ATREADY1_Pos 0U /*!< TPI ITATBCTR2: ATREADY1 Position */ +#define TPI_ITATBCTR2_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1_Pos*/) /*!< TPI ITATBCTR2: ATREADY1 Mask */ /* TPI Integration ITM Data Register Definitions (FIFO1) */ -#define TPI_FIFO1_ITM_ATVALID_Pos 29 /*!< TPI FIFO1: ITM_ATVALID Position */ +#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ #define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ -#define TPI_FIFO1_ITM_bytecount_Pos 27 /*!< TPI FIFO1: ITM_bytecount Position */ +#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ #define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ -#define TPI_FIFO1_ETM_ATVALID_Pos 26 /*!< TPI FIFO1: ETM_ATVALID Position */ +#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ #define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ -#define TPI_FIFO1_ETM_bytecount_Pos 24 /*!< TPI FIFO1: ETM_bytecount Position */ +#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ #define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ -#define TPI_FIFO1_ITM2_Pos 16 /*!< TPI FIFO1: ITM2 Position */ +#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ #define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ -#define TPI_FIFO1_ITM1_Pos 8 /*!< TPI FIFO1: ITM1 Position */ +#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ #define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ -#define TPI_FIFO1_ITM0_Pos 0 /*!< TPI FIFO1: ITM0 Position */ +#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ #define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ /* TPI ITATBCTR0 Register Definitions */ -#define TPI_ITATBCTR0_ATREADY_Pos 0 /*!< TPI ITATBCTR0: ATREADY Position */ -#define TPI_ITATBCTR0_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY_Pos*/) /*!< TPI ITATBCTR0: ATREADY Mask */ +#define TPI_ITATBCTR0_ATREADY2_Pos 0U /*!< TPI ITATBCTR0: ATREADY2 Position */ +#define TPI_ITATBCTR0_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2_Pos*/) /*!< TPI ITATBCTR0: ATREADY2 Mask */ + +#define TPI_ITATBCTR0_ATREADY1_Pos 0U /*!< TPI ITATBCTR0: ATREADY1 Position */ +#define TPI_ITATBCTR0_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1_Pos*/) /*!< TPI ITATBCTR0: ATREADY1 Mask */ /* TPI Integration Mode Control Register Definitions */ -#define TPI_ITCTRL_Mode_Pos 0 /*!< TPI ITCTRL: Mode Position */ -#define TPI_ITCTRL_Mode_Msk (0x1UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ /* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11 /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ #define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ -#define TPI_DEVID_MANCVALID_Pos 10 /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ #define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ -#define TPI_DEVID_PTINVALID_Pos 9 /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ #define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ -#define TPI_DEVID_MinBufSz_Pos 6 /*!< TPI DEVID: MinBufSz Position */ +#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ #define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ -#define TPI_DEVID_AsynClkIn_Pos 5 /*!< TPI DEVID: AsynClkIn Position */ +#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ #define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ -#define TPI_DEVID_NrTraceInput_Pos 0 /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ #define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ /* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_MajorType_Pos 4 /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -#define TPI_DEVTYPE_SubType_Pos 0 /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ #define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + /*@}*/ /* end of group CMSIS_TPI */ -#if (__MPU_PRESENT == 1) -/** \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) @{ */ -/** \brief Structure type to access the Memory Protection Unit (MPU). +/** + \brief Structure type to access the Memory Protection Unit (MPU). */ typedef struct { - __I uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IO uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IO uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IO uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IO uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ - __IO uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ - __IO uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ - __IO uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ - __IO uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ - __IO uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ - __IO uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ + __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ + __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ + __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ } MPU_Type; -/* MPU Type Register */ -#define MPU_TYPE_IREGION_Pos 16 /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_RALIASES 4U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ #define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ -#define MPU_TYPE_DREGION_Pos 8 /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ #define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ -#define MPU_TYPE_SEPARATE_Pos 0 /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ #define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ -/* MPU Control Register */ -#define MPU_CTRL_PRIVDEFENA_Pos 2 /*!< MPU CTRL: PRIVDEFENA Position */ +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ #define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ -#define MPU_CTRL_HFNMIENA_Pos 1 /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ #define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ -#define MPU_CTRL_ENABLE_Pos 0 /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ #define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ -/* MPU Region Number Register */ -#define MPU_RNR_REGION_Pos 0 /*!< MPU RNR: REGION Position */ +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ #define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ -/* MPU Region Base Address Register */ -#define MPU_RBAR_ADDR_Pos 5 /*!< MPU RBAR: ADDR Position */ +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ #define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ -#define MPU_RBAR_VALID_Pos 4 /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ #define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ -#define MPU_RBAR_REGION_Pos 0 /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ #define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ -/* MPU Region Attribute and Size Register */ -#define MPU_RASR_ATTRS_Pos 16 /*!< MPU RASR: MPU Region Attribute field Position */ +/* MPU Region Attribute and Size Register Definitions */ +#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ #define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ -#define MPU_RASR_XN_Pos 28 /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ #define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ -#define MPU_RASR_AP_Pos 24 /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ #define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ -#define MPU_RASR_TEX_Pos 19 /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ #define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ -#define MPU_RASR_S_Pos 18 /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ #define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ -#define MPU_RASR_C_Pos 17 /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ #define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ -#define MPU_RASR_B_Pos 16 /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ #define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ -#define MPU_RASR_SRD_Pos 8 /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ #define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ -#define MPU_RASR_SIZE_Pos 1 /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ #define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ -#define MPU_RASR_ENABLE_Pos 0 /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ #define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ /*@} end of group CMSIS_MPU */ -#endif +#endif /* defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) */ -#if (__FPU_PRESENT == 1) -/** \ingroup CMSIS_core_register - \defgroup CMSIS_FPU Floating Point Unit (FPU) - \brief Type definitions for the Floating Point Unit (FPU) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_FPU Floating Point Unit (FPU) + \brief Type definitions for the Floating Point Unit (FPU) @{ */ -/** \brief Structure type to access the Floating Point Unit (FPU). +/** + \brief Structure type to access the Floating Point Unit (FPU). */ typedef struct { - uint32_t RESERVED0[1]; - __IO uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ - __IO uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ - __IO uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ - __I uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ - __I uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ - __I uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and FP Feature Register 2 */ + uint32_t RESERVED0[1U]; + __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ + __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ + __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ + __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and FP Feature Register 2 */ } FPU_Type; -/* Floating-Point Context Control Register */ -#define FPU_FPCCR_ASPEN_Pos 31 /*!< FPCCR: ASPEN bit Position */ +/* Floating-Point Context Control Register Definitions */ +#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ #define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ -#define FPU_FPCCR_LSPEN_Pos 30 /*!< FPCCR: LSPEN Position */ +#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ #define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ -#define FPU_FPCCR_MONRDY_Pos 8 /*!< FPCCR: MONRDY Position */ +#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ #define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ -#define FPU_FPCCR_BFRDY_Pos 6 /*!< FPCCR: BFRDY Position */ +#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ #define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ -#define FPU_FPCCR_MMRDY_Pos 5 /*!< FPCCR: MMRDY Position */ +#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ #define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ -#define FPU_FPCCR_HFRDY_Pos 4 /*!< FPCCR: HFRDY Position */ +#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ #define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ -#define FPU_FPCCR_THREAD_Pos 3 /*!< FPCCR: processor mode bit Position */ +#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ #define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ -#define FPU_FPCCR_USER_Pos 1 /*!< FPCCR: privilege level bit Position */ +#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ #define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ -#define FPU_FPCCR_LSPACT_Pos 0 /*!< FPCCR: Lazy state preservation active bit Position */ +#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ #define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ -/* Floating-Point Context Address Register */ -#define FPU_FPCAR_ADDRESS_Pos 3 /*!< FPCAR: ADDRESS bit Position */ +/* Floating-Point Context Address Register Definitions */ +#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ #define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ -/* Floating-Point Default Status Control Register */ -#define FPU_FPDSCR_AHP_Pos 26 /*!< FPDSCR: AHP bit Position */ +/* Floating-Point Default Status Control Register Definitions */ +#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ #define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ -#define FPU_FPDSCR_DN_Pos 25 /*!< FPDSCR: DN bit Position */ +#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ #define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ -#define FPU_FPDSCR_FZ_Pos 24 /*!< FPDSCR: FZ bit Position */ +#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ #define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ -#define FPU_FPDSCR_RMode_Pos 22 /*!< FPDSCR: RMode bit Position */ +#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ #define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ -/* Media and FP Feature Register 0 */ -#define FPU_MVFR0_FP_rounding_modes_Pos 28 /*!< MVFR0: FP rounding modes bits Position */ +/* Media and FP Feature Register 0 Definitions */ +#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ #define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ -#define FPU_MVFR0_Short_vectors_Pos 24 /*!< MVFR0: Short vectors bits Position */ +#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ #define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ -#define FPU_MVFR0_Square_root_Pos 20 /*!< MVFR0: Square root bits Position */ +#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ #define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ -#define FPU_MVFR0_Divide_Pos 16 /*!< MVFR0: Divide bits Position */ +#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ #define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ -#define FPU_MVFR0_FP_excep_trapping_Pos 12 /*!< MVFR0: FP exception trapping bits Position */ +#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ #define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ -#define FPU_MVFR0_Double_precision_Pos 8 /*!< MVFR0: Double-precision bits Position */ +#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ #define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ -#define FPU_MVFR0_Single_precision_Pos 4 /*!< MVFR0: Single-precision bits Position */ +#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ #define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ -#define FPU_MVFR0_A_SIMD_registers_Pos 0 /*!< MVFR0: A_SIMD registers bits Position */ +#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ #define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ -/* Media and FP Feature Register 1 */ -#define FPU_MVFR1_FP_fused_MAC_Pos 28 /*!< MVFR1: FP fused MAC bits Position */ +/* Media and FP Feature Register 1 Definitions */ +#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ #define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ -#define FPU_MVFR1_FP_HPFP_Pos 24 /*!< MVFR1: FP HPFP bits Position */ +#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ #define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ -#define FPU_MVFR1_D_NaN_mode_Pos 4 /*!< MVFR1: D_NaN mode bits Position */ +#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ #define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ -#define FPU_MVFR1_FtZ_mode_Pos 0 /*!< MVFR1: FtZ mode bits Position */ +#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ #define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ -/* Media and FP Feature Register 2 */ +/* Media and FP Feature Register 2 Definitions */ /*@} end of group CMSIS_FPU */ -#endif -/** \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers @{ */ -/** \brief Structure type to access the Core Debug Register (CoreDebug). +/** + \brief Structure type to access the Core Debug Register (CoreDebug). */ typedef struct { - __IO uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __O uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IO uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IO uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ } CoreDebug_Type; -/* Debug Halting Control and Status Register */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16 /*!< CoreDebug DHCSR: DBGKEY Position */ +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ #define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25 /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ #define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24 /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ #define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19 /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ #define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ -#define CoreDebug_DHCSR_S_SLEEP_Pos 18 /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ #define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ -#define CoreDebug_DHCSR_S_HALT_Pos 17 /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ #define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ -#define CoreDebug_DHCSR_S_REGRDY_Pos 16 /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ #define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5 /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ #define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3 /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ #define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ -#define CoreDebug_DHCSR_C_STEP_Pos 2 /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ #define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ -#define CoreDebug_DHCSR_C_HALT_Pos 1 /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ #define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0 /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ #define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ -/* Debug Core Register Selector Register */ -#define CoreDebug_DCRSR_REGWnR_Pos 16 /*!< CoreDebug DCRSR: REGWnR Position */ +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ #define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ -#define CoreDebug_DCRSR_REGSEL_Pos 0 /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ #define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ -/* Debug Exception and Monitor Control Register */ -#define CoreDebug_DEMCR_TRCENA_Pos 24 /*!< CoreDebug DEMCR: TRCENA Position */ +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ #define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ -#define CoreDebug_DEMCR_MON_REQ_Pos 19 /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ #define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ -#define CoreDebug_DEMCR_MON_STEP_Pos 18 /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ #define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ -#define CoreDebug_DEMCR_MON_PEND_Pos 17 /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ #define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ -#define CoreDebug_DEMCR_MON_EN_Pos 16 /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ #define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10 /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ #define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ -#define CoreDebug_DEMCR_VC_INTERR_Pos 9 /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ #define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8 /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ #define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ -#define CoreDebug_DEMCR_VC_STATERR_Pos 7 /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ #define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6 /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ #define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5 /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ #define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ -#define CoreDebug_DEMCR_VC_MMERR_Pos 4 /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ #define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0 /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ #define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ /*@} end of group CMSIS_CoreDebug */ -/** \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. @{ */ -/* Memory mapping of Cortex-M4 Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ -#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ -#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ -#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ +#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ +#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ +#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ #define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ -#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ -#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ -#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ -#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ - -#if (__MPU_PRESENT == 1) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ +#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ +#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ +#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ +#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ #endif -#if (__FPU_PRESENT == 1) - #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ - #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ -#endif +#define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ +#define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ /*@} */ @@ -1677,187 +1797,276 @@ typedef struct - Core Debug Functions - Core Register Access Functions ******************************************************************************/ -/** \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference */ /* ########################## NVIC functions #################################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ */ -/** \brief Set Priority Grouping +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* The following EXC_RETURN values are saved the LR on exception entry */ +#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ +#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ +#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ +#define EXC_RETURN_HANDLER_FPU (0xFFFFFFE1UL) /* return to Handler mode, uses MSP after return, restore floating-point state */ +#define EXC_RETURN_THREAD_MSP_FPU (0xFFFFFFE9UL) /* return to Thread mode, uses MSP after return, restore floating-point state */ +#define EXC_RETURN_THREAD_PSP_FPU (0xFFFFFFEDUL) /* return to Thread mode, uses PSP after return, restore floating-point state */ - The function sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. */ -__STATIC_INLINE void NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) { uint32_t reg_value; uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ reg_value = (reg_value | ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << 8) ); /* Insert write key and priorty group */ + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ SCB->AIRCR = reg_value; } -/** \brief Get Priority Grouping - - The function reads the priority grouping field from the NVIC Interrupt Controller. - - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). */ -__STATIC_INLINE uint32_t NVIC_GetPriorityGrouping(void) +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) { return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); } -/** \brief Enable External Interrupt - - The function enables a device-specific interrupt in the NVIC interrupt controller. - - \param [in] IRQn External interrupt number. Value cannot be negative. +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. */ -__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) { - NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } } -/** \brief Disable External Interrupt - - The function disables a device-specific interrupt in the NVIC interrupt controller. - - \param [in] IRQn External interrupt number. Value cannot be negative. +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. */ -__STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) { - NVIC->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } } -/** \brief Get Pending Interrupt - - The function reads the pending register in the NVIC and returns the pending bit - for the specified interrupt. - - \param [in] IRQn Interrupt number. - - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. */ -__STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) { - return((uint32_t)(((NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } } -/** \brief Set Pending Interrupt - - The function sets the pending bit of an external interrupt. - - \param [in] IRQn Interrupt number. Value cannot be negative. +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. */ -__STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) { - NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } } -/** \brief Clear Pending Interrupt - - The function clears the pending bit of an external interrupt. - - \param [in] IRQn External interrupt number. Value cannot be negative. +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. */ -__STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) { - NVIC->ICPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } } -/** \brief Get Active Interrupt - - The function reads the active register in NVIC and returns the active bit. - - \param [in] IRQn Interrupt number. - - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. */ -__STATIC_INLINE uint32_t NVIC_GetActive(IRQn_Type IRQn) +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) { - return((uint32_t)(((NVIC->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } } -/** \brief Set Interrupt Priority - - The function sets the priority of an interrupt. - - \note The priority cannot be set for every core interrupt. - - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. */ -__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) { - if((int32_t)IRQn < 0) { - SCB->SHPR[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8 - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); } - else { - NVIC->IP[((uint32_t)(int32_t)IRQn)] = (uint8_t)((priority << (8 - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + else + { + return(0U); } } -/** \brief Get Interrupt Priority - - The function reads the priority of an interrupt. The interrupt - number can be positive to specify an external (device specific) - interrupt, or negative to specify an internal (core) interrupt. +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} - \param [in] IRQn Interrupt number. - \return Interrupt Priority. Value is aligned automatically to the implemented - priority bits of the microcontroller. +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. */ -__STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) { - if((int32_t)IRQn < 0) { - return(((uint32_t)SCB->SHPR[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] >> (8 - __NVIC_PRIO_BITS))); + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IP[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); } - else { - return(((uint32_t)NVIC->IP[((uint32_t)(int32_t)IRQn)] >> (8 - __NVIC_PRIO_BITS))); + else + { + return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); } } -/** \brief Encode Priority - - The function encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). */ __STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) { @@ -1875,19 +2084,18 @@ __STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t P } -/** \brief Decode Priority - - The function decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority) +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) { uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ uint32_t PreemptPriorityBits; @@ -1901,11 +2109,42 @@ __STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGr } -/** \brief System Reset +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} - The function initiates a system reset request to reset the MCU. + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function */ -__STATIC_INLINE void NVIC_SystemReset(void) +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) { __DSB(); /* Ensure all outstanding memory accesses included buffered write are completed before reset */ @@ -1913,22 +2152,34 @@ __STATIC_INLINE void NVIC_SystemReset(void) (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ __DSB(); /* Ensure completion of memory access */ - while(1) { __NOP(); } /* wait until reset */ + + for(;;) /* wait until reset */ + { + __NOP(); + } } /*@} end of CMSIS_Core_NVICFunctions */ +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv7.h" + +#endif /* ########################## FPU functions #################################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_FpuFunctions FPU Functions - \brief Function that provides FPU type. - @{ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ */ /** - \fn uint32_t SCB_GetFPUType(void) - \brief get FPU type + \brief get FPU type + \details returns the FPU type \returns - \b 0: No FPU - \b 1: Single precision FPU @@ -1939,12 +2190,17 @@ __STATIC_INLINE uint32_t SCB_GetFPUType(void) uint32_t mvfr0; mvfr0 = SCB->MVFR0; - if ((mvfr0 & 0x00000FF0UL) == 0x220UL) { - return 2UL; // Double + Single precision FPU - } else if ((mvfr0 & 0x00000FF0UL) == 0x020UL) { - return 1UL; // Single precision FPU - } else { - return 0UL; // No FPU + if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) + { + return 2U; /* Double + Single precision FPU */ + } + else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) + { + return 1U; /* Single precision FPU */ + } + else + { + return 0U; /* No FPU */ } } @@ -1954,59 +2210,61 @@ __STATIC_INLINE uint32_t SCB_GetFPUType(void) /* ########################## Cache functions #################################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_CacheFunctions Cache Functions - \brief Functions that configure Instruction and Data cache. - @{ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_CacheFunctions Cache Functions + \brief Functions that configure Instruction and Data cache. + @{ */ /* Cache Size ID Register Macros */ #define CCSIDR_WAYS(x) (((x) & SCB_CCSIDR_ASSOCIATIVITY_Msk) >> SCB_CCSIDR_ASSOCIATIVITY_Pos) #define CCSIDR_SETS(x) (((x) & SCB_CCSIDR_NUMSETS_Msk ) >> SCB_CCSIDR_NUMSETS_Pos ) -#define CCSIDR_LSSHIFT(x) (((x) & SCB_CCSIDR_LINESIZE_Msk ) /*>> SCB_CCSIDR_LINESIZE_Pos*/ ) - -/** \brief Enable I-Cache - The function turns on I-Cache +/** + \brief Enable I-Cache + \details Turns on I-Cache */ __STATIC_INLINE void SCB_EnableICache (void) { - #if (__ICACHE_PRESENT == 1) + #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) + __DSB(); + __ISB(); + SCB->ICIALLU = 0UL; /* invalidate I-Cache */ __DSB(); __ISB(); - SCB->ICIALLU = 0UL; // invalidate I-Cache - SCB->CCR |= (uint32_t)SCB_CCR_IC_Msk; // enable I-Cache + SCB->CCR |= (uint32_t)SCB_CCR_IC_Msk; /* enable I-Cache */ __DSB(); __ISB(); #endif } -/** \brief Disable I-Cache - - The function turns off I-Cache +/** + \brief Disable I-Cache + \details Turns off I-Cache */ __STATIC_INLINE void SCB_DisableICache (void) { - #if (__ICACHE_PRESENT == 1) + #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) __DSB(); __ISB(); - SCB->CCR &= ~(uint32_t)SCB_CCR_IC_Msk; // disable I-Cache - SCB->ICIALLU = 0UL; // invalidate I-Cache + SCB->CCR &= ~(uint32_t)SCB_CCR_IC_Msk; /* disable I-Cache */ + SCB->ICIALLU = 0UL; /* invalidate I-Cache */ __DSB(); __ISB(); #endif } -/** \brief Invalidate I-Cache - - The function invalidates I-Cache +/** + \brief Invalidate I-Cache + \details Invalidates I-Cache */ __STATIC_INLINE void SCB_InvalidateICache (void) { - #if (__ICACHE_PRESENT == 1) + #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) __DSB(); __ISB(); SCB->ICIALLU = 0UL; @@ -2016,35 +2274,37 @@ __STATIC_INLINE void SCB_InvalidateICache (void) } -/** \brief Enable D-Cache - - The function turns on D-Cache +/** + \brief Enable D-Cache + \details Turns on D-Cache */ __STATIC_INLINE void SCB_EnableDCache (void) { - #if (__DCACHE_PRESENT == 1) - uint32_t ccsidr, sshift, wshift, sw; - uint32_t sets, ways; - - SCB->CSSELR = (0UL << 1) | 0UL; // Level 1 data cache - ccsidr = SCB->CCSIDR; - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - sshift = (uint32_t)(CCSIDR_LSSHIFT(ccsidr) + 4UL); - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - wshift = (uint32_t)((uint32_t)__CLZ(ways) & 0x1FUL); + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/ /* Level 1 data cache */ __DSB(); - do { // invalidate D-Cache - uint32_t tmpways = ways; - do { - sw = ((tmpways << wshift) | (sets << sshift)); - SCB->DCISW = sw; - } while(tmpways--); - } while(sets--); + ccsidr = SCB->CCSIDR; + + /* invalidate D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do { + SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) | + ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk) ); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); __DSB(); - SCB->CCR |= (uint32_t)SCB_CCR_DC_Msk; // enable D-Cache + SCB->CCR |= (uint32_t)SCB_CCR_DC_Msk; /* enable D-Cache */ __DSB(); __ISB(); @@ -2052,35 +2312,37 @@ __STATIC_INLINE void SCB_EnableDCache (void) } -/** \brief Disable D-Cache - - The function turns off D-Cache +/** + \brief Disable D-Cache + \details Turns off D-Cache */ __STATIC_INLINE void SCB_DisableDCache (void) { - #if (__DCACHE_PRESENT == 1) - uint32_t ccsidr, sshift, wshift, sw; - uint32_t sets, ways; - - SCB->CSSELR = (0UL << 1) | 0UL; // Level 1 data cache - ccsidr = SCB->CCSIDR; - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - sshift = (uint32_t)(CCSIDR_LSSHIFT(ccsidr) + 4UL); - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - wshift = (uint32_t)((uint32_t)__CLZ(ways) & 0x1FUL); + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/ /* Level 1 data cache */ __DSB(); - SCB->CCR &= ~(uint32_t)SCB_CCR_DC_Msk; // disable D-Cache - - do { // clean & invalidate D-Cache - uint32_t tmpways = ways; - do { - sw = ((tmpways << wshift) | (sets << sshift)); - SCB->DCCISW = sw; - } while(tmpways--); - } while(sets--); + SCB->CCR &= ~(uint32_t)SCB_CCR_DC_Msk; /* disable D-Cache */ + __DSB(); + ccsidr = SCB->CCSIDR; + + /* clean & invalidate D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do { + SCB->DCCISW = (((sets << SCB_DCCISW_SET_Pos) & SCB_DCCISW_SET_Msk) | + ((ways << SCB_DCCISW_WAY_Pos) & SCB_DCCISW_WAY_Msk) ); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); __DSB(); __ISB(); @@ -2088,32 +2350,34 @@ __STATIC_INLINE void SCB_DisableDCache (void) } -/** \brief Invalidate D-Cache - - The function invalidates D-Cache +/** + \brief Invalidate D-Cache + \details Invalidates D-Cache */ __STATIC_INLINE void SCB_InvalidateDCache (void) { - #if (__DCACHE_PRESENT == 1) - uint32_t ccsidr, sshift, wshift, sw; - uint32_t sets, ways; - - SCB->CSSELR = (0UL << 1) | 0UL; // Level 1 data cache - ccsidr = SCB->CCSIDR; - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - sshift = (uint32_t)(CCSIDR_LSSHIFT(ccsidr) + 4UL); - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - wshift = (uint32_t)((uint32_t)__CLZ(ways) & 0x1FUL); + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/ /* Level 1 data cache */ __DSB(); - do { // invalidate D-Cache - uint32_t tmpways = ways; - do { - sw = ((tmpways << wshift) | (sets << sshift)); - SCB->DCISW = sw; - } while(tmpways--); - } while(sets--); + ccsidr = SCB->CCSIDR; + + /* invalidate D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do { + SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) | + ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk) ); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); __DSB(); __ISB(); @@ -2121,32 +2385,34 @@ __STATIC_INLINE void SCB_InvalidateDCache (void) } -/** \brief Clean D-Cache - - The function cleans D-Cache +/** + \brief Clean D-Cache + \details Cleans D-Cache */ __STATIC_INLINE void SCB_CleanDCache (void) { - #if (__DCACHE_PRESENT == 1) - uint32_t ccsidr, sshift, wshift, sw; - uint32_t sets, ways; - - SCB->CSSELR = (0UL << 1) | 0UL; // Level 1 data cache - ccsidr = SCB->CCSIDR; - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - sshift = (uint32_t)(CCSIDR_LSSHIFT(ccsidr) + 4UL); - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - wshift = (uint32_t)((uint32_t)__CLZ(ways) & 0x1FUL); - - __DSB(); - - do { // clean D-Cache - uint32_t tmpways = ways; - do { - sw = ((tmpways << wshift) | (sets << sshift)); - SCB->DCCSW = sw; - } while(tmpways--); - } while(sets--); + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/ /* Level 1 data cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* clean D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do { + SCB->DCCSW = (((sets << SCB_DCCSW_SET_Pos) & SCB_DCCSW_SET_Msk) | + ((ways << SCB_DCCSW_WAY_Pos) & SCB_DCCSW_WAY_Msk) ); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); __DSB(); __ISB(); @@ -2154,32 +2420,34 @@ __STATIC_INLINE void SCB_CleanDCache (void) } -/** \brief Clean & Invalidate D-Cache - - The function cleans and Invalidates D-Cache +/** + \brief Clean & Invalidate D-Cache + \details Cleans and Invalidates D-Cache */ __STATIC_INLINE void SCB_CleanInvalidateDCache (void) { - #if (__DCACHE_PRESENT == 1) - uint32_t ccsidr, sshift, wshift, sw; - uint32_t sets, ways; - - SCB->CSSELR = (0UL << 1) | 0UL; // Level 1 data cache - ccsidr = SCB->CCSIDR; - sets = (uint32_t)(CCSIDR_SETS(ccsidr)); - sshift = (uint32_t)(CCSIDR_LSSHIFT(ccsidr) + 4UL); - ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); - wshift = (uint32_t)((uint32_t)__CLZ(ways) & 0x1FUL); + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/ /* Level 1 data cache */ __DSB(); - do { // clean & invalidate D-Cache - uint32_t tmpways = ways; - do { - sw = ((tmpways << wshift) | (sets << sshift)); - SCB->DCCISW = sw; - } while(tmpways--); - } while(sets--); + ccsidr = SCB->CCSIDR; + + /* clean & invalidate D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do { + SCB->DCCISW = (((sets << SCB_DCCISW_SET_Pos) & SCB_DCCISW_SET_Msk) | + ((ways << SCB_DCCISW_WAY_Pos) & SCB_DCCISW_WAY_Msk) ); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); __DSB(); __ISB(); @@ -2188,24 +2456,24 @@ __STATIC_INLINE void SCB_CleanInvalidateDCache (void) /** - \fn void SCB_InvalidateDCache_by_Addr(volatile uint32_t *addr, int32_t dsize) - \brief D-Cache Invalidate by address + \brief D-Cache Invalidate by address + \details Invalidates D-Cache for the given address \param[in] addr address (aligned to 32-byte boundary) \param[in] dsize size of memory block (in number of bytes) */ __STATIC_INLINE void SCB_InvalidateDCache_by_Addr (uint32_t *addr, int32_t dsize) { - #if (__DCACHE_PRESENT == 1) - int32_t op_size = dsize; + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + int32_t op_size = dsize; uint32_t op_addr = (uint32_t)addr; - uint32_t linesize = 32UL; // in Cortex-M7 size of cache line is fixed to 8 words (32 bytes) + int32_t linesize = 32; /* in Cortex-M7 size of cache line is fixed to 8 words (32 bytes) */ __DSB(); while (op_size > 0) { SCB->DCIMVAC = op_addr; - op_addr += linesize; - op_size -= (int32_t)linesize; + op_addr += (uint32_t)linesize; + op_size -= linesize; } __DSB(); @@ -2215,24 +2483,24 @@ __STATIC_INLINE void SCB_InvalidateDCache_by_Addr (uint32_t *addr, int32_t dsize /** - \fn void SCB_CleanDCache_by_Addr(volatile uint32_t *addr, int32_t dsize) - \brief D-Cache Clean by address + \brief D-Cache Clean by address + \details Cleans D-Cache for the given address \param[in] addr address (aligned to 32-byte boundary) \param[in] dsize size of memory block (in number of bytes) */ __STATIC_INLINE void SCB_CleanDCache_by_Addr (uint32_t *addr, int32_t dsize) { - #if (__DCACHE_PRESENT == 1) - int32_t op_size = dsize; + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + int32_t op_size = dsize; uint32_t op_addr = (uint32_t) addr; - uint32_t linesize = 32UL; // in Cortex-M7 size of cache line is fixed to 8 words (32 bytes) + int32_t linesize = 32; /* in Cortex-M7 size of cache line is fixed to 8 words (32 bytes) */ __DSB(); while (op_size > 0) { SCB->DCCMVAC = op_addr; - op_addr += linesize; - op_size -= (int32_t)linesize; + op_addr += (uint32_t)linesize; + op_size -= linesize; } __DSB(); @@ -2242,24 +2510,24 @@ __STATIC_INLINE void SCB_CleanDCache_by_Addr (uint32_t *addr, int32_t dsize) /** - \fn void SCB_CleanInvalidateDCache_by_Addr(volatile uint32_t *addr, int32_t dsize) - \brief D-Cache Clean and Invalidate by address + \brief D-Cache Clean and Invalidate by address + \details Cleans and invalidates D_Cache for the given address \param[in] addr address (aligned to 32-byte boundary) \param[in] dsize size of memory block (in number of bytes) */ __STATIC_INLINE void SCB_CleanInvalidateDCache_by_Addr (uint32_t *addr, int32_t dsize) { - #if (__DCACHE_PRESENT == 1) - int32_t op_size = dsize; + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + int32_t op_size = dsize; uint32_t op_addr = (uint32_t) addr; - uint32_t linesize = 32UL; // in Cortex-M7 size of cache line is fixed to 8 words (32 bytes) + int32_t linesize = 32; /* in Cortex-M7 size of cache line is fixed to 8 words (32 bytes) */ __DSB(); while (op_size > 0) { SCB->DCCIMVAC = op_addr; - op_addr += linesize; - op_size -= (int32_t)linesize; + op_addr += (uint32_t)linesize; + op_size -= linesize; } __DSB(); @@ -2273,32 +2541,32 @@ __STATIC_INLINE void SCB_CleanInvalidateDCache_by_Addr (uint32_t *addr, int32_t /* ################################## SysTick function ############################################ */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. @{ */ -#if (__Vendor_SysTickConfig == 0) - -/** \brief System Tick Configuration - - The function initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - - \param [in] ticks Number of ticks between two interrupts. - - \return 0 Function succeeded. - \return 1 Function failed. - - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. */ __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) { - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) { return (1UL); } /* Reload value impossible */ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ @@ -2316,49 +2584,52 @@ __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) /* ##################################### Debug In/Output function ########################################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. @{ */ -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY 0x5AA55AA5 /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ -/** \brief ITM Send Character - The function transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. - - \param [in] ch Character to transmit. - - \returns Character to transmit. +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. */ __STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) { if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ { - while (ITM->PORT[0].u32 == 0UL) { __NOP(); } - ITM->PORT[0].u8 = (uint8_t)ch; + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; } return (ch); } -/** \brief ITM Receive Character - - The function inputs a character via the external variable \ref ITM_RxBuffer. - - \return Received character. - \return -1 No character pending. +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) { +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ int32_t ch = -1; /* no character available */ - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) { + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { ch = ITM_RxBuffer; ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ } @@ -2367,19 +2638,22 @@ __STATIC_INLINE int32_t ITM_ReceiveChar (void) { } -/** \brief ITM Check Character - - The function checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - - \return 0 No character available. - \return 1 Character available. +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. */ -__STATIC_INLINE int32_t ITM_CheckChar (void) { +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) { - return (0); /* no character available */ - } else { - return (1); /* character available */ + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ } } diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/core_sc000.h b/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/core_sc000.h new file mode 100644 index 00000000..9b67c92f --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/core_sc000.h @@ -0,0 +1,1022 @@ +/**************************************************************************//** + * @file core_sc000.h + * @brief CMSIS SC000 Core Peripheral Access Layer Header File + * @version V5.0.5 + * @date 28. May 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_SC000_H_GENERIC +#define __CORE_SC000_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup SC000 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS SC000 definitions */ +#define __SC000_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __SC000_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __SC000_CMSIS_VERSION ((__SC000_CMSIS_VERSION_MAIN << 16U) | \ + __SC000_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_SC (000U) /*!< Cortex secure core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_SC000_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_SC000_H_DEPENDANT +#define __CORE_SC000_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __SC000_REV + #define __SC000_REV 0x0000U + #warning "__SC000_REV not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group SC000 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core MPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t _reserved0:1; /*!< bit: 0 Reserved */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[31U]; + __IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[31U]; + __IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[31U]; + __IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[31U]; + uint32_t RESERVED4[64U]; + __IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + uint32_t RESERVED0[1U]; + __IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + uint32_t RESERVED1[154U]; + __IOM uint32_t SFCR; /*!< Offset: 0x290 (R/W) Security Features Control Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ +} SCnSCB_Type; + +/* Auxiliary Control Register Definitions */ +#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ +#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ +} MPU_Type; + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 8U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0xFFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register Definitions */ +#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ + +#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ + +#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ + +#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ + +#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ + +#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ + +#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief SC000 Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. + Therefore they are not covered by the SC000 header file. + @{ + */ +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else +/*#define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping not available for SC000 */ +/*#define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping not available for SC000 */ + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ +/*#define NVIC_GetActive __NVIC_GetActive not available for SC000 */ + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* The following EXC_RETURN values are saved the LR on exception entry */ +#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ +#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ +#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ + + +/* Interrupt Priorities are WORD accessible only under Armv6-M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_SC000_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Include/core_sc300.h b/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/core_sc300.h old mode 100755 new mode 100644 similarity index 51% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Include/core_sc300.h rename to STM32CubeMX/revF/Drivers/CMSIS/Core/Include/core_sc300.h index 7e40672a..3e8a4710 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Include/core_sc300.h +++ b/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/core_sc300.h @@ -1,52 +1,44 @@ /**************************************************************************//** * @file core_sc300.h * @brief CMSIS SC300 Core Peripheral Access Layer Header File - * @version V4.10 - * @date 18. March 2015 + * @version V5.0.6 + * @date 04. June 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. * - * @note + * SPDX-License-Identifier: Apache-2.0 * - ******************************************************************************/ -/* Copyright (c) 2009 - 2015 ARM LIMITED - - All rights reserved. - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - Neither the name of ARM nor the names of its contributors may be used - to endorse or promote products derived from this software without - specific prior written permission. - * - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - ---------------------------------------------------------------------------*/ - - -#if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ #endif #ifndef __CORE_SC300_H_GENERIC #define __CORE_SC300_H_GENERIC +#include + #ifdef __cplusplus extern "C" { #endif -/** \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions CMSIS violates the following MISRA-C:2004 rules: \li Required Rule 8.5, object/function definition in header file.
@@ -63,74 +55,49 @@ /******************************************************************************* * CMSIS definitions ******************************************************************************/ -/** \ingroup SC3000 +/** + \ingroup SC3000 @{ */ -/* CMSIS SC300 definitions */ -#define __SC300_CMSIS_VERSION_MAIN (0x04) /*!< [31:16] CMSIS HAL main version */ -#define __SC300_CMSIS_VERSION_SUB (0x00) /*!< [15:0] CMSIS HAL sub version */ -#define __SC300_CMSIS_VERSION ((__SC300_CMSIS_VERSION_MAIN << 16) | \ - __SC300_CMSIS_VERSION_SUB ) /*!< CMSIS HAL version number */ - -#define __CORTEX_SC (300) /*!< Cortex secure core */ - - -#if defined ( __CC_ARM ) - #define __ASM __asm /*!< asm keyword for ARM Compiler */ - #define __INLINE __inline /*!< inline keyword for ARM Compiler */ - #define __STATIC_INLINE static __inline - -#elif defined ( __GNUC__ ) - #define __ASM __asm /*!< asm keyword for GNU Compiler */ - #define __INLINE inline /*!< inline keyword for GNU Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __ICCARM__ ) - #define __ASM __asm /*!< asm keyword for IAR Compiler */ - #define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */ - #define __STATIC_INLINE static inline - -#elif defined ( __TMS470__ ) - #define __ASM __asm /*!< asm keyword for TI CCS Compiler */ - #define __STATIC_INLINE static inline +#include "cmsis_version.h" -#elif defined ( __TASKING__ ) - #define __ASM __asm /*!< asm keyword for TASKING Compiler */ - #define __INLINE inline /*!< inline keyword for TASKING Compiler */ - #define __STATIC_INLINE static inline - -#elif defined ( __CSMC__ ) - #define __packed - #define __ASM _asm /*!< asm keyword for COSMIC Compiler */ - #define __INLINE inline /*use -pc99 on compile line !< inline keyword for COSMIC Compiler */ - #define __STATIC_INLINE static inline +/* CMSIS SC300 definitions */ +#define __SC300_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __SC300_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __SC300_CMSIS_VERSION ((__SC300_CMSIS_VERSION_MAIN << 16U) | \ + __SC300_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ -#endif +#define __CORTEX_SC (300U) /*!< Cortex secure core */ /** __FPU_USED indicates whether an FPU is used or not. This core does not support an FPU at all */ -#define __FPU_USED 0 +#define __FPU_USED 0U #if defined ( __CC_ARM ) #if defined __TARGET_FPU_VFP - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" #endif #elif defined ( __GNUC__ ) #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" #endif #elif defined ( __ICCARM__ ) #if defined __ARMVFP__ - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" #endif -#elif defined ( __TMS470__ ) - #if defined __TI__VFP_SUPPORT____ - #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" #endif #elif defined ( __TASKING__ ) @@ -138,15 +105,15 @@ #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" #endif -#elif defined ( __CSMC__ ) /* Cosmic */ - #if ( __CSMC__ & 0x400) // FPU present for parser +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" #endif + #endif -#include /* standard types definitions */ -#include /* Core Instruction Access */ -#include /* Core Function Access */ +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + #ifdef __cplusplus } @@ -166,22 +133,22 @@ /* check device defines and use defaults */ #if defined __CHECK_DEVICE_DEFINES #ifndef __SC300_REV - #define __SC300_REV 0x0000 + #define __SC300_REV 0x0000U #warning "__SC300_REV not defined in device header file; using default!" #endif #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0 + #define __MPU_PRESENT 0U #warning "__MPU_PRESENT not defined in device header file; using default!" #endif #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 4 + #define __NVIC_PRIO_BITS 3U #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" #endif #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0 + #define __Vendor_SysTickConfig 0U #warning "__Vendor_SysTickConfig not defined in device header file; using default!" #endif #endif @@ -195,12 +162,17 @@ \li for automatic generation of peripheral register debug information. */ #ifdef __cplusplus - #define __I volatile /*!< Defines 'read only' permissions */ + #define __I volatile /*!< Defines 'read only' permissions */ #else - #define __I volatile const /*!< Defines 'read only' permissions */ + #define __I volatile const /*!< Defines 'read only' permissions */ #endif -#define __O volatile /*!< Defines 'write only' permissions */ -#define __IO volatile /*!< Defines 'read / write' permissions */ +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ /*@} end of group SC300 */ @@ -216,1083 +188,1199 @@ - Core Debug Register - Core MPU Register ******************************************************************************/ -/** \defgroup CMSIS_core_register Defines and Type Definitions - \brief Type definitions and defines for Cortex-M processor based devices. +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. */ -/** \ingroup CMSIS_core_register - \defgroup CMSIS_CORE Status and Control Registers - \brief Core Register type definitions. +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. @{ */ -/** \brief Union type to access the Application Program Status Register (APSR). +/** + \brief Union type to access the Application Program Status Register (APSR). */ typedef union { struct { - uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ + uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ } APSR_Type; /* APSR Register Definitions */ -#define APSR_N_Pos 31 /*!< APSR: N Position */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ #define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ -#define APSR_Z_Pos 30 /*!< APSR: Z Position */ +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ #define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ -#define APSR_C_Pos 29 /*!< APSR: C Position */ +#define APSR_C_Pos 29U /*!< APSR: C Position */ #define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ -#define APSR_V_Pos 28 /*!< APSR: V Position */ +#define APSR_V_Pos 28U /*!< APSR: V Position */ #define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ -#define APSR_Q_Pos 27 /*!< APSR: Q Position */ +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ #define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ -/** \brief Union type to access the Interrupt Program Status Register (IPSR). +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). */ typedef union { struct { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ } IPSR_Type; /* IPSR Register Definitions */ -#define IPSR_ISR_Pos 0 /*!< IPSR: ISR Position */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ #define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ -/** \brief Union type to access the Special-Purpose Program Status Registers (xPSR). +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). */ typedef union { struct { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ - uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:1; /*!< bit: 9 Reserved */ + uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ + uint32_t _reserved1:8; /*!< bit: 16..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit */ + uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ } xPSR_Type; /* xPSR Register Definitions */ -#define xPSR_N_Pos 31 /*!< xPSR: N Position */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ #define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ -#define xPSR_Z_Pos 30 /*!< xPSR: Z Position */ +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ #define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ -#define xPSR_C_Pos 29 /*!< xPSR: C Position */ +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ #define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ -#define xPSR_V_Pos 28 /*!< xPSR: V Position */ +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ #define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ -#define xPSR_Q_Pos 27 /*!< xPSR: Q Position */ +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ #define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ -#define xPSR_IT_Pos 25 /*!< xPSR: IT Position */ -#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ +#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ +#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ -#define xPSR_T_Pos 24 /*!< xPSR: T Position */ +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ #define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ -#define xPSR_ISR_Pos 0 /*!< xPSR: ISR Position */ +#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ +#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ #define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ -/** \brief Union type to access the Control Registers (CONTROL). +/** + \brief Union type to access the Control Registers (CONTROL). */ typedef union { struct { uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ } CONTROL_Type; /* CONTROL Register Definitions */ -#define CONTROL_SPSEL_Pos 1 /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ #define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ -#define CONTROL_nPRIV_Pos 0 /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ #define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ /*@} end of group CMSIS_CORE */ -/** \ingroup CMSIS_core_register - \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) - \brief Type definitions for the NVIC Registers +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers @{ */ -/** \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). */ typedef struct { - __IO uint32_t ISER[8]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[24]; - __IO uint32_t ICER[8]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RSERVED1[24]; - __IO uint32_t ISPR[8]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[24]; - __IO uint32_t ICPR[8]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[24]; - __IO uint32_t IABR[8]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[56]; - __IO uint8_t IP[240]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED5[644]; - __O uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ + __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[24U]; + __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[24U]; + __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[24U]; + __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[24U]; + __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[56U]; + __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED5[644U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ } NVIC_Type; /* Software Triggered Interrupt Register Definitions */ -#define NVIC_STIR_INTID_Pos 0 /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ #define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ /*@} end of group CMSIS_NVIC */ -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SCB System Control Block (SCB) - \brief Type definitions for the System Control Block Registers +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers @{ */ -/** \brief Structure type to access the System Control Block (SCB). +/** + \brief Structure type to access the System Control Block (SCB). */ typedef struct { - __I uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IO uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IO uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IO uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IO uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IO uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - __IO uint8_t SHP[12]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IO uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IO uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IO uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IO uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IO uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IO uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IO uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __I uint32_t PFR[2]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __I uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __I uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __I uint32_t MMFR[4]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __I uint32_t ISAR[5]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - uint32_t RESERVED0[5]; - __IO uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ - uint32_t RESERVED1[129]; - __IO uint32_t SFCR; /*!< Offset: 0x290 (R/W) Security Features Control Register */ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHP[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + uint32_t RESERVED0[5U]; + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ + uint32_t RESERVED1[129U]; + __IOM uint32_t SFCR; /*!< Offset: 0x290 (R/W) Security Features Control Register */ } SCB_Type; /* SCB CPUID Register Definitions */ -#define SCB_CPUID_IMPLEMENTER_Pos 24 /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ #define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ -#define SCB_CPUID_VARIANT_Pos 20 /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ #define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ -#define SCB_CPUID_ARCHITECTURE_Pos 16 /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ #define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ -#define SCB_CPUID_PARTNO_Pos 4 /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ #define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ -#define SCB_CPUID_REVISION_Pos 0 /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ #define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ /* SCB Interrupt Control State Register Definitions */ -#define SCB_ICSR_NMIPENDSET_Pos 31 /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ #define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ -#define SCB_ICSR_PENDSVSET_Pos 28 /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ #define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ -#define SCB_ICSR_PENDSVCLR_Pos 27 /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ #define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ -#define SCB_ICSR_PENDSTSET_Pos 26 /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ #define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ -#define SCB_ICSR_PENDSTCLR_Pos 25 /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ #define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ -#define SCB_ICSR_ISRPREEMPT_Pos 23 /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ #define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ -#define SCB_ICSR_ISRPENDING_Pos 22 /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ #define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ -#define SCB_ICSR_VECTPENDING_Pos 12 /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ #define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ -#define SCB_ICSR_RETTOBASE_Pos 11 /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ #define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ -#define SCB_ICSR_VECTACTIVE_Pos 0 /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ #define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ /* SCB Vector Table Offset Register Definitions */ -#define SCB_VTOR_TBLBASE_Pos 29 /*!< SCB VTOR: TBLBASE Position */ +#define SCB_VTOR_TBLBASE_Pos 29U /*!< SCB VTOR: TBLBASE Position */ #define SCB_VTOR_TBLBASE_Msk (1UL << SCB_VTOR_TBLBASE_Pos) /*!< SCB VTOR: TBLBASE Mask */ -#define SCB_VTOR_TBLOFF_Pos 7 /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ #define SCB_VTOR_TBLOFF_Msk (0x3FFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ /* SCB Application Interrupt and Reset Control Register Definitions */ -#define SCB_AIRCR_VECTKEY_Pos 16 /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ #define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ -#define SCB_AIRCR_VECTKEYSTAT_Pos 16 /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ #define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ -#define SCB_AIRCR_ENDIANESS_Pos 15 /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ #define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ -#define SCB_AIRCR_PRIGROUP_Pos 8 /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ #define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ -#define SCB_AIRCR_SYSRESETREQ_Pos 2 /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ #define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ -#define SCB_AIRCR_VECTCLRACTIVE_Pos 1 /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ #define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ -#define SCB_AIRCR_VECTRESET_Pos 0 /*!< SCB AIRCR: VECTRESET Position */ +#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ #define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */ /* SCB System Control Register Definitions */ -#define SCB_SCR_SEVONPEND_Pos 4 /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ #define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ -#define SCB_SCR_SLEEPDEEP_Pos 2 /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ #define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ -#define SCB_SCR_SLEEPONEXIT_Pos 1 /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ #define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ /* SCB Configuration Control Register Definitions */ -#define SCB_CCR_STKALIGN_Pos 9 /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ #define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ -#define SCB_CCR_BFHFNMIGN_Pos 8 /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ #define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ -#define SCB_CCR_DIV_0_TRP_Pos 4 /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ #define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ -#define SCB_CCR_UNALIGN_TRP_Pos 3 /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ #define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ -#define SCB_CCR_USERSETMPEND_Pos 1 /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ #define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ -#define SCB_CCR_NONBASETHRDENA_Pos 0 /*!< SCB CCR: NONBASETHRDENA Position */ +#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ #define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ /* SCB System Handler Control and State Register Definitions */ -#define SCB_SHCSR_USGFAULTENA_Pos 18 /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ #define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ -#define SCB_SHCSR_BUSFAULTENA_Pos 17 /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ #define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ -#define SCB_SHCSR_MEMFAULTENA_Pos 16 /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ #define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ -#define SCB_SHCSR_SVCALLPENDED_Pos 15 /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ #define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ -#define SCB_SHCSR_BUSFAULTPENDED_Pos 14 /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ #define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ -#define SCB_SHCSR_MEMFAULTPENDED_Pos 13 /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ #define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ -#define SCB_SHCSR_USGFAULTPENDED_Pos 12 /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ #define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ -#define SCB_SHCSR_SYSTICKACT_Pos 11 /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ #define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ -#define SCB_SHCSR_PENDSVACT_Pos 10 /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ #define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ -#define SCB_SHCSR_MONITORACT_Pos 8 /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ #define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ -#define SCB_SHCSR_SVCALLACT_Pos 7 /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ #define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ -#define SCB_SHCSR_USGFAULTACT_Pos 3 /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ #define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ -#define SCB_SHCSR_BUSFAULTACT_Pos 1 /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ #define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ -#define SCB_SHCSR_MEMFAULTACT_Pos 0 /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ #define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ -/* SCB Configurable Fault Status Registers Definitions */ -#define SCB_CFSR_USGFAULTSR_Pos 16 /*!< SCB CFSR: Usage Fault Status Register Position */ +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ #define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ -#define SCB_CFSR_BUSFAULTSR_Pos 8 /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ #define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ -#define SCB_CFSR_MEMFAULTSR_Pos 0 /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ #define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ -/* SCB Hard Fault Status Registers Definitions */ -#define SCB_HFSR_DEBUGEVT_Pos 31 /*!< SCB HFSR: DEBUGEVT Position */ +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ #define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ -#define SCB_HFSR_FORCED_Pos 30 /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ #define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ -#define SCB_HFSR_VECTTBL_Pos 1 /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ #define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ /* SCB Debug Fault Status Register Definitions */ -#define SCB_DFSR_EXTERNAL_Pos 4 /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ #define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ -#define SCB_DFSR_VCATCH_Pos 3 /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ #define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ -#define SCB_DFSR_DWTTRAP_Pos 2 /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ #define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ -#define SCB_DFSR_BKPT_Pos 1 /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ #define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ -#define SCB_DFSR_HALTED_Pos 0 /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ #define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ /*@} end of group CMSIS_SCB */ -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) - \brief Type definitions for the System Control and ID Register not in the SCB +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB @{ */ -/** \brief Structure type to access the System Control and ID Register not in the SCB. +/** + \brief Structure type to access the System Control and ID Register not in the SCB. */ typedef struct { - uint32_t RESERVED0[1]; - __I uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ - uint32_t RESERVED1[1]; + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + uint32_t RESERVED1[1U]; } SCnSCB_Type; /* Interrupt Controller Type Register Definitions */ -#define SCnSCB_ICTR_INTLINESNUM_Pos 0 /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ #define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ /*@} end of group CMSIS_SCnotSCB */ -/** \ingroup CMSIS_core_register - \defgroup CMSIS_SysTick System Tick Timer (SysTick) - \brief Type definitions for the System Timer Registers. +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. @{ */ -/** \brief Structure type to access the System Timer (SysTick). +/** + \brief Structure type to access the System Timer (SysTick). */ typedef struct { - __IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IO uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IO uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __I uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ } SysTick_Type; /* SysTick Control / Status Register Definitions */ -#define SysTick_CTRL_COUNTFLAG_Pos 16 /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ #define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ -#define SysTick_CTRL_CLKSOURCE_Pos 2 /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ #define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ -#define SysTick_CTRL_TICKINT_Pos 1 /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ #define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ -#define SysTick_CTRL_ENABLE_Pos 0 /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ #define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ /* SysTick Reload Register Definitions */ -#define SysTick_LOAD_RELOAD_Pos 0 /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ #define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ /* SysTick Current Register Definitions */ -#define SysTick_VAL_CURRENT_Pos 0 /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ #define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ /* SysTick Calibration Register Definitions */ -#define SysTick_CALIB_NOREF_Pos 31 /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ #define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ -#define SysTick_CALIB_SKEW_Pos 30 /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ #define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ -#define SysTick_CALIB_TENMS_Pos 0 /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ #define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ /*@} end of group CMSIS_SysTick */ -/** \ingroup CMSIS_core_register - \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) - \brief Type definitions for the Instrumentation Trace Macrocell (ITM) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) @{ */ -/** \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). */ typedef struct { - __O union + __OM union { - __O uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __O uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __O uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864]; - __IO uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15]; - __IO uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15]; - __IO uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[29]; - __O uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ - __I uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ - __IO uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ - uint32_t RESERVED4[43]; - __O uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __I uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[6]; - __I uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __I uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __I uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __I uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __I uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __I uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __I uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __I uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __I uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __I uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __I uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __I uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[29U]; + __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ + __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ + __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[6U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ } ITM_Type; /* ITM Trace Privilege Register Definitions */ -#define ITM_TPR_PRIVMASK_Pos 0 /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ #define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ /* ITM Trace Control Register Definitions */ -#define ITM_TCR_BUSY_Pos 23 /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ #define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ -#define ITM_TCR_TraceBusID_Pos 16 /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ #define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ -#define ITM_TCR_GTSFREQ_Pos 10 /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ #define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ -#define ITM_TCR_TSPrescale_Pos 8 /*!< ITM TCR: TSPrescale Position */ +#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ #define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ -#define ITM_TCR_SWOENA_Pos 4 /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ #define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ -#define ITM_TCR_DWTENA_Pos 3 /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ #define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ -#define ITM_TCR_SYNCENA_Pos 2 /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ #define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ -#define ITM_TCR_TSENA_Pos 1 /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ #define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ -#define ITM_TCR_ITMENA_Pos 0 /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ #define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ /* ITM Integration Write Register Definitions */ -#define ITM_IWR_ATVALIDM_Pos 0 /*!< ITM IWR: ATVALIDM Position */ +#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ #define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ /* ITM Integration Read Register Definitions */ -#define ITM_IRR_ATREADYM_Pos 0 /*!< ITM IRR: ATREADYM Position */ +#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ #define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ /* ITM Integration Mode Control Register Definitions */ -#define ITM_IMCR_INTEGRATION_Pos 0 /*!< ITM IMCR: INTEGRATION Position */ +#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ #define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION Mask */ /* ITM Lock Status Register Definitions */ -#define ITM_LSR_ByteAcc_Pos 2 /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ #define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ -#define ITM_LSR_Access_Pos 1 /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ #define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ -#define ITM_LSR_Present_Pos 0 /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ #define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ /*@}*/ /* end of group CMSIS_ITM */ -/** \ingroup CMSIS_core_register - \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) - \brief Type definitions for the Data Watchpoint and Trace (DWT) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) @{ */ -/** \brief Structure type to access the Data Watchpoint and Trace Register (DWT). +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). */ typedef struct { - __IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IO uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IO uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IO uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IO uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IO uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IO uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __I uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IO uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - __IO uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ - __IO uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED0[1]; - __IO uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - __IO uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ - __IO uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED1[1]; - __IO uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - __IO uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ - __IO uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED2[1]; - __IO uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - __IO uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ - __IO uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED0[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ } DWT_Type; /* DWT Control Register Definitions */ -#define DWT_CTRL_NUMCOMP_Pos 28 /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ #define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ -#define DWT_CTRL_NOTRCPKT_Pos 27 /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ #define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ -#define DWT_CTRL_NOEXTTRIG_Pos 26 /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ #define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ -#define DWT_CTRL_NOCYCCNT_Pos 25 /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ #define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ -#define DWT_CTRL_NOPRFCNT_Pos 24 /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ #define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ -#define DWT_CTRL_CYCEVTENA_Pos 22 /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ #define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ -#define DWT_CTRL_FOLDEVTENA_Pos 21 /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ #define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ -#define DWT_CTRL_LSUEVTENA_Pos 20 /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ #define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ -#define DWT_CTRL_SLEEPEVTENA_Pos 19 /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ #define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ -#define DWT_CTRL_EXCEVTENA_Pos 18 /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ #define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ -#define DWT_CTRL_CPIEVTENA_Pos 17 /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ #define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ -#define DWT_CTRL_EXCTRCENA_Pos 16 /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ #define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ -#define DWT_CTRL_PCSAMPLENA_Pos 12 /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ #define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ -#define DWT_CTRL_SYNCTAP_Pos 10 /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ #define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ -#define DWT_CTRL_CYCTAP_Pos 9 /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ #define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ -#define DWT_CTRL_POSTINIT_Pos 5 /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ #define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ -#define DWT_CTRL_POSTPRESET_Pos 1 /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ #define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ -#define DWT_CTRL_CYCCNTENA_Pos 0 /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ #define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ /* DWT CPI Count Register Definitions */ -#define DWT_CPICNT_CPICNT_Pos 0 /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ #define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ /* DWT Exception Overhead Count Register Definitions */ -#define DWT_EXCCNT_EXCCNT_Pos 0 /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ #define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ /* DWT Sleep Count Register Definitions */ -#define DWT_SLEEPCNT_SLEEPCNT_Pos 0 /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ #define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ /* DWT LSU Count Register Definitions */ -#define DWT_LSUCNT_LSUCNT_Pos 0 /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ #define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ /* DWT Folded-instruction Count Register Definitions */ -#define DWT_FOLDCNT_FOLDCNT_Pos 0 /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ #define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ /* DWT Comparator Mask Register Definitions */ -#define DWT_MASK_MASK_Pos 0 /*!< DWT MASK: MASK Position */ +#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ #define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ /* DWT Comparator Function Register Definitions */ -#define DWT_FUNCTION_MATCHED_Pos 24 /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ #define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ -#define DWT_FUNCTION_DATAVADDR1_Pos 16 /*!< DWT FUNCTION: DATAVADDR1 Position */ +#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ #define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ -#define DWT_FUNCTION_DATAVADDR0_Pos 12 /*!< DWT FUNCTION: DATAVADDR0 Position */ +#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ #define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ -#define DWT_FUNCTION_DATAVSIZE_Pos 10 /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ #define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ -#define DWT_FUNCTION_LNK1ENA_Pos 9 /*!< DWT FUNCTION: LNK1ENA Position */ +#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ #define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ -#define DWT_FUNCTION_DATAVMATCH_Pos 8 /*!< DWT FUNCTION: DATAVMATCH Position */ +#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ #define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ -#define DWT_FUNCTION_CYCMATCH_Pos 7 /*!< DWT FUNCTION: CYCMATCH Position */ +#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ #define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ -#define DWT_FUNCTION_EMITRANGE_Pos 5 /*!< DWT FUNCTION: EMITRANGE Position */ +#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ #define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ -#define DWT_FUNCTION_FUNCTION_Pos 0 /*!< DWT FUNCTION: FUNCTION Position */ +#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ #define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ /*@}*/ /* end of group CMSIS_DWT */ -/** \ingroup CMSIS_core_register - \defgroup CMSIS_TPI Trace Port Interface (TPI) - \brief Type definitions for the Trace Port Interface (TPI) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) @{ */ -/** \brief Structure type to access the Trace Port Interface Register (TPI). +/** + \brief Structure type to access the Trace Port Interface Register (TPI). */ typedef struct { - __IO uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ - __IO uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ - uint32_t RESERVED0[2]; - __IO uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55]; - __IO uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131]; - __I uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IO uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __I uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ - uint32_t RESERVED3[759]; - __I uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER */ - __I uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ - __I uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ - uint32_t RESERVED4[1]; - __I uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ - __I uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ - __IO uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ - uint32_t RESERVED5[39]; - __IO uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ - __IO uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ - uint32_t RESERVED7[8]; - __I uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ - __I uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ + __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ + __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ + __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ } TPI_Type; /* TPI Asynchronous Clock Prescaler Register Definitions */ -#define TPI_ACPR_PRESCALER_Pos 0 /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ #define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ /* TPI Selected Pin Protocol Register Definitions */ -#define TPI_SPPR_TXMODE_Pos 0 /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ #define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ /* TPI Formatter and Flush Status Register Definitions */ -#define TPI_FFSR_FtNonStop_Pos 3 /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ #define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ -#define TPI_FFSR_TCPresent_Pos 2 /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ #define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ -#define TPI_FFSR_FtStopped_Pos 1 /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ #define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ -#define TPI_FFSR_FlInProg_Pos 0 /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ #define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ /* TPI Formatter and Flush Control Register Definitions */ -#define TPI_FFCR_TrigIn_Pos 8 /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ #define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ -#define TPI_FFCR_EnFCont_Pos 1 /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ #define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ /* TPI TRIGGER Register Definitions */ -#define TPI_TRIGGER_TRIGGER_Pos 0 /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ #define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ /* TPI Integration ETM Data Register Definitions (FIFO0) */ -#define TPI_FIFO0_ITM_ATVALID_Pos 29 /*!< TPI FIFO0: ITM_ATVALID Position */ +#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ #define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ -#define TPI_FIFO0_ITM_bytecount_Pos 27 /*!< TPI FIFO0: ITM_bytecount Position */ +#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ #define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ -#define TPI_FIFO0_ETM_ATVALID_Pos 26 /*!< TPI FIFO0: ETM_ATVALID Position */ +#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ #define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ -#define TPI_FIFO0_ETM_bytecount_Pos 24 /*!< TPI FIFO0: ETM_bytecount Position */ +#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ #define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ -#define TPI_FIFO0_ETM2_Pos 16 /*!< TPI FIFO0: ETM2 Position */ +#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ #define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ -#define TPI_FIFO0_ETM1_Pos 8 /*!< TPI FIFO0: ETM1 Position */ +#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ #define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ -#define TPI_FIFO0_ETM0_Pos 0 /*!< TPI FIFO0: ETM0 Position */ +#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ #define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ /* TPI ITATBCTR2 Register Definitions */ -#define TPI_ITATBCTR2_ATREADY_Pos 0 /*!< TPI ITATBCTR2: ATREADY Position */ -#define TPI_ITATBCTR2_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY_Pos*/) /*!< TPI ITATBCTR2: ATREADY Mask */ +#define TPI_ITATBCTR2_ATREADY2_Pos 0U /*!< TPI ITATBCTR2: ATREADY2 Position */ +#define TPI_ITATBCTR2_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2_Pos*/) /*!< TPI ITATBCTR2: ATREADY2 Mask */ + +#define TPI_ITATBCTR2_ATREADY1_Pos 0U /*!< TPI ITATBCTR2: ATREADY1 Position */ +#define TPI_ITATBCTR2_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1_Pos*/) /*!< TPI ITATBCTR2: ATREADY1 Mask */ /* TPI Integration ITM Data Register Definitions (FIFO1) */ -#define TPI_FIFO1_ITM_ATVALID_Pos 29 /*!< TPI FIFO1: ITM_ATVALID Position */ +#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ #define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ -#define TPI_FIFO1_ITM_bytecount_Pos 27 /*!< TPI FIFO1: ITM_bytecount Position */ +#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ #define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ -#define TPI_FIFO1_ETM_ATVALID_Pos 26 /*!< TPI FIFO1: ETM_ATVALID Position */ +#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ #define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ -#define TPI_FIFO1_ETM_bytecount_Pos 24 /*!< TPI FIFO1: ETM_bytecount Position */ +#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ #define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ -#define TPI_FIFO1_ITM2_Pos 16 /*!< TPI FIFO1: ITM2 Position */ +#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ #define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ -#define TPI_FIFO1_ITM1_Pos 8 /*!< TPI FIFO1: ITM1 Position */ +#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ #define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ -#define TPI_FIFO1_ITM0_Pos 0 /*!< TPI FIFO1: ITM0 Position */ +#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ #define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ /* TPI ITATBCTR0 Register Definitions */ -#define TPI_ITATBCTR0_ATREADY_Pos 0 /*!< TPI ITATBCTR0: ATREADY Position */ -#define TPI_ITATBCTR0_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY_Pos*/) /*!< TPI ITATBCTR0: ATREADY Mask */ +#define TPI_ITATBCTR0_ATREADY2_Pos 0U /*!< TPI ITATBCTR0: ATREADY2 Position */ +#define TPI_ITATBCTR0_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2_Pos*/) /*!< TPI ITATBCTR0: ATREADY2 Mask */ + +#define TPI_ITATBCTR0_ATREADY1_Pos 0U /*!< TPI ITATBCTR0: ATREADY1 Position */ +#define TPI_ITATBCTR0_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1_Pos*/) /*!< TPI ITATBCTR0: ATREADY1 Mask */ /* TPI Integration Mode Control Register Definitions */ -#define TPI_ITCTRL_Mode_Pos 0 /*!< TPI ITCTRL: Mode Position */ -#define TPI_ITCTRL_Mode_Msk (0x1UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ /* TPI DEVID Register Definitions */ -#define TPI_DEVID_NRZVALID_Pos 11 /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ #define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ -#define TPI_DEVID_MANCVALID_Pos 10 /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ #define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ -#define TPI_DEVID_PTINVALID_Pos 9 /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ #define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ -#define TPI_DEVID_MinBufSz_Pos 6 /*!< TPI DEVID: MinBufSz Position */ +#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ #define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ -#define TPI_DEVID_AsynClkIn_Pos 5 /*!< TPI DEVID: AsynClkIn Position */ +#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ #define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ -#define TPI_DEVID_NrTraceInput_Pos 0 /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ #define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ /* TPI DEVTYPE Register Definitions */ -#define TPI_DEVTYPE_MajorType_Pos 4 /*!< TPI DEVTYPE: MajorType Position */ -#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ - -#define TPI_DEVTYPE_SubType_Pos 0 /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ #define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + /*@}*/ /* end of group CMSIS_TPI */ -#if (__MPU_PRESENT == 1) -/** \ingroup CMSIS_core_register - \defgroup CMSIS_MPU Memory Protection Unit (MPU) - \brief Type definitions for the Memory Protection Unit (MPU) +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) @{ */ -/** \brief Structure type to access the Memory Protection Unit (MPU). +/** + \brief Structure type to access the Memory Protection Unit (MPU). */ typedef struct { - __I uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IO uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IO uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IO uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IO uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ - __IO uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ - __IO uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ - __IO uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ - __IO uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ - __IO uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ - __IO uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ + __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ + __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ + __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ } MPU_Type; -/* MPU Type Register */ -#define MPU_TYPE_IREGION_Pos 16 /*!< MPU TYPE: IREGION Position */ +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ #define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ -#define MPU_TYPE_DREGION_Pos 8 /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ #define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ -#define MPU_TYPE_SEPARATE_Pos 0 /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ #define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ -/* MPU Control Register */ -#define MPU_CTRL_PRIVDEFENA_Pos 2 /*!< MPU CTRL: PRIVDEFENA Position */ +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ #define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ -#define MPU_CTRL_HFNMIENA_Pos 1 /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ #define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ -#define MPU_CTRL_ENABLE_Pos 0 /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ #define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ -/* MPU Region Number Register */ -#define MPU_RNR_REGION_Pos 0 /*!< MPU RNR: REGION Position */ +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ #define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ -/* MPU Region Base Address Register */ -#define MPU_RBAR_ADDR_Pos 5 /*!< MPU RBAR: ADDR Position */ +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ #define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ -#define MPU_RBAR_VALID_Pos 4 /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ #define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ -#define MPU_RBAR_REGION_Pos 0 /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ #define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ -/* MPU Region Attribute and Size Register */ -#define MPU_RASR_ATTRS_Pos 16 /*!< MPU RASR: MPU Region Attribute field Position */ +/* MPU Region Attribute and Size Register Definitions */ +#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ #define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ -#define MPU_RASR_XN_Pos 28 /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ #define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ -#define MPU_RASR_AP_Pos 24 /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ #define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ -#define MPU_RASR_TEX_Pos 19 /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ #define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ -#define MPU_RASR_S_Pos 18 /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ #define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ -#define MPU_RASR_C_Pos 17 /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ #define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ -#define MPU_RASR_B_Pos 16 /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ #define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ -#define MPU_RASR_SRD_Pos 8 /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ #define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ -#define MPU_RASR_SIZE_Pos 1 /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ #define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ -#define MPU_RASR_ENABLE_Pos 0 /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ #define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ /*@} end of group CMSIS_MPU */ #endif -/** \ingroup CMSIS_core_register - \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) - \brief Type definitions for the Core Debug Registers +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers @{ */ -/** \brief Structure type to access the Core Debug Register (CoreDebug). +/** + \brief Structure type to access the Core Debug Register (CoreDebug). */ typedef struct { - __IO uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __O uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IO uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IO uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ } CoreDebug_Type; -/* Debug Halting Control and Status Register */ -#define CoreDebug_DHCSR_DBGKEY_Pos 16 /*!< CoreDebug DHCSR: DBGKEY Position */ +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ #define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ -#define CoreDebug_DHCSR_S_RESET_ST_Pos 25 /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ #define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ -#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24 /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ #define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ -#define CoreDebug_DHCSR_S_LOCKUP_Pos 19 /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ #define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ -#define CoreDebug_DHCSR_S_SLEEP_Pos 18 /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ #define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ -#define CoreDebug_DHCSR_S_HALT_Pos 17 /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ #define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ -#define CoreDebug_DHCSR_S_REGRDY_Pos 16 /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ #define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ -#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5 /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ #define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ -#define CoreDebug_DHCSR_C_MASKINTS_Pos 3 /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ #define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ -#define CoreDebug_DHCSR_C_STEP_Pos 2 /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ #define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ -#define CoreDebug_DHCSR_C_HALT_Pos 1 /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ #define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ -#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0 /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ #define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ -/* Debug Core Register Selector Register */ -#define CoreDebug_DCRSR_REGWnR_Pos 16 /*!< CoreDebug DCRSR: REGWnR Position */ +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ #define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ -#define CoreDebug_DCRSR_REGSEL_Pos 0 /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ #define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ -/* Debug Exception and Monitor Control Register */ -#define CoreDebug_DEMCR_TRCENA_Pos 24 /*!< CoreDebug DEMCR: TRCENA Position */ +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ #define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ -#define CoreDebug_DEMCR_MON_REQ_Pos 19 /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ #define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ -#define CoreDebug_DEMCR_MON_STEP_Pos 18 /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ #define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ -#define CoreDebug_DEMCR_MON_PEND_Pos 17 /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ #define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ -#define CoreDebug_DEMCR_MON_EN_Pos 16 /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ #define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ -#define CoreDebug_DEMCR_VC_HARDERR_Pos 10 /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ #define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ -#define CoreDebug_DEMCR_VC_INTERR_Pos 9 /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ #define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ -#define CoreDebug_DEMCR_VC_BUSERR_Pos 8 /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ #define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ -#define CoreDebug_DEMCR_VC_STATERR_Pos 7 /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ #define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ -#define CoreDebug_DEMCR_VC_CHKERR_Pos 6 /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ #define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ -#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5 /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ #define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ -#define CoreDebug_DEMCR_VC_MMERR_Pos 4 /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ #define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ -#define CoreDebug_DEMCR_VC_CORERESET_Pos 0 /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ #define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ /*@} end of group CMSIS_CoreDebug */ -/** \ingroup CMSIS_core_register - \defgroup CMSIS_core_base Core Definitions - \brief Definitions for base addresses, unions, and structures. +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. @{ */ -/* Memory mapping of Cortex-M3 Hardware */ -#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ -#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ -#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ -#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ -#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ -#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ -#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ -#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ +#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ +#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ +#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ #define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ -#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ -#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ -#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ -#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ -#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ -#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ -#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ - -#if (__MPU_PRESENT == 1) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ +#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ +#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ +#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ +#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ #endif /*@} */ @@ -1307,187 +1395,274 @@ typedef struct - Core Debug Functions - Core Register Access Functions ******************************************************************************/ -/** \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference */ /* ########################## NVIC functions #################################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_NVICFunctions NVIC Functions - \brief Functions that manage interrupts and exceptions via the NVIC. - @{ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ */ -/** \brief Set Priority Grouping +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 - The function sets the priority grouping field using the required unlock sequence. - The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. - Only values from 0..7 are used. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - \param [in] PriorityGroup Priority grouping field. +/* The following EXC_RETURN values are saved the LR on exception entry */ +#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ +#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ +#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ + + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. */ -__STATIC_INLINE void NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) { uint32_t reg_value; uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ reg_value = (reg_value | ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << 8) ); /* Insert write key and priorty group */ + (PriorityGroupTmp << 8U) ); /* Insert write key and priorty group */ SCB->AIRCR = reg_value; } -/** \brief Get Priority Grouping - - The function reads the priority grouping field from the NVIC Interrupt Controller. - - \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). */ -__STATIC_INLINE uint32_t NVIC_GetPriorityGrouping(void) +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) { return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); } -/** \brief Enable External Interrupt - - The function enables a device-specific interrupt in the NVIC interrupt controller. - - \param [in] IRQn External interrupt number. Value cannot be negative. +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. */ -__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) { - NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } } -/** \brief Disable External Interrupt - - The function disables a device-specific interrupt in the NVIC interrupt controller. - - \param [in] IRQn External interrupt number. Value cannot be negative. +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. */ -__STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) { - NVIC->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } } -/** \brief Get Pending Interrupt - - The function reads the pending register in the NVIC and returns the pending bit - for the specified interrupt. - - \param [in] IRQn Interrupt number. - - \return 0 Interrupt status is not pending. - \return 1 Interrupt status is pending. +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. */ -__STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) { - return((uint32_t)(((NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } } -/** \brief Set Pending Interrupt - - The function sets the pending bit of an external interrupt. - - \param [in] IRQn Interrupt number. Value cannot be negative. +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. */ -__STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) { - NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } } -/** \brief Clear Pending Interrupt - - The function clears the pending bit of an external interrupt. - - \param [in] IRQn External interrupt number. Value cannot be negative. +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. */ -__STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) { - NVIC->ICPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } } -/** \brief Get Active Interrupt - - The function reads the active register in NVIC and returns the active bit. - - \param [in] IRQn Interrupt number. - - \return 0 Interrupt status is not active. - \return 1 Interrupt status is active. +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. */ -__STATIC_INLINE uint32_t NVIC_GetActive(IRQn_Type IRQn) +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) { - return((uint32_t)(((NVIC->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } } -/** \brief Set Interrupt Priority - - The function sets the priority of an interrupt. - - \note The priority cannot be set for every core interrupt. - - \param [in] IRQn Interrupt number. - \param [in] priority Priority to set. +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. */ -__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) { - if((int32_t)IRQn < 0) { - SCB->SHP[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8 - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); } - else { - NVIC->IP[((uint32_t)(int32_t)IRQn)] = (uint8_t)((priority << (8 - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + else + { + return(0U); } } -/** \brief Get Interrupt Priority - - The function reads the priority of an interrupt. The interrupt - number can be positive to specify an external (device specific) - interrupt, or negative to specify an internal (core) interrupt. +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} - \param [in] IRQn Interrupt number. - \return Interrupt Priority. Value is aligned automatically to the implemented - priority bits of the microcontroller. +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. */ -__STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) { - if((int32_t)IRQn < 0) { - return(((uint32_t)SCB->SHP[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] >> (8 - __NVIC_PRIO_BITS))); + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IP[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); } - else { - return(((uint32_t)NVIC->IP[((uint32_t)(int32_t)IRQn)] >> (8 - __NVIC_PRIO_BITS))); + else + { + return(((uint32_t)SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); } } -/** \brief Encode Priority - - The function encodes the priority for an interrupt with the given priority group, - preemptive priority value, and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. - - \param [in] PriorityGroup Used priority group. - \param [in] PreemptPriority Preemptive priority value (starting from 0). - \param [in] SubPriority Subpriority value (starting from 0). - \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). */ __STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) { @@ -1505,19 +1680,18 @@ __STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t P } -/** \brief Decode Priority - - The function decodes an interrupt priority value with a given priority group to - preemptive priority value and subpriority value. - In case of a conflict between priority grouping and available - priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. - - \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). - \param [in] PriorityGroup Used priority group. - \param [out] pPreemptPriority Preemptive priority value (starting from 0). - \param [out] pSubPriority Subpriority value (starting from 0). +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority) +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) { uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ uint32_t PreemptPriorityBits; @@ -1531,11 +1705,42 @@ __STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGr } -/** \brief System Reset +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} - The function initiates a system reset request to reset the MCU. + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function */ -__STATIC_INLINE void NVIC_SystemReset(void) +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) { __DSB(); /* Ensure all outstanding memory accesses included buffered write are completed before reset */ @@ -1543,40 +1748,69 @@ __STATIC_INLINE void NVIC_SystemReset(void) (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ __DSB(); /* Ensure completion of memory access */ - while(1) { __NOP(); } /* wait until reset */ + + for(;;) /* wait until reset */ + { + __NOP(); + } } /*@} end of CMSIS_Core_NVICFunctions */ - -/* ################################## SysTick function ############################################ */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_SysTickFunctions SysTick Functions - \brief Functions that configure the System. +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. @{ */ -#if (__Vendor_SysTickConfig == 0) +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + -/** \brief System Tick Configuration +/*@} end of CMSIS_Core_FpuFunctions */ - The function initializes the System Timer and its interrupt, and starts the System Tick Timer. - Counter is in free running mode to generate periodic interrupts. - \param [in] ticks Number of ticks between two interrupts. - \return 0 Function succeeded. - \return 1 Function failed. +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ - \note When the variable __Vendor_SysTickConfig is set to 1, then the - function SysTick_Config is not included. In this case, the file device.h - must contain a vendor-specific implementation of this function. +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. */ __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) { - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) { return (1UL); } /* Reload value impossible */ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ @@ -1594,49 +1828,52 @@ __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) /* ##################################### Debug In/Output function ########################################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_core_DebugFunctions ITM Functions - \brief Functions that access the ITM debug interface. +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. @{ */ -extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ -#define ITM_RXBUFFER_EMPTY 0x5AA55AA5 /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - - -/** \brief ITM Send Character - - The function transmits a character via the ITM channel 0, and - \li Just returns when no debugger is connected that has booked the output. - \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ - \param [in] ch Character to transmit. - \returns Character to transmit. +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. */ __STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) { if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ { - while (ITM->PORT[0].u32 == 0UL) { __NOP(); } - ITM->PORT[0].u8 = (uint8_t)ch; + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; } return (ch); } -/** \brief ITM Receive Character - - The function inputs a character via the external variable \ref ITM_RxBuffer. - - \return Received character. - \return -1 No character pending. +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) { +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ int32_t ch = -1; /* no character available */ - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) { + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { ch = ITM_RxBuffer; ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ } @@ -1645,19 +1882,22 @@ __STATIC_INLINE int32_t ITM_ReceiveChar (void) { } -/** \brief ITM Check Character - - The function checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. - - \return 0 No character available. - \return 1 Character available. +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. */ -__STATIC_INLINE int32_t ITM_CheckChar (void) { +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) { - return (0); /* no character available */ - } else { - return (1); /* character available */ + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ } } diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/mpu_armv7.h b/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/mpu_armv7.h new file mode 100644 index 00000000..01422033 --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/mpu_armv7.h @@ -0,0 +1,270 @@ +/****************************************************************************** + * @file mpu_armv7.h + * @brief CMSIS MPU API for Armv7-M MPU + * @version V5.0.4 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2017-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef ARM_MPU_ARMV7_H +#define ARM_MPU_ARMV7_H + +#define ARM_MPU_REGION_SIZE_32B ((uint8_t)0x04U) ///!< MPU Region Size 32 Bytes +#define ARM_MPU_REGION_SIZE_64B ((uint8_t)0x05U) ///!< MPU Region Size 64 Bytes +#define ARM_MPU_REGION_SIZE_128B ((uint8_t)0x06U) ///!< MPU Region Size 128 Bytes +#define ARM_MPU_REGION_SIZE_256B ((uint8_t)0x07U) ///!< MPU Region Size 256 Bytes +#define ARM_MPU_REGION_SIZE_512B ((uint8_t)0x08U) ///!< MPU Region Size 512 Bytes +#define ARM_MPU_REGION_SIZE_1KB ((uint8_t)0x09U) ///!< MPU Region Size 1 KByte +#define ARM_MPU_REGION_SIZE_2KB ((uint8_t)0x0AU) ///!< MPU Region Size 2 KBytes +#define ARM_MPU_REGION_SIZE_4KB ((uint8_t)0x0BU) ///!< MPU Region Size 4 KBytes +#define ARM_MPU_REGION_SIZE_8KB ((uint8_t)0x0CU) ///!< MPU Region Size 8 KBytes +#define ARM_MPU_REGION_SIZE_16KB ((uint8_t)0x0DU) ///!< MPU Region Size 16 KBytes +#define ARM_MPU_REGION_SIZE_32KB ((uint8_t)0x0EU) ///!< MPU Region Size 32 KBytes +#define ARM_MPU_REGION_SIZE_64KB ((uint8_t)0x0FU) ///!< MPU Region Size 64 KBytes +#define ARM_MPU_REGION_SIZE_128KB ((uint8_t)0x10U) ///!< MPU Region Size 128 KBytes +#define ARM_MPU_REGION_SIZE_256KB ((uint8_t)0x11U) ///!< MPU Region Size 256 KBytes +#define ARM_MPU_REGION_SIZE_512KB ((uint8_t)0x12U) ///!< MPU Region Size 512 KBytes +#define ARM_MPU_REGION_SIZE_1MB ((uint8_t)0x13U) ///!< MPU Region Size 1 MByte +#define ARM_MPU_REGION_SIZE_2MB ((uint8_t)0x14U) ///!< MPU Region Size 2 MBytes +#define ARM_MPU_REGION_SIZE_4MB ((uint8_t)0x15U) ///!< MPU Region Size 4 MBytes +#define ARM_MPU_REGION_SIZE_8MB ((uint8_t)0x16U) ///!< MPU Region Size 8 MBytes +#define ARM_MPU_REGION_SIZE_16MB ((uint8_t)0x17U) ///!< MPU Region Size 16 MBytes +#define ARM_MPU_REGION_SIZE_32MB ((uint8_t)0x18U) ///!< MPU Region Size 32 MBytes +#define ARM_MPU_REGION_SIZE_64MB ((uint8_t)0x19U) ///!< MPU Region Size 64 MBytes +#define ARM_MPU_REGION_SIZE_128MB ((uint8_t)0x1AU) ///!< MPU Region Size 128 MBytes +#define ARM_MPU_REGION_SIZE_256MB ((uint8_t)0x1BU) ///!< MPU Region Size 256 MBytes +#define ARM_MPU_REGION_SIZE_512MB ((uint8_t)0x1CU) ///!< MPU Region Size 512 MBytes +#define ARM_MPU_REGION_SIZE_1GB ((uint8_t)0x1DU) ///!< MPU Region Size 1 GByte +#define ARM_MPU_REGION_SIZE_2GB ((uint8_t)0x1EU) ///!< MPU Region Size 2 GBytes +#define ARM_MPU_REGION_SIZE_4GB ((uint8_t)0x1FU) ///!< MPU Region Size 4 GBytes + +#define ARM_MPU_AP_NONE 0U ///!< MPU Access Permission no access +#define ARM_MPU_AP_PRIV 1U ///!< MPU Access Permission privileged access only +#define ARM_MPU_AP_URO 2U ///!< MPU Access Permission unprivileged access read-only +#define ARM_MPU_AP_FULL 3U ///!< MPU Access Permission full access +#define ARM_MPU_AP_PRO 5U ///!< MPU Access Permission privileged access read-only +#define ARM_MPU_AP_RO 6U ///!< MPU Access Permission read-only access + +/** MPU Region Base Address Register Value +* +* \param Region The region to be configured, number 0 to 15. +* \param BaseAddress The base address for the region. +*/ +#define ARM_MPU_RBAR(Region, BaseAddress) \ + (((BaseAddress) & MPU_RBAR_ADDR_Msk) | \ + ((Region) & MPU_RBAR_REGION_Msk) | \ + (MPU_RBAR_VALID_Msk)) + +/** +* MPU Memory Access Attributes +* +* \param TypeExtField Type extension field, allows you to configure memory access type, for example strongly ordered, peripheral. +* \param IsShareable Region is shareable between multiple bus masters. +* \param IsCacheable Region is cacheable, i.e. its value may be kept in cache. +* \param IsBufferable Region is bufferable, i.e. using write-back caching. Cacheable but non-bufferable regions use write-through policy. +*/ +#define ARM_MPU_ACCESS_(TypeExtField, IsShareable, IsCacheable, IsBufferable) \ + ((((TypeExtField ) << MPU_RASR_TEX_Pos) & MPU_RASR_TEX_Msk) | \ + (((IsShareable ) << MPU_RASR_S_Pos) & MPU_RASR_S_Msk) | \ + (((IsCacheable ) << MPU_RASR_C_Pos) & MPU_RASR_C_Msk) | \ + (((IsBufferable ) << MPU_RASR_B_Pos) & MPU_RASR_B_Msk)) + +/** +* MPU Region Attribute and Size Register Value +* +* \param DisableExec Instruction access disable bit, 1= disable instruction fetches. +* \param AccessPermission Data access permissions, allows you to configure read/write access for User and Privileged mode. +* \param AccessAttributes Memory access attribution, see \ref ARM_MPU_ACCESS_. +* \param SubRegionDisable Sub-region disable field. +* \param Size Region size of the region to be configured, for example 4K, 8K. +*/ +#define ARM_MPU_RASR_EX(DisableExec, AccessPermission, AccessAttributes, SubRegionDisable, Size) \ + ((((DisableExec ) << MPU_RASR_XN_Pos) & MPU_RASR_XN_Msk) | \ + (((AccessPermission) << MPU_RASR_AP_Pos) & MPU_RASR_AP_Msk) | \ + (((AccessAttributes) ) & (MPU_RASR_TEX_Msk | MPU_RASR_S_Msk | MPU_RASR_C_Msk | MPU_RASR_B_Msk))) + +/** +* MPU Region Attribute and Size Register Value +* +* \param DisableExec Instruction access disable bit, 1= disable instruction fetches. +* \param AccessPermission Data access permissions, allows you to configure read/write access for User and Privileged mode. +* \param TypeExtField Type extension field, allows you to configure memory access type, for example strongly ordered, peripheral. +* \param IsShareable Region is shareable between multiple bus masters. +* \param IsCacheable Region is cacheable, i.e. its value may be kept in cache. +* \param IsBufferable Region is bufferable, i.e. using write-back caching. Cacheable but non-bufferable regions use write-through policy. +* \param SubRegionDisable Sub-region disable field. +* \param Size Region size of the region to be configured, for example 4K, 8K. +*/ +#define ARM_MPU_RASR(DisableExec, AccessPermission, TypeExtField, IsShareable, IsCacheable, IsBufferable, SubRegionDisable, Size) \ + ARM_MPU_RASR_EX(DisableExec, AccessPermission, ARM_MPU_ACCESS_(TypeExtField, IsShareable, IsCacheable, IsBufferable), SubRegionDisable, Size) + +/** +* MPU Memory Access Attribute for strongly ordered memory. +* - TEX: 000b +* - Shareable +* - Non-cacheable +* - Non-bufferable +*/ +#define ARM_MPU_ACCESS_ORDERED ARM_MPU_ACCESS_(0U, 1U, 0U, 0U) + +/** +* MPU Memory Access Attribute for device memory. +* - TEX: 000b (if non-shareable) or 010b (if shareable) +* - Shareable or non-shareable +* - Non-cacheable +* - Bufferable (if shareable) or non-bufferable (if non-shareable) +* +* \param IsShareable Configures the device memory as shareable or non-shareable. +*/ +#define ARM_MPU_ACCESS_DEVICE(IsShareable) ((IsShareable) ? ARM_MPU_ACCESS_(0U, 1U, 0U, 1U) : ARM_MPU_ACCESS_(2U, 0U, 0U, 0U)) + +/** +* MPU Memory Access Attribute for normal memory. +* - TEX: 1BBb (reflecting outer cacheability rules) +* - Shareable or non-shareable +* - Cacheable or non-cacheable (reflecting inner cacheability rules) +* - Bufferable or non-bufferable (reflecting inner cacheability rules) +* +* \param OuterCp Configures the outer cache policy. +* \param InnerCp Configures the inner cache policy. +* \param IsShareable Configures the memory as shareable or non-shareable. +*/ +#define ARM_MPU_ACCESS_NORMAL(OuterCp, InnerCp, IsShareable) ARM_MPU_ACCESS_((4U | (OuterCp)), IsShareable, ((InnerCp) & 2U), ((InnerCp) & 1U)) + +/** +* MPU Memory Access Attribute non-cacheable policy. +*/ +#define ARM_MPU_CACHEP_NOCACHE 0U + +/** +* MPU Memory Access Attribute write-back, write and read allocate policy. +*/ +#define ARM_MPU_CACHEP_WB_WRA 1U + +/** +* MPU Memory Access Attribute write-through, no write allocate policy. +*/ +#define ARM_MPU_CACHEP_WT_NWA 2U + +/** +* MPU Memory Access Attribute write-back, no write allocate policy. +*/ +#define ARM_MPU_CACHEP_WB_NWA 3U + + +/** +* Struct for a single MPU Region +*/ +typedef struct { + uint32_t RBAR; //!< The region base address register value (RBAR) + uint32_t RASR; //!< The region attribute and size register value (RASR) \ref MPU_RASR +} ARM_MPU_Region_t; + +/** Enable the MPU. +* \param MPU_Control Default access permissions for unconfigured regions. +*/ +__STATIC_INLINE void ARM_MPU_Enable(uint32_t MPU_Control) +{ + __DSB(); + __ISB(); + MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; +#endif +} + +/** Disable the MPU. +*/ +__STATIC_INLINE void ARM_MPU_Disable(void) +{ + __DSB(); + __ISB(); +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; +#endif + MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk; +} + +/** Clear and disable the given MPU region. +* \param rnr Region number to be cleared. +*/ +__STATIC_INLINE void ARM_MPU_ClrRegion(uint32_t rnr) +{ + MPU->RNR = rnr; + MPU->RASR = 0U; +} + +/** Configure an MPU region. +* \param rbar Value for RBAR register. +* \param rsar Value for RSAR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegion(uint32_t rbar, uint32_t rasr) +{ + MPU->RBAR = rbar; + MPU->RASR = rasr; +} + +/** Configure the given MPU region. +* \param rnr Region number to be configured. +* \param rbar Value for RBAR register. +* \param rsar Value for RSAR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegionEx(uint32_t rnr, uint32_t rbar, uint32_t rasr) +{ + MPU->RNR = rnr; + MPU->RBAR = rbar; + MPU->RASR = rasr; +} + +/** Memcopy with strictly ordered memory access, e.g. for register targets. +* \param dst Destination data is copied to. +* \param src Source data is copied from. +* \param len Amount of data words to be copied. +*/ +__STATIC_INLINE void orderedCpy(volatile uint32_t* dst, const uint32_t* __RESTRICT src, uint32_t len) +{ + uint32_t i; + for (i = 0U; i < len; ++i) + { + dst[i] = src[i]; + } +} + +/** Load the given number of MPU regions from a table. +* \param table Pointer to the MPU configuration table. +* \param cnt Amount of regions to be configured. +*/ +__STATIC_INLINE void ARM_MPU_Load(ARM_MPU_Region_t const* table, uint32_t cnt) +{ + const uint32_t rowWordSize = sizeof(ARM_MPU_Region_t)/4U; + while (cnt > MPU_TYPE_RALIASES) { + orderedCpy(&(MPU->RBAR), &(table->RBAR), MPU_TYPE_RALIASES*rowWordSize); + table += MPU_TYPE_RALIASES; + cnt -= MPU_TYPE_RALIASES; + } + orderedCpy(&(MPU->RBAR), &(table->RBAR), cnt*rowWordSize); +} + +#endif diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/mpu_armv8.h b/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/mpu_armv8.h new file mode 100644 index 00000000..62571da5 --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/mpu_armv8.h @@ -0,0 +1,333 @@ +/****************************************************************************** + * @file mpu_armv8.h + * @brief CMSIS MPU API for Armv8-M MPU + * @version V5.0.4 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2017-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef ARM_MPU_ARMV8_H +#define ARM_MPU_ARMV8_H + +/** \brief Attribute for device memory (outer only) */ +#define ARM_MPU_ATTR_DEVICE ( 0U ) + +/** \brief Attribute for non-cacheable, normal memory */ +#define ARM_MPU_ATTR_NON_CACHEABLE ( 4U ) + +/** \brief Attribute for normal memory (outer and inner) +* \param NT Non-Transient: Set to 1 for non-transient data. +* \param WB Write-Back: Set to 1 to use write-back update policy. +* \param RA Read Allocation: Set to 1 to use cache allocation on read miss. +* \param WA Write Allocation: Set to 1 to use cache allocation on write miss. +*/ +#define ARM_MPU_ATTR_MEMORY_(NT, WB, RA, WA) \ + (((NT & 1U) << 3U) | ((WB & 1U) << 2U) | ((RA & 1U) << 1U) | (WA & 1U)) + +/** \brief Device memory type non Gathering, non Re-ordering, non Early Write Acknowledgement */ +#define ARM_MPU_ATTR_DEVICE_nGnRnE (0U) + +/** \brief Device memory type non Gathering, non Re-ordering, Early Write Acknowledgement */ +#define ARM_MPU_ATTR_DEVICE_nGnRE (1U) + +/** \brief Device memory type non Gathering, Re-ordering, Early Write Acknowledgement */ +#define ARM_MPU_ATTR_DEVICE_nGRE (2U) + +/** \brief Device memory type Gathering, Re-ordering, Early Write Acknowledgement */ +#define ARM_MPU_ATTR_DEVICE_GRE (3U) + +/** \brief Memory Attribute +* \param O Outer memory attributes +* \param I O == ARM_MPU_ATTR_DEVICE: Device memory attributes, else: Inner memory attributes +*/ +#define ARM_MPU_ATTR(O, I) (((O & 0xFU) << 4U) | (((O & 0xFU) != 0U) ? (I & 0xFU) : ((I & 0x3U) << 2U))) + +/** \brief Normal memory non-shareable */ +#define ARM_MPU_SH_NON (0U) + +/** \brief Normal memory outer shareable */ +#define ARM_MPU_SH_OUTER (2U) + +/** \brief Normal memory inner shareable */ +#define ARM_MPU_SH_INNER (3U) + +/** \brief Memory access permissions +* \param RO Read-Only: Set to 1 for read-only memory. +* \param NP Non-Privileged: Set to 1 for non-privileged memory. +*/ +#define ARM_MPU_AP_(RO, NP) (((RO & 1U) << 1U) | (NP & 1U)) + +/** \brief Region Base Address Register value +* \param BASE The base address bits [31:5] of a memory region. The value is zero extended. Effective address gets 32 byte aligned. +* \param SH Defines the Shareability domain for this memory region. +* \param RO Read-Only: Set to 1 for a read-only memory region. +* \param NP Non-Privileged: Set to 1 for a non-privileged memory region. +* \oaram XN eXecute Never: Set to 1 for a non-executable memory region. +*/ +#define ARM_MPU_RBAR(BASE, SH, RO, NP, XN) \ + ((BASE & MPU_RBAR_BASE_Msk) | \ + ((SH << MPU_RBAR_SH_Pos) & MPU_RBAR_SH_Msk) | \ + ((ARM_MPU_AP_(RO, NP) << MPU_RBAR_AP_Pos) & MPU_RBAR_AP_Msk) | \ + ((XN << MPU_RBAR_XN_Pos) & MPU_RBAR_XN_Msk)) + +/** \brief Region Limit Address Register value +* \param LIMIT The limit address bits [31:5] for this memory region. The value is one extended. +* \param IDX The attribute index to be associated with this memory region. +*/ +#define ARM_MPU_RLAR(LIMIT, IDX) \ + ((LIMIT & MPU_RLAR_LIMIT_Msk) | \ + ((IDX << MPU_RLAR_AttrIndx_Pos) & MPU_RLAR_AttrIndx_Msk) | \ + (MPU_RLAR_EN_Msk)) + +/** +* Struct for a single MPU Region +*/ +typedef struct { + uint32_t RBAR; /*!< Region Base Address Register value */ + uint32_t RLAR; /*!< Region Limit Address Register value */ +} ARM_MPU_Region_t; + +/** Enable the MPU. +* \param MPU_Control Default access permissions for unconfigured regions. +*/ +__STATIC_INLINE void ARM_MPU_Enable(uint32_t MPU_Control) +{ + __DSB(); + __ISB(); + MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; +#endif +} + +/** Disable the MPU. +*/ +__STATIC_INLINE void ARM_MPU_Disable(void) +{ + __DSB(); + __ISB(); +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; +#endif + MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk; +} + +#ifdef MPU_NS +/** Enable the Non-secure MPU. +* \param MPU_Control Default access permissions for unconfigured regions. +*/ +__STATIC_INLINE void ARM_MPU_Enable_NS(uint32_t MPU_Control) +{ + __DSB(); + __ISB(); + MPU_NS->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB_NS->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; +#endif +} + +/** Disable the Non-secure MPU. +*/ +__STATIC_INLINE void ARM_MPU_Disable_NS(void) +{ + __DSB(); + __ISB(); +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB_NS->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; +#endif + MPU_NS->CTRL &= ~MPU_CTRL_ENABLE_Msk; +} +#endif + +/** Set the memory attribute encoding to the given MPU. +* \param mpu Pointer to the MPU to be configured. +* \param idx The attribute index to be set [0-7] +* \param attr The attribute value to be set. +*/ +__STATIC_INLINE void ARM_MPU_SetMemAttrEx(MPU_Type* mpu, uint8_t idx, uint8_t attr) +{ + const uint8_t reg = idx / 4U; + const uint32_t pos = ((idx % 4U) * 8U); + const uint32_t mask = 0xFFU << pos; + + if (reg >= (sizeof(mpu->MAIR) / sizeof(mpu->MAIR[0]))) { + return; // invalid index + } + + mpu->MAIR[reg] = ((mpu->MAIR[reg] & ~mask) | ((attr << pos) & mask)); +} + +/** Set the memory attribute encoding. +* \param idx The attribute index to be set [0-7] +* \param attr The attribute value to be set. +*/ +__STATIC_INLINE void ARM_MPU_SetMemAttr(uint8_t idx, uint8_t attr) +{ + ARM_MPU_SetMemAttrEx(MPU, idx, attr); +} + +#ifdef MPU_NS +/** Set the memory attribute encoding to the Non-secure MPU. +* \param idx The attribute index to be set [0-7] +* \param attr The attribute value to be set. +*/ +__STATIC_INLINE void ARM_MPU_SetMemAttr_NS(uint8_t idx, uint8_t attr) +{ + ARM_MPU_SetMemAttrEx(MPU_NS, idx, attr); +} +#endif + +/** Clear and disable the given MPU region of the given MPU. +* \param mpu Pointer to MPU to be used. +* \param rnr Region number to be cleared. +*/ +__STATIC_INLINE void ARM_MPU_ClrRegionEx(MPU_Type* mpu, uint32_t rnr) +{ + mpu->RNR = rnr; + mpu->RLAR = 0U; +} + +/** Clear and disable the given MPU region. +* \param rnr Region number to be cleared. +*/ +__STATIC_INLINE void ARM_MPU_ClrRegion(uint32_t rnr) +{ + ARM_MPU_ClrRegionEx(MPU, rnr); +} + +#ifdef MPU_NS +/** Clear and disable the given Non-secure MPU region. +* \param rnr Region number to be cleared. +*/ +__STATIC_INLINE void ARM_MPU_ClrRegion_NS(uint32_t rnr) +{ + ARM_MPU_ClrRegionEx(MPU_NS, rnr); +} +#endif + +/** Configure the given MPU region of the given MPU. +* \param mpu Pointer to MPU to be used. +* \param rnr Region number to be configured. +* \param rbar Value for RBAR register. +* \param rlar Value for RLAR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegionEx(MPU_Type* mpu, uint32_t rnr, uint32_t rbar, uint32_t rlar) +{ + mpu->RNR = rnr; + mpu->RBAR = rbar; + mpu->RLAR = rlar; +} + +/** Configure the given MPU region. +* \param rnr Region number to be configured. +* \param rbar Value for RBAR register. +* \param rlar Value for RLAR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegion(uint32_t rnr, uint32_t rbar, uint32_t rlar) +{ + ARM_MPU_SetRegionEx(MPU, rnr, rbar, rlar); +} + +#ifdef MPU_NS +/** Configure the given Non-secure MPU region. +* \param rnr Region number to be configured. +* \param rbar Value for RBAR register. +* \param rlar Value for RLAR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegion_NS(uint32_t rnr, uint32_t rbar, uint32_t rlar) +{ + ARM_MPU_SetRegionEx(MPU_NS, rnr, rbar, rlar); +} +#endif + +/** Memcopy with strictly ordered memory access, e.g. for register targets. +* \param dst Destination data is copied to. +* \param src Source data is copied from. +* \param len Amount of data words to be copied. +*/ +__STATIC_INLINE void orderedCpy(volatile uint32_t* dst, const uint32_t* __RESTRICT src, uint32_t len) +{ + uint32_t i; + for (i = 0U; i < len; ++i) + { + dst[i] = src[i]; + } +} + +/** Load the given number of MPU regions from a table to the given MPU. +* \param mpu Pointer to the MPU registers to be used. +* \param rnr First region number to be configured. +* \param table Pointer to the MPU configuration table. +* \param cnt Amount of regions to be configured. +*/ +__STATIC_INLINE void ARM_MPU_LoadEx(MPU_Type* mpu, uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt) +{ + const uint32_t rowWordSize = sizeof(ARM_MPU_Region_t)/4U; + if (cnt == 1U) { + mpu->RNR = rnr; + orderedCpy(&(mpu->RBAR), &(table->RBAR), rowWordSize); + } else { + uint32_t rnrBase = rnr & ~(MPU_TYPE_RALIASES-1U); + uint32_t rnrOffset = rnr % MPU_TYPE_RALIASES; + + mpu->RNR = rnrBase; + while ((rnrOffset + cnt) > MPU_TYPE_RALIASES) { + uint32_t c = MPU_TYPE_RALIASES - rnrOffset; + orderedCpy(&(mpu->RBAR)+(rnrOffset*2U), &(table->RBAR), c*rowWordSize); + table += c; + cnt -= c; + rnrOffset = 0U; + rnrBase += MPU_TYPE_RALIASES; + mpu->RNR = rnrBase; + } + + orderedCpy(&(mpu->RBAR)+(rnrOffset*2U), &(table->RBAR), cnt*rowWordSize); + } +} + +/** Load the given number of MPU regions from a table. +* \param rnr First region number to be configured. +* \param table Pointer to the MPU configuration table. +* \param cnt Amount of regions to be configured. +*/ +__STATIC_INLINE void ARM_MPU_Load(uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt) +{ + ARM_MPU_LoadEx(MPU, rnr, table, cnt); +} + +#ifdef MPU_NS +/** Load the given number of MPU regions from a table to the Non-secure MPU. +* \param rnr First region number to be configured. +* \param table Pointer to the MPU configuration table. +* \param cnt Amount of regions to be configured. +*/ +__STATIC_INLINE void ARM_MPU_Load_NS(uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt) +{ + ARM_MPU_LoadEx(MPU_NS, rnr, table, cnt); +} +#endif + +#endif + diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/tz_context.h b/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/tz_context.h new file mode 100644 index 00000000..0d09749f --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Core/Include/tz_context.h @@ -0,0 +1,70 @@ +/****************************************************************************** + * @file tz_context.h + * @brief Context Management for Armv8-M TrustZone + * @version V1.0.1 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2017-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef TZ_CONTEXT_H +#define TZ_CONTEXT_H + +#include + +#ifndef TZ_MODULEID_T +#define TZ_MODULEID_T +/// \details Data type that identifies secure software modules called by a process. +typedef uint32_t TZ_ModuleId_t; +#endif + +/// \details TZ Memory ID identifies an allocated memory slot. +typedef uint32_t TZ_MemoryId_t; + +/// Initialize secure context memory system +/// \return execution status (1: success, 0: error) +uint32_t TZ_InitContextSystem_S (void); + +/// Allocate context memory for calling secure software modules in TrustZone +/// \param[in] module identifies software modules called from non-secure mode +/// \return value != 0 id TrustZone memory slot identifier +/// \return value 0 no memory available or internal error +TZ_MemoryId_t TZ_AllocModuleContext_S (TZ_ModuleId_t module); + +/// Free context memory that was previously allocated with \ref TZ_AllocModuleContext_S +/// \param[in] id TrustZone memory slot identifier +/// \return execution status (1: success, 0: error) +uint32_t TZ_FreeModuleContext_S (TZ_MemoryId_t id); + +/// Load secure context (called on RTOS thread context switch) +/// \param[in] id TrustZone memory slot identifier +/// \return execution status (1: success, 0: error) +uint32_t TZ_LoadContext_S (TZ_MemoryId_t id); + +/// Store secure context (called on RTOS thread context switch) +/// \param[in] id TrustZone memory slot identifier +/// \return execution status (1: success, 0: error) +uint32_t TZ_StoreContext_S (TZ_MemoryId_t id); + +#endif // TZ_CONTEXT_H diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Core/Template/ARMv8-M/main_s.c b/STM32CubeMX/revF/Drivers/CMSIS/Core/Template/ARMv8-M/main_s.c new file mode 100644 index 00000000..273607b2 --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Core/Template/ARMv8-M/main_s.c @@ -0,0 +1,58 @@ +/****************************************************************************** + * @file main_s.c + * @brief Code template for secure main function + * @version V1.1.1 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2013-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* Use CMSE intrinsics */ +#include + +#include "RTE_Components.h" +#include CMSIS_device_header + +/* TZ_START_NS: Start address of non-secure application */ +#ifndef TZ_START_NS +#define TZ_START_NS (0x200000U) +#endif + +/* typedef for non-secure callback functions */ +typedef void (*funcptr_void) (void) __attribute__((cmse_nonsecure_call)); + +/* Secure main() */ +int main(void) { + funcptr_void NonSecure_ResetHandler; + + /* Add user setup code for secure part here*/ + + /* Set non-secure main stack (MSP_NS) */ + __TZ_set_MSP_NS(*((uint32_t *)(TZ_START_NS))); + + /* Get non-secure reset handler */ + NonSecure_ResetHandler = (funcptr_void)(*((uint32_t *)((TZ_START_NS) + 4U))); + + /* Start non-secure state software application */ + NonSecure_ResetHandler(); + + /* Non-secure software does not return, this code is not executed */ + while (1) { + __NOP(); + } +} diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Core/Template/ARMv8-M/tz_context.c b/STM32CubeMX/revF/Drivers/CMSIS/Core/Template/ARMv8-M/tz_context.c new file mode 100644 index 00000000..e2e82942 --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Core/Template/ARMv8-M/tz_context.c @@ -0,0 +1,200 @@ +/****************************************************************************** + * @file tz_context.c + * @brief Context Management for Armv8-M TrustZone - Sample implementation + * @version V1.1.1 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2016-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "RTE_Components.h" +#include CMSIS_device_header +#include "tz_context.h" + +/// Number of process slots (threads may call secure library code) +#ifndef TZ_PROCESS_STACK_SLOTS +#define TZ_PROCESS_STACK_SLOTS 8U +#endif + +/// Stack size of the secure library code +#ifndef TZ_PROCESS_STACK_SIZE +#define TZ_PROCESS_STACK_SIZE 256U +#endif + +typedef struct { + uint32_t sp_top; // stack space top + uint32_t sp_limit; // stack space limit + uint32_t sp; // current stack pointer +} stack_info_t; + +static stack_info_t ProcessStackInfo [TZ_PROCESS_STACK_SLOTS]; +static uint64_t ProcessStackMemory[TZ_PROCESS_STACK_SLOTS][TZ_PROCESS_STACK_SIZE/8U]; +static uint32_t ProcessStackFreeSlot = 0xFFFFFFFFU; + + +/// Initialize secure context memory system +/// \return execution status (1: success, 0: error) +__attribute__((cmse_nonsecure_entry)) +uint32_t TZ_InitContextSystem_S (void) { + uint32_t n; + + if (__get_IPSR() == 0U) { + return 0U; // Thread Mode + } + + for (n = 0U; n < TZ_PROCESS_STACK_SLOTS; n++) { + ProcessStackInfo[n].sp = 0U; + ProcessStackInfo[n].sp_limit = (uint32_t)&ProcessStackMemory[n]; + ProcessStackInfo[n].sp_top = (uint32_t)&ProcessStackMemory[n] + TZ_PROCESS_STACK_SIZE; + *((uint32_t *)ProcessStackMemory[n]) = n + 1U; + } + *((uint32_t *)ProcessStackMemory[--n]) = 0xFFFFFFFFU; + + ProcessStackFreeSlot = 0U; + + // Default process stack pointer and stack limit + __set_PSPLIM((uint32_t)ProcessStackMemory); + __set_PSP ((uint32_t)ProcessStackMemory); + + // Privileged Thread Mode using PSP + __set_CONTROL(0x02U); + + return 1U; // Success +} + + +/// Allocate context memory for calling secure software modules in TrustZone +/// \param[in] module identifies software modules called from non-secure mode +/// \return value != 0 id TrustZone memory slot identifier +/// \return value 0 no memory available or internal error +__attribute__((cmse_nonsecure_entry)) +TZ_MemoryId_t TZ_AllocModuleContext_S (TZ_ModuleId_t module) { + uint32_t slot; + + (void)module; // Ignore (fixed Stack size) + + if (__get_IPSR() == 0U) { + return 0U; // Thread Mode + } + + if (ProcessStackFreeSlot == 0xFFFFFFFFU) { + return 0U; // No slot available + } + + slot = ProcessStackFreeSlot; + ProcessStackFreeSlot = *((uint32_t *)ProcessStackMemory[slot]); + + ProcessStackInfo[slot].sp = ProcessStackInfo[slot].sp_top; + + return (slot + 1U); +} + + +/// Free context memory that was previously allocated with \ref TZ_AllocModuleContext_S +/// \param[in] id TrustZone memory slot identifier +/// \return execution status (1: success, 0: error) +__attribute__((cmse_nonsecure_entry)) +uint32_t TZ_FreeModuleContext_S (TZ_MemoryId_t id) { + uint32_t slot; + + if (__get_IPSR() == 0U) { + return 0U; // Thread Mode + } + + if ((id == 0U) || (id > TZ_PROCESS_STACK_SLOTS)) { + return 0U; // Invalid ID + } + + slot = id - 1U; + + if (ProcessStackInfo[slot].sp == 0U) { + return 0U; // Inactive slot + } + ProcessStackInfo[slot].sp = 0U; + + *((uint32_t *)ProcessStackMemory[slot]) = ProcessStackFreeSlot; + ProcessStackFreeSlot = slot; + + return 1U; // Success +} + + +/// Load secure context (called on RTOS thread context switch) +/// \param[in] id TrustZone memory slot identifier +/// \return execution status (1: success, 0: error) +__attribute__((cmse_nonsecure_entry)) +uint32_t TZ_LoadContext_S (TZ_MemoryId_t id) { + uint32_t slot; + + if ((__get_IPSR() == 0U) || ((__get_CONTROL() & 2U) == 0U)) { + return 0U; // Thread Mode or using Main Stack for threads + } + + if ((id == 0U) || (id > TZ_PROCESS_STACK_SLOTS)) { + return 0U; // Invalid ID + } + + slot = id - 1U; + + if (ProcessStackInfo[slot].sp == 0U) { + return 0U; // Inactive slot + } + + // Setup process stack pointer and stack limit + __set_PSPLIM(ProcessStackInfo[slot].sp_limit); + __set_PSP (ProcessStackInfo[slot].sp); + + return 1U; // Success +} + + +/// Store secure context (called on RTOS thread context switch) +/// \param[in] id TrustZone memory slot identifier +/// \return execution status (1: success, 0: error) +__attribute__((cmse_nonsecure_entry)) +uint32_t TZ_StoreContext_S (TZ_MemoryId_t id) { + uint32_t slot; + uint32_t sp; + + if ((__get_IPSR() == 0U) || ((__get_CONTROL() & 2U) == 0U)) { + return 0U; // Thread Mode or using Main Stack for threads + } + + if ((id == 0U) || (id > TZ_PROCESS_STACK_SLOTS)) { + return 0U; // Invalid ID + } + + slot = id - 1U; + + if (ProcessStackInfo[slot].sp == 0U) { + return 0U; // Inactive slot + } + + sp = __get_PSP(); + if ((sp < ProcessStackInfo[slot].sp_limit) || + (sp > ProcessStackInfo[slot].sp_top)) { + return 0U; // SP out of range + } + ProcessStackInfo[slot].sp = sp; + + // Default process stack pointer and stack limit + __set_PSPLIM((uint32_t)ProcessStackMemory); + __set_PSP ((uint32_t)ProcessStackMemory); + + return 1U; // Success +} diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Core_A/Include/cmsis_armcc.h b/STM32CubeMX/revF/Drivers/CMSIS/Core_A/Include/cmsis_armcc.h new file mode 100644 index 00000000..313d7435 --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Core_A/Include/cmsis_armcc.h @@ -0,0 +1,544 @@ +/**************************************************************************//** + * @file cmsis_armcc.h + * @brief CMSIS compiler specific macros, functions, instructions + * @version V1.0.2 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CMSIS_ARMCC_H +#define __CMSIS_ARMCC_H + +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 400677) + #error "Please use Arm Compiler Toolchain V4.0.677 or later!" +#endif + +/* CMSIS compiler control architecture macros */ +#if (defined (__TARGET_ARCH_7_A ) && (__TARGET_ARCH_7_A == 1)) + #define __ARM_ARCH_7A__ 1 +#endif + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM __asm +#endif +#ifndef __INLINE + #define __INLINE __inline +#endif +#ifndef __FORCEINLINE + #define __FORCEINLINE __forceinline +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static __inline +#endif +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE static __forceinline +#endif +#ifndef __NO_RETURN + #define __NO_RETURN __declspec(noreturn) +#endif +#ifndef CMSIS_DEPRECATED + #define CMSIS_DEPRECATED __attribute__((deprecated)) +#endif +#ifndef __USED + #define __USED __attribute__((used)) +#endif +#ifndef __WEAK + #define __WEAK __attribute__((weak)) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed)) +#endif +#ifndef __PACKED_STRUCT + #define __PACKED_STRUCT __packed struct +#endif +#ifndef __UNALIGNED_UINT16_WRITE + #define __UNALIGNED_UINT16_WRITE(addr, val) ((*((__packed uint16_t *)(addr))) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ + #define __UNALIGNED_UINT16_READ(addr) (*((const __packed uint16_t *)(addr))) +#endif +#ifndef __UNALIGNED_UINT32_WRITE + #define __UNALIGNED_UINT32_WRITE(addr, val) ((*((__packed uint32_t *)(addr))) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #define __UNALIGNED_UINT32_READ(addr) (*((const __packed uint32_t *)(addr))) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed)) +#endif + +/* ########################## Core Instruction Access ######################### */ +/** + \brief No Operation + */ +#define __NOP __nop + +/** + \brief Wait For Interrupt + */ +#define __WFI __wfi + +/** + \brief Wait For Event + */ +#define __WFE __wfe + +/** + \brief Send Event + */ +#define __SEV __sev + +/** + \brief Instruction Synchronization Barrier + */ +#define __ISB() do {\ + __schedule_barrier();\ + __isb(0xF);\ + __schedule_barrier();\ + } while (0U) + +/** + \brief Data Synchronization Barrier + */ +#define __DSB() do {\ + __schedule_barrier();\ + __dsb(0xF);\ + __schedule_barrier();\ + } while (0U) + +/** + \brief Data Memory Barrier + */ +#define __DMB() do {\ + __schedule_barrier();\ + __dmb(0xF);\ + __schedule_barrier();\ + } while (0U) + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV __rev + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. + \param [in] value Value to reverse + \return Reversed value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value) +{ + rev16 r0, r0 + bx lr +} +#endif + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. + \param [in] value Value to reverse + \return Reversed value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int16_t __REVSH(int16_t value) +{ + revsh r0, r0 + bx lr +} +#endif + +/** + \brief Rotate Right in unsigned value (32 bit) + \param [in] op1 Value to rotate + \param [in] op2 Number of Bits to rotate + \return Rotated value + */ +#define __ROR __ror + +/** + \brief Breakpoint + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __breakpoint(value) + +/** + \brief Reverse bit order of value + \param [in] value Value to reverse + \return Reversed value + */ +#define __RBIT __rbit + +/** + \brief Count leading zeros + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +#define __CLZ __clz + +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr)) +#else + #define __LDREXB(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint8_t ) __ldrex(ptr)) _Pragma("pop") +#endif + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __LDREXH(ptr) ((uint16_t) __ldrex(ptr)) +#else + #define __LDREXH(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint16_t) __ldrex(ptr)) _Pragma("pop") +#endif + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr)) +#else + #define __LDREXW(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint32_t ) __ldrex(ptr)) _Pragma("pop") +#endif + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __STREXB(value, ptr) __strex(value, ptr) +#else + #define __STREXB(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") +#endif + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __STREXH(value, ptr) __strex(value, ptr) +#else + #define __STREXH(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") +#endif + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __STREXW(value, ptr) __strex(value, ptr) +#else + #define __STREXW(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") +#endif + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +#define __CLREX __clrex + + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT __ssat + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT __usat + +/* ########################### Core Function Access ########################### */ + +/** + \brief Get FPSCR (Floating Point Status/Control) + \return Floating Point Status/Control register value + */ +__STATIC_INLINE uint32_t __get_FPSCR(void) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + register uint32_t __regfpscr __ASM("fpscr"); + return(__regfpscr); +#else + return(0U); +#endif +} + +/** + \brief Set FPSCR (Floating Point Status/Control) + \param [in] fpscr Floating Point Status/Control value to set + */ +__STATIC_INLINE void __set_FPSCR(uint32_t fpscr) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + register uint32_t __regfpscr __ASM("fpscr"); + __regfpscr = (fpscr); +#else + (void)fpscr; +#endif +} + +/** \brief Get CPSR (Current Program Status Register) + \return CPSR Register value + */ +__STATIC_INLINE uint32_t __get_CPSR(void) +{ + register uint32_t __regCPSR __ASM("cpsr"); + return(__regCPSR); +} + + +/** \brief Set CPSR (Current Program Status Register) + \param [in] cpsr CPSR value to set + */ +__STATIC_INLINE void __set_CPSR(uint32_t cpsr) +{ + register uint32_t __regCPSR __ASM("cpsr"); + __regCPSR = cpsr; +} + +/** \brief Get Mode + \return Processor Mode + */ +__STATIC_INLINE uint32_t __get_mode(void) +{ + return (__get_CPSR() & 0x1FU); +} + +/** \brief Set Mode + \param [in] mode Mode value to set + */ +__STATIC_INLINE __ASM void __set_mode(uint32_t mode) +{ + MOV r1, lr + MSR CPSR_C, r0 + BX r1 +} + +/** \brief Get Stack Pointer + \return Stack Pointer + */ +__STATIC_INLINE __ASM uint32_t __get_SP(void) +{ + MOV r0, sp + BX lr +} + +/** \brief Set Stack Pointer + \param [in] stack Stack Pointer value to set + */ +__STATIC_INLINE __ASM void __set_SP(uint32_t stack) +{ + MOV sp, r0 + BX lr +} + + +/** \brief Get USR/SYS Stack Pointer + \return USR/SYSStack Pointer + */ +__STATIC_INLINE __ASM uint32_t __get_SP_usr(void) +{ + ARM + PRESERVE8 + + MRS R1, CPSR + CPS #0x1F ;no effect in USR mode + MOV R0, SP + MSR CPSR_c, R1 ;no effect in USR mode + ISB + BX LR +} + +/** \brief Set USR/SYS Stack Pointer + \param [in] topOfProcStack USR/SYS Stack Pointer value to set + */ +__STATIC_INLINE __ASM void __set_SP_usr(uint32_t topOfProcStack) +{ + ARM + PRESERVE8 + + MRS R1, CPSR + CPS #0x1F ;no effect in USR mode + MOV SP, R0 + MSR CPSR_c, R1 ;no effect in USR mode + ISB + BX LR +} + +/** \brief Get FPEXC (Floating Point Exception Control Register) + \return Floating Point Exception Control Register value + */ +__STATIC_INLINE uint32_t __get_FPEXC(void) +{ +#if (__FPU_PRESENT == 1) + register uint32_t __regfpexc __ASM("fpexc"); + return(__regfpexc); +#else + return(0); +#endif +} + +/** \brief Set FPEXC (Floating Point Exception Control Register) + \param [in] fpexc Floating Point Exception Control value to set + */ +__STATIC_INLINE void __set_FPEXC(uint32_t fpexc) +{ +#if (__FPU_PRESENT == 1) + register uint32_t __regfpexc __ASM("fpexc"); + __regfpexc = (fpexc); +#endif +} + +/* + * Include common core functions to access Coprocessor 15 registers + */ + +#define __get_CP(cp, op1, Rt, CRn, CRm, op2) do { register volatile uint32_t tmp __ASM("cp" # cp ":" # op1 ":c" # CRn ":c" # CRm ":" # op2); (Rt) = tmp; } while(0) +#define __set_CP(cp, op1, Rt, CRn, CRm, op2) do { register volatile uint32_t tmp __ASM("cp" # cp ":" # op1 ":c" # CRn ":c" # CRm ":" # op2); tmp = (Rt); } while(0) +#define __get_CP64(cp, op1, Rt, CRm) \ + do { \ + uint32_t ltmp, htmp; \ + __ASM volatile("MRRC p" # cp ", " # op1 ", ltmp, htmp, c" # CRm); \ + (Rt) = ((((uint64_t)htmp) << 32U) | ((uint64_t)ltmp)); \ + } while(0) + +#define __set_CP64(cp, op1, Rt, CRm) \ + do { \ + const uint64_t tmp = (Rt); \ + const uint32_t ltmp = (uint32_t)(tmp); \ + const uint32_t htmp = (uint32_t)(tmp >> 32U); \ + __ASM volatile("MCRR p" # cp ", " # op1 ", ltmp, htmp, c" # CRm); \ + } while(0) + +#include "cmsis_cp15.h" + +/** \brief Enable Floating Point Unit + + Critical section, called from undef handler, so systick is disabled + */ +__STATIC_INLINE __ASM void __FPU_Enable(void) +{ + ARM + + //Permit access to VFP/NEON, registers by modifying CPACR + MRC p15,0,R1,c1,c0,2 + ORR R1,R1,#0x00F00000 + MCR p15,0,R1,c1,c0,2 + + //Ensure that subsequent instructions occur in the context of VFP/NEON access permitted + ISB + + //Enable VFP/NEON + VMRS R1,FPEXC + ORR R1,R1,#0x40000000 + VMSR FPEXC,R1 + + //Initialise VFP/NEON registers to 0 + MOV R2,#0 + + //Initialise D16 registers to 0 + VMOV D0, R2,R2 + VMOV D1, R2,R2 + VMOV D2, R2,R2 + VMOV D3, R2,R2 + VMOV D4, R2,R2 + VMOV D5, R2,R2 + VMOV D6, R2,R2 + VMOV D7, R2,R2 + VMOV D8, R2,R2 + VMOV D9, R2,R2 + VMOV D10,R2,R2 + VMOV D11,R2,R2 + VMOV D12,R2,R2 + VMOV D13,R2,R2 + VMOV D14,R2,R2 + VMOV D15,R2,R2 + + IF {TARGET_FEATURE_EXTENSION_REGISTER_COUNT} == 32 + //Initialise D32 registers to 0 + VMOV D16,R2,R2 + VMOV D17,R2,R2 + VMOV D18,R2,R2 + VMOV D19,R2,R2 + VMOV D20,R2,R2 + VMOV D21,R2,R2 + VMOV D22,R2,R2 + VMOV D23,R2,R2 + VMOV D24,R2,R2 + VMOV D25,R2,R2 + VMOV D26,R2,R2 + VMOV D27,R2,R2 + VMOV D28,R2,R2 + VMOV D29,R2,R2 + VMOV D30,R2,R2 + VMOV D31,R2,R2 + ENDIF + + //Initialise FPSCR to a known state + VMRS R2,FPSCR + LDR R3,=0x00086060 //Mask off all bits that do not have to be preserved. Non-preserved bits can/should be zero. + AND R2,R2,R3 + VMSR FPSCR,R2 + + BX LR +} + +#endif /* __CMSIS_ARMCC_H */ diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Core_A/Include/cmsis_armclang.h b/STM32CubeMX/revF/Drivers/CMSIS/Core_A/Include/cmsis_armclang.h new file mode 100644 index 00000000..5883364c --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Core_A/Include/cmsis_armclang.h @@ -0,0 +1,503 @@ +/**************************************************************************//** + * @file cmsis_armclang.h + * @brief CMSIS compiler specific macros, functions, instructions + * @version V1.0.2 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CMSIS_ARMCLANG_H +#define __CMSIS_ARMCLANG_H + +#pragma clang system_header /* treat file as system include file */ + +#ifndef __ARM_COMPAT_H +#include /* Compatibility header for Arm Compiler 5 intrinsics */ +#endif + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM __asm +#endif +#ifndef __INLINE + #define __INLINE __inline +#endif +#ifndef __FORCEINLINE + #define __FORCEINLINE __attribute__((always_inline)) +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static __inline +#endif +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __attribute__((always_inline)) static __inline +#endif +#ifndef __NO_RETURN + #define __NO_RETURN __attribute__((__noreturn__)) +#endif +#ifndef CMSIS_DEPRECATED + #define CMSIS_DEPRECATED __attribute__((deprecated)) +#endif +#ifndef __USED + #define __USED __attribute__((used)) +#endif +#ifndef __WEAK + #define __WEAK __attribute__((weak)) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) +#endif +#ifndef __UNALIGNED_UINT16_WRITE + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT16_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_WRITE */ + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT16_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_READ */ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) +#endif +#ifndef __UNALIGNED_UINT32_WRITE + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_WRITE */ + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed)) +#endif + +/* ########################## Core Instruction Access ######################### */ +/** + \brief No Operation + */ +#define __NOP __builtin_arm_nop + +/** + \brief Wait For Interrupt + */ +#define __WFI __builtin_arm_wfi + +/** + \brief Wait For Event + */ +#define __WFE __builtin_arm_wfe + +/** + \brief Send Event + */ +#define __SEV __builtin_arm_sev + +/** + \brief Instruction Synchronization Barrier + */ +#define __ISB() do {\ + __schedule_barrier();\ + __builtin_arm_isb(0xF);\ + __schedule_barrier();\ + } while (0U) + +/** + \brief Data Synchronization Barrier + */ +#define __DSB() do {\ + __schedule_barrier();\ + __builtin_arm_dsb(0xF);\ + __schedule_barrier();\ + } while (0U) + +/** + \brief Data Memory Barrier + */ +#define __DMB() do {\ + __schedule_barrier();\ + __builtin_arm_dmb(0xF);\ + __schedule_barrier();\ + } while (0U) + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV(value) __builtin_bswap32(value) + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV16(value) __ROR(__REV(value), 16) + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REVSH(value) (int16_t)__builtin_bswap16(value) + + +/** + \brief Rotate Right in unsigned value (32 bit) + \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + \param [in] op1 Value to rotate + \param [in] op2 Number of Bits to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) +{ + op2 %= 32U; + if (op2 == 0U) + { + return op1; + } + return (op1 >> op2) | (op1 << (32U - op2)); +} + + +/** + \brief Breakpoint + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __ASM volatile ("bkpt "#value) + +/** + \brief Reverse bit order of value + \param [in] value Value to reverse + \return Reversed value + */ +#define __RBIT __builtin_arm_rbit + +/** + \brief Count leading zeros + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +#define __CLZ (uint8_t)__builtin_clz + +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDREXB (uint8_t)__builtin_arm_ldrex + + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDREXH (uint16_t)__builtin_arm_ldrex + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDREXW (uint32_t)__builtin_arm_ldrex + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXB (uint32_t)__builtin_arm_strex + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXH (uint32_t)__builtin_arm_strex + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXW (uint32_t)__builtin_arm_strex + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +#define __CLREX __builtin_arm_clrex + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT __builtin_arm_ssat + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT __builtin_arm_usat + + +/* ########################### Core Function Access ########################### */ + +/** + \brief Get FPSCR + \details Returns the current value of the Floating Point Status/Control register. + \return Floating Point Status/Control register value + */ +#define __get_FPSCR __builtin_arm_get_fpscr + +/** + \brief Set FPSCR + \details Assigns the given value to the Floating Point Status/Control register. + \param [in] fpscr Floating Point Status/Control value to set + */ +#define __set_FPSCR __builtin_arm_set_fpscr + +/** \brief Get CPSR Register + \return CPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_CPSR(void) +{ + uint32_t result; + __ASM volatile("MRS %0, cpsr" : "=r" (result) ); + return(result); +} + +/** \brief Set CPSR Register + \param [in] cpsr CPSR value to set + */ +__STATIC_FORCEINLINE void __set_CPSR(uint32_t cpsr) +{ +__ASM volatile ("MSR cpsr, %0" : : "r" (cpsr) : "memory"); +} + +/** \brief Get Mode + \return Processor Mode + */ +__STATIC_FORCEINLINE uint32_t __get_mode(void) +{ + return (__get_CPSR() & 0x1FU); +} + +/** \brief Set Mode + \param [in] mode Mode value to set + */ +__STATIC_FORCEINLINE void __set_mode(uint32_t mode) +{ + __ASM volatile("MSR cpsr_c, %0" : : "r" (mode) : "memory"); +} + +/** \brief Get Stack Pointer + \return Stack Pointer value + */ +__STATIC_FORCEINLINE uint32_t __get_SP() +{ + uint32_t result; + __ASM volatile("MOV %0, sp" : "=r" (result) : : "memory"); + return result; +} + +/** \brief Set Stack Pointer + \param [in] stack Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_SP(uint32_t stack) +{ + __ASM volatile("MOV sp, %0" : : "r" (stack) : "memory"); +} + +/** \brief Get USR/SYS Stack Pointer + \return USR/SYS Stack Pointer value + */ +__STATIC_FORCEINLINE uint32_t __get_SP_usr() +{ + uint32_t cpsr; + uint32_t result; + __ASM volatile( + "MRS %0, cpsr \n" + "CPS #0x1F \n" // no effect in USR mode + "MOV %1, sp \n" + "MSR cpsr_c, %2 \n" // no effect in USR mode + "ISB" : "=r"(cpsr), "=r"(result) : "r"(cpsr) : "memory" + ); + return result; +} + +/** \brief Set USR/SYS Stack Pointer + \param [in] topOfProcStack USR/SYS Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_SP_usr(uint32_t topOfProcStack) +{ + uint32_t cpsr; + __ASM volatile( + "MRS %0, cpsr \n" + "CPS #0x1F \n" // no effect in USR mode + "MOV sp, %1 \n" + "MSR cpsr_c, %2 \n" // no effect in USR mode + "ISB" : "=r"(cpsr) : "r" (topOfProcStack), "r"(cpsr) : "memory" + ); +} + +/** \brief Get FPEXC + \return Floating Point Exception Control register value + */ +__STATIC_FORCEINLINE uint32_t __get_FPEXC(void) +{ +#if (__FPU_PRESENT == 1) + uint32_t result; + __ASM volatile("VMRS %0, fpexc" : "=r" (result) : : "memory"); + return(result); +#else + return(0); +#endif +} + +/** \brief Set FPEXC + \param [in] fpexc Floating Point Exception Control value to set + */ +__STATIC_FORCEINLINE void __set_FPEXC(uint32_t fpexc) +{ +#if (__FPU_PRESENT == 1) + __ASM volatile ("VMSR fpexc, %0" : : "r" (fpexc) : "memory"); +#endif +} + +/* + * Include common core functions to access Coprocessor 15 registers + */ + +#define __get_CP(cp, op1, Rt, CRn, CRm, op2) __ASM volatile("MRC p" # cp ", " # op1 ", %0, c" # CRn ", c" # CRm ", " # op2 : "=r" (Rt) : : "memory" ) +#define __set_CP(cp, op1, Rt, CRn, CRm, op2) __ASM volatile("MCR p" # cp ", " # op1 ", %0, c" # CRn ", c" # CRm ", " # op2 : : "r" (Rt) : "memory" ) +#define __get_CP64(cp, op1, Rt, CRm) __ASM volatile("MRRC p" # cp ", " # op1 ", %Q0, %R0, c" # CRm : "=r" (Rt) : : "memory" ) +#define __set_CP64(cp, op1, Rt, CRm) __ASM volatile("MCRR p" # cp ", " # op1 ", %Q0, %R0, c" # CRm : : "r" (Rt) : "memory" ) + +#include "cmsis_cp15.h" + +/** \brief Enable Floating Point Unit + + Critical section, called from undef handler, so systick is disabled + */ +__STATIC_INLINE void __FPU_Enable(void) +{ + __ASM volatile( + //Permit access to VFP/NEON, registers by modifying CPACR + " MRC p15,0,R1,c1,c0,2 \n" + " ORR R1,R1,#0x00F00000 \n" + " MCR p15,0,R1,c1,c0,2 \n" + + //Ensure that subsequent instructions occur in the context of VFP/NEON access permitted + " ISB \n" + + //Enable VFP/NEON + " VMRS R1,FPEXC \n" + " ORR R1,R1,#0x40000000 \n" + " VMSR FPEXC,R1 \n" + + //Initialise VFP/NEON registers to 0 + " MOV R2,#0 \n" + + //Initialise D16 registers to 0 + " VMOV D0, R2,R2 \n" + " VMOV D1, R2,R2 \n" + " VMOV D2, R2,R2 \n" + " VMOV D3, R2,R2 \n" + " VMOV D4, R2,R2 \n" + " VMOV D5, R2,R2 \n" + " VMOV D6, R2,R2 \n" + " VMOV D7, R2,R2 \n" + " VMOV D8, R2,R2 \n" + " VMOV D9, R2,R2 \n" + " VMOV D10,R2,R2 \n" + " VMOV D11,R2,R2 \n" + " VMOV D12,R2,R2 \n" + " VMOV D13,R2,R2 \n" + " VMOV D14,R2,R2 \n" + " VMOV D15,R2,R2 \n" + +#if __ARM_NEON == 1 + //Initialise D32 registers to 0 + " VMOV D16,R2,R2 \n" + " VMOV D17,R2,R2 \n" + " VMOV D18,R2,R2 \n" + " VMOV D19,R2,R2 \n" + " VMOV D20,R2,R2 \n" + " VMOV D21,R2,R2 \n" + " VMOV D22,R2,R2 \n" + " VMOV D23,R2,R2 \n" + " VMOV D24,R2,R2 \n" + " VMOV D25,R2,R2 \n" + " VMOV D26,R2,R2 \n" + " VMOV D27,R2,R2 \n" + " VMOV D28,R2,R2 \n" + " VMOV D29,R2,R2 \n" + " VMOV D30,R2,R2 \n" + " VMOV D31,R2,R2 \n" +#endif + + //Initialise FPSCR to a known state + " VMRS R2,FPSCR \n" + " LDR R3,=0x00086060 \n" //Mask off all bits that do not have to be preserved. Non-preserved bits can/should be zero. + " AND R2,R2,R3 \n" + " VMSR FPSCR,R2 " + ); +} + +#endif /* __CMSIS_ARMCLANG_H */ diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Core_A/Include/cmsis_compiler.h b/STM32CubeMX/revF/Drivers/CMSIS/Core_A/Include/cmsis_compiler.h new file mode 100644 index 00000000..b00c6ba3 --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Core_A/Include/cmsis_compiler.h @@ -0,0 +1,201 @@ +/**************************************************************************//** + * @file cmsis_compiler.h + * @brief CMSIS compiler specific macros, functions, instructions + * @version V1.0.2 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CMSIS_COMPILER_H +#define __CMSIS_COMPILER_H + +#include + +/* + * Arm Compiler 4/5 + */ +#if defined ( __CC_ARM ) + #include "cmsis_armcc.h" + + +/* + * Arm Compiler 6 (armclang) + */ +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #include "cmsis_armclang.h" + + +/* + * GNU Compiler + */ +#elif defined ( __GNUC__ ) + #include "cmsis_gcc.h" + + +/* + * IAR Compiler + */ +#elif defined ( __ICCARM__ ) + #include "cmsis_iccarm.h" + + +/* + * TI Arm Compiler + */ +#elif defined ( __TI_ARM__ ) + #include + + #ifndef __ASM + #define __ASM __asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __STATIC_INLINE + #endif + #ifndef __NO_RETURN + #define __NO_RETURN __attribute__((noreturn)) + #endif + #ifndef CMSIS_DEPRECATED + #define CMSIS_DEPRECATED __attribute__((deprecated)) + #endif + #ifndef __USED + #define __USED __attribute__((used)) + #endif + #ifndef __WEAK + #define __WEAK __attribute__((weak)) + #endif + #ifndef __UNALIGNED_UINT32 + struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) + #endif + #ifndef __PACKED + #define __PACKED __attribute__((packed)) + #endif + + +/* + * TASKING Compiler + */ +#elif defined ( __TASKING__ ) + /* + * The CMSIS functions have been implemented as intrinsics in the compiler. + * Please use "carm -?i" to get an up to date list of all intrinsics, + * Including the CMSIS ones. + */ + + #ifndef __ASM + #define __ASM __asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __STATIC_INLINE + #endif + #ifndef __NO_RETURN + #define __NO_RETURN __attribute__((noreturn)) + #endif + #ifndef CMSIS_DEPRECATED + #define CMSIS_DEPRECATED __attribute__((deprecated)) + #endif + #ifndef __USED + #define __USED __attribute__((used)) + #endif + #ifndef __WEAK + #define __WEAK __attribute__((weak)) + #endif + #ifndef __UNALIGNED_UINT32 + struct __packed__ T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __ALIGNED + #define __ALIGNED(x) __align(x) + #endif + #ifndef __PACKED + #define __PACKED __packed__ + #endif + + +/* + * COSMIC Compiler + */ +#elif defined ( __CSMC__ ) + #include + + #ifndef __ASM + #define __ASM _asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __STATIC_INLINE + #endif + #ifndef __NO_RETURN + // NO RETURN is automatically detected hence no warning here + #define __NO_RETURN + #endif + #ifndef __USED + #warning No compiler specific solution for __USED. __USED is ignored. + #define __USED + #endif + #ifndef CMSIS_DEPRECATED + #warning No compiler specific solution for CMSIS_DEPRECATED. CMSIS_DEPRECATED is ignored. + #define CMSIS_DEPRECATED + #endif + #ifndef __WEAK + #define __WEAK __weak + #endif + #ifndef __UNALIGNED_UINT32 + @packed struct T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __ALIGNED + #warning No compiler specific solution for __ALIGNED. __ALIGNED is ignored. + #define __ALIGNED(x) + #endif + #ifndef __PACKED + #define __PACKED @packed + #endif + + +#else + #error Unknown compiler. +#endif + + +#endif /* __CMSIS_COMPILER_H */ + diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Core_A/Include/cmsis_cp15.h b/STM32CubeMX/revF/Drivers/CMSIS/Core_A/Include/cmsis_cp15.h new file mode 100644 index 00000000..891bec2a --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Core_A/Include/cmsis_cp15.h @@ -0,0 +1,514 @@ +/**************************************************************************//** + * @file cmsis_cp15.h + * @brief CMSIS compiler specific macros, functions, instructions + * @version V1.0.1 + * @date 07. Sep 2017 + ******************************************************************************/ +/* + * Copyright (c) 2009-2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CMSIS_CP15_H +#define __CMSIS_CP15_H + +/** \brief Get ACTLR + \return Auxiliary Control register value + */ +__STATIC_FORCEINLINE uint32_t __get_ACTLR(void) +{ + uint32_t result; + __get_CP(15, 0, result, 1, 0, 1); + return(result); +} + +/** \brief Set ACTLR + \param [in] actlr Auxiliary Control value to set + */ +__STATIC_FORCEINLINE void __set_ACTLR(uint32_t actlr) +{ + __set_CP(15, 0, actlr, 1, 0, 1); +} + +/** \brief Get CPACR + \return Coprocessor Access Control register value + */ +__STATIC_FORCEINLINE uint32_t __get_CPACR(void) +{ + uint32_t result; + __get_CP(15, 0, result, 1, 0, 2); + return result; +} + +/** \brief Set CPACR + \param [in] cpacr Coprocessor Access Control value to set + */ +__STATIC_FORCEINLINE void __set_CPACR(uint32_t cpacr) +{ + __set_CP(15, 0, cpacr, 1, 0, 2); +} + +/** \brief Get DFSR + \return Data Fault Status Register value + */ +__STATIC_FORCEINLINE uint32_t __get_DFSR(void) +{ + uint32_t result; + __get_CP(15, 0, result, 5, 0, 0); + return result; +} + +/** \brief Set DFSR + \param [in] dfsr Data Fault Status value to set + */ +__STATIC_FORCEINLINE void __set_DFSR(uint32_t dfsr) +{ + __set_CP(15, 0, dfsr, 5, 0, 0); +} + +/** \brief Get IFSR + \return Instruction Fault Status Register value + */ +__STATIC_FORCEINLINE uint32_t __get_IFSR(void) +{ + uint32_t result; + __get_CP(15, 0, result, 5, 0, 1); + return result; +} + +/** \brief Set IFSR + \param [in] ifsr Instruction Fault Status value to set + */ +__STATIC_FORCEINLINE void __set_IFSR(uint32_t ifsr) +{ + __set_CP(15, 0, ifsr, 5, 0, 1); +} + +/** \brief Get ISR + \return Interrupt Status Register value + */ +__STATIC_FORCEINLINE uint32_t __get_ISR(void) +{ + uint32_t result; + __get_CP(15, 0, result, 12, 1, 0); + return result; +} + +/** \brief Get CBAR + \return Configuration Base Address register value + */ +__STATIC_FORCEINLINE uint32_t __get_CBAR(void) +{ + uint32_t result; + __get_CP(15, 4, result, 15, 0, 0); + return result; +} + +/** \brief Get TTBR0 + + This function returns the value of the Translation Table Base Register 0. + + \return Translation Table Base Register 0 value + */ +__STATIC_FORCEINLINE uint32_t __get_TTBR0(void) +{ + uint32_t result; + __get_CP(15, 0, result, 2, 0, 0); + return result; +} + +/** \brief Set TTBR0 + + This function assigns the given value to the Translation Table Base Register 0. + + \param [in] ttbr0 Translation Table Base Register 0 value to set + */ +__STATIC_FORCEINLINE void __set_TTBR0(uint32_t ttbr0) +{ + __set_CP(15, 0, ttbr0, 2, 0, 0); +} + +/** \brief Get DACR + + This function returns the value of the Domain Access Control Register. + + \return Domain Access Control Register value + */ +__STATIC_FORCEINLINE uint32_t __get_DACR(void) +{ + uint32_t result; + __get_CP(15, 0, result, 3, 0, 0); + return result; +} + +/** \brief Set DACR + + This function assigns the given value to the Domain Access Control Register. + + \param [in] dacr Domain Access Control Register value to set + */ +__STATIC_FORCEINLINE void __set_DACR(uint32_t dacr) +{ + __set_CP(15, 0, dacr, 3, 0, 0); +} + +/** \brief Set SCTLR + + This function assigns the given value to the System Control Register. + + \param [in] sctlr System Control Register value to set + */ +__STATIC_FORCEINLINE void __set_SCTLR(uint32_t sctlr) +{ + __set_CP(15, 0, sctlr, 1, 0, 0); +} + +/** \brief Get SCTLR + \return System Control Register value + */ +__STATIC_FORCEINLINE uint32_t __get_SCTLR(void) +{ + uint32_t result; + __get_CP(15, 0, result, 1, 0, 0); + return result; +} + +/** \brief Set ACTRL + \param [in] actrl Auxiliary Control Register value to set + */ +__STATIC_FORCEINLINE void __set_ACTRL(uint32_t actrl) +{ + __set_CP(15, 0, actrl, 1, 0, 1); +} + +/** \brief Get ACTRL + \return Auxiliary Control Register value + */ +__STATIC_FORCEINLINE uint32_t __get_ACTRL(void) +{ + uint32_t result; + __get_CP(15, 0, result, 1, 0, 1); + return result; +} + +/** \brief Get MPIDR + + This function returns the value of the Multiprocessor Affinity Register. + + \return Multiprocessor Affinity Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MPIDR(void) +{ + uint32_t result; + __get_CP(15, 0, result, 0, 0, 5); + return result; +} + +/** \brief Get VBAR + + This function returns the value of the Vector Base Address Register. + + \return Vector Base Address Register + */ +__STATIC_FORCEINLINE uint32_t __get_VBAR(void) +{ + uint32_t result; + __get_CP(15, 0, result, 12, 0, 0); + return result; +} + +/** \brief Set VBAR + + This function assigns the given value to the Vector Base Address Register. + + \param [in] vbar Vector Base Address Register value to set + */ +__STATIC_FORCEINLINE void __set_VBAR(uint32_t vbar) +{ + __set_CP(15, 0, vbar, 12, 0, 0); +} + +/** \brief Get MVBAR + + This function returns the value of the Monitor Vector Base Address Register. + + \return Monitor Vector Base Address Register + */ +__STATIC_FORCEINLINE uint32_t __get_MVBAR(void) +{ + uint32_t result; + __get_CP(15, 0, result, 12, 0, 1); + return result; +} + +/** \brief Set MVBAR + + This function assigns the given value to the Monitor Vector Base Address Register. + + \param [in] mvbar Monitor Vector Base Address Register value to set + */ +__STATIC_FORCEINLINE void __set_MVBAR(uint32_t mvbar) +{ + __set_CP(15, 0, mvbar, 12, 0, 1); +} + +#if (defined(__CORTEX_A) && (__CORTEX_A == 7U) && \ + defined(__TIM_PRESENT) && (__TIM_PRESENT == 1U)) || \ + defined(DOXYGEN) + +/** \brief Set CNTFRQ + + This function assigns the given value to PL1 Physical Timer Counter Frequency Register (CNTFRQ). + + \param [in] value CNTFRQ Register value to set +*/ +__STATIC_FORCEINLINE void __set_CNTFRQ(uint32_t value) +{ + __set_CP(15, 0, value, 14, 0, 0); +} + +/** \brief Get CNTFRQ + + This function returns the value of the PL1 Physical Timer Counter Frequency Register (CNTFRQ). + + \return CNTFRQ Register value + */ +__STATIC_FORCEINLINE uint32_t __get_CNTFRQ(void) +{ + uint32_t result; + __get_CP(15, 0, result, 14, 0 , 0); + return result; +} + +/** \brief Set CNTP_TVAL + + This function assigns the given value to PL1 Physical Timer Value Register (CNTP_TVAL). + + \param [in] value CNTP_TVAL Register value to set +*/ +__STATIC_FORCEINLINE void __set_CNTP_TVAL(uint32_t value) +{ + __set_CP(15, 0, value, 14, 2, 0); +} + +/** \brief Get CNTP_TVAL + + This function returns the value of the PL1 Physical Timer Value Register (CNTP_TVAL). + + \return CNTP_TVAL Register value + */ +__STATIC_FORCEINLINE uint32_t __get_CNTP_TVAL(void) +{ + uint32_t result; + __get_CP(15, 0, result, 14, 2, 0); + return result; +} + +/** \brief Get CNTPCT + + This function returns the value of the 64 bits PL1 Physical Count Register (CNTPCT). + + \return CNTPCT Register value + */ +__STATIC_FORCEINLINE uint64_t __get_CNTPCT(void) +{ + uint64_t result; + __get_CP64(15, 0, result, 14); + return result; +} + +/** \brief Set CNTP_CVAL + + This function assigns the given value to 64bits PL1 Physical Timer CompareValue Register (CNTP_CVAL). + + \param [in] value CNTP_CVAL Register value to set +*/ +__STATIC_FORCEINLINE void __set_CNTP_CVAL(uint64_t value) +{ + __set_CP64(15, 2, value, 14); +} + +/** \brief Get CNTP_CVAL + + This function returns the value of the 64 bits PL1 Physical Timer CompareValue Register (CNTP_CVAL). + + \return CNTP_CVAL Register value + */ +__STATIC_FORCEINLINE uint64_t __get_CNTP_CVAL(void) +{ + uint64_t result; + __get_CP64(15, 2, result, 14); + return result; +} + +/** \brief Set CNTP_CTL + + This function assigns the given value to PL1 Physical Timer Control Register (CNTP_CTL). + + \param [in] value CNTP_CTL Register value to set +*/ +__STATIC_FORCEINLINE void __set_CNTP_CTL(uint32_t value) +{ + __set_CP(15, 0, value, 14, 2, 1); +} + +/** \brief Get CNTP_CTL register + \return CNTP_CTL Register value + */ +__STATIC_FORCEINLINE uint32_t __get_CNTP_CTL(void) +{ + uint32_t result; + __get_CP(15, 0, result, 14, 2, 1); + return result; +} + +#endif + +/** \brief Set TLBIALL + + TLB Invalidate All + */ +__STATIC_FORCEINLINE void __set_TLBIALL(uint32_t value) +{ + __set_CP(15, 0, value, 8, 7, 0); +} + +/** \brief Set BPIALL. + + Branch Predictor Invalidate All + */ +__STATIC_FORCEINLINE void __set_BPIALL(uint32_t value) +{ + __set_CP(15, 0, value, 7, 5, 6); +} + +/** \brief Set ICIALLU + + Instruction Cache Invalidate All + */ +__STATIC_FORCEINLINE void __set_ICIALLU(uint32_t value) +{ + __set_CP(15, 0, value, 7, 5, 0); +} + +/** \brief Set DCCMVAC + + Data cache clean + */ +__STATIC_FORCEINLINE void __set_DCCMVAC(uint32_t value) +{ + __set_CP(15, 0, value, 7, 10, 1); +} + +/** \brief Set DCIMVAC + + Data cache invalidate + */ +__STATIC_FORCEINLINE void __set_DCIMVAC(uint32_t value) +{ + __set_CP(15, 0, value, 7, 6, 1); +} + +/** \brief Set DCCIMVAC + + Data cache clean and invalidate + */ +__STATIC_FORCEINLINE void __set_DCCIMVAC(uint32_t value) +{ + __set_CP(15, 0, value, 7, 14, 1); +} + +/** \brief Set CSSELR + */ +__STATIC_FORCEINLINE void __set_CSSELR(uint32_t value) +{ +// __ASM volatile("MCR p15, 2, %0, c0, c0, 0" : : "r"(value) : "memory"); + __set_CP(15, 2, value, 0, 0, 0); +} + +/** \brief Get CSSELR + \return CSSELR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_CSSELR(void) +{ + uint32_t result; +// __ASM volatile("MRC p15, 2, %0, c0, c0, 0" : "=r"(result) : : "memory"); + __get_CP(15, 2, result, 0, 0, 0); + return result; +} + +/** \brief Set CCSIDR + \deprecated CCSIDR itself is read-only. Use __set_CSSELR to select cache level instead. + */ +CMSIS_DEPRECATED +__STATIC_FORCEINLINE void __set_CCSIDR(uint32_t value) +{ + __set_CSSELR(value); +} + +/** \brief Get CCSIDR + \return CCSIDR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_CCSIDR(void) +{ + uint32_t result; +// __ASM volatile("MRC p15, 1, %0, c0, c0, 0" : "=r"(result) : : "memory"); + __get_CP(15, 1, result, 0, 0, 0); + return result; +} + +/** \brief Get CLIDR + \return CLIDR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_CLIDR(void) +{ + uint32_t result; +// __ASM volatile("MRC p15, 1, %0, c0, c0, 1" : "=r"(result) : : "memory"); + __get_CP(15, 1, result, 0, 0, 1); + return result; +} + +/** \brief Set DCISW + */ +__STATIC_FORCEINLINE void __set_DCISW(uint32_t value) +{ +// __ASM volatile("MCR p15, 0, %0, c7, c6, 2" : : "r"(value) : "memory") + __set_CP(15, 0, value, 7, 6, 2); +} + +/** \brief Set DCCSW + */ +__STATIC_FORCEINLINE void __set_DCCSW(uint32_t value) +{ +// __ASM volatile("MCR p15, 0, %0, c7, c10, 2" : : "r"(value) : "memory") + __set_CP(15, 0, value, 7, 10, 2); +} + +/** \brief Set DCCISW + */ +__STATIC_FORCEINLINE void __set_DCCISW(uint32_t value) +{ +// __ASM volatile("MCR p15, 0, %0, c7, c14, 2" : : "r"(value) : "memory") + __set_CP(15, 0, value, 7, 14, 2); +} + +#endif diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Core_A/Include/cmsis_gcc.h b/STM32CubeMX/revF/Drivers/CMSIS/Core_A/Include/cmsis_gcc.h new file mode 100644 index 00000000..4f464627 --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Core_A/Include/cmsis_gcc.h @@ -0,0 +1,679 @@ +/**************************************************************************//** + * @file cmsis_gcc.h + * @brief CMSIS compiler specific macros, functions, instructions + * @version V1.0.2 + * @date 09. April 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CMSIS_GCC_H +#define __CMSIS_GCC_H + +/* ignore some GCC warnings */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wsign-conversion" +#pragma GCC diagnostic ignored "-Wconversion" +#pragma GCC diagnostic ignored "-Wunused-parameter" + +/* Fallback for __has_builtin */ +#ifndef __has_builtin + #define __has_builtin(x) (0) +#endif + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM asm +#endif +#ifndef __INLINE + #define __INLINE inline +#endif +#ifndef __FORCEINLINE + #define __FORCEINLINE __attribute__((always_inline)) +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline +#endif +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __attribute__((always_inline)) static inline +#endif +#ifndef __NO_RETURN + #define __NO_RETURN __attribute__((__noreturn__)) +#endif +#ifndef CMSIS_DEPRECATED + #define CMSIS_DEPRECATED __attribute__((deprecated)) +#endif +#ifndef __USED + #define __USED __attribute__((used)) +#endif +#ifndef __WEAK + #define __WEAK __attribute__((weak)) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) +#endif +#ifndef __UNALIGNED_UINT16_WRITE + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT16_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_WRITE */ + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT16_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_READ */ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) +#endif +#ifndef __UNALIGNED_UINT32_WRITE + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_WRITE */ + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif + +/* ########################## Core Instruction Access ######################### */ +/** + \brief No Operation + */ +#define __NOP() __ASM volatile ("nop") + +/** + \brief Wait For Interrupt + */ +#define __WFI() __ASM volatile ("wfi") + +/** + \brief Wait For Event + */ +#define __WFE() __ASM volatile ("wfe") + +/** + \brief Send Event + */ +#define __SEV() __ASM volatile ("sev") + +/** + \brief Instruction Synchronization Barrier + \details Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or memory, + after the instruction has been completed. + */ +__STATIC_FORCEINLINE void __ISB(void) +{ + __ASM volatile ("isb 0xF":::"memory"); +} + + +/** + \brief Data Synchronization Barrier + \details Acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +__STATIC_FORCEINLINE void __DSB(void) +{ + __ASM volatile ("dsb 0xF":::"memory"); +} + +/** + \brief Data Memory Barrier + \details Ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +__STATIC_FORCEINLINE void __DMB(void) +{ + __ASM volatile ("dmb 0xF":::"memory"); +} + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE uint32_t __REV(uint32_t value) +{ +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) + return __builtin_bswap32(value); +#else + uint32_t result; + + __ASM volatile ("rev %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return result; +#endif +} + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. + \param [in] value Value to reverse + \return Reversed value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".rev16_text"))) __STATIC_INLINE uint32_t __REV16(uint32_t value) +{ + uint32_t result; + __ASM volatile("rev16 %0, %1" : "=r" (result) : "r" (value)); + return result; +} +#endif + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE int16_t __REVSH(int16_t value) +{ +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + return (int16_t)__builtin_bswap16(value); +#else + int16_t result; + + __ASM volatile ("revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return result; +#endif +} + +/** + \brief Rotate Right in unsigned value (32 bit) + \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + \param [in] op1 Value to rotate + \param [in] op2 Number of Bits to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) +{ + op2 %= 32U; + if (op2 == 0U) { + return op1; + } + return (op1 >> op2) | (op1 << (32U - op2)); +} + + +/** + \brief Breakpoint + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __ASM volatile ("bkpt "#value) + +/** + \brief Reverse bit order of value + \details Reverses the bit order of the given value. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE uint32_t __RBIT(uint32_t value) +{ + uint32_t result; + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); +#else + int32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */ + + result = value; /* r will be reversed bits of v; first get LSB of v */ + for (value >>= 1U; value; value >>= 1U) + { + result <<= 1U; + result |= value & 1U; + s--; + } + result <<= s; /* shift when v's highest bits are zero */ +#endif + return result; +} + +/** + \brief Count leading zeros + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +#define __CLZ (uint8_t)__builtin_clz + +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDREXB(volatile uint8_t *addr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrexb %0, %1" : "=r" (result) : "Q" (*addr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); +#endif + return ((uint8_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDREXH(volatile uint16_t *addr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrexh %0, %1" : "=r" (result) : "Q" (*addr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); +#endif + return ((uint16_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDREXW(volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) ); + return(result); +} + + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr) +{ + uint32_t result; + + __ASM volatile ("strexb %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr) +{ + uint32_t result; + + __ASM volatile ("strexh %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) ); + return(result); +} + + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +__STATIC_FORCEINLINE void __CLREX(void) +{ + __ASM volatile ("clrex" ::: "memory"); +} + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT(ARG1,ARG2) \ +__extension__ \ +({ \ + int32_t __RES, __ARG1 = (ARG1); \ + __ASM ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT(ARG1,ARG2) \ +__extension__ \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +/* ########################### Core Function Access ########################### */ + +/** + \brief Enable IRQ Interrupts + \details Enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __enable_irq(void) +{ + __ASM volatile ("cpsie i" : : : "memory"); +} + +/** + \brief Disable IRQ Interrupts + \details Disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __disable_irq(void) +{ + __ASM volatile ("cpsid i" : : : "memory"); +} + +/** + \brief Get FPSCR + \details Returns the current value of the Floating Point Status/Control register. + \return Floating Point Status/Control register value +*/ +__STATIC_FORCEINLINE uint32_t __get_FPSCR(void) +{ + #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + #if __has_builtin(__builtin_arm_get_fpscr) + // Re-enable using built-in when GCC has been fixed + // || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) + /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ + return __builtin_arm_get_fpscr(); + #else + uint32_t result; + + __ASM volatile ("VMRS %0, fpscr" : "=r" (result) ); + return(result); + #endif + #else + return(0U); + #endif +} + +/** + \brief Set FPSCR + \details Assigns the given value to the Floating Point Status/Control register. + \param [in] fpscr Floating Point Status/Control value to set +*/ +__STATIC_FORCEINLINE void __set_FPSCR(uint32_t fpscr) +{ + #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + #if __has_builtin(__builtin_arm_set_fpscr) + // Re-enable using built-in when GCC has been fixed + // || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) + /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ + __builtin_arm_set_fpscr(fpscr); + #else + __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc", "memory"); + #endif + #else + (void)fpscr; + #endif +} + +/** \brief Get CPSR Register + \return CPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_CPSR(void) +{ + uint32_t result; + __ASM volatile("MRS %0, cpsr" : "=r" (result) ); + return(result); +} + +/** \brief Set CPSR Register + \param [in] cpsr CPSR value to set + */ +__STATIC_FORCEINLINE void __set_CPSR(uint32_t cpsr) +{ +__ASM volatile ("MSR cpsr, %0" : : "r" (cpsr) : "memory"); +} + +/** \brief Get Mode + \return Processor Mode + */ +__STATIC_FORCEINLINE uint32_t __get_mode(void) +{ + return (__get_CPSR() & 0x1FU); +} + +/** \brief Set Mode + \param [in] mode Mode value to set + */ +__STATIC_FORCEINLINE void __set_mode(uint32_t mode) +{ + __ASM volatile("MSR cpsr_c, %0" : : "r" (mode) : "memory"); +} + +/** \brief Get Stack Pointer + \return Stack Pointer value + */ +__STATIC_FORCEINLINE uint32_t __get_SP(void) +{ + uint32_t result; + __ASM volatile("MOV %0, sp" : "=r" (result) : : "memory"); + return result; +} + +/** \brief Set Stack Pointer + \param [in] stack Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_SP(uint32_t stack) +{ + __ASM volatile("MOV sp, %0" : : "r" (stack) : "memory"); +} + +/** \brief Get USR/SYS Stack Pointer + \return USR/SYS Stack Pointer value + */ +__STATIC_FORCEINLINE uint32_t __get_SP_usr(void) +{ + uint32_t cpsr = __get_CPSR(); + uint32_t result; + __ASM volatile( + "CPS #0x1F \n" + "MOV %0, sp " : "=r"(result) : : "memory" + ); + __set_CPSR(cpsr); + __ISB(); + return result; +} + +/** \brief Set USR/SYS Stack Pointer + \param [in] topOfProcStack USR/SYS Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_SP_usr(uint32_t topOfProcStack) +{ + uint32_t cpsr = __get_CPSR(); + __ASM volatile( + "CPS #0x1F \n" + "MOV sp, %0 " : : "r" (topOfProcStack) : "memory" + ); + __set_CPSR(cpsr); + __ISB(); +} + +/** \brief Get FPEXC + \return Floating Point Exception Control register value + */ +__STATIC_FORCEINLINE uint32_t __get_FPEXC(void) +{ +#if (__FPU_PRESENT == 1) + uint32_t result; + __ASM volatile("VMRS %0, fpexc" : "=r" (result) ); + return(result); +#else + return(0); +#endif +} + +/** \brief Set FPEXC + \param [in] fpexc Floating Point Exception Control value to set + */ +__STATIC_FORCEINLINE void __set_FPEXC(uint32_t fpexc) +{ +#if (__FPU_PRESENT == 1) + __ASM volatile ("VMSR fpexc, %0" : : "r" (fpexc) : "memory"); +#endif +} + +/* + * Include common core functions to access Coprocessor 15 registers + */ + +#define __get_CP(cp, op1, Rt, CRn, CRm, op2) __ASM volatile("MRC p" # cp ", " # op1 ", %0, c" # CRn ", c" # CRm ", " # op2 : "=r" (Rt) : : "memory" ) +#define __set_CP(cp, op1, Rt, CRn, CRm, op2) __ASM volatile("MCR p" # cp ", " # op1 ", %0, c" # CRn ", c" # CRm ", " # op2 : : "r" (Rt) : "memory" ) +#define __get_CP64(cp, op1, Rt, CRm) __ASM volatile("MRRC p" # cp ", " # op1 ", %Q0, %R0, c" # CRm : "=r" (Rt) : : "memory" ) +#define __set_CP64(cp, op1, Rt, CRm) __ASM volatile("MCRR p" # cp ", " # op1 ", %Q0, %R0, c" # CRm : : "r" (Rt) : "memory" ) + +#include "cmsis_cp15.h" + +/** \brief Enable Floating Point Unit + + Critical section, called from undef handler, so systick is disabled + */ +__STATIC_INLINE void __FPU_Enable(void) +{ + __ASM volatile( + //Permit access to VFP/NEON, registers by modifying CPACR + " MRC p15,0,R1,c1,c0,2 \n" + " ORR R1,R1,#0x00F00000 \n" + " MCR p15,0,R1,c1,c0,2 \n" + + //Ensure that subsequent instructions occur in the context of VFP/NEON access permitted + " ISB \n" + + //Enable VFP/NEON + " VMRS R1,FPEXC \n" + " ORR R1,R1,#0x40000000 \n" + " VMSR FPEXC,R1 \n" + + //Initialise VFP/NEON registers to 0 + " MOV R2,#0 \n" + + //Initialise D16 registers to 0 + " VMOV D0, R2,R2 \n" + " VMOV D1, R2,R2 \n" + " VMOV D2, R2,R2 \n" + " VMOV D3, R2,R2 \n" + " VMOV D4, R2,R2 \n" + " VMOV D5, R2,R2 \n" + " VMOV D6, R2,R2 \n" + " VMOV D7, R2,R2 \n" + " VMOV D8, R2,R2 \n" + " VMOV D9, R2,R2 \n" + " VMOV D10,R2,R2 \n" + " VMOV D11,R2,R2 \n" + " VMOV D12,R2,R2 \n" + " VMOV D13,R2,R2 \n" + " VMOV D14,R2,R2 \n" + " VMOV D15,R2,R2 \n" + +#if (defined(__ARM_NEON) && (__ARM_NEON == 1)) + //Initialise D32 registers to 0 + " VMOV D16,R2,R2 \n" + " VMOV D17,R2,R2 \n" + " VMOV D18,R2,R2 \n" + " VMOV D19,R2,R2 \n" + " VMOV D20,R2,R2 \n" + " VMOV D21,R2,R2 \n" + " VMOV D22,R2,R2 \n" + " VMOV D23,R2,R2 \n" + " VMOV D24,R2,R2 \n" + " VMOV D25,R2,R2 \n" + " VMOV D26,R2,R2 \n" + " VMOV D27,R2,R2 \n" + " VMOV D28,R2,R2 \n" + " VMOV D29,R2,R2 \n" + " VMOV D30,R2,R2 \n" + " VMOV D31,R2,R2 \n" +#endif + + //Initialise FPSCR to a known state + " VMRS R2,FPSCR \n" + " LDR R3,=0x00086060 \n" //Mask off all bits that do not have to be preserved. Non-preserved bits can/should be zero. + " AND R2,R2,R3 \n" + " VMSR FPSCR,R2 " + ); +} + +#pragma GCC diagnostic pop + +#endif /* __CMSIS_GCC_H */ diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Core_A/Include/cmsis_iccarm.h b/STM32CubeMX/revF/Drivers/CMSIS/Core_A/Include/cmsis_iccarm.h new file mode 100644 index 00000000..bb0248dc --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Core_A/Include/cmsis_iccarm.h @@ -0,0 +1,559 @@ +/**************************************************************************//** + * @file cmsis_iccarm.h + * @brief CMSIS compiler ICCARM (IAR Compiler for Arm) header file + * @version V5.0.6 + * @date 02. March 2018 + ******************************************************************************/ + +//------------------------------------------------------------------------------ +// +// Copyright (c) 2017-2018 IAR Systems +// +// Licensed under the Apache License, Version 2.0 (the "License") +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//------------------------------------------------------------------------------ + + +#ifndef __CMSIS_ICCARM_H__ +#define __CMSIS_ICCARM_H__ + +#ifndef __ICCARM__ + #error This file should only be compiled by ICCARM +#endif + +#pragma system_include + +#define __IAR_FT _Pragma("inline=forced") __intrinsic + +#if (__VER__ >= 8000000) + #define __ICCARM_V8 1 +#else + #define __ICCARM_V8 0 +#endif + +#pragma language=extended + +#ifndef __ALIGNED + #if __ICCARM_V8 + #define __ALIGNED(x) __attribute__((aligned(x))) + #elif (__VER__ >= 7080000) + /* Needs IAR language extensions */ + #define __ALIGNED(x) __attribute__((aligned(x))) + #else + #warning No compiler specific solution for __ALIGNED.__ALIGNED is ignored. + #define __ALIGNED(x) + #endif +#endif + + +/* Define compiler macros for CPU architecture, used in CMSIS 5. + */ +#if __ARM_ARCH_7A__ +/* Macro already defined */ +#else + #if defined(__ARM7A__) + #define __ARM_ARCH_7A__ 1 + #endif +#endif + +#ifndef __ASM + #define __ASM __asm +#endif + +#ifndef __INLINE + #define __INLINE inline +#endif + +#ifndef __NO_RETURN + #if __ICCARM_V8 + #define __NO_RETURN __attribute__((__noreturn__)) + #else + #define __NO_RETURN _Pragma("object_attribute=__noreturn") + #endif +#endif + +#ifndef __PACKED + /* Needs IAR language extensions */ + #if __ICCARM_V8 + #define __PACKED __attribute__((packed, aligned(1))) + #else + #define __PACKED __packed + #endif +#endif + +#ifndef __PACKED_STRUCT + /* Needs IAR language extensions */ + #if __ICCARM_V8 + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) + #else + #define __PACKED_STRUCT __packed struct + #endif +#endif + +#ifndef __PACKED_UNION + /* Needs IAR language extensions */ + #if __ICCARM_V8 + #define __PACKED_UNION union __attribute__((packed, aligned(1))) + #else + #define __PACKED_UNION __packed union + #endif +#endif + +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif + +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline +#endif + +#ifndef __FORCEINLINE + #define __FORCEINLINE _Pragma("inline=forced") +#endif + +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __FORCEINLINE __STATIC_INLINE +#endif + +#ifndef CMSIS_DEPRECATED + #define CMSIS_DEPRECATED __attribute__((deprecated)) +#endif + +#ifndef __UNALIGNED_UINT16_READ + #pragma language=save + #pragma language=extended + __IAR_FT uint16_t __iar_uint16_read(void const *ptr) + { + return *(__packed uint16_t*)(ptr); + } + #pragma language=restore + #define __UNALIGNED_UINT16_READ(PTR) __iar_uint16_read(PTR) +#endif + + +#ifndef __UNALIGNED_UINT16_WRITE + #pragma language=save + #pragma language=extended + __IAR_FT void __iar_uint16_write(void const *ptr, uint16_t val) + { + *(__packed uint16_t*)(ptr) = val;; + } + #pragma language=restore + #define __UNALIGNED_UINT16_WRITE(PTR,VAL) __iar_uint16_write(PTR,VAL) +#endif + +#ifndef __UNALIGNED_UINT32_READ + #pragma language=save + #pragma language=extended + __IAR_FT uint32_t __iar_uint32_read(void const *ptr) + { + return *(__packed uint32_t*)(ptr); + } + #pragma language=restore + #define __UNALIGNED_UINT32_READ(PTR) __iar_uint32_read(PTR) +#endif + +#ifndef __UNALIGNED_UINT32_WRITE + #pragma language=save + #pragma language=extended + __IAR_FT void __iar_uint32_write(void const *ptr, uint32_t val) + { + *(__packed uint32_t*)(ptr) = val;; + } + #pragma language=restore + #define __UNALIGNED_UINT32_WRITE(PTR,VAL) __iar_uint32_write(PTR,VAL) +#endif + +#if 0 +#ifndef __UNALIGNED_UINT32 /* deprecated */ + #pragma language=save + #pragma language=extended + __packed struct __iar_u32 { uint32_t v; }; + #pragma language=restore + #define __UNALIGNED_UINT32(PTR) (((struct __iar_u32 *)(PTR))->v) +#endif +#endif + +#ifndef __USED + #if __ICCARM_V8 + #define __USED __attribute__((used)) + #else + #define __USED _Pragma("__root") + #endif +#endif + +#ifndef __WEAK + #if __ICCARM_V8 + #define __WEAK __attribute__((weak)) + #else + #define __WEAK _Pragma("__weak") + #endif +#endif + + +#ifndef __ICCARM_INTRINSICS_VERSION__ + #define __ICCARM_INTRINSICS_VERSION__ 0 +#endif + +#if __ICCARM_INTRINSICS_VERSION__ == 2 + + #if defined(__CLZ) + #undef __CLZ + #endif + #if defined(__REVSH) + #undef __REVSH + #endif + #if defined(__RBIT) + #undef __RBIT + #endif + #if defined(__SSAT) + #undef __SSAT + #endif + #if defined(__USAT) + #undef __USAT + #endif + + #include "iccarm_builtin.h" + + #define __enable_irq __iar_builtin_enable_interrupt + #define __disable_irq __iar_builtin_disable_interrupt + #define __enable_fault_irq __iar_builtin_enable_fiq + #define __disable_fault_irq __iar_builtin_disable_fiq + #define __arm_rsr __iar_builtin_rsr + #define __arm_wsr __iar_builtin_wsr + + #if __FPU_PRESENT + #define __get_FPSCR() (__arm_rsr("FPSCR")) + #else + #define __get_FPSCR() ( 0 ) + #endif + + #define __set_FPSCR(VALUE) (__arm_wsr("FPSCR", VALUE)) + + #define __get_CPSR() (__arm_rsr("CPSR")) + #define __get_mode() (__get_CPSR() & 0x1FU) + + #define __set_CPSR(VALUE) (__arm_wsr("CPSR", (VALUE))) + #define __set_mode(VALUE) (__arm_wsr("CPSR_c", (VALUE))) + + + #define __get_FPEXC() (__arm_rsr("FPEXC")) + #define __set_FPEXC(VALUE) (__arm_wsr("FPEXC", VALUE)) + + #define __get_CP(cp, op1, RT, CRn, CRm, op2) \ + ((RT) = __arm_rsr("p" # cp ":" # op1 ":c" # CRn ":c" # CRm ":" # op2)) + + #define __set_CP(cp, op1, RT, CRn, CRm, op2) \ + (__arm_wsr("p" # cp ":" # op1 ":c" # CRn ":c" # CRm ":" # op2, (RT))) + + #define __get_CP64(cp, op1, Rt, CRm) \ + __ASM volatile("MRRC p" # cp ", " # op1 ", %Q0, %R0, c" # CRm : "=r" (Rt) : : "memory" ) + + #define __set_CP64(cp, op1, Rt, CRm) \ + __ASM volatile("MCRR p" # cp ", " # op1 ", %Q0, %R0, c" # CRm : : "r" (Rt) : "memory" ) + + #include "cmsis_cp15.h" + + #define __NOP __iar_builtin_no_operation + + #define __CLZ __iar_builtin_CLZ + #define __CLREX __iar_builtin_CLREX + + #define __DMB __iar_builtin_DMB + #define __DSB __iar_builtin_DSB + #define __ISB __iar_builtin_ISB + + #define __LDREXB __iar_builtin_LDREXB + #define __LDREXH __iar_builtin_LDREXH + #define __LDREXW __iar_builtin_LDREX + + #define __RBIT __iar_builtin_RBIT + #define __REV __iar_builtin_REV + #define __REV16 __iar_builtin_REV16 + + __IAR_FT int16_t __REVSH(int16_t val) + { + return (int16_t) __iar_builtin_REVSH(val); + } + + #define __ROR __iar_builtin_ROR + #define __RRX __iar_builtin_RRX + + #define __SEV __iar_builtin_SEV + + #define __SSAT __iar_builtin_SSAT + + #define __STREXB __iar_builtin_STREXB + #define __STREXH __iar_builtin_STREXH + #define __STREXW __iar_builtin_STREX + + #define __USAT __iar_builtin_USAT + + #define __WFE __iar_builtin_WFE + #define __WFI __iar_builtin_WFI + + #define __SADD8 __iar_builtin_SADD8 + #define __QADD8 __iar_builtin_QADD8 + #define __SHADD8 __iar_builtin_SHADD8 + #define __UADD8 __iar_builtin_UADD8 + #define __UQADD8 __iar_builtin_UQADD8 + #define __UHADD8 __iar_builtin_UHADD8 + #define __SSUB8 __iar_builtin_SSUB8 + #define __QSUB8 __iar_builtin_QSUB8 + #define __SHSUB8 __iar_builtin_SHSUB8 + #define __USUB8 __iar_builtin_USUB8 + #define __UQSUB8 __iar_builtin_UQSUB8 + #define __UHSUB8 __iar_builtin_UHSUB8 + #define __SADD16 __iar_builtin_SADD16 + #define __QADD16 __iar_builtin_QADD16 + #define __SHADD16 __iar_builtin_SHADD16 + #define __UADD16 __iar_builtin_UADD16 + #define __UQADD16 __iar_builtin_UQADD16 + #define __UHADD16 __iar_builtin_UHADD16 + #define __SSUB16 __iar_builtin_SSUB16 + #define __QSUB16 __iar_builtin_QSUB16 + #define __SHSUB16 __iar_builtin_SHSUB16 + #define __USUB16 __iar_builtin_USUB16 + #define __UQSUB16 __iar_builtin_UQSUB16 + #define __UHSUB16 __iar_builtin_UHSUB16 + #define __SASX __iar_builtin_SASX + #define __QASX __iar_builtin_QASX + #define __SHASX __iar_builtin_SHASX + #define __UASX __iar_builtin_UASX + #define __UQASX __iar_builtin_UQASX + #define __UHASX __iar_builtin_UHASX + #define __SSAX __iar_builtin_SSAX + #define __QSAX __iar_builtin_QSAX + #define __SHSAX __iar_builtin_SHSAX + #define __USAX __iar_builtin_USAX + #define __UQSAX __iar_builtin_UQSAX + #define __UHSAX __iar_builtin_UHSAX + #define __USAD8 __iar_builtin_USAD8 + #define __USADA8 __iar_builtin_USADA8 + #define __SSAT16 __iar_builtin_SSAT16 + #define __USAT16 __iar_builtin_USAT16 + #define __UXTB16 __iar_builtin_UXTB16 + #define __UXTAB16 __iar_builtin_UXTAB16 + #define __SXTB16 __iar_builtin_SXTB16 + #define __SXTAB16 __iar_builtin_SXTAB16 + #define __SMUAD __iar_builtin_SMUAD + #define __SMUADX __iar_builtin_SMUADX + #define __SMMLA __iar_builtin_SMMLA + #define __SMLAD __iar_builtin_SMLAD + #define __SMLADX __iar_builtin_SMLADX + #define __SMLALD __iar_builtin_SMLALD + #define __SMLALDX __iar_builtin_SMLALDX + #define __SMUSD __iar_builtin_SMUSD + #define __SMUSDX __iar_builtin_SMUSDX + #define __SMLSD __iar_builtin_SMLSD + #define __SMLSDX __iar_builtin_SMLSDX + #define __SMLSLD __iar_builtin_SMLSLD + #define __SMLSLDX __iar_builtin_SMLSLDX + #define __SEL __iar_builtin_SEL + #define __QADD __iar_builtin_QADD + #define __QSUB __iar_builtin_QSUB + #define __PKHBT __iar_builtin_PKHBT + #define __PKHTB __iar_builtin_PKHTB + +#else /* __ICCARM_INTRINSICS_VERSION__ == 2 */ + + #if !__FPU_PRESENT + #define __get_FPSCR __cmsis_iar_get_FPSR_not_active + #endif + + #ifdef __INTRINSICS_INCLUDED + #error intrinsics.h is already included previously! + #endif + + #include + + #if !__FPU_PRESENT + #define __get_FPSCR() (0) + #endif + + #pragma diag_suppress=Pe940 + #pragma diag_suppress=Pe177 + + #define __enable_irq __enable_interrupt + #define __disable_irq __disable_interrupt + #define __enable_fault_irq __enable_fiq + #define __disable_fault_irq __disable_fiq + #define __NOP __no_operation + + #define __get_xPSR __get_PSR + + __IAR_FT void __set_mode(uint32_t mode) + { + __ASM volatile("MSR cpsr_c, %0" : : "r" (mode) : "memory"); + } + + __IAR_FT uint32_t __LDREXW(uint32_t volatile *ptr) + { + return __LDREX((unsigned long *)ptr); + } + + __IAR_FT uint32_t __STREXW(uint32_t value, uint32_t volatile *ptr) + { + return __STREX(value, (unsigned long *)ptr); + } + + + __IAR_FT uint32_t __RRX(uint32_t value) + { + uint32_t result; + __ASM("RRX %0, %1" : "=r"(result) : "r" (value) : "cc"); + return(result); + } + + + __IAR_FT uint32_t __ROR(uint32_t op1, uint32_t op2) + { + return (op1 >> op2) | (op1 << ((sizeof(op1)*8)-op2)); + } + + __IAR_FT uint32_t __get_FPEXC(void) + { + #if (__FPU_PRESENT == 1) + uint32_t result; + __ASM volatile("VMRS %0, fpexc" : "=r" (result) : : "memory"); + return(result); + #else + return(0); + #endif + } + + __IAR_FT void __set_FPEXC(uint32_t fpexc) + { + #if (__FPU_PRESENT == 1) + __ASM volatile ("VMSR fpexc, %0" : : "r" (fpexc) : "memory"); + #endif + } + + + #define __get_CP(cp, op1, Rt, CRn, CRm, op2) \ + __ASM volatile("MRC p" # cp ", " # op1 ", %0, c" # CRn ", c" # CRm ", " # op2 : "=r" (Rt) : : "memory" ) + #define __set_CP(cp, op1, Rt, CRn, CRm, op2) \ + __ASM volatile("MCR p" # cp ", " # op1 ", %0, c" # CRn ", c" # CRm ", " # op2 : : "r" (Rt) : "memory" ) + #define __get_CP64(cp, op1, Rt, CRm) \ + __ASM volatile("MRRC p" # cp ", " # op1 ", %Q0, %R0, c" # CRm : "=r" (Rt) : : "memory" ) + #define __set_CP64(cp, op1, Rt, CRm) \ + __ASM volatile("MCRR p" # cp ", " # op1 ", %Q0, %R0, c" # CRm : : "r" (Rt) : "memory" ) + + #include "cmsis_cp15.h" + +#endif /* __ICCARM_INTRINSICS_VERSION__ == 2 */ + +#define __BKPT(value) __asm volatile ("BKPT %0" : : "i"(value)) + + +__IAR_FT uint32_t __get_SP_usr(void) +{ + uint32_t cpsr; + uint32_t result; + __ASM volatile( + "MRS %0, cpsr \n" + "CPS #0x1F \n" // no effect in USR mode + "MOV %1, sp \n" + "MSR cpsr_c, %2 \n" // no effect in USR mode + "ISB" : "=r"(cpsr), "=r"(result) : "r"(cpsr) : "memory" + ); + return result; +} + +__IAR_FT void __set_SP_usr(uint32_t topOfProcStack) +{ + uint32_t cpsr; + __ASM volatile( + "MRS %0, cpsr \n" + "CPS #0x1F \n" // no effect in USR mode + "MOV sp, %1 \n" + "MSR cpsr_c, %2 \n" // no effect in USR mode + "ISB" : "=r"(cpsr) : "r" (topOfProcStack), "r"(cpsr) : "memory" + ); +} + +#define __get_mode() (__get_CPSR() & 0x1FU) + +__STATIC_INLINE +void __FPU_Enable(void) +{ + __ASM volatile( + //Permit access to VFP/NEON, registers by modifying CPACR + " MRC p15,0,R1,c1,c0,2 \n" + " ORR R1,R1,#0x00F00000 \n" + " MCR p15,0,R1,c1,c0,2 \n" + + //Ensure that subsequent instructions occur in the context of VFP/NEON access permitted + " ISB \n" + + //Enable VFP/NEON + " VMRS R1,FPEXC \n" + " ORR R1,R1,#0x40000000 \n" + " VMSR FPEXC,R1 \n" + + //Initialise VFP/NEON registers to 0 + " MOV R2,#0 \n" + + //Initialise D16 registers to 0 + " VMOV D0, R2,R2 \n" + " VMOV D1, R2,R2 \n" + " VMOV D2, R2,R2 \n" + " VMOV D3, R2,R2 \n" + " VMOV D4, R2,R2 \n" + " VMOV D5, R2,R2 \n" + " VMOV D6, R2,R2 \n" + " VMOV D7, R2,R2 \n" + " VMOV D8, R2,R2 \n" + " VMOV D9, R2,R2 \n" + " VMOV D10,R2,R2 \n" + " VMOV D11,R2,R2 \n" + " VMOV D12,R2,R2 \n" + " VMOV D13,R2,R2 \n" + " VMOV D14,R2,R2 \n" + " VMOV D15,R2,R2 \n" + +#ifdef __ARM_ADVANCED_SIMD__ + //Initialise D32 registers to 0 + " VMOV D16,R2,R2 \n" + " VMOV D17,R2,R2 \n" + " VMOV D18,R2,R2 \n" + " VMOV D19,R2,R2 \n" + " VMOV D20,R2,R2 \n" + " VMOV D21,R2,R2 \n" + " VMOV D22,R2,R2 \n" + " VMOV D23,R2,R2 \n" + " VMOV D24,R2,R2 \n" + " VMOV D25,R2,R2 \n" + " VMOV D26,R2,R2 \n" + " VMOV D27,R2,R2 \n" + " VMOV D28,R2,R2 \n" + " VMOV D29,R2,R2 \n" + " VMOV D30,R2,R2 \n" + " VMOV D31,R2,R2 \n" +#endif + + //Initialise FPSCR to a known state + " VMRS R2,FPSCR \n" + " MOV32 R3,#0x00086060 \n" //Mask off all bits that do not have to be preserved. Non-preserved bits can/should be zero. + " AND R2,R2,R3 \n" + " VMSR FPSCR,R2 \n"); +} + + + +#undef __IAR_FT +#undef __ICCARM_V8 + +#pragma diag_default=Pe940 +#pragma diag_default=Pe177 + +#endif /* __CMSIS_ICCARM_H__ */ diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Core_A/Include/core_ca.h b/STM32CubeMX/revF/Drivers/CMSIS/Core_A/Include/core_ca.h new file mode 100644 index 00000000..dbe9794d --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Core_A/Include/core_ca.h @@ -0,0 +1,2614 @@ +/**************************************************************************//** + * @file core_ca.h + * @brief CMSIS Cortex-A Core Peripheral Access Layer Header File + * @version V1.0.1 + * @date 07. May 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifdef __cplusplus + extern "C" { +#endif + +#ifndef __CORE_CA_H_GENERIC +#define __CORE_CA_H_GENERIC + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ + +/* CMSIS CA definitions */ +#define __CA_CMSIS_VERSION_MAIN (1U) /*!< \brief [31:16] CMSIS-Core(A) main version */ +#define __CA_CMSIS_VERSION_SUB (1U) /*!< \brief [15:0] CMSIS-Core(A) sub version */ +#define __CA_CMSIS_VERSION ((__CA_CMSIS_VERSION_MAIN << 16U) | \ + __CA_CMSIS_VERSION_SUB ) /*!< \brief CMSIS-Core(A) version number */ + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #if (__FPU_PRESENT == 1) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #if (__FPU_PRESENT == 1) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TMS470__ ) + #if defined __TI_VFP_SUPPORT__ + #if (__FPU_PRESENT == 1) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #if (__FPU_PRESENT == 1) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #if (__FPU_PRESENT == 1) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CA_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CA_H_DEPENDANT +#define __CORE_CA_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + + /* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CA_REV + #define __CA_REV 0x0000U + #warning "__CA_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __GIC_PRESENT + #define __GIC_PRESENT 1U + #warning "__GIC_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __TIM_PRESENT + #define __TIM_PRESENT 1U + #warning "__TIM_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __L2C_PRESENT + #define __L2C_PRESENT 0U + #warning "__L2C_PRESENT not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +#ifdef __cplusplus + #define __I volatile /*!< \brief Defines 'read only' permissions */ +#else + #define __I volatile const /*!< \brief Defines 'read only' permissions */ +#endif +#define __O volatile /*!< \brief Defines 'write only' permissions */ +#define __IO volatile /*!< \brief Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*!< \brief Defines 'read only' structure member permissions */ +#define __OM volatile /*!< \brief Defines 'write only' structure member permissions */ +#define __IOM volatile /*!< \brief Defines 'read / write' structure member permissions */ +#define RESERVED(N, T) T RESERVED##N; // placeholder struct members used for "reserved" areas + + /******************************************************************************* + * Register Abstraction + Core Register contain: + - CPSR + - CP15 Registers + - L2C-310 Cache Controller + - Generic Interrupt Controller Distributor + - Generic Interrupt Controller Interface + ******************************************************************************/ + +/* Core Register CPSR */ +typedef union +{ + struct + { + uint32_t M:5; /*!< \brief bit: 0.. 4 Mode field */ + uint32_t T:1; /*!< \brief bit: 5 Thumb execution state bit */ + uint32_t F:1; /*!< \brief bit: 6 FIQ mask bit */ + uint32_t I:1; /*!< \brief bit: 7 IRQ mask bit */ + uint32_t A:1; /*!< \brief bit: 8 Asynchronous abort mask bit */ + uint32_t E:1; /*!< \brief bit: 9 Endianness execution state bit */ + uint32_t IT1:6; /*!< \brief bit: 10..15 If-Then execution state bits 2-7 */ + uint32_t GE:4; /*!< \brief bit: 16..19 Greater than or Equal flags */ + RESERVED(0:4, uint32_t) + uint32_t J:1; /*!< \brief bit: 24 Jazelle bit */ + uint32_t IT0:2; /*!< \brief bit: 25..26 If-Then execution state bits 0-1 */ + uint32_t Q:1; /*!< \brief bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< \brief bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< \brief bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< \brief bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< \brief bit: 31 Negative condition code flag */ + } b; /*!< \brief Structure used for bit access */ + uint32_t w; /*!< \brief Type used for word access */ +} CPSR_Type; + + + +/* CPSR Register Definitions */ +#define CPSR_N_Pos 31U /*!< \brief CPSR: N Position */ +#define CPSR_N_Msk (1UL << CPSR_N_Pos) /*!< \brief CPSR: N Mask */ + +#define CPSR_Z_Pos 30U /*!< \brief CPSR: Z Position */ +#define CPSR_Z_Msk (1UL << CPSR_Z_Pos) /*!< \brief CPSR: Z Mask */ + +#define CPSR_C_Pos 29U /*!< \brief CPSR: C Position */ +#define CPSR_C_Msk (1UL << CPSR_C_Pos) /*!< \brief CPSR: C Mask */ + +#define CPSR_V_Pos 28U /*!< \brief CPSR: V Position */ +#define CPSR_V_Msk (1UL << CPSR_V_Pos) /*!< \brief CPSR: V Mask */ + +#define CPSR_Q_Pos 27U /*!< \brief CPSR: Q Position */ +#define CPSR_Q_Msk (1UL << CPSR_Q_Pos) /*!< \brief CPSR: Q Mask */ + +#define CPSR_IT0_Pos 25U /*!< \brief CPSR: IT0 Position */ +#define CPSR_IT0_Msk (3UL << CPSR_IT0_Pos) /*!< \brief CPSR: IT0 Mask */ + +#define CPSR_J_Pos 24U /*!< \brief CPSR: J Position */ +#define CPSR_J_Msk (1UL << CPSR_J_Pos) /*!< \brief CPSR: J Mask */ + +#define CPSR_GE_Pos 16U /*!< \brief CPSR: GE Position */ +#define CPSR_GE_Msk (0xFUL << CPSR_GE_Pos) /*!< \brief CPSR: GE Mask */ + +#define CPSR_IT1_Pos 10U /*!< \brief CPSR: IT1 Position */ +#define CPSR_IT1_Msk (0x3FUL << CPSR_IT1_Pos) /*!< \brief CPSR: IT1 Mask */ + +#define CPSR_E_Pos 9U /*!< \brief CPSR: E Position */ +#define CPSR_E_Msk (1UL << CPSR_E_Pos) /*!< \brief CPSR: E Mask */ + +#define CPSR_A_Pos 8U /*!< \brief CPSR: A Position */ +#define CPSR_A_Msk (1UL << CPSR_A_Pos) /*!< \brief CPSR: A Mask */ + +#define CPSR_I_Pos 7U /*!< \brief CPSR: I Position */ +#define CPSR_I_Msk (1UL << CPSR_I_Pos) /*!< \brief CPSR: I Mask */ + +#define CPSR_F_Pos 6U /*!< \brief CPSR: F Position */ +#define CPSR_F_Msk (1UL << CPSR_F_Pos) /*!< \brief CPSR: F Mask */ + +#define CPSR_T_Pos 5U /*!< \brief CPSR: T Position */ +#define CPSR_T_Msk (1UL << CPSR_T_Pos) /*!< \brief CPSR: T Mask */ + +#define CPSR_M_Pos 0U /*!< \brief CPSR: M Position */ +#define CPSR_M_Msk (0x1FUL << CPSR_M_Pos) /*!< \brief CPSR: M Mask */ + +#define CPSR_M_USR 0x10U /*!< \brief CPSR: M User mode (PL0) */ +#define CPSR_M_FIQ 0x11U /*!< \brief CPSR: M Fast Interrupt mode (PL1) */ +#define CPSR_M_IRQ 0x12U /*!< \brief CPSR: M Interrupt mode (PL1) */ +#define CPSR_M_SVC 0x13U /*!< \brief CPSR: M Supervisor mode (PL1) */ +#define CPSR_M_MON 0x16U /*!< \brief CPSR: M Monitor mode (PL1) */ +#define CPSR_M_ABT 0x17U /*!< \brief CPSR: M Abort mode (PL1) */ +#define CPSR_M_HYP 0x1AU /*!< \brief CPSR: M Hypervisor mode (PL2) */ +#define CPSR_M_UND 0x1BU /*!< \brief CPSR: M Undefined mode (PL1) */ +#define CPSR_M_SYS 0x1FU /*!< \brief CPSR: M System mode (PL1) */ + +/* CP15 Register SCTLR */ +typedef union +{ + struct + { + uint32_t M:1; /*!< \brief bit: 0 MMU enable */ + uint32_t A:1; /*!< \brief bit: 1 Alignment check enable */ + uint32_t C:1; /*!< \brief bit: 2 Cache enable */ + RESERVED(0:2, uint32_t) + uint32_t CP15BEN:1; /*!< \brief bit: 5 CP15 barrier enable */ + RESERVED(1:1, uint32_t) + uint32_t B:1; /*!< \brief bit: 7 Endianness model */ + RESERVED(2:2, uint32_t) + uint32_t SW:1; /*!< \brief bit: 10 SWP and SWPB enable */ + uint32_t Z:1; /*!< \brief bit: 11 Branch prediction enable */ + uint32_t I:1; /*!< \brief bit: 12 Instruction cache enable */ + uint32_t V:1; /*!< \brief bit: 13 Vectors bit */ + uint32_t RR:1; /*!< \brief bit: 14 Round Robin select */ + RESERVED(3:2, uint32_t) + uint32_t HA:1; /*!< \brief bit: 17 Hardware Access flag enable */ + RESERVED(4:1, uint32_t) + uint32_t WXN:1; /*!< \brief bit: 19 Write permission implies XN */ + uint32_t UWXN:1; /*!< \brief bit: 20 Unprivileged write permission implies PL1 XN */ + uint32_t FI:1; /*!< \brief bit: 21 Fast interrupts configuration enable */ + uint32_t U:1; /*!< \brief bit: 22 Alignment model */ + RESERVED(5:1, uint32_t) + uint32_t VE:1; /*!< \brief bit: 24 Interrupt Vectors Enable */ + uint32_t EE:1; /*!< \brief bit: 25 Exception Endianness */ + RESERVED(6:1, uint32_t) + uint32_t NMFI:1; /*!< \brief bit: 27 Non-maskable FIQ (NMFI) support */ + uint32_t TRE:1; /*!< \brief bit: 28 TEX remap enable. */ + uint32_t AFE:1; /*!< \brief bit: 29 Access flag enable */ + uint32_t TE:1; /*!< \brief bit: 30 Thumb Exception enable */ + RESERVED(7:1, uint32_t) + } b; /*!< \brief Structure used for bit access */ + uint32_t w; /*!< \brief Type used for word access */ +} SCTLR_Type; + +#define SCTLR_TE_Pos 30U /*!< \brief SCTLR: TE Position */ +#define SCTLR_TE_Msk (1UL << SCTLR_TE_Pos) /*!< \brief SCTLR: TE Mask */ + +#define SCTLR_AFE_Pos 29U /*!< \brief SCTLR: AFE Position */ +#define SCTLR_AFE_Msk (1UL << SCTLR_AFE_Pos) /*!< \brief SCTLR: AFE Mask */ + +#define SCTLR_TRE_Pos 28U /*!< \brief SCTLR: TRE Position */ +#define SCTLR_TRE_Msk (1UL << SCTLR_TRE_Pos) /*!< \brief SCTLR: TRE Mask */ + +#define SCTLR_NMFI_Pos 27U /*!< \brief SCTLR: NMFI Position */ +#define SCTLR_NMFI_Msk (1UL << SCTLR_NMFI_Pos) /*!< \brief SCTLR: NMFI Mask */ + +#define SCTLR_EE_Pos 25U /*!< \brief SCTLR: EE Position */ +#define SCTLR_EE_Msk (1UL << SCTLR_EE_Pos) /*!< \brief SCTLR: EE Mask */ + +#define SCTLR_VE_Pos 24U /*!< \brief SCTLR: VE Position */ +#define SCTLR_VE_Msk (1UL << SCTLR_VE_Pos) /*!< \brief SCTLR: VE Mask */ + +#define SCTLR_U_Pos 22U /*!< \brief SCTLR: U Position */ +#define SCTLR_U_Msk (1UL << SCTLR_U_Pos) /*!< \brief SCTLR: U Mask */ + +#define SCTLR_FI_Pos 21U /*!< \brief SCTLR: FI Position */ +#define SCTLR_FI_Msk (1UL << SCTLR_FI_Pos) /*!< \brief SCTLR: FI Mask */ + +#define SCTLR_UWXN_Pos 20U /*!< \brief SCTLR: UWXN Position */ +#define SCTLR_UWXN_Msk (1UL << SCTLR_UWXN_Pos) /*!< \brief SCTLR: UWXN Mask */ + +#define SCTLR_WXN_Pos 19U /*!< \brief SCTLR: WXN Position */ +#define SCTLR_WXN_Msk (1UL << SCTLR_WXN_Pos) /*!< \brief SCTLR: WXN Mask */ + +#define SCTLR_HA_Pos 17U /*!< \brief SCTLR: HA Position */ +#define SCTLR_HA_Msk (1UL << SCTLR_HA_Pos) /*!< \brief SCTLR: HA Mask */ + +#define SCTLR_RR_Pos 14U /*!< \brief SCTLR: RR Position */ +#define SCTLR_RR_Msk (1UL << SCTLR_RR_Pos) /*!< \brief SCTLR: RR Mask */ + +#define SCTLR_V_Pos 13U /*!< \brief SCTLR: V Position */ +#define SCTLR_V_Msk (1UL << SCTLR_V_Pos) /*!< \brief SCTLR: V Mask */ + +#define SCTLR_I_Pos 12U /*!< \brief SCTLR: I Position */ +#define SCTLR_I_Msk (1UL << SCTLR_I_Pos) /*!< \brief SCTLR: I Mask */ + +#define SCTLR_Z_Pos 11U /*!< \brief SCTLR: Z Position */ +#define SCTLR_Z_Msk (1UL << SCTLR_Z_Pos) /*!< \brief SCTLR: Z Mask */ + +#define SCTLR_SW_Pos 10U /*!< \brief SCTLR: SW Position */ +#define SCTLR_SW_Msk (1UL << SCTLR_SW_Pos) /*!< \brief SCTLR: SW Mask */ + +#define SCTLR_B_Pos 7U /*!< \brief SCTLR: B Position */ +#define SCTLR_B_Msk (1UL << SCTLR_B_Pos) /*!< \brief SCTLR: B Mask */ + +#define SCTLR_CP15BEN_Pos 5U /*!< \brief SCTLR: CP15BEN Position */ +#define SCTLR_CP15BEN_Msk (1UL << SCTLR_CP15BEN_Pos) /*!< \brief SCTLR: CP15BEN Mask */ + +#define SCTLR_C_Pos 2U /*!< \brief SCTLR: C Position */ +#define SCTLR_C_Msk (1UL << SCTLR_C_Pos) /*!< \brief SCTLR: C Mask */ + +#define SCTLR_A_Pos 1U /*!< \brief SCTLR: A Position */ +#define SCTLR_A_Msk (1UL << SCTLR_A_Pos) /*!< \brief SCTLR: A Mask */ + +#define SCTLR_M_Pos 0U /*!< \brief SCTLR: M Position */ +#define SCTLR_M_Msk (1UL << SCTLR_M_Pos) /*!< \brief SCTLR: M Mask */ + +/* CP15 Register ACTLR */ +typedef union +{ +#if __CORTEX_A == 5 || defined(DOXYGEN) + /** \brief Structure used for bit access on Cortex-A5 */ + struct + { + uint32_t FW:1; /*!< \brief bit: 0 Cache and TLB maintenance broadcast */ + RESERVED(0:5, uint32_t) + uint32_t SMP:1; /*!< \brief bit: 6 Enables coherent requests to the processor */ + uint32_t EXCL:1; /*!< \brief bit: 7 Exclusive L1/L2 cache control */ + RESERVED(1:2, uint32_t) + uint32_t DODMBS:1; /*!< \brief bit: 10 Disable optimized data memory barrier behavior */ + uint32_t DWBST:1; /*!< \brief bit: 11 AXI data write bursts to Normal memory */ + uint32_t RADIS:1; /*!< \brief bit: 12 L1 Data Cache read-allocate mode disable */ + uint32_t L1PCTL:2; /*!< \brief bit:13..14 L1 Data prefetch control */ + uint32_t BP:2; /*!< \brief bit:16..15 Branch prediction policy */ + uint32_t RSDIS:1; /*!< \brief bit: 17 Disable return stack operation */ + uint32_t BTDIS:1; /*!< \brief bit: 18 Disable indirect Branch Target Address Cache (BTAC) */ + RESERVED(3:9, uint32_t) + uint32_t DBDI:1; /*!< \brief bit: 28 Disable branch dual issue */ + RESERVED(7:3, uint32_t) + } b; +#endif +#if __CORTEX_A == 7 || defined(DOXYGEN) + /** \brief Structure used for bit access on Cortex-A7 */ + struct + { + RESERVED(0:6, uint32_t) + uint32_t SMP:1; /*!< \brief bit: 6 Enables coherent requests to the processor */ + RESERVED(1:3, uint32_t) + uint32_t DODMBS:1; /*!< \brief bit: 10 Disable optimized data memory barrier behavior */ + uint32_t L2RADIS:1; /*!< \brief bit: 11 L2 Data Cache read-allocate mode disable */ + uint32_t L1RADIS:1; /*!< \brief bit: 12 L1 Data Cache read-allocate mode disable */ + uint32_t L1PCTL:2; /*!< \brief bit:13..14 L1 Data prefetch control */ + uint32_t DDVM:1; /*!< \brief bit: 15 Disable Distributed Virtual Memory (DVM) transactions */ + RESERVED(3:12, uint32_t) + uint32_t DDI:1; /*!< \brief bit: 28 Disable dual issue */ + RESERVED(7:3, uint32_t) + } b; +#endif +#if __CORTEX_A == 9 || defined(DOXYGEN) + /** \brief Structure used for bit access on Cortex-A9 */ + struct + { + uint32_t FW:1; /*!< \brief bit: 0 Cache and TLB maintenance broadcast */ + RESERVED(0:1, uint32_t) + uint32_t L1PE:1; /*!< \brief bit: 2 Dside prefetch */ + uint32_t WFLZM:1; /*!< \brief bit: 3 Cache and TLB maintenance broadcast */ + RESERVED(1:2, uint32_t) + uint32_t SMP:1; /*!< \brief bit: 6 Enables coherent requests to the processor */ + uint32_t EXCL:1; /*!< \brief bit: 7 Exclusive L1/L2 cache control */ + uint32_t AOW:1; /*!< \brief bit: 8 Enable allocation in one cache way only */ + uint32_t PARITY:1; /*!< \brief bit: 9 Support for parity checking, if implemented */ + RESERVED(7:22, uint32_t) + } b; +#endif + uint32_t w; /*!< \brief Type used for word access */ +} ACTLR_Type; + +#define ACTLR_DDI_Pos 28U /*!< \brief ACTLR: DDI Position */ +#define ACTLR_DDI_Msk (1UL << ACTLR_DDI_Pos) /*!< \brief ACTLR: DDI Mask */ + +#define ACTLR_DBDI_Pos 28U /*!< \brief ACTLR: DBDI Position */ +#define ACTLR_DBDI_Msk (1UL << ACTLR_DBDI_Pos) /*!< \brief ACTLR: DBDI Mask */ + +#define ACTLR_BTDIS_Pos 18U /*!< \brief ACTLR: BTDIS Position */ +#define ACTLR_BTDIS_Msk (1UL << ACTLR_BTDIS_Pos) /*!< \brief ACTLR: BTDIS Mask */ + +#define ACTLR_RSDIS_Pos 17U /*!< \brief ACTLR: RSDIS Position */ +#define ACTLR_RSDIS_Msk (1UL << ACTLR_RSDIS_Pos) /*!< \brief ACTLR: RSDIS Mask */ + +#define ACTLR_BP_Pos 15U /*!< \brief ACTLR: BP Position */ +#define ACTLR_BP_Msk (3UL << ACTLR_BP_Pos) /*!< \brief ACTLR: BP Mask */ + +#define ACTLR_DDVM_Pos 15U /*!< \brief ACTLR: DDVM Position */ +#define ACTLR_DDVM_Msk (1UL << ACTLR_DDVM_Pos) /*!< \brief ACTLR: DDVM Mask */ + +#define ACTLR_L1PCTL_Pos 13U /*!< \brief ACTLR: L1PCTL Position */ +#define ACTLR_L1PCTL_Msk (3UL << ACTLR_L1PCTL_Pos) /*!< \brief ACTLR: L1PCTL Mask */ + +#define ACTLR_RADIS_Pos 12U /*!< \brief ACTLR: RADIS Position */ +#define ACTLR_RADIS_Msk (1UL << ACTLR_RADIS_Pos) /*!< \brief ACTLR: RADIS Mask */ + +#define ACTLR_L1RADIS_Pos 12U /*!< \brief ACTLR: L1RADIS Position */ +#define ACTLR_L1RADIS_Msk (1UL << ACTLR_L1RADIS_Pos) /*!< \brief ACTLR: L1RADIS Mask */ + +#define ACTLR_DWBST_Pos 11U /*!< \brief ACTLR: DWBST Position */ +#define ACTLR_DWBST_Msk (1UL << ACTLR_DWBST_Pos) /*!< \brief ACTLR: DWBST Mask */ + +#define ACTLR_L2RADIS_Pos 11U /*!< \brief ACTLR: L2RADIS Position */ +#define ACTLR_L2RADIS_Msk (1UL << ACTLR_L2RADIS_Pos) /*!< \brief ACTLR: L2RADIS Mask */ + +#define ACTLR_DODMBS_Pos 10U /*!< \brief ACTLR: DODMBS Position */ +#define ACTLR_DODMBS_Msk (1UL << ACTLR_DODMBS_Pos) /*!< \brief ACTLR: DODMBS Mask */ + +#define ACTLR_PARITY_Pos 9U /*!< \brief ACTLR: PARITY Position */ +#define ACTLR_PARITY_Msk (1UL << ACTLR_PARITY_Pos) /*!< \brief ACTLR: PARITY Mask */ + +#define ACTLR_AOW_Pos 8U /*!< \brief ACTLR: AOW Position */ +#define ACTLR_AOW_Msk (1UL << ACTLR_AOW_Pos) /*!< \brief ACTLR: AOW Mask */ + +#define ACTLR_EXCL_Pos 7U /*!< \brief ACTLR: EXCL Position */ +#define ACTLR_EXCL_Msk (1UL << ACTLR_EXCL_Pos) /*!< \brief ACTLR: EXCL Mask */ + +#define ACTLR_SMP_Pos 6U /*!< \brief ACTLR: SMP Position */ +#define ACTLR_SMP_Msk (1UL << ACTLR_SMP_Pos) /*!< \brief ACTLR: SMP Mask */ + +#define ACTLR_WFLZM_Pos 3U /*!< \brief ACTLR: WFLZM Position */ +#define ACTLR_WFLZM_Msk (1UL << ACTLR_WFLZM_Pos) /*!< \brief ACTLR: WFLZM Mask */ + +#define ACTLR_L1PE_Pos 2U /*!< \brief ACTLR: L1PE Position */ +#define ACTLR_L1PE_Msk (1UL << ACTLR_L1PE_Pos) /*!< \brief ACTLR: L1PE Mask */ + +#define ACTLR_FW_Pos 0U /*!< \brief ACTLR: FW Position */ +#define ACTLR_FW_Msk (1UL << ACTLR_FW_Pos) /*!< \brief ACTLR: FW Mask */ + +/* CP15 Register CPACR */ +typedef union +{ + struct + { + uint32_t CP0:2; /*!< \brief bit: 0..1 Access rights for coprocessor 0 */ + uint32_t CP1:2; /*!< \brief bit: 2..3 Access rights for coprocessor 1 */ + uint32_t CP2:2; /*!< \brief bit: 4..5 Access rights for coprocessor 2 */ + uint32_t CP3:2; /*!< \brief bit: 6..7 Access rights for coprocessor 3 */ + uint32_t CP4:2; /*!< \brief bit: 8..9 Access rights for coprocessor 4 */ + uint32_t CP5:2; /*!< \brief bit:10..11 Access rights for coprocessor 5 */ + uint32_t CP6:2; /*!< \brief bit:12..13 Access rights for coprocessor 6 */ + uint32_t CP7:2; /*!< \brief bit:14..15 Access rights for coprocessor 7 */ + uint32_t CP8:2; /*!< \brief bit:16..17 Access rights for coprocessor 8 */ + uint32_t CP9:2; /*!< \brief bit:18..19 Access rights for coprocessor 9 */ + uint32_t CP10:2; /*!< \brief bit:20..21 Access rights for coprocessor 10 */ + uint32_t CP11:2; /*!< \brief bit:22..23 Access rights for coprocessor 11 */ + uint32_t CP12:2; /*!< \brief bit:24..25 Access rights for coprocessor 11 */ + uint32_t CP13:2; /*!< \brief bit:26..27 Access rights for coprocessor 11 */ + uint32_t TRCDIS:1; /*!< \brief bit: 28 Disable CP14 access to trace registers */ + RESERVED(0:1, uint32_t) + uint32_t D32DIS:1; /*!< \brief bit: 30 Disable use of registers D16-D31 of the VFP register file */ + uint32_t ASEDIS:1; /*!< \brief bit: 31 Disable Advanced SIMD Functionality */ + } b; /*!< \brief Structure used for bit access */ + uint32_t w; /*!< \brief Type used for word access */ +} CPACR_Type; + +#define CPACR_ASEDIS_Pos 31U /*!< \brief CPACR: ASEDIS Position */ +#define CPACR_ASEDIS_Msk (1UL << CPACR_ASEDIS_Pos) /*!< \brief CPACR: ASEDIS Mask */ + +#define CPACR_D32DIS_Pos 30U /*!< \brief CPACR: D32DIS Position */ +#define CPACR_D32DIS_Msk (1UL << CPACR_D32DIS_Pos) /*!< \brief CPACR: D32DIS Mask */ + +#define CPACR_TRCDIS_Pos 28U /*!< \brief CPACR: D32DIS Position */ +#define CPACR_TRCDIS_Msk (1UL << CPACR_D32DIS_Pos) /*!< \brief CPACR: D32DIS Mask */ + +#define CPACR_CP_Pos_(n) (n*2U) /*!< \brief CPACR: CPn Position */ +#define CPACR_CP_Msk_(n) (3UL << CPACR_CP_Pos_(n)) /*!< \brief CPACR: CPn Mask */ + +#define CPACR_CP_NA 0U /*!< \brief CPACR CPn field: Access denied. */ +#define CPACR_CP_PL1 1U /*!< \brief CPACR CPn field: Accessible from PL1 only. */ +#define CPACR_CP_FA 3U /*!< \brief CPACR CPn field: Full access. */ + +/* CP15 Register DFSR */ +typedef union +{ + struct + { + uint32_t FS0:4; /*!< \brief bit: 0.. 3 Fault Status bits bit 0-3 */ + uint32_t Domain:4; /*!< \brief bit: 4.. 7 Fault on which domain */ + RESERVED(0:1, uint32_t) + uint32_t LPAE:1; /*!< \brief bit: 9 Large Physical Address Extension */ + uint32_t FS1:1; /*!< \brief bit: 10 Fault Status bits bit 4 */ + uint32_t WnR:1; /*!< \brief bit: 11 Write not Read bit */ + uint32_t ExT:1; /*!< \brief bit: 12 External abort type */ + uint32_t CM:1; /*!< \brief bit: 13 Cache maintenance fault */ + RESERVED(1:18, uint32_t) + } s; /*!< \brief Structure used for bit access in short format */ + struct + { + uint32_t STATUS:5; /*!< \brief bit: 0.. 5 Fault Status bits */ + RESERVED(0:3, uint32_t) + uint32_t LPAE:1; /*!< \brief bit: 9 Large Physical Address Extension */ + RESERVED(1:1, uint32_t) + uint32_t WnR:1; /*!< \brief bit: 11 Write not Read bit */ + uint32_t ExT:1; /*!< \brief bit: 12 External abort type */ + uint32_t CM:1; /*!< \brief bit: 13 Cache maintenance fault */ + RESERVED(2:18, uint32_t) + } l; /*!< \brief Structure used for bit access in long format */ + uint32_t w; /*!< \brief Type used for word access */ +} DFSR_Type; + +#define DFSR_CM_Pos 13U /*!< \brief DFSR: CM Position */ +#define DFSR_CM_Msk (1UL << DFSR_CM_Pos) /*!< \brief DFSR: CM Mask */ + +#define DFSR_Ext_Pos 12U /*!< \brief DFSR: Ext Position */ +#define DFSR_Ext_Msk (1UL << DFSR_Ext_Pos) /*!< \brief DFSR: Ext Mask */ + +#define DFSR_WnR_Pos 11U /*!< \brief DFSR: WnR Position */ +#define DFSR_WnR_Msk (1UL << DFSR_WnR_Pos) /*!< \brief DFSR: WnR Mask */ + +#define DFSR_FS1_Pos 10U /*!< \brief DFSR: FS1 Position */ +#define DFSR_FS1_Msk (1UL << DFSR_FS1_Pos) /*!< \brief DFSR: FS1 Mask */ + +#define DFSR_LPAE_Pos 9U /*!< \brief DFSR: LPAE Position */ +#define DFSR_LPAE_Msk (1UL << DFSR_LPAE_Pos) /*!< \brief DFSR: LPAE Mask */ + +#define DFSR_Domain_Pos 4U /*!< \brief DFSR: Domain Position */ +#define DFSR_Domain_Msk (0xFUL << DFSR_Domain_Pos) /*!< \brief DFSR: Domain Mask */ + +#define DFSR_FS0_Pos 0U /*!< \brief DFSR: FS0 Position */ +#define DFSR_FS0_Msk (0xFUL << DFSR_FS0_Pos) /*!< \brief DFSR: FS0 Mask */ + +#define DFSR_STATUS_Pos 0U /*!< \brief DFSR: STATUS Position */ +#define DFSR_STATUS_Msk (0x3FUL << DFSR_STATUS_Pos) /*!< \brief DFSR: STATUS Mask */ + +/* CP15 Register IFSR */ +typedef union +{ + struct + { + uint32_t FS0:4; /*!< \brief bit: 0.. 3 Fault Status bits bit 0-3 */ + RESERVED(0:5, uint32_t) + uint32_t LPAE:1; /*!< \brief bit: 9 Large Physical Address Extension */ + uint32_t FS1:1; /*!< \brief bit: 10 Fault Status bits bit 4 */ + RESERVED(1:1, uint32_t) + uint32_t ExT:1; /*!< \brief bit: 12 External abort type */ + RESERVED(2:19, uint32_t) + } s; /*!< \brief Structure used for bit access in short format */ + struct + { + uint32_t STATUS:6; /*!< \brief bit: 0.. 5 Fault Status bits */ + RESERVED(0:3, uint32_t) + uint32_t LPAE:1; /*!< \brief bit: 9 Large Physical Address Extension */ + RESERVED(1:2, uint32_t) + uint32_t ExT:1; /*!< \brief bit: 12 External abort type */ + RESERVED(2:19, uint32_t) + } l; /*!< \brief Structure used for bit access in long format */ + uint32_t w; /*!< \brief Type used for word access */ +} IFSR_Type; + +#define IFSR_ExT_Pos 12U /*!< \brief IFSR: ExT Position */ +#define IFSR_ExT_Msk (1UL << IFSR_ExT_Pos) /*!< \brief IFSR: ExT Mask */ + +#define IFSR_FS1_Pos 10U /*!< \brief IFSR: FS1 Position */ +#define IFSR_FS1_Msk (1UL << IFSR_FS1_Pos) /*!< \brief IFSR: FS1 Mask */ + +#define IFSR_LPAE_Pos 9U /*!< \brief IFSR: LPAE Position */ +#define IFSR_LPAE_Msk (0x1UL << IFSR_LPAE_Pos) /*!< \brief IFSR: LPAE Mask */ + +#define IFSR_FS0_Pos 0U /*!< \brief IFSR: FS0 Position */ +#define IFSR_FS0_Msk (0xFUL << IFSR_FS0_Pos) /*!< \brief IFSR: FS0 Mask */ + +#define IFSR_STATUS_Pos 0U /*!< \brief IFSR: STATUS Position */ +#define IFSR_STATUS_Msk (0x3FUL << IFSR_STATUS_Pos) /*!< \brief IFSR: STATUS Mask */ + +/* CP15 Register ISR */ +typedef union +{ + struct + { + RESERVED(0:6, uint32_t) + uint32_t F:1; /*!< \brief bit: 6 FIQ pending bit */ + uint32_t I:1; /*!< \brief bit: 7 IRQ pending bit */ + uint32_t A:1; /*!< \brief bit: 8 External abort pending bit */ + RESERVED(1:23, uint32_t) + } b; /*!< \brief Structure used for bit access */ + uint32_t w; /*!< \brief Type used for word access */ +} ISR_Type; + +#define ISR_A_Pos 13U /*!< \brief ISR: A Position */ +#define ISR_A_Msk (1UL << ISR_A_Pos) /*!< \brief ISR: A Mask */ + +#define ISR_I_Pos 12U /*!< \brief ISR: I Position */ +#define ISR_I_Msk (1UL << ISR_I_Pos) /*!< \brief ISR: I Mask */ + +#define ISR_F_Pos 11U /*!< \brief ISR: F Position */ +#define ISR_F_Msk (1UL << ISR_F_Pos) /*!< \brief ISR: F Mask */ + +/* DACR Register */ +#define DACR_D_Pos_(n) (2U*n) /*!< \brief DACR: Dn Position */ +#define DACR_D_Msk_(n) (3UL << DACR_D_Pos_(n)) /*!< \brief DACR: Dn Mask */ +#define DACR_Dn_NOACCESS 0U /*!< \brief DACR Dn field: No access */ +#define DACR_Dn_CLIENT 1U /*!< \brief DACR Dn field: Client */ +#define DACR_Dn_MANAGER 3U /*!< \brief DACR Dn field: Manager */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param [in] field Name of the register bit field. + \param [in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param [in] field Name of the register bit field. + \param [in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + + +/** + \brief Union type to access the L2C_310 Cache Controller. +*/ +#if (__L2C_PRESENT == 1U) || defined(DOXYGEN) +typedef struct +{ + __IM uint32_t CACHE_ID; /*!< \brief Offset: 0x0000 (R/ ) Cache ID Register */ + __IM uint32_t CACHE_TYPE; /*!< \brief Offset: 0x0004 (R/ ) Cache Type Register */ + RESERVED(0[0x3e], uint32_t) + __IOM uint32_t CONTROL; /*!< \brief Offset: 0x0100 (R/W) Control Register */ + __IOM uint32_t AUX_CNT; /*!< \brief Offset: 0x0104 (R/W) Auxiliary Control */ + RESERVED(1[0x3e], uint32_t) + __IOM uint32_t EVENT_CONTROL; /*!< \brief Offset: 0x0200 (R/W) Event Counter Control */ + __IOM uint32_t EVENT_COUNTER1_CONF; /*!< \brief Offset: 0x0204 (R/W) Event Counter 1 Configuration */ + __IOM uint32_t EVENT_COUNTER0_CONF; /*!< \brief Offset: 0x0208 (R/W) Event Counter 1 Configuration */ + RESERVED(2[0x2], uint32_t) + __IOM uint32_t INTERRUPT_MASK; /*!< \brief Offset: 0x0214 (R/W) Interrupt Mask */ + __IM uint32_t MASKED_INT_STATUS; /*!< \brief Offset: 0x0218 (R/ ) Masked Interrupt Status */ + __IM uint32_t RAW_INT_STATUS; /*!< \brief Offset: 0x021c (R/ ) Raw Interrupt Status */ + __OM uint32_t INTERRUPT_CLEAR; /*!< \brief Offset: 0x0220 ( /W) Interrupt Clear */ + RESERVED(3[0x143], uint32_t) + __IOM uint32_t CACHE_SYNC; /*!< \brief Offset: 0x0730 (R/W) Cache Sync */ + RESERVED(4[0xf], uint32_t) + __IOM uint32_t INV_LINE_PA; /*!< \brief Offset: 0x0770 (R/W) Invalidate Line By PA */ + RESERVED(6[2], uint32_t) + __IOM uint32_t INV_WAY; /*!< \brief Offset: 0x077c (R/W) Invalidate by Way */ + RESERVED(5[0xc], uint32_t) + __IOM uint32_t CLEAN_LINE_PA; /*!< \brief Offset: 0x07b0 (R/W) Clean Line by PA */ + RESERVED(7[1], uint32_t) + __IOM uint32_t CLEAN_LINE_INDEX_WAY; /*!< \brief Offset: 0x07b8 (R/W) Clean Line by Index/Way */ + __IOM uint32_t CLEAN_WAY; /*!< \brief Offset: 0x07bc (R/W) Clean by Way */ + RESERVED(8[0xc], uint32_t) + __IOM uint32_t CLEAN_INV_LINE_PA; /*!< \brief Offset: 0x07f0 (R/W) Clean and Invalidate Line by PA */ + RESERVED(9[1], uint32_t) + __IOM uint32_t CLEAN_INV_LINE_INDEX_WAY; /*!< \brief Offset: 0x07f8 (R/W) Clean and Invalidate Line by Index/Way */ + __IOM uint32_t CLEAN_INV_WAY; /*!< \brief Offset: 0x07fc (R/W) Clean and Invalidate by Way */ + RESERVED(10[0x40], uint32_t) + __IOM uint32_t DATA_LOCK_0_WAY; /*!< \brief Offset: 0x0900 (R/W) Data Lockdown 0 by Way */ + __IOM uint32_t INST_LOCK_0_WAY; /*!< \brief Offset: 0x0904 (R/W) Instruction Lockdown 0 by Way */ + __IOM uint32_t DATA_LOCK_1_WAY; /*!< \brief Offset: 0x0908 (R/W) Data Lockdown 1 by Way */ + __IOM uint32_t INST_LOCK_1_WAY; /*!< \brief Offset: 0x090c (R/W) Instruction Lockdown 1 by Way */ + __IOM uint32_t DATA_LOCK_2_WAY; /*!< \brief Offset: 0x0910 (R/W) Data Lockdown 2 by Way */ + __IOM uint32_t INST_LOCK_2_WAY; /*!< \brief Offset: 0x0914 (R/W) Instruction Lockdown 2 by Way */ + __IOM uint32_t DATA_LOCK_3_WAY; /*!< \brief Offset: 0x0918 (R/W) Data Lockdown 3 by Way */ + __IOM uint32_t INST_LOCK_3_WAY; /*!< \brief Offset: 0x091c (R/W) Instruction Lockdown 3 by Way */ + __IOM uint32_t DATA_LOCK_4_WAY; /*!< \brief Offset: 0x0920 (R/W) Data Lockdown 4 by Way */ + __IOM uint32_t INST_LOCK_4_WAY; /*!< \brief Offset: 0x0924 (R/W) Instruction Lockdown 4 by Way */ + __IOM uint32_t DATA_LOCK_5_WAY; /*!< \brief Offset: 0x0928 (R/W) Data Lockdown 5 by Way */ + __IOM uint32_t INST_LOCK_5_WAY; /*!< \brief Offset: 0x092c (R/W) Instruction Lockdown 5 by Way */ + __IOM uint32_t DATA_LOCK_6_WAY; /*!< \brief Offset: 0x0930 (R/W) Data Lockdown 5 by Way */ + __IOM uint32_t INST_LOCK_6_WAY; /*!< \brief Offset: 0x0934 (R/W) Instruction Lockdown 5 by Way */ + __IOM uint32_t DATA_LOCK_7_WAY; /*!< \brief Offset: 0x0938 (R/W) Data Lockdown 6 by Way */ + __IOM uint32_t INST_LOCK_7_WAY; /*!< \brief Offset: 0x093c (R/W) Instruction Lockdown 6 by Way */ + RESERVED(11[0x4], uint32_t) + __IOM uint32_t LOCK_LINE_EN; /*!< \brief Offset: 0x0950 (R/W) Lockdown by Line Enable */ + __IOM uint32_t UNLOCK_ALL_BY_WAY; /*!< \brief Offset: 0x0954 (R/W) Unlock All Lines by Way */ + RESERVED(12[0xaa], uint32_t) + __IOM uint32_t ADDRESS_FILTER_START; /*!< \brief Offset: 0x0c00 (R/W) Address Filtering Start */ + __IOM uint32_t ADDRESS_FILTER_END; /*!< \brief Offset: 0x0c04 (R/W) Address Filtering End */ + RESERVED(13[0xce], uint32_t) + __IOM uint32_t DEBUG_CONTROL; /*!< \brief Offset: 0x0f40 (R/W) Debug Control Register */ +} L2C_310_TypeDef; + +#define L2C_310 ((L2C_310_TypeDef *)L2C_310_BASE) /*!< \brief L2C_310 register set access pointer */ +#endif + +#if (__GIC_PRESENT == 1U) || defined(DOXYGEN) + +/** \brief Structure type to access the Generic Interrupt Controller Distributor (GICD) +*/ +typedef struct +{ + __IOM uint32_t CTLR; /*!< \brief Offset: 0x000 (R/W) Distributor Control Register */ + __IM uint32_t TYPER; /*!< \brief Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + __IM uint32_t IIDR; /*!< \brief Offset: 0x008 (R/ ) Distributor Implementer Identification Register */ + RESERVED(0, uint32_t) + __IOM uint32_t STATUSR; /*!< \brief Offset: 0x010 (R/W) Error Reporting Status Register, optional */ + RESERVED(1[11], uint32_t) + __OM uint32_t SETSPI_NSR; /*!< \brief Offset: 0x040 ( /W) Set SPI Register */ + RESERVED(2, uint32_t) + __OM uint32_t CLRSPI_NSR; /*!< \brief Offset: 0x048 ( /W) Clear SPI Register */ + RESERVED(3, uint32_t) + __OM uint32_t SETSPI_SR; /*!< \brief Offset: 0x050 ( /W) Set SPI, Secure Register */ + RESERVED(4, uint32_t) + __OM uint32_t CLRSPI_SR; /*!< \brief Offset: 0x058 ( /W) Clear SPI, Secure Register */ + RESERVED(5[9], uint32_t) + __IOM uint32_t IGROUPR[32]; /*!< \brief Offset: 0x080 (R/W) Interrupt Group Registers */ + __IOM uint32_t ISENABLER[32]; /*!< \brief Offset: 0x100 (R/W) Interrupt Set-Enable Registers */ + __IOM uint32_t ICENABLER[32]; /*!< \brief Offset: 0x180 (R/W) Interrupt Clear-Enable Registers */ + __IOM uint32_t ISPENDR[32]; /*!< \brief Offset: 0x200 (R/W) Interrupt Set-Pending Registers */ + __IOM uint32_t ICPENDR[32]; /*!< \brief Offset: 0x280 (R/W) Interrupt Clear-Pending Registers */ + __IOM uint32_t ISACTIVER[32]; /*!< \brief Offset: 0x300 (R/W) Interrupt Set-Active Registers */ + __IOM uint32_t ICACTIVER[32]; /*!< \brief Offset: 0x380 (R/W) Interrupt Clear-Active Registers */ + __IOM uint32_t IPRIORITYR[255]; /*!< \brief Offset: 0x400 (R/W) Interrupt Priority Registers */ + RESERVED(6, uint32_t) + __IOM uint32_t ITARGETSR[255]; /*!< \brief Offset: 0x800 (R/W) Interrupt Targets Registers */ + RESERVED(7, uint32_t) + __IOM uint32_t ICFGR[64]; /*!< \brief Offset: 0xC00 (R/W) Interrupt Configuration Registers */ + __IOM uint32_t IGRPMODR[32]; /*!< \brief Offset: 0xD00 (R/W) Interrupt Group Modifier Registers */ + RESERVED(8[32], uint32_t) + __IOM uint32_t NSACR[64]; /*!< \brief Offset: 0xE00 (R/W) Non-secure Access Control Registers */ + __OM uint32_t SGIR; /*!< \brief Offset: 0xF00 ( /W) Software Generated Interrupt Register */ + RESERVED(9[3], uint32_t) + __IOM uint32_t CPENDSGIR[4]; /*!< \brief Offset: 0xF10 (R/W) SGI Clear-Pending Registers */ + __IOM uint32_t SPENDSGIR[4]; /*!< \brief Offset: 0xF20 (R/W) SGI Set-Pending Registers */ + RESERVED(10[5236], uint32_t) + __IOM uint64_t IROUTER[988]; /*!< \brief Offset: 0x6100(R/W) Interrupt Routing Registers */ +} GICDistributor_Type; + +#define GICDistributor ((GICDistributor_Type *) GIC_DISTRIBUTOR_BASE ) /*!< \brief GIC Distributor register set access pointer */ + +/** \brief Structure type to access the Generic Interrupt Controller Interface (GICC) +*/ +typedef struct +{ + __IOM uint32_t CTLR; /*!< \brief Offset: 0x000 (R/W) CPU Interface Control Register */ + __IOM uint32_t PMR; /*!< \brief Offset: 0x004 (R/W) Interrupt Priority Mask Register */ + __IOM uint32_t BPR; /*!< \brief Offset: 0x008 (R/W) Binary Point Register */ + __IM uint32_t IAR; /*!< \brief Offset: 0x00C (R/ ) Interrupt Acknowledge Register */ + __OM uint32_t EOIR; /*!< \brief Offset: 0x010 ( /W) End Of Interrupt Register */ + __IM uint32_t RPR; /*!< \brief Offset: 0x014 (R/ ) Running Priority Register */ + __IM uint32_t HPPIR; /*!< \brief Offset: 0x018 (R/ ) Highest Priority Pending Interrupt Register */ + __IOM uint32_t ABPR; /*!< \brief Offset: 0x01C (R/W) Aliased Binary Point Register */ + __IM uint32_t AIAR; /*!< \brief Offset: 0x020 (R/ ) Aliased Interrupt Acknowledge Register */ + __OM uint32_t AEOIR; /*!< \brief Offset: 0x024 ( /W) Aliased End Of Interrupt Register */ + __IM uint32_t AHPPIR; /*!< \brief Offset: 0x028 (R/ ) Aliased Highest Priority Pending Interrupt Register */ + __IOM uint32_t STATUSR; /*!< \brief Offset: 0x02C (R/W) Error Reporting Status Register, optional */ + RESERVED(1[40], uint32_t) + __IOM uint32_t APR[4]; /*!< \brief Offset: 0x0D0 (R/W) Active Priority Register */ + __IOM uint32_t NSAPR[4]; /*!< \brief Offset: 0x0E0 (R/W) Non-secure Active Priority Register */ + RESERVED(2[3], uint32_t) + __IM uint32_t IIDR; /*!< \brief Offset: 0x0FC (R/ ) CPU Interface Identification Register */ + RESERVED(3[960], uint32_t) + __OM uint32_t DIR; /*!< \brief Offset: 0x1000( /W) Deactivate Interrupt Register */ +} GICInterface_Type; + +#define GICInterface ((GICInterface_Type *) GIC_INTERFACE_BASE ) /*!< \brief GIC Interface register set access pointer */ +#endif + +#if (__TIM_PRESENT == 1U) || defined(DOXYGEN) +#if ((__CORTEX_A == 5U) || (__CORTEX_A == 9U)) || defined(DOXYGEN) +/** \brief Structure type to access the Private Timer +*/ +typedef struct +{ + __IOM uint32_t LOAD; //!< \brief Offset: 0x000 (R/W) Private Timer Load Register + __IOM uint32_t COUNTER; //!< \brief Offset: 0x004 (R/W) Private Timer Counter Register + __IOM uint32_t CONTROL; //!< \brief Offset: 0x008 (R/W) Private Timer Control Register + __IOM uint32_t ISR; //!< \brief Offset: 0x00C (R/W) Private Timer Interrupt Status Register + RESERVED(0[4], uint32_t) + __IOM uint32_t WLOAD; //!< \brief Offset: 0x020 (R/W) Watchdog Load Register + __IOM uint32_t WCOUNTER; //!< \brief Offset: 0x024 (R/W) Watchdog Counter Register + __IOM uint32_t WCONTROL; //!< \brief Offset: 0x028 (R/W) Watchdog Control Register + __IOM uint32_t WISR; //!< \brief Offset: 0x02C (R/W) Watchdog Interrupt Status Register + __IOM uint32_t WRESET; //!< \brief Offset: 0x030 (R/W) Watchdog Reset Status Register + __OM uint32_t WDISABLE; //!< \brief Offset: 0x034 ( /W) Watchdog Disable Register +} Timer_Type; +#define PTIM ((Timer_Type *) TIMER_BASE ) /*!< \brief Timer register struct */ +#endif +#endif + + /******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - L1 Cache Functions + - L2C-310 Cache Controller Functions + - PL1 Timer Functions + - GIC Functions + - MMU Functions + ******************************************************************************/ + +/* ########################## L1 Cache functions ################################# */ + +/** \brief Enable Caches by setting I and C bits in SCTLR register. +*/ +__STATIC_FORCEINLINE void L1C_EnableCaches(void) { + __set_SCTLR( __get_SCTLR() | SCTLR_I_Msk | SCTLR_C_Msk); + __ISB(); +} + +/** \brief Disable Caches by clearing I and C bits in SCTLR register. +*/ +__STATIC_FORCEINLINE void L1C_DisableCaches(void) { + __set_SCTLR( __get_SCTLR() & (~SCTLR_I_Msk) & (~SCTLR_C_Msk)); + __ISB(); +} + +/** \brief Enable Branch Prediction by setting Z bit in SCTLR register. +*/ +__STATIC_FORCEINLINE void L1C_EnableBTAC(void) { + __set_SCTLR( __get_SCTLR() | SCTLR_Z_Msk); + __ISB(); +} + +/** \brief Disable Branch Prediction by clearing Z bit in SCTLR register. +*/ +__STATIC_FORCEINLINE void L1C_DisableBTAC(void) { + __set_SCTLR( __get_SCTLR() & (~SCTLR_Z_Msk)); + __ISB(); +} + +/** \brief Invalidate entire branch predictor array +*/ +__STATIC_FORCEINLINE void L1C_InvalidateBTAC(void) { + __set_BPIALL(0); + __DSB(); //ensure completion of the invalidation + __ISB(); //ensure instruction fetch path sees new state +} + +/** \brief Invalidate the whole instruction cache +*/ +__STATIC_FORCEINLINE void L1C_InvalidateICacheAll(void) { + __set_ICIALLU(0); + __DSB(); //ensure completion of the invalidation + __ISB(); //ensure instruction fetch path sees new I cache state +} + +/** \brief Clean data cache line by address. +* \param [in] va Pointer to data to clear the cache for. +*/ +__STATIC_FORCEINLINE void L1C_CleanDCacheMVA(void *va) { + __set_DCCMVAC((uint32_t)va); + __DMB(); //ensure the ordering of data cache maintenance operations and their effects +} + +/** \brief Invalidate data cache line by address. +* \param [in] va Pointer to data to invalidate the cache for. +*/ +__STATIC_FORCEINLINE void L1C_InvalidateDCacheMVA(void *va) { + __set_DCIMVAC((uint32_t)va); + __DMB(); //ensure the ordering of data cache maintenance operations and their effects +} + +/** \brief Clean and Invalidate data cache by address. +* \param [in] va Pointer to data to invalidate the cache for. +*/ +__STATIC_FORCEINLINE void L1C_CleanInvalidateDCacheMVA(void *va) { + __set_DCCIMVAC((uint32_t)va); + __DMB(); //ensure the ordering of data cache maintenance operations and their effects +} + +/** \brief Calculate log2 rounded up +* - log(0) => 0 +* - log(1) => 0 +* - log(2) => 1 +* - log(3) => 2 +* - log(4) => 2 +* - log(5) => 3 +* : : +* - log(16) => 4 +* - log(32) => 5 +* : : +* \param [in] n input value parameter +* \return log2(n) +*/ +__STATIC_FORCEINLINE uint8_t __log2_up(uint32_t n) +{ + if (n < 2U) { + return 0U; + } + uint8_t log = 0U; + uint32_t t = n; + while(t > 1U) + { + log++; + t >>= 1U; + } + if (n & 1U) { log++; } + return log; +} + +/** \brief Apply cache maintenance to given cache level. +* \param [in] level cache level to be maintained +* \param [in] maint 0 - invalidate, 1 - clean, otherwise - invalidate and clean +*/ +__STATIC_FORCEINLINE void __L1C_MaintainDCacheSetWay(uint32_t level, uint32_t maint) +{ + uint32_t Dummy; + uint32_t ccsidr; + uint32_t num_sets; + uint32_t num_ways; + uint32_t shift_way; + uint32_t log2_linesize; + int32_t log2_num_ways; + + Dummy = level << 1U; + /* set csselr, select ccsidr register */ + __set_CSSELR(Dummy); + /* get current ccsidr register */ + ccsidr = __get_CCSIDR(); + num_sets = ((ccsidr & 0x0FFFE000U) >> 13U) + 1U; + num_ways = ((ccsidr & 0x00001FF8U) >> 3U) + 1U; + log2_linesize = (ccsidr & 0x00000007U) + 2U + 2U; + log2_num_ways = __log2_up(num_ways); + if ((log2_num_ways < 0) || (log2_num_ways > 32)) { + return; // FATAL ERROR + } + shift_way = 32U - (uint32_t)log2_num_ways; + for(int32_t way = num_ways-1; way >= 0; way--) + { + for(int32_t set = num_sets-1; set >= 0; set--) + { + Dummy = (level << 1U) | (((uint32_t)set) << log2_linesize) | (((uint32_t)way) << shift_way); + switch (maint) + { + case 0U: __set_DCISW(Dummy); break; + case 1U: __set_DCCSW(Dummy); break; + default: __set_DCCISW(Dummy); break; + } + } + } + __DMB(); +} + +/** \brief Clean and Invalidate the entire data or unified cache +* Generic mechanism for cleaning/invalidating the entire data or unified cache to the point of coherency +* \param [in] op 0 - invalidate, 1 - clean, otherwise - invalidate and clean +*/ +__STATIC_FORCEINLINE void L1C_CleanInvalidateCache(uint32_t op) { + uint32_t clidr; + uint32_t cache_type; + clidr = __get_CLIDR(); + for(uint32_t i = 0U; i<7U; i++) + { + cache_type = (clidr >> i*3U) & 0x7UL; + if ((cache_type >= 2U) && (cache_type <= 4U)) + { + __L1C_MaintainDCacheSetWay(i, op); + } + } +} + +/** \brief Clean and Invalidate the entire data or unified cache +* Generic mechanism for cleaning/invalidating the entire data or unified cache to the point of coherency +* \param [in] op 0 - invalidate, 1 - clean, otherwise - invalidate and clean +* \deprecated Use generic L1C_CleanInvalidateCache instead. +*/ +CMSIS_DEPRECATED +__STATIC_FORCEINLINE void __L1C_CleanInvalidateCache(uint32_t op) { + L1C_CleanInvalidateCache(op); +} + +/** \brief Invalidate the whole data cache. +*/ +__STATIC_FORCEINLINE void L1C_InvalidateDCacheAll(void) { + L1C_CleanInvalidateCache(0); +} + +/** \brief Clean the whole data cache. + */ +__STATIC_FORCEINLINE void L1C_CleanDCacheAll(void) { + L1C_CleanInvalidateCache(1); +} + +/** \brief Clean and invalidate the whole data cache. + */ +__STATIC_FORCEINLINE void L1C_CleanInvalidateDCacheAll(void) { + L1C_CleanInvalidateCache(2); +} + +/* ########################## L2 Cache functions ################################# */ +#if (__L2C_PRESENT == 1U) || defined(DOXYGEN) +/** \brief Cache Sync operation by writing CACHE_SYNC register. +*/ +__STATIC_INLINE void L2C_Sync(void) +{ + L2C_310->CACHE_SYNC = 0x0; +} + +/** \brief Read cache controller cache ID from CACHE_ID register. + * \return L2C_310_TypeDef::CACHE_ID + */ +__STATIC_INLINE int L2C_GetID (void) +{ + return L2C_310->CACHE_ID; +} + +/** \brief Read cache controller cache type from CACHE_TYPE register. +* \return L2C_310_TypeDef::CACHE_TYPE +*/ +__STATIC_INLINE int L2C_GetType (void) +{ + return L2C_310->CACHE_TYPE; +} + +/** \brief Invalidate all cache by way +*/ +__STATIC_INLINE void L2C_InvAllByWay (void) +{ + unsigned int assoc; + + if (L2C_310->AUX_CNT & (1U << 16U)) { + assoc = 16U; + } else { + assoc = 8U; + } + + L2C_310->INV_WAY = (1U << assoc) - 1U; + while(L2C_310->INV_WAY & ((1U << assoc) - 1U)); //poll invalidate + + L2C_Sync(); +} + +/** \brief Clean and Invalidate all cache by way +*/ +__STATIC_INLINE void L2C_CleanInvAllByWay (void) +{ + unsigned int assoc; + + if (L2C_310->AUX_CNT & (1U << 16U)) { + assoc = 16U; + } else { + assoc = 8U; + } + + L2C_310->CLEAN_INV_WAY = (1U << assoc) - 1U; + while(L2C_310->CLEAN_INV_WAY & ((1U << assoc) - 1U)); //poll invalidate + + L2C_Sync(); +} + +/** \brief Enable Level 2 Cache +*/ +__STATIC_INLINE void L2C_Enable(void) +{ + L2C_310->CONTROL = 0; + L2C_310->INTERRUPT_CLEAR = 0x000001FFuL; + L2C_310->DEBUG_CONTROL = 0; + L2C_310->DATA_LOCK_0_WAY = 0; + L2C_310->CACHE_SYNC = 0; + L2C_310->CONTROL = 0x01; + L2C_Sync(); +} + +/** \brief Disable Level 2 Cache +*/ +__STATIC_INLINE void L2C_Disable(void) +{ + L2C_310->CONTROL = 0x00; + L2C_Sync(); +} + +/** \brief Invalidate cache by physical address +* \param [in] pa Pointer to data to invalidate cache for. +*/ +__STATIC_INLINE void L2C_InvPa (void *pa) +{ + L2C_310->INV_LINE_PA = (unsigned int)pa; + L2C_Sync(); +} + +/** \brief Clean cache by physical address +* \param [in] pa Pointer to data to invalidate cache for. +*/ +__STATIC_INLINE void L2C_CleanPa (void *pa) +{ + L2C_310->CLEAN_LINE_PA = (unsigned int)pa; + L2C_Sync(); +} + +/** \brief Clean and invalidate cache by physical address +* \param [in] pa Pointer to data to invalidate cache for. +*/ +__STATIC_INLINE void L2C_CleanInvPa (void *pa) +{ + L2C_310->CLEAN_INV_LINE_PA = (unsigned int)pa; + L2C_Sync(); +} +#endif + +/* ########################## GIC functions ###################################### */ +#if (__GIC_PRESENT == 1U) || defined(DOXYGEN) + +/** \brief Enable the interrupt distributor using the GIC's CTLR register. +*/ +__STATIC_INLINE void GIC_EnableDistributor(void) +{ + GICDistributor->CTLR |= 1U; +} + +/** \brief Disable the interrupt distributor using the GIC's CTLR register. +*/ +__STATIC_INLINE void GIC_DisableDistributor(void) +{ + GICDistributor->CTLR &=~1U; +} + +/** \brief Read the GIC's TYPER register. +* \return GICDistributor_Type::TYPER +*/ +__STATIC_INLINE uint32_t GIC_DistributorInfo(void) +{ + return (GICDistributor->TYPER); +} + +/** \brief Reads the GIC's IIDR register. +* \return GICDistributor_Type::IIDR +*/ +__STATIC_INLINE uint32_t GIC_DistributorImplementer(void) +{ + return (GICDistributor->IIDR); +} + +/** \brief Sets the GIC's ITARGETSR register for the given interrupt. +* \param [in] IRQn Interrupt to be configured. +* \param [in] cpu_target CPU interfaces to assign this interrupt to. +*/ +__STATIC_INLINE void GIC_SetTarget(IRQn_Type IRQn, uint32_t cpu_target) +{ + uint32_t mask = GICDistributor->ITARGETSR[IRQn / 4U] & ~(0xFFUL << ((IRQn % 4U) * 8U)); + GICDistributor->ITARGETSR[IRQn / 4U] = mask | ((cpu_target & 0xFFUL) << ((IRQn % 4U) * 8U)); +} + +/** \brief Read the GIC's ITARGETSR register. +* \param [in] IRQn Interrupt to acquire the configuration for. +* \return GICDistributor_Type::ITARGETSR +*/ +__STATIC_INLINE uint32_t GIC_GetTarget(IRQn_Type IRQn) +{ + return (GICDistributor->ITARGETSR[IRQn / 4U] >> ((IRQn % 4U) * 8U)) & 0xFFUL; +} + +/** \brief Enable the CPU's interrupt interface. +*/ +__STATIC_INLINE void GIC_EnableInterface(void) +{ + GICInterface->CTLR |= 1U; //enable interface +} + +/** \brief Disable the CPU's interrupt interface. +*/ +__STATIC_INLINE void GIC_DisableInterface(void) +{ + GICInterface->CTLR &=~1U; //disable distributor +} + +/** \brief Read the CPU's IAR register. +* \return GICInterface_Type::IAR +*/ +__STATIC_INLINE IRQn_Type GIC_AcknowledgePending(void) +{ + return (IRQn_Type)(GICInterface->IAR); +} + +/** \brief Writes the given interrupt number to the CPU's EOIR register. +* \param [in] IRQn The interrupt to be signaled as finished. +*/ +__STATIC_INLINE void GIC_EndInterrupt(IRQn_Type IRQn) +{ + GICInterface->EOIR = IRQn; +} + +/** \brief Enables the given interrupt using GIC's ISENABLER register. +* \param [in] IRQn The interrupt to be enabled. +*/ +__STATIC_INLINE void GIC_EnableIRQ(IRQn_Type IRQn) +{ + GICDistributor->ISENABLER[IRQn / 32U] = 1U << (IRQn % 32U); +} + +/** \brief Get interrupt enable status using GIC's ISENABLER register. +* \param [in] IRQn The interrupt to be queried. +* \return 0 - interrupt is not enabled, 1 - interrupt is enabled. +*/ +__STATIC_INLINE uint32_t GIC_GetEnableIRQ(IRQn_Type IRQn) +{ + return (GICDistributor->ISENABLER[IRQn / 32U] >> (IRQn % 32U)) & 1UL; +} + +/** \brief Disables the given interrupt using GIC's ICENABLER register. +* \param [in] IRQn The interrupt to be disabled. +*/ +__STATIC_INLINE void GIC_DisableIRQ(IRQn_Type IRQn) +{ + GICDistributor->ICENABLER[IRQn / 32U] = 1U << (IRQn % 32U); +} + +/** \brief Get interrupt pending status from GIC's ISPENDR register. +* \param [in] IRQn The interrupt to be queried. +* \return 0 - interrupt is not pending, 1 - interrupt is pendig. +*/ +__STATIC_INLINE uint32_t GIC_GetPendingIRQ(IRQn_Type IRQn) +{ + uint32_t pend; + + if (IRQn >= 16U) { + pend = (GICDistributor->ISPENDR[IRQn / 32U] >> (IRQn % 32U)) & 1UL; + } else { + // INTID 0-15 Software Generated Interrupt + pend = (GICDistributor->SPENDSGIR[IRQn / 4U] >> ((IRQn % 4U) * 8U)) & 0xFFUL; + // No CPU identification offered + if (pend != 0U) { + pend = 1U; + } else { + pend = 0U; + } + } + + return (pend); +} + +/** \brief Sets the given interrupt as pending using GIC's ISPENDR register. +* \param [in] IRQn The interrupt to be enabled. +*/ +__STATIC_INLINE void GIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if (IRQn >= 16U) { + GICDistributor->ISPENDR[IRQn / 32U] = 1U << (IRQn % 32U); + } else { + // INTID 0-15 Software Generated Interrupt + GICDistributor->SPENDSGIR[IRQn / 4U] = 1U << ((IRQn % 4U) * 8U); + } +} + +/** \brief Clears the given interrupt from being pending using GIC's ICPENDR register. +* \param [in] IRQn The interrupt to be enabled. +*/ +__STATIC_INLINE void GIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if (IRQn >= 16U) { + GICDistributor->ICPENDR[IRQn / 32U] = 1U << (IRQn % 32U); + } else { + // INTID 0-15 Software Generated Interrupt + GICDistributor->CPENDSGIR[IRQn / 4U] = 1U << ((IRQn % 4U) * 8U); + } +} + +/** \brief Sets the interrupt configuration using GIC's ICFGR register. +* \param [in] IRQn The interrupt to be configured. +* \param [in] int_config Int_config field value. Bit 0: Reserved (0 - N-N model, 1 - 1-N model for some GIC before v1) +* Bit 1: 0 - level sensitive, 1 - edge triggered +*/ +__STATIC_INLINE void GIC_SetConfiguration(IRQn_Type IRQn, uint32_t int_config) +{ + uint32_t icfgr = GICDistributor->ICFGR[IRQn / 16U]; + uint32_t shift = (IRQn % 16U) << 1U; + + icfgr &= (~(3U << shift)); + icfgr |= ( int_config << shift); + + GICDistributor->ICFGR[IRQn / 16U] = icfgr; +} + +/** \brief Get the interrupt configuration from the GIC's ICFGR register. +* \param [in] IRQn Interrupt to acquire the configuration for. +* \return Int_config field value. Bit 0: Reserved (0 - N-N model, 1 - 1-N model for some GIC before v1) +* Bit 1: 0 - level sensitive, 1 - edge triggered +*/ +__STATIC_INLINE uint32_t GIC_GetConfiguration(IRQn_Type IRQn) +{ + return (GICDistributor->ICFGR[IRQn / 16U] >> ((IRQn % 16U) >> 1U)); +} + +/** \brief Set the priority for the given interrupt in the GIC's IPRIORITYR register. +* \param [in] IRQn The interrupt to be configured. +* \param [in] priority The priority for the interrupt, lower values denote higher priorities. +*/ +__STATIC_INLINE void GIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + uint32_t mask = GICDistributor->IPRIORITYR[IRQn / 4U] & ~(0xFFUL << ((IRQn % 4U) * 8U)); + GICDistributor->IPRIORITYR[IRQn / 4U] = mask | ((priority & 0xFFUL) << ((IRQn % 4U) * 8U)); +} + +/** \brief Read the current interrupt priority from GIC's IPRIORITYR register. +* \param [in] IRQn The interrupt to be queried. +*/ +__STATIC_INLINE uint32_t GIC_GetPriority(IRQn_Type IRQn) +{ + return (GICDistributor->IPRIORITYR[IRQn / 4U] >> ((IRQn % 4U) * 8U)) & 0xFFUL; +} + +/** \brief Set the interrupt priority mask using CPU's PMR register. +* \param [in] priority Priority mask to be set. +*/ +__STATIC_INLINE void GIC_SetInterfacePriorityMask(uint32_t priority) +{ + GICInterface->PMR = priority & 0xFFUL; //set priority mask +} + +/** \brief Read the current interrupt priority mask from CPU's PMR register. +* \result GICInterface_Type::PMR +*/ +__STATIC_INLINE uint32_t GIC_GetInterfacePriorityMask(void) +{ + return GICInterface->PMR; +} + +/** \brief Configures the group priority and subpriority split point using CPU's BPR register. +* \param [in] binary_point Amount of bits used as subpriority. +*/ +__STATIC_INLINE void GIC_SetBinaryPoint(uint32_t binary_point) +{ + GICInterface->BPR = binary_point & 7U; //set binary point +} + +/** \brief Read the current group priority and subpriority split point from CPU's BPR register. +* \return GICInterface_Type::BPR +*/ +__STATIC_INLINE uint32_t GIC_GetBinaryPoint(void) +{ + return GICInterface->BPR; +} + +/** \brief Get the status for a given interrupt. +* \param [in] IRQn The interrupt to get status for. +* \return 0 - not pending/active, 1 - pending, 2 - active, 3 - pending and active +*/ +__STATIC_INLINE uint32_t GIC_GetIRQStatus(IRQn_Type IRQn) +{ + uint32_t pending, active; + + active = ((GICDistributor->ISACTIVER[IRQn / 32U]) >> (IRQn % 32U)) & 1UL; + pending = ((GICDistributor->ISPENDR[IRQn / 32U]) >> (IRQn % 32U)) & 1UL; + + return ((active<<1U) | pending); +} + +/** \brief Generate a software interrupt using GIC's SGIR register. +* \param [in] IRQn Software interrupt to be generated. +* \param [in] target_list List of CPUs the software interrupt should be forwarded to. +* \param [in] filter_list Filter to be applied to determine interrupt receivers. +*/ +__STATIC_INLINE void GIC_SendSGI(IRQn_Type IRQn, uint32_t target_list, uint32_t filter_list) +{ + GICDistributor->SGIR = ((filter_list & 3U) << 24U) | ((target_list & 0xFFUL) << 16U) | (IRQn & 0x0FUL); +} + +/** \brief Get the interrupt number of the highest interrupt pending from CPU's HPPIR register. +* \return GICInterface_Type::HPPIR +*/ +__STATIC_INLINE uint32_t GIC_GetHighPendingIRQ(void) +{ + return GICInterface->HPPIR; +} + +/** \brief Provides information about the implementer and revision of the CPU interface. +* \return GICInterface_Type::IIDR +*/ +__STATIC_INLINE uint32_t GIC_GetInterfaceId(void) +{ + return GICInterface->IIDR; +} + +/** \brief Set the interrupt group from the GIC's IGROUPR register. +* \param [in] IRQn The interrupt to be queried. +* \param [in] group Interrupt group number: 0 - Group 0, 1 - Group 1 +*/ +__STATIC_INLINE void GIC_SetGroup(IRQn_Type IRQn, uint32_t group) +{ + uint32_t igroupr = GICDistributor->IGROUPR[IRQn / 32U]; + uint32_t shift = (IRQn % 32U); + + igroupr &= (~(1U << shift)); + igroupr |= ( (group & 1U) << shift); + + GICDistributor->IGROUPR[IRQn / 32U] = igroupr; +} +#define GIC_SetSecurity GIC_SetGroup + +/** \brief Get the interrupt group from the GIC's IGROUPR register. +* \param [in] IRQn The interrupt to be queried. +* \return 0 - Group 0, 1 - Group 1 +*/ +__STATIC_INLINE uint32_t GIC_GetGroup(IRQn_Type IRQn) +{ + return (GICDistributor->IGROUPR[IRQn / 32U] >> (IRQn % 32U)) & 1UL; +} +#define GIC_GetSecurity GIC_GetGroup + +/** \brief Initialize the interrupt distributor. +*/ +__STATIC_INLINE void GIC_DistInit(void) +{ + uint32_t i; + uint32_t num_irq = 0U; + uint32_t priority_field; + + //A reset sets all bits in the IGROUPRs corresponding to the SPIs to 0, + //configuring all of the interrupts as Secure. + + //Disable interrupt forwarding + GIC_DisableDistributor(); + //Get the maximum number of interrupts that the GIC supports + num_irq = 32U * ((GIC_DistributorInfo() & 0x1FU) + 1U); + + /* Priority level is implementation defined. + To determine the number of priority bits implemented write 0xFF to an IPRIORITYR + priority field and read back the value stored.*/ + GIC_SetPriority((IRQn_Type)0U, 0xFFU); + priority_field = GIC_GetPriority((IRQn_Type)0U); + + for (i = 32U; i < num_irq; i++) + { + //Disable the SPI interrupt + GIC_DisableIRQ((IRQn_Type)i); + //Set level-sensitive (and N-N model) + GIC_SetConfiguration((IRQn_Type)i, 0U); + //Set priority + GIC_SetPriority((IRQn_Type)i, priority_field/2U); + //Set target list to CPU0 + GIC_SetTarget((IRQn_Type)i, 1U); + } + //Enable distributor + GIC_EnableDistributor(); +} + +/** \brief Initialize the CPU's interrupt interface +*/ +__STATIC_INLINE void GIC_CPUInterfaceInit(void) +{ + uint32_t i; + uint32_t priority_field; + + //A reset sets all bits in the IGROUPRs corresponding to the SPIs to 0, + //configuring all of the interrupts as Secure. + + //Disable interrupt forwarding + GIC_DisableInterface(); + + /* Priority level is implementation defined. + To determine the number of priority bits implemented write 0xFF to an IPRIORITYR + priority field and read back the value stored.*/ + GIC_SetPriority((IRQn_Type)0U, 0xFFU); + priority_field = GIC_GetPriority((IRQn_Type)0U); + + //SGI and PPI + for (i = 0U; i < 32U; i++) + { + if(i > 15U) { + //Set level-sensitive (and N-N model) for PPI + GIC_SetConfiguration((IRQn_Type)i, 0U); + } + //Disable SGI and PPI interrupts + GIC_DisableIRQ((IRQn_Type)i); + //Set priority + GIC_SetPriority((IRQn_Type)i, priority_field/2U); + } + //Enable interface + GIC_EnableInterface(); + //Set binary point to 0 + GIC_SetBinaryPoint(0U); + //Set priority mask + GIC_SetInterfacePriorityMask(0xFFU); +} + +/** \brief Initialize and enable the GIC +*/ +__STATIC_INLINE void GIC_Enable(void) +{ + GIC_DistInit(); + GIC_CPUInterfaceInit(); //per CPU +} +#endif + +/* ########################## Generic Timer functions ############################ */ +#if (__TIM_PRESENT == 1U) || defined(DOXYGEN) + +/* PL1 Physical Timer */ +#if (__CORTEX_A == 7U) || defined(DOXYGEN) + +/** \brief Physical Timer Control register */ +typedef union +{ + struct + { + uint32_t ENABLE:1; /*!< \brief bit: 0 Enables the timer. */ + uint32_t IMASK:1; /*!< \brief bit: 1 Timer output signal mask bit. */ + uint32_t ISTATUS:1; /*!< \brief bit: 2 The status of the timer. */ + RESERVED(0:29, uint32_t) + } b; /*!< \brief Structure used for bit access */ + uint32_t w; /*!< \brief Type used for word access */ +} CNTP_CTL_Type; + +/** \brief Configures the frequency the timer shall run at. +* \param [in] value The timer frequency in Hz. +*/ +__STATIC_INLINE void PL1_SetCounterFrequency(uint32_t value) +{ + __set_CNTFRQ(value); + __ISB(); +} + +/** \brief Sets the reset value of the timer. +* \param [in] value The value the timer is loaded with. +*/ +__STATIC_INLINE void PL1_SetLoadValue(uint32_t value) +{ + __set_CNTP_TVAL(value); + __ISB(); +} + +/** \brief Get the current counter value. +* \return Current counter value. +*/ +__STATIC_INLINE uint32_t PL1_GetCurrentValue(void) +{ + return(__get_CNTP_TVAL()); +} + +/** \brief Get the current physical counter value. +* \return Current physical counter value. +*/ +__STATIC_INLINE uint64_t PL1_GetCurrentPhysicalValue(void) +{ + return(__get_CNTPCT()); +} + +/** \brief Set the physical compare value. +* \param [in] value New physical timer compare value. +*/ +__STATIC_INLINE void PL1_SetPhysicalCompareValue(uint64_t value) +{ + __set_CNTP_CVAL(value); + __ISB(); +} + +/** \brief Get the physical compare value. +* \return Physical compare value. +*/ +__STATIC_INLINE uint64_t PL1_GetPhysicalCompareValue(void) +{ + return(__get_CNTP_CVAL()); +} + +/** \brief Configure the timer by setting the control value. +* \param [in] value New timer control value. +*/ +__STATIC_INLINE void PL1_SetControl(uint32_t value) +{ + __set_CNTP_CTL(value); + __ISB(); +} + +/** \brief Get the control value. +* \return Control value. +*/ +__STATIC_INLINE uint32_t PL1_GetControl(void) +{ + return(__get_CNTP_CTL()); +} +#endif + +/* Private Timer */ +#if ((__CORTEX_A == 5U) || (__CORTEX_A == 9U)) || defined(DOXYGEN) +/** \brief Set the load value to timers LOAD register. +* \param [in] value The load value to be set. +*/ +__STATIC_INLINE void PTIM_SetLoadValue(uint32_t value) +{ + PTIM->LOAD = value; +} + +/** \brief Get the load value from timers LOAD register. +* \return Timer_Type::LOAD +*/ +__STATIC_INLINE uint32_t PTIM_GetLoadValue(void) +{ + return(PTIM->LOAD); +} + +/** \brief Set current counter value from its COUNTER register. +*/ +__STATIC_INLINE void PTIM_SetCurrentValue(uint32_t value) +{ + PTIM->COUNTER = value; +} + +/** \brief Get current counter value from timers COUNTER register. +* \result Timer_Type::COUNTER +*/ +__STATIC_INLINE uint32_t PTIM_GetCurrentValue(void) +{ + return(PTIM->COUNTER); +} + +/** \brief Configure the timer using its CONTROL register. +* \param [in] value The new configuration value to be set. +*/ +__STATIC_INLINE void PTIM_SetControl(uint32_t value) +{ + PTIM->CONTROL = value; +} + +/** ref Timer_Type::CONTROL Get the current timer configuration from its CONTROL register. +* \return Timer_Type::CONTROL +*/ +__STATIC_INLINE uint32_t PTIM_GetControl(void) +{ + return(PTIM->CONTROL); +} + +/** ref Timer_Type::CONTROL Get the event flag in timers ISR register. +* \return 0 - flag is not set, 1- flag is set +*/ +__STATIC_INLINE uint32_t PTIM_GetEventFlag(void) +{ + return (PTIM->ISR & 1UL); +} + +/** ref Timer_Type::CONTROL Clears the event flag in timers ISR register. +*/ +__STATIC_INLINE void PTIM_ClearEventFlag(void) +{ + PTIM->ISR = 1; +} +#endif +#endif + +/* ########################## MMU functions ###################################### */ + +#define SECTION_DESCRIPTOR (0x2) +#define SECTION_MASK (0xFFFFFFFC) + +#define SECTION_TEXCB_MASK (0xFFFF8FF3) +#define SECTION_B_SHIFT (2) +#define SECTION_C_SHIFT (3) +#define SECTION_TEX0_SHIFT (12) +#define SECTION_TEX1_SHIFT (13) +#define SECTION_TEX2_SHIFT (14) + +#define SECTION_XN_MASK (0xFFFFFFEF) +#define SECTION_XN_SHIFT (4) + +#define SECTION_DOMAIN_MASK (0xFFFFFE1F) +#define SECTION_DOMAIN_SHIFT (5) + +#define SECTION_P_MASK (0xFFFFFDFF) +#define SECTION_P_SHIFT (9) + +#define SECTION_AP_MASK (0xFFFF73FF) +#define SECTION_AP_SHIFT (10) +#define SECTION_AP2_SHIFT (15) + +#define SECTION_S_MASK (0xFFFEFFFF) +#define SECTION_S_SHIFT (16) + +#define SECTION_NG_MASK (0xFFFDFFFF) +#define SECTION_NG_SHIFT (17) + +#define SECTION_NS_MASK (0xFFF7FFFF) +#define SECTION_NS_SHIFT (19) + +#define PAGE_L1_DESCRIPTOR (0x1) +#define PAGE_L1_MASK (0xFFFFFFFC) + +#define PAGE_L2_4K_DESC (0x2) +#define PAGE_L2_4K_MASK (0xFFFFFFFD) + +#define PAGE_L2_64K_DESC (0x1) +#define PAGE_L2_64K_MASK (0xFFFFFFFC) + +#define PAGE_4K_TEXCB_MASK (0xFFFFFE33) +#define PAGE_4K_B_SHIFT (2) +#define PAGE_4K_C_SHIFT (3) +#define PAGE_4K_TEX0_SHIFT (6) +#define PAGE_4K_TEX1_SHIFT (7) +#define PAGE_4K_TEX2_SHIFT (8) + +#define PAGE_64K_TEXCB_MASK (0xFFFF8FF3) +#define PAGE_64K_B_SHIFT (2) +#define PAGE_64K_C_SHIFT (3) +#define PAGE_64K_TEX0_SHIFT (12) +#define PAGE_64K_TEX1_SHIFT (13) +#define PAGE_64K_TEX2_SHIFT (14) + +#define PAGE_TEXCB_MASK (0xFFFF8FF3) +#define PAGE_B_SHIFT (2) +#define PAGE_C_SHIFT (3) +#define PAGE_TEX_SHIFT (12) + +#define PAGE_XN_4K_MASK (0xFFFFFFFE) +#define PAGE_XN_4K_SHIFT (0) +#define PAGE_XN_64K_MASK (0xFFFF7FFF) +#define PAGE_XN_64K_SHIFT (15) + +#define PAGE_DOMAIN_MASK (0xFFFFFE1F) +#define PAGE_DOMAIN_SHIFT (5) + +#define PAGE_P_MASK (0xFFFFFDFF) +#define PAGE_P_SHIFT (9) + +#define PAGE_AP_MASK (0xFFFFFDCF) +#define PAGE_AP_SHIFT (4) +#define PAGE_AP2_SHIFT (9) + +#define PAGE_S_MASK (0xFFFFFBFF) +#define PAGE_S_SHIFT (10) + +#define PAGE_NG_MASK (0xFFFFF7FF) +#define PAGE_NG_SHIFT (11) + +#define PAGE_NS_MASK (0xFFFFFFF7) +#define PAGE_NS_SHIFT (3) + +#define OFFSET_1M (0x00100000) +#define OFFSET_64K (0x00010000) +#define OFFSET_4K (0x00001000) + +#define DESCRIPTOR_FAULT (0x00000000) + +/* Attributes enumerations */ + +/* Region size attributes */ +typedef enum +{ + SECTION, + PAGE_4k, + PAGE_64k, +} mmu_region_size_Type; + +/* Region type attributes */ +typedef enum +{ + NORMAL, + DEVICE, + SHARED_DEVICE, + NON_SHARED_DEVICE, + STRONGLY_ORDERED +} mmu_memory_Type; + +/* Region cacheability attributes */ +typedef enum +{ + NON_CACHEABLE, + WB_WA, + WT, + WB_NO_WA, +} mmu_cacheability_Type; + +/* Region parity check attributes */ +typedef enum +{ + ECC_DISABLED, + ECC_ENABLED, +} mmu_ecc_check_Type; + +/* Region execution attributes */ +typedef enum +{ + EXECUTE, + NON_EXECUTE, +} mmu_execute_Type; + +/* Region global attributes */ +typedef enum +{ + GLOBAL, + NON_GLOBAL, +} mmu_global_Type; + +/* Region shareability attributes */ +typedef enum +{ + NON_SHARED, + SHARED, +} mmu_shared_Type; + +/* Region security attributes */ +typedef enum +{ + SECURE, + NON_SECURE, +} mmu_secure_Type; + +/* Region access attributes */ +typedef enum +{ + NO_ACCESS, + RW, + READ, +} mmu_access_Type; + +/* Memory Region definition */ +typedef struct RegionStruct { + mmu_region_size_Type rg_t; + mmu_memory_Type mem_t; + uint8_t domain; + mmu_cacheability_Type inner_norm_t; + mmu_cacheability_Type outer_norm_t; + mmu_ecc_check_Type e_t; + mmu_execute_Type xn_t; + mmu_global_Type g_t; + mmu_secure_Type sec_t; + mmu_access_Type priv_t; + mmu_access_Type user_t; + mmu_shared_Type sh_t; + +} mmu_region_attributes_Type; + +//Following macros define the descriptors and attributes +//Sect_Normal. Outer & inner wb/wa, non-shareable, executable, rw, domain 0 +#define section_normal(descriptor_l1, region) region.rg_t = SECTION; \ + region.domain = 0x0; \ + region.e_t = ECC_DISABLED; \ + region.g_t = GLOBAL; \ + region.inner_norm_t = WB_WA; \ + region.outer_norm_t = WB_WA; \ + region.mem_t = NORMAL; \ + region.sec_t = SECURE; \ + region.xn_t = EXECUTE; \ + region.priv_t = RW; \ + region.user_t = RW; \ + region.sh_t = NON_SHARED; \ + MMU_GetSectionDescriptor(&descriptor_l1, region); + +//Sect_Normal_NC. Outer & inner non-cacheable, non-shareable, executable, rw, domain 0 +#define section_normal_nc(descriptor_l1, region) region.rg_t = SECTION; \ + region.domain = 0x0; \ + region.e_t = ECC_DISABLED; \ + region.g_t = GLOBAL; \ + region.inner_norm_t = NON_CACHEABLE; \ + region.outer_norm_t = NON_CACHEABLE; \ + region.mem_t = NORMAL; \ + region.sec_t = SECURE; \ + region.xn_t = EXECUTE; \ + region.priv_t = RW; \ + region.user_t = RW; \ + region.sh_t = NON_SHARED; \ + MMU_GetSectionDescriptor(&descriptor_l1, region); + +//Sect_Normal_Cod. Outer & inner wb/wa, non-shareable, executable, ro, domain 0 +#define section_normal_cod(descriptor_l1, region) region.rg_t = SECTION; \ + region.domain = 0x0; \ + region.e_t = ECC_DISABLED; \ + region.g_t = GLOBAL; \ + region.inner_norm_t = WB_WA; \ + region.outer_norm_t = WB_WA; \ + region.mem_t = NORMAL; \ + region.sec_t = SECURE; \ + region.xn_t = EXECUTE; \ + region.priv_t = READ; \ + region.user_t = READ; \ + region.sh_t = NON_SHARED; \ + MMU_GetSectionDescriptor(&descriptor_l1, region); + +//Sect_Normal_RO. Sect_Normal_Cod, but not executable +#define section_normal_ro(descriptor_l1, region) region.rg_t = SECTION; \ + region.domain = 0x0; \ + region.e_t = ECC_DISABLED; \ + region.g_t = GLOBAL; \ + region.inner_norm_t = WB_WA; \ + region.outer_norm_t = WB_WA; \ + region.mem_t = NORMAL; \ + region.sec_t = SECURE; \ + region.xn_t = NON_EXECUTE; \ + region.priv_t = READ; \ + region.user_t = READ; \ + region.sh_t = NON_SHARED; \ + MMU_GetSectionDescriptor(&descriptor_l1, region); + +//Sect_Normal_RW. Sect_Normal_Cod, but writeable and not executable +#define section_normal_rw(descriptor_l1, region) region.rg_t = SECTION; \ + region.domain = 0x0; \ + region.e_t = ECC_DISABLED; \ + region.g_t = GLOBAL; \ + region.inner_norm_t = WB_WA; \ + region.outer_norm_t = WB_WA; \ + region.mem_t = NORMAL; \ + region.sec_t = SECURE; \ + region.xn_t = NON_EXECUTE; \ + region.priv_t = RW; \ + region.user_t = RW; \ + region.sh_t = NON_SHARED; \ + MMU_GetSectionDescriptor(&descriptor_l1, region); +//Sect_SO. Strongly-ordered (therefore shareable), not executable, rw, domain 0, base addr 0 +#define section_so(descriptor_l1, region) region.rg_t = SECTION; \ + region.domain = 0x0; \ + region.e_t = ECC_DISABLED; \ + region.g_t = GLOBAL; \ + region.inner_norm_t = NON_CACHEABLE; \ + region.outer_norm_t = NON_CACHEABLE; \ + region.mem_t = STRONGLY_ORDERED; \ + region.sec_t = SECURE; \ + region.xn_t = NON_EXECUTE; \ + region.priv_t = RW; \ + region.user_t = RW; \ + region.sh_t = NON_SHARED; \ + MMU_GetSectionDescriptor(&descriptor_l1, region); + +//Sect_Device_RO. Device, non-shareable, non-executable, ro, domain 0, base addr 0 +#define section_device_ro(descriptor_l1, region) region.rg_t = SECTION; \ + region.domain = 0x0; \ + region.e_t = ECC_DISABLED; \ + region.g_t = GLOBAL; \ + region.inner_norm_t = NON_CACHEABLE; \ + region.outer_norm_t = NON_CACHEABLE; \ + region.mem_t = STRONGLY_ORDERED; \ + region.sec_t = SECURE; \ + region.xn_t = NON_EXECUTE; \ + region.priv_t = READ; \ + region.user_t = READ; \ + region.sh_t = NON_SHARED; \ + MMU_GetSectionDescriptor(&descriptor_l1, region); + +//Sect_Device_RW. Sect_Device_RO, but writeable +#define section_device_rw(descriptor_l1, region) region.rg_t = SECTION; \ + region.domain = 0x0; \ + region.e_t = ECC_DISABLED; \ + region.g_t = GLOBAL; \ + region.inner_norm_t = NON_CACHEABLE; \ + region.outer_norm_t = NON_CACHEABLE; \ + region.mem_t = STRONGLY_ORDERED; \ + region.sec_t = SECURE; \ + region.xn_t = NON_EXECUTE; \ + region.priv_t = RW; \ + region.user_t = RW; \ + region.sh_t = NON_SHARED; \ + MMU_GetSectionDescriptor(&descriptor_l1, region); +//Page_4k_Device_RW. Shared device, not executable, rw, domain 0 +#define page4k_device_rw(descriptor_l1, descriptor_l2, region) region.rg_t = PAGE_4k; \ + region.domain = 0x0; \ + region.e_t = ECC_DISABLED; \ + region.g_t = GLOBAL; \ + region.inner_norm_t = NON_CACHEABLE; \ + region.outer_norm_t = NON_CACHEABLE; \ + region.mem_t = SHARED_DEVICE; \ + region.sec_t = SECURE; \ + region.xn_t = NON_EXECUTE; \ + region.priv_t = RW; \ + region.user_t = RW; \ + region.sh_t = NON_SHARED; \ + MMU_GetPageDescriptor(&descriptor_l1, &descriptor_l2, region); + +//Page_64k_Device_RW. Shared device, not executable, rw, domain 0 +#define page64k_device_rw(descriptor_l1, descriptor_l2, region) region.rg_t = PAGE_64k; \ + region.domain = 0x0; \ + region.e_t = ECC_DISABLED; \ + region.g_t = GLOBAL; \ + region.inner_norm_t = NON_CACHEABLE; \ + region.outer_norm_t = NON_CACHEABLE; \ + region.mem_t = SHARED_DEVICE; \ + region.sec_t = SECURE; \ + region.xn_t = NON_EXECUTE; \ + region.priv_t = RW; \ + region.user_t = RW; \ + region.sh_t = NON_SHARED; \ + MMU_GetPageDescriptor(&descriptor_l1, &descriptor_l2, region); + +/** \brief Set section execution-never attribute + + \param [out] descriptor_l1 L1 descriptor. + \param [in] xn Section execution-never attribute : EXECUTE , NON_EXECUTE. + + \return 0 +*/ +__STATIC_INLINE int MMU_XNSection(uint32_t *descriptor_l1, mmu_execute_Type xn) +{ + *descriptor_l1 &= SECTION_XN_MASK; + *descriptor_l1 |= ((xn & 0x1) << SECTION_XN_SHIFT); + return 0; +} + +/** \brief Set section domain + + \param [out] descriptor_l1 L1 descriptor. + \param [in] domain Section domain + + \return 0 +*/ +__STATIC_INLINE int MMU_DomainSection(uint32_t *descriptor_l1, uint8_t domain) +{ + *descriptor_l1 &= SECTION_DOMAIN_MASK; + *descriptor_l1 |= ((domain & 0xF) << SECTION_DOMAIN_SHIFT); + return 0; +} + +/** \brief Set section parity check + + \param [out] descriptor_l1 L1 descriptor. + \param [in] p_bit Parity check: ECC_DISABLED, ECC_ENABLED + + \return 0 +*/ +__STATIC_INLINE int MMU_PSection(uint32_t *descriptor_l1, mmu_ecc_check_Type p_bit) +{ + *descriptor_l1 &= SECTION_P_MASK; + *descriptor_l1 |= ((p_bit & 0x1) << SECTION_P_SHIFT); + return 0; +} + +/** \brief Set section access privileges + + \param [out] descriptor_l1 L1 descriptor. + \param [in] user User Level Access: NO_ACCESS, RW, READ + \param [in] priv Privilege Level Access: NO_ACCESS, RW, READ + \param [in] afe Access flag enable + + \return 0 +*/ +__STATIC_INLINE int MMU_APSection(uint32_t *descriptor_l1, mmu_access_Type user, mmu_access_Type priv, uint32_t afe) +{ + uint32_t ap = 0; + + if (afe == 0) { //full access + if ((priv == NO_ACCESS) && (user == NO_ACCESS)) { ap = 0x0; } + else if ((priv == RW) && (user == NO_ACCESS)) { ap = 0x1; } + else if ((priv == RW) && (user == READ)) { ap = 0x2; } + else if ((priv == RW) && (user == RW)) { ap = 0x3; } + else if ((priv == READ) && (user == NO_ACCESS)) { ap = 0x5; } + else if ((priv == READ) && (user == READ)) { ap = 0x7; } + } + + else { //Simplified access + if ((priv == RW) && (user == NO_ACCESS)) { ap = 0x1; } + else if ((priv == RW) && (user == RW)) { ap = 0x3; } + else if ((priv == READ) && (user == NO_ACCESS)) { ap = 0x5; } + else if ((priv == READ) && (user == READ)) { ap = 0x7; } + } + + *descriptor_l1 &= SECTION_AP_MASK; + *descriptor_l1 |= (ap & 0x3) << SECTION_AP_SHIFT; + *descriptor_l1 |= ((ap & 0x4)>>2) << SECTION_AP2_SHIFT; + + return 0; +} + +/** \brief Set section shareability + + \param [out] descriptor_l1 L1 descriptor. + \param [in] s_bit Section shareability: NON_SHARED, SHARED + + \return 0 +*/ +__STATIC_INLINE int MMU_SharedSection(uint32_t *descriptor_l1, mmu_shared_Type s_bit) +{ + *descriptor_l1 &= SECTION_S_MASK; + *descriptor_l1 |= ((s_bit & 0x1) << SECTION_S_SHIFT); + return 0; +} + +/** \brief Set section Global attribute + + \param [out] descriptor_l1 L1 descriptor. + \param [in] g_bit Section attribute: GLOBAL, NON_GLOBAL + + \return 0 +*/ +__STATIC_INLINE int MMU_GlobalSection(uint32_t *descriptor_l1, mmu_global_Type g_bit) +{ + *descriptor_l1 &= SECTION_NG_MASK; + *descriptor_l1 |= ((g_bit & 0x1) << SECTION_NG_SHIFT); + return 0; +} + +/** \brief Set section Security attribute + + \param [out] descriptor_l1 L1 descriptor. + \param [in] s_bit Section Security attribute: SECURE, NON_SECURE + + \return 0 +*/ +__STATIC_INLINE int MMU_SecureSection(uint32_t *descriptor_l1, mmu_secure_Type s_bit) +{ + *descriptor_l1 &= SECTION_NS_MASK; + *descriptor_l1 |= ((s_bit & 0x1) << SECTION_NS_SHIFT); + return 0; +} + +/* Page 4k or 64k */ +/** \brief Set 4k/64k page execution-never attribute + + \param [out] descriptor_l2 L2 descriptor. + \param [in] xn Page execution-never attribute : EXECUTE , NON_EXECUTE. + \param [in] page Page size: PAGE_4k, PAGE_64k, + + \return 0 +*/ +__STATIC_INLINE int MMU_XNPage(uint32_t *descriptor_l2, mmu_execute_Type xn, mmu_region_size_Type page) +{ + if (page == PAGE_4k) + { + *descriptor_l2 &= PAGE_XN_4K_MASK; + *descriptor_l2 |= ((xn & 0x1) << PAGE_XN_4K_SHIFT); + } + else + { + *descriptor_l2 &= PAGE_XN_64K_MASK; + *descriptor_l2 |= ((xn & 0x1) << PAGE_XN_64K_SHIFT); + } + return 0; +} + +/** \brief Set 4k/64k page domain + + \param [out] descriptor_l1 L1 descriptor. + \param [in] domain Page domain + + \return 0 +*/ +__STATIC_INLINE int MMU_DomainPage(uint32_t *descriptor_l1, uint8_t domain) +{ + *descriptor_l1 &= PAGE_DOMAIN_MASK; + *descriptor_l1 |= ((domain & 0xf) << PAGE_DOMAIN_SHIFT); + return 0; +} + +/** \brief Set 4k/64k page parity check + + \param [out] descriptor_l1 L1 descriptor. + \param [in] p_bit Parity check: ECC_DISABLED, ECC_ENABLED + + \return 0 +*/ +__STATIC_INLINE int MMU_PPage(uint32_t *descriptor_l1, mmu_ecc_check_Type p_bit) +{ + *descriptor_l1 &= SECTION_P_MASK; + *descriptor_l1 |= ((p_bit & 0x1) << SECTION_P_SHIFT); + return 0; +} + +/** \brief Set 4k/64k page access privileges + + \param [out] descriptor_l2 L2 descriptor. + \param [in] user User Level Access: NO_ACCESS, RW, READ + \param [in] priv Privilege Level Access: NO_ACCESS, RW, READ + \param [in] afe Access flag enable + + \return 0 +*/ +__STATIC_INLINE int MMU_APPage(uint32_t *descriptor_l2, mmu_access_Type user, mmu_access_Type priv, uint32_t afe) +{ + uint32_t ap = 0; + + if (afe == 0) { //full access + if ((priv == NO_ACCESS) && (user == NO_ACCESS)) { ap = 0x0; } + else if ((priv == RW) && (user == NO_ACCESS)) { ap = 0x1; } + else if ((priv == RW) && (user == READ)) { ap = 0x2; } + else if ((priv == RW) && (user == RW)) { ap = 0x3; } + else if ((priv == READ) && (user == NO_ACCESS)) { ap = 0x5; } + else if ((priv == READ) && (user == READ)) { ap = 0x6; } + } + + else { //Simplified access + if ((priv == RW) && (user == NO_ACCESS)) { ap = 0x1; } + else if ((priv == RW) && (user == RW)) { ap = 0x3; } + else if ((priv == READ) && (user == NO_ACCESS)) { ap = 0x5; } + else if ((priv == READ) && (user == READ)) { ap = 0x7; } + } + + *descriptor_l2 &= PAGE_AP_MASK; + *descriptor_l2 |= (ap & 0x3) << PAGE_AP_SHIFT; + *descriptor_l2 |= ((ap & 0x4)>>2) << PAGE_AP2_SHIFT; + + return 0; +} + +/** \brief Set 4k/64k page shareability + + \param [out] descriptor_l2 L2 descriptor. + \param [in] s_bit 4k/64k page shareability: NON_SHARED, SHARED + + \return 0 +*/ +__STATIC_INLINE int MMU_SharedPage(uint32_t *descriptor_l2, mmu_shared_Type s_bit) +{ + *descriptor_l2 &= PAGE_S_MASK; + *descriptor_l2 |= ((s_bit & 0x1) << PAGE_S_SHIFT); + return 0; +} + +/** \brief Set 4k/64k page Global attribute + + \param [out] descriptor_l2 L2 descriptor. + \param [in] g_bit 4k/64k page attribute: GLOBAL, NON_GLOBAL + + \return 0 +*/ +__STATIC_INLINE int MMU_GlobalPage(uint32_t *descriptor_l2, mmu_global_Type g_bit) +{ + *descriptor_l2 &= PAGE_NG_MASK; + *descriptor_l2 |= ((g_bit & 0x1) << PAGE_NG_SHIFT); + return 0; +} + +/** \brief Set 4k/64k page Security attribute + + \param [out] descriptor_l1 L1 descriptor. + \param [in] s_bit 4k/64k page Security attribute: SECURE, NON_SECURE + + \return 0 +*/ +__STATIC_INLINE int MMU_SecurePage(uint32_t *descriptor_l1, mmu_secure_Type s_bit) +{ + *descriptor_l1 &= PAGE_NS_MASK; + *descriptor_l1 |= ((s_bit & 0x1) << PAGE_NS_SHIFT); + return 0; +} + +/** \brief Set Section memory attributes + + \param [out] descriptor_l1 L1 descriptor. + \param [in] mem Section memory type: NORMAL, DEVICE, SHARED_DEVICE, NON_SHARED_DEVICE, STRONGLY_ORDERED + \param [in] outer Outer cacheability: NON_CACHEABLE, WB_WA, WT, WB_NO_WA, + \param [in] inner Inner cacheability: NON_CACHEABLE, WB_WA, WT, WB_NO_WA, + + \return 0 +*/ +__STATIC_INLINE int MMU_MemorySection(uint32_t *descriptor_l1, mmu_memory_Type mem, mmu_cacheability_Type outer, mmu_cacheability_Type inner) +{ + *descriptor_l1 &= SECTION_TEXCB_MASK; + + if (STRONGLY_ORDERED == mem) + { + return 0; + } + else if (SHARED_DEVICE == mem) + { + *descriptor_l1 |= (1 << SECTION_B_SHIFT); + } + else if (NON_SHARED_DEVICE == mem) + { + *descriptor_l1 |= (1 << SECTION_TEX1_SHIFT); + } + else if (NORMAL == mem) + { + *descriptor_l1 |= 1 << SECTION_TEX2_SHIFT; + switch(inner) + { + case NON_CACHEABLE: + break; + case WB_WA: + *descriptor_l1 |= (1 << SECTION_B_SHIFT); + break; + case WT: + *descriptor_l1 |= 1 << SECTION_C_SHIFT; + break; + case WB_NO_WA: + *descriptor_l1 |= (1 << SECTION_B_SHIFT) | (1 << SECTION_C_SHIFT); + break; + } + switch(outer) + { + case NON_CACHEABLE: + break; + case WB_WA: + *descriptor_l1 |= (1 << SECTION_TEX0_SHIFT); + break; + case WT: + *descriptor_l1 |= 1 << SECTION_TEX1_SHIFT; + break; + case WB_NO_WA: + *descriptor_l1 |= (1 << SECTION_TEX0_SHIFT) | (1 << SECTION_TEX0_SHIFT); + break; + } + } + return 0; +} + +/** \brief Set 4k/64k page memory attributes + + \param [out] descriptor_l2 L2 descriptor. + \param [in] mem 4k/64k page memory type: NORMAL, DEVICE, SHARED_DEVICE, NON_SHARED_DEVICE, STRONGLY_ORDERED + \param [in] outer Outer cacheability: NON_CACHEABLE, WB_WA, WT, WB_NO_WA, + \param [in] inner Inner cacheability: NON_CACHEABLE, WB_WA, WT, WB_NO_WA, + \param [in] page Page size + + \return 0 +*/ +__STATIC_INLINE int MMU_MemoryPage(uint32_t *descriptor_l2, mmu_memory_Type mem, mmu_cacheability_Type outer, mmu_cacheability_Type inner, mmu_region_size_Type page) +{ + *descriptor_l2 &= PAGE_4K_TEXCB_MASK; + + if (page == PAGE_64k) + { + //same as section + MMU_MemorySection(descriptor_l2, mem, outer, inner); + } + else + { + if (STRONGLY_ORDERED == mem) + { + return 0; + } + else if (SHARED_DEVICE == mem) + { + *descriptor_l2 |= (1 << PAGE_4K_B_SHIFT); + } + else if (NON_SHARED_DEVICE == mem) + { + *descriptor_l2 |= (1 << PAGE_4K_TEX1_SHIFT); + } + else if (NORMAL == mem) + { + *descriptor_l2 |= 1 << PAGE_4K_TEX2_SHIFT; + switch(inner) + { + case NON_CACHEABLE: + break; + case WB_WA: + *descriptor_l2 |= (1 << PAGE_4K_B_SHIFT); + break; + case WT: + *descriptor_l2 |= 1 << PAGE_4K_C_SHIFT; + break; + case WB_NO_WA: + *descriptor_l2 |= (1 << PAGE_4K_B_SHIFT) | (1 << PAGE_4K_C_SHIFT); + break; + } + switch(outer) + { + case NON_CACHEABLE: + break; + case WB_WA: + *descriptor_l2 |= (1 << PAGE_4K_TEX0_SHIFT); + break; + case WT: + *descriptor_l2 |= 1 << PAGE_4K_TEX1_SHIFT; + break; + case WB_NO_WA: + *descriptor_l2 |= (1 << PAGE_4K_TEX0_SHIFT) | (1 << PAGE_4K_TEX0_SHIFT); + break; + } + } + } + + return 0; +} + +/** \brief Create a L1 section descriptor + + \param [out] descriptor L1 descriptor + \param [in] reg Section attributes + + \return 0 +*/ +__STATIC_INLINE int MMU_GetSectionDescriptor(uint32_t *descriptor, mmu_region_attributes_Type reg) +{ + *descriptor = 0; + + MMU_MemorySection(descriptor, reg.mem_t, reg.outer_norm_t, reg.inner_norm_t); + MMU_XNSection(descriptor,reg.xn_t); + MMU_DomainSection(descriptor, reg.domain); + MMU_PSection(descriptor, reg.e_t); + MMU_APSection(descriptor, reg.priv_t, reg.user_t, 1); + MMU_SharedSection(descriptor,reg.sh_t); + MMU_GlobalSection(descriptor,reg.g_t); + MMU_SecureSection(descriptor,reg.sec_t); + *descriptor &= SECTION_MASK; + *descriptor |= SECTION_DESCRIPTOR; + + return 0; +} + + +/** \brief Create a L1 and L2 4k/64k page descriptor + + \param [out] descriptor L1 descriptor + \param [out] descriptor2 L2 descriptor + \param [in] reg 4k/64k page attributes + + \return 0 +*/ +__STATIC_INLINE int MMU_GetPageDescriptor(uint32_t *descriptor, uint32_t *descriptor2, mmu_region_attributes_Type reg) +{ + *descriptor = 0; + *descriptor2 = 0; + + switch (reg.rg_t) + { + case PAGE_4k: + MMU_MemoryPage(descriptor2, reg.mem_t, reg.outer_norm_t, reg.inner_norm_t, PAGE_4k); + MMU_XNPage(descriptor2, reg.xn_t, PAGE_4k); + MMU_DomainPage(descriptor, reg.domain); + MMU_PPage(descriptor, reg.e_t); + MMU_APPage(descriptor2, reg.priv_t, reg.user_t, 1); + MMU_SharedPage(descriptor2,reg.sh_t); + MMU_GlobalPage(descriptor2,reg.g_t); + MMU_SecurePage(descriptor,reg.sec_t); + *descriptor &= PAGE_L1_MASK; + *descriptor |= PAGE_L1_DESCRIPTOR; + *descriptor2 &= PAGE_L2_4K_MASK; + *descriptor2 |= PAGE_L2_4K_DESC; + break; + + case PAGE_64k: + MMU_MemoryPage(descriptor2, reg.mem_t, reg.outer_norm_t, reg.inner_norm_t, PAGE_64k); + MMU_XNPage(descriptor2, reg.xn_t, PAGE_64k); + MMU_DomainPage(descriptor, reg.domain); + MMU_PPage(descriptor, reg.e_t); + MMU_APPage(descriptor2, reg.priv_t, reg.user_t, 1); + MMU_SharedPage(descriptor2,reg.sh_t); + MMU_GlobalPage(descriptor2,reg.g_t); + MMU_SecurePage(descriptor,reg.sec_t); + *descriptor &= PAGE_L1_MASK; + *descriptor |= PAGE_L1_DESCRIPTOR; + *descriptor2 &= PAGE_L2_64K_MASK; + *descriptor2 |= PAGE_L2_64K_DESC; + break; + + case SECTION: + //error + break; + } + + return 0; +} + +/** \brief Create a 1MB Section + + \param [in] ttb Translation table base address + \param [in] base_address Section base address + \param [in] count Number of sections to create + \param [in] descriptor_l1 L1 descriptor (region attributes) + +*/ +__STATIC_INLINE void MMU_TTSection(uint32_t *ttb, uint32_t base_address, uint32_t count, uint32_t descriptor_l1) +{ + uint32_t offset; + uint32_t entry; + uint32_t i; + + offset = base_address >> 20; + entry = (base_address & 0xFFF00000) | descriptor_l1; + + //4 bytes aligned + ttb = ttb + offset; + + for (i = 0; i < count; i++ ) + { + //4 bytes aligned + *ttb++ = entry; + entry += OFFSET_1M; + } +} + +/** \brief Create a 4k page entry + + \param [in] ttb L1 table base address + \param [in] base_address 4k base address + \param [in] count Number of 4k pages to create + \param [in] descriptor_l1 L1 descriptor (region attributes) + \param [in] ttb_l2 L2 table base address + \param [in] descriptor_l2 L2 descriptor (region attributes) + +*/ +__STATIC_INLINE void MMU_TTPage4k(uint32_t *ttb, uint32_t base_address, uint32_t count, uint32_t descriptor_l1, uint32_t *ttb_l2, uint32_t descriptor_l2 ) +{ + + uint32_t offset, offset2; + uint32_t entry, entry2; + uint32_t i; + + offset = base_address >> 20; + entry = ((int)ttb_l2 & 0xFFFFFC00) | descriptor_l1; + + //4 bytes aligned + ttb += offset; + //create l1_entry + *ttb = entry; + + offset2 = (base_address & 0xff000) >> 12; + ttb_l2 += offset2; + entry2 = (base_address & 0xFFFFF000) | descriptor_l2; + for (i = 0; i < count; i++ ) + { + //4 bytes aligned + *ttb_l2++ = entry2; + entry2 += OFFSET_4K; + } +} + +/** \brief Create a 64k page entry + + \param [in] ttb L1 table base address + \param [in] base_address 64k base address + \param [in] count Number of 64k pages to create + \param [in] descriptor_l1 L1 descriptor (region attributes) + \param [in] ttb_l2 L2 table base address + \param [in] descriptor_l2 L2 descriptor (region attributes) + +*/ +__STATIC_INLINE void MMU_TTPage64k(uint32_t *ttb, uint32_t base_address, uint32_t count, uint32_t descriptor_l1, uint32_t *ttb_l2, uint32_t descriptor_l2 ) +{ + uint32_t offset, offset2; + uint32_t entry, entry2; + uint32_t i,j; + + + offset = base_address >> 20; + entry = ((int)ttb_l2 & 0xFFFFFC00) | descriptor_l1; + + //4 bytes aligned + ttb += offset; + //create l1_entry + *ttb = entry; + + offset2 = (base_address & 0xff000) >> 12; + ttb_l2 += offset2; + entry2 = (base_address & 0xFFFF0000) | descriptor_l2; + for (i = 0; i < count; i++ ) + { + //create 16 entries + for (j = 0; j < 16; j++) + { + //4 bytes aligned + *ttb_l2++ = entry2; + } + entry2 += OFFSET_64K; + } +} + +/** \brief Enable MMU +*/ +__STATIC_INLINE void MMU_Enable(void) +{ + // Set M bit 0 to enable the MMU + // Set AFE bit to enable simplified access permissions model + // Clear TRE bit to disable TEX remap and A bit to disable strict alignment fault checking + __set_SCTLR( (__get_SCTLR() & ~(1 << 28) & ~(1 << 1)) | 1 | (1 << 29)); + __ISB(); +} + +/** \brief Disable MMU +*/ +__STATIC_INLINE void MMU_Disable(void) +{ + // Clear M bit 0 to disable the MMU + __set_SCTLR( __get_SCTLR() & ~1); + __ISB(); +} + +/** \brief Invalidate entire unified TLB +*/ + +__STATIC_INLINE void MMU_InvalidateTLB(void) +{ + __set_TLBIALL(0); + __DSB(); //ensure completion of the invalidation + __ISB(); //ensure instruction fetch path sees new state +} + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CA_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Core_A/Include/irq_ctrl.h b/STM32CubeMX/revF/Drivers/CMSIS/Core_A/Include/irq_ctrl.h new file mode 100644 index 00000000..b171ef0a --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Core_A/Include/irq_ctrl.h @@ -0,0 +1,186 @@ +/**************************************************************************//** + * @file irq_ctrl.h + * @brief Interrupt Controller API header file + * @version V1.0.0 + * @date 23. June 2017 + ******************************************************************************/ +/* + * Copyright (c) 2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef IRQ_CTRL_H_ +#define IRQ_CTRL_H_ + +#include + +#ifndef IRQHANDLER_T +#define IRQHANDLER_T +/// Interrupt handler data type +typedef void (*IRQHandler_t) (void); +#endif + +#ifndef IRQN_ID_T +#define IRQN_ID_T +/// Interrupt ID number data type +typedef int32_t IRQn_ID_t; +#endif + +/* Interrupt mode bit-masks */ +#define IRQ_MODE_TRIG_Pos (0U) +#define IRQ_MODE_TRIG_Msk (0x07UL /*<< IRQ_MODE_TRIG_Pos*/) +#define IRQ_MODE_TRIG_LEVEL (0x00UL /*<< IRQ_MODE_TRIG_Pos*/) ///< Trigger: level triggered interrupt +#define IRQ_MODE_TRIG_LEVEL_LOW (0x01UL /*<< IRQ_MODE_TRIG_Pos*/) ///< Trigger: low level triggered interrupt +#define IRQ_MODE_TRIG_LEVEL_HIGH (0x02UL /*<< IRQ_MODE_TRIG_Pos*/) ///< Trigger: high level triggered interrupt +#define IRQ_MODE_TRIG_EDGE (0x04UL /*<< IRQ_MODE_TRIG_Pos*/) ///< Trigger: edge triggered interrupt +#define IRQ_MODE_TRIG_EDGE_RISING (0x05UL /*<< IRQ_MODE_TRIG_Pos*/) ///< Trigger: rising edge triggered interrupt +#define IRQ_MODE_TRIG_EDGE_FALLING (0x06UL /*<< IRQ_MODE_TRIG_Pos*/) ///< Trigger: falling edge triggered interrupt +#define IRQ_MODE_TRIG_EDGE_BOTH (0x07UL /*<< IRQ_MODE_TRIG_Pos*/) ///< Trigger: rising and falling edge triggered interrupt + +#define IRQ_MODE_TYPE_Pos (3U) +#define IRQ_MODE_TYPE_Msk (0x01UL << IRQ_MODE_TYPE_Pos) +#define IRQ_MODE_TYPE_IRQ (0x00UL << IRQ_MODE_TYPE_Pos) ///< Type: interrupt source triggers CPU IRQ line +#define IRQ_MODE_TYPE_FIQ (0x01UL << IRQ_MODE_TYPE_Pos) ///< Type: interrupt source triggers CPU FIQ line + +#define IRQ_MODE_DOMAIN_Pos (4U) +#define IRQ_MODE_DOMAIN_Msk (0x01UL << IRQ_MODE_DOMAIN_Pos) +#define IRQ_MODE_DOMAIN_NONSECURE (0x00UL << IRQ_MODE_DOMAIN_Pos) ///< Domain: interrupt is targeting non-secure domain +#define IRQ_MODE_DOMAIN_SECURE (0x01UL << IRQ_MODE_DOMAIN_Pos) ///< Domain: interrupt is targeting secure domain + +#define IRQ_MODE_CPU_Pos (5U) +#define IRQ_MODE_CPU_Msk (0xFFUL << IRQ_MODE_CPU_Pos) +#define IRQ_MODE_CPU_ALL (0x00UL << IRQ_MODE_CPU_Pos) ///< CPU: interrupt targets all CPUs +#define IRQ_MODE_CPU_0 (0x01UL << IRQ_MODE_CPU_Pos) ///< CPU: interrupt targets CPU 0 +#define IRQ_MODE_CPU_1 (0x02UL << IRQ_MODE_CPU_Pos) ///< CPU: interrupt targets CPU 1 +#define IRQ_MODE_CPU_2 (0x04UL << IRQ_MODE_CPU_Pos) ///< CPU: interrupt targets CPU 2 +#define IRQ_MODE_CPU_3 (0x08UL << IRQ_MODE_CPU_Pos) ///< CPU: interrupt targets CPU 3 +#define IRQ_MODE_CPU_4 (0x10UL << IRQ_MODE_CPU_Pos) ///< CPU: interrupt targets CPU 4 +#define IRQ_MODE_CPU_5 (0x20UL << IRQ_MODE_CPU_Pos) ///< CPU: interrupt targets CPU 5 +#define IRQ_MODE_CPU_6 (0x40UL << IRQ_MODE_CPU_Pos) ///< CPU: interrupt targets CPU 6 +#define IRQ_MODE_CPU_7 (0x80UL << IRQ_MODE_CPU_Pos) ///< CPU: interrupt targets CPU 7 + +#define IRQ_MODE_ERROR (0x80000000UL) ///< Bit indicating mode value error + +/* Interrupt priority bit-masks */ +#define IRQ_PRIORITY_Msk (0x0000FFFFUL) ///< Interrupt priority value bit-mask +#define IRQ_PRIORITY_ERROR (0x80000000UL) ///< Bit indicating priority value error + +/// Initialize interrupt controller. +/// \return 0 on success, -1 on error. +int32_t IRQ_Initialize (void); + +/// Register interrupt handler. +/// \param[in] irqn interrupt ID number +/// \param[in] handler interrupt handler function address +/// \return 0 on success, -1 on error. +int32_t IRQ_SetHandler (IRQn_ID_t irqn, IRQHandler_t handler); + +/// Get the registered interrupt handler. +/// \param[in] irqn interrupt ID number +/// \return registered interrupt handler function address. +IRQHandler_t IRQ_GetHandler (IRQn_ID_t irqn); + +/// Enable interrupt. +/// \param[in] irqn interrupt ID number +/// \return 0 on success, -1 on error. +int32_t IRQ_Enable (IRQn_ID_t irqn); + +/// Disable interrupt. +/// \param[in] irqn interrupt ID number +/// \return 0 on success, -1 on error. +int32_t IRQ_Disable (IRQn_ID_t irqn); + +/// Get interrupt enable state. +/// \param[in] irqn interrupt ID number +/// \return 0 - interrupt is disabled, 1 - interrupt is enabled. +uint32_t IRQ_GetEnableState (IRQn_ID_t irqn); + +/// Configure interrupt request mode. +/// \param[in] irqn interrupt ID number +/// \param[in] mode mode configuration +/// \return 0 on success, -1 on error. +int32_t IRQ_SetMode (IRQn_ID_t irqn, uint32_t mode); + +/// Get interrupt mode configuration. +/// \param[in] irqn interrupt ID number +/// \return current interrupt mode configuration with optional IRQ_MODE_ERROR bit set. +uint32_t IRQ_GetMode (IRQn_ID_t irqn); + +/// Get ID number of current interrupt request (IRQ). +/// \return interrupt ID number. +IRQn_ID_t IRQ_GetActiveIRQ (void); + +/// Get ID number of current fast interrupt request (FIQ). +/// \return interrupt ID number. +IRQn_ID_t IRQ_GetActiveFIQ (void); + +/// Signal end of interrupt processing. +/// \param[in] irqn interrupt ID number +/// \return 0 on success, -1 on error. +int32_t IRQ_EndOfInterrupt (IRQn_ID_t irqn); + +/// Set interrupt pending flag. +/// \param[in] irqn interrupt ID number +/// \return 0 on success, -1 on error. +int32_t IRQ_SetPending (IRQn_ID_t irqn); + +/// Get interrupt pending flag. +/// \param[in] irqn interrupt ID number +/// \return 0 - interrupt is not pending, 1 - interrupt is pending. +uint32_t IRQ_GetPending (IRQn_ID_t irqn); + +/// Clear interrupt pending flag. +/// \param[in] irqn interrupt ID number +/// \return 0 on success, -1 on error. +int32_t IRQ_ClearPending (IRQn_ID_t irqn); + +/// Set interrupt priority value. +/// \param[in] irqn interrupt ID number +/// \param[in] priority interrupt priority value +/// \return 0 on success, -1 on error. +int32_t IRQ_SetPriority (IRQn_ID_t irqn, uint32_t priority); + +/// Get interrupt priority. +/// \param[in] irqn interrupt ID number +/// \return current interrupt priority value with optional IRQ_PRIORITY_ERROR bit set. +uint32_t IRQ_GetPriority (IRQn_ID_t irqn); + +/// Set priority masking threshold. +/// \param[in] priority priority masking threshold value +/// \return 0 on success, -1 on error. +int32_t IRQ_SetPriorityMask (uint32_t priority); + +/// Get priority masking threshold +/// \return current priority masking threshold value with optional IRQ_PRIORITY_ERROR bit set. +uint32_t IRQ_GetPriorityMask (void); + +/// Set priority grouping field split point +/// \param[in] bits number of MSB bits included in the group priority field comparison +/// \return 0 on success, -1 on error. +int32_t IRQ_SetPriorityGroupBits (uint32_t bits); + +/// Get priority grouping field split point +/// \return current number of MSB bits included in the group priority field comparison with +/// optional IRQ_PRIORITY_ERROR bit set. +uint32_t IRQ_GetPriorityGroupBits (void); + +#endif // IRQ_CTRL_H_ diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Core_A/Source/irq_ctrl_gic.c b/STM32CubeMX/revF/Drivers/CMSIS/Core_A/Source/irq_ctrl_gic.c new file mode 100644 index 00000000..25d13591 --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Core_A/Source/irq_ctrl_gic.c @@ -0,0 +1,410 @@ +/**************************************************************************//** + * @file irq_ctrl_gic.c + * @brief Interrupt controller handling implementation for GIC + * @version V1.0.1 + * @date 9. April 2018 + ******************************************************************************/ +/* + * Copyright (c) 2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include "RTE_Components.h" +#include CMSIS_device_header + +#include "irq_ctrl.h" + +#if defined(__GIC_PRESENT) && (__GIC_PRESENT == 1U) + +/// Number of implemented interrupt lines +#ifndef IRQ_GIC_LINE_COUNT +#define IRQ_GIC_LINE_COUNT (1020U) +#endif + +static IRQHandler_t IRQTable[IRQ_GIC_LINE_COUNT] = { 0U }; +static uint32_t IRQ_ID0; + +/// Initialize interrupt controller. +__WEAK int32_t IRQ_Initialize (void) { + uint32_t i; + + for (i = 0U; i < IRQ_GIC_LINE_COUNT; i++) { + IRQTable[i] = (IRQHandler_t)NULL; + } + GIC_Enable(); + return (0); +} + + +/// Register interrupt handler. +__WEAK int32_t IRQ_SetHandler (IRQn_ID_t irqn, IRQHandler_t handler) { + int32_t status; + + if ((irqn >= 0) && (irqn < (IRQn_ID_t)IRQ_GIC_LINE_COUNT)) { + IRQTable[irqn] = handler; + status = 0; + } else { + status = -1; + } + + return (status); +} + + +/// Get the registered interrupt handler. +__WEAK IRQHandler_t IRQ_GetHandler (IRQn_ID_t irqn) { + IRQHandler_t h; + + // Ignore CPUID field (software generated interrupts) + irqn &= 0x3FFU; + + if ((irqn >= 0) && (irqn < (IRQn_ID_t)IRQ_GIC_LINE_COUNT)) { + h = IRQTable[irqn]; + } else { + h = (IRQHandler_t)0; + } + + return (h); +} + + +/// Enable interrupt. +__WEAK int32_t IRQ_Enable (IRQn_ID_t irqn) { + int32_t status; + + if ((irqn >= 0) && (irqn < (IRQn_ID_t)IRQ_GIC_LINE_COUNT)) { + GIC_EnableIRQ ((IRQn_Type)irqn); + status = 0; + } else { + status = -1; + } + + return (status); +} + + +/// Disable interrupt. +__WEAK int32_t IRQ_Disable (IRQn_ID_t irqn) { + int32_t status; + + if ((irqn >= 0) && (irqn < (IRQn_ID_t)IRQ_GIC_LINE_COUNT)) { + GIC_DisableIRQ ((IRQn_Type)irqn); + status = 0; + } else { + status = -1; + } + + return (status); +} + + +/// Get interrupt enable state. +__WEAK uint32_t IRQ_GetEnableState (IRQn_ID_t irqn) { + uint32_t enable; + + if ((irqn >= 0) && (irqn < (IRQn_ID_t)IRQ_GIC_LINE_COUNT)) { + enable = GIC_GetEnableIRQ((IRQn_Type)irqn); + } else { + enable = 0U; + } + + return (enable); +} + + +/// Configure interrupt request mode. +__WEAK int32_t IRQ_SetMode (IRQn_ID_t irqn, uint32_t mode) { + uint32_t val; + uint8_t cfg; + uint8_t secure; + uint8_t cpu; + int32_t status = 0; + + if ((irqn >= 0) && (irqn < (IRQn_ID_t)IRQ_GIC_LINE_COUNT)) { + // Check triggering mode + val = (mode & IRQ_MODE_TRIG_Msk); + + if (val == IRQ_MODE_TRIG_LEVEL) { + cfg = 0x00U; + } else if (val == IRQ_MODE_TRIG_EDGE) { + cfg = 0x02U; + } else { + cfg = 0x00U; + status = -1; + } + + // Check interrupt type + val = mode & IRQ_MODE_TYPE_Msk; + + if (val != IRQ_MODE_TYPE_IRQ) { + status = -1; + } + + // Check interrupt domain + val = mode & IRQ_MODE_DOMAIN_Msk; + + if (val == IRQ_MODE_DOMAIN_NONSECURE) { + secure = 0U; + } else { + // Check security extensions support + val = GIC_DistributorInfo() & (1UL << 10U); + + if (val != 0U) { + // Security extensions are supported + secure = 1U; + } else { + secure = 0U; + status = -1; + } + } + + // Check interrupt CPU targets + val = mode & IRQ_MODE_CPU_Msk; + + if (val == IRQ_MODE_CPU_ALL) { + cpu = 0xFFU; + } else { + cpu = val >> IRQ_MODE_CPU_Pos; + } + + // Apply configuration if no mode error + if (status == 0) { + GIC_SetConfiguration((IRQn_Type)irqn, cfg); + GIC_SetTarget ((IRQn_Type)irqn, cpu); + + if (secure != 0U) { + GIC_SetGroup ((IRQn_Type)irqn, secure); + } + } + } + + return (status); +} + + +/// Get interrupt mode configuration. +__WEAK uint32_t IRQ_GetMode (IRQn_ID_t irqn) { + uint32_t mode; + uint32_t val; + + if ((irqn >= 0) && (irqn < (IRQn_ID_t)IRQ_GIC_LINE_COUNT)) { + mode = IRQ_MODE_TYPE_IRQ; + + // Get trigger mode + val = GIC_GetConfiguration((IRQn_Type)irqn); + + if ((val & 2U) != 0U) { + // Corresponding interrupt is edge triggered + mode |= IRQ_MODE_TRIG_EDGE; + } else { + // Corresponding interrupt is level triggered + mode |= IRQ_MODE_TRIG_LEVEL; + } + + // Get interrupt CPU targets + mode |= GIC_GetTarget ((IRQn_Type)irqn) << IRQ_MODE_CPU_Pos; + + } else { + mode = IRQ_MODE_ERROR; + } + + return (mode); +} + + +/// Get ID number of current interrupt request (IRQ). +__WEAK IRQn_ID_t IRQ_GetActiveIRQ (void) { + IRQn_ID_t irqn; + uint32_t prio; + + /* Dummy read to avoid GIC 390 errata 801120 */ + GIC_GetHighPendingIRQ(); + + irqn = GIC_AcknowledgePending(); + + __DSB(); + + /* Workaround GIC 390 errata 733075 (GIC-390_Errata_Notice_v6.pdf, 09-Jul-2014) */ + /* The following workaround code is for a single-core system. It would be */ + /* different in a multi-core system. */ + /* If the ID is 0 or 0x3FE or 0x3FF, then the GIC CPU interface may be locked-up */ + /* so unlock it, otherwise service the interrupt as normal. */ + /* Special IDs 1020=0x3FC and 1021=0x3FD are reserved values in GICv1 and GICv2 */ + /* so will not occur here. */ + + if ((irqn == 0) || (irqn >= 0x3FE)) { + /* Unlock the CPU interface with a dummy write to Interrupt Priority Register */ + prio = GIC_GetPriority((IRQn_Type)0); + GIC_SetPriority ((IRQn_Type)0, prio); + + __DSB(); + + if ((irqn == 0U) && ((GIC_GetIRQStatus ((IRQn_Type)irqn) & 1U) != 0U) && (IRQ_ID0 == 0U)) { + /* If the ID is 0, is active and has not been seen before */ + IRQ_ID0 = 1U; + } + /* End of Workaround GIC 390 errata 733075 */ + } + + return (irqn); +} + + +/// Get ID number of current fast interrupt request (FIQ). +__WEAK IRQn_ID_t IRQ_GetActiveFIQ (void) { + return ((IRQn_ID_t)-1); +} + + +/// Signal end of interrupt processing. +__WEAK int32_t IRQ_EndOfInterrupt (IRQn_ID_t irqn) { + int32_t status; + IRQn_Type irq = (IRQn_Type)irqn; + + irqn &= 0x3FFU; + + if ((irqn >= 0) && (irqn < (IRQn_ID_t)IRQ_GIC_LINE_COUNT)) { + GIC_EndInterrupt (irq); + + if (irqn == 0) { + IRQ_ID0 = 0U; + } + + status = 0; + } else { + status = -1; + } + + return (status); +} + + +/// Set interrupt pending flag. +__WEAK int32_t IRQ_SetPending (IRQn_ID_t irqn) { + int32_t status; + + if ((irqn >= 0) && (irqn < (IRQn_ID_t)IRQ_GIC_LINE_COUNT)) { + GIC_SetPendingIRQ ((IRQn_Type)irqn); + status = 0; + } else { + status = -1; + } + + return (status); +} + +/// Get interrupt pending flag. +__WEAK uint32_t IRQ_GetPending (IRQn_ID_t irqn) { + uint32_t pending; + + if ((irqn >= 16) && (irqn < (IRQn_ID_t)IRQ_GIC_LINE_COUNT)) { + pending = GIC_GetPendingIRQ ((IRQn_Type)irqn); + } else { + pending = 0U; + } + + return (pending & 1U); +} + + +/// Clear interrupt pending flag. +__WEAK int32_t IRQ_ClearPending (IRQn_ID_t irqn) { + int32_t status; + + if ((irqn >= 16) && (irqn < (IRQn_ID_t)IRQ_GIC_LINE_COUNT)) { + GIC_ClearPendingIRQ ((IRQn_Type)irqn); + status = 0; + } else { + status = -1; + } + + return (status); +} + + +/// Set interrupt priority value. +__WEAK int32_t IRQ_SetPriority (IRQn_ID_t irqn, uint32_t priority) { + int32_t status; + + if ((irqn >= 0) && (irqn < (IRQn_ID_t)IRQ_GIC_LINE_COUNT)) { + GIC_SetPriority ((IRQn_Type)irqn, priority); + status = 0; + } else { + status = -1; + } + + return (status); +} + + +/// Get interrupt priority. +__WEAK uint32_t IRQ_GetPriority (IRQn_ID_t irqn) { + uint32_t priority; + + if ((irqn >= 0) && (irqn < (IRQn_ID_t)IRQ_GIC_LINE_COUNT)) { + priority = GIC_GetPriority ((IRQn_Type)irqn); + } else { + priority = IRQ_PRIORITY_ERROR; + } + + return (priority); +} + + +/// Set priority masking threshold. +__WEAK int32_t IRQ_SetPriorityMask (uint32_t priority) { + GIC_SetInterfacePriorityMask (priority); + return (0); +} + + +/// Get priority masking threshold +__WEAK uint32_t IRQ_GetPriorityMask (void) { + return GIC_GetInterfacePriorityMask(); +} + + +/// Set priority grouping field split point +__WEAK int32_t IRQ_SetPriorityGroupBits (uint32_t bits) { + int32_t status; + + if (bits == IRQ_PRIORITY_Msk) { + bits = 7U; + } + + if (bits < 8U) { + GIC_SetBinaryPoint (7U - bits); + status = 0; + } else { + status = -1; + } + + return (status); +} + + +/// Get priority grouping field split point +__WEAK uint32_t IRQ_GetPriorityGroupBits (void) { + uint32_t bp; + + bp = GIC_GetBinaryPoint() & 0x07U; + + return (7U - bp); +} + +#endif diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_abs_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_abs_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_abs_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_abs_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_abs_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_abs_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_abs_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_abs_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_abs_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_abs_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_abs_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_abs_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_abs_q7.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_abs_q7.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_abs_q7.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_abs_q7.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_add_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_add_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_add_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_add_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_add_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_add_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_add_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_add_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_add_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_add_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_add_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_add_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_add_q7.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_add_q7.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_add_q7.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_add_q7.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_q7.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_q7.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_q7.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_dot_prod_q7.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_mult_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_mult_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_mult_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_mult_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_mult_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_mult_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_mult_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_mult_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_mult_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_mult_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_mult_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_mult_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_mult_q7.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_mult_q7.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_mult_q7.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_mult_q7.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_negate_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_negate_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_negate_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_negate_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_negate_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_negate_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_negate_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_negate_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_negate_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_negate_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_negate_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_negate_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_negate_q7.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_negate_q7.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_negate_q7.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_negate_q7.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_offset_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_offset_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_offset_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_offset_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_offset_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_offset_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_offset_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_offset_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_offset_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_offset_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_offset_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_offset_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_offset_q7.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_offset_q7.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_offset_q7.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_offset_q7.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_scale_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_scale_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_scale_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_scale_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_scale_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_scale_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_scale_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_scale_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_scale_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_scale_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_scale_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_scale_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_scale_q7.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_scale_q7.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_scale_q7.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_scale_q7.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_shift_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_shift_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_shift_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_shift_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_shift_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_shift_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_shift_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_shift_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_shift_q7.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_shift_q7.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_shift_q7.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_shift_q7.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_sub_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_sub_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_sub_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_sub_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_sub_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_sub_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_sub_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_sub_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_sub_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_sub_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_sub_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_sub_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_sub_q7.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_sub_q7.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_sub_q7.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/BasicMathFunctions/arm_sub_q7.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/CommonTables/arm_common_tables.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/CommonTables/arm_common_tables.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/CommonTables/arm_common_tables.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/CommonTables/arm_common_tables.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/CommonTables/arm_const_structs.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/CommonTables/arm_const_structs.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/CommonTables/arm_const_structs.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/CommonTables/arm_const_structs.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_conj_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_conj_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_conj_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_conj_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_conj_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_conj_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_conj_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_conj_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_conj_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_conj_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_conj_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_conj_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_dot_prod_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_dot_prod_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_dot_prod_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_dot_prod_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_dot_prod_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_dot_prod_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_dot_prod_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_dot_prod_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_dot_prod_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_dot_prod_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_dot_prod_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_dot_prod_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_squared_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_squared_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_squared_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_squared_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_squared_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_squared_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_squared_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_squared_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_squared_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_squared_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_squared_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mag_squared_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_cmplx_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_real_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_real_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_real_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_real_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_real_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_real_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_real_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_real_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_real_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_real_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_real_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ComplexMathFunctions/arm_cmplx_mult_real_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_init_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_init_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_init_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_init_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_init_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_init_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_init_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_init_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_init_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_init_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_init_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_init_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_reset_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_reset_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_reset_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_reset_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_reset_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_reset_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_reset_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_reset_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_reset_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_reset_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_reset_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_pid_reset_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_sin_cos_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_sin_cos_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_sin_cos_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_sin_cos_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_sin_cos_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_sin_cos_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_sin_cos_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/ControllerFunctions/arm_sin_cos_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_cos_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_cos_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_cos_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_cos_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_cos_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_cos_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_cos_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_cos_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_cos_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_cos_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_cos_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_cos_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sin_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sin_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sin_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sin_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sin_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sin_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sin_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sin_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sin_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sin_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sin_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sin_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sqrt_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sqrt_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sqrt_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sqrt_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sqrt_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sqrt_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sqrt_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FastMathFunctions/arm_sqrt_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_32x64_init_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_32x64_init_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_32x64_init_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_32x64_init_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_32x64_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_32x64_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_32x64_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_32x64_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_fast_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_fast_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_fast_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_fast_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_fast_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_fast_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_fast_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_fast_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_init_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_init_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_init_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_init_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_init_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_init_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_init_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_init_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_init_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_init_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_init_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_init_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df1_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_f64.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_f64.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_f64.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_f64.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_init_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_init_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_init_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_init_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_init_f64.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_init_f64.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_init_f64.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_df2T_init_f64.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_stereo_df2T_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_stereo_df2T_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_stereo_df2T_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_stereo_df2T_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_stereo_df2T_init_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_stereo_df2T_init_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_stereo_df2T_init_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_biquad_cascade_stereo_df2T_init_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_fast_opt_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_fast_opt_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_fast_opt_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_fast_opt_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_fast_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_fast_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_fast_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_fast_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_fast_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_fast_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_fast_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_fast_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_opt_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_opt_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_opt_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_opt_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_opt_q7.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_opt_q7.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_opt_q7.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_opt_q7.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_fast_opt_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_fast_opt_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_fast_opt_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_fast_opt_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_fast_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_fast_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_fast_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_fast_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_fast_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_fast_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_fast_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_fast_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_opt_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_opt_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_opt_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_opt_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_opt_q7.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_opt_q7.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_opt_q7.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_opt_q7.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_q7.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_q7.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_q7.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_partial_q7.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_q7.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_q7.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_q7.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_conv_q7.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_fast_opt_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_fast_opt_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_fast_opt_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_fast_opt_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_fast_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_fast_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_fast_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_fast_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_fast_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_fast_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_fast_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_fast_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_opt_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_opt_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_opt_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_opt_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_opt_q7.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_opt_q7.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_opt_q7.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_opt_q7.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_q7.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_q7.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_q7.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_correlate_q7.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_fast_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_fast_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_fast_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_fast_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_fast_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_fast_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_fast_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_fast_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_init_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_init_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_init_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_init_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_init_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_init_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_init_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_init_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_init_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_init_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_init_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_init_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_decimate_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_fast_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_fast_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_fast_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_fast_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_fast_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_fast_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_fast_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_fast_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_init_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_init_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_init_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_init_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_init_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_init_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_init_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_init_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_init_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_init_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_init_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_init_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_init_q7.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_init_q7.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_init_q7.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_init_q7.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_init_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_init_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_init_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_init_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_init_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_init_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_init_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_init_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_init_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_init_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_init_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_init_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_init_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_init_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_init_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_init_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_init_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_init_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_init_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_init_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_init_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_init_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_init_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_init_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_lattice_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_q7.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_q7.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_q7.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_q7.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_q7.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_q7.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_q7.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_init_q7.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_q7.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_q7.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_q7.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_sparse_q7.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_init_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_init_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_init_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_init_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_init_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_init_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_init_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_init_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_init_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_init_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_init_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_init_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_iir_lattice_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_init_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_init_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_init_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_init_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_init_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_init_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_init_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_init_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_init_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_init_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_init_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_init_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_init_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_init_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_init_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_init_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_init_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_init_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_init_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_init_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_init_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_init_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_init_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_init_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_norm_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_lms_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_add_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_add_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_add_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_add_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_add_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_add_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_add_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_add_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_add_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_add_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_add_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_add_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_cmplx_mult_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_cmplx_mult_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_cmplx_mult_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_cmplx_mult_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_cmplx_mult_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_cmplx_mult_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_cmplx_mult_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_cmplx_mult_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_cmplx_mult_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_cmplx_mult_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_cmplx_mult_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_cmplx_mult_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_init_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_init_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_init_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_init_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_init_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_init_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_init_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_init_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_init_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_init_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_init_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_init_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_inverse_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_inverse_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_inverse_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_inverse_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_inverse_f64.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_inverse_f64.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_inverse_f64.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_inverse_f64.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_fast_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_fast_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_fast_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_fast_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_fast_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_fast_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_fast_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_fast_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_mult_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_scale_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_scale_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_scale_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_scale_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_scale_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_scale_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_scale_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_scale_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_scale_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_scale_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_scale_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_scale_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_sub_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_sub_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_sub_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_sub_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_sub_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_sub_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_sub_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_sub_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_sub_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_sub_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_sub_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_sub_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_trans_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_trans_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_trans_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_trans_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_trans_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_trans_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_trans_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_trans_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_trans_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_trans_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_trans_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/MatrixFunctions/arm_mat_trans_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_max_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_max_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_max_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_max_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_max_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_max_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_max_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_max_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_max_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_max_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_max_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_max_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_max_q7.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_max_q7.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_max_q7.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_max_q7.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_mean_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_mean_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_mean_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_mean_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_mean_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_mean_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_mean_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_mean_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_mean_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_mean_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_mean_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_mean_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_mean_q7.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_mean_q7.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_mean_q7.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_mean_q7.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_min_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_min_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_min_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_min_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_min_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_min_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_min_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_min_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_min_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_min_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_min_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_min_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_min_q7.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_min_q7.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_min_q7.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_min_q7.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_power_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_power_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_power_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_power_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_power_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_power_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_power_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_power_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_power_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_power_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_power_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_power_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_power_q7.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_power_q7.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_power_q7.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_power_q7.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_rms_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_rms_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_rms_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_rms_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_rms_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_rms_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_rms_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_rms_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_rms_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_rms_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_rms_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_rms_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_std_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_std_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_std_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_std_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_std_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_std_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_std_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_std_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_std_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_std_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_std_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_std_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_var_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_var_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_var_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_var_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_var_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_var_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_var_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_var_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_var_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_var_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_var_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/StatisticsFunctions/arm_var_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_copy_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_copy_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_copy_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_copy_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_copy_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_copy_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_copy_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_copy_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_copy_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_copy_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_copy_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_copy_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_copy_q7.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_copy_q7.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_copy_q7.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_copy_q7.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_fill_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_fill_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_fill_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_fill_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_fill_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_fill_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_fill_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_fill_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_fill_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_fill_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_fill_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_fill_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_fill_q7.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_fill_q7.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_fill_q7.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_fill_q7.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_float_to_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_float_to_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_float_to_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_float_to_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_float_to_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_float_to_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_float_to_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_float_to_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_float_to_q7.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_float_to_q7.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_float_to_q7.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_float_to_q7.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q15_to_float.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q15_to_float.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q15_to_float.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q15_to_float.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q15_to_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q15_to_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q15_to_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q15_to_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q15_to_q7.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q15_to_q7.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q15_to_q7.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q15_to_q7.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q31_to_float.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q31_to_float.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q31_to_float.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q31_to_float.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q31_to_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q31_to_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q31_to_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q31_to_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q31_to_q7.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q31_to_q7.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q31_to_q7.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q31_to_q7.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q7_to_float.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q7_to_float.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q7_to_float.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q7_to_float.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q7_to_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q7_to_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q7_to_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q7_to_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q7_to_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q7_to_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q7_to_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/SupportFunctions/arm_q7_to_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_bitreversal.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_bitreversal.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_bitreversal.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_bitreversal.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_init_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_init_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_init_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_init_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_init_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_init_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_init_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_init_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_init_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_init_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_init_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_init_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix2_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_init_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_init_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_init_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_init_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_init_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_init_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_init_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_init_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_init_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_init_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_init_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_init_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix4_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix8_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix8_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix8_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_cfft_radix8_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_init_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_init_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_init_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_init_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_init_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_init_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_init_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_init_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_init_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_init_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_init_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_init_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_dct4_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_fast_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_fast_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_fast_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_fast_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_fast_init_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_fast_init_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_fast_init_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_fast_init_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_init_f32.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_init_f32.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_init_f32.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_init_f32.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_init_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_init_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_init_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_init_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_init_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_init_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_init_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_init_q31.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_q15.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_q15.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_q15.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_q15.c diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_q31.c b/STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_q31.c old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_q31.c rename to STM32CubeMX/revF/Drivers/CMSIS/DSP_Lib/Source/TransformFunctions/arm_rfft_q31.c diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Include/stm32f205xx.h b/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Include/stm32f205xx.h new file mode 100644 index 00000000..cdc64d1a --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Include/stm32f205xx.h @@ -0,0 +1,13717 @@ +/** + ****************************************************************************** + * @file stm32f205xx.h + * @author MCD Application Team + * @brief CMSIS STM32F205xx Device Peripheral Access Layer Header File. + * + * This file contains : + * - Data structures and the address mapping for all peripherals + * - Peripherals registers declarations and bits definition + * - Macros to access peripheral’s registers hardware + * + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2017 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS_Device + * @{ + */ + +/** @addtogroup stm32f205xx + * @{ + */ + +#ifndef __STM32F205xx_H +#define __STM32F205xx_H + +#ifdef __cplusplus + extern "C" { +#endif /* __cplusplus */ + +/** @addtogroup Configuration_section_for_CMSIS + * @{ + */ + +/** + * @brief Configuration of the Cortex-M3 Processor and Core Peripherals + */ +#define __CM3_REV 0x0200U /*!< Core revision r0p1 */ +#define __MPU_PRESENT 1U /*!< STM32F2XX provides an MPU */ +#define __NVIC_PRIO_BITS 4U /*!< STM32F2XX uses 4 Bits for the Priority Levels */ +#define __Vendor_SysTickConfig 0U /*!< Set to 1 if different SysTick Config is used */ + +/** + * @} + */ + +/** @addtogroup Peripheral_interrupt_number_definition + * @{ + */ + +/** + * @brief STM32F2XX Interrupt Number Definition, according to the selected device + * in @ref Library_configuration_section + */ +typedef enum +{ +/****** Cortex-M3 Processor Exceptions Numbers ****************************************************************/ + NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ + HardFault_IRQn = -13, /*!< 3 Hard Fault Interrupt */ + MemoryManagement_IRQn = -12, /*!< 4 Cortex-M3 Memory Management Interrupt */ + BusFault_IRQn = -11, /*!< 5 Cortex-M3 Bus Fault Interrupt */ + UsageFault_IRQn = -10, /*!< 6 Cortex-M3 Usage Fault Interrupt */ + SVCall_IRQn = -5, /*!< 11 Cortex-M3 SV Call Interrupt */ + DebugMonitor_IRQn = -4, /*!< 12 Cortex-M3 Debug Monitor Interrupt */ + PendSV_IRQn = -2, /*!< 14 Cortex-M3 Pend SV Interrupt */ + SysTick_IRQn = -1, /*!< 15 Cortex-M3 System Tick Interrupt */ +/****** STM32 specific Interrupt Numbers **********************************************************************/ + WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */ + PVD_IRQn = 1, /*!< PVD through EXTI Line detection Interrupt */ + TAMP_STAMP_IRQn = 2, /*!< Tamper and TimeStamp interrupts through the EXTI line */ + RTC_WKUP_IRQn = 3, /*!< RTC Wakeup interrupt through the EXTI line */ + FLASH_IRQn = 4, /*!< FLASH global Interrupt */ + RCC_IRQn = 5, /*!< RCC global Interrupt */ + EXTI0_IRQn = 6, /*!< EXTI Line0 Interrupt */ + EXTI1_IRQn = 7, /*!< EXTI Line1 Interrupt */ + EXTI2_IRQn = 8, /*!< EXTI Line2 Interrupt */ + EXTI3_IRQn = 9, /*!< EXTI Line3 Interrupt */ + EXTI4_IRQn = 10, /*!< EXTI Line4 Interrupt */ + DMA1_Stream0_IRQn = 11, /*!< DMA1 Stream 0 global Interrupt */ + DMA1_Stream1_IRQn = 12, /*!< DMA1 Stream 1 global Interrupt */ + DMA1_Stream2_IRQn = 13, /*!< DMA1 Stream 2 global Interrupt */ + DMA1_Stream3_IRQn = 14, /*!< DMA1 Stream 3 global Interrupt */ + DMA1_Stream4_IRQn = 15, /*!< DMA1 Stream 4 global Interrupt */ + DMA1_Stream5_IRQn = 16, /*!< DMA1 Stream 5 global Interrupt */ + DMA1_Stream6_IRQn = 17, /*!< DMA1 Stream 6 global Interrupt */ + ADC_IRQn = 18, /*!< ADC1, ADC2 and ADC3 global Interrupts */ + CAN1_TX_IRQn = 19, /*!< CAN1 TX Interrupt */ + CAN1_RX0_IRQn = 20, /*!< CAN1 RX0 Interrupt */ + CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ + CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ + EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TIM1_BRK_TIM9_IRQn = 24, /*!< TIM1 Break interrupt and TIM9 global interrupt */ + TIM1_UP_TIM10_IRQn = 25, /*!< TIM1 Update Interrupt and TIM10 global interrupt */ + TIM1_TRG_COM_TIM11_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt and TIM11 global interrupt */ + TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ + TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ + TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ + TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ + I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + USART3_IRQn = 39, /*!< USART3 global Interrupt */ + EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTC_Alarm_IRQn = 41, /*!< RTC Alarm (A and B) through EXTI Line Interrupt */ + OTG_FS_WKUP_IRQn = 42, /*!< USB OTG FS Wakeup through EXTI line interrupt */ + TIM8_BRK_TIM12_IRQn = 43, /*!< TIM8 Break Interrupt and TIM12 global interrupt */ + TIM8_UP_TIM13_IRQn = 44, /*!< TIM8 Update Interrupt and TIM13 global interrupt */ + TIM8_TRG_COM_TIM14_IRQn = 45, /*!< TIM8 Trigger and Commutation Interrupt and TIM14 global interrupt */ + TIM8_CC_IRQn = 46, /*!< TIM8 Capture Compare Interrupt */ + DMA1_Stream7_IRQn = 47, /*!< DMA1 Stream7 Interrupt */ + FSMC_IRQn = 48, /*!< FSMC global Interrupt */ + SDIO_IRQn = 49, /*!< SDIO global Interrupt */ + TIM5_IRQn = 50, /*!< TIM5 global Interrupt */ + SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ + UART4_IRQn = 52, /*!< UART4 global Interrupt */ + UART5_IRQn = 53, /*!< UART5 global Interrupt */ + TIM6_DAC_IRQn = 54, /*!< TIM6 global and DAC1&2 underrun error interrupts */ + TIM7_IRQn = 55, /*!< TIM7 global interrupt */ + DMA2_Stream0_IRQn = 56, /*!< DMA2 Stream 0 global Interrupt */ + DMA2_Stream1_IRQn = 57, /*!< DMA2 Stream 1 global Interrupt */ + DMA2_Stream2_IRQn = 58, /*!< DMA2 Stream 2 global Interrupt */ + DMA2_Stream3_IRQn = 59, /*!< DMA2 Stream 3 global Interrupt */ + DMA2_Stream4_IRQn = 60, /*!< DMA2 Stream 4 global Interrupt */ + CAN2_TX_IRQn = 63, /*!< CAN2 TX Interrupt */ + CAN2_RX0_IRQn = 64, /*!< CAN2 RX0 Interrupt */ + CAN2_RX1_IRQn = 65, /*!< CAN2 RX1 Interrupt */ + CAN2_SCE_IRQn = 66, /*!< CAN2 SCE Interrupt */ + OTG_FS_IRQn = 67, /*!< USB OTG FS global Interrupt */ + DMA2_Stream5_IRQn = 68, /*!< DMA2 Stream 5 global interrupt */ + DMA2_Stream6_IRQn = 69, /*!< DMA2 Stream 6 global interrupt */ + DMA2_Stream7_IRQn = 70, /*!< DMA2 Stream 7 global interrupt */ + USART6_IRQn = 71, /*!< USART6 global interrupt */ + I2C3_EV_IRQn = 72, /*!< I2C3 event interrupt */ + I2C3_ER_IRQn = 73, /*!< I2C3 error interrupt */ + OTG_HS_EP1_OUT_IRQn = 74, /*!< USB OTG HS End Point 1 Out global interrupt */ + OTG_HS_EP1_IN_IRQn = 75, /*!< USB OTG HS End Point 1 In global interrupt */ + OTG_HS_WKUP_IRQn = 76, /*!< USB OTG HS Wakeup through EXTI interrupt */ + OTG_HS_IRQn = 77, /*!< USB OTG HS global interrupt */ + RNG_IRQn = 80 /*!< Rng global interrupt */ +} IRQn_Type; + +/** + * @} + */ + +#include "core_cm3.h" +#include "system_stm32f2xx.h" +#include + +/** @addtogroup Peripheral_registers_structures + * @{ + */ + +/** + * @brief Analog to Digital Converter + */ + +typedef struct +{ + __IO uint32_t SR; /*!< ADC status register, Address offset: 0x00 */ + __IO uint32_t CR1; /*!< ADC control register 1, Address offset: 0x04 */ + __IO uint32_t CR2; /*!< ADC control register 2, Address offset: 0x08 */ + __IO uint32_t SMPR1; /*!< ADC sample time register 1, Address offset: 0x0C */ + __IO uint32_t SMPR2; /*!< ADC sample time register 2, Address offset: 0x10 */ + __IO uint32_t JOFR1; /*!< ADC injected channel data offset register 1, Address offset: 0x14 */ + __IO uint32_t JOFR2; /*!< ADC injected channel data offset register 2, Address offset: 0x18 */ + __IO uint32_t JOFR3; /*!< ADC injected channel data offset register 3, Address offset: 0x1C */ + __IO uint32_t JOFR4; /*!< ADC injected channel data offset register 4, Address offset: 0x20 */ + __IO uint32_t HTR; /*!< ADC watchdog higher threshold register, Address offset: 0x24 */ + __IO uint32_t LTR; /*!< ADC watchdog lower threshold register, Address offset: 0x28 */ + __IO uint32_t SQR1; /*!< ADC regular sequence register 1, Address offset: 0x2C */ + __IO uint32_t SQR2; /*!< ADC regular sequence register 2, Address offset: 0x30 */ + __IO uint32_t SQR3; /*!< ADC regular sequence register 3, Address offset: 0x34 */ + __IO uint32_t JSQR; /*!< ADC injected sequence register, Address offset: 0x38*/ + __IO uint32_t JDR1; /*!< ADC injected data register 1, Address offset: 0x3C */ + __IO uint32_t JDR2; /*!< ADC injected data register 2, Address offset: 0x40 */ + __IO uint32_t JDR3; /*!< ADC injected data register 3, Address offset: 0x44 */ + __IO uint32_t JDR4; /*!< ADC injected data register 4, Address offset: 0x48 */ + __IO uint32_t DR; /*!< ADC regular data register, Address offset: 0x4C */ +} ADC_TypeDef; + +typedef struct +{ + __IO uint32_t CSR; /*!< ADC Common status register, Address offset: ADC1 base address + 0x300 */ + __IO uint32_t CCR; /*!< ADC common control register, Address offset: ADC1 base address + 0x304 */ + __IO uint32_t CDR; /*!< ADC common regular data register for dual + AND triple modes, Address offset: ADC1 base address + 0x308 */ +} ADC_Common_TypeDef; + + +/** + * @brief Controller Area Network TxMailBox + */ + +typedef struct +{ + __IO uint32_t TIR; /*!< CAN TX mailbox identifier register */ + __IO uint32_t TDTR; /*!< CAN mailbox data length control and time stamp register */ + __IO uint32_t TDLR; /*!< CAN mailbox data low register */ + __IO uint32_t TDHR; /*!< CAN mailbox data high register */ +} CAN_TxMailBox_TypeDef; + +/** + * @brief Controller Area Network FIFOMailBox + */ + +typedef struct +{ + __IO uint32_t RIR; /*!< CAN receive FIFO mailbox identifier register */ + __IO uint32_t RDTR; /*!< CAN receive FIFO mailbox data length control and time stamp register */ + __IO uint32_t RDLR; /*!< CAN receive FIFO mailbox data low register */ + __IO uint32_t RDHR; /*!< CAN receive FIFO mailbox data high register */ +} CAN_FIFOMailBox_TypeDef; + +/** + * @brief Controller Area Network FilterRegister + */ + +typedef struct +{ + __IO uint32_t FR1; /*!< CAN Filter bank register 1 */ + __IO uint32_t FR2; /*!< CAN Filter bank register 1 */ +} CAN_FilterRegister_TypeDef; + +/** + * @brief Controller Area Network + */ + +typedef struct +{ + __IO uint32_t MCR; /*!< CAN master control register, Address offset: 0x00 */ + __IO uint32_t MSR; /*!< CAN master status register, Address offset: 0x04 */ + __IO uint32_t TSR; /*!< CAN transmit status register, Address offset: 0x08 */ + __IO uint32_t RF0R; /*!< CAN receive FIFO 0 register, Address offset: 0x0C */ + __IO uint32_t RF1R; /*!< CAN receive FIFO 1 register, Address offset: 0x10 */ + __IO uint32_t IER; /*!< CAN interrupt enable register, Address offset: 0x14 */ + __IO uint32_t ESR; /*!< CAN error status register, Address offset: 0x18 */ + __IO uint32_t BTR; /*!< CAN bit timing register, Address offset: 0x1C */ + uint32_t RESERVED0[88]; /*!< Reserved, 0x020 - 0x17F */ + CAN_TxMailBox_TypeDef sTxMailBox[3]; /*!< CAN Tx MailBox, Address offset: 0x180 - 0x1AC */ + CAN_FIFOMailBox_TypeDef sFIFOMailBox[2]; /*!< CAN FIFO MailBox, Address offset: 0x1B0 - 0x1CC */ + uint32_t RESERVED1[12]; /*!< Reserved, 0x1D0 - 0x1FF */ + __IO uint32_t FMR; /*!< CAN filter master register, Address offset: 0x200 */ + __IO uint32_t FM1R; /*!< CAN filter mode register, Address offset: 0x204 */ + uint32_t RESERVED2; /*!< Reserved, 0x208 */ + __IO uint32_t FS1R; /*!< CAN filter scale register, Address offset: 0x20C */ + uint32_t RESERVED3; /*!< Reserved, 0x210 */ + __IO uint32_t FFA1R; /*!< CAN filter FIFO assignment register, Address offset: 0x214 */ + uint32_t RESERVED4; /*!< Reserved, 0x218 */ + __IO uint32_t FA1R; /*!< CAN filter activation register, Address offset: 0x21C */ + uint32_t RESERVED5[8]; /*!< Reserved, 0x220-0x23F */ + CAN_FilterRegister_TypeDef sFilterRegister[28]; /*!< CAN Filter Register, Address offset: 0x240-0x31C */ +} CAN_TypeDef; + +/** + * @brief CRC calculation unit + */ + +typedef struct +{ + __IO uint32_t DR; /*!< CRC Data register, Address offset: 0x00 */ + __IO uint8_t IDR; /*!< CRC Independent data register, Address offset: 0x04 */ + uint8_t RESERVED0; /*!< Reserved, 0x05 */ + uint16_t RESERVED1; /*!< Reserved, 0x06 */ + __IO uint32_t CR; /*!< CRC Control register, Address offset: 0x08 */ +} CRC_TypeDef; + +/** + * @brief Digital to Analog Converter + */ + +typedef struct +{ + __IO uint32_t CR; /*!< DAC control register, Address offset: 0x00 */ + __IO uint32_t SWTRIGR; /*!< DAC software trigger register, Address offset: 0x04 */ + __IO uint32_t DHR12R1; /*!< DAC channel1 12-bit right-aligned data holding register, Address offset: 0x08 */ + __IO uint32_t DHR12L1; /*!< DAC channel1 12-bit left aligned data holding register, Address offset: 0x0C */ + __IO uint32_t DHR8R1; /*!< DAC channel1 8-bit right aligned data holding register, Address offset: 0x10 */ + __IO uint32_t DHR12R2; /*!< DAC channel2 12-bit right aligned data holding register, Address offset: 0x14 */ + __IO uint32_t DHR12L2; /*!< DAC channel2 12-bit left aligned data holding register, Address offset: 0x18 */ + __IO uint32_t DHR8R2; /*!< DAC channel2 8-bit right-aligned data holding register, Address offset: 0x1C */ + __IO uint32_t DHR12RD; /*!< Dual DAC 12-bit right-aligned data holding register, Address offset: 0x20 */ + __IO uint32_t DHR12LD; /*!< DUAL DAC 12-bit left aligned data holding register, Address offset: 0x24 */ + __IO uint32_t DHR8RD; /*!< DUAL DAC 8-bit right aligned data holding register, Address offset: 0x28 */ + __IO uint32_t DOR1; /*!< DAC channel1 data output register, Address offset: 0x2C */ + __IO uint32_t DOR2; /*!< DAC channel2 data output register, Address offset: 0x30 */ + __IO uint32_t SR; /*!< DAC status register, Address offset: 0x34 */ +} DAC_TypeDef; + +/** + * @brief Debug MCU + */ + +typedef struct +{ + __IO uint32_t IDCODE; /*!< MCU device ID code, Address offset: 0x00 */ + __IO uint32_t CR; /*!< Debug MCU configuration register, Address offset: 0x04 */ + __IO uint32_t APB1FZ; /*!< Debug MCU APB1 freeze register, Address offset: 0x08 */ + __IO uint32_t APB2FZ; /*!< Debug MCU APB2 freeze register, Address offset: 0x0C */ +}DBGMCU_TypeDef; + + +/** + * @brief DMA Controller + */ + +typedef struct +{ + __IO uint32_t CR; /*!< DMA stream x configuration register */ + __IO uint32_t NDTR; /*!< DMA stream x number of data register */ + __IO uint32_t PAR; /*!< DMA stream x peripheral address register */ + __IO uint32_t M0AR; /*!< DMA stream x memory 0 address register */ + __IO uint32_t M1AR; /*!< DMA stream x memory 1 address register */ + __IO uint32_t FCR; /*!< DMA stream x FIFO control register */ +} DMA_Stream_TypeDef; + +typedef struct +{ + __IO uint32_t LISR; /*!< DMA low interrupt status register, Address offset: 0x00 */ + __IO uint32_t HISR; /*!< DMA high interrupt status register, Address offset: 0x04 */ + __IO uint32_t LIFCR; /*!< DMA low interrupt flag clear register, Address offset: 0x08 */ + __IO uint32_t HIFCR; /*!< DMA high interrupt flag clear register, Address offset: 0x0C */ +} DMA_TypeDef; + + +/** + * @brief External Interrupt/Event Controller + */ + +typedef struct +{ + __IO uint32_t IMR; /*!< EXTI Interrupt mask register, Address offset: 0x00 */ + __IO uint32_t EMR; /*!< EXTI Event mask register, Address offset: 0x04 */ + __IO uint32_t RTSR; /*!< EXTI Rising trigger selection register, Address offset: 0x08 */ + __IO uint32_t FTSR; /*!< EXTI Falling trigger selection register, Address offset: 0x0C */ + __IO uint32_t SWIER; /*!< EXTI Software interrupt event register, Address offset: 0x10 */ + __IO uint32_t PR; /*!< EXTI Pending register, Address offset: 0x14 */ +} EXTI_TypeDef; + +/** + * @brief FLASH Registers + */ + +typedef struct +{ + __IO uint32_t ACR; /*!< FLASH access control register, Address offset: 0x00 */ + __IO uint32_t KEYR; /*!< FLASH key register, Address offset: 0x04 */ + __IO uint32_t OPTKEYR; /*!< FLASH option key register, Address offset: 0x08 */ + __IO uint32_t SR; /*!< FLASH status register, Address offset: 0x0C */ + __IO uint32_t CR; /*!< FLASH control register, Address offset: 0x10 */ + __IO uint32_t OPTCR; /*!< FLASH option control register, Address offset: 0x14 */ +} FLASH_TypeDef; + + +/** + * @brief Flexible Static Memory Controller + */ + +typedef struct +{ + __IO uint32_t BTCR[8]; /*!< NOR/PSRAM chip-select control register(BCR) and chip-select timing register(BTR), Address offset: 0x00-1C */ +} FSMC_Bank1_TypeDef; + +/** + * @brief Flexible Static Memory Controller Bank1E + */ + +typedef struct +{ + __IO uint32_t BWTR[7]; /*!< NOR/PSRAM write timing registers, Address offset: 0x104-0x11C */ +} FSMC_Bank1E_TypeDef; + +/** + * @brief Flexible Static Memory Controller Bank2 + */ + +typedef struct +{ + __IO uint32_t PCR2; /*!< NAND Flash control register 2, Address offset: 0x60 */ + __IO uint32_t SR2; /*!< NAND Flash FIFO status and interrupt register 2, Address offset: 0x64 */ + __IO uint32_t PMEM2; /*!< NAND Flash Common memory space timing register 2, Address offset: 0x68 */ + __IO uint32_t PATT2; /*!< NAND Flash Attribute memory space timing register 2, Address offset: 0x6C */ + uint32_t RESERVED0; /*!< Reserved, 0x70 */ + __IO uint32_t ECCR2; /*!< NAND Flash ECC result registers 2, Address offset: 0x74 */ + uint32_t RESERVED1; /*!< Reserved, 0x78 */ + uint32_t RESERVED2; /*!< Reserved, 0x7C */ + __IO uint32_t PCR3; /*!< NAND Flash control register 3, Address offset: 0x80 */ + __IO uint32_t SR3; /*!< NAND Flash FIFO status and interrupt register 3, Address offset: 0x84 */ + __IO uint32_t PMEM3; /*!< NAND Flash Common memory space timing register 3, Address offset: 0x88 */ + __IO uint32_t PATT3; /*!< NAND Flash Attribute memory space timing register 3, Address offset: 0x8C */ + uint32_t RESERVED3; /*!< Reserved, 0x90 */ + __IO uint32_t ECCR3; /*!< NAND Flash ECC result registers 3, Address offset: 0x94 */ +} FSMC_Bank2_3_TypeDef; + +/** + * @brief Flexible Static Memory Controller Bank4 + */ + +typedef struct +{ + __IO uint32_t PCR4; /*!< PC Card control register 4, Address offset: 0xA0 */ + __IO uint32_t SR4; /*!< PC Card FIFO status and interrupt register 4, Address offset: 0xA4 */ + __IO uint32_t PMEM4; /*!< PC Card Common memory space timing register 4, Address offset: 0xA8 */ + __IO uint32_t PATT4; /*!< PC Card Attribute memory space timing register 4, Address offset: 0xAC */ + __IO uint32_t PIO4; /*!< PC Card I/O space timing register 4, Address offset: 0xB0 */ +} FSMC_Bank4_TypeDef; + + +/** + * @brief General Purpose I/O + */ + +typedef struct +{ + __IO uint32_t MODER; /*!< GPIO port mode register, Address offset: 0x00 */ + __IO uint32_t OTYPER; /*!< GPIO port output type register, Address offset: 0x04 */ + __IO uint32_t OSPEEDR; /*!< GPIO port output speed register, Address offset: 0x08 */ + __IO uint32_t PUPDR; /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */ + __IO uint32_t IDR; /*!< GPIO port input data register, Address offset: 0x10 */ + __IO uint32_t ODR; /*!< GPIO port output data register, Address offset: 0x14 */ + __IO uint32_t BSRR; /*!< GPIO port bit set/reset register, Address offset: 0x18 */ + __IO uint32_t LCKR; /*!< GPIO port configuration lock register, Address offset: 0x1C */ + __IO uint32_t AFR[2]; /*!< GPIO alternate function registers, Address offset: 0x20-0x24 */ +} GPIO_TypeDef; + +/** + * @brief System configuration controller + */ + +typedef struct +{ + __IO uint32_t MEMRMP; /*!< SYSCFG memory remap register, Address offset: 0x00 */ + __IO uint32_t PMC; /*!< SYSCFG peripheral mode configuration register, Address offset: 0x04 */ + __IO uint32_t EXTICR[4]; /*!< SYSCFG external interrupt configuration registers, Address offset: 0x08-0x14 */ + uint32_t RESERVED[2]; /*!< Reserved, 0x18-0x1C */ + __IO uint32_t CMPCR; /*!< SYSCFG Compensation cell control register, Address offset: 0x20 */ +} SYSCFG_TypeDef; + +/** + * @brief Inter-integrated Circuit Interface + */ + +typedef struct +{ + __IO uint32_t CR1; /*!< I2C Control register 1, Address offset: 0x00 */ + __IO uint32_t CR2; /*!< I2C Control register 2, Address offset: 0x04 */ + __IO uint32_t OAR1; /*!< I2C Own address register 1, Address offset: 0x08 */ + __IO uint32_t OAR2; /*!< I2C Own address register 2, Address offset: 0x0C */ + __IO uint32_t DR; /*!< I2C Data register, Address offset: 0x10 */ + __IO uint32_t SR1; /*!< I2C Status register 1, Address offset: 0x14 */ + __IO uint32_t SR2; /*!< I2C Status register 2, Address offset: 0x18 */ + __IO uint32_t CCR; /*!< I2C Clock control register, Address offset: 0x1C */ + __IO uint32_t TRISE; /*!< I2C TRISE register, Address offset: 0x20 */ +} I2C_TypeDef; + +/** + * @brief Independent WATCHDOG + */ + +typedef struct +{ + __IO uint32_t KR; /*!< IWDG Key register, Address offset: 0x00 */ + __IO uint32_t PR; /*!< IWDG Prescaler register, Address offset: 0x04 */ + __IO uint32_t RLR; /*!< IWDG Reload register, Address offset: 0x08 */ + __IO uint32_t SR; /*!< IWDG Status register, Address offset: 0x0C */ +} IWDG_TypeDef; + +/** + * @brief Power Control + */ + +typedef struct +{ + __IO uint32_t CR; /*!< PWR power control register, Address offset: 0x00 */ + __IO uint32_t CSR; /*!< PWR power control/status register, Address offset: 0x04 */ +} PWR_TypeDef; + +/** + * @brief Reset and Clock Control + */ + +typedef struct +{ + __IO uint32_t CR; /*!< RCC clock control register, Address offset: 0x00 */ + __IO uint32_t PLLCFGR; /*!< RCC PLL configuration register, Address offset: 0x04 */ + __IO uint32_t CFGR; /*!< RCC clock configuration register, Address offset: 0x08 */ + __IO uint32_t CIR; /*!< RCC clock interrupt register, Address offset: 0x0C */ + __IO uint32_t AHB1RSTR; /*!< RCC AHB1 peripheral reset register, Address offset: 0x10 */ + __IO uint32_t AHB2RSTR; /*!< RCC AHB2 peripheral reset register, Address offset: 0x14 */ + __IO uint32_t AHB3RSTR; /*!< RCC AHB3 peripheral reset register, Address offset: 0x18 */ + uint32_t RESERVED0; /*!< Reserved, 0x1C */ + __IO uint32_t APB1RSTR; /*!< RCC APB1 peripheral reset register, Address offset: 0x20 */ + __IO uint32_t APB2RSTR; /*!< RCC APB2 peripheral reset register, Address offset: 0x24 */ + uint32_t RESERVED1[2]; /*!< Reserved, 0x28-0x2C */ + __IO uint32_t AHB1ENR; /*!< RCC AHB1 peripheral clock register, Address offset: 0x30 */ + __IO uint32_t AHB2ENR; /*!< RCC AHB2 peripheral clock register, Address offset: 0x34 */ + __IO uint32_t AHB3ENR; /*!< RCC AHB3 peripheral clock register, Address offset: 0x38 */ + uint32_t RESERVED2; /*!< Reserved, 0x3C */ + __IO uint32_t APB1ENR; /*!< RCC APB1 peripheral clock enable register, Address offset: 0x40 */ + __IO uint32_t APB2ENR; /*!< RCC APB2 peripheral clock enable register, Address offset: 0x44 */ + uint32_t RESERVED3[2]; /*!< Reserved, 0x48-0x4C */ + __IO uint32_t AHB1LPENR; /*!< RCC AHB1 peripheral clock enable in low power mode register, Address offset: 0x50 */ + __IO uint32_t AHB2LPENR; /*!< RCC AHB2 peripheral clock enable in low power mode register, Address offset: 0x54 */ + __IO uint32_t AHB3LPENR; /*!< RCC AHB3 peripheral clock enable in low power mode register, Address offset: 0x58 */ + uint32_t RESERVED4; /*!< Reserved, 0x5C */ + __IO uint32_t APB1LPENR; /*!< RCC APB1 peripheral clock enable in low power mode register, Address offset: 0x60 */ + __IO uint32_t APB2LPENR; /*!< RCC APB2 peripheral clock enable in low power mode register, Address offset: 0x64 */ + uint32_t RESERVED5[2]; /*!< Reserved, 0x68-0x6C */ + __IO uint32_t BDCR; /*!< RCC Backup domain control register, Address offset: 0x70 */ + __IO uint32_t CSR; /*!< RCC clock control & status register, Address offset: 0x74 */ + uint32_t RESERVED6[2]; /*!< Reserved, 0x78-0x7C */ + __IO uint32_t SSCGR; /*!< RCC spread spectrum clock generation register, Address offset: 0x80 */ + __IO uint32_t PLLI2SCFGR; /*!< RCC PLLI2S configuration register, Address offset: 0x84 */ + +} RCC_TypeDef; + +/** + * @brief Real-Time Clock + */ + +typedef struct +{ + __IO uint32_t TR; /*!< RTC time register, Address offset: 0x00 */ + __IO uint32_t DR; /*!< RTC date register, Address offset: 0x04 */ + __IO uint32_t CR; /*!< RTC control register, Address offset: 0x08 */ + __IO uint32_t ISR; /*!< RTC initialization and status register, Address offset: 0x0C */ + __IO uint32_t PRER; /*!< RTC prescaler register, Address offset: 0x10 */ + __IO uint32_t WUTR; /*!< RTC wakeup timer register, Address offset: 0x14 */ + __IO uint32_t CALIBR; /*!< RTC calibration register, Address offset: 0x18 */ + __IO uint32_t ALRMAR; /*!< RTC alarm A register, Address offset: 0x1C */ + __IO uint32_t ALRMBR; /*!< RTC alarm B register, Address offset: 0x20 */ + __IO uint32_t WPR; /*!< RTC write protection register, Address offset: 0x24 */ + uint32_t RESERVED1; /*!< Reserved, 0x28 */ + uint32_t RESERVED2; /*!< Reserved, 0x2C */ + __IO uint32_t TSTR; /*!< RTC time stamp time register, Address offset: 0x30 */ + __IO uint32_t TSDR; /*!< RTC time stamp date register, Address offset: 0x34 */ + uint32_t RESERVED3; /*!< Reserved, 0x38 */ + uint32_t RESERVED4; /*!< Reserved, 0x3C */ + __IO uint32_t TAFCR; /*!< RTC tamper and alternate function configuration register, Address offset: 0x40 */ + uint32_t RESERVED5; /*!< Reserved, 0x44 */ + uint32_t RESERVED6; /*!< Reserved, 0x48 */ + uint32_t RESERVED7; /*!< Reserved, 0x4C */ + __IO uint32_t BKP0R; /*!< RTC backup register 1, Address offset: 0x50 */ + __IO uint32_t BKP1R; /*!< RTC backup register 1, Address offset: 0x54 */ + __IO uint32_t BKP2R; /*!< RTC backup register 2, Address offset: 0x58 */ + __IO uint32_t BKP3R; /*!< RTC backup register 3, Address offset: 0x5C */ + __IO uint32_t BKP4R; /*!< RTC backup register 4, Address offset: 0x60 */ + __IO uint32_t BKP5R; /*!< RTC backup register 5, Address offset: 0x64 */ + __IO uint32_t BKP6R; /*!< RTC backup register 6, Address offset: 0x68 */ + __IO uint32_t BKP7R; /*!< RTC backup register 7, Address offset: 0x6C */ + __IO uint32_t BKP8R; /*!< RTC backup register 8, Address offset: 0x70 */ + __IO uint32_t BKP9R; /*!< RTC backup register 9, Address offset: 0x74 */ + __IO uint32_t BKP10R; /*!< RTC backup register 10, Address offset: 0x78 */ + __IO uint32_t BKP11R; /*!< RTC backup register 11, Address offset: 0x7C */ + __IO uint32_t BKP12R; /*!< RTC backup register 12, Address offset: 0x80 */ + __IO uint32_t BKP13R; /*!< RTC backup register 13, Address offset: 0x84 */ + __IO uint32_t BKP14R; /*!< RTC backup register 14, Address offset: 0x88 */ + __IO uint32_t BKP15R; /*!< RTC backup register 15, Address offset: 0x8C */ + __IO uint32_t BKP16R; /*!< RTC backup register 16, Address offset: 0x90 */ + __IO uint32_t BKP17R; /*!< RTC backup register 17, Address offset: 0x94 */ + __IO uint32_t BKP18R; /*!< RTC backup register 18, Address offset: 0x98 */ + __IO uint32_t BKP19R; /*!< RTC backup register 19, Address offset: 0x9C */ +} RTC_TypeDef; + + +/** + * @brief SD host Interface + */ + +typedef struct +{ + __IO uint32_t POWER; /*!< SDIO power control register, Address offset: 0x00 */ + __IO uint32_t CLKCR; /*!< SDI clock control register, Address offset: 0x04 */ + __IO uint32_t ARG; /*!< SDIO argument register, Address offset: 0x08 */ + __IO uint32_t CMD; /*!< SDIO command register, Address offset: 0x0C */ + __IO const uint32_t RESPCMD; /*!< SDIO command response register, Address offset: 0x10 */ + __IO const uint32_t RESP1; /*!< SDIO response 1 register, Address offset: 0x14 */ + __IO const uint32_t RESP2; /*!< SDIO response 2 register, Address offset: 0x18 */ + __IO const uint32_t RESP3; /*!< SDIO response 3 register, Address offset: 0x1C */ + __IO const uint32_t RESP4; /*!< SDIO response 4 register, Address offset: 0x20 */ + __IO uint32_t DTIMER; /*!< SDIO data timer register, Address offset: 0x24 */ + __IO uint32_t DLEN; /*!< SDIO data length register, Address offset: 0x28 */ + __IO uint32_t DCTRL; /*!< SDIO data control register, Address offset: 0x2C */ + __IO const uint32_t DCOUNT; /*!< SDIO data counter register, Address offset: 0x30 */ + __IO const uint32_t STA; /*!< SDIO status register, Address offset: 0x34 */ + __IO uint32_t ICR; /*!< SDIO interrupt clear register, Address offset: 0x38 */ + __IO uint32_t MASK; /*!< SDIO mask register, Address offset: 0x3C */ + uint32_t RESERVED0[2]; /*!< Reserved, 0x40-0x44 */ + __IO const uint32_t FIFOCNT; /*!< SDIO FIFO counter register, Address offset: 0x48 */ + uint32_t RESERVED1[13]; /*!< Reserved, 0x4C-0x7C */ + __IO uint32_t FIFO; /*!< SDIO data FIFO register, Address offset: 0x80 */ +} SDIO_TypeDef; + +/** + * @brief Serial Peripheral Interface + */ + +typedef struct +{ + __IO uint32_t CR1; /*!< SPI control register 1 (not used in I2S mode), Address offset: 0x00 */ + __IO uint32_t CR2; /*!< SPI control register 2, Address offset: 0x04 */ + __IO uint32_t SR; /*!< SPI status register, Address offset: 0x08 */ + __IO uint32_t DR; /*!< SPI data register, Address offset: 0x0C */ + __IO uint32_t CRCPR; /*!< SPI CRC polynomial register (not used in I2S mode), Address offset: 0x10 */ + __IO uint32_t RXCRCR; /*!< SPI RX CRC register (not used in I2S mode), Address offset: 0x14 */ + __IO uint32_t TXCRCR; /*!< SPI TX CRC register (not used in I2S mode), Address offset: 0x18 */ + __IO uint32_t I2SCFGR; /*!< SPI_I2S configuration register, Address offset: 0x1C */ + __IO uint32_t I2SPR; /*!< SPI_I2S prescaler register, Address offset: 0x20 */ +} SPI_TypeDef; + +/** + * @brief TIM + */ + +typedef struct +{ + __IO uint32_t CR1; /*!< TIM control register 1, Address offset: 0x00 */ + __IO uint32_t CR2; /*!< TIM control register 2, Address offset: 0x04 */ + __IO uint32_t SMCR; /*!< TIM slave mode control register, Address offset: 0x08 */ + __IO uint32_t DIER; /*!< TIM DMA/interrupt enable register, Address offset: 0x0C */ + __IO uint32_t SR; /*!< TIM status register, Address offset: 0x10 */ + __IO uint32_t EGR; /*!< TIM event generation register, Address offset: 0x14 */ + __IO uint32_t CCMR1; /*!< TIM capture/compare mode register 1, Address offset: 0x18 */ + __IO uint32_t CCMR2; /*!< TIM capture/compare mode register 2, Address offset: 0x1C */ + __IO uint32_t CCER; /*!< TIM capture/compare enable register, Address offset: 0x20 */ + __IO uint32_t CNT; /*!< TIM counter register, Address offset: 0x24 */ + __IO uint32_t PSC; /*!< TIM prescaler, Address offset: 0x28 */ + __IO uint32_t ARR; /*!< TIM auto-reload register, Address offset: 0x2C */ + __IO uint32_t RCR; /*!< TIM repetition counter register, Address offset: 0x30 */ + __IO uint32_t CCR1; /*!< TIM capture/compare register 1, Address offset: 0x34 */ + __IO uint32_t CCR2; /*!< TIM capture/compare register 2, Address offset: 0x38 */ + __IO uint32_t CCR3; /*!< TIM capture/compare register 3, Address offset: 0x3C */ + __IO uint32_t CCR4; /*!< TIM capture/compare register 4, Address offset: 0x40 */ + __IO uint32_t BDTR; /*!< TIM break and dead-time register, Address offset: 0x44 */ + __IO uint32_t DCR; /*!< TIM DMA control register, Address offset: 0x48 */ + __IO uint32_t DMAR; /*!< TIM DMA address for full transfer, Address offset: 0x4C */ + __IO uint32_t OR; /*!< TIM option register, Address offset: 0x50 */ +} TIM_TypeDef; + +/** + * @brief Universal Synchronous Asynchronous Receiver Transmitter + */ + +typedef struct +{ + __IO uint32_t SR; /*!< USART Status register, Address offset: 0x00 */ + __IO uint32_t DR; /*!< USART Data register, Address offset: 0x04 */ + __IO uint32_t BRR; /*!< USART Baud rate register, Address offset: 0x08 */ + __IO uint32_t CR1; /*!< USART Control register 1, Address offset: 0x0C */ + __IO uint32_t CR2; /*!< USART Control register 2, Address offset: 0x10 */ + __IO uint32_t CR3; /*!< USART Control register 3, Address offset: 0x14 */ + __IO uint32_t GTPR; /*!< USART Guard time and prescaler register, Address offset: 0x18 */ +} USART_TypeDef; + +/** + * @brief Window WATCHDOG + */ + +typedef struct +{ + __IO uint32_t CR; /*!< WWDG Control register, Address offset: 0x00 */ + __IO uint32_t CFR; /*!< WWDG Configuration register, Address offset: 0x04 */ + __IO uint32_t SR; /*!< WWDG Status register, Address offset: 0x08 */ +} WWDG_TypeDef; + +/** + * @brief RNG + */ + +typedef struct +{ + __IO uint32_t CR; /*!< RNG control register, Address offset: 0x00 */ + __IO uint32_t SR; /*!< RNG status register, Address offset: 0x04 */ + __IO uint32_t DR; /*!< RNG data register, Address offset: 0x08 */ +} RNG_TypeDef; + + + +/** + * @brief __USB_OTG_Core_register + */ +typedef struct +{ + __IO uint32_t GOTGCTL; /*!< USB_OTG Control and Status Register Address offset : 0x00 */ + __IO uint32_t GOTGINT; /*!< USB_OTG Interrupt Register Address offset : 0x04 */ + __IO uint32_t GAHBCFG; /*!< Core AHB Configuration Register Address offset : 0x08 */ + __IO uint32_t GUSBCFG; /*!< Core USB Configuration Register Address offset : 0x0C */ + __IO uint32_t GRSTCTL; /*!< Core Reset Register Address offset : 0x10 */ + __IO uint32_t GINTSTS; /*!< Core Interrupt Register Address offset : 0x14 */ + __IO uint32_t GINTMSK; /*!< Core Interrupt Mask Register Address offset : 0x18 */ + __IO uint32_t GRXSTSR; /*!< Receive Sts Q Read Register Address offset : 0x1C */ + __IO uint32_t GRXSTSP; /*!< Receive Sts Q Read & POP Register Address offset : 0x20 */ + __IO uint32_t GRXFSIZ; /* Receive FIFO Size Register Address offset : 0x24 */ + __IO uint32_t DIEPTXF0_HNPTXFSIZ; /*!< EP0 / Non Periodic Tx FIFO Size Register Address offset : 0x28 */ + __IO uint32_t HNPTXSTS; /*!< Non Periodic Tx FIFO/Queue Sts reg Address offset : 0x2C */ + uint32_t Reserved30[2]; /* Reserved Address offset : 0x30 */ + __IO uint32_t GCCFG; /*!< General Purpose IO Register Address offset : 0x38 */ + __IO uint32_t CID; /*!< User ID Register Address offset : 0x3C */ + uint32_t Reserved40[48]; /*!< Reserved Address offset : 0x40-0xFF */ + __IO uint32_t HPTXFSIZ; /*!< Host Periodic Tx FIFO Size Reg Address offset : 0x100 */ + __IO uint32_t DIEPTXF[0x0F]; /*!< dev Periodic Transmit FIFO */ +} +USB_OTG_GlobalTypeDef; + + + +/** + * @brief __device_Registers + */ +typedef struct +{ + __IO uint32_t DCFG; /*!< dev Configuration Register Address offset : 0x800 */ + __IO uint32_t DCTL; /*!< dev Control Register Address offset : 0x804 */ + __IO uint32_t DSTS; /*!< dev Status Register (RO) Address offset : 0x808 */ + uint32_t Reserved0C; /*!< Reserved Address offset : 0x80C */ + __IO uint32_t DIEPMSK; /*!< dev IN Endpoint Mask Address offset : 0x810 */ + __IO uint32_t DOEPMSK; /*!< dev OUT Endpoint Mask Address offset : 0x814 */ + __IO uint32_t DAINT; /*!< dev All Endpoints Itr Reg Address offset : 0x818 */ + __IO uint32_t DAINTMSK; /*!< dev All Endpoints Itr Mask Address offset : 0x81C */ + uint32_t Reserved20; /*!< Reserved Address offset : 0x820 */ + uint32_t Reserved9; /*!< Reserved Address offset : 0x824 */ + __IO uint32_t DVBUSDIS; /*!< dev VBUS discharge Register Address offset : 0x828 */ + __IO uint32_t DVBUSPULSE; /*!< dev VBUS Pulse Register Address offset : 0x82C */ + __IO uint32_t DTHRCTL; /*!< dev thr Address offset : 0x830 */ + __IO uint32_t DIEPEMPMSK; /*!< dev empty msk Address offset : 0x834 */ + __IO uint32_t DEACHINT; /*!< dedicated EP interrupt Address offset : 0x838 */ + __IO uint32_t DEACHMSK; /*!< dedicated EP msk Address offset : 0x83C */ + uint32_t Reserved40; /*!< dedicated EP mask Address offset : 0x840 */ + __IO uint32_t DINEP1MSK; /*!< dedicated EP mask Address offset : 0x844 */ + uint32_t Reserved44[15]; /*!< Reserved Address offset : 0x844-0x87C */ + __IO uint32_t DOUTEP1MSK; /*!< dedicated EP msk Address offset : 0x884 */ +} +USB_OTG_DeviceTypeDef; + + +/** + * @brief __IN_Endpoint-Specific_Register + */ +typedef struct +{ + __IO uint32_t DIEPCTL; /* dev IN Endpoint Control Reg 900h + (ep_num * 20h) + 00h */ + uint32_t Reserved04; /* Reserved 900h + (ep_num * 20h) + 04h */ + __IO uint32_t DIEPINT; /* dev IN Endpoint Itr Reg 900h + (ep_num * 20h) + 08h */ + uint32_t Reserved0C; /* Reserved 900h + (ep_num * 20h) + 0Ch */ + __IO uint32_t DIEPTSIZ; /* IN Endpoint Txfer Size 900h + (ep_num * 20h) + 10h */ + __IO uint32_t DIEPDMA; /* IN Endpoint DMA Address Reg 900h + (ep_num * 20h) + 14h */ + __IO uint32_t DTXFSTS; /* IN Endpoint Tx FIFO Status Reg 900h + (ep_num * 20h) + 18h */ + uint32_t Reserved18; /* Reserved 900h+(ep_num*20h)+1Ch-900h+ (ep_num * 20h) + 1Ch */ +} +USB_OTG_INEndpointTypeDef; + + +/** + * @brief __OUT_Endpoint-Specific_Registers + */ +typedef struct +{ + __IO uint32_t DOEPCTL; /* dev OUT Endpoint Control Reg B00h + (ep_num * 20h) + 00h*/ + uint32_t Reserved04; /* Reserved B00h + (ep_num * 20h) + 04h*/ + __IO uint32_t DOEPINT; /* dev OUT Endpoint Itr Reg B00h + (ep_num * 20h) + 08h*/ + uint32_t Reserved0C; /* Reserved B00h + (ep_num * 20h) + 0Ch*/ + __IO uint32_t DOEPTSIZ; /* dev OUT Endpoint Txfer Size B00h + (ep_num * 20h) + 10h*/ + __IO uint32_t DOEPDMA; /* dev OUT Endpoint DMA Address B00h + (ep_num * 20h) + 14h*/ + uint32_t Reserved18[2]; /* Reserved B00h + (ep_num * 20h) + 18h - B00h + (ep_num * 20h) + 1Ch*/ +} +USB_OTG_OUTEndpointTypeDef; + + +/** + * @brief __Host_Mode_Register_Structures + */ +typedef struct +{ + __IO uint32_t HCFG; /* Host Configuration Register 400h*/ + __IO uint32_t HFIR; /* Host Frame Interval Register 404h*/ + __IO uint32_t HFNUM; /* Host Frame Nbr/Frame Remaining 408h*/ + uint32_t Reserved40C; /* Reserved 40Ch*/ + __IO uint32_t HPTXSTS; /* Host Periodic Tx FIFO/ Queue Status 410h*/ + __IO uint32_t HAINT; /* Host All Channels Interrupt Register 414h*/ + __IO uint32_t HAINTMSK; /* Host All Channels Interrupt Mask 418h*/ +} +USB_OTG_HostTypeDef; + + +/** + * @brief __Host_Channel_Specific_Registers + */ +typedef struct +{ + __IO uint32_t HCCHAR; + __IO uint32_t HCSPLT; + __IO uint32_t HCINT; + __IO uint32_t HCINTMSK; + __IO uint32_t HCTSIZ; + __IO uint32_t HCDMA; + uint32_t Reserved[2]; +} +USB_OTG_HostChannelTypeDef; + + +/** + * @brief Peripheral_memory_map + */ +#define FLASH_BASE 0x08000000UL /*!< FLASH(up to 1 MB) base address in the alias region */ +#define SRAM1_BASE 0x20000000UL /*!< SRAM1(112 KB) base address in the alias region */ +#define SRAM2_BASE 0x2001C000UL /*!< SRAM2(16 KB) base address in the alias region */ +#define PERIPH_BASE 0x40000000UL /*!< Peripheral base address in the alias region */ +#define BKPSRAM_BASE 0x40024000UL /*!< Backup SRAM(4 KB) base address in the alias region */ +#define FSMC_R_BASE 0xA0000000UL /*!< FSMC registers base address */ +#define SRAM1_BB_BASE 0x22000000UL /*!< SRAM1(112 KB) base address in the bit-band region */ +#define SRAM2_BB_BASE 0x22380000UL /*!< SRAM2(16 KB) base address in the bit-band region */ +#define PERIPH_BB_BASE 0x42000000UL /*!< Peripheral base address in the bit-band region */ +#define BKPSRAM_BB_BASE 0x42480000UL /*!< Backup SRAM(4 KB) base address in the bit-band region */ +#define FLASH_END 0x080FFFFFUL /*!< FLASH end address */ +#define FLASH_OTP_BASE 0x1FFF7800UL /*!< Base address of : (up to 528 Bytes) embedded FLASH OTP Area */ +#define FLASH_OTP_END 0x1FFF7A0FUL /*!< End address of : (up to 528 Bytes) embedded FLASH OTP Area */ + +/* Legacy defines */ +#define SRAM_BASE SRAM1_BASE +#define SRAM_BB_BASE SRAM1_BB_BASE + + +/*!< Peripheral memory map */ +#define APB1PERIPH_BASE PERIPH_BASE +#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000UL) +#define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000UL) +#define AHB2PERIPH_BASE (PERIPH_BASE + 0x10000000UL) + +/*!< APB1 peripherals */ +#define TIM2_BASE (APB1PERIPH_BASE + 0x0000UL) +#define TIM3_BASE (APB1PERIPH_BASE + 0x0400UL) +#define TIM4_BASE (APB1PERIPH_BASE + 0x0800UL) +#define TIM5_BASE (APB1PERIPH_BASE + 0x0C00UL) +#define TIM6_BASE (APB1PERIPH_BASE + 0x1000UL) +#define TIM7_BASE (APB1PERIPH_BASE + 0x1400UL) +#define TIM12_BASE (APB1PERIPH_BASE + 0x1800UL) +#define TIM13_BASE (APB1PERIPH_BASE + 0x1C00UL) +#define TIM14_BASE (APB1PERIPH_BASE + 0x2000UL) +#define RTC_BASE (APB1PERIPH_BASE + 0x2800UL) +#define WWDG_BASE (APB1PERIPH_BASE + 0x2C00UL) +#define IWDG_BASE (APB1PERIPH_BASE + 0x3000UL) +#define SPI2_BASE (APB1PERIPH_BASE + 0x3800UL) +#define SPI3_BASE (APB1PERIPH_BASE + 0x3C00UL) +#define USART2_BASE (APB1PERIPH_BASE + 0x4400UL) +#define USART3_BASE (APB1PERIPH_BASE + 0x4800UL) +#define UART4_BASE (APB1PERIPH_BASE + 0x4C00UL) +#define UART5_BASE (APB1PERIPH_BASE + 0x5000UL) +#define I2C1_BASE (APB1PERIPH_BASE + 0x5400UL) +#define I2C2_BASE (APB1PERIPH_BASE + 0x5800UL) +#define I2C3_BASE (APB1PERIPH_BASE + 0x5C00UL) +#define CAN1_BASE (APB1PERIPH_BASE + 0x6400UL) +#define CAN2_BASE (APB1PERIPH_BASE + 0x6800UL) +#define PWR_BASE (APB1PERIPH_BASE + 0x7000UL) +#define DAC_BASE (APB1PERIPH_BASE + 0x7400UL) + +/*!< APB2 peripherals */ +#define TIM1_BASE (APB2PERIPH_BASE + 0x0000UL) +#define TIM8_BASE (APB2PERIPH_BASE + 0x0400UL) +#define USART1_BASE (APB2PERIPH_BASE + 0x1000UL) +#define USART6_BASE (APB2PERIPH_BASE + 0x1400UL) +#define ADC1_BASE (APB2PERIPH_BASE + 0x2000UL) +#define ADC2_BASE (APB2PERIPH_BASE + 0x2100UL) +#define ADC3_BASE (APB2PERIPH_BASE + 0x2200UL) +#define ADC123_COMMON_BASE (APB2PERIPH_BASE + 0x2300UL) +/* Legacy define */ +#define ADC_BASE ADC123_COMMON_BASE + +#define SDIO_BASE (APB2PERIPH_BASE + 0x2C00UL) +#define SPI1_BASE (APB2PERIPH_BASE + 0x3000UL) +#define SYSCFG_BASE (APB2PERIPH_BASE + 0x3800UL) +#define EXTI_BASE (APB2PERIPH_BASE + 0x3C00UL) +#define TIM9_BASE (APB2PERIPH_BASE + 0x4000UL) +#define TIM10_BASE (APB2PERIPH_BASE + 0x4400UL) +#define TIM11_BASE (APB2PERIPH_BASE + 0x4800UL) + +/*!< AHB1 peripherals */ +#define GPIOA_BASE (AHB1PERIPH_BASE + 0x0000UL) +#define GPIOB_BASE (AHB1PERIPH_BASE + 0x0400UL) +#define GPIOC_BASE (AHB1PERIPH_BASE + 0x0800UL) +#define GPIOD_BASE (AHB1PERIPH_BASE + 0x0C00UL) +#define GPIOE_BASE (AHB1PERIPH_BASE + 0x1000UL) +#define GPIOF_BASE (AHB1PERIPH_BASE + 0x1400UL) +#define GPIOG_BASE (AHB1PERIPH_BASE + 0x1800UL) +#define GPIOH_BASE (AHB1PERIPH_BASE + 0x1C00UL) +#define GPIOI_BASE (AHB1PERIPH_BASE + 0x2000UL) +#define CRC_BASE (AHB1PERIPH_BASE + 0x3000UL) +#define RCC_BASE (AHB1PERIPH_BASE + 0x3800UL) +#define FLASH_R_BASE (AHB1PERIPH_BASE + 0x3C00UL) +#define DMA1_BASE (AHB1PERIPH_BASE + 0x6000UL) +#define DMA1_Stream0_BASE (DMA1_BASE + 0x010UL) +#define DMA1_Stream1_BASE (DMA1_BASE + 0x028UL) +#define DMA1_Stream2_BASE (DMA1_BASE + 0x040UL) +#define DMA1_Stream3_BASE (DMA1_BASE + 0x058UL) +#define DMA1_Stream4_BASE (DMA1_BASE + 0x070UL) +#define DMA1_Stream5_BASE (DMA1_BASE + 0x088UL) +#define DMA1_Stream6_BASE (DMA1_BASE + 0x0A0UL) +#define DMA1_Stream7_BASE (DMA1_BASE + 0x0B8UL) +#define DMA2_BASE (AHB1PERIPH_BASE + 0x6400UL) +#define DMA2_Stream0_BASE (DMA2_BASE + 0x010UL) +#define DMA2_Stream1_BASE (DMA2_BASE + 0x028UL) +#define DMA2_Stream2_BASE (DMA2_BASE + 0x040UL) +#define DMA2_Stream3_BASE (DMA2_BASE + 0x058UL) +#define DMA2_Stream4_BASE (DMA2_BASE + 0x070UL) +#define DMA2_Stream5_BASE (DMA2_BASE + 0x088UL) +#define DMA2_Stream6_BASE (DMA2_BASE + 0x0A0UL) +#define DMA2_Stream7_BASE (DMA2_BASE + 0x0B8UL) + +/*!< AHB2 peripherals */ +#define RNG_BASE (AHB2PERIPH_BASE + 0x60800UL) + +/*!< FSMC Bankx registers base address */ +#define FSMC_Bank1_R_BASE (FSMC_R_BASE + 0x0000UL) +#define FSMC_Bank1E_R_BASE (FSMC_R_BASE + 0x0104UL) +#define FSMC_Bank2_3_R_BASE (FSMC_R_BASE + 0x0060UL) +#define FSMC_Bank4_R_BASE (FSMC_R_BASE + 0x00A0UL) + +/* Debug MCU registers base address */ +#define DBGMCU_BASE 0xE0042000UL + +/*!< USB registers base address */ +#define USB_OTG_HS_PERIPH_BASE 0x40040000UL +#define USB_OTG_FS_PERIPH_BASE 0x50000000UL + +#define USB_OTG_GLOBAL_BASE 0x000UL +#define USB_OTG_DEVICE_BASE 0x800UL +#define USB_OTG_IN_ENDPOINT_BASE 0x900UL +#define USB_OTG_OUT_ENDPOINT_BASE 0xB00UL +#define USB_OTG_EP_REG_SIZE 0x20UL +#define USB_OTG_HOST_BASE 0x400UL +#define USB_OTG_HOST_PORT_BASE 0x440UL +#define USB_OTG_HOST_CHANNEL_BASE 0x500UL +#define USB_OTG_HOST_CHANNEL_SIZE 0x20UL +#define USB_OTG_PCGCCTL_BASE 0xE00UL +#define USB_OTG_FIFO_BASE 0x1000UL +#define USB_OTG_FIFO_SIZE 0x1000UL + +/******************* Device electronic signature ***************/ +#define UID_BASE 0x1FFF7A10UL /*!< Unique device ID register base address */ +#define FLASHSIZE_BASE 0x1FFF7A22UL /*!< FLASH Size register base address */ + +/** + * @} + */ + +/** @addtogroup Peripheral_declaration + * @{ + */ +#define TIM2 ((TIM_TypeDef *) TIM2_BASE) +#define TIM3 ((TIM_TypeDef *) TIM3_BASE) +#define TIM4 ((TIM_TypeDef *) TIM4_BASE) +#define TIM5 ((TIM_TypeDef *) TIM5_BASE) +#define TIM6 ((TIM_TypeDef *) TIM6_BASE) +#define TIM7 ((TIM_TypeDef *) TIM7_BASE) +#define TIM12 ((TIM_TypeDef *) TIM12_BASE) +#define TIM13 ((TIM_TypeDef *) TIM13_BASE) +#define TIM14 ((TIM_TypeDef *) TIM14_BASE) +#define RTC ((RTC_TypeDef *) RTC_BASE) +#define WWDG ((WWDG_TypeDef *) WWDG_BASE) +#define IWDG ((IWDG_TypeDef *) IWDG_BASE) +#define SPI2 ((SPI_TypeDef *) SPI2_BASE) +#define SPI3 ((SPI_TypeDef *) SPI3_BASE) +#define USART2 ((USART_TypeDef *) USART2_BASE) +#define USART3 ((USART_TypeDef *) USART3_BASE) +#define UART4 ((USART_TypeDef *) UART4_BASE) +#define UART5 ((USART_TypeDef *) UART5_BASE) +#define I2C1 ((I2C_TypeDef *) I2C1_BASE) +#define I2C2 ((I2C_TypeDef *) I2C2_BASE) +#define I2C3 ((I2C_TypeDef *) I2C3_BASE) +#define CAN1 ((CAN_TypeDef *) CAN1_BASE) +#define CAN2 ((CAN_TypeDef *) CAN2_BASE) +#define PWR ((PWR_TypeDef *) PWR_BASE) +#define DAC1 ((DAC_TypeDef *) DAC_BASE) +#define DAC ((DAC_TypeDef *) DAC_BASE) /* Kept for legacy purpose */ +#define TIM1 ((TIM_TypeDef *) TIM1_BASE) +#define TIM8 ((TIM_TypeDef *) TIM8_BASE) +#define USART1 ((USART_TypeDef *) USART1_BASE) +#define USART6 ((USART_TypeDef *) USART6_BASE) +#define ADC1 ((ADC_TypeDef *) ADC1_BASE) +#define ADC2 ((ADC_TypeDef *) ADC2_BASE) +#define ADC3 ((ADC_TypeDef *) ADC3_BASE) +#define ADC123_COMMON ((ADC_Common_TypeDef *) ADC123_COMMON_BASE) +/* Legacy define */ +#define ADC ADC123_COMMON +#define SDIO ((SDIO_TypeDef *) SDIO_BASE) +#define SPI1 ((SPI_TypeDef *) SPI1_BASE) +#define SYSCFG ((SYSCFG_TypeDef *) SYSCFG_BASE) +#define EXTI ((EXTI_TypeDef *) EXTI_BASE) +#define TIM9 ((TIM_TypeDef *) TIM9_BASE) +#define TIM10 ((TIM_TypeDef *) TIM10_BASE) +#define TIM11 ((TIM_TypeDef *) TIM11_BASE) +#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) +#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE) +#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE) +#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE) +#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE) +#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE) +#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE) +#define GPIOH ((GPIO_TypeDef *) GPIOH_BASE) +#define GPIOI ((GPIO_TypeDef *) GPIOI_BASE) +#define CRC ((CRC_TypeDef *) CRC_BASE) +#define RCC ((RCC_TypeDef *) RCC_BASE) +#define FLASH ((FLASH_TypeDef *) FLASH_R_BASE) +#define DMA1 ((DMA_TypeDef *) DMA1_BASE) +#define DMA1_Stream0 ((DMA_Stream_TypeDef *) DMA1_Stream0_BASE) +#define DMA1_Stream1 ((DMA_Stream_TypeDef *) DMA1_Stream1_BASE) +#define DMA1_Stream2 ((DMA_Stream_TypeDef *) DMA1_Stream2_BASE) +#define DMA1_Stream3 ((DMA_Stream_TypeDef *) DMA1_Stream3_BASE) +#define DMA1_Stream4 ((DMA_Stream_TypeDef *) DMA1_Stream4_BASE) +#define DMA1_Stream5 ((DMA_Stream_TypeDef *) DMA1_Stream5_BASE) +#define DMA1_Stream6 ((DMA_Stream_TypeDef *) DMA1_Stream6_BASE) +#define DMA1_Stream7 ((DMA_Stream_TypeDef *) DMA1_Stream7_BASE) +#define DMA2 ((DMA_TypeDef *) DMA2_BASE) +#define DMA2_Stream0 ((DMA_Stream_TypeDef *) DMA2_Stream0_BASE) +#define DMA2_Stream1 ((DMA_Stream_TypeDef *) DMA2_Stream1_BASE) +#define DMA2_Stream2 ((DMA_Stream_TypeDef *) DMA2_Stream2_BASE) +#define DMA2_Stream3 ((DMA_Stream_TypeDef *) DMA2_Stream3_BASE) +#define DMA2_Stream4 ((DMA_Stream_TypeDef *) DMA2_Stream4_BASE) +#define DMA2_Stream5 ((DMA_Stream_TypeDef *) DMA2_Stream5_BASE) +#define DMA2_Stream6 ((DMA_Stream_TypeDef *) DMA2_Stream6_BASE) +#define DMA2_Stream7 ((DMA_Stream_TypeDef *) DMA2_Stream7_BASE) +#define RNG ((RNG_TypeDef *) RNG_BASE) +#define FSMC_Bank1 ((FSMC_Bank1_TypeDef *) FSMC_Bank1_R_BASE) +#define FSMC_Bank1E ((FSMC_Bank1E_TypeDef *) FSMC_Bank1E_R_BASE) +#define FSMC_Bank2_3 ((FSMC_Bank2_3_TypeDef *) FSMC_Bank2_3_R_BASE) +#define FSMC_Bank4 ((FSMC_Bank4_TypeDef *) FSMC_Bank4_R_BASE) + +#define DBGMCU ((DBGMCU_TypeDef *) DBGMCU_BASE) + +#define USB_OTG_FS ((USB_OTG_GlobalTypeDef *) USB_OTG_FS_PERIPH_BASE) +#define USB_OTG_HS ((USB_OTG_GlobalTypeDef *) USB_OTG_HS_PERIPH_BASE) + +/** + * @} + */ + +/** @addtogroup Exported_constants + * @{ + */ + + /** @addtogroup Peripheral_Registers_Bits_Definition + * @{ + */ + +/******************************************************************************/ +/* Peripheral Registers_Bits_Definition */ +/******************************************************************************/ + +/******************************************************************************/ +/* */ +/* Analog to Digital Converter */ +/* */ +/******************************************************************************/ +/******************** Bit definition for ADC_SR register ********************/ +#define ADC_SR_AWD_Pos (0U) +#define ADC_SR_AWD_Msk (0x1UL << ADC_SR_AWD_Pos) /*!< 0x00000001 */ +#define ADC_SR_AWD ADC_SR_AWD_Msk /*!
© Copyright (c) 2017 STMicroelectronics. + * All rights reserved.
+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS_Device + * @{ + */ + +/** @addtogroup stm32f207xx + * @{ + */ + +#ifndef __STM32F207xx_H +#define __STM32F207xx_H + +#ifdef __cplusplus + extern "C" { +#endif /* __cplusplus */ + +/** @addtogroup Configuration_section_for_CMSIS + * @{ + */ + +/** + * @brief Configuration of the Cortex-M3 Processor and Core Peripherals + */ +#define __CM3_REV 0x0200U /*!< Core revision r0p1 */ +#define __MPU_PRESENT 1U /*!< STM32F2XX provides an MPU */ +#define __NVIC_PRIO_BITS 4U /*!< STM32F2XX uses 4 Bits for the Priority Levels */ +#define __Vendor_SysTickConfig 0U /*!< Set to 1 if different SysTick Config is used */ + +/** + * @} + */ + +/** @addtogroup Peripheral_interrupt_number_definition + * @{ + */ + +/** + * @brief STM32F2XX Interrupt Number Definition, according to the selected device + * in @ref Library_configuration_section + */ +typedef enum +{ +/****** Cortex-M3 Processor Exceptions Numbers ****************************************************************/ + NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ + HardFault_IRQn = -13, /*!< 3 Hard Fault Interrupt */ + MemoryManagement_IRQn = -12, /*!< 4 Cortex-M3 Memory Management Interrupt */ + BusFault_IRQn = -11, /*!< 5 Cortex-M3 Bus Fault Interrupt */ + UsageFault_IRQn = -10, /*!< 6 Cortex-M3 Usage Fault Interrupt */ + SVCall_IRQn = -5, /*!< 11 Cortex-M3 SV Call Interrupt */ + DebugMonitor_IRQn = -4, /*!< 12 Cortex-M3 Debug Monitor Interrupt */ + PendSV_IRQn = -2, /*!< 14 Cortex-M3 Pend SV Interrupt */ + SysTick_IRQn = -1, /*!< 15 Cortex-M3 System Tick Interrupt */ +/****** STM32 specific Interrupt Numbers **********************************************************************/ + WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */ + PVD_IRQn = 1, /*!< PVD through EXTI Line detection Interrupt */ + TAMP_STAMP_IRQn = 2, /*!< Tamper and TimeStamp interrupts through the EXTI line */ + RTC_WKUP_IRQn = 3, /*!< RTC Wakeup interrupt through the EXTI line */ + FLASH_IRQn = 4, /*!< FLASH global Interrupt */ + RCC_IRQn = 5, /*!< RCC global Interrupt */ + EXTI0_IRQn = 6, /*!< EXTI Line0 Interrupt */ + EXTI1_IRQn = 7, /*!< EXTI Line1 Interrupt */ + EXTI2_IRQn = 8, /*!< EXTI Line2 Interrupt */ + EXTI3_IRQn = 9, /*!< EXTI Line3 Interrupt */ + EXTI4_IRQn = 10, /*!< EXTI Line4 Interrupt */ + DMA1_Stream0_IRQn = 11, /*!< DMA1 Stream 0 global Interrupt */ + DMA1_Stream1_IRQn = 12, /*!< DMA1 Stream 1 global Interrupt */ + DMA1_Stream2_IRQn = 13, /*!< DMA1 Stream 2 global Interrupt */ + DMA1_Stream3_IRQn = 14, /*!< DMA1 Stream 3 global Interrupt */ + DMA1_Stream4_IRQn = 15, /*!< DMA1 Stream 4 global Interrupt */ + DMA1_Stream5_IRQn = 16, /*!< DMA1 Stream 5 global Interrupt */ + DMA1_Stream6_IRQn = 17, /*!< DMA1 Stream 6 global Interrupt */ + ADC_IRQn = 18, /*!< ADC1, ADC2 and ADC3 global Interrupts */ + CAN1_TX_IRQn = 19, /*!< CAN1 TX Interrupt */ + CAN1_RX0_IRQn = 20, /*!< CAN1 RX0 Interrupt */ + CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ + CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ + EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TIM1_BRK_TIM9_IRQn = 24, /*!< TIM1 Break interrupt and TIM9 global interrupt */ + TIM1_UP_TIM10_IRQn = 25, /*!< TIM1 Update Interrupt and TIM10 global interrupt */ + TIM1_TRG_COM_TIM11_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt and TIM11 global interrupt */ + TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ + TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ + TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ + TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ + I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + USART3_IRQn = 39, /*!< USART3 global Interrupt */ + EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTC_Alarm_IRQn = 41, /*!< RTC Alarm (A and B) through EXTI Line Interrupt */ + OTG_FS_WKUP_IRQn = 42, /*!< USB OTG FS Wakeup through EXTI line interrupt */ + TIM8_BRK_TIM12_IRQn = 43, /*!< TIM8 Break Interrupt and TIM12 global interrupt */ + TIM8_UP_TIM13_IRQn = 44, /*!< TIM8 Update Interrupt and TIM13 global interrupt */ + TIM8_TRG_COM_TIM14_IRQn = 45, /*!< TIM8 Trigger and Commutation Interrupt and TIM14 global interrupt */ + TIM8_CC_IRQn = 46, /*!< TIM8 Capture Compare Interrupt */ + DMA1_Stream7_IRQn = 47, /*!< DMA1 Stream7 Interrupt */ + FSMC_IRQn = 48, /*!< FSMC global Interrupt */ + SDIO_IRQn = 49, /*!< SDIO global Interrupt */ + TIM5_IRQn = 50, /*!< TIM5 global Interrupt */ + SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ + UART4_IRQn = 52, /*!< UART4 global Interrupt */ + UART5_IRQn = 53, /*!< UART5 global Interrupt */ + TIM6_DAC_IRQn = 54, /*!< TIM6 global and DAC1&2 underrun error interrupts */ + TIM7_IRQn = 55, /*!< TIM7 global interrupt */ + DMA2_Stream0_IRQn = 56, /*!< DMA2 Stream 0 global Interrupt */ + DMA2_Stream1_IRQn = 57, /*!< DMA2 Stream 1 global Interrupt */ + DMA2_Stream2_IRQn = 58, /*!< DMA2 Stream 2 global Interrupt */ + DMA2_Stream3_IRQn = 59, /*!< DMA2 Stream 3 global Interrupt */ + DMA2_Stream4_IRQn = 60, /*!< DMA2 Stream 4 global Interrupt */ + ETH_IRQn = 61, /*!< Ethernet global Interrupt */ + ETH_WKUP_IRQn = 62, /*!< Ethernet Wakeup through EXTI line Interrupt */ + CAN2_TX_IRQn = 63, /*!< CAN2 TX Interrupt */ + CAN2_RX0_IRQn = 64, /*!< CAN2 RX0 Interrupt */ + CAN2_RX1_IRQn = 65, /*!< CAN2 RX1 Interrupt */ + CAN2_SCE_IRQn = 66, /*!< CAN2 SCE Interrupt */ + OTG_FS_IRQn = 67, /*!< USB OTG FS global Interrupt */ + DMA2_Stream5_IRQn = 68, /*!< DMA2 Stream 5 global interrupt */ + DMA2_Stream6_IRQn = 69, /*!< DMA2 Stream 6 global interrupt */ + DMA2_Stream7_IRQn = 70, /*!< DMA2 Stream 7 global interrupt */ + USART6_IRQn = 71, /*!< USART6 global interrupt */ + I2C3_EV_IRQn = 72, /*!< I2C3 event interrupt */ + I2C3_ER_IRQn = 73, /*!< I2C3 error interrupt */ + OTG_HS_EP1_OUT_IRQn = 74, /*!< USB OTG HS End Point 1 Out global interrupt */ + OTG_HS_EP1_IN_IRQn = 75, /*!< USB OTG HS End Point 1 In global interrupt */ + OTG_HS_WKUP_IRQn = 76, /*!< USB OTG HS Wakeup through EXTI interrupt */ + OTG_HS_IRQn = 77, /*!< USB OTG HS global interrupt */ + DCMI_IRQn = 78, /*!< DCMI global interrupt */ + RNG_IRQn = 80 /*!< Rng global interrupt */ +} IRQn_Type; + +/** + * @} + */ + +#include "core_cm3.h" +#include "system_stm32f2xx.h" +#include + +/** @addtogroup Peripheral_registers_structures + * @{ + */ + +/** + * @brief Analog to Digital Converter + */ + +typedef struct +{ + __IO uint32_t SR; /*!< ADC status register, Address offset: 0x00 */ + __IO uint32_t CR1; /*!< ADC control register 1, Address offset: 0x04 */ + __IO uint32_t CR2; /*!< ADC control register 2, Address offset: 0x08 */ + __IO uint32_t SMPR1; /*!< ADC sample time register 1, Address offset: 0x0C */ + __IO uint32_t SMPR2; /*!< ADC sample time register 2, Address offset: 0x10 */ + __IO uint32_t JOFR1; /*!< ADC injected channel data offset register 1, Address offset: 0x14 */ + __IO uint32_t JOFR2; /*!< ADC injected channel data offset register 2, Address offset: 0x18 */ + __IO uint32_t JOFR3; /*!< ADC injected channel data offset register 3, Address offset: 0x1C */ + __IO uint32_t JOFR4; /*!< ADC injected channel data offset register 4, Address offset: 0x20 */ + __IO uint32_t HTR; /*!< ADC watchdog higher threshold register, Address offset: 0x24 */ + __IO uint32_t LTR; /*!< ADC watchdog lower threshold register, Address offset: 0x28 */ + __IO uint32_t SQR1; /*!< ADC regular sequence register 1, Address offset: 0x2C */ + __IO uint32_t SQR2; /*!< ADC regular sequence register 2, Address offset: 0x30 */ + __IO uint32_t SQR3; /*!< ADC regular sequence register 3, Address offset: 0x34 */ + __IO uint32_t JSQR; /*!< ADC injected sequence register, Address offset: 0x38*/ + __IO uint32_t JDR1; /*!< ADC injected data register 1, Address offset: 0x3C */ + __IO uint32_t JDR2; /*!< ADC injected data register 2, Address offset: 0x40 */ + __IO uint32_t JDR3; /*!< ADC injected data register 3, Address offset: 0x44 */ + __IO uint32_t JDR4; /*!< ADC injected data register 4, Address offset: 0x48 */ + __IO uint32_t DR; /*!< ADC regular data register, Address offset: 0x4C */ +} ADC_TypeDef; + +typedef struct +{ + __IO uint32_t CSR; /*!< ADC Common status register, Address offset: ADC1 base address + 0x300 */ + __IO uint32_t CCR; /*!< ADC common control register, Address offset: ADC1 base address + 0x304 */ + __IO uint32_t CDR; /*!< ADC common regular data register for dual + AND triple modes, Address offset: ADC1 base address + 0x308 */ +} ADC_Common_TypeDef; + + +/** + * @brief Controller Area Network TxMailBox + */ + +typedef struct +{ + __IO uint32_t TIR; /*!< CAN TX mailbox identifier register */ + __IO uint32_t TDTR; /*!< CAN mailbox data length control and time stamp register */ + __IO uint32_t TDLR; /*!< CAN mailbox data low register */ + __IO uint32_t TDHR; /*!< CAN mailbox data high register */ +} CAN_TxMailBox_TypeDef; + +/** + * @brief Controller Area Network FIFOMailBox + */ + +typedef struct +{ + __IO uint32_t RIR; /*!< CAN receive FIFO mailbox identifier register */ + __IO uint32_t RDTR; /*!< CAN receive FIFO mailbox data length control and time stamp register */ + __IO uint32_t RDLR; /*!< CAN receive FIFO mailbox data low register */ + __IO uint32_t RDHR; /*!< CAN receive FIFO mailbox data high register */ +} CAN_FIFOMailBox_TypeDef; + +/** + * @brief Controller Area Network FilterRegister + */ + +typedef struct +{ + __IO uint32_t FR1; /*!< CAN Filter bank register 1 */ + __IO uint32_t FR2; /*!< CAN Filter bank register 1 */ +} CAN_FilterRegister_TypeDef; + +/** + * @brief Controller Area Network + */ + +typedef struct +{ + __IO uint32_t MCR; /*!< CAN master control register, Address offset: 0x00 */ + __IO uint32_t MSR; /*!< CAN master status register, Address offset: 0x04 */ + __IO uint32_t TSR; /*!< CAN transmit status register, Address offset: 0x08 */ + __IO uint32_t RF0R; /*!< CAN receive FIFO 0 register, Address offset: 0x0C */ + __IO uint32_t RF1R; /*!< CAN receive FIFO 1 register, Address offset: 0x10 */ + __IO uint32_t IER; /*!< CAN interrupt enable register, Address offset: 0x14 */ + __IO uint32_t ESR; /*!< CAN error status register, Address offset: 0x18 */ + __IO uint32_t BTR; /*!< CAN bit timing register, Address offset: 0x1C */ + uint32_t RESERVED0[88]; /*!< Reserved, 0x020 - 0x17F */ + CAN_TxMailBox_TypeDef sTxMailBox[3]; /*!< CAN Tx MailBox, Address offset: 0x180 - 0x1AC */ + CAN_FIFOMailBox_TypeDef sFIFOMailBox[2]; /*!< CAN FIFO MailBox, Address offset: 0x1B0 - 0x1CC */ + uint32_t RESERVED1[12]; /*!< Reserved, 0x1D0 - 0x1FF */ + __IO uint32_t FMR; /*!< CAN filter master register, Address offset: 0x200 */ + __IO uint32_t FM1R; /*!< CAN filter mode register, Address offset: 0x204 */ + uint32_t RESERVED2; /*!< Reserved, 0x208 */ + __IO uint32_t FS1R; /*!< CAN filter scale register, Address offset: 0x20C */ + uint32_t RESERVED3; /*!< Reserved, 0x210 */ + __IO uint32_t FFA1R; /*!< CAN filter FIFO assignment register, Address offset: 0x214 */ + uint32_t RESERVED4; /*!< Reserved, 0x218 */ + __IO uint32_t FA1R; /*!< CAN filter activation register, Address offset: 0x21C */ + uint32_t RESERVED5[8]; /*!< Reserved, 0x220-0x23F */ + CAN_FilterRegister_TypeDef sFilterRegister[28]; /*!< CAN Filter Register, Address offset: 0x240-0x31C */ +} CAN_TypeDef; + +/** + * @brief CRC calculation unit + */ + +typedef struct +{ + __IO uint32_t DR; /*!< CRC Data register, Address offset: 0x00 */ + __IO uint8_t IDR; /*!< CRC Independent data register, Address offset: 0x04 */ + uint8_t RESERVED0; /*!< Reserved, 0x05 */ + uint16_t RESERVED1; /*!< Reserved, 0x06 */ + __IO uint32_t CR; /*!< CRC Control register, Address offset: 0x08 */ +} CRC_TypeDef; + +/** + * @brief Digital to Analog Converter + */ + +typedef struct +{ + __IO uint32_t CR; /*!< DAC control register, Address offset: 0x00 */ + __IO uint32_t SWTRIGR; /*!< DAC software trigger register, Address offset: 0x04 */ + __IO uint32_t DHR12R1; /*!< DAC channel1 12-bit right-aligned data holding register, Address offset: 0x08 */ + __IO uint32_t DHR12L1; /*!< DAC channel1 12-bit left aligned data holding register, Address offset: 0x0C */ + __IO uint32_t DHR8R1; /*!< DAC channel1 8-bit right aligned data holding register, Address offset: 0x10 */ + __IO uint32_t DHR12R2; /*!< DAC channel2 12-bit right aligned data holding register, Address offset: 0x14 */ + __IO uint32_t DHR12L2; /*!< DAC channel2 12-bit left aligned data holding register, Address offset: 0x18 */ + __IO uint32_t DHR8R2; /*!< DAC channel2 8-bit right-aligned data holding register, Address offset: 0x1C */ + __IO uint32_t DHR12RD; /*!< Dual DAC 12-bit right-aligned data holding register, Address offset: 0x20 */ + __IO uint32_t DHR12LD; /*!< DUAL DAC 12-bit left aligned data holding register, Address offset: 0x24 */ + __IO uint32_t DHR8RD; /*!< DUAL DAC 8-bit right aligned data holding register, Address offset: 0x28 */ + __IO uint32_t DOR1; /*!< DAC channel1 data output register, Address offset: 0x2C */ + __IO uint32_t DOR2; /*!< DAC channel2 data output register, Address offset: 0x30 */ + __IO uint32_t SR; /*!< DAC status register, Address offset: 0x34 */ +} DAC_TypeDef; + +/** + * @brief Debug MCU + */ + +typedef struct +{ + __IO uint32_t IDCODE; /*!< MCU device ID code, Address offset: 0x00 */ + __IO uint32_t CR; /*!< Debug MCU configuration register, Address offset: 0x04 */ + __IO uint32_t APB1FZ; /*!< Debug MCU APB1 freeze register, Address offset: 0x08 */ + __IO uint32_t APB2FZ; /*!< Debug MCU APB2 freeze register, Address offset: 0x0C */ +}DBGMCU_TypeDef; + +/** + * @brief DCMI + */ + +typedef struct +{ + __IO uint32_t CR; /*!< DCMI control register 1, Address offset: 0x00 */ + __IO uint32_t SR; /*!< DCMI status register, Address offset: 0x04 */ + __IO uint32_t RISR; /*!< DCMI raw interrupt status register, Address offset: 0x08 */ + __IO uint32_t IER; /*!< DCMI interrupt enable register, Address offset: 0x0C */ + __IO uint32_t MISR; /*!< DCMI masked interrupt status register, Address offset: 0x10 */ + __IO uint32_t ICR; /*!< DCMI interrupt clear register, Address offset: 0x14 */ + __IO uint32_t ESCR; /*!< DCMI embedded synchronization code register, Address offset: 0x18 */ + __IO uint32_t ESUR; /*!< DCMI embedded synchronization unmask register, Address offset: 0x1C */ + __IO uint32_t CWSTRTR; /*!< DCMI crop window start, Address offset: 0x20 */ + __IO uint32_t CWSIZER; /*!< DCMI crop window size, Address offset: 0x24 */ + __IO uint32_t DR; /*!< DCMI data register, Address offset: 0x28 */ +} DCMI_TypeDef; + +/** + * @brief DMA Controller + */ + +typedef struct +{ + __IO uint32_t CR; /*!< DMA stream x configuration register */ + __IO uint32_t NDTR; /*!< DMA stream x number of data register */ + __IO uint32_t PAR; /*!< DMA stream x peripheral address register */ + __IO uint32_t M0AR; /*!< DMA stream x memory 0 address register */ + __IO uint32_t M1AR; /*!< DMA stream x memory 1 address register */ + __IO uint32_t FCR; /*!< DMA stream x FIFO control register */ +} DMA_Stream_TypeDef; + +typedef struct +{ + __IO uint32_t LISR; /*!< DMA low interrupt status register, Address offset: 0x00 */ + __IO uint32_t HISR; /*!< DMA high interrupt status register, Address offset: 0x04 */ + __IO uint32_t LIFCR; /*!< DMA low interrupt flag clear register, Address offset: 0x08 */ + __IO uint32_t HIFCR; /*!< DMA high interrupt flag clear register, Address offset: 0x0C */ +} DMA_TypeDef; + + +/** + * @brief Ethernet MAC + */ + +typedef struct +{ + __IO uint32_t MACCR; + __IO uint32_t MACFFR; + __IO uint32_t MACHTHR; + __IO uint32_t MACHTLR; + __IO uint32_t MACMIIAR; + __IO uint32_t MACMIIDR; + __IO uint32_t MACFCR; + __IO uint32_t MACVLANTR; /* 8 */ + uint32_t RESERVED0[2]; + __IO uint32_t MACRWUFFR; /* 11 */ + __IO uint32_t MACPMTCSR; + uint32_t RESERVED1; + __IO uint32_t MACDBGR; + __IO uint32_t MACSR; /* 15 */ + __IO uint32_t MACIMR; + __IO uint32_t MACA0HR; + __IO uint32_t MACA0LR; + __IO uint32_t MACA1HR; + __IO uint32_t MACA1LR; + __IO uint32_t MACA2HR; + __IO uint32_t MACA2LR; + __IO uint32_t MACA3HR; + __IO uint32_t MACA3LR; /* 24 */ + uint32_t RESERVED2[40]; + __IO uint32_t MMCCR; /* 65 */ + __IO uint32_t MMCRIR; + __IO uint32_t MMCTIR; + __IO uint32_t MMCRIMR; + __IO uint32_t MMCTIMR; /* 69 */ + uint32_t RESERVED3[14]; + __IO uint32_t MMCTGFSCCR; /* 84 */ + __IO uint32_t MMCTGFMSCCR; + uint32_t RESERVED4[5]; + __IO uint32_t MMCTGFCR; + uint32_t RESERVED5[10]; + __IO uint32_t MMCRFCECR; + __IO uint32_t MMCRFAECR; + uint32_t RESERVED6[10]; + __IO uint32_t MMCRGUFCR; + uint32_t RESERVED7[334]; + __IO uint32_t PTPTSCR; + __IO uint32_t PTPSSIR; + __IO uint32_t PTPTSHR; + __IO uint32_t PTPTSLR; + __IO uint32_t PTPTSHUR; + __IO uint32_t PTPTSLUR; + __IO uint32_t PTPTSAR; + __IO uint32_t PTPTTHR; + __IO uint32_t PTPTTLR; + __IO uint32_t RESERVED8; + __IO uint32_t PTPTSSR; + uint32_t RESERVED9[565]; + __IO uint32_t DMABMR; + __IO uint32_t DMATPDR; + __IO uint32_t DMARPDR; + __IO uint32_t DMARDLAR; + __IO uint32_t DMATDLAR; + __IO uint32_t DMASR; + __IO uint32_t DMAOMR; + __IO uint32_t DMAIER; + __IO uint32_t DMAMFBOCR; + __IO uint32_t DMARSWTR; + uint32_t RESERVED10[8]; + __IO uint32_t DMACHTDR; + __IO uint32_t DMACHRDR; + __IO uint32_t DMACHTBAR; + __IO uint32_t DMACHRBAR; +} ETH_TypeDef; + +/** + * @brief External Interrupt/Event Controller + */ + +typedef struct +{ + __IO uint32_t IMR; /*!< EXTI Interrupt mask register, Address offset: 0x00 */ + __IO uint32_t EMR; /*!< EXTI Event mask register, Address offset: 0x04 */ + __IO uint32_t RTSR; /*!< EXTI Rising trigger selection register, Address offset: 0x08 */ + __IO uint32_t FTSR; /*!< EXTI Falling trigger selection register, Address offset: 0x0C */ + __IO uint32_t SWIER; /*!< EXTI Software interrupt event register, Address offset: 0x10 */ + __IO uint32_t PR; /*!< EXTI Pending register, Address offset: 0x14 */ +} EXTI_TypeDef; + +/** + * @brief FLASH Registers + */ + +typedef struct +{ + __IO uint32_t ACR; /*!< FLASH access control register, Address offset: 0x00 */ + __IO uint32_t KEYR; /*!< FLASH key register, Address offset: 0x04 */ + __IO uint32_t OPTKEYR; /*!< FLASH option key register, Address offset: 0x08 */ + __IO uint32_t SR; /*!< FLASH status register, Address offset: 0x0C */ + __IO uint32_t CR; /*!< FLASH control register, Address offset: 0x10 */ + __IO uint32_t OPTCR; /*!< FLASH option control register, Address offset: 0x14 */ +} FLASH_TypeDef; + + +/** + * @brief Flexible Static Memory Controller + */ + +typedef struct +{ + __IO uint32_t BTCR[8]; /*!< NOR/PSRAM chip-select control register(BCR) and chip-select timing register(BTR), Address offset: 0x00-1C */ +} FSMC_Bank1_TypeDef; + +/** + * @brief Flexible Static Memory Controller Bank1E + */ + +typedef struct +{ + __IO uint32_t BWTR[7]; /*!< NOR/PSRAM write timing registers, Address offset: 0x104-0x11C */ +} FSMC_Bank1E_TypeDef; + +/** + * @brief Flexible Static Memory Controller Bank2 + */ + +typedef struct +{ + __IO uint32_t PCR2; /*!< NAND Flash control register 2, Address offset: 0x60 */ + __IO uint32_t SR2; /*!< NAND Flash FIFO status and interrupt register 2, Address offset: 0x64 */ + __IO uint32_t PMEM2; /*!< NAND Flash Common memory space timing register 2, Address offset: 0x68 */ + __IO uint32_t PATT2; /*!< NAND Flash Attribute memory space timing register 2, Address offset: 0x6C */ + uint32_t RESERVED0; /*!< Reserved, 0x70 */ + __IO uint32_t ECCR2; /*!< NAND Flash ECC result registers 2, Address offset: 0x74 */ + uint32_t RESERVED1; /*!< Reserved, 0x78 */ + uint32_t RESERVED2; /*!< Reserved, 0x7C */ + __IO uint32_t PCR3; /*!< NAND Flash control register 3, Address offset: 0x80 */ + __IO uint32_t SR3; /*!< NAND Flash FIFO status and interrupt register 3, Address offset: 0x84 */ + __IO uint32_t PMEM3; /*!< NAND Flash Common memory space timing register 3, Address offset: 0x88 */ + __IO uint32_t PATT3; /*!< NAND Flash Attribute memory space timing register 3, Address offset: 0x8C */ + uint32_t RESERVED3; /*!< Reserved, 0x90 */ + __IO uint32_t ECCR3; /*!< NAND Flash ECC result registers 3, Address offset: 0x94 */ +} FSMC_Bank2_3_TypeDef; + +/** + * @brief Flexible Static Memory Controller Bank4 + */ + +typedef struct +{ + __IO uint32_t PCR4; /*!< PC Card control register 4, Address offset: 0xA0 */ + __IO uint32_t SR4; /*!< PC Card FIFO status and interrupt register 4, Address offset: 0xA4 */ + __IO uint32_t PMEM4; /*!< PC Card Common memory space timing register 4, Address offset: 0xA8 */ + __IO uint32_t PATT4; /*!< PC Card Attribute memory space timing register 4, Address offset: 0xAC */ + __IO uint32_t PIO4; /*!< PC Card I/O space timing register 4, Address offset: 0xB0 */ +} FSMC_Bank4_TypeDef; + + +/** + * @brief General Purpose I/O + */ + +typedef struct +{ + __IO uint32_t MODER; /*!< GPIO port mode register, Address offset: 0x00 */ + __IO uint32_t OTYPER; /*!< GPIO port output type register, Address offset: 0x04 */ + __IO uint32_t OSPEEDR; /*!< GPIO port output speed register, Address offset: 0x08 */ + __IO uint32_t PUPDR; /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */ + __IO uint32_t IDR; /*!< GPIO port input data register, Address offset: 0x10 */ + __IO uint32_t ODR; /*!< GPIO port output data register, Address offset: 0x14 */ + __IO uint32_t BSRR; /*!< GPIO port bit set/reset register, Address offset: 0x18 */ + __IO uint32_t LCKR; /*!< GPIO port configuration lock register, Address offset: 0x1C */ + __IO uint32_t AFR[2]; /*!< GPIO alternate function registers, Address offset: 0x20-0x24 */ +} GPIO_TypeDef; + +/** + * @brief System configuration controller + */ + +typedef struct +{ + __IO uint32_t MEMRMP; /*!< SYSCFG memory remap register, Address offset: 0x00 */ + __IO uint32_t PMC; /*!< SYSCFG peripheral mode configuration register, Address offset: 0x04 */ + __IO uint32_t EXTICR[4]; /*!< SYSCFG external interrupt configuration registers, Address offset: 0x08-0x14 */ + uint32_t RESERVED[2]; /*!< Reserved, 0x18-0x1C */ + __IO uint32_t CMPCR; /*!< SYSCFG Compensation cell control register, Address offset: 0x20 */ +} SYSCFG_TypeDef; + +/** + * @brief Inter-integrated Circuit Interface + */ + +typedef struct +{ + __IO uint32_t CR1; /*!< I2C Control register 1, Address offset: 0x00 */ + __IO uint32_t CR2; /*!< I2C Control register 2, Address offset: 0x04 */ + __IO uint32_t OAR1; /*!< I2C Own address register 1, Address offset: 0x08 */ + __IO uint32_t OAR2; /*!< I2C Own address register 2, Address offset: 0x0C */ + __IO uint32_t DR; /*!< I2C Data register, Address offset: 0x10 */ + __IO uint32_t SR1; /*!< I2C Status register 1, Address offset: 0x14 */ + __IO uint32_t SR2; /*!< I2C Status register 2, Address offset: 0x18 */ + __IO uint32_t CCR; /*!< I2C Clock control register, Address offset: 0x1C */ + __IO uint32_t TRISE; /*!< I2C TRISE register, Address offset: 0x20 */ +} I2C_TypeDef; + +/** + * @brief Independent WATCHDOG + */ + +typedef struct +{ + __IO uint32_t KR; /*!< IWDG Key register, Address offset: 0x00 */ + __IO uint32_t PR; /*!< IWDG Prescaler register, Address offset: 0x04 */ + __IO uint32_t RLR; /*!< IWDG Reload register, Address offset: 0x08 */ + __IO uint32_t SR; /*!< IWDG Status register, Address offset: 0x0C */ +} IWDG_TypeDef; + +/** + * @brief Power Control + */ + +typedef struct +{ + __IO uint32_t CR; /*!< PWR power control register, Address offset: 0x00 */ + __IO uint32_t CSR; /*!< PWR power control/status register, Address offset: 0x04 */ +} PWR_TypeDef; + +/** + * @brief Reset and Clock Control + */ + +typedef struct +{ + __IO uint32_t CR; /*!< RCC clock control register, Address offset: 0x00 */ + __IO uint32_t PLLCFGR; /*!< RCC PLL configuration register, Address offset: 0x04 */ + __IO uint32_t CFGR; /*!< RCC clock configuration register, Address offset: 0x08 */ + __IO uint32_t CIR; /*!< RCC clock interrupt register, Address offset: 0x0C */ + __IO uint32_t AHB1RSTR; /*!< RCC AHB1 peripheral reset register, Address offset: 0x10 */ + __IO uint32_t AHB2RSTR; /*!< RCC AHB2 peripheral reset register, Address offset: 0x14 */ + __IO uint32_t AHB3RSTR; /*!< RCC AHB3 peripheral reset register, Address offset: 0x18 */ + uint32_t RESERVED0; /*!< Reserved, 0x1C */ + __IO uint32_t APB1RSTR; /*!< RCC APB1 peripheral reset register, Address offset: 0x20 */ + __IO uint32_t APB2RSTR; /*!< RCC APB2 peripheral reset register, Address offset: 0x24 */ + uint32_t RESERVED1[2]; /*!< Reserved, 0x28-0x2C */ + __IO uint32_t AHB1ENR; /*!< RCC AHB1 peripheral clock register, Address offset: 0x30 */ + __IO uint32_t AHB2ENR; /*!< RCC AHB2 peripheral clock register, Address offset: 0x34 */ + __IO uint32_t AHB3ENR; /*!< RCC AHB3 peripheral clock register, Address offset: 0x38 */ + uint32_t RESERVED2; /*!< Reserved, 0x3C */ + __IO uint32_t APB1ENR; /*!< RCC APB1 peripheral clock enable register, Address offset: 0x40 */ + __IO uint32_t APB2ENR; /*!< RCC APB2 peripheral clock enable register, Address offset: 0x44 */ + uint32_t RESERVED3[2]; /*!< Reserved, 0x48-0x4C */ + __IO uint32_t AHB1LPENR; /*!< RCC AHB1 peripheral clock enable in low power mode register, Address offset: 0x50 */ + __IO uint32_t AHB2LPENR; /*!< RCC AHB2 peripheral clock enable in low power mode register, Address offset: 0x54 */ + __IO uint32_t AHB3LPENR; /*!< RCC AHB3 peripheral clock enable in low power mode register, Address offset: 0x58 */ + uint32_t RESERVED4; /*!< Reserved, 0x5C */ + __IO uint32_t APB1LPENR; /*!< RCC APB1 peripheral clock enable in low power mode register, Address offset: 0x60 */ + __IO uint32_t APB2LPENR; /*!< RCC APB2 peripheral clock enable in low power mode register, Address offset: 0x64 */ + uint32_t RESERVED5[2]; /*!< Reserved, 0x68-0x6C */ + __IO uint32_t BDCR; /*!< RCC Backup domain control register, Address offset: 0x70 */ + __IO uint32_t CSR; /*!< RCC clock control & status register, Address offset: 0x74 */ + uint32_t RESERVED6[2]; /*!< Reserved, 0x78-0x7C */ + __IO uint32_t SSCGR; /*!< RCC spread spectrum clock generation register, Address offset: 0x80 */ + __IO uint32_t PLLI2SCFGR; /*!< RCC PLLI2S configuration register, Address offset: 0x84 */ + +} RCC_TypeDef; + +/** + * @brief Real-Time Clock + */ + +typedef struct +{ + __IO uint32_t TR; /*!< RTC time register, Address offset: 0x00 */ + __IO uint32_t DR; /*!< RTC date register, Address offset: 0x04 */ + __IO uint32_t CR; /*!< RTC control register, Address offset: 0x08 */ + __IO uint32_t ISR; /*!< RTC initialization and status register, Address offset: 0x0C */ + __IO uint32_t PRER; /*!< RTC prescaler register, Address offset: 0x10 */ + __IO uint32_t WUTR; /*!< RTC wakeup timer register, Address offset: 0x14 */ + __IO uint32_t CALIBR; /*!< RTC calibration register, Address offset: 0x18 */ + __IO uint32_t ALRMAR; /*!< RTC alarm A register, Address offset: 0x1C */ + __IO uint32_t ALRMBR; /*!< RTC alarm B register, Address offset: 0x20 */ + __IO uint32_t WPR; /*!< RTC write protection register, Address offset: 0x24 */ + uint32_t RESERVED1; /*!< Reserved, 0x28 */ + uint32_t RESERVED2; /*!< Reserved, 0x2C */ + __IO uint32_t TSTR; /*!< RTC time stamp time register, Address offset: 0x30 */ + __IO uint32_t TSDR; /*!< RTC time stamp date register, Address offset: 0x34 */ + uint32_t RESERVED3; /*!< Reserved, 0x38 */ + uint32_t RESERVED4; /*!< Reserved, 0x3C */ + __IO uint32_t TAFCR; /*!< RTC tamper and alternate function configuration register, Address offset: 0x40 */ + uint32_t RESERVED5; /*!< Reserved, 0x44 */ + uint32_t RESERVED6; /*!< Reserved, 0x48 */ + uint32_t RESERVED7; /*!< Reserved, 0x4C */ + __IO uint32_t BKP0R; /*!< RTC backup register 1, Address offset: 0x50 */ + __IO uint32_t BKP1R; /*!< RTC backup register 1, Address offset: 0x54 */ + __IO uint32_t BKP2R; /*!< RTC backup register 2, Address offset: 0x58 */ + __IO uint32_t BKP3R; /*!< RTC backup register 3, Address offset: 0x5C */ + __IO uint32_t BKP4R; /*!< RTC backup register 4, Address offset: 0x60 */ + __IO uint32_t BKP5R; /*!< RTC backup register 5, Address offset: 0x64 */ + __IO uint32_t BKP6R; /*!< RTC backup register 6, Address offset: 0x68 */ + __IO uint32_t BKP7R; /*!< RTC backup register 7, Address offset: 0x6C */ + __IO uint32_t BKP8R; /*!< RTC backup register 8, Address offset: 0x70 */ + __IO uint32_t BKP9R; /*!< RTC backup register 9, Address offset: 0x74 */ + __IO uint32_t BKP10R; /*!< RTC backup register 10, Address offset: 0x78 */ + __IO uint32_t BKP11R; /*!< RTC backup register 11, Address offset: 0x7C */ + __IO uint32_t BKP12R; /*!< RTC backup register 12, Address offset: 0x80 */ + __IO uint32_t BKP13R; /*!< RTC backup register 13, Address offset: 0x84 */ + __IO uint32_t BKP14R; /*!< RTC backup register 14, Address offset: 0x88 */ + __IO uint32_t BKP15R; /*!< RTC backup register 15, Address offset: 0x8C */ + __IO uint32_t BKP16R; /*!< RTC backup register 16, Address offset: 0x90 */ + __IO uint32_t BKP17R; /*!< RTC backup register 17, Address offset: 0x94 */ + __IO uint32_t BKP18R; /*!< RTC backup register 18, Address offset: 0x98 */ + __IO uint32_t BKP19R; /*!< RTC backup register 19, Address offset: 0x9C */ +} RTC_TypeDef; + + +/** + * @brief SD host Interface + */ + +typedef struct +{ + __IO uint32_t POWER; /*!< SDIO power control register, Address offset: 0x00 */ + __IO uint32_t CLKCR; /*!< SDI clock control register, Address offset: 0x04 */ + __IO uint32_t ARG; /*!< SDIO argument register, Address offset: 0x08 */ + __IO uint32_t CMD; /*!< SDIO command register, Address offset: 0x0C */ + __IO const uint32_t RESPCMD; /*!< SDIO command response register, Address offset: 0x10 */ + __IO const uint32_t RESP1; /*!< SDIO response 1 register, Address offset: 0x14 */ + __IO const uint32_t RESP2; /*!< SDIO response 2 register, Address offset: 0x18 */ + __IO const uint32_t RESP3; /*!< SDIO response 3 register, Address offset: 0x1C */ + __IO const uint32_t RESP4; /*!< SDIO response 4 register, Address offset: 0x20 */ + __IO uint32_t DTIMER; /*!< SDIO data timer register, Address offset: 0x24 */ + __IO uint32_t DLEN; /*!< SDIO data length register, Address offset: 0x28 */ + __IO uint32_t DCTRL; /*!< SDIO data control register, Address offset: 0x2C */ + __IO const uint32_t DCOUNT; /*!< SDIO data counter register, Address offset: 0x30 */ + __IO const uint32_t STA; /*!< SDIO status register, Address offset: 0x34 */ + __IO uint32_t ICR; /*!< SDIO interrupt clear register, Address offset: 0x38 */ + __IO uint32_t MASK; /*!< SDIO mask register, Address offset: 0x3C */ + uint32_t RESERVED0[2]; /*!< Reserved, 0x40-0x44 */ + __IO const uint32_t FIFOCNT; /*!< SDIO FIFO counter register, Address offset: 0x48 */ + uint32_t RESERVED1[13]; /*!< Reserved, 0x4C-0x7C */ + __IO uint32_t FIFO; /*!< SDIO data FIFO register, Address offset: 0x80 */ +} SDIO_TypeDef; + +/** + * @brief Serial Peripheral Interface + */ + +typedef struct +{ + __IO uint32_t CR1; /*!< SPI control register 1 (not used in I2S mode), Address offset: 0x00 */ + __IO uint32_t CR2; /*!< SPI control register 2, Address offset: 0x04 */ + __IO uint32_t SR; /*!< SPI status register, Address offset: 0x08 */ + __IO uint32_t DR; /*!< SPI data register, Address offset: 0x0C */ + __IO uint32_t CRCPR; /*!< SPI CRC polynomial register (not used in I2S mode), Address offset: 0x10 */ + __IO uint32_t RXCRCR; /*!< SPI RX CRC register (not used in I2S mode), Address offset: 0x14 */ + __IO uint32_t TXCRCR; /*!< SPI TX CRC register (not used in I2S mode), Address offset: 0x18 */ + __IO uint32_t I2SCFGR; /*!< SPI_I2S configuration register, Address offset: 0x1C */ + __IO uint32_t I2SPR; /*!< SPI_I2S prescaler register, Address offset: 0x20 */ +} SPI_TypeDef; + +/** + * @brief TIM + */ + +typedef struct +{ + __IO uint32_t CR1; /*!< TIM control register 1, Address offset: 0x00 */ + __IO uint32_t CR2; /*!< TIM control register 2, Address offset: 0x04 */ + __IO uint32_t SMCR; /*!< TIM slave mode control register, Address offset: 0x08 */ + __IO uint32_t DIER; /*!< TIM DMA/interrupt enable register, Address offset: 0x0C */ + __IO uint32_t SR; /*!< TIM status register, Address offset: 0x10 */ + __IO uint32_t EGR; /*!< TIM event generation register, Address offset: 0x14 */ + __IO uint32_t CCMR1; /*!< TIM capture/compare mode register 1, Address offset: 0x18 */ + __IO uint32_t CCMR2; /*!< TIM capture/compare mode register 2, Address offset: 0x1C */ + __IO uint32_t CCER; /*!< TIM capture/compare enable register, Address offset: 0x20 */ + __IO uint32_t CNT; /*!< TIM counter register, Address offset: 0x24 */ + __IO uint32_t PSC; /*!< TIM prescaler, Address offset: 0x28 */ + __IO uint32_t ARR; /*!< TIM auto-reload register, Address offset: 0x2C */ + __IO uint32_t RCR; /*!< TIM repetition counter register, Address offset: 0x30 */ + __IO uint32_t CCR1; /*!< TIM capture/compare register 1, Address offset: 0x34 */ + __IO uint32_t CCR2; /*!< TIM capture/compare register 2, Address offset: 0x38 */ + __IO uint32_t CCR3; /*!< TIM capture/compare register 3, Address offset: 0x3C */ + __IO uint32_t CCR4; /*!< TIM capture/compare register 4, Address offset: 0x40 */ + __IO uint32_t BDTR; /*!< TIM break and dead-time register, Address offset: 0x44 */ + __IO uint32_t DCR; /*!< TIM DMA control register, Address offset: 0x48 */ + __IO uint32_t DMAR; /*!< TIM DMA address for full transfer, Address offset: 0x4C */ + __IO uint32_t OR; /*!< TIM option register, Address offset: 0x50 */ +} TIM_TypeDef; + +/** + * @brief Universal Synchronous Asynchronous Receiver Transmitter + */ + +typedef struct +{ + __IO uint32_t SR; /*!< USART Status register, Address offset: 0x00 */ + __IO uint32_t DR; /*!< USART Data register, Address offset: 0x04 */ + __IO uint32_t BRR; /*!< USART Baud rate register, Address offset: 0x08 */ + __IO uint32_t CR1; /*!< USART Control register 1, Address offset: 0x0C */ + __IO uint32_t CR2; /*!< USART Control register 2, Address offset: 0x10 */ + __IO uint32_t CR3; /*!< USART Control register 3, Address offset: 0x14 */ + __IO uint32_t GTPR; /*!< USART Guard time and prescaler register, Address offset: 0x18 */ +} USART_TypeDef; + +/** + * @brief Window WATCHDOG + */ + +typedef struct +{ + __IO uint32_t CR; /*!< WWDG Control register, Address offset: 0x00 */ + __IO uint32_t CFR; /*!< WWDG Configuration register, Address offset: 0x04 */ + __IO uint32_t SR; /*!< WWDG Status register, Address offset: 0x08 */ +} WWDG_TypeDef; + +/** + * @brief RNG + */ + +typedef struct +{ + __IO uint32_t CR; /*!< RNG control register, Address offset: 0x00 */ + __IO uint32_t SR; /*!< RNG status register, Address offset: 0x04 */ + __IO uint32_t DR; /*!< RNG data register, Address offset: 0x08 */ +} RNG_TypeDef; + + + +/** + * @brief __USB_OTG_Core_register + */ +typedef struct +{ + __IO uint32_t GOTGCTL; /*!< USB_OTG Control and Status Register Address offset : 0x00 */ + __IO uint32_t GOTGINT; /*!< USB_OTG Interrupt Register Address offset : 0x04 */ + __IO uint32_t GAHBCFG; /*!< Core AHB Configuration Register Address offset : 0x08 */ + __IO uint32_t GUSBCFG; /*!< Core USB Configuration Register Address offset : 0x0C */ + __IO uint32_t GRSTCTL; /*!< Core Reset Register Address offset : 0x10 */ + __IO uint32_t GINTSTS; /*!< Core Interrupt Register Address offset : 0x14 */ + __IO uint32_t GINTMSK; /*!< Core Interrupt Mask Register Address offset : 0x18 */ + __IO uint32_t GRXSTSR; /*!< Receive Sts Q Read Register Address offset : 0x1C */ + __IO uint32_t GRXSTSP; /*!< Receive Sts Q Read & POP Register Address offset : 0x20 */ + __IO uint32_t GRXFSIZ; /* Receive FIFO Size Register Address offset : 0x24 */ + __IO uint32_t DIEPTXF0_HNPTXFSIZ; /*!< EP0 / Non Periodic Tx FIFO Size Register Address offset : 0x28 */ + __IO uint32_t HNPTXSTS; /*!< Non Periodic Tx FIFO/Queue Sts reg Address offset : 0x2C */ + uint32_t Reserved30[2]; /* Reserved Address offset : 0x30 */ + __IO uint32_t GCCFG; /*!< General Purpose IO Register Address offset : 0x38 */ + __IO uint32_t CID; /*!< User ID Register Address offset : 0x3C */ + uint32_t Reserved40[48]; /*!< Reserved Address offset : 0x40-0xFF */ + __IO uint32_t HPTXFSIZ; /*!< Host Periodic Tx FIFO Size Reg Address offset : 0x100 */ + __IO uint32_t DIEPTXF[0x0F]; /*!< dev Periodic Transmit FIFO */ +} +USB_OTG_GlobalTypeDef; + + + +/** + * @brief __device_Registers + */ +typedef struct +{ + __IO uint32_t DCFG; /*!< dev Configuration Register Address offset : 0x800 */ + __IO uint32_t DCTL; /*!< dev Control Register Address offset : 0x804 */ + __IO uint32_t DSTS; /*!< dev Status Register (RO) Address offset : 0x808 */ + uint32_t Reserved0C; /*!< Reserved Address offset : 0x80C */ + __IO uint32_t DIEPMSK; /*!< dev IN Endpoint Mask Address offset : 0x810 */ + __IO uint32_t DOEPMSK; /*!< dev OUT Endpoint Mask Address offset : 0x814 */ + __IO uint32_t DAINT; /*!< dev All Endpoints Itr Reg Address offset : 0x818 */ + __IO uint32_t DAINTMSK; /*!< dev All Endpoints Itr Mask Address offset : 0x81C */ + uint32_t Reserved20; /*!< Reserved Address offset : 0x820 */ + uint32_t Reserved9; /*!< Reserved Address offset : 0x824 */ + __IO uint32_t DVBUSDIS; /*!< dev VBUS discharge Register Address offset : 0x828 */ + __IO uint32_t DVBUSPULSE; /*!< dev VBUS Pulse Register Address offset : 0x82C */ + __IO uint32_t DTHRCTL; /*!< dev thr Address offset : 0x830 */ + __IO uint32_t DIEPEMPMSK; /*!< dev empty msk Address offset : 0x834 */ + __IO uint32_t DEACHINT; /*!< dedicated EP interrupt Address offset : 0x838 */ + __IO uint32_t DEACHMSK; /*!< dedicated EP msk Address offset : 0x83C */ + uint32_t Reserved40; /*!< dedicated EP mask Address offset : 0x840 */ + __IO uint32_t DINEP1MSK; /*!< dedicated EP mask Address offset : 0x844 */ + uint32_t Reserved44[15]; /*!< Reserved Address offset : 0x844-0x87C */ + __IO uint32_t DOUTEP1MSK; /*!< dedicated EP msk Address offset : 0x884 */ +} +USB_OTG_DeviceTypeDef; + + +/** + * @brief __IN_Endpoint-Specific_Register + */ +typedef struct +{ + __IO uint32_t DIEPCTL; /* dev IN Endpoint Control Reg 900h + (ep_num * 20h) + 00h */ + uint32_t Reserved04; /* Reserved 900h + (ep_num * 20h) + 04h */ + __IO uint32_t DIEPINT; /* dev IN Endpoint Itr Reg 900h + (ep_num * 20h) + 08h */ + uint32_t Reserved0C; /* Reserved 900h + (ep_num * 20h) + 0Ch */ + __IO uint32_t DIEPTSIZ; /* IN Endpoint Txfer Size 900h + (ep_num * 20h) + 10h */ + __IO uint32_t DIEPDMA; /* IN Endpoint DMA Address Reg 900h + (ep_num * 20h) + 14h */ + __IO uint32_t DTXFSTS; /* IN Endpoint Tx FIFO Status Reg 900h + (ep_num * 20h) + 18h */ + uint32_t Reserved18; /* Reserved 900h+(ep_num*20h)+1Ch-900h+ (ep_num * 20h) + 1Ch */ +} +USB_OTG_INEndpointTypeDef; + + +/** + * @brief __OUT_Endpoint-Specific_Registers + */ +typedef struct +{ + __IO uint32_t DOEPCTL; /* dev OUT Endpoint Control Reg B00h + (ep_num * 20h) + 00h*/ + uint32_t Reserved04; /* Reserved B00h + (ep_num * 20h) + 04h*/ + __IO uint32_t DOEPINT; /* dev OUT Endpoint Itr Reg B00h + (ep_num * 20h) + 08h*/ + uint32_t Reserved0C; /* Reserved B00h + (ep_num * 20h) + 0Ch*/ + __IO uint32_t DOEPTSIZ; /* dev OUT Endpoint Txfer Size B00h + (ep_num * 20h) + 10h*/ + __IO uint32_t DOEPDMA; /* dev OUT Endpoint DMA Address B00h + (ep_num * 20h) + 14h*/ + uint32_t Reserved18[2]; /* Reserved B00h + (ep_num * 20h) + 18h - B00h + (ep_num * 20h) + 1Ch*/ +} +USB_OTG_OUTEndpointTypeDef; + + +/** + * @brief __Host_Mode_Register_Structures + */ +typedef struct +{ + __IO uint32_t HCFG; /* Host Configuration Register 400h*/ + __IO uint32_t HFIR; /* Host Frame Interval Register 404h*/ + __IO uint32_t HFNUM; /* Host Frame Nbr/Frame Remaining 408h*/ + uint32_t Reserved40C; /* Reserved 40Ch*/ + __IO uint32_t HPTXSTS; /* Host Periodic Tx FIFO/ Queue Status 410h*/ + __IO uint32_t HAINT; /* Host All Channels Interrupt Register 414h*/ + __IO uint32_t HAINTMSK; /* Host All Channels Interrupt Mask 418h*/ +} +USB_OTG_HostTypeDef; + + +/** + * @brief __Host_Channel_Specific_Registers + */ +typedef struct +{ + __IO uint32_t HCCHAR; + __IO uint32_t HCSPLT; + __IO uint32_t HCINT; + __IO uint32_t HCINTMSK; + __IO uint32_t HCTSIZ; + __IO uint32_t HCDMA; + uint32_t Reserved[2]; +} +USB_OTG_HostChannelTypeDef; + + +/** + * @brief Peripheral_memory_map + */ +#define FLASH_BASE 0x08000000UL /*!< FLASH(up to 1 MB) base address in the alias region */ +#define SRAM1_BASE 0x20000000UL /*!< SRAM1(112 KB) base address in the alias region */ +#define SRAM2_BASE 0x2001C000UL /*!< SRAM2(16 KB) base address in the alias region */ +#define PERIPH_BASE 0x40000000UL /*!< Peripheral base address in the alias region */ +#define BKPSRAM_BASE 0x40024000UL /*!< Backup SRAM(4 KB) base address in the alias region */ +#define FSMC_R_BASE 0xA0000000UL /*!< FSMC registers base address */ +#define SRAM1_BB_BASE 0x22000000UL /*!< SRAM1(112 KB) base address in the bit-band region */ +#define SRAM2_BB_BASE 0x22380000UL /*!< SRAM2(16 KB) base address in the bit-band region */ +#define PERIPH_BB_BASE 0x42000000UL /*!< Peripheral base address in the bit-band region */ +#define BKPSRAM_BB_BASE 0x42480000UL /*!< Backup SRAM(4 KB) base address in the bit-band region */ +#define FLASH_END 0x080FFFFFUL /*!< FLASH end address */ +#define FLASH_OTP_BASE 0x1FFF7800UL /*!< Base address of : (up to 528 Bytes) embedded FLASH OTP Area */ +#define FLASH_OTP_END 0x1FFF7A0FUL /*!< End address of : (up to 528 Bytes) embedded FLASH OTP Area */ + +/* Legacy defines */ +#define SRAM_BASE SRAM1_BASE +#define SRAM_BB_BASE SRAM1_BB_BASE + + +/*!< Peripheral memory map */ +#define APB1PERIPH_BASE PERIPH_BASE +#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000UL) +#define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000UL) +#define AHB2PERIPH_BASE (PERIPH_BASE + 0x10000000UL) + +/*!< APB1 peripherals */ +#define TIM2_BASE (APB1PERIPH_BASE + 0x0000UL) +#define TIM3_BASE (APB1PERIPH_BASE + 0x0400UL) +#define TIM4_BASE (APB1PERIPH_BASE + 0x0800UL) +#define TIM5_BASE (APB1PERIPH_BASE + 0x0C00UL) +#define TIM6_BASE (APB1PERIPH_BASE + 0x1000UL) +#define TIM7_BASE (APB1PERIPH_BASE + 0x1400UL) +#define TIM12_BASE (APB1PERIPH_BASE + 0x1800UL) +#define TIM13_BASE (APB1PERIPH_BASE + 0x1C00UL) +#define TIM14_BASE (APB1PERIPH_BASE + 0x2000UL) +#define RTC_BASE (APB1PERIPH_BASE + 0x2800UL) +#define WWDG_BASE (APB1PERIPH_BASE + 0x2C00UL) +#define IWDG_BASE (APB1PERIPH_BASE + 0x3000UL) +#define SPI2_BASE (APB1PERIPH_BASE + 0x3800UL) +#define SPI3_BASE (APB1PERIPH_BASE + 0x3C00UL) +#define USART2_BASE (APB1PERIPH_BASE + 0x4400UL) +#define USART3_BASE (APB1PERIPH_BASE + 0x4800UL) +#define UART4_BASE (APB1PERIPH_BASE + 0x4C00UL) +#define UART5_BASE (APB1PERIPH_BASE + 0x5000UL) +#define I2C1_BASE (APB1PERIPH_BASE + 0x5400UL) +#define I2C2_BASE (APB1PERIPH_BASE + 0x5800UL) +#define I2C3_BASE (APB1PERIPH_BASE + 0x5C00UL) +#define CAN1_BASE (APB1PERIPH_BASE + 0x6400UL) +#define CAN2_BASE (APB1PERIPH_BASE + 0x6800UL) +#define PWR_BASE (APB1PERIPH_BASE + 0x7000UL) +#define DAC_BASE (APB1PERIPH_BASE + 0x7400UL) + +/*!< APB2 peripherals */ +#define TIM1_BASE (APB2PERIPH_BASE + 0x0000UL) +#define TIM8_BASE (APB2PERIPH_BASE + 0x0400UL) +#define USART1_BASE (APB2PERIPH_BASE + 0x1000UL) +#define USART6_BASE (APB2PERIPH_BASE + 0x1400UL) +#define ADC1_BASE (APB2PERIPH_BASE + 0x2000UL) +#define ADC2_BASE (APB2PERIPH_BASE + 0x2100UL) +#define ADC3_BASE (APB2PERIPH_BASE + 0x2200UL) +#define ADC123_COMMON_BASE (APB2PERIPH_BASE + 0x2300UL) +/* Legacy define */ +#define ADC_BASE ADC123_COMMON_BASE + +#define SDIO_BASE (APB2PERIPH_BASE + 0x2C00UL) +#define SPI1_BASE (APB2PERIPH_BASE + 0x3000UL) +#define SYSCFG_BASE (APB2PERIPH_BASE + 0x3800UL) +#define EXTI_BASE (APB2PERIPH_BASE + 0x3C00UL) +#define TIM9_BASE (APB2PERIPH_BASE + 0x4000UL) +#define TIM10_BASE (APB2PERIPH_BASE + 0x4400UL) +#define TIM11_BASE (APB2PERIPH_BASE + 0x4800UL) + +/*!< AHB1 peripherals */ +#define GPIOA_BASE (AHB1PERIPH_BASE + 0x0000UL) +#define GPIOB_BASE (AHB1PERIPH_BASE + 0x0400UL) +#define GPIOC_BASE (AHB1PERIPH_BASE + 0x0800UL) +#define GPIOD_BASE (AHB1PERIPH_BASE + 0x0C00UL) +#define GPIOE_BASE (AHB1PERIPH_BASE + 0x1000UL) +#define GPIOF_BASE (AHB1PERIPH_BASE + 0x1400UL) +#define GPIOG_BASE (AHB1PERIPH_BASE + 0x1800UL) +#define GPIOH_BASE (AHB1PERIPH_BASE + 0x1C00UL) +#define GPIOI_BASE (AHB1PERIPH_BASE + 0x2000UL) +#define CRC_BASE (AHB1PERIPH_BASE + 0x3000UL) +#define RCC_BASE (AHB1PERIPH_BASE + 0x3800UL) +#define FLASH_R_BASE (AHB1PERIPH_BASE + 0x3C00UL) +#define DMA1_BASE (AHB1PERIPH_BASE + 0x6000UL) +#define DMA1_Stream0_BASE (DMA1_BASE + 0x010UL) +#define DMA1_Stream1_BASE (DMA1_BASE + 0x028UL) +#define DMA1_Stream2_BASE (DMA1_BASE + 0x040UL) +#define DMA1_Stream3_BASE (DMA1_BASE + 0x058UL) +#define DMA1_Stream4_BASE (DMA1_BASE + 0x070UL) +#define DMA1_Stream5_BASE (DMA1_BASE + 0x088UL) +#define DMA1_Stream6_BASE (DMA1_BASE + 0x0A0UL) +#define DMA1_Stream7_BASE (DMA1_BASE + 0x0B8UL) +#define DMA2_BASE (AHB1PERIPH_BASE + 0x6400UL) +#define DMA2_Stream0_BASE (DMA2_BASE + 0x010UL) +#define DMA2_Stream1_BASE (DMA2_BASE + 0x028UL) +#define DMA2_Stream2_BASE (DMA2_BASE + 0x040UL) +#define DMA2_Stream3_BASE (DMA2_BASE + 0x058UL) +#define DMA2_Stream4_BASE (DMA2_BASE + 0x070UL) +#define DMA2_Stream5_BASE (DMA2_BASE + 0x088UL) +#define DMA2_Stream6_BASE (DMA2_BASE + 0x0A0UL) +#define DMA2_Stream7_BASE (DMA2_BASE + 0x0B8UL) +#define ETH_BASE (AHB1PERIPH_BASE + 0x8000UL) +#define ETH_MAC_BASE (ETH_BASE) +#define ETH_MMC_BASE (ETH_BASE + 0x0100UL) +#define ETH_PTP_BASE (ETH_BASE + 0x0700UL) +#define ETH_DMA_BASE (ETH_BASE + 0x1000UL) + +/*!< AHB2 peripherals */ +#define DCMI_BASE (AHB2PERIPH_BASE + 0x50000UL) +#define RNG_BASE (AHB2PERIPH_BASE + 0x60800UL) + +/*!< FSMC Bankx registers base address */ +#define FSMC_Bank1_R_BASE (FSMC_R_BASE + 0x0000UL) +#define FSMC_Bank1E_R_BASE (FSMC_R_BASE + 0x0104UL) +#define FSMC_Bank2_3_R_BASE (FSMC_R_BASE + 0x0060UL) +#define FSMC_Bank4_R_BASE (FSMC_R_BASE + 0x00A0UL) + +/* Debug MCU registers base address */ +#define DBGMCU_BASE 0xE0042000UL + +/*!< USB registers base address */ +#define USB_OTG_HS_PERIPH_BASE 0x40040000UL +#define USB_OTG_FS_PERIPH_BASE 0x50000000UL + +#define USB_OTG_GLOBAL_BASE 0x000UL +#define USB_OTG_DEVICE_BASE 0x800UL +#define USB_OTG_IN_ENDPOINT_BASE 0x900UL +#define USB_OTG_OUT_ENDPOINT_BASE 0xB00UL +#define USB_OTG_EP_REG_SIZE 0x20UL +#define USB_OTG_HOST_BASE 0x400UL +#define USB_OTG_HOST_PORT_BASE 0x440UL +#define USB_OTG_HOST_CHANNEL_BASE 0x500UL +#define USB_OTG_HOST_CHANNEL_SIZE 0x20UL +#define USB_OTG_PCGCCTL_BASE 0xE00UL +#define USB_OTG_FIFO_BASE 0x1000UL +#define USB_OTG_FIFO_SIZE 0x1000UL + +/******************* Device electronic signature ***************/ +#define UID_BASE 0x1FFF7A10UL /*!< Unique device ID register base address */ +#define FLASHSIZE_BASE 0x1FFF7A22UL /*!< FLASH Size register base address */ + +/** + * @} + */ + +/** @addtogroup Peripheral_declaration + * @{ + */ +#define TIM2 ((TIM_TypeDef *) TIM2_BASE) +#define TIM3 ((TIM_TypeDef *) TIM3_BASE) +#define TIM4 ((TIM_TypeDef *) TIM4_BASE) +#define TIM5 ((TIM_TypeDef *) TIM5_BASE) +#define TIM6 ((TIM_TypeDef *) TIM6_BASE) +#define TIM7 ((TIM_TypeDef *) TIM7_BASE) +#define TIM12 ((TIM_TypeDef *) TIM12_BASE) +#define TIM13 ((TIM_TypeDef *) TIM13_BASE) +#define TIM14 ((TIM_TypeDef *) TIM14_BASE) +#define RTC ((RTC_TypeDef *) RTC_BASE) +#define WWDG ((WWDG_TypeDef *) WWDG_BASE) +#define IWDG ((IWDG_TypeDef *) IWDG_BASE) +#define SPI2 ((SPI_TypeDef *) SPI2_BASE) +#define SPI3 ((SPI_TypeDef *) SPI3_BASE) +#define USART2 ((USART_TypeDef *) USART2_BASE) +#define USART3 ((USART_TypeDef *) USART3_BASE) +#define UART4 ((USART_TypeDef *) UART4_BASE) +#define UART5 ((USART_TypeDef *) UART5_BASE) +#define I2C1 ((I2C_TypeDef *) I2C1_BASE) +#define I2C2 ((I2C_TypeDef *) I2C2_BASE) +#define I2C3 ((I2C_TypeDef *) I2C3_BASE) +#define CAN1 ((CAN_TypeDef *) CAN1_BASE) +#define CAN2 ((CAN_TypeDef *) CAN2_BASE) +#define PWR ((PWR_TypeDef *) PWR_BASE) +#define DAC1 ((DAC_TypeDef *) DAC_BASE) +#define DAC ((DAC_TypeDef *) DAC_BASE) /* Kept for legacy purpose */ +#define TIM1 ((TIM_TypeDef *) TIM1_BASE) +#define TIM8 ((TIM_TypeDef *) TIM8_BASE) +#define USART1 ((USART_TypeDef *) USART1_BASE) +#define USART6 ((USART_TypeDef *) USART6_BASE) +#define ADC1 ((ADC_TypeDef *) ADC1_BASE) +#define ADC2 ((ADC_TypeDef *) ADC2_BASE) +#define ADC3 ((ADC_TypeDef *) ADC3_BASE) +#define ADC123_COMMON ((ADC_Common_TypeDef *) ADC123_COMMON_BASE) +/* Legacy define */ +#define ADC ADC123_COMMON +#define SDIO ((SDIO_TypeDef *) SDIO_BASE) +#define SPI1 ((SPI_TypeDef *) SPI1_BASE) +#define SYSCFG ((SYSCFG_TypeDef *) SYSCFG_BASE) +#define EXTI ((EXTI_TypeDef *) EXTI_BASE) +#define TIM9 ((TIM_TypeDef *) TIM9_BASE) +#define TIM10 ((TIM_TypeDef *) TIM10_BASE) +#define TIM11 ((TIM_TypeDef *) TIM11_BASE) +#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) +#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE) +#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE) +#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE) +#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE) +#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE) +#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE) +#define GPIOH ((GPIO_TypeDef *) GPIOH_BASE) +#define GPIOI ((GPIO_TypeDef *) GPIOI_BASE) +#define CRC ((CRC_TypeDef *) CRC_BASE) +#define RCC ((RCC_TypeDef *) RCC_BASE) +#define FLASH ((FLASH_TypeDef *) FLASH_R_BASE) +#define DMA1 ((DMA_TypeDef *) DMA1_BASE) +#define DMA1_Stream0 ((DMA_Stream_TypeDef *) DMA1_Stream0_BASE) +#define DMA1_Stream1 ((DMA_Stream_TypeDef *) DMA1_Stream1_BASE) +#define DMA1_Stream2 ((DMA_Stream_TypeDef *) DMA1_Stream2_BASE) +#define DMA1_Stream3 ((DMA_Stream_TypeDef *) DMA1_Stream3_BASE) +#define DMA1_Stream4 ((DMA_Stream_TypeDef *) DMA1_Stream4_BASE) +#define DMA1_Stream5 ((DMA_Stream_TypeDef *) DMA1_Stream5_BASE) +#define DMA1_Stream6 ((DMA_Stream_TypeDef *) DMA1_Stream6_BASE) +#define DMA1_Stream7 ((DMA_Stream_TypeDef *) DMA1_Stream7_BASE) +#define DMA2 ((DMA_TypeDef *) DMA2_BASE) +#define DMA2_Stream0 ((DMA_Stream_TypeDef *) DMA2_Stream0_BASE) +#define DMA2_Stream1 ((DMA_Stream_TypeDef *) DMA2_Stream1_BASE) +#define DMA2_Stream2 ((DMA_Stream_TypeDef *) DMA2_Stream2_BASE) +#define DMA2_Stream3 ((DMA_Stream_TypeDef *) DMA2_Stream3_BASE) +#define DMA2_Stream4 ((DMA_Stream_TypeDef *) DMA2_Stream4_BASE) +#define DMA2_Stream5 ((DMA_Stream_TypeDef *) DMA2_Stream5_BASE) +#define DMA2_Stream6 ((DMA_Stream_TypeDef *) DMA2_Stream6_BASE) +#define DMA2_Stream7 ((DMA_Stream_TypeDef *) DMA2_Stream7_BASE) +#define ETH ((ETH_TypeDef *) ETH_BASE) +#define DCMI ((DCMI_TypeDef *) DCMI_BASE) +#define RNG ((RNG_TypeDef *) RNG_BASE) +#define FSMC_Bank1 ((FSMC_Bank1_TypeDef *) FSMC_Bank1_R_BASE) +#define FSMC_Bank1E ((FSMC_Bank1E_TypeDef *) FSMC_Bank1E_R_BASE) +#define FSMC_Bank2_3 ((FSMC_Bank2_3_TypeDef *) FSMC_Bank2_3_R_BASE) +#define FSMC_Bank4 ((FSMC_Bank4_TypeDef *) FSMC_Bank4_R_BASE) + +#define DBGMCU ((DBGMCU_TypeDef *) DBGMCU_BASE) + +#define USB_OTG_FS ((USB_OTG_GlobalTypeDef *) USB_OTG_FS_PERIPH_BASE) +#define USB_OTG_HS ((USB_OTG_GlobalTypeDef *) USB_OTG_HS_PERIPH_BASE) + +/** + * @} + */ + +/** @addtogroup Exported_constants + * @{ + */ + + /** @addtogroup Peripheral_Registers_Bits_Definition + * @{ + */ + +/******************************************************************************/ +/* Peripheral Registers_Bits_Definition */ +/******************************************************************************/ + +/******************************************************************************/ +/* */ +/* Analog to Digital Converter */ +/* */ +/******************************************************************************/ +/******************** Bit definition for ADC_SR register ********************/ +#define ADC_SR_AWD_Pos (0U) +#define ADC_SR_AWD_Msk (0x1UL << ADC_SR_AWD_Pos) /*!< 0x00000001 */ +#define ADC_SR_AWD ADC_SR_AWD_Msk /*!
© Copyright (c) 2017 STMicroelectronics. + * All rights reserved.
+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS_Device + * @{ + */ + +/** @addtogroup stm32f215xx + * @{ + */ + +#ifndef __STM32F215xx_H +#define __STM32F215xx_H + +#ifdef __cplusplus + extern "C" { +#endif /* __cplusplus */ + +/** @addtogroup Configuration_section_for_CMSIS + * @{ + */ + +/** + * @brief Configuration of the Cortex-M3 Processor and Core Peripherals + */ +#define __CM3_REV 0x0200U /*!< Core revision r0p1 */ +#define __MPU_PRESENT 1U /*!< STM32F2XX provides an MPU */ +#define __NVIC_PRIO_BITS 4U /*!< STM32F2XX uses 4 Bits for the Priority Levels */ +#define __Vendor_SysTickConfig 0U /*!< Set to 1 if different SysTick Config is used */ + +/** + * @} + */ + +/** @addtogroup Peripheral_interrupt_number_definition + * @{ + */ + +/** + * @brief STM32F2XX Interrupt Number Definition, according to the selected device + * in @ref Library_configuration_section + */ +typedef enum +{ +/****** Cortex-M3 Processor Exceptions Numbers ****************************************************************/ + NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ + HardFault_IRQn = -13, /*!< 3 Hard Fault Interrupt */ + MemoryManagement_IRQn = -12, /*!< 4 Cortex-M3 Memory Management Interrupt */ + BusFault_IRQn = -11, /*!< 5 Cortex-M3 Bus Fault Interrupt */ + UsageFault_IRQn = -10, /*!< 6 Cortex-M3 Usage Fault Interrupt */ + SVCall_IRQn = -5, /*!< 11 Cortex-M3 SV Call Interrupt */ + DebugMonitor_IRQn = -4, /*!< 12 Cortex-M3 Debug Monitor Interrupt */ + PendSV_IRQn = -2, /*!< 14 Cortex-M3 Pend SV Interrupt */ + SysTick_IRQn = -1, /*!< 15 Cortex-M3 System Tick Interrupt */ +/****** STM32 specific Interrupt Numbers **********************************************************************/ + WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */ + PVD_IRQn = 1, /*!< PVD through EXTI Line detection Interrupt */ + TAMP_STAMP_IRQn = 2, /*!< Tamper and TimeStamp interrupts through the EXTI line */ + RTC_WKUP_IRQn = 3, /*!< RTC Wakeup interrupt through the EXTI line */ + FLASH_IRQn = 4, /*!< FLASH global Interrupt */ + RCC_IRQn = 5, /*!< RCC global Interrupt */ + EXTI0_IRQn = 6, /*!< EXTI Line0 Interrupt */ + EXTI1_IRQn = 7, /*!< EXTI Line1 Interrupt */ + EXTI2_IRQn = 8, /*!< EXTI Line2 Interrupt */ + EXTI3_IRQn = 9, /*!< EXTI Line3 Interrupt */ + EXTI4_IRQn = 10, /*!< EXTI Line4 Interrupt */ + DMA1_Stream0_IRQn = 11, /*!< DMA1 Stream 0 global Interrupt */ + DMA1_Stream1_IRQn = 12, /*!< DMA1 Stream 1 global Interrupt */ + DMA1_Stream2_IRQn = 13, /*!< DMA1 Stream 2 global Interrupt */ + DMA1_Stream3_IRQn = 14, /*!< DMA1 Stream 3 global Interrupt */ + DMA1_Stream4_IRQn = 15, /*!< DMA1 Stream 4 global Interrupt */ + DMA1_Stream5_IRQn = 16, /*!< DMA1 Stream 5 global Interrupt */ + DMA1_Stream6_IRQn = 17, /*!< DMA1 Stream 6 global Interrupt */ + ADC_IRQn = 18, /*!< ADC1, ADC2 and ADC3 global Interrupts */ + CAN1_TX_IRQn = 19, /*!< CAN1 TX Interrupt */ + CAN1_RX0_IRQn = 20, /*!< CAN1 RX0 Interrupt */ + CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ + CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ + EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TIM1_BRK_TIM9_IRQn = 24, /*!< TIM1 Break interrupt and TIM9 global interrupt */ + TIM1_UP_TIM10_IRQn = 25, /*!< TIM1 Update Interrupt and TIM10 global interrupt */ + TIM1_TRG_COM_TIM11_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt and TIM11 global interrupt */ + TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ + TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ + TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ + TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ + I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + USART3_IRQn = 39, /*!< USART3 global Interrupt */ + EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTC_Alarm_IRQn = 41, /*!< RTC Alarm (A and B) through EXTI Line Interrupt */ + OTG_FS_WKUP_IRQn = 42, /*!< USB OTG FS Wakeup through EXTI line interrupt */ + TIM8_BRK_TIM12_IRQn = 43, /*!< TIM8 Break Interrupt and TIM12 global interrupt */ + TIM8_UP_TIM13_IRQn = 44, /*!< TIM8 Update Interrupt and TIM13 global interrupt */ + TIM8_TRG_COM_TIM14_IRQn = 45, /*!< TIM8 Trigger and Commutation Interrupt and TIM14 global interrupt */ + TIM8_CC_IRQn = 46, /*!< TIM8 Capture Compare Interrupt */ + DMA1_Stream7_IRQn = 47, /*!< DMA1 Stream7 Interrupt */ + FSMC_IRQn = 48, /*!< FSMC global Interrupt */ + SDIO_IRQn = 49, /*!< SDIO global Interrupt */ + TIM5_IRQn = 50, /*!< TIM5 global Interrupt */ + SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ + UART4_IRQn = 52, /*!< UART4 global Interrupt */ + UART5_IRQn = 53, /*!< UART5 global Interrupt */ + TIM6_DAC_IRQn = 54, /*!< TIM6 global and DAC1&2 underrun error interrupts */ + TIM7_IRQn = 55, /*!< TIM7 global interrupt */ + DMA2_Stream0_IRQn = 56, /*!< DMA2 Stream 0 global Interrupt */ + DMA2_Stream1_IRQn = 57, /*!< DMA2 Stream 1 global Interrupt */ + DMA2_Stream2_IRQn = 58, /*!< DMA2 Stream 2 global Interrupt */ + DMA2_Stream3_IRQn = 59, /*!< DMA2 Stream 3 global Interrupt */ + DMA2_Stream4_IRQn = 60, /*!< DMA2 Stream 4 global Interrupt */ + CAN2_TX_IRQn = 63, /*!< CAN2 TX Interrupt */ + CAN2_RX0_IRQn = 64, /*!< CAN2 RX0 Interrupt */ + CAN2_RX1_IRQn = 65, /*!< CAN2 RX1 Interrupt */ + CAN2_SCE_IRQn = 66, /*!< CAN2 SCE Interrupt */ + OTG_FS_IRQn = 67, /*!< USB OTG FS global Interrupt */ + DMA2_Stream5_IRQn = 68, /*!< DMA2 Stream 5 global interrupt */ + DMA2_Stream6_IRQn = 69, /*!< DMA2 Stream 6 global interrupt */ + DMA2_Stream7_IRQn = 70, /*!< DMA2 Stream 7 global interrupt */ + USART6_IRQn = 71, /*!< USART6 global interrupt */ + I2C3_EV_IRQn = 72, /*!< I2C3 event interrupt */ + I2C3_ER_IRQn = 73, /*!< I2C3 error interrupt */ + OTG_HS_EP1_OUT_IRQn = 74, /*!< USB OTG HS End Point 1 Out global interrupt */ + OTG_HS_EP1_IN_IRQn = 75, /*!< USB OTG HS End Point 1 In global interrupt */ + OTG_HS_WKUP_IRQn = 76, /*!< USB OTG HS Wakeup through EXTI interrupt */ + OTG_HS_IRQn = 77, /*!< USB OTG HS global interrupt */ + CRYP_IRQn = 79, /*!< CRYP crypto global interrupt */ + HASH_RNG_IRQn = 80 /*!< Hash and Rng global interrupt */ +} IRQn_Type; + +/** + * @} + */ + +#include "core_cm3.h" +#include "system_stm32f2xx.h" +#include + +/** @addtogroup Peripheral_registers_structures + * @{ + */ + +/** + * @brief Analog to Digital Converter + */ + +typedef struct +{ + __IO uint32_t SR; /*!< ADC status register, Address offset: 0x00 */ + __IO uint32_t CR1; /*!< ADC control register 1, Address offset: 0x04 */ + __IO uint32_t CR2; /*!< ADC control register 2, Address offset: 0x08 */ + __IO uint32_t SMPR1; /*!< ADC sample time register 1, Address offset: 0x0C */ + __IO uint32_t SMPR2; /*!< ADC sample time register 2, Address offset: 0x10 */ + __IO uint32_t JOFR1; /*!< ADC injected channel data offset register 1, Address offset: 0x14 */ + __IO uint32_t JOFR2; /*!< ADC injected channel data offset register 2, Address offset: 0x18 */ + __IO uint32_t JOFR3; /*!< ADC injected channel data offset register 3, Address offset: 0x1C */ + __IO uint32_t JOFR4; /*!< ADC injected channel data offset register 4, Address offset: 0x20 */ + __IO uint32_t HTR; /*!< ADC watchdog higher threshold register, Address offset: 0x24 */ + __IO uint32_t LTR; /*!< ADC watchdog lower threshold register, Address offset: 0x28 */ + __IO uint32_t SQR1; /*!< ADC regular sequence register 1, Address offset: 0x2C */ + __IO uint32_t SQR2; /*!< ADC regular sequence register 2, Address offset: 0x30 */ + __IO uint32_t SQR3; /*!< ADC regular sequence register 3, Address offset: 0x34 */ + __IO uint32_t JSQR; /*!< ADC injected sequence register, Address offset: 0x38*/ + __IO uint32_t JDR1; /*!< ADC injected data register 1, Address offset: 0x3C */ + __IO uint32_t JDR2; /*!< ADC injected data register 2, Address offset: 0x40 */ + __IO uint32_t JDR3; /*!< ADC injected data register 3, Address offset: 0x44 */ + __IO uint32_t JDR4; /*!< ADC injected data register 4, Address offset: 0x48 */ + __IO uint32_t DR; /*!< ADC regular data register, Address offset: 0x4C */ +} ADC_TypeDef; + +typedef struct +{ + __IO uint32_t CSR; /*!< ADC Common status register, Address offset: ADC1 base address + 0x300 */ + __IO uint32_t CCR; /*!< ADC common control register, Address offset: ADC1 base address + 0x304 */ + __IO uint32_t CDR; /*!< ADC common regular data register for dual + AND triple modes, Address offset: ADC1 base address + 0x308 */ +} ADC_Common_TypeDef; + + +/** + * @brief Controller Area Network TxMailBox + */ + +typedef struct +{ + __IO uint32_t TIR; /*!< CAN TX mailbox identifier register */ + __IO uint32_t TDTR; /*!< CAN mailbox data length control and time stamp register */ + __IO uint32_t TDLR; /*!< CAN mailbox data low register */ + __IO uint32_t TDHR; /*!< CAN mailbox data high register */ +} CAN_TxMailBox_TypeDef; + +/** + * @brief Controller Area Network FIFOMailBox + */ + +typedef struct +{ + __IO uint32_t RIR; /*!< CAN receive FIFO mailbox identifier register */ + __IO uint32_t RDTR; /*!< CAN receive FIFO mailbox data length control and time stamp register */ + __IO uint32_t RDLR; /*!< CAN receive FIFO mailbox data low register */ + __IO uint32_t RDHR; /*!< CAN receive FIFO mailbox data high register */ +} CAN_FIFOMailBox_TypeDef; + +/** + * @brief Controller Area Network FilterRegister + */ + +typedef struct +{ + __IO uint32_t FR1; /*!< CAN Filter bank register 1 */ + __IO uint32_t FR2; /*!< CAN Filter bank register 1 */ +} CAN_FilterRegister_TypeDef; + +/** + * @brief Controller Area Network + */ + +typedef struct +{ + __IO uint32_t MCR; /*!< CAN master control register, Address offset: 0x00 */ + __IO uint32_t MSR; /*!< CAN master status register, Address offset: 0x04 */ + __IO uint32_t TSR; /*!< CAN transmit status register, Address offset: 0x08 */ + __IO uint32_t RF0R; /*!< CAN receive FIFO 0 register, Address offset: 0x0C */ + __IO uint32_t RF1R; /*!< CAN receive FIFO 1 register, Address offset: 0x10 */ + __IO uint32_t IER; /*!< CAN interrupt enable register, Address offset: 0x14 */ + __IO uint32_t ESR; /*!< CAN error status register, Address offset: 0x18 */ + __IO uint32_t BTR; /*!< CAN bit timing register, Address offset: 0x1C */ + uint32_t RESERVED0[88]; /*!< Reserved, 0x020 - 0x17F */ + CAN_TxMailBox_TypeDef sTxMailBox[3]; /*!< CAN Tx MailBox, Address offset: 0x180 - 0x1AC */ + CAN_FIFOMailBox_TypeDef sFIFOMailBox[2]; /*!< CAN FIFO MailBox, Address offset: 0x1B0 - 0x1CC */ + uint32_t RESERVED1[12]; /*!< Reserved, 0x1D0 - 0x1FF */ + __IO uint32_t FMR; /*!< CAN filter master register, Address offset: 0x200 */ + __IO uint32_t FM1R; /*!< CAN filter mode register, Address offset: 0x204 */ + uint32_t RESERVED2; /*!< Reserved, 0x208 */ + __IO uint32_t FS1R; /*!< CAN filter scale register, Address offset: 0x20C */ + uint32_t RESERVED3; /*!< Reserved, 0x210 */ + __IO uint32_t FFA1R; /*!< CAN filter FIFO assignment register, Address offset: 0x214 */ + uint32_t RESERVED4; /*!< Reserved, 0x218 */ + __IO uint32_t FA1R; /*!< CAN filter activation register, Address offset: 0x21C */ + uint32_t RESERVED5[8]; /*!< Reserved, 0x220-0x23F */ + CAN_FilterRegister_TypeDef sFilterRegister[28]; /*!< CAN Filter Register, Address offset: 0x240-0x31C */ +} CAN_TypeDef; + +/** + * @brief CRC calculation unit + */ + +typedef struct +{ + __IO uint32_t DR; /*!< CRC Data register, Address offset: 0x00 */ + __IO uint8_t IDR; /*!< CRC Independent data register, Address offset: 0x04 */ + uint8_t RESERVED0; /*!< Reserved, 0x05 */ + uint16_t RESERVED1; /*!< Reserved, 0x06 */ + __IO uint32_t CR; /*!< CRC Control register, Address offset: 0x08 */ +} CRC_TypeDef; + +/** + * @brief Digital to Analog Converter + */ + +typedef struct +{ + __IO uint32_t CR; /*!< DAC control register, Address offset: 0x00 */ + __IO uint32_t SWTRIGR; /*!< DAC software trigger register, Address offset: 0x04 */ + __IO uint32_t DHR12R1; /*!< DAC channel1 12-bit right-aligned data holding register, Address offset: 0x08 */ + __IO uint32_t DHR12L1; /*!< DAC channel1 12-bit left aligned data holding register, Address offset: 0x0C */ + __IO uint32_t DHR8R1; /*!< DAC channel1 8-bit right aligned data holding register, Address offset: 0x10 */ + __IO uint32_t DHR12R2; /*!< DAC channel2 12-bit right aligned data holding register, Address offset: 0x14 */ + __IO uint32_t DHR12L2; /*!< DAC channel2 12-bit left aligned data holding register, Address offset: 0x18 */ + __IO uint32_t DHR8R2; /*!< DAC channel2 8-bit right-aligned data holding register, Address offset: 0x1C */ + __IO uint32_t DHR12RD; /*!< Dual DAC 12-bit right-aligned data holding register, Address offset: 0x20 */ + __IO uint32_t DHR12LD; /*!< DUAL DAC 12-bit left aligned data holding register, Address offset: 0x24 */ + __IO uint32_t DHR8RD; /*!< DUAL DAC 8-bit right aligned data holding register, Address offset: 0x28 */ + __IO uint32_t DOR1; /*!< DAC channel1 data output register, Address offset: 0x2C */ + __IO uint32_t DOR2; /*!< DAC channel2 data output register, Address offset: 0x30 */ + __IO uint32_t SR; /*!< DAC status register, Address offset: 0x34 */ +} DAC_TypeDef; + +/** + * @brief Debug MCU + */ + +typedef struct +{ + __IO uint32_t IDCODE; /*!< MCU device ID code, Address offset: 0x00 */ + __IO uint32_t CR; /*!< Debug MCU configuration register, Address offset: 0x04 */ + __IO uint32_t APB1FZ; /*!< Debug MCU APB1 freeze register, Address offset: 0x08 */ + __IO uint32_t APB2FZ; /*!< Debug MCU APB2 freeze register, Address offset: 0x0C */ +}DBGMCU_TypeDef; + + +/** + * @brief DMA Controller + */ + +typedef struct +{ + __IO uint32_t CR; /*!< DMA stream x configuration register */ + __IO uint32_t NDTR; /*!< DMA stream x number of data register */ + __IO uint32_t PAR; /*!< DMA stream x peripheral address register */ + __IO uint32_t M0AR; /*!< DMA stream x memory 0 address register */ + __IO uint32_t M1AR; /*!< DMA stream x memory 1 address register */ + __IO uint32_t FCR; /*!< DMA stream x FIFO control register */ +} DMA_Stream_TypeDef; + +typedef struct +{ + __IO uint32_t LISR; /*!< DMA low interrupt status register, Address offset: 0x00 */ + __IO uint32_t HISR; /*!< DMA high interrupt status register, Address offset: 0x04 */ + __IO uint32_t LIFCR; /*!< DMA low interrupt flag clear register, Address offset: 0x08 */ + __IO uint32_t HIFCR; /*!< DMA high interrupt flag clear register, Address offset: 0x0C */ +} DMA_TypeDef; + + +/** + * @brief External Interrupt/Event Controller + */ + +typedef struct +{ + __IO uint32_t IMR; /*!< EXTI Interrupt mask register, Address offset: 0x00 */ + __IO uint32_t EMR; /*!< EXTI Event mask register, Address offset: 0x04 */ + __IO uint32_t RTSR; /*!< EXTI Rising trigger selection register, Address offset: 0x08 */ + __IO uint32_t FTSR; /*!< EXTI Falling trigger selection register, Address offset: 0x0C */ + __IO uint32_t SWIER; /*!< EXTI Software interrupt event register, Address offset: 0x10 */ + __IO uint32_t PR; /*!< EXTI Pending register, Address offset: 0x14 */ +} EXTI_TypeDef; + +/** + * @brief FLASH Registers + */ + +typedef struct +{ + __IO uint32_t ACR; /*!< FLASH access control register, Address offset: 0x00 */ + __IO uint32_t KEYR; /*!< FLASH key register, Address offset: 0x04 */ + __IO uint32_t OPTKEYR; /*!< FLASH option key register, Address offset: 0x08 */ + __IO uint32_t SR; /*!< FLASH status register, Address offset: 0x0C */ + __IO uint32_t CR; /*!< FLASH control register, Address offset: 0x10 */ + __IO uint32_t OPTCR; /*!< FLASH option control register, Address offset: 0x14 */ +} FLASH_TypeDef; + + +/** + * @brief Flexible Static Memory Controller + */ + +typedef struct +{ + __IO uint32_t BTCR[8]; /*!< NOR/PSRAM chip-select control register(BCR) and chip-select timing register(BTR), Address offset: 0x00-1C */ +} FSMC_Bank1_TypeDef; + +/** + * @brief Flexible Static Memory Controller Bank1E + */ + +typedef struct +{ + __IO uint32_t BWTR[7]; /*!< NOR/PSRAM write timing registers, Address offset: 0x104-0x11C */ +} FSMC_Bank1E_TypeDef; + +/** + * @brief Flexible Static Memory Controller Bank2 + */ + +typedef struct +{ + __IO uint32_t PCR2; /*!< NAND Flash control register 2, Address offset: 0x60 */ + __IO uint32_t SR2; /*!< NAND Flash FIFO status and interrupt register 2, Address offset: 0x64 */ + __IO uint32_t PMEM2; /*!< NAND Flash Common memory space timing register 2, Address offset: 0x68 */ + __IO uint32_t PATT2; /*!< NAND Flash Attribute memory space timing register 2, Address offset: 0x6C */ + uint32_t RESERVED0; /*!< Reserved, 0x70 */ + __IO uint32_t ECCR2; /*!< NAND Flash ECC result registers 2, Address offset: 0x74 */ + uint32_t RESERVED1; /*!< Reserved, 0x78 */ + uint32_t RESERVED2; /*!< Reserved, 0x7C */ + __IO uint32_t PCR3; /*!< NAND Flash control register 3, Address offset: 0x80 */ + __IO uint32_t SR3; /*!< NAND Flash FIFO status and interrupt register 3, Address offset: 0x84 */ + __IO uint32_t PMEM3; /*!< NAND Flash Common memory space timing register 3, Address offset: 0x88 */ + __IO uint32_t PATT3; /*!< NAND Flash Attribute memory space timing register 3, Address offset: 0x8C */ + uint32_t RESERVED3; /*!< Reserved, 0x90 */ + __IO uint32_t ECCR3; /*!< NAND Flash ECC result registers 3, Address offset: 0x94 */ +} FSMC_Bank2_3_TypeDef; + +/** + * @brief Flexible Static Memory Controller Bank4 + */ + +typedef struct +{ + __IO uint32_t PCR4; /*!< PC Card control register 4, Address offset: 0xA0 */ + __IO uint32_t SR4; /*!< PC Card FIFO status and interrupt register 4, Address offset: 0xA4 */ + __IO uint32_t PMEM4; /*!< PC Card Common memory space timing register 4, Address offset: 0xA8 */ + __IO uint32_t PATT4; /*!< PC Card Attribute memory space timing register 4, Address offset: 0xAC */ + __IO uint32_t PIO4; /*!< PC Card I/O space timing register 4, Address offset: 0xB0 */ +} FSMC_Bank4_TypeDef; + + +/** + * @brief General Purpose I/O + */ + +typedef struct +{ + __IO uint32_t MODER; /*!< GPIO port mode register, Address offset: 0x00 */ + __IO uint32_t OTYPER; /*!< GPIO port output type register, Address offset: 0x04 */ + __IO uint32_t OSPEEDR; /*!< GPIO port output speed register, Address offset: 0x08 */ + __IO uint32_t PUPDR; /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */ + __IO uint32_t IDR; /*!< GPIO port input data register, Address offset: 0x10 */ + __IO uint32_t ODR; /*!< GPIO port output data register, Address offset: 0x14 */ + __IO uint32_t BSRR; /*!< GPIO port bit set/reset register, Address offset: 0x18 */ + __IO uint32_t LCKR; /*!< GPIO port configuration lock register, Address offset: 0x1C */ + __IO uint32_t AFR[2]; /*!< GPIO alternate function registers, Address offset: 0x20-0x24 */ +} GPIO_TypeDef; + +/** + * @brief System configuration controller + */ + +typedef struct +{ + __IO uint32_t MEMRMP; /*!< SYSCFG memory remap register, Address offset: 0x00 */ + __IO uint32_t PMC; /*!< SYSCFG peripheral mode configuration register, Address offset: 0x04 */ + __IO uint32_t EXTICR[4]; /*!< SYSCFG external interrupt configuration registers, Address offset: 0x08-0x14 */ + uint32_t RESERVED[2]; /*!< Reserved, 0x18-0x1C */ + __IO uint32_t CMPCR; /*!< SYSCFG Compensation cell control register, Address offset: 0x20 */ +} SYSCFG_TypeDef; + +/** + * @brief Inter-integrated Circuit Interface + */ + +typedef struct +{ + __IO uint32_t CR1; /*!< I2C Control register 1, Address offset: 0x00 */ + __IO uint32_t CR2; /*!< I2C Control register 2, Address offset: 0x04 */ + __IO uint32_t OAR1; /*!< I2C Own address register 1, Address offset: 0x08 */ + __IO uint32_t OAR2; /*!< I2C Own address register 2, Address offset: 0x0C */ + __IO uint32_t DR; /*!< I2C Data register, Address offset: 0x10 */ + __IO uint32_t SR1; /*!< I2C Status register 1, Address offset: 0x14 */ + __IO uint32_t SR2; /*!< I2C Status register 2, Address offset: 0x18 */ + __IO uint32_t CCR; /*!< I2C Clock control register, Address offset: 0x1C */ + __IO uint32_t TRISE; /*!< I2C TRISE register, Address offset: 0x20 */ +} I2C_TypeDef; + +/** + * @brief Independent WATCHDOG + */ + +typedef struct +{ + __IO uint32_t KR; /*!< IWDG Key register, Address offset: 0x00 */ + __IO uint32_t PR; /*!< IWDG Prescaler register, Address offset: 0x04 */ + __IO uint32_t RLR; /*!< IWDG Reload register, Address offset: 0x08 */ + __IO uint32_t SR; /*!< IWDG Status register, Address offset: 0x0C */ +} IWDG_TypeDef; + +/** + * @brief Power Control + */ + +typedef struct +{ + __IO uint32_t CR; /*!< PWR power control register, Address offset: 0x00 */ + __IO uint32_t CSR; /*!< PWR power control/status register, Address offset: 0x04 */ +} PWR_TypeDef; + +/** + * @brief Reset and Clock Control + */ + +typedef struct +{ + __IO uint32_t CR; /*!< RCC clock control register, Address offset: 0x00 */ + __IO uint32_t PLLCFGR; /*!< RCC PLL configuration register, Address offset: 0x04 */ + __IO uint32_t CFGR; /*!< RCC clock configuration register, Address offset: 0x08 */ + __IO uint32_t CIR; /*!< RCC clock interrupt register, Address offset: 0x0C */ + __IO uint32_t AHB1RSTR; /*!< RCC AHB1 peripheral reset register, Address offset: 0x10 */ + __IO uint32_t AHB2RSTR; /*!< RCC AHB2 peripheral reset register, Address offset: 0x14 */ + __IO uint32_t AHB3RSTR; /*!< RCC AHB3 peripheral reset register, Address offset: 0x18 */ + uint32_t RESERVED0; /*!< Reserved, 0x1C */ + __IO uint32_t APB1RSTR; /*!< RCC APB1 peripheral reset register, Address offset: 0x20 */ + __IO uint32_t APB2RSTR; /*!< RCC APB2 peripheral reset register, Address offset: 0x24 */ + uint32_t RESERVED1[2]; /*!< Reserved, 0x28-0x2C */ + __IO uint32_t AHB1ENR; /*!< RCC AHB1 peripheral clock register, Address offset: 0x30 */ + __IO uint32_t AHB2ENR; /*!< RCC AHB2 peripheral clock register, Address offset: 0x34 */ + __IO uint32_t AHB3ENR; /*!< RCC AHB3 peripheral clock register, Address offset: 0x38 */ + uint32_t RESERVED2; /*!< Reserved, 0x3C */ + __IO uint32_t APB1ENR; /*!< RCC APB1 peripheral clock enable register, Address offset: 0x40 */ + __IO uint32_t APB2ENR; /*!< RCC APB2 peripheral clock enable register, Address offset: 0x44 */ + uint32_t RESERVED3[2]; /*!< Reserved, 0x48-0x4C */ + __IO uint32_t AHB1LPENR; /*!< RCC AHB1 peripheral clock enable in low power mode register, Address offset: 0x50 */ + __IO uint32_t AHB2LPENR; /*!< RCC AHB2 peripheral clock enable in low power mode register, Address offset: 0x54 */ + __IO uint32_t AHB3LPENR; /*!< RCC AHB3 peripheral clock enable in low power mode register, Address offset: 0x58 */ + uint32_t RESERVED4; /*!< Reserved, 0x5C */ + __IO uint32_t APB1LPENR; /*!< RCC APB1 peripheral clock enable in low power mode register, Address offset: 0x60 */ + __IO uint32_t APB2LPENR; /*!< RCC APB2 peripheral clock enable in low power mode register, Address offset: 0x64 */ + uint32_t RESERVED5[2]; /*!< Reserved, 0x68-0x6C */ + __IO uint32_t BDCR; /*!< RCC Backup domain control register, Address offset: 0x70 */ + __IO uint32_t CSR; /*!< RCC clock control & status register, Address offset: 0x74 */ + uint32_t RESERVED6[2]; /*!< Reserved, 0x78-0x7C */ + __IO uint32_t SSCGR; /*!< RCC spread spectrum clock generation register, Address offset: 0x80 */ + __IO uint32_t PLLI2SCFGR; /*!< RCC PLLI2S configuration register, Address offset: 0x84 */ + +} RCC_TypeDef; + +/** + * @brief Real-Time Clock + */ + +typedef struct +{ + __IO uint32_t TR; /*!< RTC time register, Address offset: 0x00 */ + __IO uint32_t DR; /*!< RTC date register, Address offset: 0x04 */ + __IO uint32_t CR; /*!< RTC control register, Address offset: 0x08 */ + __IO uint32_t ISR; /*!< RTC initialization and status register, Address offset: 0x0C */ + __IO uint32_t PRER; /*!< RTC prescaler register, Address offset: 0x10 */ + __IO uint32_t WUTR; /*!< RTC wakeup timer register, Address offset: 0x14 */ + __IO uint32_t CALIBR; /*!< RTC calibration register, Address offset: 0x18 */ + __IO uint32_t ALRMAR; /*!< RTC alarm A register, Address offset: 0x1C */ + __IO uint32_t ALRMBR; /*!< RTC alarm B register, Address offset: 0x20 */ + __IO uint32_t WPR; /*!< RTC write protection register, Address offset: 0x24 */ + uint32_t RESERVED1; /*!< Reserved, 0x28 */ + uint32_t RESERVED2; /*!< Reserved, 0x2C */ + __IO uint32_t TSTR; /*!< RTC time stamp time register, Address offset: 0x30 */ + __IO uint32_t TSDR; /*!< RTC time stamp date register, Address offset: 0x34 */ + uint32_t RESERVED3; /*!< Reserved, 0x38 */ + uint32_t RESERVED4; /*!< Reserved, 0x3C */ + __IO uint32_t TAFCR; /*!< RTC tamper and alternate function configuration register, Address offset: 0x40 */ + uint32_t RESERVED5; /*!< Reserved, 0x44 */ + uint32_t RESERVED6; /*!< Reserved, 0x48 */ + uint32_t RESERVED7; /*!< Reserved, 0x4C */ + __IO uint32_t BKP0R; /*!< RTC backup register 1, Address offset: 0x50 */ + __IO uint32_t BKP1R; /*!< RTC backup register 1, Address offset: 0x54 */ + __IO uint32_t BKP2R; /*!< RTC backup register 2, Address offset: 0x58 */ + __IO uint32_t BKP3R; /*!< RTC backup register 3, Address offset: 0x5C */ + __IO uint32_t BKP4R; /*!< RTC backup register 4, Address offset: 0x60 */ + __IO uint32_t BKP5R; /*!< RTC backup register 5, Address offset: 0x64 */ + __IO uint32_t BKP6R; /*!< RTC backup register 6, Address offset: 0x68 */ + __IO uint32_t BKP7R; /*!< RTC backup register 7, Address offset: 0x6C */ + __IO uint32_t BKP8R; /*!< RTC backup register 8, Address offset: 0x70 */ + __IO uint32_t BKP9R; /*!< RTC backup register 9, Address offset: 0x74 */ + __IO uint32_t BKP10R; /*!< RTC backup register 10, Address offset: 0x78 */ + __IO uint32_t BKP11R; /*!< RTC backup register 11, Address offset: 0x7C */ + __IO uint32_t BKP12R; /*!< RTC backup register 12, Address offset: 0x80 */ + __IO uint32_t BKP13R; /*!< RTC backup register 13, Address offset: 0x84 */ + __IO uint32_t BKP14R; /*!< RTC backup register 14, Address offset: 0x88 */ + __IO uint32_t BKP15R; /*!< RTC backup register 15, Address offset: 0x8C */ + __IO uint32_t BKP16R; /*!< RTC backup register 16, Address offset: 0x90 */ + __IO uint32_t BKP17R; /*!< RTC backup register 17, Address offset: 0x94 */ + __IO uint32_t BKP18R; /*!< RTC backup register 18, Address offset: 0x98 */ + __IO uint32_t BKP19R; /*!< RTC backup register 19, Address offset: 0x9C */ +} RTC_TypeDef; + + +/** + * @brief SD host Interface + */ + +typedef struct +{ + __IO uint32_t POWER; /*!< SDIO power control register, Address offset: 0x00 */ + __IO uint32_t CLKCR; /*!< SDI clock control register, Address offset: 0x04 */ + __IO uint32_t ARG; /*!< SDIO argument register, Address offset: 0x08 */ + __IO uint32_t CMD; /*!< SDIO command register, Address offset: 0x0C */ + __IO const uint32_t RESPCMD; /*!< SDIO command response register, Address offset: 0x10 */ + __IO const uint32_t RESP1; /*!< SDIO response 1 register, Address offset: 0x14 */ + __IO const uint32_t RESP2; /*!< SDIO response 2 register, Address offset: 0x18 */ + __IO const uint32_t RESP3; /*!< SDIO response 3 register, Address offset: 0x1C */ + __IO const uint32_t RESP4; /*!< SDIO response 4 register, Address offset: 0x20 */ + __IO uint32_t DTIMER; /*!< SDIO data timer register, Address offset: 0x24 */ + __IO uint32_t DLEN; /*!< SDIO data length register, Address offset: 0x28 */ + __IO uint32_t DCTRL; /*!< SDIO data control register, Address offset: 0x2C */ + __IO const uint32_t DCOUNT; /*!< SDIO data counter register, Address offset: 0x30 */ + __IO const uint32_t STA; /*!< SDIO status register, Address offset: 0x34 */ + __IO uint32_t ICR; /*!< SDIO interrupt clear register, Address offset: 0x38 */ + __IO uint32_t MASK; /*!< SDIO mask register, Address offset: 0x3C */ + uint32_t RESERVED0[2]; /*!< Reserved, 0x40-0x44 */ + __IO const uint32_t FIFOCNT; /*!< SDIO FIFO counter register, Address offset: 0x48 */ + uint32_t RESERVED1[13]; /*!< Reserved, 0x4C-0x7C */ + __IO uint32_t FIFO; /*!< SDIO data FIFO register, Address offset: 0x80 */ +} SDIO_TypeDef; + +/** + * @brief Serial Peripheral Interface + */ + +typedef struct +{ + __IO uint32_t CR1; /*!< SPI control register 1 (not used in I2S mode), Address offset: 0x00 */ + __IO uint32_t CR2; /*!< SPI control register 2, Address offset: 0x04 */ + __IO uint32_t SR; /*!< SPI status register, Address offset: 0x08 */ + __IO uint32_t DR; /*!< SPI data register, Address offset: 0x0C */ + __IO uint32_t CRCPR; /*!< SPI CRC polynomial register (not used in I2S mode), Address offset: 0x10 */ + __IO uint32_t RXCRCR; /*!< SPI RX CRC register (not used in I2S mode), Address offset: 0x14 */ + __IO uint32_t TXCRCR; /*!< SPI TX CRC register (not used in I2S mode), Address offset: 0x18 */ + __IO uint32_t I2SCFGR; /*!< SPI_I2S configuration register, Address offset: 0x1C */ + __IO uint32_t I2SPR; /*!< SPI_I2S prescaler register, Address offset: 0x20 */ +} SPI_TypeDef; + +/** + * @brief TIM + */ + +typedef struct +{ + __IO uint32_t CR1; /*!< TIM control register 1, Address offset: 0x00 */ + __IO uint32_t CR2; /*!< TIM control register 2, Address offset: 0x04 */ + __IO uint32_t SMCR; /*!< TIM slave mode control register, Address offset: 0x08 */ + __IO uint32_t DIER; /*!< TIM DMA/interrupt enable register, Address offset: 0x0C */ + __IO uint32_t SR; /*!< TIM status register, Address offset: 0x10 */ + __IO uint32_t EGR; /*!< TIM event generation register, Address offset: 0x14 */ + __IO uint32_t CCMR1; /*!< TIM capture/compare mode register 1, Address offset: 0x18 */ + __IO uint32_t CCMR2; /*!< TIM capture/compare mode register 2, Address offset: 0x1C */ + __IO uint32_t CCER; /*!< TIM capture/compare enable register, Address offset: 0x20 */ + __IO uint32_t CNT; /*!< TIM counter register, Address offset: 0x24 */ + __IO uint32_t PSC; /*!< TIM prescaler, Address offset: 0x28 */ + __IO uint32_t ARR; /*!< TIM auto-reload register, Address offset: 0x2C */ + __IO uint32_t RCR; /*!< TIM repetition counter register, Address offset: 0x30 */ + __IO uint32_t CCR1; /*!< TIM capture/compare register 1, Address offset: 0x34 */ + __IO uint32_t CCR2; /*!< TIM capture/compare register 2, Address offset: 0x38 */ + __IO uint32_t CCR3; /*!< TIM capture/compare register 3, Address offset: 0x3C */ + __IO uint32_t CCR4; /*!< TIM capture/compare register 4, Address offset: 0x40 */ + __IO uint32_t BDTR; /*!< TIM break and dead-time register, Address offset: 0x44 */ + __IO uint32_t DCR; /*!< TIM DMA control register, Address offset: 0x48 */ + __IO uint32_t DMAR; /*!< TIM DMA address for full transfer, Address offset: 0x4C */ + __IO uint32_t OR; /*!< TIM option register, Address offset: 0x50 */ +} TIM_TypeDef; + +/** + * @brief Universal Synchronous Asynchronous Receiver Transmitter + */ + +typedef struct +{ + __IO uint32_t SR; /*!< USART Status register, Address offset: 0x00 */ + __IO uint32_t DR; /*!< USART Data register, Address offset: 0x04 */ + __IO uint32_t BRR; /*!< USART Baud rate register, Address offset: 0x08 */ + __IO uint32_t CR1; /*!< USART Control register 1, Address offset: 0x0C */ + __IO uint32_t CR2; /*!< USART Control register 2, Address offset: 0x10 */ + __IO uint32_t CR3; /*!< USART Control register 3, Address offset: 0x14 */ + __IO uint32_t GTPR; /*!< USART Guard time and prescaler register, Address offset: 0x18 */ +} USART_TypeDef; + +/** + * @brief Window WATCHDOG + */ + +typedef struct +{ + __IO uint32_t CR; /*!< WWDG Control register, Address offset: 0x00 */ + __IO uint32_t CFR; /*!< WWDG Configuration register, Address offset: 0x04 */ + __IO uint32_t SR; /*!< WWDG Status register, Address offset: 0x08 */ +} WWDG_TypeDef; + + +/** + * @brief Crypto Processor + */ + +typedef struct +{ + __IO uint32_t CR; /*!< CRYP control register, Address offset: 0x00 */ + __IO uint32_t SR; /*!< CRYP status register, Address offset: 0x04 */ + __IO uint32_t DIN; /*!< CRYP data input register, Address offset: 0x08 */ + __IO uint32_t DOUT; /*!< CRYP data output register, Address offset: 0x0C */ + __IO uint32_t DMACR; /*!< CRYP DMA control register, Address offset: 0x10 */ + __IO uint32_t IMSCR; /*!< CRYP interrupt mask set/clear register, Address offset: 0x14 */ + __IO uint32_t RISR; /*!< CRYP raw interrupt status register, Address offset: 0x18 */ + __IO uint32_t MISR; /*!< CRYP masked interrupt status register, Address offset: 0x1C */ + __IO uint32_t K0LR; /*!< CRYP key left register 0, Address offset: 0x20 */ + __IO uint32_t K0RR; /*!< CRYP key right register 0, Address offset: 0x24 */ + __IO uint32_t K1LR; /*!< CRYP key left register 1, Address offset: 0x28 */ + __IO uint32_t K1RR; /*!< CRYP key right register 1, Address offset: 0x2C */ + __IO uint32_t K2LR; /*!< CRYP key left register 2, Address offset: 0x30 */ + __IO uint32_t K2RR; /*!< CRYP key right register 2, Address offset: 0x34 */ + __IO uint32_t K3LR; /*!< CRYP key left register 3, Address offset: 0x38 */ + __IO uint32_t K3RR; /*!< CRYP key right register 3, Address offset: 0x3C */ + __IO uint32_t IV0LR; /*!< CRYP initialization vector left-word register 0, Address offset: 0x40 */ + __IO uint32_t IV0RR; /*!< CRYP initialization vector right-word register 0, Address offset: 0x44 */ + __IO uint32_t IV1LR; /*!< CRYP initialization vector left-word register 1, Address offset: 0x48 */ + __IO uint32_t IV1RR; /*!< CRYP initialization vector right-word register 1, Address offset: 0x4C */ +} CRYP_TypeDef; + +/** + * @brief HASH + */ + +typedef struct +{ + __IO uint32_t CR; /*!< HASH control register, Address offset: 0x00 */ + __IO uint32_t DIN; /*!< HASH data input register, Address offset: 0x04 */ + __IO uint32_t STR; /*!< HASH start register, Address offset: 0x08 */ + __IO uint32_t HR[5]; /*!< HASH digest registers, Address offset: 0x0C-0x1C */ + __IO uint32_t IMR; /*!< HASH interrupt enable register, Address offset: 0x20 */ + __IO uint32_t SR; /*!< HASH status register, Address offset: 0x24 */ + uint32_t RESERVED[52]; /*!< Reserved, 0x28-0xF4 */ + __IO uint32_t CSR[51]; /*!< HASH context swap registers, Address offset: 0x0F8-0x1C0 */ +} HASH_TypeDef; + +/** + * @brief RNG + */ + +typedef struct +{ + __IO uint32_t CR; /*!< RNG control register, Address offset: 0x00 */ + __IO uint32_t SR; /*!< RNG status register, Address offset: 0x04 */ + __IO uint32_t DR; /*!< RNG data register, Address offset: 0x08 */ +} RNG_TypeDef; + + + +/** + * @brief __USB_OTG_Core_register + */ +typedef struct +{ + __IO uint32_t GOTGCTL; /*!< USB_OTG Control and Status Register Address offset : 0x00 */ + __IO uint32_t GOTGINT; /*!< USB_OTG Interrupt Register Address offset : 0x04 */ + __IO uint32_t GAHBCFG; /*!< Core AHB Configuration Register Address offset : 0x08 */ + __IO uint32_t GUSBCFG; /*!< Core USB Configuration Register Address offset : 0x0C */ + __IO uint32_t GRSTCTL; /*!< Core Reset Register Address offset : 0x10 */ + __IO uint32_t GINTSTS; /*!< Core Interrupt Register Address offset : 0x14 */ + __IO uint32_t GINTMSK; /*!< Core Interrupt Mask Register Address offset : 0x18 */ + __IO uint32_t GRXSTSR; /*!< Receive Sts Q Read Register Address offset : 0x1C */ + __IO uint32_t GRXSTSP; /*!< Receive Sts Q Read & POP Register Address offset : 0x20 */ + __IO uint32_t GRXFSIZ; /* Receive FIFO Size Register Address offset : 0x24 */ + __IO uint32_t DIEPTXF0_HNPTXFSIZ; /*!< EP0 / Non Periodic Tx FIFO Size Register Address offset : 0x28 */ + __IO uint32_t HNPTXSTS; /*!< Non Periodic Tx FIFO/Queue Sts reg Address offset : 0x2C */ + uint32_t Reserved30[2]; /* Reserved Address offset : 0x30 */ + __IO uint32_t GCCFG; /*!< General Purpose IO Register Address offset : 0x38 */ + __IO uint32_t CID; /*!< User ID Register Address offset : 0x3C */ + uint32_t Reserved40[48]; /*!< Reserved Address offset : 0x40-0xFF */ + __IO uint32_t HPTXFSIZ; /*!< Host Periodic Tx FIFO Size Reg Address offset : 0x100 */ + __IO uint32_t DIEPTXF[0x0F]; /*!< dev Periodic Transmit FIFO */ +} +USB_OTG_GlobalTypeDef; + + + +/** + * @brief __device_Registers + */ +typedef struct +{ + __IO uint32_t DCFG; /*!< dev Configuration Register Address offset : 0x800 */ + __IO uint32_t DCTL; /*!< dev Control Register Address offset : 0x804 */ + __IO uint32_t DSTS; /*!< dev Status Register (RO) Address offset : 0x808 */ + uint32_t Reserved0C; /*!< Reserved Address offset : 0x80C */ + __IO uint32_t DIEPMSK; /*!< dev IN Endpoint Mask Address offset : 0x810 */ + __IO uint32_t DOEPMSK; /*!< dev OUT Endpoint Mask Address offset : 0x814 */ + __IO uint32_t DAINT; /*!< dev All Endpoints Itr Reg Address offset : 0x818 */ + __IO uint32_t DAINTMSK; /*!< dev All Endpoints Itr Mask Address offset : 0x81C */ + uint32_t Reserved20; /*!< Reserved Address offset : 0x820 */ + uint32_t Reserved9; /*!< Reserved Address offset : 0x824 */ + __IO uint32_t DVBUSDIS; /*!< dev VBUS discharge Register Address offset : 0x828 */ + __IO uint32_t DVBUSPULSE; /*!< dev VBUS Pulse Register Address offset : 0x82C */ + __IO uint32_t DTHRCTL; /*!< dev thr Address offset : 0x830 */ + __IO uint32_t DIEPEMPMSK; /*!< dev empty msk Address offset : 0x834 */ + __IO uint32_t DEACHINT; /*!< dedicated EP interrupt Address offset : 0x838 */ + __IO uint32_t DEACHMSK; /*!< dedicated EP msk Address offset : 0x83C */ + uint32_t Reserved40; /*!< dedicated EP mask Address offset : 0x840 */ + __IO uint32_t DINEP1MSK; /*!< dedicated EP mask Address offset : 0x844 */ + uint32_t Reserved44[15]; /*!< Reserved Address offset : 0x844-0x87C */ + __IO uint32_t DOUTEP1MSK; /*!< dedicated EP msk Address offset : 0x884 */ +} +USB_OTG_DeviceTypeDef; + + +/** + * @brief __IN_Endpoint-Specific_Register + */ +typedef struct +{ + __IO uint32_t DIEPCTL; /* dev IN Endpoint Control Reg 900h + (ep_num * 20h) + 00h */ + uint32_t Reserved04; /* Reserved 900h + (ep_num * 20h) + 04h */ + __IO uint32_t DIEPINT; /* dev IN Endpoint Itr Reg 900h + (ep_num * 20h) + 08h */ + uint32_t Reserved0C; /* Reserved 900h + (ep_num * 20h) + 0Ch */ + __IO uint32_t DIEPTSIZ; /* IN Endpoint Txfer Size 900h + (ep_num * 20h) + 10h */ + __IO uint32_t DIEPDMA; /* IN Endpoint DMA Address Reg 900h + (ep_num * 20h) + 14h */ + __IO uint32_t DTXFSTS; /* IN Endpoint Tx FIFO Status Reg 900h + (ep_num * 20h) + 18h */ + uint32_t Reserved18; /* Reserved 900h+(ep_num*20h)+1Ch-900h+ (ep_num * 20h) + 1Ch */ +} +USB_OTG_INEndpointTypeDef; + + +/** + * @brief __OUT_Endpoint-Specific_Registers + */ +typedef struct +{ + __IO uint32_t DOEPCTL; /* dev OUT Endpoint Control Reg B00h + (ep_num * 20h) + 00h*/ + uint32_t Reserved04; /* Reserved B00h + (ep_num * 20h) + 04h*/ + __IO uint32_t DOEPINT; /* dev OUT Endpoint Itr Reg B00h + (ep_num * 20h) + 08h*/ + uint32_t Reserved0C; /* Reserved B00h + (ep_num * 20h) + 0Ch*/ + __IO uint32_t DOEPTSIZ; /* dev OUT Endpoint Txfer Size B00h + (ep_num * 20h) + 10h*/ + __IO uint32_t DOEPDMA; /* dev OUT Endpoint DMA Address B00h + (ep_num * 20h) + 14h*/ + uint32_t Reserved18[2]; /* Reserved B00h + (ep_num * 20h) + 18h - B00h + (ep_num * 20h) + 1Ch*/ +} +USB_OTG_OUTEndpointTypeDef; + + +/** + * @brief __Host_Mode_Register_Structures + */ +typedef struct +{ + __IO uint32_t HCFG; /* Host Configuration Register 400h*/ + __IO uint32_t HFIR; /* Host Frame Interval Register 404h*/ + __IO uint32_t HFNUM; /* Host Frame Nbr/Frame Remaining 408h*/ + uint32_t Reserved40C; /* Reserved 40Ch*/ + __IO uint32_t HPTXSTS; /* Host Periodic Tx FIFO/ Queue Status 410h*/ + __IO uint32_t HAINT; /* Host All Channels Interrupt Register 414h*/ + __IO uint32_t HAINTMSK; /* Host All Channels Interrupt Mask 418h*/ +} +USB_OTG_HostTypeDef; + + +/** + * @brief __Host_Channel_Specific_Registers + */ +typedef struct +{ + __IO uint32_t HCCHAR; + __IO uint32_t HCSPLT; + __IO uint32_t HCINT; + __IO uint32_t HCINTMSK; + __IO uint32_t HCTSIZ; + __IO uint32_t HCDMA; + uint32_t Reserved[2]; +} +USB_OTG_HostChannelTypeDef; + + +/** + * @brief Peripheral_memory_map + */ +#define FLASH_BASE 0x08000000UL /*!< FLASH(up to 1 MB) base address in the alias region */ +#define SRAM1_BASE 0x20000000UL /*!< SRAM1(112 KB) base address in the alias region */ +#define SRAM2_BASE 0x2001C000UL /*!< SRAM2(16 KB) base address in the alias region */ +#define PERIPH_BASE 0x40000000UL /*!< Peripheral base address in the alias region */ +#define BKPSRAM_BASE 0x40024000UL /*!< Backup SRAM(4 KB) base address in the alias region */ +#define FSMC_R_BASE 0xA0000000UL /*!< FSMC registers base address */ +#define SRAM1_BB_BASE 0x22000000UL /*!< SRAM1(112 KB) base address in the bit-band region */ +#define SRAM2_BB_BASE 0x22380000UL /*!< SRAM2(16 KB) base address in the bit-band region */ +#define PERIPH_BB_BASE 0x42000000UL /*!< Peripheral base address in the bit-band region */ +#define BKPSRAM_BB_BASE 0x42480000UL /*!< Backup SRAM(4 KB) base address in the bit-band region */ +#define FLASH_END 0x080FFFFFUL /*!< FLASH end address */ +#define FLASH_OTP_BASE 0x1FFF7800UL /*!< Base address of : (up to 528 Bytes) embedded FLASH OTP Area */ +#define FLASH_OTP_END 0x1FFF7A0FUL /*!< End address of : (up to 528 Bytes) embedded FLASH OTP Area */ + +/* Legacy defines */ +#define SRAM_BASE SRAM1_BASE +#define SRAM_BB_BASE SRAM1_BB_BASE + + +/*!< Peripheral memory map */ +#define APB1PERIPH_BASE PERIPH_BASE +#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000UL) +#define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000UL) +#define AHB2PERIPH_BASE (PERIPH_BASE + 0x10000000UL) + +/*!< APB1 peripherals */ +#define TIM2_BASE (APB1PERIPH_BASE + 0x0000UL) +#define TIM3_BASE (APB1PERIPH_BASE + 0x0400UL) +#define TIM4_BASE (APB1PERIPH_BASE + 0x0800UL) +#define TIM5_BASE (APB1PERIPH_BASE + 0x0C00UL) +#define TIM6_BASE (APB1PERIPH_BASE + 0x1000UL) +#define TIM7_BASE (APB1PERIPH_BASE + 0x1400UL) +#define TIM12_BASE (APB1PERIPH_BASE + 0x1800UL) +#define TIM13_BASE (APB1PERIPH_BASE + 0x1C00UL) +#define TIM14_BASE (APB1PERIPH_BASE + 0x2000UL) +#define RTC_BASE (APB1PERIPH_BASE + 0x2800UL) +#define WWDG_BASE (APB1PERIPH_BASE + 0x2C00UL) +#define IWDG_BASE (APB1PERIPH_BASE + 0x3000UL) +#define SPI2_BASE (APB1PERIPH_BASE + 0x3800UL) +#define SPI3_BASE (APB1PERIPH_BASE + 0x3C00UL) +#define USART2_BASE (APB1PERIPH_BASE + 0x4400UL) +#define USART3_BASE (APB1PERIPH_BASE + 0x4800UL) +#define UART4_BASE (APB1PERIPH_BASE + 0x4C00UL) +#define UART5_BASE (APB1PERIPH_BASE + 0x5000UL) +#define I2C1_BASE (APB1PERIPH_BASE + 0x5400UL) +#define I2C2_BASE (APB1PERIPH_BASE + 0x5800UL) +#define I2C3_BASE (APB1PERIPH_BASE + 0x5C00UL) +#define CAN1_BASE (APB1PERIPH_BASE + 0x6400UL) +#define CAN2_BASE (APB1PERIPH_BASE + 0x6800UL) +#define PWR_BASE (APB1PERIPH_BASE + 0x7000UL) +#define DAC_BASE (APB1PERIPH_BASE + 0x7400UL) + +/*!< APB2 peripherals */ +#define TIM1_BASE (APB2PERIPH_BASE + 0x0000UL) +#define TIM8_BASE (APB2PERIPH_BASE + 0x0400UL) +#define USART1_BASE (APB2PERIPH_BASE + 0x1000UL) +#define USART6_BASE (APB2PERIPH_BASE + 0x1400UL) +#define ADC1_BASE (APB2PERIPH_BASE + 0x2000UL) +#define ADC2_BASE (APB2PERIPH_BASE + 0x2100UL) +#define ADC3_BASE (APB2PERIPH_BASE + 0x2200UL) +#define ADC123_COMMON_BASE (APB2PERIPH_BASE + 0x2300UL) +/* Legacy define */ +#define ADC_BASE ADC123_COMMON_BASE + +#define SDIO_BASE (APB2PERIPH_BASE + 0x2C00UL) +#define SPI1_BASE (APB2PERIPH_BASE + 0x3000UL) +#define SYSCFG_BASE (APB2PERIPH_BASE + 0x3800UL) +#define EXTI_BASE (APB2PERIPH_BASE + 0x3C00UL) +#define TIM9_BASE (APB2PERIPH_BASE + 0x4000UL) +#define TIM10_BASE (APB2PERIPH_BASE + 0x4400UL) +#define TIM11_BASE (APB2PERIPH_BASE + 0x4800UL) + +/*!< AHB1 peripherals */ +#define GPIOA_BASE (AHB1PERIPH_BASE + 0x0000UL) +#define GPIOB_BASE (AHB1PERIPH_BASE + 0x0400UL) +#define GPIOC_BASE (AHB1PERIPH_BASE + 0x0800UL) +#define GPIOD_BASE (AHB1PERIPH_BASE + 0x0C00UL) +#define GPIOE_BASE (AHB1PERIPH_BASE + 0x1000UL) +#define GPIOF_BASE (AHB1PERIPH_BASE + 0x1400UL) +#define GPIOG_BASE (AHB1PERIPH_BASE + 0x1800UL) +#define GPIOH_BASE (AHB1PERIPH_BASE + 0x1C00UL) +#define GPIOI_BASE (AHB1PERIPH_BASE + 0x2000UL) +#define CRC_BASE (AHB1PERIPH_BASE + 0x3000UL) +#define RCC_BASE (AHB1PERIPH_BASE + 0x3800UL) +#define FLASH_R_BASE (AHB1PERIPH_BASE + 0x3C00UL) +#define DMA1_BASE (AHB1PERIPH_BASE + 0x6000UL) +#define DMA1_Stream0_BASE (DMA1_BASE + 0x010UL) +#define DMA1_Stream1_BASE (DMA1_BASE + 0x028UL) +#define DMA1_Stream2_BASE (DMA1_BASE + 0x040UL) +#define DMA1_Stream3_BASE (DMA1_BASE + 0x058UL) +#define DMA1_Stream4_BASE (DMA1_BASE + 0x070UL) +#define DMA1_Stream5_BASE (DMA1_BASE + 0x088UL) +#define DMA1_Stream6_BASE (DMA1_BASE + 0x0A0UL) +#define DMA1_Stream7_BASE (DMA1_BASE + 0x0B8UL) +#define DMA2_BASE (AHB1PERIPH_BASE + 0x6400UL) +#define DMA2_Stream0_BASE (DMA2_BASE + 0x010UL) +#define DMA2_Stream1_BASE (DMA2_BASE + 0x028UL) +#define DMA2_Stream2_BASE (DMA2_BASE + 0x040UL) +#define DMA2_Stream3_BASE (DMA2_BASE + 0x058UL) +#define DMA2_Stream4_BASE (DMA2_BASE + 0x070UL) +#define DMA2_Stream5_BASE (DMA2_BASE + 0x088UL) +#define DMA2_Stream6_BASE (DMA2_BASE + 0x0A0UL) +#define DMA2_Stream7_BASE (DMA2_BASE + 0x0B8UL) + +/*!< AHB2 peripherals */ +#define CRYP_BASE (AHB2PERIPH_BASE + 0x60000UL) +#define HASH_BASE (AHB2PERIPH_BASE + 0x60400UL) +#define RNG_BASE (AHB2PERIPH_BASE + 0x60800UL) + +/*!< FSMC Bankx registers base address */ +#define FSMC_Bank1_R_BASE (FSMC_R_BASE + 0x0000UL) +#define FSMC_Bank1E_R_BASE (FSMC_R_BASE + 0x0104UL) +#define FSMC_Bank2_3_R_BASE (FSMC_R_BASE + 0x0060UL) +#define FSMC_Bank4_R_BASE (FSMC_R_BASE + 0x00A0UL) + +/* Debug MCU registers base address */ +#define DBGMCU_BASE 0xE0042000UL + +/*!< USB registers base address */ +#define USB_OTG_HS_PERIPH_BASE 0x40040000UL +#define USB_OTG_FS_PERIPH_BASE 0x50000000UL + +#define USB_OTG_GLOBAL_BASE 0x000UL +#define USB_OTG_DEVICE_BASE 0x800UL +#define USB_OTG_IN_ENDPOINT_BASE 0x900UL +#define USB_OTG_OUT_ENDPOINT_BASE 0xB00UL +#define USB_OTG_EP_REG_SIZE 0x20UL +#define USB_OTG_HOST_BASE 0x400UL +#define USB_OTG_HOST_PORT_BASE 0x440UL +#define USB_OTG_HOST_CHANNEL_BASE 0x500UL +#define USB_OTG_HOST_CHANNEL_SIZE 0x20UL +#define USB_OTG_PCGCCTL_BASE 0xE00UL +#define USB_OTG_FIFO_BASE 0x1000UL +#define USB_OTG_FIFO_SIZE 0x1000UL + +/******************* Device electronic signature ***************/ +#define UID_BASE 0x1FFF7A10UL /*!< Unique device ID register base address */ +#define FLASHSIZE_BASE 0x1FFF7A22UL /*!< FLASH Size register base address */ + +/** + * @} + */ + +/** @addtogroup Peripheral_declaration + * @{ + */ +#define TIM2 ((TIM_TypeDef *) TIM2_BASE) +#define TIM3 ((TIM_TypeDef *) TIM3_BASE) +#define TIM4 ((TIM_TypeDef *) TIM4_BASE) +#define TIM5 ((TIM_TypeDef *) TIM5_BASE) +#define TIM6 ((TIM_TypeDef *) TIM6_BASE) +#define TIM7 ((TIM_TypeDef *) TIM7_BASE) +#define TIM12 ((TIM_TypeDef *) TIM12_BASE) +#define TIM13 ((TIM_TypeDef *) TIM13_BASE) +#define TIM14 ((TIM_TypeDef *) TIM14_BASE) +#define RTC ((RTC_TypeDef *) RTC_BASE) +#define WWDG ((WWDG_TypeDef *) WWDG_BASE) +#define IWDG ((IWDG_TypeDef *) IWDG_BASE) +#define SPI2 ((SPI_TypeDef *) SPI2_BASE) +#define SPI3 ((SPI_TypeDef *) SPI3_BASE) +#define USART2 ((USART_TypeDef *) USART2_BASE) +#define USART3 ((USART_TypeDef *) USART3_BASE) +#define UART4 ((USART_TypeDef *) UART4_BASE) +#define UART5 ((USART_TypeDef *) UART5_BASE) +#define I2C1 ((I2C_TypeDef *) I2C1_BASE) +#define I2C2 ((I2C_TypeDef *) I2C2_BASE) +#define I2C3 ((I2C_TypeDef *) I2C3_BASE) +#define CAN1 ((CAN_TypeDef *) CAN1_BASE) +#define CAN2 ((CAN_TypeDef *) CAN2_BASE) +#define PWR ((PWR_TypeDef *) PWR_BASE) +#define DAC1 ((DAC_TypeDef *) DAC_BASE) +#define DAC ((DAC_TypeDef *) DAC_BASE) /* Kept for legacy purpose */ +#define TIM1 ((TIM_TypeDef *) TIM1_BASE) +#define TIM8 ((TIM_TypeDef *) TIM8_BASE) +#define USART1 ((USART_TypeDef *) USART1_BASE) +#define USART6 ((USART_TypeDef *) USART6_BASE) +#define ADC1 ((ADC_TypeDef *) ADC1_BASE) +#define ADC2 ((ADC_TypeDef *) ADC2_BASE) +#define ADC3 ((ADC_TypeDef *) ADC3_BASE) +#define ADC123_COMMON ((ADC_Common_TypeDef *) ADC123_COMMON_BASE) +/* Legacy define */ +#define ADC ADC123_COMMON +#define SDIO ((SDIO_TypeDef *) SDIO_BASE) +#define SPI1 ((SPI_TypeDef *) SPI1_BASE) +#define SYSCFG ((SYSCFG_TypeDef *) SYSCFG_BASE) +#define EXTI ((EXTI_TypeDef *) EXTI_BASE) +#define TIM9 ((TIM_TypeDef *) TIM9_BASE) +#define TIM10 ((TIM_TypeDef *) TIM10_BASE) +#define TIM11 ((TIM_TypeDef *) TIM11_BASE) +#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) +#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE) +#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE) +#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE) +#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE) +#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE) +#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE) +#define GPIOH ((GPIO_TypeDef *) GPIOH_BASE) +#define GPIOI ((GPIO_TypeDef *) GPIOI_BASE) +#define CRC ((CRC_TypeDef *) CRC_BASE) +#define RCC ((RCC_TypeDef *) RCC_BASE) +#define FLASH ((FLASH_TypeDef *) FLASH_R_BASE) +#define DMA1 ((DMA_TypeDef *) DMA1_BASE) +#define DMA1_Stream0 ((DMA_Stream_TypeDef *) DMA1_Stream0_BASE) +#define DMA1_Stream1 ((DMA_Stream_TypeDef *) DMA1_Stream1_BASE) +#define DMA1_Stream2 ((DMA_Stream_TypeDef *) DMA1_Stream2_BASE) +#define DMA1_Stream3 ((DMA_Stream_TypeDef *) DMA1_Stream3_BASE) +#define DMA1_Stream4 ((DMA_Stream_TypeDef *) DMA1_Stream4_BASE) +#define DMA1_Stream5 ((DMA_Stream_TypeDef *) DMA1_Stream5_BASE) +#define DMA1_Stream6 ((DMA_Stream_TypeDef *) DMA1_Stream6_BASE) +#define DMA1_Stream7 ((DMA_Stream_TypeDef *) DMA1_Stream7_BASE) +#define DMA2 ((DMA_TypeDef *) DMA2_BASE) +#define DMA2_Stream0 ((DMA_Stream_TypeDef *) DMA2_Stream0_BASE) +#define DMA2_Stream1 ((DMA_Stream_TypeDef *) DMA2_Stream1_BASE) +#define DMA2_Stream2 ((DMA_Stream_TypeDef *) DMA2_Stream2_BASE) +#define DMA2_Stream3 ((DMA_Stream_TypeDef *) DMA2_Stream3_BASE) +#define DMA2_Stream4 ((DMA_Stream_TypeDef *) DMA2_Stream4_BASE) +#define DMA2_Stream5 ((DMA_Stream_TypeDef *) DMA2_Stream5_BASE) +#define DMA2_Stream6 ((DMA_Stream_TypeDef *) DMA2_Stream6_BASE) +#define DMA2_Stream7 ((DMA_Stream_TypeDef *) DMA2_Stream7_BASE) +#define CRYP ((CRYP_TypeDef *) CRYP_BASE) +#define HASH ((HASH_TypeDef *) HASH_BASE) +#define RNG ((RNG_TypeDef *) RNG_BASE) +#define FSMC_Bank1 ((FSMC_Bank1_TypeDef *) FSMC_Bank1_R_BASE) +#define FSMC_Bank1E ((FSMC_Bank1E_TypeDef *) FSMC_Bank1E_R_BASE) +#define FSMC_Bank2_3 ((FSMC_Bank2_3_TypeDef *) FSMC_Bank2_3_R_BASE) +#define FSMC_Bank4 ((FSMC_Bank4_TypeDef *) FSMC_Bank4_R_BASE) + +#define DBGMCU ((DBGMCU_TypeDef *) DBGMCU_BASE) + +#define USB_OTG_FS ((USB_OTG_GlobalTypeDef *) USB_OTG_FS_PERIPH_BASE) +#define USB_OTG_HS ((USB_OTG_GlobalTypeDef *) USB_OTG_HS_PERIPH_BASE) + +/** + * @} + */ + +/** @addtogroup Exported_constants + * @{ + */ + + /** @addtogroup Peripheral_Registers_Bits_Definition + * @{ + */ + +/******************************************************************************/ +/* Peripheral Registers_Bits_Definition */ +/******************************************************************************/ + +/******************************************************************************/ +/* */ +/* Analog to Digital Converter */ +/* */ +/******************************************************************************/ +/******************** Bit definition for ADC_SR register ********************/ +#define ADC_SR_AWD_Pos (0U) +#define ADC_SR_AWD_Msk (0x1UL << ADC_SR_AWD_Pos) /*!< 0x00000001 */ +#define ADC_SR_AWD ADC_SR_AWD_Msk /*!
© Copyright (c) 2017 STMicroelectronics. + * All rights reserved.
+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS_Device + * @{ + */ + +/** @addtogroup stm32f217xx + * @{ + */ + +#ifndef __STM32F217xx_H +#define __STM32F217xx_H + +#ifdef __cplusplus + extern "C" { +#endif /* __cplusplus */ + +/** @addtogroup Configuration_section_for_CMSIS + * @{ + */ + +/** + * @brief Configuration of the Cortex-M3 Processor and Core Peripherals + */ +#define __CM3_REV 0x0200U /*!< Core revision r0p1 */ +#define __MPU_PRESENT 1U /*!< STM32F2XX provides an MPU */ +#define __NVIC_PRIO_BITS 4U /*!< STM32F2XX uses 4 Bits for the Priority Levels */ +#define __Vendor_SysTickConfig 0U /*!< Set to 1 if different SysTick Config is used */ + +/** + * @} + */ + +/** @addtogroup Peripheral_interrupt_number_definition + * @{ + */ + +/** + * @brief STM32F2XX Interrupt Number Definition, according to the selected device + * in @ref Library_configuration_section + */ +typedef enum +{ +/****** Cortex-M3 Processor Exceptions Numbers ****************************************************************/ + NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ + HardFault_IRQn = -13, /*!< 3 Hard Fault Interrupt */ + MemoryManagement_IRQn = -12, /*!< 4 Cortex-M3 Memory Management Interrupt */ + BusFault_IRQn = -11, /*!< 5 Cortex-M3 Bus Fault Interrupt */ + UsageFault_IRQn = -10, /*!< 6 Cortex-M3 Usage Fault Interrupt */ + SVCall_IRQn = -5, /*!< 11 Cortex-M3 SV Call Interrupt */ + DebugMonitor_IRQn = -4, /*!< 12 Cortex-M3 Debug Monitor Interrupt */ + PendSV_IRQn = -2, /*!< 14 Cortex-M3 Pend SV Interrupt */ + SysTick_IRQn = -1, /*!< 15 Cortex-M3 System Tick Interrupt */ +/****** STM32 specific Interrupt Numbers **********************************************************************/ + WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */ + PVD_IRQn = 1, /*!< PVD through EXTI Line detection Interrupt */ + TAMP_STAMP_IRQn = 2, /*!< Tamper and TimeStamp interrupts through the EXTI line */ + RTC_WKUP_IRQn = 3, /*!< RTC Wakeup interrupt through the EXTI line */ + FLASH_IRQn = 4, /*!< FLASH global Interrupt */ + RCC_IRQn = 5, /*!< RCC global Interrupt */ + EXTI0_IRQn = 6, /*!< EXTI Line0 Interrupt */ + EXTI1_IRQn = 7, /*!< EXTI Line1 Interrupt */ + EXTI2_IRQn = 8, /*!< EXTI Line2 Interrupt */ + EXTI3_IRQn = 9, /*!< EXTI Line3 Interrupt */ + EXTI4_IRQn = 10, /*!< EXTI Line4 Interrupt */ + DMA1_Stream0_IRQn = 11, /*!< DMA1 Stream 0 global Interrupt */ + DMA1_Stream1_IRQn = 12, /*!< DMA1 Stream 1 global Interrupt */ + DMA1_Stream2_IRQn = 13, /*!< DMA1 Stream 2 global Interrupt */ + DMA1_Stream3_IRQn = 14, /*!< DMA1 Stream 3 global Interrupt */ + DMA1_Stream4_IRQn = 15, /*!< DMA1 Stream 4 global Interrupt */ + DMA1_Stream5_IRQn = 16, /*!< DMA1 Stream 5 global Interrupt */ + DMA1_Stream6_IRQn = 17, /*!< DMA1 Stream 6 global Interrupt */ + ADC_IRQn = 18, /*!< ADC1, ADC2 and ADC3 global Interrupts */ + CAN1_TX_IRQn = 19, /*!< CAN1 TX Interrupt */ + CAN1_RX0_IRQn = 20, /*!< CAN1 RX0 Interrupt */ + CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ + CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ + EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TIM1_BRK_TIM9_IRQn = 24, /*!< TIM1 Break interrupt and TIM9 global interrupt */ + TIM1_UP_TIM10_IRQn = 25, /*!< TIM1 Update Interrupt and TIM10 global interrupt */ + TIM1_TRG_COM_TIM11_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt and TIM11 global interrupt */ + TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ + TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ + TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ + TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ + I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + USART3_IRQn = 39, /*!< USART3 global Interrupt */ + EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTC_Alarm_IRQn = 41, /*!< RTC Alarm (A and B) through EXTI Line Interrupt */ + OTG_FS_WKUP_IRQn = 42, /*!< USB OTG FS Wakeup through EXTI line interrupt */ + TIM8_BRK_TIM12_IRQn = 43, /*!< TIM8 Break Interrupt and TIM12 global interrupt */ + TIM8_UP_TIM13_IRQn = 44, /*!< TIM8 Update Interrupt and TIM13 global interrupt */ + TIM8_TRG_COM_TIM14_IRQn = 45, /*!< TIM8 Trigger and Commutation Interrupt and TIM14 global interrupt */ + TIM8_CC_IRQn = 46, /*!< TIM8 Capture Compare Interrupt */ + DMA1_Stream7_IRQn = 47, /*!< DMA1 Stream7 Interrupt */ + FSMC_IRQn = 48, /*!< FSMC global Interrupt */ + SDIO_IRQn = 49, /*!< SDIO global Interrupt */ + TIM5_IRQn = 50, /*!< TIM5 global Interrupt */ + SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ + UART4_IRQn = 52, /*!< UART4 global Interrupt */ + UART5_IRQn = 53, /*!< UART5 global Interrupt */ + TIM6_DAC_IRQn = 54, /*!< TIM6 global and DAC1&2 underrun error interrupts */ + TIM7_IRQn = 55, /*!< TIM7 global interrupt */ + DMA2_Stream0_IRQn = 56, /*!< DMA2 Stream 0 global Interrupt */ + DMA2_Stream1_IRQn = 57, /*!< DMA2 Stream 1 global Interrupt */ + DMA2_Stream2_IRQn = 58, /*!< DMA2 Stream 2 global Interrupt */ + DMA2_Stream3_IRQn = 59, /*!< DMA2 Stream 3 global Interrupt */ + DMA2_Stream4_IRQn = 60, /*!< DMA2 Stream 4 global Interrupt */ + ETH_IRQn = 61, /*!< Ethernet global Interrupt */ + ETH_WKUP_IRQn = 62, /*!< Ethernet Wakeup through EXTI line Interrupt */ + CAN2_TX_IRQn = 63, /*!< CAN2 TX Interrupt */ + CAN2_RX0_IRQn = 64, /*!< CAN2 RX0 Interrupt */ + CAN2_RX1_IRQn = 65, /*!< CAN2 RX1 Interrupt */ + CAN2_SCE_IRQn = 66, /*!< CAN2 SCE Interrupt */ + OTG_FS_IRQn = 67, /*!< USB OTG FS global Interrupt */ + DMA2_Stream5_IRQn = 68, /*!< DMA2 Stream 5 global interrupt */ + DMA2_Stream6_IRQn = 69, /*!< DMA2 Stream 6 global interrupt */ + DMA2_Stream7_IRQn = 70, /*!< DMA2 Stream 7 global interrupt */ + USART6_IRQn = 71, /*!< USART6 global interrupt */ + I2C3_EV_IRQn = 72, /*!< I2C3 event interrupt */ + I2C3_ER_IRQn = 73, /*!< I2C3 error interrupt */ + OTG_HS_EP1_OUT_IRQn = 74, /*!< USB OTG HS End Point 1 Out global interrupt */ + OTG_HS_EP1_IN_IRQn = 75, /*!< USB OTG HS End Point 1 In global interrupt */ + OTG_HS_WKUP_IRQn = 76, /*!< USB OTG HS Wakeup through EXTI interrupt */ + OTG_HS_IRQn = 77, /*!< USB OTG HS global interrupt */ + DCMI_IRQn = 78, /*!< DCMI global interrupt */ + CRYP_IRQn = 79, /*!< CRYP crypto global interrupt */ + HASH_RNG_IRQn = 80 /*!< Hash and Rng global interrupt */ +} IRQn_Type; + +/** + * @} + */ + +#include "core_cm3.h" +#include "system_stm32f2xx.h" +#include + +/** @addtogroup Peripheral_registers_structures + * @{ + */ + +/** + * @brief Analog to Digital Converter + */ + +typedef struct +{ + __IO uint32_t SR; /*!< ADC status register, Address offset: 0x00 */ + __IO uint32_t CR1; /*!< ADC control register 1, Address offset: 0x04 */ + __IO uint32_t CR2; /*!< ADC control register 2, Address offset: 0x08 */ + __IO uint32_t SMPR1; /*!< ADC sample time register 1, Address offset: 0x0C */ + __IO uint32_t SMPR2; /*!< ADC sample time register 2, Address offset: 0x10 */ + __IO uint32_t JOFR1; /*!< ADC injected channel data offset register 1, Address offset: 0x14 */ + __IO uint32_t JOFR2; /*!< ADC injected channel data offset register 2, Address offset: 0x18 */ + __IO uint32_t JOFR3; /*!< ADC injected channel data offset register 3, Address offset: 0x1C */ + __IO uint32_t JOFR4; /*!< ADC injected channel data offset register 4, Address offset: 0x20 */ + __IO uint32_t HTR; /*!< ADC watchdog higher threshold register, Address offset: 0x24 */ + __IO uint32_t LTR; /*!< ADC watchdog lower threshold register, Address offset: 0x28 */ + __IO uint32_t SQR1; /*!< ADC regular sequence register 1, Address offset: 0x2C */ + __IO uint32_t SQR2; /*!< ADC regular sequence register 2, Address offset: 0x30 */ + __IO uint32_t SQR3; /*!< ADC regular sequence register 3, Address offset: 0x34 */ + __IO uint32_t JSQR; /*!< ADC injected sequence register, Address offset: 0x38*/ + __IO uint32_t JDR1; /*!< ADC injected data register 1, Address offset: 0x3C */ + __IO uint32_t JDR2; /*!< ADC injected data register 2, Address offset: 0x40 */ + __IO uint32_t JDR3; /*!< ADC injected data register 3, Address offset: 0x44 */ + __IO uint32_t JDR4; /*!< ADC injected data register 4, Address offset: 0x48 */ + __IO uint32_t DR; /*!< ADC regular data register, Address offset: 0x4C */ +} ADC_TypeDef; + +typedef struct +{ + __IO uint32_t CSR; /*!< ADC Common status register, Address offset: ADC1 base address + 0x300 */ + __IO uint32_t CCR; /*!< ADC common control register, Address offset: ADC1 base address + 0x304 */ + __IO uint32_t CDR; /*!< ADC common regular data register for dual + AND triple modes, Address offset: ADC1 base address + 0x308 */ +} ADC_Common_TypeDef; + + +/** + * @brief Controller Area Network TxMailBox + */ + +typedef struct +{ + __IO uint32_t TIR; /*!< CAN TX mailbox identifier register */ + __IO uint32_t TDTR; /*!< CAN mailbox data length control and time stamp register */ + __IO uint32_t TDLR; /*!< CAN mailbox data low register */ + __IO uint32_t TDHR; /*!< CAN mailbox data high register */ +} CAN_TxMailBox_TypeDef; + +/** + * @brief Controller Area Network FIFOMailBox + */ + +typedef struct +{ + __IO uint32_t RIR; /*!< CAN receive FIFO mailbox identifier register */ + __IO uint32_t RDTR; /*!< CAN receive FIFO mailbox data length control and time stamp register */ + __IO uint32_t RDLR; /*!< CAN receive FIFO mailbox data low register */ + __IO uint32_t RDHR; /*!< CAN receive FIFO mailbox data high register */ +} CAN_FIFOMailBox_TypeDef; + +/** + * @brief Controller Area Network FilterRegister + */ + +typedef struct +{ + __IO uint32_t FR1; /*!< CAN Filter bank register 1 */ + __IO uint32_t FR2; /*!< CAN Filter bank register 1 */ +} CAN_FilterRegister_TypeDef; + +/** + * @brief Controller Area Network + */ + +typedef struct +{ + __IO uint32_t MCR; /*!< CAN master control register, Address offset: 0x00 */ + __IO uint32_t MSR; /*!< CAN master status register, Address offset: 0x04 */ + __IO uint32_t TSR; /*!< CAN transmit status register, Address offset: 0x08 */ + __IO uint32_t RF0R; /*!< CAN receive FIFO 0 register, Address offset: 0x0C */ + __IO uint32_t RF1R; /*!< CAN receive FIFO 1 register, Address offset: 0x10 */ + __IO uint32_t IER; /*!< CAN interrupt enable register, Address offset: 0x14 */ + __IO uint32_t ESR; /*!< CAN error status register, Address offset: 0x18 */ + __IO uint32_t BTR; /*!< CAN bit timing register, Address offset: 0x1C */ + uint32_t RESERVED0[88]; /*!< Reserved, 0x020 - 0x17F */ + CAN_TxMailBox_TypeDef sTxMailBox[3]; /*!< CAN Tx MailBox, Address offset: 0x180 - 0x1AC */ + CAN_FIFOMailBox_TypeDef sFIFOMailBox[2]; /*!< CAN FIFO MailBox, Address offset: 0x1B0 - 0x1CC */ + uint32_t RESERVED1[12]; /*!< Reserved, 0x1D0 - 0x1FF */ + __IO uint32_t FMR; /*!< CAN filter master register, Address offset: 0x200 */ + __IO uint32_t FM1R; /*!< CAN filter mode register, Address offset: 0x204 */ + uint32_t RESERVED2; /*!< Reserved, 0x208 */ + __IO uint32_t FS1R; /*!< CAN filter scale register, Address offset: 0x20C */ + uint32_t RESERVED3; /*!< Reserved, 0x210 */ + __IO uint32_t FFA1R; /*!< CAN filter FIFO assignment register, Address offset: 0x214 */ + uint32_t RESERVED4; /*!< Reserved, 0x218 */ + __IO uint32_t FA1R; /*!< CAN filter activation register, Address offset: 0x21C */ + uint32_t RESERVED5[8]; /*!< Reserved, 0x220-0x23F */ + CAN_FilterRegister_TypeDef sFilterRegister[28]; /*!< CAN Filter Register, Address offset: 0x240-0x31C */ +} CAN_TypeDef; + +/** + * @brief CRC calculation unit + */ + +typedef struct +{ + __IO uint32_t DR; /*!< CRC Data register, Address offset: 0x00 */ + __IO uint8_t IDR; /*!< CRC Independent data register, Address offset: 0x04 */ + uint8_t RESERVED0; /*!< Reserved, 0x05 */ + uint16_t RESERVED1; /*!< Reserved, 0x06 */ + __IO uint32_t CR; /*!< CRC Control register, Address offset: 0x08 */ +} CRC_TypeDef; + +/** + * @brief Digital to Analog Converter + */ + +typedef struct +{ + __IO uint32_t CR; /*!< DAC control register, Address offset: 0x00 */ + __IO uint32_t SWTRIGR; /*!< DAC software trigger register, Address offset: 0x04 */ + __IO uint32_t DHR12R1; /*!< DAC channel1 12-bit right-aligned data holding register, Address offset: 0x08 */ + __IO uint32_t DHR12L1; /*!< DAC channel1 12-bit left aligned data holding register, Address offset: 0x0C */ + __IO uint32_t DHR8R1; /*!< DAC channel1 8-bit right aligned data holding register, Address offset: 0x10 */ + __IO uint32_t DHR12R2; /*!< DAC channel2 12-bit right aligned data holding register, Address offset: 0x14 */ + __IO uint32_t DHR12L2; /*!< DAC channel2 12-bit left aligned data holding register, Address offset: 0x18 */ + __IO uint32_t DHR8R2; /*!< DAC channel2 8-bit right-aligned data holding register, Address offset: 0x1C */ + __IO uint32_t DHR12RD; /*!< Dual DAC 12-bit right-aligned data holding register, Address offset: 0x20 */ + __IO uint32_t DHR12LD; /*!< DUAL DAC 12-bit left aligned data holding register, Address offset: 0x24 */ + __IO uint32_t DHR8RD; /*!< DUAL DAC 8-bit right aligned data holding register, Address offset: 0x28 */ + __IO uint32_t DOR1; /*!< DAC channel1 data output register, Address offset: 0x2C */ + __IO uint32_t DOR2; /*!< DAC channel2 data output register, Address offset: 0x30 */ + __IO uint32_t SR; /*!< DAC status register, Address offset: 0x34 */ +} DAC_TypeDef; + +/** + * @brief Debug MCU + */ + +typedef struct +{ + __IO uint32_t IDCODE; /*!< MCU device ID code, Address offset: 0x00 */ + __IO uint32_t CR; /*!< Debug MCU configuration register, Address offset: 0x04 */ + __IO uint32_t APB1FZ; /*!< Debug MCU APB1 freeze register, Address offset: 0x08 */ + __IO uint32_t APB2FZ; /*!< Debug MCU APB2 freeze register, Address offset: 0x0C */ +}DBGMCU_TypeDef; + +/** + * @brief DCMI + */ + +typedef struct +{ + __IO uint32_t CR; /*!< DCMI control register 1, Address offset: 0x00 */ + __IO uint32_t SR; /*!< DCMI status register, Address offset: 0x04 */ + __IO uint32_t RISR; /*!< DCMI raw interrupt status register, Address offset: 0x08 */ + __IO uint32_t IER; /*!< DCMI interrupt enable register, Address offset: 0x0C */ + __IO uint32_t MISR; /*!< DCMI masked interrupt status register, Address offset: 0x10 */ + __IO uint32_t ICR; /*!< DCMI interrupt clear register, Address offset: 0x14 */ + __IO uint32_t ESCR; /*!< DCMI embedded synchronization code register, Address offset: 0x18 */ + __IO uint32_t ESUR; /*!< DCMI embedded synchronization unmask register, Address offset: 0x1C */ + __IO uint32_t CWSTRTR; /*!< DCMI crop window start, Address offset: 0x20 */ + __IO uint32_t CWSIZER; /*!< DCMI crop window size, Address offset: 0x24 */ + __IO uint32_t DR; /*!< DCMI data register, Address offset: 0x28 */ +} DCMI_TypeDef; + +/** + * @brief DMA Controller + */ + +typedef struct +{ + __IO uint32_t CR; /*!< DMA stream x configuration register */ + __IO uint32_t NDTR; /*!< DMA stream x number of data register */ + __IO uint32_t PAR; /*!< DMA stream x peripheral address register */ + __IO uint32_t M0AR; /*!< DMA stream x memory 0 address register */ + __IO uint32_t M1AR; /*!< DMA stream x memory 1 address register */ + __IO uint32_t FCR; /*!< DMA stream x FIFO control register */ +} DMA_Stream_TypeDef; + +typedef struct +{ + __IO uint32_t LISR; /*!< DMA low interrupt status register, Address offset: 0x00 */ + __IO uint32_t HISR; /*!< DMA high interrupt status register, Address offset: 0x04 */ + __IO uint32_t LIFCR; /*!< DMA low interrupt flag clear register, Address offset: 0x08 */ + __IO uint32_t HIFCR; /*!< DMA high interrupt flag clear register, Address offset: 0x0C */ +} DMA_TypeDef; + + +/** + * @brief Ethernet MAC + */ + +typedef struct +{ + __IO uint32_t MACCR; + __IO uint32_t MACFFR; + __IO uint32_t MACHTHR; + __IO uint32_t MACHTLR; + __IO uint32_t MACMIIAR; + __IO uint32_t MACMIIDR; + __IO uint32_t MACFCR; + __IO uint32_t MACVLANTR; /* 8 */ + uint32_t RESERVED0[2]; + __IO uint32_t MACRWUFFR; /* 11 */ + __IO uint32_t MACPMTCSR; + uint32_t RESERVED1; + __IO uint32_t MACDBGR; + __IO uint32_t MACSR; /* 15 */ + __IO uint32_t MACIMR; + __IO uint32_t MACA0HR; + __IO uint32_t MACA0LR; + __IO uint32_t MACA1HR; + __IO uint32_t MACA1LR; + __IO uint32_t MACA2HR; + __IO uint32_t MACA2LR; + __IO uint32_t MACA3HR; + __IO uint32_t MACA3LR; /* 24 */ + uint32_t RESERVED2[40]; + __IO uint32_t MMCCR; /* 65 */ + __IO uint32_t MMCRIR; + __IO uint32_t MMCTIR; + __IO uint32_t MMCRIMR; + __IO uint32_t MMCTIMR; /* 69 */ + uint32_t RESERVED3[14]; + __IO uint32_t MMCTGFSCCR; /* 84 */ + __IO uint32_t MMCTGFMSCCR; + uint32_t RESERVED4[5]; + __IO uint32_t MMCTGFCR; + uint32_t RESERVED5[10]; + __IO uint32_t MMCRFCECR; + __IO uint32_t MMCRFAECR; + uint32_t RESERVED6[10]; + __IO uint32_t MMCRGUFCR; + uint32_t RESERVED7[334]; + __IO uint32_t PTPTSCR; + __IO uint32_t PTPSSIR; + __IO uint32_t PTPTSHR; + __IO uint32_t PTPTSLR; + __IO uint32_t PTPTSHUR; + __IO uint32_t PTPTSLUR; + __IO uint32_t PTPTSAR; + __IO uint32_t PTPTTHR; + __IO uint32_t PTPTTLR; + __IO uint32_t RESERVED8; + __IO uint32_t PTPTSSR; + uint32_t RESERVED9[565]; + __IO uint32_t DMABMR; + __IO uint32_t DMATPDR; + __IO uint32_t DMARPDR; + __IO uint32_t DMARDLAR; + __IO uint32_t DMATDLAR; + __IO uint32_t DMASR; + __IO uint32_t DMAOMR; + __IO uint32_t DMAIER; + __IO uint32_t DMAMFBOCR; + __IO uint32_t DMARSWTR; + uint32_t RESERVED10[8]; + __IO uint32_t DMACHTDR; + __IO uint32_t DMACHRDR; + __IO uint32_t DMACHTBAR; + __IO uint32_t DMACHRBAR; +} ETH_TypeDef; + +/** + * @brief External Interrupt/Event Controller + */ + +typedef struct +{ + __IO uint32_t IMR; /*!< EXTI Interrupt mask register, Address offset: 0x00 */ + __IO uint32_t EMR; /*!< EXTI Event mask register, Address offset: 0x04 */ + __IO uint32_t RTSR; /*!< EXTI Rising trigger selection register, Address offset: 0x08 */ + __IO uint32_t FTSR; /*!< EXTI Falling trigger selection register, Address offset: 0x0C */ + __IO uint32_t SWIER; /*!< EXTI Software interrupt event register, Address offset: 0x10 */ + __IO uint32_t PR; /*!< EXTI Pending register, Address offset: 0x14 */ +} EXTI_TypeDef; + +/** + * @brief FLASH Registers + */ + +typedef struct +{ + __IO uint32_t ACR; /*!< FLASH access control register, Address offset: 0x00 */ + __IO uint32_t KEYR; /*!< FLASH key register, Address offset: 0x04 */ + __IO uint32_t OPTKEYR; /*!< FLASH option key register, Address offset: 0x08 */ + __IO uint32_t SR; /*!< FLASH status register, Address offset: 0x0C */ + __IO uint32_t CR; /*!< FLASH control register, Address offset: 0x10 */ + __IO uint32_t OPTCR; /*!< FLASH option control register, Address offset: 0x14 */ +} FLASH_TypeDef; + + +/** + * @brief Flexible Static Memory Controller + */ + +typedef struct +{ + __IO uint32_t BTCR[8]; /*!< NOR/PSRAM chip-select control register(BCR) and chip-select timing register(BTR), Address offset: 0x00-1C */ +} FSMC_Bank1_TypeDef; + +/** + * @brief Flexible Static Memory Controller Bank1E + */ + +typedef struct +{ + __IO uint32_t BWTR[7]; /*!< NOR/PSRAM write timing registers, Address offset: 0x104-0x11C */ +} FSMC_Bank1E_TypeDef; + +/** + * @brief Flexible Static Memory Controller Bank2 + */ + +typedef struct +{ + __IO uint32_t PCR2; /*!< NAND Flash control register 2, Address offset: 0x60 */ + __IO uint32_t SR2; /*!< NAND Flash FIFO status and interrupt register 2, Address offset: 0x64 */ + __IO uint32_t PMEM2; /*!< NAND Flash Common memory space timing register 2, Address offset: 0x68 */ + __IO uint32_t PATT2; /*!< NAND Flash Attribute memory space timing register 2, Address offset: 0x6C */ + uint32_t RESERVED0; /*!< Reserved, 0x70 */ + __IO uint32_t ECCR2; /*!< NAND Flash ECC result registers 2, Address offset: 0x74 */ + uint32_t RESERVED1; /*!< Reserved, 0x78 */ + uint32_t RESERVED2; /*!< Reserved, 0x7C */ + __IO uint32_t PCR3; /*!< NAND Flash control register 3, Address offset: 0x80 */ + __IO uint32_t SR3; /*!< NAND Flash FIFO status and interrupt register 3, Address offset: 0x84 */ + __IO uint32_t PMEM3; /*!< NAND Flash Common memory space timing register 3, Address offset: 0x88 */ + __IO uint32_t PATT3; /*!< NAND Flash Attribute memory space timing register 3, Address offset: 0x8C */ + uint32_t RESERVED3; /*!< Reserved, 0x90 */ + __IO uint32_t ECCR3; /*!< NAND Flash ECC result registers 3, Address offset: 0x94 */ +} FSMC_Bank2_3_TypeDef; + +/** + * @brief Flexible Static Memory Controller Bank4 + */ + +typedef struct +{ + __IO uint32_t PCR4; /*!< PC Card control register 4, Address offset: 0xA0 */ + __IO uint32_t SR4; /*!< PC Card FIFO status and interrupt register 4, Address offset: 0xA4 */ + __IO uint32_t PMEM4; /*!< PC Card Common memory space timing register 4, Address offset: 0xA8 */ + __IO uint32_t PATT4; /*!< PC Card Attribute memory space timing register 4, Address offset: 0xAC */ + __IO uint32_t PIO4; /*!< PC Card I/O space timing register 4, Address offset: 0xB0 */ +} FSMC_Bank4_TypeDef; + + +/** + * @brief General Purpose I/O + */ + +typedef struct +{ + __IO uint32_t MODER; /*!< GPIO port mode register, Address offset: 0x00 */ + __IO uint32_t OTYPER; /*!< GPIO port output type register, Address offset: 0x04 */ + __IO uint32_t OSPEEDR; /*!< GPIO port output speed register, Address offset: 0x08 */ + __IO uint32_t PUPDR; /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */ + __IO uint32_t IDR; /*!< GPIO port input data register, Address offset: 0x10 */ + __IO uint32_t ODR; /*!< GPIO port output data register, Address offset: 0x14 */ + __IO uint32_t BSRR; /*!< GPIO port bit set/reset register, Address offset: 0x18 */ + __IO uint32_t LCKR; /*!< GPIO port configuration lock register, Address offset: 0x1C */ + __IO uint32_t AFR[2]; /*!< GPIO alternate function registers, Address offset: 0x20-0x24 */ +} GPIO_TypeDef; + +/** + * @brief System configuration controller + */ + +typedef struct +{ + __IO uint32_t MEMRMP; /*!< SYSCFG memory remap register, Address offset: 0x00 */ + __IO uint32_t PMC; /*!< SYSCFG peripheral mode configuration register, Address offset: 0x04 */ + __IO uint32_t EXTICR[4]; /*!< SYSCFG external interrupt configuration registers, Address offset: 0x08-0x14 */ + uint32_t RESERVED[2]; /*!< Reserved, 0x18-0x1C */ + __IO uint32_t CMPCR; /*!< SYSCFG Compensation cell control register, Address offset: 0x20 */ +} SYSCFG_TypeDef; + +/** + * @brief Inter-integrated Circuit Interface + */ + +typedef struct +{ + __IO uint32_t CR1; /*!< I2C Control register 1, Address offset: 0x00 */ + __IO uint32_t CR2; /*!< I2C Control register 2, Address offset: 0x04 */ + __IO uint32_t OAR1; /*!< I2C Own address register 1, Address offset: 0x08 */ + __IO uint32_t OAR2; /*!< I2C Own address register 2, Address offset: 0x0C */ + __IO uint32_t DR; /*!< I2C Data register, Address offset: 0x10 */ + __IO uint32_t SR1; /*!< I2C Status register 1, Address offset: 0x14 */ + __IO uint32_t SR2; /*!< I2C Status register 2, Address offset: 0x18 */ + __IO uint32_t CCR; /*!< I2C Clock control register, Address offset: 0x1C */ + __IO uint32_t TRISE; /*!< I2C TRISE register, Address offset: 0x20 */ +} I2C_TypeDef; + +/** + * @brief Independent WATCHDOG + */ + +typedef struct +{ + __IO uint32_t KR; /*!< IWDG Key register, Address offset: 0x00 */ + __IO uint32_t PR; /*!< IWDG Prescaler register, Address offset: 0x04 */ + __IO uint32_t RLR; /*!< IWDG Reload register, Address offset: 0x08 */ + __IO uint32_t SR; /*!< IWDG Status register, Address offset: 0x0C */ +} IWDG_TypeDef; + +/** + * @brief Power Control + */ + +typedef struct +{ + __IO uint32_t CR; /*!< PWR power control register, Address offset: 0x00 */ + __IO uint32_t CSR; /*!< PWR power control/status register, Address offset: 0x04 */ +} PWR_TypeDef; + +/** + * @brief Reset and Clock Control + */ + +typedef struct +{ + __IO uint32_t CR; /*!< RCC clock control register, Address offset: 0x00 */ + __IO uint32_t PLLCFGR; /*!< RCC PLL configuration register, Address offset: 0x04 */ + __IO uint32_t CFGR; /*!< RCC clock configuration register, Address offset: 0x08 */ + __IO uint32_t CIR; /*!< RCC clock interrupt register, Address offset: 0x0C */ + __IO uint32_t AHB1RSTR; /*!< RCC AHB1 peripheral reset register, Address offset: 0x10 */ + __IO uint32_t AHB2RSTR; /*!< RCC AHB2 peripheral reset register, Address offset: 0x14 */ + __IO uint32_t AHB3RSTR; /*!< RCC AHB3 peripheral reset register, Address offset: 0x18 */ + uint32_t RESERVED0; /*!< Reserved, 0x1C */ + __IO uint32_t APB1RSTR; /*!< RCC APB1 peripheral reset register, Address offset: 0x20 */ + __IO uint32_t APB2RSTR; /*!< RCC APB2 peripheral reset register, Address offset: 0x24 */ + uint32_t RESERVED1[2]; /*!< Reserved, 0x28-0x2C */ + __IO uint32_t AHB1ENR; /*!< RCC AHB1 peripheral clock register, Address offset: 0x30 */ + __IO uint32_t AHB2ENR; /*!< RCC AHB2 peripheral clock register, Address offset: 0x34 */ + __IO uint32_t AHB3ENR; /*!< RCC AHB3 peripheral clock register, Address offset: 0x38 */ + uint32_t RESERVED2; /*!< Reserved, 0x3C */ + __IO uint32_t APB1ENR; /*!< RCC APB1 peripheral clock enable register, Address offset: 0x40 */ + __IO uint32_t APB2ENR; /*!< RCC APB2 peripheral clock enable register, Address offset: 0x44 */ + uint32_t RESERVED3[2]; /*!< Reserved, 0x48-0x4C */ + __IO uint32_t AHB1LPENR; /*!< RCC AHB1 peripheral clock enable in low power mode register, Address offset: 0x50 */ + __IO uint32_t AHB2LPENR; /*!< RCC AHB2 peripheral clock enable in low power mode register, Address offset: 0x54 */ + __IO uint32_t AHB3LPENR; /*!< RCC AHB3 peripheral clock enable in low power mode register, Address offset: 0x58 */ + uint32_t RESERVED4; /*!< Reserved, 0x5C */ + __IO uint32_t APB1LPENR; /*!< RCC APB1 peripheral clock enable in low power mode register, Address offset: 0x60 */ + __IO uint32_t APB2LPENR; /*!< RCC APB2 peripheral clock enable in low power mode register, Address offset: 0x64 */ + uint32_t RESERVED5[2]; /*!< Reserved, 0x68-0x6C */ + __IO uint32_t BDCR; /*!< RCC Backup domain control register, Address offset: 0x70 */ + __IO uint32_t CSR; /*!< RCC clock control & status register, Address offset: 0x74 */ + uint32_t RESERVED6[2]; /*!< Reserved, 0x78-0x7C */ + __IO uint32_t SSCGR; /*!< RCC spread spectrum clock generation register, Address offset: 0x80 */ + __IO uint32_t PLLI2SCFGR; /*!< RCC PLLI2S configuration register, Address offset: 0x84 */ + +} RCC_TypeDef; + +/** + * @brief Real-Time Clock + */ + +typedef struct +{ + __IO uint32_t TR; /*!< RTC time register, Address offset: 0x00 */ + __IO uint32_t DR; /*!< RTC date register, Address offset: 0x04 */ + __IO uint32_t CR; /*!< RTC control register, Address offset: 0x08 */ + __IO uint32_t ISR; /*!< RTC initialization and status register, Address offset: 0x0C */ + __IO uint32_t PRER; /*!< RTC prescaler register, Address offset: 0x10 */ + __IO uint32_t WUTR; /*!< RTC wakeup timer register, Address offset: 0x14 */ + __IO uint32_t CALIBR; /*!< RTC calibration register, Address offset: 0x18 */ + __IO uint32_t ALRMAR; /*!< RTC alarm A register, Address offset: 0x1C */ + __IO uint32_t ALRMBR; /*!< RTC alarm B register, Address offset: 0x20 */ + __IO uint32_t WPR; /*!< RTC write protection register, Address offset: 0x24 */ + uint32_t RESERVED1; /*!< Reserved, 0x28 */ + uint32_t RESERVED2; /*!< Reserved, 0x2C */ + __IO uint32_t TSTR; /*!< RTC time stamp time register, Address offset: 0x30 */ + __IO uint32_t TSDR; /*!< RTC time stamp date register, Address offset: 0x34 */ + uint32_t RESERVED3; /*!< Reserved, 0x38 */ + uint32_t RESERVED4; /*!< Reserved, 0x3C */ + __IO uint32_t TAFCR; /*!< RTC tamper and alternate function configuration register, Address offset: 0x40 */ + uint32_t RESERVED5; /*!< Reserved, 0x44 */ + uint32_t RESERVED6; /*!< Reserved, 0x48 */ + uint32_t RESERVED7; /*!< Reserved, 0x4C */ + __IO uint32_t BKP0R; /*!< RTC backup register 1, Address offset: 0x50 */ + __IO uint32_t BKP1R; /*!< RTC backup register 1, Address offset: 0x54 */ + __IO uint32_t BKP2R; /*!< RTC backup register 2, Address offset: 0x58 */ + __IO uint32_t BKP3R; /*!< RTC backup register 3, Address offset: 0x5C */ + __IO uint32_t BKP4R; /*!< RTC backup register 4, Address offset: 0x60 */ + __IO uint32_t BKP5R; /*!< RTC backup register 5, Address offset: 0x64 */ + __IO uint32_t BKP6R; /*!< RTC backup register 6, Address offset: 0x68 */ + __IO uint32_t BKP7R; /*!< RTC backup register 7, Address offset: 0x6C */ + __IO uint32_t BKP8R; /*!< RTC backup register 8, Address offset: 0x70 */ + __IO uint32_t BKP9R; /*!< RTC backup register 9, Address offset: 0x74 */ + __IO uint32_t BKP10R; /*!< RTC backup register 10, Address offset: 0x78 */ + __IO uint32_t BKP11R; /*!< RTC backup register 11, Address offset: 0x7C */ + __IO uint32_t BKP12R; /*!< RTC backup register 12, Address offset: 0x80 */ + __IO uint32_t BKP13R; /*!< RTC backup register 13, Address offset: 0x84 */ + __IO uint32_t BKP14R; /*!< RTC backup register 14, Address offset: 0x88 */ + __IO uint32_t BKP15R; /*!< RTC backup register 15, Address offset: 0x8C */ + __IO uint32_t BKP16R; /*!< RTC backup register 16, Address offset: 0x90 */ + __IO uint32_t BKP17R; /*!< RTC backup register 17, Address offset: 0x94 */ + __IO uint32_t BKP18R; /*!< RTC backup register 18, Address offset: 0x98 */ + __IO uint32_t BKP19R; /*!< RTC backup register 19, Address offset: 0x9C */ +} RTC_TypeDef; + + +/** + * @brief SD host Interface + */ + +typedef struct +{ + __IO uint32_t POWER; /*!< SDIO power control register, Address offset: 0x00 */ + __IO uint32_t CLKCR; /*!< SDI clock control register, Address offset: 0x04 */ + __IO uint32_t ARG; /*!< SDIO argument register, Address offset: 0x08 */ + __IO uint32_t CMD; /*!< SDIO command register, Address offset: 0x0C */ + __IO const uint32_t RESPCMD; /*!< SDIO command response register, Address offset: 0x10 */ + __IO const uint32_t RESP1; /*!< SDIO response 1 register, Address offset: 0x14 */ + __IO const uint32_t RESP2; /*!< SDIO response 2 register, Address offset: 0x18 */ + __IO const uint32_t RESP3; /*!< SDIO response 3 register, Address offset: 0x1C */ + __IO const uint32_t RESP4; /*!< SDIO response 4 register, Address offset: 0x20 */ + __IO uint32_t DTIMER; /*!< SDIO data timer register, Address offset: 0x24 */ + __IO uint32_t DLEN; /*!< SDIO data length register, Address offset: 0x28 */ + __IO uint32_t DCTRL; /*!< SDIO data control register, Address offset: 0x2C */ + __IO const uint32_t DCOUNT; /*!< SDIO data counter register, Address offset: 0x30 */ + __IO const uint32_t STA; /*!< SDIO status register, Address offset: 0x34 */ + __IO uint32_t ICR; /*!< SDIO interrupt clear register, Address offset: 0x38 */ + __IO uint32_t MASK; /*!< SDIO mask register, Address offset: 0x3C */ + uint32_t RESERVED0[2]; /*!< Reserved, 0x40-0x44 */ + __IO const uint32_t FIFOCNT; /*!< SDIO FIFO counter register, Address offset: 0x48 */ + uint32_t RESERVED1[13]; /*!< Reserved, 0x4C-0x7C */ + __IO uint32_t FIFO; /*!< SDIO data FIFO register, Address offset: 0x80 */ +} SDIO_TypeDef; + +/** + * @brief Serial Peripheral Interface + */ + +typedef struct +{ + __IO uint32_t CR1; /*!< SPI control register 1 (not used in I2S mode), Address offset: 0x00 */ + __IO uint32_t CR2; /*!< SPI control register 2, Address offset: 0x04 */ + __IO uint32_t SR; /*!< SPI status register, Address offset: 0x08 */ + __IO uint32_t DR; /*!< SPI data register, Address offset: 0x0C */ + __IO uint32_t CRCPR; /*!< SPI CRC polynomial register (not used in I2S mode), Address offset: 0x10 */ + __IO uint32_t RXCRCR; /*!< SPI RX CRC register (not used in I2S mode), Address offset: 0x14 */ + __IO uint32_t TXCRCR; /*!< SPI TX CRC register (not used in I2S mode), Address offset: 0x18 */ + __IO uint32_t I2SCFGR; /*!< SPI_I2S configuration register, Address offset: 0x1C */ + __IO uint32_t I2SPR; /*!< SPI_I2S prescaler register, Address offset: 0x20 */ +} SPI_TypeDef; + +/** + * @brief TIM + */ + +typedef struct +{ + __IO uint32_t CR1; /*!< TIM control register 1, Address offset: 0x00 */ + __IO uint32_t CR2; /*!< TIM control register 2, Address offset: 0x04 */ + __IO uint32_t SMCR; /*!< TIM slave mode control register, Address offset: 0x08 */ + __IO uint32_t DIER; /*!< TIM DMA/interrupt enable register, Address offset: 0x0C */ + __IO uint32_t SR; /*!< TIM status register, Address offset: 0x10 */ + __IO uint32_t EGR; /*!< TIM event generation register, Address offset: 0x14 */ + __IO uint32_t CCMR1; /*!< TIM capture/compare mode register 1, Address offset: 0x18 */ + __IO uint32_t CCMR2; /*!< TIM capture/compare mode register 2, Address offset: 0x1C */ + __IO uint32_t CCER; /*!< TIM capture/compare enable register, Address offset: 0x20 */ + __IO uint32_t CNT; /*!< TIM counter register, Address offset: 0x24 */ + __IO uint32_t PSC; /*!< TIM prescaler, Address offset: 0x28 */ + __IO uint32_t ARR; /*!< TIM auto-reload register, Address offset: 0x2C */ + __IO uint32_t RCR; /*!< TIM repetition counter register, Address offset: 0x30 */ + __IO uint32_t CCR1; /*!< TIM capture/compare register 1, Address offset: 0x34 */ + __IO uint32_t CCR2; /*!< TIM capture/compare register 2, Address offset: 0x38 */ + __IO uint32_t CCR3; /*!< TIM capture/compare register 3, Address offset: 0x3C */ + __IO uint32_t CCR4; /*!< TIM capture/compare register 4, Address offset: 0x40 */ + __IO uint32_t BDTR; /*!< TIM break and dead-time register, Address offset: 0x44 */ + __IO uint32_t DCR; /*!< TIM DMA control register, Address offset: 0x48 */ + __IO uint32_t DMAR; /*!< TIM DMA address for full transfer, Address offset: 0x4C */ + __IO uint32_t OR; /*!< TIM option register, Address offset: 0x50 */ +} TIM_TypeDef; + +/** + * @brief Universal Synchronous Asynchronous Receiver Transmitter + */ + +typedef struct +{ + __IO uint32_t SR; /*!< USART Status register, Address offset: 0x00 */ + __IO uint32_t DR; /*!< USART Data register, Address offset: 0x04 */ + __IO uint32_t BRR; /*!< USART Baud rate register, Address offset: 0x08 */ + __IO uint32_t CR1; /*!< USART Control register 1, Address offset: 0x0C */ + __IO uint32_t CR2; /*!< USART Control register 2, Address offset: 0x10 */ + __IO uint32_t CR3; /*!< USART Control register 3, Address offset: 0x14 */ + __IO uint32_t GTPR; /*!< USART Guard time and prescaler register, Address offset: 0x18 */ +} USART_TypeDef; + +/** + * @brief Window WATCHDOG + */ + +typedef struct +{ + __IO uint32_t CR; /*!< WWDG Control register, Address offset: 0x00 */ + __IO uint32_t CFR; /*!< WWDG Configuration register, Address offset: 0x04 */ + __IO uint32_t SR; /*!< WWDG Status register, Address offset: 0x08 */ +} WWDG_TypeDef; + + +/** + * @brief Crypto Processor + */ + +typedef struct +{ + __IO uint32_t CR; /*!< CRYP control register, Address offset: 0x00 */ + __IO uint32_t SR; /*!< CRYP status register, Address offset: 0x04 */ + __IO uint32_t DIN; /*!< CRYP data input register, Address offset: 0x08 */ + __IO uint32_t DOUT; /*!< CRYP data output register, Address offset: 0x0C */ + __IO uint32_t DMACR; /*!< CRYP DMA control register, Address offset: 0x10 */ + __IO uint32_t IMSCR; /*!< CRYP interrupt mask set/clear register, Address offset: 0x14 */ + __IO uint32_t RISR; /*!< CRYP raw interrupt status register, Address offset: 0x18 */ + __IO uint32_t MISR; /*!< CRYP masked interrupt status register, Address offset: 0x1C */ + __IO uint32_t K0LR; /*!< CRYP key left register 0, Address offset: 0x20 */ + __IO uint32_t K0RR; /*!< CRYP key right register 0, Address offset: 0x24 */ + __IO uint32_t K1LR; /*!< CRYP key left register 1, Address offset: 0x28 */ + __IO uint32_t K1RR; /*!< CRYP key right register 1, Address offset: 0x2C */ + __IO uint32_t K2LR; /*!< CRYP key left register 2, Address offset: 0x30 */ + __IO uint32_t K2RR; /*!< CRYP key right register 2, Address offset: 0x34 */ + __IO uint32_t K3LR; /*!< CRYP key left register 3, Address offset: 0x38 */ + __IO uint32_t K3RR; /*!< CRYP key right register 3, Address offset: 0x3C */ + __IO uint32_t IV0LR; /*!< CRYP initialization vector left-word register 0, Address offset: 0x40 */ + __IO uint32_t IV0RR; /*!< CRYP initialization vector right-word register 0, Address offset: 0x44 */ + __IO uint32_t IV1LR; /*!< CRYP initialization vector left-word register 1, Address offset: 0x48 */ + __IO uint32_t IV1RR; /*!< CRYP initialization vector right-word register 1, Address offset: 0x4C */ +} CRYP_TypeDef; + +/** + * @brief HASH + */ + +typedef struct +{ + __IO uint32_t CR; /*!< HASH control register, Address offset: 0x00 */ + __IO uint32_t DIN; /*!< HASH data input register, Address offset: 0x04 */ + __IO uint32_t STR; /*!< HASH start register, Address offset: 0x08 */ + __IO uint32_t HR[5]; /*!< HASH digest registers, Address offset: 0x0C-0x1C */ + __IO uint32_t IMR; /*!< HASH interrupt enable register, Address offset: 0x20 */ + __IO uint32_t SR; /*!< HASH status register, Address offset: 0x24 */ + uint32_t RESERVED[52]; /*!< Reserved, 0x28-0xF4 */ + __IO uint32_t CSR[51]; /*!< HASH context swap registers, Address offset: 0x0F8-0x1C0 */ +} HASH_TypeDef; + +/** + * @brief RNG + */ + +typedef struct +{ + __IO uint32_t CR; /*!< RNG control register, Address offset: 0x00 */ + __IO uint32_t SR; /*!< RNG status register, Address offset: 0x04 */ + __IO uint32_t DR; /*!< RNG data register, Address offset: 0x08 */ +} RNG_TypeDef; + + + +/** + * @brief __USB_OTG_Core_register + */ +typedef struct +{ + __IO uint32_t GOTGCTL; /*!< USB_OTG Control and Status Register Address offset : 0x00 */ + __IO uint32_t GOTGINT; /*!< USB_OTG Interrupt Register Address offset : 0x04 */ + __IO uint32_t GAHBCFG; /*!< Core AHB Configuration Register Address offset : 0x08 */ + __IO uint32_t GUSBCFG; /*!< Core USB Configuration Register Address offset : 0x0C */ + __IO uint32_t GRSTCTL; /*!< Core Reset Register Address offset : 0x10 */ + __IO uint32_t GINTSTS; /*!< Core Interrupt Register Address offset : 0x14 */ + __IO uint32_t GINTMSK; /*!< Core Interrupt Mask Register Address offset : 0x18 */ + __IO uint32_t GRXSTSR; /*!< Receive Sts Q Read Register Address offset : 0x1C */ + __IO uint32_t GRXSTSP; /*!< Receive Sts Q Read & POP Register Address offset : 0x20 */ + __IO uint32_t GRXFSIZ; /* Receive FIFO Size Register Address offset : 0x24 */ + __IO uint32_t DIEPTXF0_HNPTXFSIZ; /*!< EP0 / Non Periodic Tx FIFO Size Register Address offset : 0x28 */ + __IO uint32_t HNPTXSTS; /*!< Non Periodic Tx FIFO/Queue Sts reg Address offset : 0x2C */ + uint32_t Reserved30[2]; /* Reserved Address offset : 0x30 */ + __IO uint32_t GCCFG; /*!< General Purpose IO Register Address offset : 0x38 */ + __IO uint32_t CID; /*!< User ID Register Address offset : 0x3C */ + uint32_t Reserved40[48]; /*!< Reserved Address offset : 0x40-0xFF */ + __IO uint32_t HPTXFSIZ; /*!< Host Periodic Tx FIFO Size Reg Address offset : 0x100 */ + __IO uint32_t DIEPTXF[0x0F]; /*!< dev Periodic Transmit FIFO */ +} +USB_OTG_GlobalTypeDef; + + + +/** + * @brief __device_Registers + */ +typedef struct +{ + __IO uint32_t DCFG; /*!< dev Configuration Register Address offset : 0x800 */ + __IO uint32_t DCTL; /*!< dev Control Register Address offset : 0x804 */ + __IO uint32_t DSTS; /*!< dev Status Register (RO) Address offset : 0x808 */ + uint32_t Reserved0C; /*!< Reserved Address offset : 0x80C */ + __IO uint32_t DIEPMSK; /*!< dev IN Endpoint Mask Address offset : 0x810 */ + __IO uint32_t DOEPMSK; /*!< dev OUT Endpoint Mask Address offset : 0x814 */ + __IO uint32_t DAINT; /*!< dev All Endpoints Itr Reg Address offset : 0x818 */ + __IO uint32_t DAINTMSK; /*!< dev All Endpoints Itr Mask Address offset : 0x81C */ + uint32_t Reserved20; /*!< Reserved Address offset : 0x820 */ + uint32_t Reserved9; /*!< Reserved Address offset : 0x824 */ + __IO uint32_t DVBUSDIS; /*!< dev VBUS discharge Register Address offset : 0x828 */ + __IO uint32_t DVBUSPULSE; /*!< dev VBUS Pulse Register Address offset : 0x82C */ + __IO uint32_t DTHRCTL; /*!< dev thr Address offset : 0x830 */ + __IO uint32_t DIEPEMPMSK; /*!< dev empty msk Address offset : 0x834 */ + __IO uint32_t DEACHINT; /*!< dedicated EP interrupt Address offset : 0x838 */ + __IO uint32_t DEACHMSK; /*!< dedicated EP msk Address offset : 0x83C */ + uint32_t Reserved40; /*!< dedicated EP mask Address offset : 0x840 */ + __IO uint32_t DINEP1MSK; /*!< dedicated EP mask Address offset : 0x844 */ + uint32_t Reserved44[15]; /*!< Reserved Address offset : 0x844-0x87C */ + __IO uint32_t DOUTEP1MSK; /*!< dedicated EP msk Address offset : 0x884 */ +} +USB_OTG_DeviceTypeDef; + + +/** + * @brief __IN_Endpoint-Specific_Register + */ +typedef struct +{ + __IO uint32_t DIEPCTL; /* dev IN Endpoint Control Reg 900h + (ep_num * 20h) + 00h */ + uint32_t Reserved04; /* Reserved 900h + (ep_num * 20h) + 04h */ + __IO uint32_t DIEPINT; /* dev IN Endpoint Itr Reg 900h + (ep_num * 20h) + 08h */ + uint32_t Reserved0C; /* Reserved 900h + (ep_num * 20h) + 0Ch */ + __IO uint32_t DIEPTSIZ; /* IN Endpoint Txfer Size 900h + (ep_num * 20h) + 10h */ + __IO uint32_t DIEPDMA; /* IN Endpoint DMA Address Reg 900h + (ep_num * 20h) + 14h */ + __IO uint32_t DTXFSTS; /* IN Endpoint Tx FIFO Status Reg 900h + (ep_num * 20h) + 18h */ + uint32_t Reserved18; /* Reserved 900h+(ep_num*20h)+1Ch-900h+ (ep_num * 20h) + 1Ch */ +} +USB_OTG_INEndpointTypeDef; + + +/** + * @brief __OUT_Endpoint-Specific_Registers + */ +typedef struct +{ + __IO uint32_t DOEPCTL; /* dev OUT Endpoint Control Reg B00h + (ep_num * 20h) + 00h*/ + uint32_t Reserved04; /* Reserved B00h + (ep_num * 20h) + 04h*/ + __IO uint32_t DOEPINT; /* dev OUT Endpoint Itr Reg B00h + (ep_num * 20h) + 08h*/ + uint32_t Reserved0C; /* Reserved B00h + (ep_num * 20h) + 0Ch*/ + __IO uint32_t DOEPTSIZ; /* dev OUT Endpoint Txfer Size B00h + (ep_num * 20h) + 10h*/ + __IO uint32_t DOEPDMA; /* dev OUT Endpoint DMA Address B00h + (ep_num * 20h) + 14h*/ + uint32_t Reserved18[2]; /* Reserved B00h + (ep_num * 20h) + 18h - B00h + (ep_num * 20h) + 1Ch*/ +} +USB_OTG_OUTEndpointTypeDef; + + +/** + * @brief __Host_Mode_Register_Structures + */ +typedef struct +{ + __IO uint32_t HCFG; /* Host Configuration Register 400h*/ + __IO uint32_t HFIR; /* Host Frame Interval Register 404h*/ + __IO uint32_t HFNUM; /* Host Frame Nbr/Frame Remaining 408h*/ + uint32_t Reserved40C; /* Reserved 40Ch*/ + __IO uint32_t HPTXSTS; /* Host Periodic Tx FIFO/ Queue Status 410h*/ + __IO uint32_t HAINT; /* Host All Channels Interrupt Register 414h*/ + __IO uint32_t HAINTMSK; /* Host All Channels Interrupt Mask 418h*/ +} +USB_OTG_HostTypeDef; + + +/** + * @brief __Host_Channel_Specific_Registers + */ +typedef struct +{ + __IO uint32_t HCCHAR; + __IO uint32_t HCSPLT; + __IO uint32_t HCINT; + __IO uint32_t HCINTMSK; + __IO uint32_t HCTSIZ; + __IO uint32_t HCDMA; + uint32_t Reserved[2]; +} +USB_OTG_HostChannelTypeDef; + + +/** + * @brief Peripheral_memory_map + */ +#define FLASH_BASE 0x08000000UL /*!< FLASH(up to 1 MB) base address in the alias region */ +#define SRAM1_BASE 0x20000000UL /*!< SRAM1(112 KB) base address in the alias region */ +#define SRAM2_BASE 0x2001C000UL /*!< SRAM2(16 KB) base address in the alias region */ +#define PERIPH_BASE 0x40000000UL /*!< Peripheral base address in the alias region */ +#define BKPSRAM_BASE 0x40024000UL /*!< Backup SRAM(4 KB) base address in the alias region */ +#define FSMC_R_BASE 0xA0000000UL /*!< FSMC registers base address */ +#define SRAM1_BB_BASE 0x22000000UL /*!< SRAM1(112 KB) base address in the bit-band region */ +#define SRAM2_BB_BASE 0x22380000UL /*!< SRAM2(16 KB) base address in the bit-band region */ +#define PERIPH_BB_BASE 0x42000000UL /*!< Peripheral base address in the bit-band region */ +#define BKPSRAM_BB_BASE 0x42480000UL /*!< Backup SRAM(4 KB) base address in the bit-band region */ +#define FLASH_END 0x080FFFFFUL /*!< FLASH end address */ +#define FLASH_OTP_BASE 0x1FFF7800UL /*!< Base address of : (up to 528 Bytes) embedded FLASH OTP Area */ +#define FLASH_OTP_END 0x1FFF7A0FUL /*!< End address of : (up to 528 Bytes) embedded FLASH OTP Area */ + +/* Legacy defines */ +#define SRAM_BASE SRAM1_BASE +#define SRAM_BB_BASE SRAM1_BB_BASE + + +/*!< Peripheral memory map */ +#define APB1PERIPH_BASE PERIPH_BASE +#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000UL) +#define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000UL) +#define AHB2PERIPH_BASE (PERIPH_BASE + 0x10000000UL) + +/*!< APB1 peripherals */ +#define TIM2_BASE (APB1PERIPH_BASE + 0x0000UL) +#define TIM3_BASE (APB1PERIPH_BASE + 0x0400UL) +#define TIM4_BASE (APB1PERIPH_BASE + 0x0800UL) +#define TIM5_BASE (APB1PERIPH_BASE + 0x0C00UL) +#define TIM6_BASE (APB1PERIPH_BASE + 0x1000UL) +#define TIM7_BASE (APB1PERIPH_BASE + 0x1400UL) +#define TIM12_BASE (APB1PERIPH_BASE + 0x1800UL) +#define TIM13_BASE (APB1PERIPH_BASE + 0x1C00UL) +#define TIM14_BASE (APB1PERIPH_BASE + 0x2000UL) +#define RTC_BASE (APB1PERIPH_BASE + 0x2800UL) +#define WWDG_BASE (APB1PERIPH_BASE + 0x2C00UL) +#define IWDG_BASE (APB1PERIPH_BASE + 0x3000UL) +#define SPI2_BASE (APB1PERIPH_BASE + 0x3800UL) +#define SPI3_BASE (APB1PERIPH_BASE + 0x3C00UL) +#define USART2_BASE (APB1PERIPH_BASE + 0x4400UL) +#define USART3_BASE (APB1PERIPH_BASE + 0x4800UL) +#define UART4_BASE (APB1PERIPH_BASE + 0x4C00UL) +#define UART5_BASE (APB1PERIPH_BASE + 0x5000UL) +#define I2C1_BASE (APB1PERIPH_BASE + 0x5400UL) +#define I2C2_BASE (APB1PERIPH_BASE + 0x5800UL) +#define I2C3_BASE (APB1PERIPH_BASE + 0x5C00UL) +#define CAN1_BASE (APB1PERIPH_BASE + 0x6400UL) +#define CAN2_BASE (APB1PERIPH_BASE + 0x6800UL) +#define PWR_BASE (APB1PERIPH_BASE + 0x7000UL) +#define DAC_BASE (APB1PERIPH_BASE + 0x7400UL) + +/*!< APB2 peripherals */ +#define TIM1_BASE (APB2PERIPH_BASE + 0x0000UL) +#define TIM8_BASE (APB2PERIPH_BASE + 0x0400UL) +#define USART1_BASE (APB2PERIPH_BASE + 0x1000UL) +#define USART6_BASE (APB2PERIPH_BASE + 0x1400UL) +#define ADC1_BASE (APB2PERIPH_BASE + 0x2000UL) +#define ADC2_BASE (APB2PERIPH_BASE + 0x2100UL) +#define ADC3_BASE (APB2PERIPH_BASE + 0x2200UL) +#define ADC123_COMMON_BASE (APB2PERIPH_BASE + 0x2300UL) +/* Legacy define */ +#define ADC_BASE ADC123_COMMON_BASE + +#define SDIO_BASE (APB2PERIPH_BASE + 0x2C00UL) +#define SPI1_BASE (APB2PERIPH_BASE + 0x3000UL) +#define SYSCFG_BASE (APB2PERIPH_BASE + 0x3800UL) +#define EXTI_BASE (APB2PERIPH_BASE + 0x3C00UL) +#define TIM9_BASE (APB2PERIPH_BASE + 0x4000UL) +#define TIM10_BASE (APB2PERIPH_BASE + 0x4400UL) +#define TIM11_BASE (APB2PERIPH_BASE + 0x4800UL) + +/*!< AHB1 peripherals */ +#define GPIOA_BASE (AHB1PERIPH_BASE + 0x0000UL) +#define GPIOB_BASE (AHB1PERIPH_BASE + 0x0400UL) +#define GPIOC_BASE (AHB1PERIPH_BASE + 0x0800UL) +#define GPIOD_BASE (AHB1PERIPH_BASE + 0x0C00UL) +#define GPIOE_BASE (AHB1PERIPH_BASE + 0x1000UL) +#define GPIOF_BASE (AHB1PERIPH_BASE + 0x1400UL) +#define GPIOG_BASE (AHB1PERIPH_BASE + 0x1800UL) +#define GPIOH_BASE (AHB1PERIPH_BASE + 0x1C00UL) +#define GPIOI_BASE (AHB1PERIPH_BASE + 0x2000UL) +#define CRC_BASE (AHB1PERIPH_BASE + 0x3000UL) +#define RCC_BASE (AHB1PERIPH_BASE + 0x3800UL) +#define FLASH_R_BASE (AHB1PERIPH_BASE + 0x3C00UL) +#define DMA1_BASE (AHB1PERIPH_BASE + 0x6000UL) +#define DMA1_Stream0_BASE (DMA1_BASE + 0x010UL) +#define DMA1_Stream1_BASE (DMA1_BASE + 0x028UL) +#define DMA1_Stream2_BASE (DMA1_BASE + 0x040UL) +#define DMA1_Stream3_BASE (DMA1_BASE + 0x058UL) +#define DMA1_Stream4_BASE (DMA1_BASE + 0x070UL) +#define DMA1_Stream5_BASE (DMA1_BASE + 0x088UL) +#define DMA1_Stream6_BASE (DMA1_BASE + 0x0A0UL) +#define DMA1_Stream7_BASE (DMA1_BASE + 0x0B8UL) +#define DMA2_BASE (AHB1PERIPH_BASE + 0x6400UL) +#define DMA2_Stream0_BASE (DMA2_BASE + 0x010UL) +#define DMA2_Stream1_BASE (DMA2_BASE + 0x028UL) +#define DMA2_Stream2_BASE (DMA2_BASE + 0x040UL) +#define DMA2_Stream3_BASE (DMA2_BASE + 0x058UL) +#define DMA2_Stream4_BASE (DMA2_BASE + 0x070UL) +#define DMA2_Stream5_BASE (DMA2_BASE + 0x088UL) +#define DMA2_Stream6_BASE (DMA2_BASE + 0x0A0UL) +#define DMA2_Stream7_BASE (DMA2_BASE + 0x0B8UL) +#define ETH_BASE (AHB1PERIPH_BASE + 0x8000UL) +#define ETH_MAC_BASE (ETH_BASE) +#define ETH_MMC_BASE (ETH_BASE + 0x0100UL) +#define ETH_PTP_BASE (ETH_BASE + 0x0700UL) +#define ETH_DMA_BASE (ETH_BASE + 0x1000UL) + +/*!< AHB2 peripherals */ +#define DCMI_BASE (AHB2PERIPH_BASE + 0x50000UL) +#define CRYP_BASE (AHB2PERIPH_BASE + 0x60000UL) +#define HASH_BASE (AHB2PERIPH_BASE + 0x60400UL) +#define RNG_BASE (AHB2PERIPH_BASE + 0x60800UL) + +/*!< FSMC Bankx registers base address */ +#define FSMC_Bank1_R_BASE (FSMC_R_BASE + 0x0000UL) +#define FSMC_Bank1E_R_BASE (FSMC_R_BASE + 0x0104UL) +#define FSMC_Bank2_3_R_BASE (FSMC_R_BASE + 0x0060UL) +#define FSMC_Bank4_R_BASE (FSMC_R_BASE + 0x00A0UL) + +/* Debug MCU registers base address */ +#define DBGMCU_BASE 0xE0042000UL + +/*!< USB registers base address */ +#define USB_OTG_HS_PERIPH_BASE 0x40040000UL +#define USB_OTG_FS_PERIPH_BASE 0x50000000UL + +#define USB_OTG_GLOBAL_BASE 0x000UL +#define USB_OTG_DEVICE_BASE 0x800UL +#define USB_OTG_IN_ENDPOINT_BASE 0x900UL +#define USB_OTG_OUT_ENDPOINT_BASE 0xB00UL +#define USB_OTG_EP_REG_SIZE 0x20UL +#define USB_OTG_HOST_BASE 0x400UL +#define USB_OTG_HOST_PORT_BASE 0x440UL +#define USB_OTG_HOST_CHANNEL_BASE 0x500UL +#define USB_OTG_HOST_CHANNEL_SIZE 0x20UL +#define USB_OTG_PCGCCTL_BASE 0xE00UL +#define USB_OTG_FIFO_BASE 0x1000UL +#define USB_OTG_FIFO_SIZE 0x1000UL + +/******************* Device electronic signature ***************/ +#define UID_BASE 0x1FFF7A10UL /*!< Unique device ID register base address */ +#define FLASHSIZE_BASE 0x1FFF7A22UL /*!< FLASH Size register base address */ + +/** + * @} + */ + +/** @addtogroup Peripheral_declaration + * @{ + */ +#define TIM2 ((TIM_TypeDef *) TIM2_BASE) +#define TIM3 ((TIM_TypeDef *) TIM3_BASE) +#define TIM4 ((TIM_TypeDef *) TIM4_BASE) +#define TIM5 ((TIM_TypeDef *) TIM5_BASE) +#define TIM6 ((TIM_TypeDef *) TIM6_BASE) +#define TIM7 ((TIM_TypeDef *) TIM7_BASE) +#define TIM12 ((TIM_TypeDef *) TIM12_BASE) +#define TIM13 ((TIM_TypeDef *) TIM13_BASE) +#define TIM14 ((TIM_TypeDef *) TIM14_BASE) +#define RTC ((RTC_TypeDef *) RTC_BASE) +#define WWDG ((WWDG_TypeDef *) WWDG_BASE) +#define IWDG ((IWDG_TypeDef *) IWDG_BASE) +#define SPI2 ((SPI_TypeDef *) SPI2_BASE) +#define SPI3 ((SPI_TypeDef *) SPI3_BASE) +#define USART2 ((USART_TypeDef *) USART2_BASE) +#define USART3 ((USART_TypeDef *) USART3_BASE) +#define UART4 ((USART_TypeDef *) UART4_BASE) +#define UART5 ((USART_TypeDef *) UART5_BASE) +#define I2C1 ((I2C_TypeDef *) I2C1_BASE) +#define I2C2 ((I2C_TypeDef *) I2C2_BASE) +#define I2C3 ((I2C_TypeDef *) I2C3_BASE) +#define CAN1 ((CAN_TypeDef *) CAN1_BASE) +#define CAN2 ((CAN_TypeDef *) CAN2_BASE) +#define PWR ((PWR_TypeDef *) PWR_BASE) +#define DAC1 ((DAC_TypeDef *) DAC_BASE) +#define DAC ((DAC_TypeDef *) DAC_BASE) /* Kept for legacy purpose */ +#define TIM1 ((TIM_TypeDef *) TIM1_BASE) +#define TIM8 ((TIM_TypeDef *) TIM8_BASE) +#define USART1 ((USART_TypeDef *) USART1_BASE) +#define USART6 ((USART_TypeDef *) USART6_BASE) +#define ADC1 ((ADC_TypeDef *) ADC1_BASE) +#define ADC2 ((ADC_TypeDef *) ADC2_BASE) +#define ADC3 ((ADC_TypeDef *) ADC3_BASE) +#define ADC123_COMMON ((ADC_Common_TypeDef *) ADC123_COMMON_BASE) +/* Legacy define */ +#define ADC ADC123_COMMON +#define SDIO ((SDIO_TypeDef *) SDIO_BASE) +#define SPI1 ((SPI_TypeDef *) SPI1_BASE) +#define SYSCFG ((SYSCFG_TypeDef *) SYSCFG_BASE) +#define EXTI ((EXTI_TypeDef *) EXTI_BASE) +#define TIM9 ((TIM_TypeDef *) TIM9_BASE) +#define TIM10 ((TIM_TypeDef *) TIM10_BASE) +#define TIM11 ((TIM_TypeDef *) TIM11_BASE) +#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) +#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE) +#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE) +#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE) +#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE) +#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE) +#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE) +#define GPIOH ((GPIO_TypeDef *) GPIOH_BASE) +#define GPIOI ((GPIO_TypeDef *) GPIOI_BASE) +#define CRC ((CRC_TypeDef *) CRC_BASE) +#define RCC ((RCC_TypeDef *) RCC_BASE) +#define FLASH ((FLASH_TypeDef *) FLASH_R_BASE) +#define DMA1 ((DMA_TypeDef *) DMA1_BASE) +#define DMA1_Stream0 ((DMA_Stream_TypeDef *) DMA1_Stream0_BASE) +#define DMA1_Stream1 ((DMA_Stream_TypeDef *) DMA1_Stream1_BASE) +#define DMA1_Stream2 ((DMA_Stream_TypeDef *) DMA1_Stream2_BASE) +#define DMA1_Stream3 ((DMA_Stream_TypeDef *) DMA1_Stream3_BASE) +#define DMA1_Stream4 ((DMA_Stream_TypeDef *) DMA1_Stream4_BASE) +#define DMA1_Stream5 ((DMA_Stream_TypeDef *) DMA1_Stream5_BASE) +#define DMA1_Stream6 ((DMA_Stream_TypeDef *) DMA1_Stream6_BASE) +#define DMA1_Stream7 ((DMA_Stream_TypeDef *) DMA1_Stream7_BASE) +#define DMA2 ((DMA_TypeDef *) DMA2_BASE) +#define DMA2_Stream0 ((DMA_Stream_TypeDef *) DMA2_Stream0_BASE) +#define DMA2_Stream1 ((DMA_Stream_TypeDef *) DMA2_Stream1_BASE) +#define DMA2_Stream2 ((DMA_Stream_TypeDef *) DMA2_Stream2_BASE) +#define DMA2_Stream3 ((DMA_Stream_TypeDef *) DMA2_Stream3_BASE) +#define DMA2_Stream4 ((DMA_Stream_TypeDef *) DMA2_Stream4_BASE) +#define DMA2_Stream5 ((DMA_Stream_TypeDef *) DMA2_Stream5_BASE) +#define DMA2_Stream6 ((DMA_Stream_TypeDef *) DMA2_Stream6_BASE) +#define DMA2_Stream7 ((DMA_Stream_TypeDef *) DMA2_Stream7_BASE) +#define ETH ((ETH_TypeDef *) ETH_BASE) +#define DCMI ((DCMI_TypeDef *) DCMI_BASE) +#define CRYP ((CRYP_TypeDef *) CRYP_BASE) +#define HASH ((HASH_TypeDef *) HASH_BASE) +#define RNG ((RNG_TypeDef *) RNG_BASE) +#define FSMC_Bank1 ((FSMC_Bank1_TypeDef *) FSMC_Bank1_R_BASE) +#define FSMC_Bank1E ((FSMC_Bank1E_TypeDef *) FSMC_Bank1E_R_BASE) +#define FSMC_Bank2_3 ((FSMC_Bank2_3_TypeDef *) FSMC_Bank2_3_R_BASE) +#define FSMC_Bank4 ((FSMC_Bank4_TypeDef *) FSMC_Bank4_R_BASE) + +#define DBGMCU ((DBGMCU_TypeDef *) DBGMCU_BASE) + +#define USB_OTG_FS ((USB_OTG_GlobalTypeDef *) USB_OTG_FS_PERIPH_BASE) +#define USB_OTG_HS ((USB_OTG_GlobalTypeDef *) USB_OTG_HS_PERIPH_BASE) + +/** + * @} + */ + +/** @addtogroup Exported_constants + * @{ + */ + + /** @addtogroup Peripheral_Registers_Bits_Definition + * @{ + */ + +/******************************************************************************/ +/* Peripheral Registers_Bits_Definition */ +/******************************************************************************/ + +/******************************************************************************/ +/* */ +/* Analog to Digital Converter */ +/* */ +/******************************************************************************/ +/******************** Bit definition for ADC_SR register ********************/ +#define ADC_SR_AWD_Pos (0U) +#define ADC_SR_AWD_Msk (0x1UL << ADC_SR_AWD_Pos) /*!< 0x00000001 */ +#define ADC_SR_AWD ADC_SR_AWD_Msk /*!
© COPYRIGHT(c) 2015 STMicroelectronics
+ *

© Copyright (c) 2017 STMicroelectronics. + * All rights reserved.

* - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */ @@ -99,17 +81,17 @@ #endif /* USE_HAL_DRIVER */ /** - * @brief CMSIS Device version number V2.1.0 - */ -#define __STM32F2xx_CMSIS_DEVICE_VERSION_MAIN (0x02) /*!< [31:24] main version */ -#define __STM32F2xx_CMSIS_DEVICE_VERSION_SUB1 (0x01) /*!< [23:16] sub1 version */ -#define __STM32F2xx_CMSIS_DEVICE_VERSION_SUB2 (0x00) /*!< [15:8] sub2 version */ -#define __STM32F2xx_CMSIS_DEVICE_VERSION_RC (0x00) /*!< [7:0] release candidate */ -#define __STM32F2xx_CMSIS_DEVICE_VERSION ((__CMSIS_DEVICE_VERSION_MAIN << 24)\ - |(__CMSIS_DEVICE_HAL_VERSION_SUB1 << 16)\ - |(__CMSIS_DEVICE_HAL_VERSION_SUB2 << 8 )\ - |(__CMSIS_DEVICE_HAL_VERSION_RC)) - + * @brief CMSIS Device version number V2.2.2 + */ +#define __STM32F2xx_CMSIS_VERSION_MAIN (0x02U) /*!< [31:24] main version */ +#define __STM32F2xx_CMSIS_VERSION_SUB1 (0x02U) /*!< [23:16] sub1 version */ +#define __STM32F2xx_CMSIS_VERSION_SUB2 (0x02U) /*!< [15:8] sub2 version */ +#define __STM32F2xx_CMSIS_VERSION_RC (0x00U) /*!< [7:0] release candidate */ +#define __STM32F2xx_CMSIS_VERSION ((__STM32F2xx_CMSIS_VERSION_MAIN << 24)\ + |(__STM32F2xx_CMSIS_VERSION_SUB1 << 16)\ + |(__STM32F2xx_CMSIS_VERSION_SUB2 << 8 )\ + |(__STM32F2xx_CMSIS_VERSION)) + /** * @} */ @@ -139,21 +121,21 @@ */ typedef enum { - RESET = 0, + RESET = 0U, SET = !RESET } FlagStatus, ITStatus; typedef enum { - DISABLE = 0, + DISABLE = 0U, ENABLE = !DISABLE } FunctionalState; #define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE)) typedef enum { - ERROR = 0, - SUCCESS = !ERROR + SUCCESS = 0U, + ERROR = !SUCCESS } ErrorStatus; /** diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Include/system_stm32f2xx.h b/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Include/system_stm32f2xx.h old mode 100755 new mode 100644 similarity index 50% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Include/system_stm32f2xx.h rename to STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Include/system_stm32f2xx.h index 16f8e86e..ac0d6518 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Include/system_stm32f2xx.h +++ b/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Include/system_stm32f2xx.h @@ -2,38 +2,20 @@ ****************************************************************************** * @file system_stm32f2xx.h * @author MCD Application Team - * @version V2.1.0 - * @date 09-October-2015 - * @brief CMSIS Cortex-M3 Device System Source File for STM32F2xx devices. -****************************************************************************** + * @brief CMSIS Cortex-M3 Device System Source File for STM32F2xx devices. + **************************************************************************** * @attention * - *

© COPYRIGHT(c) 2015 STMicroelectronics

+ *

© Copyright (c) 2017 STMicroelectronics. + * All rights reserved.

* - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ + ****************************************************************************** + */ /** @addtogroup CMSIS * @{ @@ -75,6 +57,8 @@ */ extern uint32_t SystemCoreClock; /*!< System Clock Frequency (Core Clock) */ +extern const uint8_t AHBPrescTable[16]; /*!< AHB prescalers table values */ +extern const uint8_t APBPrescTable[8]; /*!< APB prescalers table values */ /** * @} diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/arm/startup_stm32f205xx.s b/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/arm/startup_stm32f205xx.s old mode 100755 new mode 100644 similarity index 91% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/arm/startup_stm32f205xx.s rename to STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/arm/startup_stm32f205xx.s index b17214ed..418feaf7 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/arm/startup_stm32f205xx.s +++ b/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/arm/startup_stm32f205xx.s @@ -1,8 +1,6 @@ -;******************** (C) COPYRIGHT 2015 STMicroelectronics ******************** +;******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f205xx.s ;* Author : MCD Application Team -;* Version : V2.1.0 -;* Date : 09-October-2015 ;* Description : STM32F205xx devices vector table for MDK-ARM toolchain. ;* This module performs: ;* - Set the initial SP @@ -13,31 +11,18 @@ ;* After Reset the CortexM3 processor is in Thread mode, ;* priority is Privileged, and the Stack is set to Main. ;* <<< Use Configuration Wizard in Context Menu >>> -;******************************************************************************* -; -;* Redistribution and use in source and binary forms, with or without modification, -;* are permitted provided that the following conditions are met: -;* 1. Redistributions of source code must retain the above copyright notice, -;* this list of conditions and the following disclaimer. -;* 2. Redistributions in binary form must reproduce the above copyright notice, -;* this list of conditions and the following disclaimer in the documentation -;* and/or other materials provided with the distribution. -;* 3. Neither the name of STMicroelectronics nor the names of its contributors -;* may be used to endorse or promote products derived from this software -;* without specific prior written permission. +;****************************************************************************** +;* @attention ;* -;* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -;* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -;* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -;* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -;* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -;* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -;* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -;* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -;* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -; -;******************************************************************************* +;* Copyright (c) 2017 STMicroelectronics. +;* All rights reserved. +;* +;* This software component is licensed by ST under BSD 3-Clause license, +;* the "License"; You may not use this file except in compliance with the +;* License. You may obtain a copy of the License at: +;* opensource.org/licenses/BSD-3-Clause +;* +;****************************************************************************** ; Amount of memory (in bytes) allocated for Stack ; Tailor this value to your application needs diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/arm/startup_stm32f207xx.s b/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/arm/startup_stm32f207xx.s old mode 100755 new mode 100644 similarity index 91% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/arm/startup_stm32f207xx.s rename to STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/arm/startup_stm32f207xx.s index 1dd59f9e..82e8ba04 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/arm/startup_stm32f207xx.s +++ b/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/arm/startup_stm32f207xx.s @@ -1,8 +1,6 @@ -******************* (C) COPYRIGHT 2015 STMicroelectronics ******************** +******************* (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f207xx.s ;* Author : MCD Application Team -;* Version : V2.1.0 -;* Date : 09-October-2015 ;* Description : STM32F207xx devices vector table for MDK-ARM toolchain. ;* This module performs: ;* - Set the initial SP @@ -13,31 +11,18 @@ ;* After Reset the CortexM3 processor is in Thread mode, ;* priority is Privileged, and the Stack is set to Main. ;* <<< Use Configuration Wizard in Context Menu >>> -;******************************************************************************* -; -;* Redistribution and use in source and binary forms, with or without modification, -;* are permitted provided that the following conditions are met: -;* 1. Redistributions of source code must retain the above copyright notice, -;* this list of conditions and the following disclaimer. -;* 2. Redistributions in binary form must reproduce the above copyright notice, -;* this list of conditions and the following disclaimer in the documentation -;* and/or other materials provided with the distribution. -;* 3. Neither the name of STMicroelectronics nor the names of its contributors -;* may be used to endorse or promote products derived from this software -;* without specific prior written permission. +;****************************************************************************** +;* @attention ;* -;* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -;* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -;* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -;* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -;* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -;* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -;* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -;* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -;* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -; -;******************************************************************************* +;* Copyright (c) 2017 STMicroelectronics. +;* All rights reserved. +;* +;* This software component is licensed by ST under BSD 3-Clause license, +;* the "License"; You may not use this file except in compliance with the +;* License. You may obtain a copy of the License at: +;* opensource.org/licenses/BSD-3-Clause +;* +;****************************************************************************** ; Amount of memory (in bytes) allocated for Stack ; Tailor this value to your application needs diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/arm/startup_stm32f215xx.s b/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/arm/startup_stm32f215xx.s old mode 100755 new mode 100644 similarity index 91% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/arm/startup_stm32f215xx.s rename to STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/arm/startup_stm32f215xx.s index fcdfec8e..bc5c95d4 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/arm/startup_stm32f215xx.s +++ b/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/arm/startup_stm32f215xx.s @@ -1,8 +1,6 @@ -;******************** (C) COPYRIGHT 2015 STMicroelectronics ******************** +;******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f215xx.s ;* Author : MCD Application Team -;* Version : V2.1.0 -;* Date : 09-October-2015 ;* Description : STM32F215xx devices vector table for MDK-ARM toolchain. ;* This module performs: ;* - Set the initial SP @@ -13,31 +11,18 @@ ;* After Reset the CortexM3 processor is in Thread mode, ;* priority is Privileged, and the Stack is set to Main. ;* <<< Use Configuration Wizard in Context Menu >>> -;******************************************************************************* -; -;* Redistribution and use in source and binary forms, with or without modification, -;* are permitted provided that the following conditions are met: -;* 1. Redistributions of source code must retain the above copyright notice, -;* this list of conditions and the following disclaimer. -;* 2. Redistributions in binary form must reproduce the above copyright notice, -;* this list of conditions and the following disclaimer in the documentation -;* and/or other materials provided with the distribution. -;* 3. Neither the name of STMicroelectronics nor the names of its contributors -;* may be used to endorse or promote products derived from this software -;* without specific prior written permission. +;****************************************************************************** +;* @attention ;* -;* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -;* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -;* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -;* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -;* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -;* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -;* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -;* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -;* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -; -;******************************************************************************* +;* Copyright (c) 2017 STMicroelectronics. +;* All rights reserved. +;* +;* This software component is licensed by ST under BSD 3-Clause license, +;* the "License"; You may not use this file except in compliance with the +;* License. You may obtain a copy of the License at: +;* opensource.org/licenses/BSD-3-Clause +;* +;****************************************************************************** ; Amount of memory (in bytes) allocated for Stack ; Tailor this value to your application needs diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/arm/startup_stm32f217xx.s b/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/arm/startup_stm32f217xx.s old mode 100755 new mode 100644 similarity index 91% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/arm/startup_stm32f217xx.s rename to STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/arm/startup_stm32f217xx.s index a65b707d..58aa783e --- a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/arm/startup_stm32f217xx.s +++ b/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/arm/startup_stm32f217xx.s @@ -1,8 +1,6 @@ -;******************** (C) COPYRIGHT 2015 STMicroelectronics ******************** +;******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f217xx.s ;* Author : MCD Application Team -;* Version : V2.1.0 -;* Date : 09-October-2015 ;* Description : STM32F217xx devices vector table for MDK-ARM toolchain. ;* This module performs: ;* - Set the initial SP @@ -13,31 +11,18 @@ ;* After Reset the CortexM3 processor is in Thread mode, ;* priority is Privileged, and the Stack is set to Main. ;* <<< Use Configuration Wizard in Context Menu >>> -;******************************************************************************* -; -;* Redistribution and use in source and binary forms, with or without modification, -;* are permitted provided that the following conditions are met: -;* 1. Redistributions of source code must retain the above copyright notice, -;* this list of conditions and the following disclaimer. -;* 2. Redistributions in binary form must reproduce the above copyright notice, -;* this list of conditions and the following disclaimer in the documentation -;* and/or other materials provided with the distribution. -;* 3. Neither the name of STMicroelectronics nor the names of its contributors -;* may be used to endorse or promote products derived from this software -;* without specific prior written permission. +;****************************************************************************** +;* @attention ;* -;* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -;* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -;* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -;* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -;* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -;* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -;* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -;* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -;* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -; -;******************************************************************************* +;* Copyright (c) 2017 STMicroelectronics. +;* All rights reserved. +;* +;* This software component is licensed by ST under BSD 3-Clause license, +;* the "License"; You may not use this file except in compliance with the +;* License. You may obtain a copy of the License at: +;* opensource.org/licenses/BSD-3-Clause +;* +;****************************************************************************** ; Amount of memory (in bytes) allocated for Stack ; Tailor this value to your application needs diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/gcc/startup_stm32f205xx.s b/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/gcc/startup_stm32f205xx.s old mode 100755 new mode 100644 similarity index 91% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/gcc/startup_stm32f205xx.s rename to STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/gcc/startup_stm32f205xx.s index 5e534225..3eb1691f --- a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/gcc/startup_stm32f205xx.s +++ b/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/gcc/startup_stm32f205xx.s @@ -2,8 +2,6 @@ ****************************************************************************** * @file startup_stm32f205xx.s * @author MCD Application Team - * @version V2.1.0 - * @date 09-October-2015 * @brief STM32F205xx Devices vector table for Atollic TrueSTUDIO toolchain. * This module performs: * - Set the initial SP @@ -16,29 +14,13 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT 2015 STMicroelectronics

+ *

© Copyright (c) 2017 STMicroelectronics. + * All rights reserved.

* - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/gcc/startup_stm32f207xx.s b/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/gcc/startup_stm32f207xx.s old mode 100755 new mode 100644 similarity index 91% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/gcc/startup_stm32f207xx.s rename to STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/gcc/startup_stm32f207xx.s index c5ec0e0c..b34aa820 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/gcc/startup_stm32f207xx.s +++ b/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/gcc/startup_stm32f207xx.s @@ -2,8 +2,6 @@ ****************************************************************************** * @file startup_stm32f207xx.s * @author MCD Application Team - * @version V2.1.0 - * @date 09-October-2015 * @brief STM32F207xx Devices vector table for Atollic TrueSTUDIO toolchain. * This module performs: * - Set the initial SP @@ -16,29 +14,13 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT 2015 STMicroelectronics

+ *

© Copyright (c) 2017 STMicroelectronics. + * All rights reserved.

* - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/gcc/startup_stm32f215xx.s b/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/gcc/startup_stm32f215xx.s old mode 100755 new mode 100644 similarity index 91% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/gcc/startup_stm32f215xx.s rename to STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/gcc/startup_stm32f215xx.s index 67917624..c51829ad --- a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/gcc/startup_stm32f215xx.s +++ b/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/gcc/startup_stm32f215xx.s @@ -2,8 +2,6 @@ ****************************************************************************** * @file startup_stm32f215xx.s * @author MCD Application Team - * @version V2.1.0 - * @date 09-October-2015 * @brief STM32F215xx Devices vector table for Atollic TrueSTUDIO toolchain. * This module performs: * - Set the initial SP @@ -16,29 +14,13 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT 2015 STMicroelectronics

+ *

© Copyright (c) 2017 STMicroelectronics. + * All rights reserved.

* - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/gcc/startup_stm32f217xx.s b/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/gcc/startup_stm32f217xx.s old mode 100755 new mode 100644 similarity index 91% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/gcc/startup_stm32f217xx.s rename to STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/gcc/startup_stm32f217xx.s index 3f024dc9..a9ceb28d --- a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/gcc/startup_stm32f217xx.s +++ b/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/gcc/startup_stm32f217xx.s @@ -2,8 +2,6 @@ ****************************************************************************** * @file startup_stm32f217xx.s * @author MCD Application Team - * @version V2.1.0 - * @date 09-October-2015 * @brief STM32F217xx Devices vector table for Atollic TrueSTUDIO toolchain. * This module performs: * - Set the initial SP @@ -16,29 +14,13 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT 2015 STMicroelectronics

+ *

© Copyright (c) 2017 STMicroelectronics. + * All rights reserved.

* - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */ diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/linker/stm32f205xx_flash.icf b/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/linker/stm32f205xx_flash.icf new file mode 100644 index 00000000..2fbbf41a --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/linker/stm32f205xx_flash.icf @@ -0,0 +1,31 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x08000000; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; +define symbol __ICFEDIT_region_ROM_end__ = 0x080FFFFF; +define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; +define symbol __ICFEDIT_region_RAM_end__ = 0x20020000; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x400; +define symbol __ICFEDIT_size_heap__ = 0x200; +/**** End of ICF editor section. ###ICF###*/ + + +define memory mem with size = 4G; +define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; +define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; + +initialize by copy { readwrite }; +do not initialize { section .noinit }; + +place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; + +place in ROM_region { readonly }; +place in RAM_region { readwrite, + block CSTACK, block HEAP }; diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/linker/stm32f205xx_sram.icf b/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/linker/stm32f205xx_sram.icf new file mode 100644 index 00000000..4f27694f --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/linker/stm32f205xx_sram.icf @@ -0,0 +1,31 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x20000000; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_ROM_start__ = 0x20000000; +define symbol __ICFEDIT_region_ROM_end__ = 0x2000FFFF; +define symbol __ICFEDIT_region_RAM_start__ = 0x20010000; +define symbol __ICFEDIT_region_RAM_end__ = 0x2001FFFF; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x400; +define symbol __ICFEDIT_size_heap__ = 0x200; +/**** End of ICF editor section. ###ICF###*/ + + +define memory mem with size = 4G; +define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; +define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; + +initialize by copy { readwrite }; +do not initialize { section .noinit }; + +place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; + +place in ROM_region { readonly }; +place in RAM_region { readwrite, + block CSTACK, block HEAP }; diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/linker/stm32f207xx_flash.icf b/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/linker/stm32f207xx_flash.icf new file mode 100644 index 00000000..2fbbf41a --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/linker/stm32f207xx_flash.icf @@ -0,0 +1,31 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x08000000; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; +define symbol __ICFEDIT_region_ROM_end__ = 0x080FFFFF; +define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; +define symbol __ICFEDIT_region_RAM_end__ = 0x20020000; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x400; +define symbol __ICFEDIT_size_heap__ = 0x200; +/**** End of ICF editor section. ###ICF###*/ + + +define memory mem with size = 4G; +define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; +define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; + +initialize by copy { readwrite }; +do not initialize { section .noinit }; + +place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; + +place in ROM_region { readonly }; +place in RAM_region { readwrite, + block CSTACK, block HEAP }; diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/linker/stm32f207xx_sram.icf b/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/linker/stm32f207xx_sram.icf new file mode 100644 index 00000000..4f27694f --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/linker/stm32f207xx_sram.icf @@ -0,0 +1,31 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x20000000; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_ROM_start__ = 0x20000000; +define symbol __ICFEDIT_region_ROM_end__ = 0x2000FFFF; +define symbol __ICFEDIT_region_RAM_start__ = 0x20010000; +define symbol __ICFEDIT_region_RAM_end__ = 0x2001FFFF; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x400; +define symbol __ICFEDIT_size_heap__ = 0x200; +/**** End of ICF editor section. ###ICF###*/ + + +define memory mem with size = 4G; +define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; +define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; + +initialize by copy { readwrite }; +do not initialize { section .noinit }; + +place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; + +place in ROM_region { readonly }; +place in RAM_region { readwrite, + block CSTACK, block HEAP }; diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/linker/stm32f215xx_flash.icf b/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/linker/stm32f215xx_flash.icf new file mode 100644 index 00000000..2fbbf41a --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/linker/stm32f215xx_flash.icf @@ -0,0 +1,31 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x08000000; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; +define symbol __ICFEDIT_region_ROM_end__ = 0x080FFFFF; +define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; +define symbol __ICFEDIT_region_RAM_end__ = 0x20020000; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x400; +define symbol __ICFEDIT_size_heap__ = 0x200; +/**** End of ICF editor section. ###ICF###*/ + + +define memory mem with size = 4G; +define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; +define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; + +initialize by copy { readwrite }; +do not initialize { section .noinit }; + +place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; + +place in ROM_region { readonly }; +place in RAM_region { readwrite, + block CSTACK, block HEAP }; diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/linker/stm32f215xx_sram.icf b/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/linker/stm32f215xx_sram.icf new file mode 100644 index 00000000..4f27694f --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/linker/stm32f215xx_sram.icf @@ -0,0 +1,31 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x20000000; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_ROM_start__ = 0x20000000; +define symbol __ICFEDIT_region_ROM_end__ = 0x2000FFFF; +define symbol __ICFEDIT_region_RAM_start__ = 0x20010000; +define symbol __ICFEDIT_region_RAM_end__ = 0x2001FFFF; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x400; +define symbol __ICFEDIT_size_heap__ = 0x200; +/**** End of ICF editor section. ###ICF###*/ + + +define memory mem with size = 4G; +define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; +define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; + +initialize by copy { readwrite }; +do not initialize { section .noinit }; + +place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; + +place in ROM_region { readonly }; +place in RAM_region { readwrite, + block CSTACK, block HEAP }; diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/linker/stm32f217xx_flash.icf b/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/linker/stm32f217xx_flash.icf new file mode 100644 index 00000000..2fbbf41a --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/linker/stm32f217xx_flash.icf @@ -0,0 +1,31 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x08000000; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; +define symbol __ICFEDIT_region_ROM_end__ = 0x080FFFFF; +define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; +define symbol __ICFEDIT_region_RAM_end__ = 0x20020000; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x400; +define symbol __ICFEDIT_size_heap__ = 0x200; +/**** End of ICF editor section. ###ICF###*/ + + +define memory mem with size = 4G; +define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; +define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; + +initialize by copy { readwrite }; +do not initialize { section .noinit }; + +place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; + +place in ROM_region { readonly }; +place in RAM_region { readwrite, + block CSTACK, block HEAP }; diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/linker/stm32f217xx_sram.icf b/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/linker/stm32f217xx_sram.icf new file mode 100644 index 00000000..4f27694f --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/linker/stm32f217xx_sram.icf @@ -0,0 +1,31 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x20000000; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_ROM_start__ = 0x20000000; +define symbol __ICFEDIT_region_ROM_end__ = 0x2000FFFF; +define symbol __ICFEDIT_region_RAM_start__ = 0x20010000; +define symbol __ICFEDIT_region_RAM_end__ = 0x2001FFFF; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x400; +define symbol __ICFEDIT_size_heap__ = 0x200; +/**** End of ICF editor section. ###ICF###*/ + + +define memory mem with size = 4G; +define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; +define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; + +initialize by copy { readwrite }; +do not initialize { section .noinit }; + +place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; + +place in ROM_region { readonly }; +place in RAM_region { readwrite, + block CSTACK, block HEAP }; diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/startup_stm32f205xx.s b/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/startup_stm32f205xx.s old mode 100755 new mode 100644 similarity index 92% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/startup_stm32f205xx.s rename to STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/startup_stm32f205xx.s index 45d25523..f60726d1 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/startup_stm32f205xx.s +++ b/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/startup_stm32f205xx.s @@ -1,8 +1,6 @@ -;/******************** (C) COPYRIGHT 2015 STMicroelectronics ******************** +;/******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f205xx.s ;* Author : MCD Application Team -;* Version : V2.1.0 -;* Date : 09-October-2015 ;* Description : STM32F20x/21x devices vector table for EWARM toolchain. ;* This module performs: ;* - Set the initial SP @@ -13,30 +11,17 @@ ;* calls main()). ;* After Reset the Cortex-M3 processor is in Thread mode, ;* priority is Privileged, and the Stack is set to Main. -;******************************************************************************** -;* -;* Redistribution and use in source and binary forms, with or without modification, -;* are permitted provided that the following conditions are met: -;* 1. Redistributions of source code must retain the above copyright notice, -;* this list of conditions and the following disclaimer. -;* 2. Redistributions in binary form must reproduce the above copyright notice, -;* this list of conditions and the following disclaimer in the documentation -;* and/or other materials provided with the distribution. -;* 3. Neither the name of STMicroelectronics nor the names of its contributors -;* may be used to endorse or promote products derived from this software -;* without specific prior written permission. +;******************************************************************************* +;* @attention +;* +;*

© Copyright (c) 2017 STMicroelectronics. +;* All rights reserved.

+;* +;* This software component is licensed by ST under BSD 3-Clause license, +;* the "License"; You may not use this file except in compliance with the +;* License. You may obtain a copy of the License at: +;* opensource.org/licenses/BSD-3-Clause ;* -;* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -;* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -;* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -;* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -;* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -;* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -;* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -;* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -;* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;* ;******************************************************************************* ; ; diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/startup_stm32f207xx.s b/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/startup_stm32f207xx.s old mode 100755 new mode 100644 similarity index 92% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/startup_stm32f207xx.s rename to STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/startup_stm32f207xx.s index 483a496e..e72150d1 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/startup_stm32f207xx.s +++ b/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/startup_stm32f207xx.s @@ -1,8 +1,6 @@ -;/******************** (C) COPYRIGHT 2015 STMicroelectronics ******************** +;/******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f207xx.s ;* Author : MCD Application Team -;* Version : V2.1.0 -;* Date : 09-October-2015 ;* Description : STM32F20x/21x devices vector table for EWARM toolchain. ;* This module performs: ;* - Set the initial SP @@ -13,30 +11,17 @@ ;* calls main()). ;* After Reset the Cortex-M3 processor is in Thread mode, ;* priority is Privileged, and the Stack is set to Main. -;******************************************************************************** -;* -;* Redistribution and use in source and binary forms, with or without modification, -;* are permitted provided that the following conditions are met: -;* 1. Redistributions of source code must retain the above copyright notice, -;* this list of conditions and the following disclaimer. -;* 2. Redistributions in binary form must reproduce the above copyright notice, -;* this list of conditions and the following disclaimer in the documentation -;* and/or other materials provided with the distribution. -;* 3. Neither the name of STMicroelectronics nor the names of its contributors -;* may be used to endorse or promote products derived from this software -;* without specific prior written permission. +;******************************************************************************* +;* @attention +;* +;*

© Copyright (c) 2017 STMicroelectronics. +;* All rights reserved.

+;* +;* This software component is licensed by ST under BSD 3-Clause license, +;* the "License"; You may not use this file except in compliance with the +;* License. You may obtain a copy of the License at: +;* opensource.org/licenses/BSD-3-Clause ;* -;* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -;* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -;* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -;* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -;* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -;* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -;* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -;* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -;* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;* ;******************************************************************************* ; ; diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/startup_stm32f215xx.s b/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/startup_stm32f215xx.s old mode 100755 new mode 100644 similarity index 92% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/startup_stm32f215xx.s rename to STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/startup_stm32f215xx.s index ffa4af4c..4d9ab95d --- a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/startup_stm32f215xx.s +++ b/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/startup_stm32f215xx.s @@ -1,8 +1,6 @@ -;/******************** (C) COPYRIGHT 2015 STMicroelectronics ******************** +;/******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f215xx.s ;* Author : MCD Application Team -;* Version : V2.1.0 -;* Date : 09-October-2015 ;* Description : STM32F20x/21x devices vector table for EWARM toolchain. ;* This module performs: ;* - Set the initial SP @@ -13,30 +11,17 @@ ;* calls main()). ;* After Reset the Cortex-M3 processor is in Thread mode, ;* priority is Privileged, and the Stack is set to Main. -;******************************************************************************** -;* -;* Redistribution and use in source and binary forms, with or without modification, -;* are permitted provided that the following conditions are met: -;* 1. Redistributions of source code must retain the above copyright notice, -;* this list of conditions and the following disclaimer. -;* 2. Redistributions in binary form must reproduce the above copyright notice, -;* this list of conditions and the following disclaimer in the documentation -;* and/or other materials provided with the distribution. -;* 3. Neither the name of STMicroelectronics nor the names of its contributors -;* may be used to endorse or promote products derived from this software -;* without specific prior written permission. +;******************************************************************************* +;* @attention +;* +;*

© Copyright (c) 2017 STMicroelectronics. +;* All rights reserved.

+;* +;* This software component is licensed by ST under BSD 3-Clause license, +;* the "License"; You may not use this file except in compliance with the +;* License. You may obtain a copy of the License at: +;* opensource.org/licenses/BSD-3-Clause ;* -;* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -;* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -;* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -;* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -;* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -;* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -;* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -;* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -;* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;* ;******************************************************************************* ; ; diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/startup_stm32f217xx.s b/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/startup_stm32f217xx.s old mode 100755 new mode 100644 similarity index 92% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/startup_stm32f217xx.s rename to STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/startup_stm32f217xx.s index aa05aeee..dbfeb077 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/startup_stm32f217xx.s +++ b/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/iar/startup_stm32f217xx.s @@ -1,8 +1,6 @@ -;/******************** (C) COPYRIGHT 2015 STMicroelectronics ******************** +;/******************** (C) COPYRIGHT 2017 STMicroelectronics ******************** ;* File Name : startup_stm32f217xx.s ;* Author : MCD Application Team -;* Version : V2.1.0 -;* Date : 09-October-2015 ;* Description : STM32F20x/21x devices vector table for EWARM toolchain. ;* This module performs: ;* - Set the initial SP @@ -13,30 +11,17 @@ ;* calls main()). ;* After Reset the Cortex-M3 processor is in Thread mode, ;* priority is Privileged, and the Stack is set to Main. -;******************************************************************************** -;* -;* Redistribution and use in source and binary forms, with or without modification, -;* are permitted provided that the following conditions are met: -;* 1. Redistributions of source code must retain the above copyright notice, -;* this list of conditions and the following disclaimer. -;* 2. Redistributions in binary form must reproduce the above copyright notice, -;* this list of conditions and the following disclaimer in the documentation -;* and/or other materials provided with the distribution. -;* 3. Neither the name of STMicroelectronics nor the names of its contributors -;* may be used to endorse or promote products derived from this software -;* without specific prior written permission. +;******************************************************************************* +;* @attention +;* +;*

© Copyright (c) 2017 STMicroelectronics. +;* All rights reserved.

+;* +;* This software component is licensed by ST under BSD 3-Clause license, +;* the "License"; You may not use this file except in compliance with the +;* License. You may obtain a copy of the License at: +;* opensource.org/licenses/BSD-3-Clause ;* -;* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -;* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -;* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -;* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -;* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -;* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -;* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -;* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -;* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -;* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;* ;******************************************************************************* ; ; diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/system_stm32f2xx.c b/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/system_stm32f2xx.c old mode 100755 new mode 100644 similarity index 83% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/system_stm32f2xx.c rename to STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/system_stm32f2xx.c index acd46803..3c2a20b0 --- a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/system_stm32f2xx.c +++ b/STM32CubeMX/revF/Drivers/CMSIS/Device/ST/STM32F2xx/Source/Templates/system_stm32f2xx.c @@ -2,8 +2,6 @@ ****************************************************************************** * @file system_stm32f2xx.c * @author MCD Application Team - * @version V2.1.0 - * @date 09-October-2015 * @brief CMSIS Cortex-M3 Device Peripheral Access Layer System Source File. * * This file provides two functions and one global variable to be called from @@ -23,29 +21,13 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2015 STMicroelectronics

+ *

© Copyright (c) 2016 STMicroelectronics. + * All rights reserved.

* - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */ @@ -65,7 +47,7 @@ #include "stm32f2xx.h" #if !defined (HSE_VALUE) - #define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */ + #define HSE_VALUE ((uint32_t)25000000) /*!< Default value of the External oscillator in Hz */ #endif /* HSE_VALUE */ #if !defined (HSI_VALUE) @@ -123,9 +105,9 @@ is no need to call the 2 first functions listed above, since SystemCoreClock variable is updated automatically. */ - uint32_t SystemCoreClock = 12000000; + uint32_t SystemCoreClock = 16000000; const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; - + const uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4}; /** * @} */ @@ -211,10 +193,10 @@ void SystemInit(void) * 16 MHz) but the real value may vary depending on the variations * in voltage and temperature. * - * (**) HSE_VALUE is a constant defined in stm32f2xx_hal_conf.h file (default value - * 25 MHz), user has to ensure that HSE_VALUE is same as the real - * frequency of the crystal used. Otherwise, this function may - * have wrong result. + * (**) HSE_VALUE is a constant defined in stm32f2xx_hal_conf.h file (its value + * depends on the application requirements), user has to ensure that HSE_VALUE + * is same as the real frequency of the crystal used. Otherwise, this function + * may have wrong result. * * - The result of this function could be not correct when using fractional * value for HSE crystal. diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Include/arm_common_tables.h b/STM32CubeMX/revF/Drivers/CMSIS/Include/arm_common_tables.h old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Include/arm_common_tables.h rename to STM32CubeMX/revF/Drivers/CMSIS/Include/arm_common_tables.h diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Include/arm_const_structs.h b/STM32CubeMX/revF/Drivers/CMSIS/Include/arm_const_structs.h old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Include/arm_const_structs.h rename to STM32CubeMX/revF/Drivers/CMSIS/Include/arm_const_structs.h diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Include/arm_math.h b/STM32CubeMX/revF/Drivers/CMSIS/Include/arm_math.h old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Include/arm_math.h rename to STM32CubeMX/revF/Drivers/CMSIS/Include/arm_math.h diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Include/cmsis_armcc.h b/STM32CubeMX/revF/Drivers/CMSIS/Include/cmsis_armcc.h new file mode 100644 index 00000000..4d9d0645 --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Include/cmsis_armcc.h @@ -0,0 +1,865 @@ +/**************************************************************************//** + * @file cmsis_armcc.h + * @brief CMSIS compiler ARMCC (Arm Compiler 5) header file + * @version V5.0.4 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CMSIS_ARMCC_H +#define __CMSIS_ARMCC_H + + +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 400677) + #error "Please use Arm Compiler Toolchain V4.0.677 or later!" +#endif + +/* CMSIS compiler control architecture macros */ +#if ((defined (__TARGET_ARCH_6_M ) && (__TARGET_ARCH_6_M == 1)) || \ + (defined (__TARGET_ARCH_6S_M ) && (__TARGET_ARCH_6S_M == 1)) ) + #define __ARM_ARCH_6M__ 1 +#endif + +#if (defined (__TARGET_ARCH_7_M ) && (__TARGET_ARCH_7_M == 1)) + #define __ARM_ARCH_7M__ 1 +#endif + +#if (defined (__TARGET_ARCH_7E_M) && (__TARGET_ARCH_7E_M == 1)) + #define __ARM_ARCH_7EM__ 1 +#endif + + /* __ARM_ARCH_8M_BASE__ not applicable */ + /* __ARM_ARCH_8M_MAIN__ not applicable */ + + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM __asm +#endif +#ifndef __INLINE + #define __INLINE __inline +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static __inline +#endif +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE static __forceinline +#endif +#ifndef __NO_RETURN + #define __NO_RETURN __declspec(noreturn) +#endif +#ifndef __USED + #define __USED __attribute__((used)) +#endif +#ifndef __WEAK + #define __WEAK __attribute__((weak)) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed)) +#endif +#ifndef __PACKED_STRUCT + #define __PACKED_STRUCT __packed struct +#endif +#ifndef __PACKED_UNION + #define __PACKED_UNION __packed union +#endif +#ifndef __UNALIGNED_UINT32 /* deprecated */ + #define __UNALIGNED_UINT32(x) (*((__packed uint32_t *)(x))) +#endif +#ifndef __UNALIGNED_UINT16_WRITE + #define __UNALIGNED_UINT16_WRITE(addr, val) ((*((__packed uint16_t *)(addr))) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ + #define __UNALIGNED_UINT16_READ(addr) (*((const __packed uint16_t *)(addr))) +#endif +#ifndef __UNALIGNED_UINT32_WRITE + #define __UNALIGNED_UINT32_WRITE(addr, val) ((*((__packed uint32_t *)(addr))) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #define __UNALIGNED_UINT32_READ(addr) (*((const __packed uint32_t *)(addr))) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +/** + \brief Enable IRQ Interrupts + \details Enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __enable_irq(); */ + + +/** + \brief Disable IRQ Interrupts + \details Disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __disable_irq(); */ + +/** + \brief Get Control Register + \details Returns the content of the Control Register. + \return Control Register value + */ +__STATIC_INLINE uint32_t __get_CONTROL(void) +{ + register uint32_t __regControl __ASM("control"); + return(__regControl); +} + + +/** + \brief Set Control Register + \details Writes the given value to the Control Register. + \param [in] control Control Register value to set + */ +__STATIC_INLINE void __set_CONTROL(uint32_t control) +{ + register uint32_t __regControl __ASM("control"); + __regControl = control; +} + + +/** + \brief Get IPSR Register + \details Returns the content of the IPSR Register. + \return IPSR Register value + */ +__STATIC_INLINE uint32_t __get_IPSR(void) +{ + register uint32_t __regIPSR __ASM("ipsr"); + return(__regIPSR); +} + + +/** + \brief Get APSR Register + \details Returns the content of the APSR Register. + \return APSR Register value + */ +__STATIC_INLINE uint32_t __get_APSR(void) +{ + register uint32_t __regAPSR __ASM("apsr"); + return(__regAPSR); +} + + +/** + \brief Get xPSR Register + \details Returns the content of the xPSR Register. + \return xPSR Register value + */ +__STATIC_INLINE uint32_t __get_xPSR(void) +{ + register uint32_t __regXPSR __ASM("xpsr"); + return(__regXPSR); +} + + +/** + \brief Get Process Stack Pointer + \details Returns the current value of the Process Stack Pointer (PSP). + \return PSP Register value + */ +__STATIC_INLINE uint32_t __get_PSP(void) +{ + register uint32_t __regProcessStackPointer __ASM("psp"); + return(__regProcessStackPointer); +} + + +/** + \brief Set Process Stack Pointer + \details Assigns the given value to the Process Stack Pointer (PSP). + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_INLINE void __set_PSP(uint32_t topOfProcStack) +{ + register uint32_t __regProcessStackPointer __ASM("psp"); + __regProcessStackPointer = topOfProcStack; +} + + +/** + \brief Get Main Stack Pointer + \details Returns the current value of the Main Stack Pointer (MSP). + \return MSP Register value + */ +__STATIC_INLINE uint32_t __get_MSP(void) +{ + register uint32_t __regMainStackPointer __ASM("msp"); + return(__regMainStackPointer); +} + + +/** + \brief Set Main Stack Pointer + \details Assigns the given value to the Main Stack Pointer (MSP). + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) +{ + register uint32_t __regMainStackPointer __ASM("msp"); + __regMainStackPointer = topOfMainStack; +} + + +/** + \brief Get Priority Mask + \details Returns the current state of the priority mask bit from the Priority Mask Register. + \return Priority Mask value + */ +__STATIC_INLINE uint32_t __get_PRIMASK(void) +{ + register uint32_t __regPriMask __ASM("primask"); + return(__regPriMask); +} + + +/** + \brief Set Priority Mask + \details Assigns the given value to the Priority Mask Register. + \param [in] priMask Priority Mask + */ +__STATIC_INLINE void __set_PRIMASK(uint32_t priMask) +{ + register uint32_t __regPriMask __ASM("primask"); + __regPriMask = (priMask); +} + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + +/** + \brief Enable FIQ + \details Enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __enable_fault_irq __enable_fiq + + +/** + \brief Disable FIQ + \details Disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __disable_fault_irq __disable_fiq + + +/** + \brief Get Base Priority + \details Returns the current value of the Base Priority register. + \return Base Priority register value + */ +__STATIC_INLINE uint32_t __get_BASEPRI(void) +{ + register uint32_t __regBasePri __ASM("basepri"); + return(__regBasePri); +} + + +/** + \brief Set Base Priority + \details Assigns the given value to the Base Priority register. + \param [in] basePri Base Priority value to set + */ +__STATIC_INLINE void __set_BASEPRI(uint32_t basePri) +{ + register uint32_t __regBasePri __ASM("basepri"); + __regBasePri = (basePri & 0xFFU); +} + + +/** + \brief Set Base Priority with condition + \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, + or the new value increases the BASEPRI priority level. + \param [in] basePri Base Priority value to set + */ +__STATIC_INLINE void __set_BASEPRI_MAX(uint32_t basePri) +{ + register uint32_t __regBasePriMax __ASM("basepri_max"); + __regBasePriMax = (basePri & 0xFFU); +} + + +/** + \brief Get Fault Mask + \details Returns the current value of the Fault Mask register. + \return Fault Mask register value + */ +__STATIC_INLINE uint32_t __get_FAULTMASK(void) +{ + register uint32_t __regFaultMask __ASM("faultmask"); + return(__regFaultMask); +} + + +/** + \brief Set Fault Mask + \details Assigns the given value to the Fault Mask register. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask) +{ + register uint32_t __regFaultMask __ASM("faultmask"); + __regFaultMask = (faultMask & (uint32_t)1U); +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ + + +/** + \brief Get FPSCR + \details Returns the current value of the Floating Point Status/Control register. + \return Floating Point Status/Control register value + */ +__STATIC_INLINE uint32_t __get_FPSCR(void) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + register uint32_t __regfpscr __ASM("fpscr"); + return(__regfpscr); +#else + return(0U); +#endif +} + + +/** + \brief Set FPSCR + \details Assigns the given value to the Floating Point Status/Control register. + \param [in] fpscr Floating Point Status/Control value to set + */ +__STATIC_INLINE void __set_FPSCR(uint32_t fpscr) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + register uint32_t __regfpscr __ASM("fpscr"); + __regfpscr = (fpscr); +#else + (void)fpscr; +#endif +} + + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +/** + \brief No Operation + \details No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP __nop + + +/** + \brief Wait For Interrupt + \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. + */ +#define __WFI __wfi + + +/** + \brief Wait For Event + \details Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE __wfe + + +/** + \brief Send Event + \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV __sev + + +/** + \brief Instruction Synchronization Barrier + \details Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or memory, + after the instruction has been completed. + */ +#define __ISB() do {\ + __schedule_barrier();\ + __isb(0xF);\ + __schedule_barrier();\ + } while (0U) + +/** + \brief Data Synchronization Barrier + \details Acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +#define __DSB() do {\ + __schedule_barrier();\ + __dsb(0xF);\ + __schedule_barrier();\ + } while (0U) + +/** + \brief Data Memory Barrier + \details Ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +#define __DMB() do {\ + __schedule_barrier();\ + __dmb(0xF);\ + __schedule_barrier();\ + } while (0U) + + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV __rev + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. + \param [in] value Value to reverse + \return Reversed value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value) +{ + rev16 r0, r0 + bx lr +} +#endif + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. + \param [in] value Value to reverse + \return Reversed value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int16_t __REVSH(int16_t value) +{ + revsh r0, r0 + bx lr +} +#endif + + +/** + \brief Rotate Right in unsigned value (32 bit) + \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + \param [in] op1 Value to rotate + \param [in] op2 Number of Bits to rotate + \return Rotated value + */ +#define __ROR __ror + + +/** + \brief Breakpoint + \details Causes the processor to enter Debug state. + Debug tools can use this to investigate system state when the instruction at a particular address is reached. + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __breakpoint(value) + + +/** + \brief Reverse bit order of value + \details Reverses the bit order of the given value. + \param [in] value Value to reverse + \return Reversed value + */ +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + #define __RBIT __rbit +#else +__attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value) +{ + uint32_t result; + uint32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */ + + result = value; /* r will be reversed bits of v; first get LSB of v */ + for (value >>= 1U; value != 0U; value >>= 1U) + { + result <<= 1U; + result |= value & 1U; + s--; + } + result <<= s; /* shift when v's highest bits are zero */ + return result; +} +#endif + + +/** + \brief Count leading zeros + \details Counts the number of leading zeros of a data value. + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +#define __CLZ __clz + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr)) +#else + #define __LDREXB(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint8_t ) __ldrex(ptr)) _Pragma("pop") +#endif + + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __LDREXH(ptr) ((uint16_t) __ldrex(ptr)) +#else + #define __LDREXH(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint16_t) __ldrex(ptr)) _Pragma("pop") +#endif + + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr)) +#else + #define __LDREXW(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint32_t ) __ldrex(ptr)) _Pragma("pop") +#endif + + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __STREXB(value, ptr) __strex(value, ptr) +#else + #define __STREXB(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") +#endif + + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __STREXH(value, ptr) __strex(value, ptr) +#else + #define __STREXH(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") +#endif + + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __STREXW(value, ptr) __strex(value, ptr) +#else + #define __STREXW(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") +#endif + + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +#define __CLREX __clrex + + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT __ssat + + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT __usat + + +/** + \brief Rotate Right with Extend (32 bit) + \details Moves each bit of a bitstring right by one bit. + The carry input is shifted in at the left end of the bitstring. + \param [in] value Value to rotate + \return Rotated value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".rrx_text"))) __STATIC_INLINE __ASM uint32_t __RRX(uint32_t value) +{ + rrx r0, r0 + bx lr +} +#endif + + +/** + \brief LDRT Unprivileged (8 bit) + \details Executes a Unprivileged LDRT instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDRBT(ptr) ((uint8_t ) __ldrt(ptr)) + + +/** + \brief LDRT Unprivileged (16 bit) + \details Executes a Unprivileged LDRT instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDRHT(ptr) ((uint16_t) __ldrt(ptr)) + + +/** + \brief LDRT Unprivileged (32 bit) + \details Executes a Unprivileged LDRT instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDRT(ptr) ((uint32_t ) __ldrt(ptr)) + + +/** + \brief STRT Unprivileged (8 bit) + \details Executes a Unprivileged STRT instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +#define __STRBT(value, ptr) __strt(value, ptr) + + +/** + \brief STRT Unprivileged (16 bit) + \details Executes a Unprivileged STRT instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +#define __STRHT(value, ptr) __strt(value, ptr) + + +/** + \brief STRT Unprivileged (32 bit) + \details Executes a Unprivileged STRT instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +#define __STRT(value, ptr) __strt(value, ptr) + +#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +__attribute__((always_inline)) __STATIC_INLINE int32_t __SSAT(int32_t val, uint32_t sat) +{ + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; +} + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __USAT(int32_t val, uint32_t sat) +{ + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +#if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + +#define __SADD8 __sadd8 +#define __QADD8 __qadd8 +#define __SHADD8 __shadd8 +#define __UADD8 __uadd8 +#define __UQADD8 __uqadd8 +#define __UHADD8 __uhadd8 +#define __SSUB8 __ssub8 +#define __QSUB8 __qsub8 +#define __SHSUB8 __shsub8 +#define __USUB8 __usub8 +#define __UQSUB8 __uqsub8 +#define __UHSUB8 __uhsub8 +#define __SADD16 __sadd16 +#define __QADD16 __qadd16 +#define __SHADD16 __shadd16 +#define __UADD16 __uadd16 +#define __UQADD16 __uqadd16 +#define __UHADD16 __uhadd16 +#define __SSUB16 __ssub16 +#define __QSUB16 __qsub16 +#define __SHSUB16 __shsub16 +#define __USUB16 __usub16 +#define __UQSUB16 __uqsub16 +#define __UHSUB16 __uhsub16 +#define __SASX __sasx +#define __QASX __qasx +#define __SHASX __shasx +#define __UASX __uasx +#define __UQASX __uqasx +#define __UHASX __uhasx +#define __SSAX __ssax +#define __QSAX __qsax +#define __SHSAX __shsax +#define __USAX __usax +#define __UQSAX __uqsax +#define __UHSAX __uhsax +#define __USAD8 __usad8 +#define __USADA8 __usada8 +#define __SSAT16 __ssat16 +#define __USAT16 __usat16 +#define __UXTB16 __uxtb16 +#define __UXTAB16 __uxtab16 +#define __SXTB16 __sxtb16 +#define __SXTAB16 __sxtab16 +#define __SMUAD __smuad +#define __SMUADX __smuadx +#define __SMLAD __smlad +#define __SMLADX __smladx +#define __SMLALD __smlald +#define __SMLALDX __smlaldx +#define __SMUSD __smusd +#define __SMUSDX __smusdx +#define __SMLSD __smlsd +#define __SMLSDX __smlsdx +#define __SMLSLD __smlsld +#define __SMLSLDX __smlsldx +#define __SEL __sel +#define __QADD __qadd +#define __QSUB __qsub + +#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ + ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) + +#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ + ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) + +#define __SMMLA(ARG1,ARG2,ARG3) ( (int32_t)((((int64_t)(ARG1) * (ARG2)) + \ + ((int64_t)(ARG3) << 32U) ) >> 32U)) + +#endif /* ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ +/*@} end of group CMSIS_SIMD_intrinsics */ + + +#endif /* __CMSIS_ARMCC_H */ diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Include/cmsis_armclang.h b/STM32CubeMX/revF/Drivers/CMSIS/Include/cmsis_armclang.h new file mode 100644 index 00000000..162a400e --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Include/cmsis_armclang.h @@ -0,0 +1,1869 @@ +/**************************************************************************//** + * @file cmsis_armclang.h + * @brief CMSIS compiler armclang (Arm Compiler 6) header file + * @version V5.0.4 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*lint -esym(9058, IRQn)*/ /* disable MISRA 2012 Rule 2.4 for IRQn */ + +#ifndef __CMSIS_ARMCLANG_H +#define __CMSIS_ARMCLANG_H + +#pragma clang system_header /* treat file as system include file */ + +#ifndef __ARM_COMPAT_H +#include /* Compatibility header for Arm Compiler 5 intrinsics */ +#endif + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM __asm +#endif +#ifndef __INLINE + #define __INLINE __inline +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static __inline +#endif +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __attribute__((always_inline)) static __inline +#endif +#ifndef __NO_RETURN + #define __NO_RETURN __attribute__((__noreturn__)) +#endif +#ifndef __USED + #define __USED __attribute__((used)) +#endif +#ifndef __WEAK + #define __WEAK __attribute__((weak)) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_UNION + #define __PACKED_UNION union __attribute__((packed, aligned(1))) +#endif +#ifndef __UNALIGNED_UINT32 /* deprecated */ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32 */ + struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) +#endif +#ifndef __UNALIGNED_UINT16_WRITE + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT16_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_WRITE */ + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT16_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_READ */ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) +#endif +#ifndef __UNALIGNED_UINT32_WRITE + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_WRITE */ + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_READ */ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif + + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +/** + \brief Enable IRQ Interrupts + \details Enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __enable_irq(); see arm_compat.h */ + + +/** + \brief Disable IRQ Interrupts + \details Disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __disable_irq(); see arm_compat.h */ + + +/** + \brief Get Control Register + \details Returns the content of the Control Register. + \return Control Register value + */ +__STATIC_FORCEINLINE uint32_t __get_CONTROL(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Control Register (non-secure) + \details Returns the content of the non-secure Control Register when in secure mode. + \return non-secure Control Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Control Register + \details Writes the given value to the Control Register. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) +{ + __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Control Register (non-secure) + \details Writes the given value to the non-secure Control Register when in secure state. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) +{ + __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); +} +#endif + + +/** + \brief Get IPSR Register + \details Returns the content of the IPSR Register. + \return IPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_IPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get APSR Register + \details Returns the content of the APSR Register. + \return APSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_APSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, apsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get xPSR Register + \details Returns the content of the xPSR Register. + \return xPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_xPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get Process Stack Pointer + \details Returns the current value of the Process Stack Pointer (PSP). + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSP(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, psp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer (non-secure) + \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state. + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Process Stack Pointer + \details Assigns the given value to the Process Stack Pointer (PSP). + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state. + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); +} +#endif + + +/** + \brief Get Main Stack Pointer + \details Returns the current value of the Main Stack Pointer (MSP). + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSP(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, msp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer (non-secure) + \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state. + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Main Stack Pointer + \details Assigns the given value to the Main Stack Pointer (MSP). + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); +} +#endif + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Stack Pointer (non-secure) + \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. + \return SP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); + return(result); +} + + +/** + \brief Set Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. + \param [in] topOfStack Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) +{ + __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); +} +#endif + + +/** + \brief Get Priority Mask + \details Returns the current state of the priority mask bit from the Priority Mask Register. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Priority Mask (non-secure) + \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Priority Mask + \details Assigns the given value to the Priority Mask Register. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) +{ + __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Priority Mask (non-secure) + \details Assigns the given value to the non-secure Priority Mask Register when in secure state. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) +{ + __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); +} +#endif + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Enable FIQ + \details Enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __enable_fault_irq __enable_fiq /* see arm_compat.h */ + + +/** + \brief Disable FIQ + \details Disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __disable_fault_irq __disable_fiq /* see arm_compat.h */ + + +/** + \brief Get Base Priority + \details Returns the current value of the Base Priority register. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Base Priority (non-secure) + \details Returns the current value of the non-secure Base Priority register when in secure state. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Base Priority + \details Assigns the given value to the Base Priority register. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) +{ + __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Base Priority (non-secure) + \details Assigns the given value to the non-secure Base Priority register when in secure state. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); +} +#endif + + +/** + \brief Set Base Priority with condition + \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, + or the new value increases the BASEPRI priority level. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); +} + + +/** + \brief Get Fault Mask + \details Returns the current value of the Fault Mask register. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Fault Mask (non-secure) + \details Returns the current value of the non-secure Fault Mask register when in secure state. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Fault Mask + \details Assigns the given value to the Fault Mask register. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Fault Mask (non-secure) + \details Assigns the given value to the non-secure Fault Mask register when in secure state. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); +} +#endif + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + +/** + \brief Get Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, psplim" : "=r" (result) ); + return result; +#endif +} + +#if (defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); +#endif +} +#endif + + +/** + \brief Get Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, msplim" : "=r" (result) ); + return result; +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state. + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). + \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state. + \param [in] MainStackPtrLimit Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); +#endif +} +#endif + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + +/** + \brief Get FPSCR + \details Returns the current value of the Floating Point Status/Control register. + \return Floating Point Status/Control register value + */ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#define __get_FPSCR (uint32_t)__builtin_arm_get_fpscr +#else +#define __get_FPSCR() ((uint32_t)0U) +#endif + +/** + \brief Set FPSCR + \details Assigns the given value to the Floating Point Status/Control register. + \param [in] fpscr Floating Point Status/Control value to set + */ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#define __set_FPSCR __builtin_arm_set_fpscr +#else +#define __set_FPSCR(x) ((void)(x)) +#endif + + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +/* Define macros for porting to both thumb1 and thumb2. + * For thumb1, use low register (r0-r7), specified by constraint "l" + * Otherwise, use general registers, specified by constraint "r" */ +#if defined (__thumb__) && !defined (__thumb2__) +#define __CMSIS_GCC_OUT_REG(r) "=l" (r) +#define __CMSIS_GCC_USE_REG(r) "l" (r) +#else +#define __CMSIS_GCC_OUT_REG(r) "=r" (r) +#define __CMSIS_GCC_USE_REG(r) "r" (r) +#endif + +/** + \brief No Operation + \details No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP __builtin_arm_nop + +/** + \brief Wait For Interrupt + \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. + */ +#define __WFI __builtin_arm_wfi + + +/** + \brief Wait For Event + \details Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE __builtin_arm_wfe + + +/** + \brief Send Event + \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV __builtin_arm_sev + + +/** + \brief Instruction Synchronization Barrier + \details Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or memory, + after the instruction has been completed. + */ +#define __ISB() __builtin_arm_isb(0xF); + +/** + \brief Data Synchronization Barrier + \details Acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +#define __DSB() __builtin_arm_dsb(0xF); + + +/** + \brief Data Memory Barrier + \details Ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +#define __DMB() __builtin_arm_dmb(0xF); + + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV(value) __builtin_bswap32(value) + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV16(value) __ROR(__REV(value), 16) + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REVSH(value) (int16_t)__builtin_bswap16(value) + + +/** + \brief Rotate Right in unsigned value (32 bit) + \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + \param [in] op1 Value to rotate + \param [in] op2 Number of Bits to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) +{ + op2 %= 32U; + if (op2 == 0U) + { + return op1; + } + return (op1 >> op2) | (op1 << (32U - op2)); +} + + +/** + \brief Breakpoint + \details Causes the processor to enter Debug state. + Debug tools can use this to investigate system state when the instruction at a particular address is reached. + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __ASM volatile ("bkpt "#value) + + +/** + \brief Reverse bit order of value + \details Reverses the bit order of the given value. + \param [in] value Value to reverse + \return Reversed value + */ +#define __RBIT __builtin_arm_rbit + +/** + \brief Count leading zeros + \details Counts the number of leading zeros of a data value. + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +#define __CLZ (uint8_t)__builtin_clz + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDREXB (uint8_t)__builtin_arm_ldrex + + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDREXH (uint16_t)__builtin_arm_ldrex + + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDREXW (uint32_t)__builtin_arm_ldrex + + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXB (uint32_t)__builtin_arm_strex + + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXH (uint32_t)__builtin_arm_strex + + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXW (uint32_t)__builtin_arm_strex + + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +#define __CLREX __builtin_arm_clrex + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT __builtin_arm_ssat + + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT __builtin_arm_usat + + +/** + \brief Rotate Right with Extend (32 bit) + \details Moves each bit of a bitstring right by one bit. + The carry input is shifted in at the left end of the bitstring. + \param [in] value Value to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __RRX(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +} + + +/** + \brief LDRT Unprivileged (8 bit) + \details Executes a Unprivileged LDRT instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (16 bit) + \details Executes a Unprivileged LDRT instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (32 bit) + \details Executes a Unprivileged LDRT instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief STRT Unprivileged (8 bit) + \details Executes a Unprivileged STRT instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (16 bit) + \details Executes a Unprivileged STRT instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (32 bit) + \details Executes a Unprivileged STRT instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) ); +} + +#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +__STATIC_FORCEINLINE int32_t __SSAT(int32_t val, uint32_t sat) +{ + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; +} + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +__STATIC_FORCEINLINE uint32_t __USAT(int32_t val, uint32_t sat) +{ + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief Load-Acquire (8 bit) + \details Executes a LDAB instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); +} + + +/** + \brief Load-Acquire (16 bit) + \details Executes a LDAH instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); +} + + +/** + \brief Load-Acquire (32 bit) + \details Executes a LDA instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief Store-Release (8 bit) + \details Executes a STLB instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (16 bit) + \details Executes a STLH instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (32 bit) + \details Executes a STL instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Load-Acquire Exclusive (8 bit) + \details Executes a LDAB exclusive instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDAEXB (uint8_t)__builtin_arm_ldaex + + +/** + \brief Load-Acquire Exclusive (16 bit) + \details Executes a LDAH exclusive instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDAEXH (uint16_t)__builtin_arm_ldaex + + +/** + \brief Load-Acquire Exclusive (32 bit) + \details Executes a LDA exclusive instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDAEX (uint32_t)__builtin_arm_ldaex + + +/** + \brief Store-Release Exclusive (8 bit) + \details Executes a STLB exclusive instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEXB (uint32_t)__builtin_arm_stlex + + +/** + \brief Store-Release Exclusive (16 bit) + \details Executes a STLH exclusive instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEXH (uint32_t)__builtin_arm_stlex + + +/** + \brief Store-Release Exclusive (32 bit) + \details Executes a STL exclusive instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEX (uint32_t)__builtin_arm_stlex + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) + +__STATIC_FORCEINLINE uint32_t __SADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__STATIC_FORCEINLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__STATIC_FORCEINLINE uint32_t __SADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USAD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#define __SSAT16(ARG1,ARG2) \ +({ \ + int32_t __RES, __ARG1 = (ARG1); \ + __ASM ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +#define __USAT16(ARG1,ARG2) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +__STATIC_FORCEINLINE uint32_t __UXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile ("uxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile ("sxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint64_t __SMLALD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint64_t __SMLALDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint64_t __SMLSLD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint64_t __SMLSLDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint32_t __SEL (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE int32_t __QADD( int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE int32_t __QSUB( int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +#if 0 +#define __PKHBT(ARG1,ARG2,ARG3) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ + __ASM ("pkhbt %0, %1, %2, lsl %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ + __RES; \ + }) + +#define __PKHTB(ARG1,ARG2,ARG3) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ + if (ARG3 == 0) \ + __ASM ("pkhtb %0, %1, %2" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2) ); \ + else \ + __ASM ("pkhtb %0, %1, %2, asr %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ + __RES; \ + }) +#endif + +#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ + ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) + +#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ + ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) + +__STATIC_FORCEINLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) +{ + int32_t result; + + __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#endif /* (__ARM_FEATURE_DSP == 1) */ +/*@} end of group CMSIS_SIMD_intrinsics */ + + +#endif /* __CMSIS_ARMCLANG_H */ diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Include/cmsis_compiler.h b/STM32CubeMX/revF/Drivers/CMSIS/Include/cmsis_compiler.h new file mode 100644 index 00000000..94212eb8 --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Include/cmsis_compiler.h @@ -0,0 +1,266 @@ +/**************************************************************************//** + * @file cmsis_compiler.h + * @brief CMSIS compiler generic header file + * @version V5.0.4 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CMSIS_COMPILER_H +#define __CMSIS_COMPILER_H + +#include + +/* + * Arm Compiler 4/5 + */ +#if defined ( __CC_ARM ) + #include "cmsis_armcc.h" + + +/* + * Arm Compiler 6 (armclang) + */ +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #include "cmsis_armclang.h" + + +/* + * GNU Compiler + */ +#elif defined ( __GNUC__ ) + #include "cmsis_gcc.h" + + +/* + * IAR Compiler + */ +#elif defined ( __ICCARM__ ) + #include + + +/* + * TI Arm Compiler + */ +#elif defined ( __TI_ARM__ ) + #include + + #ifndef __ASM + #define __ASM __asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __STATIC_INLINE + #endif + #ifndef __NO_RETURN + #define __NO_RETURN __attribute__((noreturn)) + #endif + #ifndef __USED + #define __USED __attribute__((used)) + #endif + #ifndef __WEAK + #define __WEAK __attribute__((weak)) + #endif + #ifndef __PACKED + #define __PACKED __attribute__((packed)) + #endif + #ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __attribute__((packed)) + #endif + #ifndef __PACKED_UNION + #define __PACKED_UNION union __attribute__((packed)) + #endif + #ifndef __UNALIGNED_UINT32 /* deprecated */ + struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __UNALIGNED_UINT16_WRITE + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void*)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT16_READ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) + #endif + #ifndef __UNALIGNED_UINT32_WRITE + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT32_READ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) + #endif + #ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) + #endif + #ifndef __RESTRICT + #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. + #define __RESTRICT + #endif + + +/* + * TASKING Compiler + */ +#elif defined ( __TASKING__ ) + /* + * The CMSIS functions have been implemented as intrinsics in the compiler. + * Please use "carm -?i" to get an up to date list of all intrinsics, + * Including the CMSIS ones. + */ + + #ifndef __ASM + #define __ASM __asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __STATIC_INLINE + #endif + #ifndef __NO_RETURN + #define __NO_RETURN __attribute__((noreturn)) + #endif + #ifndef __USED + #define __USED __attribute__((used)) + #endif + #ifndef __WEAK + #define __WEAK __attribute__((weak)) + #endif + #ifndef __PACKED + #define __PACKED __packed__ + #endif + #ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __packed__ + #endif + #ifndef __PACKED_UNION + #define __PACKED_UNION union __packed__ + #endif + #ifndef __UNALIGNED_UINT32 /* deprecated */ + struct __packed__ T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __UNALIGNED_UINT16_WRITE + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT16_READ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) + #endif + #ifndef __UNALIGNED_UINT32_WRITE + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT32_READ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) + #endif + #ifndef __ALIGNED + #define __ALIGNED(x) __align(x) + #endif + #ifndef __RESTRICT + #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. + #define __RESTRICT + #endif + + +/* + * COSMIC Compiler + */ +#elif defined ( __CSMC__ ) + #include + + #ifndef __ASM + #define __ASM _asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __STATIC_INLINE + #endif + #ifndef __NO_RETURN + // NO RETURN is automatically detected hence no warning here + #define __NO_RETURN + #endif + #ifndef __USED + #warning No compiler specific solution for __USED. __USED is ignored. + #define __USED + #endif + #ifndef __WEAK + #define __WEAK __weak + #endif + #ifndef __PACKED + #define __PACKED @packed + #endif + #ifndef __PACKED_STRUCT + #define __PACKED_STRUCT @packed struct + #endif + #ifndef __PACKED_UNION + #define __PACKED_UNION @packed union + #endif + #ifndef __UNALIGNED_UINT32 /* deprecated */ + @packed struct T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __UNALIGNED_UINT16_WRITE + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT16_READ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) + #endif + #ifndef __UNALIGNED_UINT32_WRITE + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT32_READ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) + #endif + #ifndef __ALIGNED + #warning No compiler specific solution for __ALIGNED. __ALIGNED is ignored. + #define __ALIGNED(x) + #endif + #ifndef __RESTRICT + #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. + #define __RESTRICT + #endif + + +#else + #error Unknown compiler. +#endif + + +#endif /* __CMSIS_COMPILER_H */ + diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Include/cmsis_gcc.h b/STM32CubeMX/revF/Drivers/CMSIS/Include/cmsis_gcc.h new file mode 100644 index 00000000..2d9db15a --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Include/cmsis_gcc.h @@ -0,0 +1,2085 @@ +/**************************************************************************//** + * @file cmsis_gcc.h + * @brief CMSIS compiler GCC header file + * @version V5.0.4 + * @date 09. April 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CMSIS_GCC_H +#define __CMSIS_GCC_H + +/* ignore some GCC warnings */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wsign-conversion" +#pragma GCC diagnostic ignored "-Wconversion" +#pragma GCC diagnostic ignored "-Wunused-parameter" + +/* Fallback for __has_builtin */ +#ifndef __has_builtin + #define __has_builtin(x) (0) +#endif + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM __asm +#endif +#ifndef __INLINE + #define __INLINE inline +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline +#endif +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __attribute__((always_inline)) static inline +#endif +#ifndef __NO_RETURN + #define __NO_RETURN __attribute__((__noreturn__)) +#endif +#ifndef __USED + #define __USED __attribute__((used)) +#endif +#ifndef __WEAK + #define __WEAK __attribute__((weak)) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_UNION + #define __PACKED_UNION union __attribute__((packed, aligned(1))) +#endif +#ifndef __UNALIGNED_UINT32 /* deprecated */ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) +#endif +#ifndef __UNALIGNED_UINT16_WRITE + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) +#endif +#ifndef __UNALIGNED_UINT32_WRITE + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif + + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +/** + \brief Enable IRQ Interrupts + \details Enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __enable_irq(void) +{ + __ASM volatile ("cpsie i" : : : "memory"); +} + + +/** + \brief Disable IRQ Interrupts + \details Disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __disable_irq(void) +{ + __ASM volatile ("cpsid i" : : : "memory"); +} + + +/** + \brief Get Control Register + \details Returns the content of the Control Register. + \return Control Register value + */ +__STATIC_FORCEINLINE uint32_t __get_CONTROL(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Control Register (non-secure) + \details Returns the content of the non-secure Control Register when in secure mode. + \return non-secure Control Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Control Register + \details Writes the given value to the Control Register. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) +{ + __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Control Register (non-secure) + \details Writes the given value to the non-secure Control Register when in secure state. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) +{ + __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); +} +#endif + + +/** + \brief Get IPSR Register + \details Returns the content of the IPSR Register. + \return IPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_IPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get APSR Register + \details Returns the content of the APSR Register. + \return APSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_APSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, apsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get xPSR Register + \details Returns the content of the xPSR Register. + \return xPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_xPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get Process Stack Pointer + \details Returns the current value of the Process Stack Pointer (PSP). + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSP(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, psp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer (non-secure) + \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state. + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Process Stack Pointer + \details Assigns the given value to the Process Stack Pointer (PSP). + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state. + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); +} +#endif + + +/** + \brief Get Main Stack Pointer + \details Returns the current value of the Main Stack Pointer (MSP). + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSP(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, msp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer (non-secure) + \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state. + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Main Stack Pointer + \details Assigns the given value to the Main Stack Pointer (MSP). + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); +} +#endif + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Stack Pointer (non-secure) + \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. + \return SP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); + return(result); +} + + +/** + \brief Set Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. + \param [in] topOfStack Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) +{ + __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); +} +#endif + + +/** + \brief Get Priority Mask + \details Returns the current state of the priority mask bit from the Priority Mask Register. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask" : "=r" (result) :: "memory"); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Priority Mask (non-secure) + \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask_ns" : "=r" (result) :: "memory"); + return(result); +} +#endif + + +/** + \brief Set Priority Mask + \details Assigns the given value to the Priority Mask Register. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) +{ + __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Priority Mask (non-secure) + \details Assigns the given value to the non-secure Priority Mask Register when in secure state. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) +{ + __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); +} +#endif + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Enable FIQ + \details Enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __enable_fault_irq(void) +{ + __ASM volatile ("cpsie f" : : : "memory"); +} + + +/** + \brief Disable FIQ + \details Disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __disable_fault_irq(void) +{ + __ASM volatile ("cpsid f" : : : "memory"); +} + + +/** + \brief Get Base Priority + \details Returns the current value of the Base Priority register. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Base Priority (non-secure) + \details Returns the current value of the non-secure Base Priority register when in secure state. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Base Priority + \details Assigns the given value to the Base Priority register. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) +{ + __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Base Priority (non-secure) + \details Assigns the given value to the non-secure Base Priority register when in secure state. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); +} +#endif + + +/** + \brief Set Base Priority with condition + \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, + or the new value increases the BASEPRI priority level. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); +} + + +/** + \brief Get Fault Mask + \details Returns the current value of the Fault Mask register. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Fault Mask (non-secure) + \details Returns the current value of the non-secure Fault Mask register when in secure state. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Fault Mask + \details Assigns the given value to the Fault Mask register. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Fault Mask (non-secure) + \details Assigns the given value to the non-secure Fault Mask register when in secure state. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); +} +#endif + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + +/** + \brief Get Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, psplim" : "=r" (result) ); + return result; +#endif +} + +#if (defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); +#endif +} +#endif + + +/** + \brief Get Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, msplim" : "=r" (result) ); + return result; +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state. + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). + \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state. + \param [in] MainStackPtrLimit Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); +#endif +} +#endif + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + + +/** + \brief Get FPSCR + \details Returns the current value of the Floating Point Status/Control register. + \return Floating Point Status/Control register value + */ +__STATIC_FORCEINLINE uint32_t __get_FPSCR(void) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#if __has_builtin(__builtin_arm_get_fpscr) +// Re-enable using built-in when GCC has been fixed +// || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) + /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ + return __builtin_arm_get_fpscr(); +#else + uint32_t result; + + __ASM volatile ("VMRS %0, fpscr" : "=r" (result) ); + return(result); +#endif +#else + return(0U); +#endif +} + + +/** + \brief Set FPSCR + \details Assigns the given value to the Floating Point Status/Control register. + \param [in] fpscr Floating Point Status/Control value to set + */ +__STATIC_FORCEINLINE void __set_FPSCR(uint32_t fpscr) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#if __has_builtin(__builtin_arm_set_fpscr) +// Re-enable using built-in when GCC has been fixed +// || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) + /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ + __builtin_arm_set_fpscr(fpscr); +#else + __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc", "memory"); +#endif +#else + (void)fpscr; +#endif +} + + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +/* Define macros for porting to both thumb1 and thumb2. + * For thumb1, use low register (r0-r7), specified by constraint "l" + * Otherwise, use general registers, specified by constraint "r" */ +#if defined (__thumb__) && !defined (__thumb2__) +#define __CMSIS_GCC_OUT_REG(r) "=l" (r) +#define __CMSIS_GCC_RW_REG(r) "+l" (r) +#define __CMSIS_GCC_USE_REG(r) "l" (r) +#else +#define __CMSIS_GCC_OUT_REG(r) "=r" (r) +#define __CMSIS_GCC_RW_REG(r) "+r" (r) +#define __CMSIS_GCC_USE_REG(r) "r" (r) +#endif + +/** + \brief No Operation + \details No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP() __ASM volatile ("nop") + +/** + \brief Wait For Interrupt + \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. + */ +#define __WFI() __ASM volatile ("wfi") + + +/** + \brief Wait For Event + \details Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE() __ASM volatile ("wfe") + + +/** + \brief Send Event + \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV() __ASM volatile ("sev") + + +/** + \brief Instruction Synchronization Barrier + \details Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or memory, + after the instruction has been completed. + */ +__STATIC_FORCEINLINE void __ISB(void) +{ + __ASM volatile ("isb 0xF":::"memory"); +} + + +/** + \brief Data Synchronization Barrier + \details Acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +__STATIC_FORCEINLINE void __DSB(void) +{ + __ASM volatile ("dsb 0xF":::"memory"); +} + + +/** + \brief Data Memory Barrier + \details Ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +__STATIC_FORCEINLINE void __DMB(void) +{ + __ASM volatile ("dmb 0xF":::"memory"); +} + + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE uint32_t __REV(uint32_t value) +{ +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) + return __builtin_bswap32(value); +#else + uint32_t result; + + __ASM volatile ("rev %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return result; +#endif +} + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE uint32_t __REV16(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rev16 %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return result; +} + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE int16_t __REVSH(int16_t value) +{ +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + return (int16_t)__builtin_bswap16(value); +#else + int16_t result; + + __ASM volatile ("revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return result; +#endif +} + + +/** + \brief Rotate Right in unsigned value (32 bit) + \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + \param [in] op1 Value to rotate + \param [in] op2 Number of Bits to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) +{ + op2 %= 32U; + if (op2 == 0U) + { + return op1; + } + return (op1 >> op2) | (op1 << (32U - op2)); +} + + +/** + \brief Breakpoint + \details Causes the processor to enter Debug state. + Debug tools can use this to investigate system state when the instruction at a particular address is reached. + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __ASM volatile ("bkpt "#value) + + +/** + \brief Reverse bit order of value + \details Reverses the bit order of the given value. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE uint32_t __RBIT(uint32_t value) +{ + uint32_t result; + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); +#else + uint32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */ + + result = value; /* r will be reversed bits of v; first get LSB of v */ + for (value >>= 1U; value != 0U; value >>= 1U) + { + result <<= 1U; + result |= value & 1U; + s--; + } + result <<= s; /* shift when v's highest bits are zero */ +#endif + return result; +} + + +/** + \brief Count leading zeros + \details Counts the number of leading zeros of a data value. + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +#define __CLZ (uint8_t)__builtin_clz + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDREXB(volatile uint8_t *addr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrexb %0, %1" : "=r" (result) : "Q" (*addr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); +#endif + return ((uint8_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDREXH(volatile uint16_t *addr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrexh %0, %1" : "=r" (result) : "Q" (*addr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); +#endif + return ((uint16_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDREXW(volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) ); + return(result); +} + + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr) +{ + uint32_t result; + + __ASM volatile ("strexb %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr) +{ + uint32_t result; + + __ASM volatile ("strexh %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) ); + return(result); +} + + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +__STATIC_FORCEINLINE void __CLREX(void) +{ + __ASM volatile ("clrex" ::: "memory"); +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] ARG1 Value to be saturated + \param [in] ARG2 Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT(ARG1,ARG2) \ +__extension__ \ +({ \ + int32_t __RES, __ARG1 = (ARG1); \ + __ASM ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] ARG1 Value to be saturated + \param [in] ARG2 Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT(ARG1,ARG2) \ + __extension__ \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + + +/** + \brief Rotate Right with Extend (32 bit) + \details Moves each bit of a bitstring right by one bit. + The carry input is shifted in at the left end of the bitstring. + \param [in] value Value to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __RRX(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +} + + +/** + \brief LDRT Unprivileged (8 bit) + \details Executes a Unprivileged LDRT instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrbt %0, [%1]" : "=r" (result) : "r" (ptr) : "memory" ); +#endif + return ((uint8_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (16 bit) + \details Executes a Unprivileged LDRT instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrht %0, [%1]" : "=r" (result) : "r" (ptr) : "memory" ); +#endif + return ((uint16_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (32 bit) + \details Executes a Unprivileged LDRT instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief STRT Unprivileged (8 bit) + \details Executes a Unprivileged STRT instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (16 bit) + \details Executes a Unprivileged STRT instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (32 bit) + \details Executes a Unprivileged STRT instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) ); +} + +#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +__STATIC_FORCEINLINE int32_t __SSAT(int32_t val, uint32_t sat) +{ + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; +} + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +__STATIC_FORCEINLINE uint32_t __USAT(int32_t val, uint32_t sat) +{ + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief Load-Acquire (8 bit) + \details Executes a LDAB instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); +} + + +/** + \brief Load-Acquire (16 bit) + \details Executes a LDAH instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); +} + + +/** + \brief Load-Acquire (32 bit) + \details Executes a LDA instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief Store-Release (8 bit) + \details Executes a STLB instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (16 bit) + \details Executes a STLH instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (32 bit) + \details Executes a STL instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Load-Acquire Exclusive (8 bit) + \details Executes a LDAB exclusive instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDAEXB(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldaexb %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); +} + + +/** + \brief Load-Acquire Exclusive (16 bit) + \details Executes a LDAH exclusive instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDAEXH(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldaexh %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); +} + + +/** + \brief Load-Acquire Exclusive (32 bit) + \details Executes a LDA exclusive instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDAEX(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldaex %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief Store-Release Exclusive (8 bit) + \details Executes a STLB exclusive instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STLEXB(uint8_t value, volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("stlexb %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief Store-Release Exclusive (16 bit) + \details Executes a STLH exclusive instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STLEXH(uint16_t value, volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("stlexh %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief Store-Release Exclusive (32 bit) + \details Executes a STL exclusive instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STLEX(uint32_t value, volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("stlex %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) ); + return(result); +} + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) + +__STATIC_FORCEINLINE uint32_t __SADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__STATIC_FORCEINLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__STATIC_FORCEINLINE uint32_t __SADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USAD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#define __SSAT16(ARG1,ARG2) \ +({ \ + int32_t __RES, __ARG1 = (ARG1); \ + __ASM ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +#define __USAT16(ARG1,ARG2) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +__STATIC_FORCEINLINE uint32_t __UXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile ("uxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile ("sxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint64_t __SMLALD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint64_t __SMLALDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint64_t __SMLSLD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint64_t __SMLSLDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint32_t __SEL (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE int32_t __QADD( int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE int32_t __QSUB( int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +#if 0 +#define __PKHBT(ARG1,ARG2,ARG3) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ + __ASM ("pkhbt %0, %1, %2, lsl %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ + __RES; \ + }) + +#define __PKHTB(ARG1,ARG2,ARG3) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ + if (ARG3 == 0) \ + __ASM ("pkhtb %0, %1, %2" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2) ); \ + else \ + __ASM ("pkhtb %0, %1, %2, asr %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ + __RES; \ + }) +#endif + +#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ + ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) + +#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ + ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) + +__STATIC_FORCEINLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) +{ + int32_t result; + + __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#endif /* (__ARM_FEATURE_DSP == 1) */ +/*@} end of group CMSIS_SIMD_intrinsics */ + + +#pragma GCC diagnostic pop + +#endif /* __CMSIS_GCC_H */ diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Include/cmsis_iccarm.h b/STM32CubeMX/revF/Drivers/CMSIS/Include/cmsis_iccarm.h new file mode 100644 index 00000000..11c4af0e --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Include/cmsis_iccarm.h @@ -0,0 +1,935 @@ +/**************************************************************************//** + * @file cmsis_iccarm.h + * @brief CMSIS compiler ICCARM (IAR Compiler for Arm) header file + * @version V5.0.7 + * @date 19. June 2018 + ******************************************************************************/ + +//------------------------------------------------------------------------------ +// +// Copyright (c) 2017-2018 IAR Systems +// +// Licensed under the Apache License, Version 2.0 (the "License") +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//------------------------------------------------------------------------------ + + +#ifndef __CMSIS_ICCARM_H__ +#define __CMSIS_ICCARM_H__ + +#ifndef __ICCARM__ + #error This file should only be compiled by ICCARM +#endif + +#pragma system_include + +#define __IAR_FT _Pragma("inline=forced") __intrinsic + +#if (__VER__ >= 8000000) + #define __ICCARM_V8 1 +#else + #define __ICCARM_V8 0 +#endif + +#ifndef __ALIGNED + #if __ICCARM_V8 + #define __ALIGNED(x) __attribute__((aligned(x))) + #elif (__VER__ >= 7080000) + /* Needs IAR language extensions */ + #define __ALIGNED(x) __attribute__((aligned(x))) + #else + #warning No compiler specific solution for __ALIGNED.__ALIGNED is ignored. + #define __ALIGNED(x) + #endif +#endif + + +/* Define compiler macros for CPU architecture, used in CMSIS 5. + */ +#if __ARM_ARCH_6M__ || __ARM_ARCH_7M__ || __ARM_ARCH_7EM__ || __ARM_ARCH_8M_BASE__ || __ARM_ARCH_8M_MAIN__ +/* Macros already defined */ +#else + #if defined(__ARM8M_MAINLINE__) || defined(__ARM8EM_MAINLINE__) + #define __ARM_ARCH_8M_MAIN__ 1 + #elif defined(__ARM8M_BASELINE__) + #define __ARM_ARCH_8M_BASE__ 1 + #elif defined(__ARM_ARCH_PROFILE) && __ARM_ARCH_PROFILE == 'M' + #if __ARM_ARCH == 6 + #define __ARM_ARCH_6M__ 1 + #elif __ARM_ARCH == 7 + #if __ARM_FEATURE_DSP + #define __ARM_ARCH_7EM__ 1 + #else + #define __ARM_ARCH_7M__ 1 + #endif + #endif /* __ARM_ARCH */ + #endif /* __ARM_ARCH_PROFILE == 'M' */ +#endif + +/* Alternativ core deduction for older ICCARM's */ +#if !defined(__ARM_ARCH_6M__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7EM__) && \ + !defined(__ARM_ARCH_8M_BASE__) && !defined(__ARM_ARCH_8M_MAIN__) + #if defined(__ARM6M__) && (__CORE__ == __ARM6M__) + #define __ARM_ARCH_6M__ 1 + #elif defined(__ARM7M__) && (__CORE__ == __ARM7M__) + #define __ARM_ARCH_7M__ 1 + #elif defined(__ARM7EM__) && (__CORE__ == __ARM7EM__) + #define __ARM_ARCH_7EM__ 1 + #elif defined(__ARM8M_BASELINE__) && (__CORE == __ARM8M_BASELINE__) + #define __ARM_ARCH_8M_BASE__ 1 + #elif defined(__ARM8M_MAINLINE__) && (__CORE == __ARM8M_MAINLINE__) + #define __ARM_ARCH_8M_MAIN__ 1 + #elif defined(__ARM8EM_MAINLINE__) && (__CORE == __ARM8EM_MAINLINE__) + #define __ARM_ARCH_8M_MAIN__ 1 + #else + #error "Unknown target." + #endif +#endif + + + +#if defined(__ARM_ARCH_6M__) && __ARM_ARCH_6M__==1 + #define __IAR_M0_FAMILY 1 +#elif defined(__ARM_ARCH_8M_BASE__) && __ARM_ARCH_8M_BASE__==1 + #define __IAR_M0_FAMILY 1 +#else + #define __IAR_M0_FAMILY 0 +#endif + + +#ifndef __ASM + #define __ASM __asm +#endif + +#ifndef __INLINE + #define __INLINE inline +#endif + +#ifndef __NO_RETURN + #if __ICCARM_V8 + #define __NO_RETURN __attribute__((__noreturn__)) + #else + #define __NO_RETURN _Pragma("object_attribute=__noreturn") + #endif +#endif + +#ifndef __PACKED + #if __ICCARM_V8 + #define __PACKED __attribute__((packed, aligned(1))) + #else + /* Needs IAR language extensions */ + #define __PACKED __packed + #endif +#endif + +#ifndef __PACKED_STRUCT + #if __ICCARM_V8 + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) + #else + /* Needs IAR language extensions */ + #define __PACKED_STRUCT __packed struct + #endif +#endif + +#ifndef __PACKED_UNION + #if __ICCARM_V8 + #define __PACKED_UNION union __attribute__((packed, aligned(1))) + #else + /* Needs IAR language extensions */ + #define __PACKED_UNION __packed union + #endif +#endif + +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif + +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline +#endif + +#ifndef __FORCEINLINE + #define __FORCEINLINE _Pragma("inline=forced") +#endif + +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __FORCEINLINE __STATIC_INLINE +#endif + +#ifndef __UNALIGNED_UINT16_READ +#pragma language=save +#pragma language=extended +__IAR_FT uint16_t __iar_uint16_read(void const *ptr) +{ + return *(__packed uint16_t*)(ptr); +} +#pragma language=restore +#define __UNALIGNED_UINT16_READ(PTR) __iar_uint16_read(PTR) +#endif + + +#ifndef __UNALIGNED_UINT16_WRITE +#pragma language=save +#pragma language=extended +__IAR_FT void __iar_uint16_write(void const *ptr, uint16_t val) +{ + *(__packed uint16_t*)(ptr) = val;; +} +#pragma language=restore +#define __UNALIGNED_UINT16_WRITE(PTR,VAL) __iar_uint16_write(PTR,VAL) +#endif + +#ifndef __UNALIGNED_UINT32_READ +#pragma language=save +#pragma language=extended +__IAR_FT uint32_t __iar_uint32_read(void const *ptr) +{ + return *(__packed uint32_t*)(ptr); +} +#pragma language=restore +#define __UNALIGNED_UINT32_READ(PTR) __iar_uint32_read(PTR) +#endif + +#ifndef __UNALIGNED_UINT32_WRITE +#pragma language=save +#pragma language=extended +__IAR_FT void __iar_uint32_write(void const *ptr, uint32_t val) +{ + *(__packed uint32_t*)(ptr) = val;; +} +#pragma language=restore +#define __UNALIGNED_UINT32_WRITE(PTR,VAL) __iar_uint32_write(PTR,VAL) +#endif + +#ifndef __UNALIGNED_UINT32 /* deprecated */ +#pragma language=save +#pragma language=extended +__packed struct __iar_u32 { uint32_t v; }; +#pragma language=restore +#define __UNALIGNED_UINT32(PTR) (((struct __iar_u32 *)(PTR))->v) +#endif + +#ifndef __USED + #if __ICCARM_V8 + #define __USED __attribute__((used)) + #else + #define __USED _Pragma("__root") + #endif +#endif + +#ifndef __WEAK + #if __ICCARM_V8 + #define __WEAK __attribute__((weak)) + #else + #define __WEAK _Pragma("__weak") + #endif +#endif + + +#ifndef __ICCARM_INTRINSICS_VERSION__ + #define __ICCARM_INTRINSICS_VERSION__ 0 +#endif + +#if __ICCARM_INTRINSICS_VERSION__ == 2 + + #if defined(__CLZ) + #undef __CLZ + #endif + #if defined(__REVSH) + #undef __REVSH + #endif + #if defined(__RBIT) + #undef __RBIT + #endif + #if defined(__SSAT) + #undef __SSAT + #endif + #if defined(__USAT) + #undef __USAT + #endif + + #include "iccarm_builtin.h" + + #define __disable_fault_irq __iar_builtin_disable_fiq + #define __disable_irq __iar_builtin_disable_interrupt + #define __enable_fault_irq __iar_builtin_enable_fiq + #define __enable_irq __iar_builtin_enable_interrupt + #define __arm_rsr __iar_builtin_rsr + #define __arm_wsr __iar_builtin_wsr + + + #define __get_APSR() (__arm_rsr("APSR")) + #define __get_BASEPRI() (__arm_rsr("BASEPRI")) + #define __get_CONTROL() (__arm_rsr("CONTROL")) + #define __get_FAULTMASK() (__arm_rsr("FAULTMASK")) + + #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + #define __get_FPSCR() (__arm_rsr("FPSCR")) + #define __set_FPSCR(VALUE) (__arm_wsr("FPSCR", (VALUE))) + #else + #define __get_FPSCR() ( 0 ) + #define __set_FPSCR(VALUE) ((void)VALUE) + #endif + + #define __get_IPSR() (__arm_rsr("IPSR")) + #define __get_MSP() (__arm_rsr("MSP")) + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + #define __get_MSPLIM() (0U) + #else + #define __get_MSPLIM() (__arm_rsr("MSPLIM")) + #endif + #define __get_PRIMASK() (__arm_rsr("PRIMASK")) + #define __get_PSP() (__arm_rsr("PSP")) + + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + #define __get_PSPLIM() (0U) + #else + #define __get_PSPLIM() (__arm_rsr("PSPLIM")) + #endif + + #define __get_xPSR() (__arm_rsr("xPSR")) + + #define __set_BASEPRI(VALUE) (__arm_wsr("BASEPRI", (VALUE))) + #define __set_BASEPRI_MAX(VALUE) (__arm_wsr("BASEPRI_MAX", (VALUE))) + #define __set_CONTROL(VALUE) (__arm_wsr("CONTROL", (VALUE))) + #define __set_FAULTMASK(VALUE) (__arm_wsr("FAULTMASK", (VALUE))) + #define __set_MSP(VALUE) (__arm_wsr("MSP", (VALUE))) + + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + #define __set_MSPLIM(VALUE) ((void)(VALUE)) + #else + #define __set_MSPLIM(VALUE) (__arm_wsr("MSPLIM", (VALUE))) + #endif + #define __set_PRIMASK(VALUE) (__arm_wsr("PRIMASK", (VALUE))) + #define __set_PSP(VALUE) (__arm_wsr("PSP", (VALUE))) + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + #define __set_PSPLIM(VALUE) ((void)(VALUE)) + #else + #define __set_PSPLIM(VALUE) (__arm_wsr("PSPLIM", (VALUE))) + #endif + + #define __TZ_get_CONTROL_NS() (__arm_rsr("CONTROL_NS")) + #define __TZ_set_CONTROL_NS(VALUE) (__arm_wsr("CONTROL_NS", (VALUE))) + #define __TZ_get_PSP_NS() (__arm_rsr("PSP_NS")) + #define __TZ_set_PSP_NS(VALUE) (__arm_wsr("PSP_NS", (VALUE))) + #define __TZ_get_MSP_NS() (__arm_rsr("MSP_NS")) + #define __TZ_set_MSP_NS(VALUE) (__arm_wsr("MSP_NS", (VALUE))) + #define __TZ_get_SP_NS() (__arm_rsr("SP_NS")) + #define __TZ_set_SP_NS(VALUE) (__arm_wsr("SP_NS", (VALUE))) + #define __TZ_get_PRIMASK_NS() (__arm_rsr("PRIMASK_NS")) + #define __TZ_set_PRIMASK_NS(VALUE) (__arm_wsr("PRIMASK_NS", (VALUE))) + #define __TZ_get_BASEPRI_NS() (__arm_rsr("BASEPRI_NS")) + #define __TZ_set_BASEPRI_NS(VALUE) (__arm_wsr("BASEPRI_NS", (VALUE))) + #define __TZ_get_FAULTMASK_NS() (__arm_rsr("FAULTMASK_NS")) + #define __TZ_set_FAULTMASK_NS(VALUE)(__arm_wsr("FAULTMASK_NS", (VALUE))) + + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + #define __TZ_get_PSPLIM_NS() (0U) + #define __TZ_set_PSPLIM_NS(VALUE) ((void)(VALUE)) + #else + #define __TZ_get_PSPLIM_NS() (__arm_rsr("PSPLIM_NS")) + #define __TZ_set_PSPLIM_NS(VALUE) (__arm_wsr("PSPLIM_NS", (VALUE))) + #endif + + #define __TZ_get_MSPLIM_NS() (__arm_rsr("MSPLIM_NS")) + #define __TZ_set_MSPLIM_NS(VALUE) (__arm_wsr("MSPLIM_NS", (VALUE))) + + #define __NOP __iar_builtin_no_operation + + #define __CLZ __iar_builtin_CLZ + #define __CLREX __iar_builtin_CLREX + + #define __DMB __iar_builtin_DMB + #define __DSB __iar_builtin_DSB + #define __ISB __iar_builtin_ISB + + #define __LDREXB __iar_builtin_LDREXB + #define __LDREXH __iar_builtin_LDREXH + #define __LDREXW __iar_builtin_LDREX + + #define __RBIT __iar_builtin_RBIT + #define __REV __iar_builtin_REV + #define __REV16 __iar_builtin_REV16 + + __IAR_FT int16_t __REVSH(int16_t val) + { + return (int16_t) __iar_builtin_REVSH(val); + } + + #define __ROR __iar_builtin_ROR + #define __RRX __iar_builtin_RRX + + #define __SEV __iar_builtin_SEV + + #if !__IAR_M0_FAMILY + #define __SSAT __iar_builtin_SSAT + #endif + + #define __STREXB __iar_builtin_STREXB + #define __STREXH __iar_builtin_STREXH + #define __STREXW __iar_builtin_STREX + + #if !__IAR_M0_FAMILY + #define __USAT __iar_builtin_USAT + #endif + + #define __WFE __iar_builtin_WFE + #define __WFI __iar_builtin_WFI + + #if __ARM_MEDIA__ + #define __SADD8 __iar_builtin_SADD8 + #define __QADD8 __iar_builtin_QADD8 + #define __SHADD8 __iar_builtin_SHADD8 + #define __UADD8 __iar_builtin_UADD8 + #define __UQADD8 __iar_builtin_UQADD8 + #define __UHADD8 __iar_builtin_UHADD8 + #define __SSUB8 __iar_builtin_SSUB8 + #define __QSUB8 __iar_builtin_QSUB8 + #define __SHSUB8 __iar_builtin_SHSUB8 + #define __USUB8 __iar_builtin_USUB8 + #define __UQSUB8 __iar_builtin_UQSUB8 + #define __UHSUB8 __iar_builtin_UHSUB8 + #define __SADD16 __iar_builtin_SADD16 + #define __QADD16 __iar_builtin_QADD16 + #define __SHADD16 __iar_builtin_SHADD16 + #define __UADD16 __iar_builtin_UADD16 + #define __UQADD16 __iar_builtin_UQADD16 + #define __UHADD16 __iar_builtin_UHADD16 + #define __SSUB16 __iar_builtin_SSUB16 + #define __QSUB16 __iar_builtin_QSUB16 + #define __SHSUB16 __iar_builtin_SHSUB16 + #define __USUB16 __iar_builtin_USUB16 + #define __UQSUB16 __iar_builtin_UQSUB16 + #define __UHSUB16 __iar_builtin_UHSUB16 + #define __SASX __iar_builtin_SASX + #define __QASX __iar_builtin_QASX + #define __SHASX __iar_builtin_SHASX + #define __UASX __iar_builtin_UASX + #define __UQASX __iar_builtin_UQASX + #define __UHASX __iar_builtin_UHASX + #define __SSAX __iar_builtin_SSAX + #define __QSAX __iar_builtin_QSAX + #define __SHSAX __iar_builtin_SHSAX + #define __USAX __iar_builtin_USAX + #define __UQSAX __iar_builtin_UQSAX + #define __UHSAX __iar_builtin_UHSAX + #define __USAD8 __iar_builtin_USAD8 + #define __USADA8 __iar_builtin_USADA8 + #define __SSAT16 __iar_builtin_SSAT16 + #define __USAT16 __iar_builtin_USAT16 + #define __UXTB16 __iar_builtin_UXTB16 + #define __UXTAB16 __iar_builtin_UXTAB16 + #define __SXTB16 __iar_builtin_SXTB16 + #define __SXTAB16 __iar_builtin_SXTAB16 + #define __SMUAD __iar_builtin_SMUAD + #define __SMUADX __iar_builtin_SMUADX + #define __SMMLA __iar_builtin_SMMLA + #define __SMLAD __iar_builtin_SMLAD + #define __SMLADX __iar_builtin_SMLADX + #define __SMLALD __iar_builtin_SMLALD + #define __SMLALDX __iar_builtin_SMLALDX + #define __SMUSD __iar_builtin_SMUSD + #define __SMUSDX __iar_builtin_SMUSDX + #define __SMLSD __iar_builtin_SMLSD + #define __SMLSDX __iar_builtin_SMLSDX + #define __SMLSLD __iar_builtin_SMLSLD + #define __SMLSLDX __iar_builtin_SMLSLDX + #define __SEL __iar_builtin_SEL + #define __QADD __iar_builtin_QADD + #define __QSUB __iar_builtin_QSUB + #define __PKHBT __iar_builtin_PKHBT + #define __PKHTB __iar_builtin_PKHTB + #endif + +#else /* __ICCARM_INTRINSICS_VERSION__ == 2 */ + + #if __IAR_M0_FAMILY + /* Avoid clash between intrinsics.h and arm_math.h when compiling for Cortex-M0. */ + #define __CLZ __cmsis_iar_clz_not_active + #define __SSAT __cmsis_iar_ssat_not_active + #define __USAT __cmsis_iar_usat_not_active + #define __RBIT __cmsis_iar_rbit_not_active + #define __get_APSR __cmsis_iar_get_APSR_not_active + #endif + + + #if (!((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) )) + #define __get_FPSCR __cmsis_iar_get_FPSR_not_active + #define __set_FPSCR __cmsis_iar_set_FPSR_not_active + #endif + + #ifdef __INTRINSICS_INCLUDED + #error intrinsics.h is already included previously! + #endif + + #include + + #if __IAR_M0_FAMILY + /* Avoid clash between intrinsics.h and arm_math.h when compiling for Cortex-M0. */ + #undef __CLZ + #undef __SSAT + #undef __USAT + #undef __RBIT + #undef __get_APSR + + __STATIC_INLINE uint8_t __CLZ(uint32_t data) + { + if (data == 0U) { return 32U; } + + uint32_t count = 0U; + uint32_t mask = 0x80000000U; + + while ((data & mask) == 0U) + { + count += 1U; + mask = mask >> 1U; + } + return count; + } + + __STATIC_INLINE uint32_t __RBIT(uint32_t v) + { + uint8_t sc = 31U; + uint32_t r = v; + for (v >>= 1U; v; v >>= 1U) + { + r <<= 1U; + r |= v & 1U; + sc--; + } + return (r << sc); + } + + __STATIC_INLINE uint32_t __get_APSR(void) + { + uint32_t res; + __asm("MRS %0,APSR" : "=r" (res)); + return res; + } + + #endif + + #if (!((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) )) + #undef __get_FPSCR + #undef __set_FPSCR + #define __get_FPSCR() (0) + #define __set_FPSCR(VALUE) ((void)VALUE) + #endif + + #pragma diag_suppress=Pe940 + #pragma diag_suppress=Pe177 + + #define __enable_irq __enable_interrupt + #define __disable_irq __disable_interrupt + #define __NOP __no_operation + + #define __get_xPSR __get_PSR + + #if (!defined(__ARM_ARCH_6M__) || __ARM_ARCH_6M__==0) + + __IAR_FT uint32_t __LDREXW(uint32_t volatile *ptr) + { + return __LDREX((unsigned long *)ptr); + } + + __IAR_FT uint32_t __STREXW(uint32_t value, uint32_t volatile *ptr) + { + return __STREX(value, (unsigned long *)ptr); + } + #endif + + + /* __CORTEX_M is defined in core_cm0.h, core_cm3.h and core_cm4.h. */ + #if (__CORTEX_M >= 0x03) + + __IAR_FT uint32_t __RRX(uint32_t value) + { + uint32_t result; + __ASM("RRX %0, %1" : "=r"(result) : "r" (value) : "cc"); + return(result); + } + + __IAR_FT void __set_BASEPRI_MAX(uint32_t value) + { + __asm volatile("MSR BASEPRI_MAX,%0"::"r" (value)); + } + + + #define __enable_fault_irq __enable_fiq + #define __disable_fault_irq __disable_fiq + + + #endif /* (__CORTEX_M >= 0x03) */ + + __IAR_FT uint32_t __ROR(uint32_t op1, uint32_t op2) + { + return (op1 >> op2) | (op1 << ((sizeof(op1)*8)-op2)); + } + + #if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + + __IAR_FT uint32_t __get_MSPLIM(void) + { + uint32_t res; + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + res = 0U; + #else + __asm volatile("MRS %0,MSPLIM" : "=r" (res)); + #endif + return res; + } + + __IAR_FT void __set_MSPLIM(uint32_t value) + { + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)value; + #else + __asm volatile("MSR MSPLIM,%0" :: "r" (value)); + #endif + } + + __IAR_FT uint32_t __get_PSPLIM(void) + { + uint32_t res; + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + res = 0U; + #else + __asm volatile("MRS %0,PSPLIM" : "=r" (res)); + #endif + return res; + } + + __IAR_FT void __set_PSPLIM(uint32_t value) + { + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)value; + #else + __asm volatile("MSR PSPLIM,%0" :: "r" (value)); + #endif + } + + __IAR_FT uint32_t __TZ_get_CONTROL_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,CONTROL_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_CONTROL_NS(uint32_t value) + { + __asm volatile("MSR CONTROL_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_PSP_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,PSP_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_PSP_NS(uint32_t value) + { + __asm volatile("MSR PSP_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_MSP_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,MSP_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_MSP_NS(uint32_t value) + { + __asm volatile("MSR MSP_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_SP_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,SP_NS" : "=r" (res)); + return res; + } + __IAR_FT void __TZ_set_SP_NS(uint32_t value) + { + __asm volatile("MSR SP_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_PRIMASK_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,PRIMASK_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_PRIMASK_NS(uint32_t value) + { + __asm volatile("MSR PRIMASK_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_BASEPRI_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,BASEPRI_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_BASEPRI_NS(uint32_t value) + { + __asm volatile("MSR BASEPRI_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_FAULTMASK_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,FAULTMASK_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_FAULTMASK_NS(uint32_t value) + { + __asm volatile("MSR FAULTMASK_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_PSPLIM_NS(void) + { + uint32_t res; + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + res = 0U; + #else + __asm volatile("MRS %0,PSPLIM_NS" : "=r" (res)); + #endif + return res; + } + + __IAR_FT void __TZ_set_PSPLIM_NS(uint32_t value) + { + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)value; + #else + __asm volatile("MSR PSPLIM_NS,%0" :: "r" (value)); + #endif + } + + __IAR_FT uint32_t __TZ_get_MSPLIM_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,MSPLIM_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_MSPLIM_NS(uint32_t value) + { + __asm volatile("MSR MSPLIM_NS,%0" :: "r" (value)); + } + + #endif /* __ARM_ARCH_8M_MAIN__ or __ARM_ARCH_8M_BASE__ */ + +#endif /* __ICCARM_INTRINSICS_VERSION__ == 2 */ + +#define __BKPT(value) __asm volatile ("BKPT %0" : : "i"(value)) + +#if __IAR_M0_FAMILY + __STATIC_INLINE int32_t __SSAT(int32_t val, uint32_t sat) + { + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; + } + + __STATIC_INLINE uint32_t __USAT(int32_t val, uint32_t sat) + { + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; + } +#endif + +#if (__CORTEX_M >= 0x03) /* __CORTEX_M is defined in core_cm0.h, core_cm3.h and core_cm4.h. */ + + __IAR_FT uint8_t __LDRBT(volatile uint8_t *addr) + { + uint32_t res; + __ASM("LDRBT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); + return ((uint8_t)res); + } + + __IAR_FT uint16_t __LDRHT(volatile uint16_t *addr) + { + uint32_t res; + __ASM("LDRHT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); + return ((uint16_t)res); + } + + __IAR_FT uint32_t __LDRT(volatile uint32_t *addr) + { + uint32_t res; + __ASM("LDRT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); + return res; + } + + __IAR_FT void __STRBT(uint8_t value, volatile uint8_t *addr) + { + __ASM("STRBT %1, [%0]" : : "r" (addr), "r" ((uint32_t)value) : "memory"); + } + + __IAR_FT void __STRHT(uint16_t value, volatile uint16_t *addr) + { + __ASM("STRHT %1, [%0]" : : "r" (addr), "r" ((uint32_t)value) : "memory"); + } + + __IAR_FT void __STRT(uint32_t value, volatile uint32_t *addr) + { + __ASM("STRT %1, [%0]" : : "r" (addr), "r" (value) : "memory"); + } + +#endif /* (__CORTEX_M >= 0x03) */ + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + + + __IAR_FT uint8_t __LDAB(volatile uint8_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAB %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return ((uint8_t)res); + } + + __IAR_FT uint16_t __LDAH(volatile uint16_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAH %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return ((uint16_t)res); + } + + __IAR_FT uint32_t __LDA(volatile uint32_t *ptr) + { + uint32_t res; + __ASM volatile ("LDA %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return res; + } + + __IAR_FT void __STLB(uint8_t value, volatile uint8_t *ptr) + { + __ASM volatile ("STLB %1, [%0]" :: "r" (ptr), "r" (value) : "memory"); + } + + __IAR_FT void __STLH(uint16_t value, volatile uint16_t *ptr) + { + __ASM volatile ("STLH %1, [%0]" :: "r" (ptr), "r" (value) : "memory"); + } + + __IAR_FT void __STL(uint32_t value, volatile uint32_t *ptr) + { + __ASM volatile ("STL %1, [%0]" :: "r" (ptr), "r" (value) : "memory"); + } + + __IAR_FT uint8_t __LDAEXB(volatile uint8_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAEXB %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return ((uint8_t)res); + } + + __IAR_FT uint16_t __LDAEXH(volatile uint16_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAEXH %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return ((uint16_t)res); + } + + __IAR_FT uint32_t __LDAEX(volatile uint32_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAEX %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return res; + } + + __IAR_FT uint32_t __STLEXB(uint8_t value, volatile uint8_t *ptr) + { + uint32_t res; + __ASM volatile ("STLEXB %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory"); + return res; + } + + __IAR_FT uint32_t __STLEXH(uint16_t value, volatile uint16_t *ptr) + { + uint32_t res; + __ASM volatile ("STLEXH %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory"); + return res; + } + + __IAR_FT uint32_t __STLEX(uint32_t value, volatile uint32_t *ptr) + { + uint32_t res; + __ASM volatile ("STLEX %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory"); + return res; + } + +#endif /* __ARM_ARCH_8M_MAIN__ or __ARM_ARCH_8M_BASE__ */ + +#undef __IAR_FT +#undef __IAR_M0_FAMILY +#undef __ICCARM_V8 + +#pragma diag_default=Pe940 +#pragma diag_default=Pe177 + +#endif /* __CMSIS_ICCARM_H__ */ diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Include/cmsis_version.h b/STM32CubeMX/revF/Drivers/CMSIS/Include/cmsis_version.h new file mode 100644 index 00000000..660f612a --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Include/cmsis_version.h @@ -0,0 +1,39 @@ +/**************************************************************************//** + * @file cmsis_version.h + * @brief CMSIS Core(M) Version definitions + * @version V5.0.2 + * @date 19. April 2017 + ******************************************************************************/ +/* + * Copyright (c) 2009-2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CMSIS_VERSION_H +#define __CMSIS_VERSION_H + +/* CMSIS Version definitions */ +#define __CM_CMSIS_VERSION_MAIN ( 5U) /*!< [31:16] CMSIS Core(M) main version */ +#define __CM_CMSIS_VERSION_SUB ( 1U) /*!< [15:0] CMSIS Core(M) sub version */ +#define __CM_CMSIS_VERSION ((__CM_CMSIS_VERSION_MAIN << 16U) | \ + __CM_CMSIS_VERSION_SUB ) /*!< CMSIS Core(M) version number */ +#endif diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Include/core_armv8mbl.h b/STM32CubeMX/revF/Drivers/CMSIS/Include/core_armv8mbl.h new file mode 100644 index 00000000..251e4ede --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Include/core_armv8mbl.h @@ -0,0 +1,1918 @@ +/**************************************************************************//** + * @file core_armv8mbl.h + * @brief CMSIS Armv8-M Baseline Core Peripheral Access Layer Header File + * @version V5.0.7 + * @date 22. June 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_ARMV8MBL_H_GENERIC +#define __CORE_ARMV8MBL_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_ARMv8MBL + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS definitions */ +#define __ARMv8MBL_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __ARMv8MBL_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __ARMv8MBL_CMSIS_VERSION ((__ARMv8MBL_CMSIS_VERSION_MAIN << 16U) | \ + __ARMv8MBL_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M ( 2U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_ARMV8MBL_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_ARMV8MBL_H_DEPENDANT +#define __CORE_ARMV8MBL_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __ARMv8MBL_REV + #define __ARMv8MBL_REV 0x0000U + #warning "__ARMv8MBL_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __SAUREGION_PRESENT + #define __SAUREGION_PRESENT 0U + #warning "__SAUREGION_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __VTOR_PRESENT + #define __VTOR_PRESENT 0U + #warning "__VTOR_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif + + #ifndef __ETM_PRESENT + #define __ETM_PRESENT 0U + #warning "__ETM_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MTB_PRESENT + #define __MTB_PRESENT 0U + #warning "__MTB_PRESENT not defined in device header file; using default!" + #endif + +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group ARMv8MBL */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core SAU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[16U]; + __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[16U]; + __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[16U]; + __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[16U]; + __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[16U]; + __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ + uint32_t RESERVED5[16U]; + __IOM uint32_t IPR[124U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ +#else + uint32_t RESERVED0; +#endif + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + uint32_t RESERVED1; + __IOM uint32_t SHPR[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ +#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ + +#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ +#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ + +#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ +#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ +#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ +#endif + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ +#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ + +#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ +#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ + +#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ +#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ +#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ + +#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ +#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ +#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ +#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ + +#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ +#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + uint32_t RESERVED0[6U]; + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + uint32_t RESERVED3[1U]; + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED4[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + uint32_t RESERVED5[1U]; + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED6[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + uint32_t RESERVED7[1U]; + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED8[1U]; + __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ + uint32_t RESERVED9[1U]; + __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ + uint32_t RESERVED10[1U]; + __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ + uint32_t RESERVED11[1U]; + __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ + uint32_t RESERVED12[1U]; + __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ + uint32_t RESERVED13[1U]; + __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ + uint32_t RESERVED14[1U]; + __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ + uint32_t RESERVED15[1U]; + __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ + uint32_t RESERVED16[1U]; + __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ + uint32_t RESERVED17[1U]; + __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ + uint32_t RESERVED18[1U]; + __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ + uint32_t RESERVED19[1U]; + __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ + uint32_t RESERVED20[1U]; + __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ + uint32_t RESERVED21[1U]; + __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ + uint32_t RESERVED22[1U]; + __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ + uint32_t RESERVED23[1U]; + __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ + uint32_t RESERVED24[1U]; + __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ + uint32_t RESERVED25[1U]; + __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ + uint32_t RESERVED26[1U]; + __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ + uint32_t RESERVED27[1U]; + __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ + uint32_t RESERVED28[1U]; + __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ + uint32_t RESERVED29[1U]; + __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ + uint32_t RESERVED30[1U]; + __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ + uint32_t RESERVED31[1U]; + __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ +#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ + +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ +#define DWT_FUNCTION_ACTION_Msk (0x3UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ + +#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ +#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Sizes Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Sizes Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ + uint32_t RESERVED3[809U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) Software Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) Software Lock Status Register */ + uint32_t RESERVED4[4U]; + __IM uint32_t TYPE; /*!< Offset: 0xFC8 (R/ ) Device Identifier Register */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Register */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_SWOSCALER_Pos 0U /*!< TPI ACPR: SWOSCALER Position */ +#define TPI_ACPR_SWOSCALER_Msk (0xFFFFUL /*<< TPI_ACPR_SWOSCALER_Pos*/) /*!< TPI ACPR: SWOSCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ +#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI Periodic Synchronization Control Register Definitions */ +#define TPI_PSCR_PSCount_Pos 0U /*!< TPI PSCR: PSCount Position */ +#define TPI_PSCR_PSCount_Msk (0x1FUL /*<< TPI_PSCR_PSCount_Pos*/) /*!< TPI PSCR: TPSCount Mask */ + +/* TPI Software Lock Status Register Definitions */ +#define TPI_LSR_nTT_Pos 1U /*!< TPI LSR: Not thirty-two bit. Position */ +#define TPI_LSR_nTT_Msk (0x1UL << TPI_LSR_nTT_Pos) /*!< TPI LSR: Not thirty-two bit. Mask */ + +#define TPI_LSR_SLK_Pos 1U /*!< TPI LSR: Software Lock status Position */ +#define TPI_LSR_SLK_Msk (0x1UL << TPI_LSR_SLK_Pos) /*!< TPI LSR: Software Lock status Mask */ + +#define TPI_LSR_SLI_Pos 0U /*!< TPI LSR: Software Lock implemented Position */ +#define TPI_LSR_SLI_Msk (0x1UL /*<< TPI_LSR_SLI_Pos*/) /*!< TPI LSR: Software Lock implemented Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFO depth Position */ +#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFO depth Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ + uint32_t RESERVED0[7U]; + union { + __IOM uint32_t MAIR[2]; + struct { + __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ + __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ + }; + }; +} MPU_Type; + +#define MPU_TYPE_RALIASES 1U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ +#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ + +#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ +#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ + +#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ +#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ + +#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ +#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ + +/* MPU Region Limit Address Register Definitions */ +#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ +#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ + +#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ +#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ + +#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: EN Position */ +#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: EN Mask */ + +/* MPU Memory Attribute Indirection Register 0 Definitions */ +#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ +#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ + +#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ +#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ + +#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ +#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ + +#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ +#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ + +/* MPU Memory Attribute Indirection Register 1 Definitions */ +#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ +#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ + +#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ +#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ + +#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ +#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ + +#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ +#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SAU Security Attribution Unit (SAU) + \brief Type definitions for the Security Attribution Unit (SAU) + @{ + */ + +/** + \brief Structure type to access the Security Attribution Unit (SAU). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ + __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ +#endif +} SAU_Type; + +/* SAU Control Register Definitions */ +#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ +#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ + +#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ +#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ + +/* SAU Type Register Definitions */ +#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ +#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ + +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) +/* SAU Region Number Register Definitions */ +#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ +#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ + +/* SAU Region Base Address Register Definitions */ +#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ +#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ + +/* SAU Region Limit Address Register Definitions */ +#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ +#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ + +#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ +#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ + +#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ +#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ + +#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ + +/*@} end of group CMSIS_SAU */ +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + uint32_t RESERVED4[1U]; + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< CoreDebug DHCSR: S_RESTART_ST Position */ +#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< CoreDebug DHCSR: S_RESTART_ST Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register */ +#define CoreDebug_DEMCR_DWTENA_Pos 24U /*!< CoreDebug DEMCR: DWTENA Position */ +#define CoreDebug_DEMCR_DWTENA_Msk (1UL << CoreDebug_DEMCR_DWTENA_Pos) /*!< CoreDebug DEMCR: DWTENA Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/* Debug Authentication Control Register Definitions */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ + +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ + +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< CoreDebug DAUTHCTRL: INTSPIDEN Position */ +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPIDEN Mask */ + +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< CoreDebug DAUTHCTRL: SPIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< CoreDebug DAUTHCTRL: SPIDENSEL Mask */ + +/* Debug Security Control and Status Register Definitions */ +#define CoreDebug_DSCSR_CDS_Pos 16U /*!< CoreDebug DSCSR: CDS Position */ +#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< CoreDebug DSCSR: CDS Mask */ + +#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< CoreDebug DSCSR: SBRSEL Position */ +#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< CoreDebug DSCSR: SBRSEL Mask */ + +#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< CoreDebug DSCSR: SBRSELEN Position */ +#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< CoreDebug DSCSR: SBRSELEN Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ + #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ + #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ + #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ + #define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ + #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ + #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ + #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + + + #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ + #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ + #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ + #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ + #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< Core Debug configuration struct */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ + #endif + + #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ + #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ + #endif + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ + #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< Core Debug Base Address (non-secure address space) */ + #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ + #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ + #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ + + #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ + #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ + #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ + #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< Core Debug configuration struct (non-secure address space) */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ + #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ + #endif + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* Special LR values for Secure/Non-Secure call handling and exception handling */ + +/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ +#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ + +/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ +#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ +#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ +#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ +#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ +#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ +#define EXC_RETURN_SPSEL (0x00000002UL) /* bit [1] stack pointer used to restore context: 0=MSP 1=PSP */ +#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ + +/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ +#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ +#else +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ +#endif + + +/* Interrupt Priorities are WORD accessible only under Armv6-M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + +#define __NVIC_SetPriorityGrouping(X) (void)(X) +#define __NVIC_GetPriorityGrouping() (0U) + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Interrupt Target State + \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + \return 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Target State + \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Clear Interrupt Target State + \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + If VTOR is not present address 0 must be mapped to SRAM. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t *vectors = (uint32_t *)SCB->VTOR; +#else + uint32_t *vectors = (uint32_t *)0x0U; +#endif + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t *vectors = (uint32_t *)SCB->VTOR; +#else + uint32_t *vectors = (uint32_t *)0x0U; +#endif + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Enable Interrupt (non-secure) + \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status (non-secure) + \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt (non-secure) + \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Pending Interrupt (non-secure) + \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt (non-secure) + \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt (non-secure) + \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt (non-secure) + \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority (non-secure) + \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every non-secure processor exception. + */ +__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC_NS->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB_NS->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB_NS->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority (non-secure) + \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB_NS->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv8.h" + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ########################## SAU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SAUFunctions SAU Functions + \brief Functions that configure the SAU. + @{ + */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + +/** + \brief Enable SAU + \details Enables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Enable(void) +{ + SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); +} + + + +/** + \brief Disable SAU + \details Disables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Disable(void) +{ + SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); +} + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_SAUFunctions */ + + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief System Tick Configuration (non-secure) + \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function TZ_SysTick_Config_NS is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + + */ +__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_ARMV8MBL_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Include/core_armv8mml.h b/STM32CubeMX/revF/Drivers/CMSIS/Include/core_armv8mml.h new file mode 100644 index 00000000..3a3148ea --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Include/core_armv8mml.h @@ -0,0 +1,2927 @@ +/**************************************************************************//** + * @file core_armv8mml.h + * @brief CMSIS Armv8-M Mainline Core Peripheral Access Layer Header File + * @version V5.0.7 + * @date 06. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_ARMV8MML_H_GENERIC +#define __CORE_ARMV8MML_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_ARMv8MML + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS Armv8MML definitions */ +#define __ARMv8MML_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __ARMv8MML_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __ARMv8MML_CMSIS_VERSION ((__ARMv8MML_CMSIS_VERSION_MAIN << 16U) | \ + __ARMv8MML_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (81U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. +*/ +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined(__ARM_FEATURE_DSP) + #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined(__ARM_FEATURE_DSP) + #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined(__ARM_FEATURE_DSP) + #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined(__ARM_FEATURE_DSP) + #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_ARMV8MML_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_ARMV8MML_H_DEPENDANT +#define __CORE_ARMV8MML_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __ARMv8MML_REV + #define __ARMv8MML_REV 0x0000U + #warning "__ARMv8MML_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __SAUREGION_PRESENT + #define __SAUREGION_PRESENT 0U + #warning "__SAUREGION_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __DSP_PRESENT + #define __DSP_PRESENT 0U + #warning "__DSP_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group ARMv8MML */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core SAU Register + - Core FPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + +#define APSR_GE_Pos 16U /*!< APSR: GE Position */ +#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ +#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ +#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ + uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ + uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ + uint32_t _reserved1:28; /*!< bit: 4..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ +#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ + +#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ +#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ + +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[16U]; + __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[16U]; + __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[16U]; + __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[16U]; + __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[16U]; + __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ + uint32_t RESERVED5[16U]; + __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED6[580U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ID_ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ID_ISAR[6U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ + __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ + __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ + __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ + __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ + uint32_t RESERVED3[92U]; + __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ + uint32_t RESERVED4[15U]; + __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ + uint32_t RESERVED5[1U]; + __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ + uint32_t RESERVED6[1U]; + __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ + __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ + __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ + __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ + __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ + __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ + __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ + __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ + uint32_t RESERVED7[6U]; + __IOM uint32_t ITCMCR; /*!< Offset: 0x290 (R/W) Instruction Tightly-Coupled Memory Control Register */ + __IOM uint32_t DTCMCR; /*!< Offset: 0x294 (R/W) Data Tightly-Coupled Memory Control Registers */ + __IOM uint32_t AHBPCR; /*!< Offset: 0x298 (R/W) AHBP Control Register */ + __IOM uint32_t CACR; /*!< Offset: 0x29C (R/W) L1 Cache Control Register */ + __IOM uint32_t AHBSCR; /*!< Offset: 0x2A0 (R/W) AHB Slave Control Register */ + uint32_t RESERVED8[1U]; + __IOM uint32_t ABFSR; /*!< Offset: 0x2A8 (R/W) Auxiliary Bus Fault Status Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ +#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ + +#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ +#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ + +#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ +#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ +#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ +#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ + +#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ +#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ +#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ +#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ + +#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ +#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ +#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ +#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ +#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ + +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ +#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ + +#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ +#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ +#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MLSPERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ +#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ +#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ +#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/* SCB Non-Secure Access Control Register Definitions */ +#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ +#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ + +#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ +#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ + +#define SCB_NSACR_CPn_Pos 0U /*!< SCB NSACR: CPn Position */ +#define SCB_NSACR_CPn_Msk (1UL /*<< SCB_NSACR_CPn_Pos*/) /*!< SCB NSACR: CPn Mask */ + +/* SCB Cache Level ID Register Definitions */ +#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ +#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ + +#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ +#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ + +/* SCB Cache Type Register Definitions */ +#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ +#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ + +#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ +#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ + +#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ +#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ + +#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ +#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ + +#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ +#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ + +/* SCB Cache Size ID Register Definitions */ +#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ +#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ + +#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ +#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ + +#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ +#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ + +#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ +#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ + +#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ +#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ + +#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ +#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ + +#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ +#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ + +/* SCB Cache Size Selection Register Definitions */ +#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ +#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ + +#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ +#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ + +/* SCB Software Triggered Interrupt Register Definitions */ +#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ +#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ + +/* SCB D-Cache Invalidate by Set-way Register Definitions */ +#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ +#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ + +#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ +#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ + +/* SCB D-Cache Clean by Set-way Register Definitions */ +#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ +#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ + +#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ +#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ + +/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ +#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ +#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ + +#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ +#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ + +/* Instruction Tightly-Coupled Memory Control Register Definitions */ +#define SCB_ITCMCR_SZ_Pos 3U /*!< SCB ITCMCR: SZ Position */ +#define SCB_ITCMCR_SZ_Msk (0xFUL << SCB_ITCMCR_SZ_Pos) /*!< SCB ITCMCR: SZ Mask */ + +#define SCB_ITCMCR_RETEN_Pos 2U /*!< SCB ITCMCR: RETEN Position */ +#define SCB_ITCMCR_RETEN_Msk (1UL << SCB_ITCMCR_RETEN_Pos) /*!< SCB ITCMCR: RETEN Mask */ + +#define SCB_ITCMCR_RMW_Pos 1U /*!< SCB ITCMCR: RMW Position */ +#define SCB_ITCMCR_RMW_Msk (1UL << SCB_ITCMCR_RMW_Pos) /*!< SCB ITCMCR: RMW Mask */ + +#define SCB_ITCMCR_EN_Pos 0U /*!< SCB ITCMCR: EN Position */ +#define SCB_ITCMCR_EN_Msk (1UL /*<< SCB_ITCMCR_EN_Pos*/) /*!< SCB ITCMCR: EN Mask */ + +/* Data Tightly-Coupled Memory Control Register Definitions */ +#define SCB_DTCMCR_SZ_Pos 3U /*!< SCB DTCMCR: SZ Position */ +#define SCB_DTCMCR_SZ_Msk (0xFUL << SCB_DTCMCR_SZ_Pos) /*!< SCB DTCMCR: SZ Mask */ + +#define SCB_DTCMCR_RETEN_Pos 2U /*!< SCB DTCMCR: RETEN Position */ +#define SCB_DTCMCR_RETEN_Msk (1UL << SCB_DTCMCR_RETEN_Pos) /*!< SCB DTCMCR: RETEN Mask */ + +#define SCB_DTCMCR_RMW_Pos 1U /*!< SCB DTCMCR: RMW Position */ +#define SCB_DTCMCR_RMW_Msk (1UL << SCB_DTCMCR_RMW_Pos) /*!< SCB DTCMCR: RMW Mask */ + +#define SCB_DTCMCR_EN_Pos 0U /*!< SCB DTCMCR: EN Position */ +#define SCB_DTCMCR_EN_Msk (1UL /*<< SCB_DTCMCR_EN_Pos*/) /*!< SCB DTCMCR: EN Mask */ + +/* AHBP Control Register Definitions */ +#define SCB_AHBPCR_SZ_Pos 1U /*!< SCB AHBPCR: SZ Position */ +#define SCB_AHBPCR_SZ_Msk (7UL << SCB_AHBPCR_SZ_Pos) /*!< SCB AHBPCR: SZ Mask */ + +#define SCB_AHBPCR_EN_Pos 0U /*!< SCB AHBPCR: EN Position */ +#define SCB_AHBPCR_EN_Msk (1UL /*<< SCB_AHBPCR_EN_Pos*/) /*!< SCB AHBPCR: EN Mask */ + +/* L1 Cache Control Register Definitions */ +#define SCB_CACR_FORCEWT_Pos 2U /*!< SCB CACR: FORCEWT Position */ +#define SCB_CACR_FORCEWT_Msk (1UL << SCB_CACR_FORCEWT_Pos) /*!< SCB CACR: FORCEWT Mask */ + +#define SCB_CACR_ECCEN_Pos 1U /*!< SCB CACR: ECCEN Position */ +#define SCB_CACR_ECCEN_Msk (1UL << SCB_CACR_ECCEN_Pos) /*!< SCB CACR: ECCEN Mask */ + +#define SCB_CACR_SIWT_Pos 0U /*!< SCB CACR: SIWT Position */ +#define SCB_CACR_SIWT_Msk (1UL /*<< SCB_CACR_SIWT_Pos*/) /*!< SCB CACR: SIWT Mask */ + +/* AHBS Control Register Definitions */ +#define SCB_AHBSCR_INITCOUNT_Pos 11U /*!< SCB AHBSCR: INITCOUNT Position */ +#define SCB_AHBSCR_INITCOUNT_Msk (0x1FUL << SCB_AHBPCR_INITCOUNT_Pos) /*!< SCB AHBSCR: INITCOUNT Mask */ + +#define SCB_AHBSCR_TPRI_Pos 2U /*!< SCB AHBSCR: TPRI Position */ +#define SCB_AHBSCR_TPRI_Msk (0x1FFUL << SCB_AHBPCR_TPRI_Pos) /*!< SCB AHBSCR: TPRI Mask */ + +#define SCB_AHBSCR_CTL_Pos 0U /*!< SCB AHBSCR: CTL Position*/ +#define SCB_AHBSCR_CTL_Msk (3UL /*<< SCB_AHBPCR_CTL_Pos*/) /*!< SCB AHBSCR: CTL Mask */ + +/* Auxiliary Bus Fault Status Register Definitions */ +#define SCB_ABFSR_AXIMTYPE_Pos 8U /*!< SCB ABFSR: AXIMTYPE Position*/ +#define SCB_ABFSR_AXIMTYPE_Msk (3UL << SCB_ABFSR_AXIMTYPE_Pos) /*!< SCB ABFSR: AXIMTYPE Mask */ + +#define SCB_ABFSR_EPPB_Pos 4U /*!< SCB ABFSR: EPPB Position*/ +#define SCB_ABFSR_EPPB_Msk (1UL << SCB_ABFSR_EPPB_Pos) /*!< SCB ABFSR: EPPB Mask */ + +#define SCB_ABFSR_AXIM_Pos 3U /*!< SCB ABFSR: AXIM Position*/ +#define SCB_ABFSR_AXIM_Msk (1UL << SCB_ABFSR_AXIM_Pos) /*!< SCB ABFSR: AXIM Mask */ + +#define SCB_ABFSR_AHBP_Pos 2U /*!< SCB ABFSR: AHBP Position*/ +#define SCB_ABFSR_AHBP_Msk (1UL << SCB_ABFSR_AHBP_Pos) /*!< SCB ABFSR: AHBP Mask */ + +#define SCB_ABFSR_DTCM_Pos 1U /*!< SCB ABFSR: DTCM Position*/ +#define SCB_ABFSR_DTCM_Msk (1UL << SCB_ABFSR_DTCM_Pos) /*!< SCB ABFSR: DTCM Mask */ + +#define SCB_ABFSR_ITCM_Pos 0U /*!< SCB ABFSR: ITCM Position*/ +#define SCB_ABFSR_ITCM_Msk (1UL /*<< SCB_ABFSR_ITCM_Pos*/) /*!< SCB ABFSR: ITCM Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ + __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[29U]; + __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ + __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ + __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ + uint32_t RESERVED6[4U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Stimulus Port Register Definitions */ +#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ +#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ + +#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ +#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TRACEBUSID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TRACEBUSID_Msk (0x7FUL << ITM_TCR_TRACEBUSID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPRESCALE_Pos 8U /*!< ITM TCR: TSPRESCALE Position */ +#define ITM_TCR_TSPRESCALE_Msk (3UL << ITM_TCR_TSPRESCALE_Pos) /*!< ITM TCR: TSPRESCALE Mask */ + +#define ITM_TCR_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ +#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Integration Write Register Definitions */ +#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ +#define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ + +/* ITM Integration Read Register Definitions */ +#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ +#define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ + +/* ITM Integration Mode Control Register Definitions */ +#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ +#define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + uint32_t RESERVED3[1U]; + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED4[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + uint32_t RESERVED5[1U]; + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED6[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + uint32_t RESERVED7[1U]; + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED8[1U]; + __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ + uint32_t RESERVED9[1U]; + __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ + uint32_t RESERVED10[1U]; + __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ + uint32_t RESERVED11[1U]; + __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ + uint32_t RESERVED12[1U]; + __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ + uint32_t RESERVED13[1U]; + __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ + uint32_t RESERVED14[1U]; + __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ + uint32_t RESERVED15[1U]; + __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ + uint32_t RESERVED16[1U]; + __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ + uint32_t RESERVED17[1U]; + __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ + uint32_t RESERVED18[1U]; + __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ + uint32_t RESERVED19[1U]; + __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ + uint32_t RESERVED20[1U]; + __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ + uint32_t RESERVED21[1U]; + __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ + uint32_t RESERVED22[1U]; + __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ + uint32_t RESERVED23[1U]; + __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ + uint32_t RESERVED24[1U]; + __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ + uint32_t RESERVED25[1U]; + __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ + uint32_t RESERVED26[1U]; + __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ + uint32_t RESERVED27[1U]; + __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ + uint32_t RESERVED28[1U]; + __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ + uint32_t RESERVED29[1U]; + __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ + uint32_t RESERVED30[1U]; + __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ + uint32_t RESERVED31[1U]; + __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ + uint32_t RESERVED32[934U]; + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ + uint32_t RESERVED33[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ +#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ +#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ + +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ +#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ + +#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ +#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Sizes Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Sizes Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ + uint32_t RESERVED3[809U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) Software Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) Software Lock Status Register */ + uint32_t RESERVED4[4U]; + __IM uint32_t TYPE; /*!< Offset: 0xFC8 (R/ ) Device Identifier Register */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Register */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_SWOSCALER_Pos 0U /*!< TPI ACPR: SWOSCALER Position */ +#define TPI_ACPR_SWOSCALER_Msk (0xFFFFUL /*<< TPI_ACPR_SWOSCALER_Pos*/) /*!< TPI ACPR: SWOSCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ +#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI Periodic Synchronization Control Register Definitions */ +#define TPI_PSCR_PSCount_Pos 0U /*!< TPI PSCR: PSCount Position */ +#define TPI_PSCR_PSCount_Msk (0x1FUL /*<< TPI_PSCR_PSCount_Pos*/) /*!< TPI PSCR: TPSCount Mask */ + +/* TPI Software Lock Status Register Definitions */ +#define TPI_LSR_nTT_Pos 1U /*!< TPI LSR: Not thirty-two bit. Position */ +#define TPI_LSR_nTT_Msk (0x1UL << TPI_LSR_nTT_Pos) /*!< TPI LSR: Not thirty-two bit. Mask */ + +#define TPI_LSR_SLK_Pos 1U /*!< TPI LSR: Software Lock status Position */ +#define TPI_LSR_SLK_Msk (0x1UL << TPI_LSR_SLK_Pos) /*!< TPI LSR: Software Lock status Mask */ + +#define TPI_LSR_SLI_Pos 0U /*!< TPI LSR: Software Lock implemented Position */ +#define TPI_LSR_SLI_Msk (0x1UL /*<< TPI_LSR_SLI_Pos*/) /*!< TPI LSR: Software Lock implemented Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFO depth Position */ +#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFO depth Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ + __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ + __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ + __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ + uint32_t RESERVED0[1]; + union { + __IOM uint32_t MAIR[2]; + struct { + __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ + __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ + }; + }; +} MPU_Type; + +#define MPU_TYPE_RALIASES 4U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ +#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ + +#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ +#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ + +#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ +#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ + +#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ +#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ + +/* MPU Region Limit Address Register Definitions */ +#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ +#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ + +#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ +#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ + +#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ +#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ + +/* MPU Memory Attribute Indirection Register 0 Definitions */ +#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ +#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ + +#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ +#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ + +#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ +#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ + +#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ +#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ + +/* MPU Memory Attribute Indirection Register 1 Definitions */ +#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ +#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ + +#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ +#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ + +#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ +#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ + +#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ +#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SAU Security Attribution Unit (SAU) + \brief Type definitions for the Security Attribution Unit (SAU) + @{ + */ + +/** + \brief Structure type to access the Security Attribution Unit (SAU). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ + __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ +#else + uint32_t RESERVED0[3]; +#endif + __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ + __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ +} SAU_Type; + +/* SAU Control Register Definitions */ +#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ +#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ + +#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ +#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ + +/* SAU Type Register Definitions */ +#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ +#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ + +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) +/* SAU Region Number Register Definitions */ +#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ +#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ + +/* SAU Region Base Address Register Definitions */ +#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ +#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ + +/* SAU Region Limit Address Register Definitions */ +#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ +#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ + +#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ +#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ + +#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ +#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ + +#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ + +/* Secure Fault Status Register Definitions */ +#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ +#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ + +#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ +#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ + +#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ +#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ + +#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ +#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ + +#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ +#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ + +#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ +#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ + +#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ +#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ + +#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ +#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ + +/*@} end of group CMSIS_SAU */ +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_FPU Floating Point Unit (FPU) + \brief Type definitions for the Floating Point Unit (FPU) + @{ + */ + +/** + \brief Structure type to access the Floating Point Unit (FPU). + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ + __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ + __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ + __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ +} FPU_Type; + +/* Floating-Point Context Control Register Definitions */ +#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ +#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ + +#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ +#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ + +#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ +#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ + +#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ +#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ + +#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ +#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ + +#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ +#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ + +#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ +#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ + +#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ +#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ + +#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ +#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ + +#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ +#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ + +#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ +#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ + +#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ +#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ + +#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ +#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ + +#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ +#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ + +#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ +#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ + +#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ +#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ + +#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ +#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ + +/* Floating-Point Context Address Register Definitions */ +#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ +#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ + +/* Floating-Point Default Status Control Register Definitions */ +#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ +#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ + +#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ +#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ + +#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ +#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ + +#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ +#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ + +/* Media and FP Feature Register 0 Definitions */ +#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ +#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ + +#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ +#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ + +#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ +#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ + +#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ +#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ + +#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ +#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ + +#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ +#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ + +#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ +#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ + +#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ +#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ + +/* Media and FP Feature Register 1 Definitions */ +#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ +#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ + +#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ +#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ + +#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ +#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ + +#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ +#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ + +/*@} end of group CMSIS_FPU */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + uint32_t RESERVED4[1U]; + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< CoreDebug DHCSR: S_RESTART_ST Position */ +#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< CoreDebug DHCSR: S_RESTART_ST Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/* Debug Authentication Control Register Definitions */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ + +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ + +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< CoreDebug DAUTHCTRL: INTSPIDEN Position */ +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPIDEN Mask */ + +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< CoreDebug DAUTHCTRL: SPIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< CoreDebug DAUTHCTRL: SPIDENSEL Mask */ + +/* Debug Security Control and Status Register Definitions */ +#define CoreDebug_DSCSR_CDS_Pos 16U /*!< CoreDebug DSCSR: CDS Position */ +#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< CoreDebug DSCSR: CDS Mask */ + +#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< CoreDebug DSCSR: SBRSEL Position */ +#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< CoreDebug DSCSR: SBRSEL Mask */ + +#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< CoreDebug DSCSR: SBRSELEN Position */ +#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< CoreDebug DSCSR: SBRSELEN Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ + #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ + #define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ + #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ + #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ + #define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ + #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ + #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ + #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + + #define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ + #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ + #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ + #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + #define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ + #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ + #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ + #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< Core Debug configuration struct */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ + #endif + + #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ + #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ + #endif + + #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ + #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ + #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< Core Debug Base Address (non-secure address space) */ + #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ + #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ + #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ + + #define SCnSCB_NS ((SCnSCB_Type *) SCS_BASE_NS ) /*!< System control Register not in SCB(non-secure address space) */ + #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ + #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ + #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ + #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< Core Debug configuration struct (non-secure address space) */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ + #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ + #endif + + #define FPU_BASE_NS (SCS_BASE_NS + 0x0F30UL) /*!< Floating Point Unit (non-secure address space) */ + #define FPU_NS ((FPU_Type *) FPU_BASE_NS ) /*!< Floating Point Unit (non-secure address space) */ + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* Special LR values for Secure/Non-Secure call handling and exception handling */ + +/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ +#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ + +/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ +#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ +#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ +#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ +#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ +#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ +#define EXC_RETURN_SPSEL (0x00000002UL) /* bit [1] stack pointer used to restore context: 0=MSP 1=PSP */ +#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ + +/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ +#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ +#else +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ +#endif + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << 8U) ); /* Insert write key and priorty group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Interrupt Target State + \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + \return 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Target State + \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Clear Interrupt Target State + \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Set Priority Grouping (non-secure) + \details Sets the non-secure priority grouping field when in secure state using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB_NS->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << 8U) ); /* Insert write key and priorty group */ + SCB_NS->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping (non-secure) + \details Reads the priority grouping field from the non-secure NVIC when in secure state. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) +{ + return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt (non-secure) + \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status (non-secure) + \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt (non-secure) + \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Pending Interrupt (non-secure) + \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt (non-secure) + \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt (non-secure) + \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt (non-secure) + \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority (non-secure) + \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every non-secure processor exception. + */ +__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority (non-secure) + \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC_NS->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv8.h" + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + uint32_t mvfr0; + + mvfr0 = FPU->MVFR0; + if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) + { + return 2U; /* Double + Single precision FPU */ + } + else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) + { + return 1U; /* Single precision FPU */ + } + else + { + return 0U; /* No FPU */ + } +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ########################## SAU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SAUFunctions SAU Functions + \brief Functions that configure the SAU. + @{ + */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + +/** + \brief Enable SAU + \details Enables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Enable(void) +{ + SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); +} + + + +/** + \brief Disable SAU + \details Disables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Disable(void) +{ + SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); +} + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_SAUFunctions */ + + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief System Tick Configuration (non-secure) + \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function TZ_SysTick_Config_NS is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + + */ +__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_ARMV8MML_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Include/core_cm0.h b/STM32CubeMX/revF/Drivers/CMSIS/Include/core_cm0.h new file mode 100644 index 00000000..f929bba0 --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Include/core_cm0.h @@ -0,0 +1,949 @@ +/**************************************************************************//** + * @file core_cm0.h + * @brief CMSIS Cortex-M0 Core Peripheral Access Layer Header File + * @version V5.0.5 + * @date 28. May 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM0_H_GENERIC +#define __CORE_CM0_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M0 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM0 definitions */ +#define __CM0_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM0_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM0_CMSIS_VERSION ((__CM0_CMSIS_VERSION_MAIN << 16U) | \ + __CM0_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (0U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM0_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM0_H_DEPENDANT +#define __CORE_CM0_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM0_REV + #define __CM0_REV 0x0000U + #warning "__CM0_REV not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M0 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t _reserved0:1; /*!< bit: 0 Reserved */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[31U]; + __IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[31U]; + __IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[31U]; + __IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[31U]; + uint32_t RESERVED4[64U]; + __IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + uint32_t RESERVED0; + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + uint32_t RESERVED1; + __IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Cortex-M0 Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. + Therefore they are not covered by the Cortex-M0 header file. + @{ + */ +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ +/*#define NVIC_GetActive __NVIC_GetActive not available for Cortex-M0 */ + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* The following EXC_RETURN values are saved the LR on exception entry */ +#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ +#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ +#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ + + +/* Interrupt Priorities are WORD accessible only under Armv6-M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + +#define __NVIC_SetPriorityGrouping(X) (void)(X) +#define __NVIC_GetPriorityGrouping() (0U) + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + Address 0 must be mapped to SRAM. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)0x0U; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)0x0U; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM0_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Include/core_cm0plus.h b/STM32CubeMX/revF/Drivers/CMSIS/Include/core_cm0plus.h new file mode 100644 index 00000000..424011ac --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Include/core_cm0plus.h @@ -0,0 +1,1083 @@ +/**************************************************************************//** + * @file core_cm0plus.h + * @brief CMSIS Cortex-M0+ Core Peripheral Access Layer Header File + * @version V5.0.6 + * @date 28. May 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM0PLUS_H_GENERIC +#define __CORE_CM0PLUS_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex-M0+ + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM0+ definitions */ +#define __CM0PLUS_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM0PLUS_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM0PLUS_CMSIS_VERSION ((__CM0PLUS_CMSIS_VERSION_MAIN << 16U) | \ + __CM0PLUS_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (0U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM0PLUS_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM0PLUS_H_DEPENDANT +#define __CORE_CM0PLUS_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM0PLUS_REV + #define __CM0PLUS_REV 0x0000U + #warning "__CM0PLUS_REV not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __VTOR_PRESENT + #define __VTOR_PRESENT 0U + #warning "__VTOR_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex-M0+ */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core MPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[31U]; + __IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[31U]; + __IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[31U]; + __IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[31U]; + uint32_t RESERVED4[64U]; + __IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ +#else + uint32_t RESERVED0; +#endif + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + uint32_t RESERVED1; + __IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) +/* SCB Interrupt Control State Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 8U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0xFFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ +#endif + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ +} MPU_Type; + +#define MPU_TYPE_RALIASES 1U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 8U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0xFFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register Definitions */ +#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ + +#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ + +#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ + +#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ + +#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ + +#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ + +#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Cortex-M0+ Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. + Therefore they are not covered by the Cortex-M0+ header file. + @{ + */ +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ +/*#define NVIC_GetActive __NVIC_GetActive not available for Cortex-M0+ */ + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* The following EXC_RETURN values are saved the LR on exception entry */ +#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ +#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ +#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ + + +/* Interrupt Priorities are WORD accessible only under Armv6-M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + +#define __NVIC_SetPriorityGrouping(X) (void)(X) +#define __NVIC_GetPriorityGrouping() (0U) + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + If VTOR is not present address 0 must be mapped to SRAM. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t *vectors = (uint32_t *)SCB->VTOR; +#else + uint32_t *vectors = (uint32_t *)0x0U; +#endif + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t *vectors = (uint32_t *)SCB->VTOR; +#else + uint32_t *vectors = (uint32_t *)0x0U; +#endif + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; + +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv7.h" + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM0PLUS_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Include/core_cm1.h b/STM32CubeMX/revF/Drivers/CMSIS/Include/core_cm1.h new file mode 100644 index 00000000..0ed678e3 --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Include/core_cm1.h @@ -0,0 +1,976 @@ +/**************************************************************************//** + * @file core_cm1.h + * @brief CMSIS Cortex-M1 Core Peripheral Access Layer Header File + * @version V1.0.0 + * @date 23. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM1_H_GENERIC +#define __CORE_CM1_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M1 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM1 definitions */ +#define __CM1_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM1_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM1_CMSIS_VERSION ((__CM1_CMSIS_VERSION_MAIN << 16U) | \ + __CM1_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (1U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM1_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM1_H_DEPENDANT +#define __CORE_CM1_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM1_REV + #define __CM1_REV 0x0100U + #warning "__CM1_REV not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M1 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t _reserved0:1; /*!< bit: 0 Reserved */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[31U]; + __IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[31U]; + __IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[31U]; + __IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[31U]; + uint32_t RESERVED4[64U]; + __IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + uint32_t RESERVED0; + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + uint32_t RESERVED1; + __IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ +} SCnSCB_Type; + +/* Auxiliary Control Register Definitions */ +#define SCnSCB_ACTLR_ITCMUAEN_Pos 4U /*!< ACTLR: Instruction TCM Upper Alias Enable Position */ +#define SCnSCB_ACTLR_ITCMUAEN_Msk (1UL << SCnSCB_ACTLR_ITCMUAEN_Pos) /*!< ACTLR: Instruction TCM Upper Alias Enable Mask */ + +#define SCnSCB_ACTLR_ITCMLAEN_Pos 3U /*!< ACTLR: Instruction TCM Lower Alias Enable Position */ +#define SCnSCB_ACTLR_ITCMLAEN_Msk (1UL << SCnSCB_ACTLR_ITCMLAEN_Pos) /*!< ACTLR: Instruction TCM Lower Alias Enable Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Cortex-M1 Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. + Therefore they are not covered by the Cortex-M1 header file. + @{ + */ +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ +/*#define NVIC_GetActive __NVIC_GetActive not available for Cortex-M1 */ + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* The following EXC_RETURN values are saved the LR on exception entry */ +#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ +#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ +#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ + + +/* Interrupt Priorities are WORD accessible only under Armv6-M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + +#define __NVIC_SetPriorityGrouping(X) (void)(X) +#define __NVIC_GetPriorityGrouping() (0U) + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + Address 0 must be mapped to SRAM. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)0x0U; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)0x0U; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM1_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Include/core_cm23.h b/STM32CubeMX/revF/Drivers/CMSIS/Include/core_cm23.h new file mode 100644 index 00000000..acbc5dfe --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Include/core_cm23.h @@ -0,0 +1,1993 @@ +/**************************************************************************//** + * @file core_cm23.h + * @brief CMSIS Cortex-M23 Core Peripheral Access Layer Header File + * @version V5.0.7 + * @date 22. June 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM23_H_GENERIC +#define __CORE_CM23_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M23 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS definitions */ +#define __CM23_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM23_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM23_CMSIS_VERSION ((__CM23_CMSIS_VERSION_MAIN << 16U) | \ + __CM23_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (23U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM23_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM23_H_DEPENDANT +#define __CORE_CM23_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM23_REV + #define __CM23_REV 0x0000U + #warning "__CM23_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __SAUREGION_PRESENT + #define __SAUREGION_PRESENT 0U + #warning "__SAUREGION_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __VTOR_PRESENT + #define __VTOR_PRESENT 0U + #warning "__VTOR_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif + + #ifndef __ETM_PRESENT + #define __ETM_PRESENT 0U + #warning "__ETM_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MTB_PRESENT + #define __MTB_PRESENT 0U + #warning "__MTB_PRESENT not defined in device header file; using default!" + #endif + +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M23 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core SAU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[16U]; + __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[16U]; + __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[16U]; + __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[16U]; + __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[16U]; + __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ + uint32_t RESERVED5[16U]; + __IOM uint32_t IPR[124U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ +#else + uint32_t RESERVED0; +#endif + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + uint32_t RESERVED1; + __IOM uint32_t SHPR[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ +#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ + +#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ +#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ + +#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ +#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ +#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ +#endif + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ +#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ + +#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ +#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ + +#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ +#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ +#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ + +#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ +#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ +#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ +#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ + +#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ +#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + uint32_t RESERVED0[6U]; + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + uint32_t RESERVED3[1U]; + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED4[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + uint32_t RESERVED5[1U]; + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED6[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + uint32_t RESERVED7[1U]; + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED8[1U]; + __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ + uint32_t RESERVED9[1U]; + __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ + uint32_t RESERVED10[1U]; + __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ + uint32_t RESERVED11[1U]; + __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ + uint32_t RESERVED12[1U]; + __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ + uint32_t RESERVED13[1U]; + __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ + uint32_t RESERVED14[1U]; + __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ + uint32_t RESERVED15[1U]; + __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ + uint32_t RESERVED16[1U]; + __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ + uint32_t RESERVED17[1U]; + __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ + uint32_t RESERVED18[1U]; + __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ + uint32_t RESERVED19[1U]; + __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ + uint32_t RESERVED20[1U]; + __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ + uint32_t RESERVED21[1U]; + __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ + uint32_t RESERVED22[1U]; + __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ + uint32_t RESERVED23[1U]; + __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ + uint32_t RESERVED24[1U]; + __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ + uint32_t RESERVED25[1U]; + __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ + uint32_t RESERVED26[1U]; + __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ + uint32_t RESERVED27[1U]; + __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ + uint32_t RESERVED28[1U]; + __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ + uint32_t RESERVED29[1U]; + __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ + uint32_t RESERVED30[1U]; + __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ + uint32_t RESERVED31[1U]; + __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ +#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ + +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ +#define DWT_FUNCTION_ACTION_Msk (0x3UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ + +#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ +#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ + __IM uint32_t ITFTTD0; /*!< Offset: 0xEEC (R/ ) Integration Test FIFO Test Data 0 Register */ + __IOM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/W) Integration Test ATB Control Register 2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) Integration Test ATB Control Register 0 */ + __IM uint32_t ITFTTD1; /*!< Offset: 0xEFC (R/ ) Integration Test FIFO Test Data 1 Register */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) Device Configuration Register */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Identifier Register */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ +#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration Test FIFO Test Data 0 Register Definitions */ +#define TPI_ITFTTD0_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD0: ATB Interface 2 ATVALIDPosition */ +#define TPI_ITFTTD0_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 2 ATVALID Mask */ + +#define TPI_ITFTTD0_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD0: ATB Interface 2 byte count Position */ +#define TPI_ITFTTD0_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 2 byte count Mask */ + +#define TPI_ITFTTD0_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Position */ +#define TPI_ITFTTD0_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Mask */ + +#define TPI_ITFTTD0_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD0: ATB Interface 1 byte count Position */ +#define TPI_ITFTTD0_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 1 byte countt Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data2_Pos 16U /*!< TPI ITFTTD0: ATB Interface 1 data2 Position */ +#define TPI_ITFTTD0_ATB_IF1_data2_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data2 Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data1_Pos 8U /*!< TPI ITFTTD0: ATB Interface 1 data1 Position */ +#define TPI_ITFTTD0_ATB_IF1_data1_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data1 Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data0_Pos 0U /*!< TPI ITFTTD0: ATB Interface 1 data0 Position */ +#define TPI_ITFTTD0_ATB_IF1_data0_Msk (0xFFUL /*<< TPI_ITFTTD0_ATB_IF1_data0_Pos*/) /*!< TPI ITFTTD0: ATB Interface 1 data0 Mask */ + +/* TPI Integration Test ATB Control Register 2 Register Definitions */ +#define TPI_ITATBCTR2_AFVALID2S_Pos 1U /*!< TPI ITATBCTR2: AFVALID2S Position */ +#define TPI_ITATBCTR2_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID2S_Pos) /*!< TPI ITATBCTR2: AFVALID2SS Mask */ + +#define TPI_ITATBCTR2_AFVALID1S_Pos 1U /*!< TPI ITATBCTR2: AFVALID1S Position */ +#define TPI_ITATBCTR2_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID1S_Pos) /*!< TPI ITATBCTR2: AFVALID1SS Mask */ + +#define TPI_ITATBCTR2_ATREADY2S_Pos 0U /*!< TPI ITATBCTR2: ATREADY2S Position */ +#define TPI_ITATBCTR2_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2S_Pos*/) /*!< TPI ITATBCTR2: ATREADY2S Mask */ + +#define TPI_ITATBCTR2_ATREADY1S_Pos 0U /*!< TPI ITATBCTR2: ATREADY1S Position */ +#define TPI_ITATBCTR2_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1S_Pos*/) /*!< TPI ITATBCTR2: ATREADY1S Mask */ + +/* TPI Integration Test FIFO Test Data 1 Register Definitions */ +#define TPI_ITFTTD1_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Position */ +#define TPI_ITFTTD1_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Mask */ + +#define TPI_ITFTTD1_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD1: ATB Interface 2 byte count Position */ +#define TPI_ITFTTD1_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 2 byte count Mask */ + +#define TPI_ITFTTD1_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Position */ +#define TPI_ITFTTD1_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Mask */ + +#define TPI_ITFTTD1_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD1: ATB Interface 1 byte count Position */ +#define TPI_ITFTTD1_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 1 byte countt Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data2_Pos 16U /*!< TPI ITFTTD1: ATB Interface 2 data2 Position */ +#define TPI_ITFTTD1_ATB_IF2_data2_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data2 Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data1_Pos 8U /*!< TPI ITFTTD1: ATB Interface 2 data1 Position */ +#define TPI_ITFTTD1_ATB_IF2_data1_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data1 Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data0_Pos 0U /*!< TPI ITFTTD1: ATB Interface 2 data0 Position */ +#define TPI_ITFTTD1_ATB_IF2_data0_Msk (0xFFUL /*<< TPI_ITFTTD1_ATB_IF2_data0_Pos*/) /*!< TPI ITFTTD1: ATB Interface 2 data0 Mask */ + +/* TPI Integration Test ATB Control Register 0 Definitions */ +#define TPI_ITATBCTR0_AFVALID2S_Pos 1U /*!< TPI ITATBCTR0: AFVALID2S Position */ +#define TPI_ITATBCTR0_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID2S_Pos) /*!< TPI ITATBCTR0: AFVALID2SS Mask */ + +#define TPI_ITATBCTR0_AFVALID1S_Pos 1U /*!< TPI ITATBCTR0: AFVALID1S Position */ +#define TPI_ITATBCTR0_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID1S_Pos) /*!< TPI ITATBCTR0: AFVALID1SS Mask */ + +#define TPI_ITATBCTR0_ATREADY2S_Pos 0U /*!< TPI ITATBCTR0: ATREADY2S Position */ +#define TPI_ITATBCTR0_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2S_Pos*/) /*!< TPI ITATBCTR0: ATREADY2S Mask */ + +#define TPI_ITATBCTR0_ATREADY1S_Pos 0U /*!< TPI ITATBCTR0: ATREADY1S Position */ +#define TPI_ITATBCTR0_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1S_Pos*/) /*!< TPI ITATBCTR0: ATREADY1S Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFOSZ Position */ +#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFOSZ Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x3FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ + uint32_t RESERVED0[7U]; + union { + __IOM uint32_t MAIR[2]; + struct { + __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ + __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ + }; + }; +} MPU_Type; + +#define MPU_TYPE_RALIASES 1U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ +#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ + +#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ +#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ + +#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ +#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ + +#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ +#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ + +/* MPU Region Limit Address Register Definitions */ +#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ +#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ + +#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ +#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ + +#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: EN Position */ +#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: EN Mask */ + +/* MPU Memory Attribute Indirection Register 0 Definitions */ +#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ +#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ + +#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ +#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ + +#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ +#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ + +#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ +#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ + +/* MPU Memory Attribute Indirection Register 1 Definitions */ +#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ +#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ + +#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ +#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ + +#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ +#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ + +#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ +#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SAU Security Attribution Unit (SAU) + \brief Type definitions for the Security Attribution Unit (SAU) + @{ + */ + +/** + \brief Structure type to access the Security Attribution Unit (SAU). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ + __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ +#endif +} SAU_Type; + +/* SAU Control Register Definitions */ +#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ +#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ + +#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ +#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ + +/* SAU Type Register Definitions */ +#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ +#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ + +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) +/* SAU Region Number Register Definitions */ +#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ +#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ + +/* SAU Region Base Address Register Definitions */ +#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ +#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ + +/* SAU Region Limit Address Register Definitions */ +#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ +#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ + +#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ +#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ + +#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ +#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ + +#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ + +/*@} end of group CMSIS_SAU */ +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + uint32_t RESERVED4[1U]; + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< CoreDebug DHCSR: S_RESTART_ST Position */ +#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< CoreDebug DHCSR: S_RESTART_ST Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register */ +#define CoreDebug_DEMCR_DWTENA_Pos 24U /*!< CoreDebug DEMCR: DWTENA Position */ +#define CoreDebug_DEMCR_DWTENA_Msk (1UL << CoreDebug_DEMCR_DWTENA_Pos) /*!< CoreDebug DEMCR: DWTENA Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/* Debug Authentication Control Register Definitions */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ + +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ + +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< CoreDebug DAUTHCTRL: INTSPIDEN Position */ +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPIDEN Mask */ + +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< CoreDebug DAUTHCTRL: SPIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< CoreDebug DAUTHCTRL: SPIDENSEL Mask */ + +/* Debug Security Control and Status Register Definitions */ +#define CoreDebug_DSCSR_CDS_Pos 16U /*!< CoreDebug DSCSR: CDS Position */ +#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< CoreDebug DSCSR: CDS Mask */ + +#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< CoreDebug DSCSR: SBRSEL Position */ +#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< CoreDebug DSCSR: SBRSEL Mask */ + +#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< CoreDebug DSCSR: SBRSELEN Position */ +#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< CoreDebug DSCSR: SBRSELEN Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ + #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ + #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ + #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ + #define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ + #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ + #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ + #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + + + #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ + #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ + #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ + #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ + #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< Core Debug configuration struct */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ + #endif + + #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ + #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ + #endif + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ + #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< Core Debug Base Address (non-secure address space) */ + #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ + #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ + #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ + + #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ + #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ + #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ + #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< Core Debug configuration struct (non-secure address space) */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ + #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ + #endif + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else +/*#define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping not available for Cortex-M23 */ +/*#define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping not available for Cortex-M23 */ + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* Special LR values for Secure/Non-Secure call handling and exception handling */ + +/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ +#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ + +/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ +#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ +#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ +#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ +#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ +#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ +#define EXC_RETURN_SPSEL (0x00000002UL) /* bit [1] stack pointer used to restore context: 0=MSP 1=PSP */ +#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ + +/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ +#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ +#else +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ +#endif + + +/* Interrupt Priorities are WORD accessible only under Armv6-M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + +#define __NVIC_SetPriorityGrouping(X) (void)(X) +#define __NVIC_GetPriorityGrouping() (0U) + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Interrupt Target State + \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + \return 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Target State + \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Clear Interrupt Target State + \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + If VTOR is not present address 0 must be mapped to SRAM. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t *vectors = (uint32_t *)SCB->VTOR; +#else + uint32_t *vectors = (uint32_t *)0x0U; +#endif + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t *vectors = (uint32_t *)SCB->VTOR; +#else + uint32_t *vectors = (uint32_t *)0x0U; +#endif + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Enable Interrupt (non-secure) + \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status (non-secure) + \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt (non-secure) + \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Pending Interrupt (non-secure) + \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt (non-secure) + \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt (non-secure) + \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt (non-secure) + \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority (non-secure) + \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every non-secure processor exception. + */ +__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC_NS->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB_NS->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB_NS->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority (non-secure) + \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB_NS->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv8.h" + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ########################## SAU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SAUFunctions SAU Functions + \brief Functions that configure the SAU. + @{ + */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + +/** + \brief Enable SAU + \details Enables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Enable(void) +{ + SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); +} + + + +/** + \brief Disable SAU + \details Disables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Disable(void) +{ + SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); +} + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_SAUFunctions */ + + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief System Tick Configuration (non-secure) + \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function TZ_SysTick_Config_NS is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + + */ +__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM23_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Include/core_cm3.h b/STM32CubeMX/revF/Drivers/CMSIS/Include/core_cm3.h new file mode 100644 index 00000000..74bff64b --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Include/core_cm3.h @@ -0,0 +1,1941 @@ +/**************************************************************************//** + * @file core_cm3.h + * @brief CMSIS Cortex-M3 Core Peripheral Access Layer Header File + * @version V5.0.8 + * @date 04. June 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM3_H_GENERIC +#define __CORE_CM3_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M3 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM3 definitions */ +#define __CM3_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM3_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM3_CMSIS_VERSION ((__CM3_CMSIS_VERSION_MAIN << 16U) | \ + __CM3_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (3U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM3_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM3_H_DEPENDANT +#define __CORE_CM3_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM3_REV + #define __CM3_REV 0x0200U + #warning "__CM3_REV not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M3 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:1; /*!< bit: 9 Reserved */ + uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ + uint32_t _reserved1:8; /*!< bit: 16..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit */ + uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ +#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ +#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[24U]; + __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[24U]; + __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[24U]; + __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[24U]; + __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[56U]; + __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED5[644U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHP[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + uint32_t RESERVED0[5U]; + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#if defined (__CM3_REV) && (__CM3_REV < 0x0201U) /* core r2p1 */ +#define SCB_VTOR_TBLBASE_Pos 29U /*!< SCB VTOR: TBLBASE Position */ +#define SCB_VTOR_TBLBASE_Msk (1UL << SCB_VTOR_TBLBASE_Pos) /*!< SCB VTOR: TBLBASE Mask */ + +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x3FFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ +#else +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ +#endif + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ +#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ +#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ +#if defined (__CM3_REV) && (__CM3_REV >= 0x200U) + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ +#else + uint32_t RESERVED1[1U]; +#endif +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/* Auxiliary Control Register Definitions */ + +#define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ +#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ + +#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1U /*!< ACTLR: DISDEFWBUF Position */ +#define SCnSCB_ACTLR_DISDEFWBUF_Msk (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos) /*!< ACTLR: DISDEFWBUF Mask */ + +#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ +#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[29U]; + __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ + __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ + __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[6U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ +#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Integration Write Register Definitions */ +#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ +#define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ + +/* ITM Integration Read Register Definitions */ +#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ +#define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ + +/* ITM Integration Mode Control Register Definitions */ +#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ +#define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED0[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Mask Register Definitions */ +#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ +#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ +#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ + +#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ +#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ +#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ + +#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ +#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ + +#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ +#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ + +#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ +#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ + +#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ +#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ + __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ + __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ + __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration ETM Data Register Definitions (FIFO0) */ +#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ +#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ + +#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ +#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ + +#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ +#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ + +#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ +#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ + +#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ +#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ + +#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ +#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ + +#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ +#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ + +/* TPI ITATBCTR2 Register Definitions */ +#define TPI_ITATBCTR2_ATREADY2_Pos 0U /*!< TPI ITATBCTR2: ATREADY2 Position */ +#define TPI_ITATBCTR2_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2_Pos*/) /*!< TPI ITATBCTR2: ATREADY2 Mask */ + +#define TPI_ITATBCTR2_ATREADY1_Pos 0U /*!< TPI ITATBCTR2: ATREADY1 Position */ +#define TPI_ITATBCTR2_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1_Pos*/) /*!< TPI ITATBCTR2: ATREADY1 Mask */ + +/* TPI Integration ITM Data Register Definitions (FIFO1) */ +#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ +#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ + +#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ +#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ + +#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ +#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ + +#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ +#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ + +#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ +#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ + +#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ +#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ + +#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ +#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ + +/* TPI ITATBCTR0 Register Definitions */ +#define TPI_ITATBCTR0_ATREADY2_Pos 0U /*!< TPI ITATBCTR0: ATREADY2 Position */ +#define TPI_ITATBCTR0_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2_Pos*/) /*!< TPI ITATBCTR0: ATREADY2 Mask */ + +#define TPI_ITATBCTR0_ATREADY1_Pos 0U /*!< TPI ITATBCTR0: ATREADY1 Position */ +#define TPI_ITATBCTR0_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1_Pos*/) /*!< TPI ITATBCTR0: ATREADY1 Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ +#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ + +#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ +#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ + __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ + __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ + __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ +} MPU_Type; + +#define MPU_TYPE_RALIASES 4U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register Definitions */ +#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ + +#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ + +#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ + +#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ + +#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ + +#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ + +#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ +#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ +#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ +#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ +#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ +#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ +#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ +#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* The following EXC_RETURN values are saved the LR on exception entry */ +#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ +#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ +#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IP[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv7.h" + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM3_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Include/core_cm33.h b/STM32CubeMX/revF/Drivers/CMSIS/Include/core_cm33.h new file mode 100644 index 00000000..6cd2db77 --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Include/core_cm33.h @@ -0,0 +1,3002 @@ +/**************************************************************************//** + * @file core_cm33.h + * @brief CMSIS Cortex-M33 Core Peripheral Access Layer Header File + * @version V5.0.9 + * @date 06. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM33_H_GENERIC +#define __CORE_CM33_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M33 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM33 definitions */ +#define __CM33_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM33_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM33_CMSIS_VERSION ((__CM33_CMSIS_VERSION_MAIN << 16U) | \ + __CM33_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (33U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. +*/ +#if defined ( __CC_ARM ) + #if defined (__TARGET_FPU_VFP) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) + #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined (__ARM_PCS_VFP) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) + #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) + #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __ICCARM__ ) + #if defined (__ARMVFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) + #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __TI_ARM__ ) + #if defined (__TI_VFP_SUPPORT__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TASKING__ ) + #if defined (__FPU_VFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM33_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM33_H_DEPENDANT +#define __CORE_CM33_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM33_REV + #define __CM33_REV 0x0000U + #warning "__CM33_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __SAUREGION_PRESENT + #define __SAUREGION_PRESENT 0U + #warning "__SAUREGION_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __DSP_PRESENT + #define __DSP_PRESENT 0U + #warning "__DSP_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M33 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core SAU Register + - Core FPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + +#define APSR_GE_Pos 16U /*!< APSR: GE Position */ +#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ +#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ +#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ + uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ + uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ + uint32_t _reserved1:28; /*!< bit: 4..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ +#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ + +#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ +#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ + +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[16U]; + __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[16U]; + __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[16U]; + __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[16U]; + __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[16U]; + __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ + uint32_t RESERVED5[16U]; + __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED6[580U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ID_ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ID_ISAR[6U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ + __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ + __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ + __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ + __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ + uint32_t RESERVED3[92U]; + __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ + uint32_t RESERVED4[15U]; + __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ + uint32_t RESERVED5[1U]; + __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ + uint32_t RESERVED6[1U]; + __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ + __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ + __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ + __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ + __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ + __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ + __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ + __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ + uint32_t RESERVED7[6U]; + __IOM uint32_t ITCMCR; /*!< Offset: 0x290 (R/W) Instruction Tightly-Coupled Memory Control Register */ + __IOM uint32_t DTCMCR; /*!< Offset: 0x294 (R/W) Data Tightly-Coupled Memory Control Registers */ + __IOM uint32_t AHBPCR; /*!< Offset: 0x298 (R/W) AHBP Control Register */ + __IOM uint32_t CACR; /*!< Offset: 0x29C (R/W) L1 Cache Control Register */ + __IOM uint32_t AHBSCR; /*!< Offset: 0x2A0 (R/W) AHB Slave Control Register */ + uint32_t RESERVED8[1U]; + __IOM uint32_t ABFSR; /*!< Offset: 0x2A8 (R/W) Auxiliary Bus Fault Status Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ +#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ + +#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ +#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ + +#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ +#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ +#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ +#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ + +#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ +#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ +#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ +#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ + +#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ +#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ +#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ +#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ +#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ + +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ +#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ + +#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ +#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ +#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MLSPERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ +#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ +#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ +#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/* SCB Non-Secure Access Control Register Definitions */ +#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ +#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ + +#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ +#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ + +#define SCB_NSACR_CPn_Pos 0U /*!< SCB NSACR: CPn Position */ +#define SCB_NSACR_CPn_Msk (1UL /*<< SCB_NSACR_CPn_Pos*/) /*!< SCB NSACR: CPn Mask */ + +/* SCB Cache Level ID Register Definitions */ +#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ +#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ + +#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ +#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ + +/* SCB Cache Type Register Definitions */ +#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ +#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ + +#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ +#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ + +#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ +#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ + +#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ +#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ + +#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ +#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ + +/* SCB Cache Size ID Register Definitions */ +#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ +#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ + +#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ +#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ + +#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ +#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ + +#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ +#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ + +#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ +#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ + +#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ +#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ + +#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ +#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ + +/* SCB Cache Size Selection Register Definitions */ +#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ +#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ + +#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ +#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ + +/* SCB Software Triggered Interrupt Register Definitions */ +#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ +#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ + +/* SCB D-Cache Invalidate by Set-way Register Definitions */ +#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ +#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ + +#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ +#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ + +/* SCB D-Cache Clean by Set-way Register Definitions */ +#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ +#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ + +#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ +#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ + +/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ +#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ +#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ + +#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ +#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ + +/* Instruction Tightly-Coupled Memory Control Register Definitions */ +#define SCB_ITCMCR_SZ_Pos 3U /*!< SCB ITCMCR: SZ Position */ +#define SCB_ITCMCR_SZ_Msk (0xFUL << SCB_ITCMCR_SZ_Pos) /*!< SCB ITCMCR: SZ Mask */ + +#define SCB_ITCMCR_RETEN_Pos 2U /*!< SCB ITCMCR: RETEN Position */ +#define SCB_ITCMCR_RETEN_Msk (1UL << SCB_ITCMCR_RETEN_Pos) /*!< SCB ITCMCR: RETEN Mask */ + +#define SCB_ITCMCR_RMW_Pos 1U /*!< SCB ITCMCR: RMW Position */ +#define SCB_ITCMCR_RMW_Msk (1UL << SCB_ITCMCR_RMW_Pos) /*!< SCB ITCMCR: RMW Mask */ + +#define SCB_ITCMCR_EN_Pos 0U /*!< SCB ITCMCR: EN Position */ +#define SCB_ITCMCR_EN_Msk (1UL /*<< SCB_ITCMCR_EN_Pos*/) /*!< SCB ITCMCR: EN Mask */ + +/* Data Tightly-Coupled Memory Control Register Definitions */ +#define SCB_DTCMCR_SZ_Pos 3U /*!< SCB DTCMCR: SZ Position */ +#define SCB_DTCMCR_SZ_Msk (0xFUL << SCB_DTCMCR_SZ_Pos) /*!< SCB DTCMCR: SZ Mask */ + +#define SCB_DTCMCR_RETEN_Pos 2U /*!< SCB DTCMCR: RETEN Position */ +#define SCB_DTCMCR_RETEN_Msk (1UL << SCB_DTCMCR_RETEN_Pos) /*!< SCB DTCMCR: RETEN Mask */ + +#define SCB_DTCMCR_RMW_Pos 1U /*!< SCB DTCMCR: RMW Position */ +#define SCB_DTCMCR_RMW_Msk (1UL << SCB_DTCMCR_RMW_Pos) /*!< SCB DTCMCR: RMW Mask */ + +#define SCB_DTCMCR_EN_Pos 0U /*!< SCB DTCMCR: EN Position */ +#define SCB_DTCMCR_EN_Msk (1UL /*<< SCB_DTCMCR_EN_Pos*/) /*!< SCB DTCMCR: EN Mask */ + +/* AHBP Control Register Definitions */ +#define SCB_AHBPCR_SZ_Pos 1U /*!< SCB AHBPCR: SZ Position */ +#define SCB_AHBPCR_SZ_Msk (7UL << SCB_AHBPCR_SZ_Pos) /*!< SCB AHBPCR: SZ Mask */ + +#define SCB_AHBPCR_EN_Pos 0U /*!< SCB AHBPCR: EN Position */ +#define SCB_AHBPCR_EN_Msk (1UL /*<< SCB_AHBPCR_EN_Pos*/) /*!< SCB AHBPCR: EN Mask */ + +/* L1 Cache Control Register Definitions */ +#define SCB_CACR_FORCEWT_Pos 2U /*!< SCB CACR: FORCEWT Position */ +#define SCB_CACR_FORCEWT_Msk (1UL << SCB_CACR_FORCEWT_Pos) /*!< SCB CACR: FORCEWT Mask */ + +#define SCB_CACR_ECCEN_Pos 1U /*!< SCB CACR: ECCEN Position */ +#define SCB_CACR_ECCEN_Msk (1UL << SCB_CACR_ECCEN_Pos) /*!< SCB CACR: ECCEN Mask */ + +#define SCB_CACR_SIWT_Pos 0U /*!< SCB CACR: SIWT Position */ +#define SCB_CACR_SIWT_Msk (1UL /*<< SCB_CACR_SIWT_Pos*/) /*!< SCB CACR: SIWT Mask */ + +/* AHBS Control Register Definitions */ +#define SCB_AHBSCR_INITCOUNT_Pos 11U /*!< SCB AHBSCR: INITCOUNT Position */ +#define SCB_AHBSCR_INITCOUNT_Msk (0x1FUL << SCB_AHBPCR_INITCOUNT_Pos) /*!< SCB AHBSCR: INITCOUNT Mask */ + +#define SCB_AHBSCR_TPRI_Pos 2U /*!< SCB AHBSCR: TPRI Position */ +#define SCB_AHBSCR_TPRI_Msk (0x1FFUL << SCB_AHBPCR_TPRI_Pos) /*!< SCB AHBSCR: TPRI Mask */ + +#define SCB_AHBSCR_CTL_Pos 0U /*!< SCB AHBSCR: CTL Position*/ +#define SCB_AHBSCR_CTL_Msk (3UL /*<< SCB_AHBPCR_CTL_Pos*/) /*!< SCB AHBSCR: CTL Mask */ + +/* Auxiliary Bus Fault Status Register Definitions */ +#define SCB_ABFSR_AXIMTYPE_Pos 8U /*!< SCB ABFSR: AXIMTYPE Position*/ +#define SCB_ABFSR_AXIMTYPE_Msk (3UL << SCB_ABFSR_AXIMTYPE_Pos) /*!< SCB ABFSR: AXIMTYPE Mask */ + +#define SCB_ABFSR_EPPB_Pos 4U /*!< SCB ABFSR: EPPB Position*/ +#define SCB_ABFSR_EPPB_Msk (1UL << SCB_ABFSR_EPPB_Pos) /*!< SCB ABFSR: EPPB Mask */ + +#define SCB_ABFSR_AXIM_Pos 3U /*!< SCB ABFSR: AXIM Position*/ +#define SCB_ABFSR_AXIM_Msk (1UL << SCB_ABFSR_AXIM_Pos) /*!< SCB ABFSR: AXIM Mask */ + +#define SCB_ABFSR_AHBP_Pos 2U /*!< SCB ABFSR: AHBP Position*/ +#define SCB_ABFSR_AHBP_Msk (1UL << SCB_ABFSR_AHBP_Pos) /*!< SCB ABFSR: AHBP Mask */ + +#define SCB_ABFSR_DTCM_Pos 1U /*!< SCB ABFSR: DTCM Position*/ +#define SCB_ABFSR_DTCM_Msk (1UL << SCB_ABFSR_DTCM_Pos) /*!< SCB ABFSR: DTCM Mask */ + +#define SCB_ABFSR_ITCM_Pos 0U /*!< SCB ABFSR: ITCM Position*/ +#define SCB_ABFSR_ITCM_Msk (1UL /*<< SCB_ABFSR_ITCM_Pos*/) /*!< SCB ABFSR: ITCM Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ + __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[29U]; + __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ + __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ + __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ + uint32_t RESERVED6[4U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Stimulus Port Register Definitions */ +#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ +#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ + +#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ +#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TRACEBUSID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TRACEBUSID_Msk (0x7FUL << ITM_TCR_TRACEBUSID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPRESCALE_Pos 8U /*!< ITM TCR: TSPRESCALE Position */ +#define ITM_TCR_TSPRESCALE_Msk (3UL << ITM_TCR_TSPRESCALE_Pos) /*!< ITM TCR: TSPRESCALE Mask */ + +#define ITM_TCR_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ +#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Integration Write Register Definitions */ +#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ +#define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ + +/* ITM Integration Read Register Definitions */ +#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ +#define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ + +/* ITM Integration Mode Control Register Definitions */ +#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ +#define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + uint32_t RESERVED3[1U]; + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED4[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + uint32_t RESERVED5[1U]; + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED6[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + uint32_t RESERVED7[1U]; + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED8[1U]; + __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ + uint32_t RESERVED9[1U]; + __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ + uint32_t RESERVED10[1U]; + __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ + uint32_t RESERVED11[1U]; + __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ + uint32_t RESERVED12[1U]; + __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ + uint32_t RESERVED13[1U]; + __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ + uint32_t RESERVED14[1U]; + __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ + uint32_t RESERVED15[1U]; + __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ + uint32_t RESERVED16[1U]; + __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ + uint32_t RESERVED17[1U]; + __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ + uint32_t RESERVED18[1U]; + __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ + uint32_t RESERVED19[1U]; + __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ + uint32_t RESERVED20[1U]; + __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ + uint32_t RESERVED21[1U]; + __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ + uint32_t RESERVED22[1U]; + __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ + uint32_t RESERVED23[1U]; + __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ + uint32_t RESERVED24[1U]; + __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ + uint32_t RESERVED25[1U]; + __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ + uint32_t RESERVED26[1U]; + __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ + uint32_t RESERVED27[1U]; + __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ + uint32_t RESERVED28[1U]; + __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ + uint32_t RESERVED29[1U]; + __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ + uint32_t RESERVED30[1U]; + __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ + uint32_t RESERVED31[1U]; + __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ + uint32_t RESERVED32[934U]; + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ + uint32_t RESERVED33[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ +#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ +#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ + +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ +#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ + +#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ +#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ + __IM uint32_t ITFTTD0; /*!< Offset: 0xEEC (R/ ) Integration Test FIFO Test Data 0 Register */ + __IOM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/W) Integration Test ATB Control Register 2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) Integration Test ATB Control Register 0 */ + __IM uint32_t ITFTTD1; /*!< Offset: 0xEFC (R/ ) Integration Test FIFO Test Data 1 Register */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) Device Configuration Register */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Identifier Register */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ +#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration Test FIFO Test Data 0 Register Definitions */ +#define TPI_ITFTTD0_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD0: ATB Interface 2 ATVALIDPosition */ +#define TPI_ITFTTD0_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 2 ATVALID Mask */ + +#define TPI_ITFTTD0_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD0: ATB Interface 2 byte count Position */ +#define TPI_ITFTTD0_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 2 byte count Mask */ + +#define TPI_ITFTTD0_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Position */ +#define TPI_ITFTTD0_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Mask */ + +#define TPI_ITFTTD0_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD0: ATB Interface 1 byte count Position */ +#define TPI_ITFTTD0_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 1 byte countt Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data2_Pos 16U /*!< TPI ITFTTD0: ATB Interface 1 data2 Position */ +#define TPI_ITFTTD0_ATB_IF1_data2_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data2 Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data1_Pos 8U /*!< TPI ITFTTD0: ATB Interface 1 data1 Position */ +#define TPI_ITFTTD0_ATB_IF1_data1_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data1 Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data0_Pos 0U /*!< TPI ITFTTD0: ATB Interface 1 data0 Position */ +#define TPI_ITFTTD0_ATB_IF1_data0_Msk (0xFFUL /*<< TPI_ITFTTD0_ATB_IF1_data0_Pos*/) /*!< TPI ITFTTD0: ATB Interface 1 data0 Mask */ + +/* TPI Integration Test ATB Control Register 2 Register Definitions */ +#define TPI_ITATBCTR2_AFVALID2S_Pos 1U /*!< TPI ITATBCTR2: AFVALID2S Position */ +#define TPI_ITATBCTR2_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID2S_Pos) /*!< TPI ITATBCTR2: AFVALID2SS Mask */ + +#define TPI_ITATBCTR2_AFVALID1S_Pos 1U /*!< TPI ITATBCTR2: AFVALID1S Position */ +#define TPI_ITATBCTR2_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID1S_Pos) /*!< TPI ITATBCTR2: AFVALID1SS Mask */ + +#define TPI_ITATBCTR2_ATREADY2S_Pos 0U /*!< TPI ITATBCTR2: ATREADY2S Position */ +#define TPI_ITATBCTR2_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2S_Pos*/) /*!< TPI ITATBCTR2: ATREADY2S Mask */ + +#define TPI_ITATBCTR2_ATREADY1S_Pos 0U /*!< TPI ITATBCTR2: ATREADY1S Position */ +#define TPI_ITATBCTR2_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1S_Pos*/) /*!< TPI ITATBCTR2: ATREADY1S Mask */ + +/* TPI Integration Test FIFO Test Data 1 Register Definitions */ +#define TPI_ITFTTD1_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Position */ +#define TPI_ITFTTD1_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Mask */ + +#define TPI_ITFTTD1_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD1: ATB Interface 2 byte count Position */ +#define TPI_ITFTTD1_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 2 byte count Mask */ + +#define TPI_ITFTTD1_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Position */ +#define TPI_ITFTTD1_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Mask */ + +#define TPI_ITFTTD1_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD1: ATB Interface 1 byte count Position */ +#define TPI_ITFTTD1_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 1 byte countt Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data2_Pos 16U /*!< TPI ITFTTD1: ATB Interface 2 data2 Position */ +#define TPI_ITFTTD1_ATB_IF2_data2_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data2 Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data1_Pos 8U /*!< TPI ITFTTD1: ATB Interface 2 data1 Position */ +#define TPI_ITFTTD1_ATB_IF2_data1_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data1 Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data0_Pos 0U /*!< TPI ITFTTD1: ATB Interface 2 data0 Position */ +#define TPI_ITFTTD1_ATB_IF2_data0_Msk (0xFFUL /*<< TPI_ITFTTD1_ATB_IF2_data0_Pos*/) /*!< TPI ITFTTD1: ATB Interface 2 data0 Mask */ + +/* TPI Integration Test ATB Control Register 0 Definitions */ +#define TPI_ITATBCTR0_AFVALID2S_Pos 1U /*!< TPI ITATBCTR0: AFVALID2S Position */ +#define TPI_ITATBCTR0_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID2S_Pos) /*!< TPI ITATBCTR0: AFVALID2SS Mask */ + +#define TPI_ITATBCTR0_AFVALID1S_Pos 1U /*!< TPI ITATBCTR0: AFVALID1S Position */ +#define TPI_ITATBCTR0_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID1S_Pos) /*!< TPI ITATBCTR0: AFVALID1SS Mask */ + +#define TPI_ITATBCTR0_ATREADY2S_Pos 0U /*!< TPI ITATBCTR0: ATREADY2S Position */ +#define TPI_ITATBCTR0_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2S_Pos*/) /*!< TPI ITATBCTR0: ATREADY2S Mask */ + +#define TPI_ITATBCTR0_ATREADY1S_Pos 0U /*!< TPI ITATBCTR0: ATREADY1S Position */ +#define TPI_ITATBCTR0_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1S_Pos*/) /*!< TPI ITATBCTR0: ATREADY1S Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFOSZ Position */ +#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFOSZ Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x3FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ + __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ + __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ + __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ + uint32_t RESERVED0[1]; + union { + __IOM uint32_t MAIR[2]; + struct { + __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ + __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ + }; + }; +} MPU_Type; + +#define MPU_TYPE_RALIASES 4U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ +#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ + +#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ +#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ + +#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ +#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ + +#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ +#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ + +/* MPU Region Limit Address Register Definitions */ +#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ +#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ + +#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ +#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ + +#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ +#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ + +/* MPU Memory Attribute Indirection Register 0 Definitions */ +#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ +#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ + +#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ +#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ + +#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ +#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ + +#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ +#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ + +/* MPU Memory Attribute Indirection Register 1 Definitions */ +#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ +#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ + +#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ +#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ + +#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ +#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ + +#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ +#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SAU Security Attribution Unit (SAU) + \brief Type definitions for the Security Attribution Unit (SAU) + @{ + */ + +/** + \brief Structure type to access the Security Attribution Unit (SAU). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ + __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ +#else + uint32_t RESERVED0[3]; +#endif + __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ + __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ +} SAU_Type; + +/* SAU Control Register Definitions */ +#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ +#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ + +#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ +#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ + +/* SAU Type Register Definitions */ +#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ +#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ + +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) +/* SAU Region Number Register Definitions */ +#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ +#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ + +/* SAU Region Base Address Register Definitions */ +#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ +#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ + +/* SAU Region Limit Address Register Definitions */ +#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ +#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ + +#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ +#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ + +#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ +#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ + +#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ + +/* Secure Fault Status Register Definitions */ +#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ +#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ + +#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ +#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ + +#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ +#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ + +#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ +#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ + +#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ +#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ + +#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ +#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ + +#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ +#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ + +#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ +#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ + +/*@} end of group CMSIS_SAU */ +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_FPU Floating Point Unit (FPU) + \brief Type definitions for the Floating Point Unit (FPU) + @{ + */ + +/** + \brief Structure type to access the Floating Point Unit (FPU). + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ + __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ + __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ + __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ +} FPU_Type; + +/* Floating-Point Context Control Register Definitions */ +#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ +#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ + +#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ +#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ + +#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ +#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ + +#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ +#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ + +#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ +#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ + +#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ +#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ + +#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ +#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ + +#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ +#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ + +#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ +#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ + +#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ +#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ + +#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ +#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ + +#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ +#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ + +#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ +#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ + +#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ +#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ + +#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ +#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ + +#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ +#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ + +#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ +#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ + +/* Floating-Point Context Address Register Definitions */ +#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ +#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ + +/* Floating-Point Default Status Control Register Definitions */ +#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ +#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ + +#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ +#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ + +#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ +#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ + +#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ +#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ + +/* Media and FP Feature Register 0 Definitions */ +#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ +#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ + +#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ +#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ + +#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ +#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ + +#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ +#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ + +#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ +#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ + +#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ +#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ + +#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ +#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ + +#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ +#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ + +/* Media and FP Feature Register 1 Definitions */ +#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ +#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ + +#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ +#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ + +#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ +#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ + +#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ +#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ + +/*@} end of group CMSIS_FPU */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + uint32_t RESERVED4[1U]; + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< CoreDebug DHCSR: S_RESTART_ST Position */ +#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< CoreDebug DHCSR: S_RESTART_ST Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/* Debug Authentication Control Register Definitions */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ + +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ + +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< CoreDebug DAUTHCTRL: INTSPIDEN Position */ +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPIDEN Mask */ + +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< CoreDebug DAUTHCTRL: SPIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< CoreDebug DAUTHCTRL: SPIDENSEL Mask */ + +/* Debug Security Control and Status Register Definitions */ +#define CoreDebug_DSCSR_CDS_Pos 16U /*!< CoreDebug DSCSR: CDS Position */ +#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< CoreDebug DSCSR: CDS Mask */ + +#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< CoreDebug DSCSR: SBRSEL Position */ +#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< CoreDebug DSCSR: SBRSEL Mask */ + +#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< CoreDebug DSCSR: SBRSELEN Position */ +#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< CoreDebug DSCSR: SBRSELEN Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ + #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ + #define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ + #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ + #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ + #define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ + #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ + #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ + #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + + #define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ + #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ + #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ + #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + #define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ + #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ + #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ + #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< Core Debug configuration struct */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ + #endif + + #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ + #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ + #endif + + #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ + #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ + #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< Core Debug Base Address (non-secure address space) */ + #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ + #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ + #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ + + #define SCnSCB_NS ((SCnSCB_Type *) SCS_BASE_NS ) /*!< System control Register not in SCB(non-secure address space) */ + #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ + #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ + #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ + #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< Core Debug configuration struct (non-secure address space) */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ + #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ + #endif + + #define FPU_BASE_NS (SCS_BASE_NS + 0x0F30UL) /*!< Floating Point Unit (non-secure address space) */ + #define FPU_NS ((FPU_Type *) FPU_BASE_NS ) /*!< Floating Point Unit (non-secure address space) */ + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* Special LR values for Secure/Non-Secure call handling and exception handling */ + +/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ +#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ + +/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ +#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ +#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ +#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ +#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ +#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ +#define EXC_RETURN_SPSEL (0x00000002UL) /* bit [1] stack pointer used to restore context: 0=MSP 1=PSP */ +#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ + +/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ +#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ +#else +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ +#endif + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << 8U) ); /* Insert write key and priority group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Interrupt Target State + \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + \return 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Target State + \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Clear Interrupt Target State + \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Set Priority Grouping (non-secure) + \details Sets the non-secure priority grouping field when in secure state using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB_NS->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ + SCB_NS->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping (non-secure) + \details Reads the priority grouping field from the non-secure NVIC when in secure state. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) +{ + return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt (non-secure) + \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status (non-secure) + \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt (non-secure) + \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Pending Interrupt (non-secure) + \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt (non-secure) + \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt (non-secure) + \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt (non-secure) + \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority (non-secure) + \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every non-secure processor exception. + */ +__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority (non-secure) + \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC_NS->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv8.h" + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + uint32_t mvfr0; + + mvfr0 = FPU->MVFR0; + if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) + { + return 2U; /* Double + Single precision FPU */ + } + else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) + { + return 1U; /* Single precision FPU */ + } + else + { + return 0U; /* No FPU */ + } +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ########################## SAU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SAUFunctions SAU Functions + \brief Functions that configure the SAU. + @{ + */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + +/** + \brief Enable SAU + \details Enables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Enable(void) +{ + SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); +} + + + +/** + \brief Disable SAU + \details Disables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Disable(void) +{ + SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); +} + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_SAUFunctions */ + + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief System Tick Configuration (non-secure) + \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function TZ_SysTick_Config_NS is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + + */ +__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM33_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Include/core_cm4.h b/STM32CubeMX/revF/Drivers/CMSIS/Include/core_cm4.h new file mode 100644 index 00000000..7d568735 --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Include/core_cm4.h @@ -0,0 +1,2129 @@ +/**************************************************************************//** + * @file core_cm4.h + * @brief CMSIS Cortex-M4 Core Peripheral Access Layer Header File + * @version V5.0.8 + * @date 04. June 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM4_H_GENERIC +#define __CORE_CM4_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M4 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM4 definitions */ +#define __CM4_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM4_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM4_CMSIS_VERSION ((__CM4_CMSIS_VERSION_MAIN << 16U) | \ + __CM4_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (4U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. +*/ +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM4_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM4_H_DEPENDANT +#define __CORE_CM4_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM4_REV + #define __CM4_REV 0x0000U + #warning "__CM4_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M4 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core FPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + +#define APSR_GE_Pos 16U /*!< APSR: GE Position */ +#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:1; /*!< bit: 9 Reserved */ + uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit */ + uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ +#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ +#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ + +#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ +#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ + uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ +#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ + +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[24U]; + __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[24U]; + __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[24U]; + __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[24U]; + __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[56U]; + __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED5[644U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHP[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + uint32_t RESERVED0[5U]; + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ +#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ +#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MLSPERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ +#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ +#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/* Auxiliary Control Register Definitions */ +#define SCnSCB_ACTLR_DISOOFP_Pos 9U /*!< ACTLR: DISOOFP Position */ +#define SCnSCB_ACTLR_DISOOFP_Msk (1UL << SCnSCB_ACTLR_DISOOFP_Pos) /*!< ACTLR: DISOOFP Mask */ + +#define SCnSCB_ACTLR_DISFPCA_Pos 8U /*!< ACTLR: DISFPCA Position */ +#define SCnSCB_ACTLR_DISFPCA_Msk (1UL << SCnSCB_ACTLR_DISFPCA_Pos) /*!< ACTLR: DISFPCA Mask */ + +#define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ +#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ + +#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1U /*!< ACTLR: DISDEFWBUF Position */ +#define SCnSCB_ACTLR_DISDEFWBUF_Msk (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos) /*!< ACTLR: DISDEFWBUF Mask */ + +#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ +#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[29U]; + __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ + __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ + __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[6U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ +#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Integration Write Register Definitions */ +#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ +#define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ + +/* ITM Integration Read Register Definitions */ +#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ +#define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ + +/* ITM Integration Mode Control Register Definitions */ +#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ +#define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED0[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Mask Register Definitions */ +#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ +#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ +#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ + +#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ +#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ +#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ + +#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ +#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ + +#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ +#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ + +#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ +#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ + +#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ +#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ + __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ + __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ + __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration ETM Data Register Definitions (FIFO0) */ +#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ +#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ + +#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ +#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ + +#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ +#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ + +#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ +#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ + +#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ +#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ + +#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ +#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ + +#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ +#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ + +/* TPI ITATBCTR2 Register Definitions */ +#define TPI_ITATBCTR2_ATREADY2_Pos 0U /*!< TPI ITATBCTR2: ATREADY2 Position */ +#define TPI_ITATBCTR2_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2_Pos*/) /*!< TPI ITATBCTR2: ATREADY2 Mask */ + +#define TPI_ITATBCTR2_ATREADY1_Pos 0U /*!< TPI ITATBCTR2: ATREADY1 Position */ +#define TPI_ITATBCTR2_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1_Pos*/) /*!< TPI ITATBCTR2: ATREADY1 Mask */ + +/* TPI Integration ITM Data Register Definitions (FIFO1) */ +#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ +#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ + +#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ +#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ + +#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ +#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ + +#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ +#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ + +#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ +#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ + +#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ +#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ + +#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ +#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ + +/* TPI ITATBCTR0 Register Definitions */ +#define TPI_ITATBCTR0_ATREADY2_Pos 0U /*!< TPI ITATBCTR0: ATREADY2 Position */ +#define TPI_ITATBCTR0_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2_Pos*/) /*!< TPI ITATBCTR0: ATREADY2 Mask */ + +#define TPI_ITATBCTR0_ATREADY1_Pos 0U /*!< TPI ITATBCTR0: ATREADY1 Position */ +#define TPI_ITATBCTR0_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1_Pos*/) /*!< TPI ITATBCTR0: ATREADY1 Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ +#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ + +#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ +#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ + __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ + __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ + __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ +} MPU_Type; + +#define MPU_TYPE_RALIASES 4U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register Definitions */ +#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ + +#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ + +#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ + +#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ + +#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ + +#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ + +#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif /* defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_FPU Floating Point Unit (FPU) + \brief Type definitions for the Floating Point Unit (FPU) + @{ + */ + +/** + \brief Structure type to access the Floating Point Unit (FPU). + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ + __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ + __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ + __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ +} FPU_Type; + +/* Floating-Point Context Control Register Definitions */ +#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ +#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ + +#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ +#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ + +#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ +#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ + +#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ +#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ + +#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ +#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ + +#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ +#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ + +#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ +#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ + +#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ +#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ + +#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ +#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ + +/* Floating-Point Context Address Register Definitions */ +#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ +#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ + +/* Floating-Point Default Status Control Register Definitions */ +#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ +#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ + +#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ +#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ + +#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ +#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ + +#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ +#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ + +/* Media and FP Feature Register 0 Definitions */ +#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ +#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ + +#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ +#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ + +#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ +#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ + +#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ +#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ + +#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ +#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ + +#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ +#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ + +#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ +#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ + +#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ +#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ + +/* Media and FP Feature Register 1 Definitions */ +#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ +#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ + +#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ +#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ + +#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ +#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ + +#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ +#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ + +/*@} end of group CMSIS_FPU */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ +#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ +#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ +#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ +#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ +#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ +#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ +#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +#define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ +#define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* The following EXC_RETURN values are saved the LR on exception entry */ +#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ +#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ +#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ +#define EXC_RETURN_HANDLER_FPU (0xFFFFFFE1UL) /* return to Handler mode, uses MSP after return, restore floating-point state */ +#define EXC_RETURN_THREAD_MSP_FPU (0xFFFFFFE9UL) /* return to Thread mode, uses MSP after return, restore floating-point state */ +#define EXC_RETURN_THREAD_PSP_FPU (0xFFFFFFEDUL) /* return to Thread mode, uses PSP after return, restore floating-point state */ + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IP[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv7.h" + +#endif + + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + uint32_t mvfr0; + + mvfr0 = FPU->MVFR0; + if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) + { + return 1U; /* Single precision FPU */ + } + else + { + return 0U; /* No FPU */ + } +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM4_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Include/core_cm7.h b/STM32CubeMX/revF/Drivers/CMSIS/Include/core_cm7.h new file mode 100644 index 00000000..a14dc623 --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Include/core_cm7.h @@ -0,0 +1,2671 @@ +/**************************************************************************//** + * @file core_cm7.h + * @brief CMSIS Cortex-M7 Core Peripheral Access Layer Header File + * @version V5.0.8 + * @date 04. June 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM7_H_GENERIC +#define __CORE_CM7_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M7 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM7 definitions */ +#define __CM7_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM7_CMSIS_VERSION_SUB ( __CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM7_CMSIS_VERSION ((__CM7_CMSIS_VERSION_MAIN << 16U) | \ + __CM7_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (7U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. +*/ +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM7_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM7_H_DEPENDANT +#define __CORE_CM7_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM7_REV + #define __CM7_REV 0x0000U + #warning "__CM7_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __ICACHE_PRESENT + #define __ICACHE_PRESENT 0U + #warning "__ICACHE_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __DCACHE_PRESENT + #define __DCACHE_PRESENT 0U + #warning "__DCACHE_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __DTCM_PRESENT + #define __DTCM_PRESENT 0U + #warning "__DTCM_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M7 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core FPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + +#define APSR_GE_Pos 16U /*!< APSR: GE Position */ +#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:1; /*!< bit: 9 Reserved */ + uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit */ + uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ +#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ +#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ + +#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ +#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ + uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ +#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ + +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[24U]; + __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[24U]; + __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[24U]; + __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[24U]; + __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[56U]; + __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED5[644U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ID_AFR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t ID_MFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ID_ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + uint32_t RESERVED0[1U]; + __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ + __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ + __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ + __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ + uint32_t RESERVED3[93U]; + __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ + uint32_t RESERVED4[15U]; + __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ + uint32_t RESERVED5[1U]; + __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ + uint32_t RESERVED6[1U]; + __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ + __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ + __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ + __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ + __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ + __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ + __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ + __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ + uint32_t RESERVED7[6U]; + __IOM uint32_t ITCMCR; /*!< Offset: 0x290 (R/W) Instruction Tightly-Coupled Memory Control Register */ + __IOM uint32_t DTCMCR; /*!< Offset: 0x294 (R/W) Data Tightly-Coupled Memory Control Registers */ + __IOM uint32_t AHBPCR; /*!< Offset: 0x298 (R/W) AHBP Control Register */ + __IOM uint32_t CACR; /*!< Offset: 0x29C (R/W) L1 Cache Control Register */ + __IOM uint32_t AHBSCR; /*!< Offset: 0x2A0 (R/W) AHB Slave Control Register */ + uint32_t RESERVED8[1U]; + __IOM uint32_t ABFSR; /*!< Offset: 0x2A8 (R/W) Auxiliary Bus Fault Status Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ +#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: Branch prediction enable bit Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: Branch prediction enable bit Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: Instruction cache enable bit Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: Instruction cache enable bit Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: Cache enable bit Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: Cache enable bit Mask */ + +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ +#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MLSPERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ +#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ +#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/* SCB Cache Level ID Register Definitions */ +#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ +#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ + +#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ +#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ + +/* SCB Cache Type Register Definitions */ +#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ +#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ + +#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ +#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ + +#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ +#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ + +#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ +#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ + +#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ +#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ + +/* SCB Cache Size ID Register Definitions */ +#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ +#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ + +#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ +#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ + +#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ +#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ + +#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ +#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ + +#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ +#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ + +#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ +#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ + +#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ +#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ + +/* SCB Cache Size Selection Register Definitions */ +#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ +#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ + +#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ +#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ + +/* SCB Software Triggered Interrupt Register Definitions */ +#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ +#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ + +/* SCB D-Cache Invalidate by Set-way Register Definitions */ +#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ +#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ + +#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ +#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ + +/* SCB D-Cache Clean by Set-way Register Definitions */ +#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ +#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ + +#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ +#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ + +/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ +#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ +#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ + +#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ +#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ + +/* Instruction Tightly-Coupled Memory Control Register Definitions */ +#define SCB_ITCMCR_SZ_Pos 3U /*!< SCB ITCMCR: SZ Position */ +#define SCB_ITCMCR_SZ_Msk (0xFUL << SCB_ITCMCR_SZ_Pos) /*!< SCB ITCMCR: SZ Mask */ + +#define SCB_ITCMCR_RETEN_Pos 2U /*!< SCB ITCMCR: RETEN Position */ +#define SCB_ITCMCR_RETEN_Msk (1UL << SCB_ITCMCR_RETEN_Pos) /*!< SCB ITCMCR: RETEN Mask */ + +#define SCB_ITCMCR_RMW_Pos 1U /*!< SCB ITCMCR: RMW Position */ +#define SCB_ITCMCR_RMW_Msk (1UL << SCB_ITCMCR_RMW_Pos) /*!< SCB ITCMCR: RMW Mask */ + +#define SCB_ITCMCR_EN_Pos 0U /*!< SCB ITCMCR: EN Position */ +#define SCB_ITCMCR_EN_Msk (1UL /*<< SCB_ITCMCR_EN_Pos*/) /*!< SCB ITCMCR: EN Mask */ + +/* Data Tightly-Coupled Memory Control Register Definitions */ +#define SCB_DTCMCR_SZ_Pos 3U /*!< SCB DTCMCR: SZ Position */ +#define SCB_DTCMCR_SZ_Msk (0xFUL << SCB_DTCMCR_SZ_Pos) /*!< SCB DTCMCR: SZ Mask */ + +#define SCB_DTCMCR_RETEN_Pos 2U /*!< SCB DTCMCR: RETEN Position */ +#define SCB_DTCMCR_RETEN_Msk (1UL << SCB_DTCMCR_RETEN_Pos) /*!< SCB DTCMCR: RETEN Mask */ + +#define SCB_DTCMCR_RMW_Pos 1U /*!< SCB DTCMCR: RMW Position */ +#define SCB_DTCMCR_RMW_Msk (1UL << SCB_DTCMCR_RMW_Pos) /*!< SCB DTCMCR: RMW Mask */ + +#define SCB_DTCMCR_EN_Pos 0U /*!< SCB DTCMCR: EN Position */ +#define SCB_DTCMCR_EN_Msk (1UL /*<< SCB_DTCMCR_EN_Pos*/) /*!< SCB DTCMCR: EN Mask */ + +/* AHBP Control Register Definitions */ +#define SCB_AHBPCR_SZ_Pos 1U /*!< SCB AHBPCR: SZ Position */ +#define SCB_AHBPCR_SZ_Msk (7UL << SCB_AHBPCR_SZ_Pos) /*!< SCB AHBPCR: SZ Mask */ + +#define SCB_AHBPCR_EN_Pos 0U /*!< SCB AHBPCR: EN Position */ +#define SCB_AHBPCR_EN_Msk (1UL /*<< SCB_AHBPCR_EN_Pos*/) /*!< SCB AHBPCR: EN Mask */ + +/* L1 Cache Control Register Definitions */ +#define SCB_CACR_FORCEWT_Pos 2U /*!< SCB CACR: FORCEWT Position */ +#define SCB_CACR_FORCEWT_Msk (1UL << SCB_CACR_FORCEWT_Pos) /*!< SCB CACR: FORCEWT Mask */ + +#define SCB_CACR_ECCEN_Pos 1U /*!< SCB CACR: ECCEN Position */ +#define SCB_CACR_ECCEN_Msk (1UL << SCB_CACR_ECCEN_Pos) /*!< SCB CACR: ECCEN Mask */ + +#define SCB_CACR_SIWT_Pos 0U /*!< SCB CACR: SIWT Position */ +#define SCB_CACR_SIWT_Msk (1UL /*<< SCB_CACR_SIWT_Pos*/) /*!< SCB CACR: SIWT Mask */ + +/* AHBS Control Register Definitions */ +#define SCB_AHBSCR_INITCOUNT_Pos 11U /*!< SCB AHBSCR: INITCOUNT Position */ +#define SCB_AHBSCR_INITCOUNT_Msk (0x1FUL << SCB_AHBPCR_INITCOUNT_Pos) /*!< SCB AHBSCR: INITCOUNT Mask */ + +#define SCB_AHBSCR_TPRI_Pos 2U /*!< SCB AHBSCR: TPRI Position */ +#define SCB_AHBSCR_TPRI_Msk (0x1FFUL << SCB_AHBPCR_TPRI_Pos) /*!< SCB AHBSCR: TPRI Mask */ + +#define SCB_AHBSCR_CTL_Pos 0U /*!< SCB AHBSCR: CTL Position*/ +#define SCB_AHBSCR_CTL_Msk (3UL /*<< SCB_AHBPCR_CTL_Pos*/) /*!< SCB AHBSCR: CTL Mask */ + +/* Auxiliary Bus Fault Status Register Definitions */ +#define SCB_ABFSR_AXIMTYPE_Pos 8U /*!< SCB ABFSR: AXIMTYPE Position*/ +#define SCB_ABFSR_AXIMTYPE_Msk (3UL << SCB_ABFSR_AXIMTYPE_Pos) /*!< SCB ABFSR: AXIMTYPE Mask */ + +#define SCB_ABFSR_EPPB_Pos 4U /*!< SCB ABFSR: EPPB Position*/ +#define SCB_ABFSR_EPPB_Msk (1UL << SCB_ABFSR_EPPB_Pos) /*!< SCB ABFSR: EPPB Mask */ + +#define SCB_ABFSR_AXIM_Pos 3U /*!< SCB ABFSR: AXIM Position*/ +#define SCB_ABFSR_AXIM_Msk (1UL << SCB_ABFSR_AXIM_Pos) /*!< SCB ABFSR: AXIM Mask */ + +#define SCB_ABFSR_AHBP_Pos 2U /*!< SCB ABFSR: AHBP Position*/ +#define SCB_ABFSR_AHBP_Msk (1UL << SCB_ABFSR_AHBP_Pos) /*!< SCB ABFSR: AHBP Mask */ + +#define SCB_ABFSR_DTCM_Pos 1U /*!< SCB ABFSR: DTCM Position*/ +#define SCB_ABFSR_DTCM_Msk (1UL << SCB_ABFSR_DTCM_Pos) /*!< SCB ABFSR: DTCM Mask */ + +#define SCB_ABFSR_ITCM_Pos 0U /*!< SCB ABFSR: ITCM Position*/ +#define SCB_ABFSR_ITCM_Msk (1UL /*<< SCB_ABFSR_ITCM_Pos*/) /*!< SCB ABFSR: ITCM Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/* Auxiliary Control Register Definitions */ +#define SCnSCB_ACTLR_DISITMATBFLUSH_Pos 12U /*!< ACTLR: DISITMATBFLUSH Position */ +#define SCnSCB_ACTLR_DISITMATBFLUSH_Msk (1UL << SCnSCB_ACTLR_DISITMATBFLUSH_Pos) /*!< ACTLR: DISITMATBFLUSH Mask */ + +#define SCnSCB_ACTLR_DISRAMODE_Pos 11U /*!< ACTLR: DISRAMODE Position */ +#define SCnSCB_ACTLR_DISRAMODE_Msk (1UL << SCnSCB_ACTLR_DISRAMODE_Pos) /*!< ACTLR: DISRAMODE Mask */ + +#define SCnSCB_ACTLR_FPEXCODIS_Pos 10U /*!< ACTLR: FPEXCODIS Position */ +#define SCnSCB_ACTLR_FPEXCODIS_Msk (1UL << SCnSCB_ACTLR_FPEXCODIS_Pos) /*!< ACTLR: FPEXCODIS Mask */ + +#define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ +#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ + +#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ +#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[29U]; + __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ + __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ + __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[6U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ +#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Integration Write Register Definitions */ +#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ +#define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ + +/* ITM Integration Read Register Definitions */ +#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ +#define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ + +/* ITM Integration Mode Control Register Definitions */ +#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ +#define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED0[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED3[981U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( W) Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Mask Register Definitions */ +#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ +#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ +#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ + +#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ +#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ +#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ + +#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ +#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ + +#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ +#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ + +#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ +#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ + +#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ +#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ + __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ + __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ + __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration ETM Data Register Definitions (FIFO0) */ +#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ +#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ + +#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ +#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ + +#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ +#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ + +#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ +#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ + +#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ +#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ + +#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ +#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ + +#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ +#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ + +/* TPI ITATBCTR2 Register Definitions */ +#define TPI_ITATBCTR2_ATREADY2_Pos 0U /*!< TPI ITATBCTR2: ATREADY2 Position */ +#define TPI_ITATBCTR2_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2_Pos*/) /*!< TPI ITATBCTR2: ATREADY2 Mask */ + +#define TPI_ITATBCTR2_ATREADY1_Pos 0U /*!< TPI ITATBCTR2: ATREADY1 Position */ +#define TPI_ITATBCTR2_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1_Pos*/) /*!< TPI ITATBCTR2: ATREADY1 Mask */ + +/* TPI Integration ITM Data Register Definitions (FIFO1) */ +#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ +#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ + +#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ +#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ + +#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ +#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ + +#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ +#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ + +#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ +#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ + +#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ +#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ + +#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ +#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ + +/* TPI ITATBCTR0 Register Definitions */ +#define TPI_ITATBCTR0_ATREADY2_Pos 0U /*!< TPI ITATBCTR0: ATREADY2 Position */ +#define TPI_ITATBCTR0_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2_Pos*/) /*!< TPI ITATBCTR0: ATREADY2 Mask */ + +#define TPI_ITATBCTR0_ATREADY1_Pos 0U /*!< TPI ITATBCTR0: ATREADY1 Position */ +#define TPI_ITATBCTR0_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1_Pos*/) /*!< TPI ITATBCTR0: ATREADY1 Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ +#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ + +#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ +#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ + __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ + __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ + __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ +} MPU_Type; + +#define MPU_TYPE_RALIASES 4U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register Definitions */ +#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ + +#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ + +#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ + +#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ + +#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ + +#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ + +#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif /* defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_FPU Floating Point Unit (FPU) + \brief Type definitions for the Floating Point Unit (FPU) + @{ + */ + +/** + \brief Structure type to access the Floating Point Unit (FPU). + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ + __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ + __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ + __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and FP Feature Register 2 */ +} FPU_Type; + +/* Floating-Point Context Control Register Definitions */ +#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ +#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ + +#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ +#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ + +#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ +#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ + +#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ +#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ + +#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ +#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ + +#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ +#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ + +#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ +#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ + +#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ +#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ + +#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ +#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ + +/* Floating-Point Context Address Register Definitions */ +#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ +#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ + +/* Floating-Point Default Status Control Register Definitions */ +#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ +#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ + +#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ +#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ + +#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ +#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ + +#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ +#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ + +/* Media and FP Feature Register 0 Definitions */ +#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ +#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ + +#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ +#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ + +#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ +#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ + +#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ +#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ + +#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ +#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ + +#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ +#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ + +#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ +#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ + +#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ +#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ + +/* Media and FP Feature Register 1 Definitions */ +#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ +#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ + +#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ +#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ + +#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ +#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ + +#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ +#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ + +/* Media and FP Feature Register 2 Definitions */ + +/*@} end of group CMSIS_FPU */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ +#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ +#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ +#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ +#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ +#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ +#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ +#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +#define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ +#define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* The following EXC_RETURN values are saved the LR on exception entry */ +#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ +#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ +#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ +#define EXC_RETURN_HANDLER_FPU (0xFFFFFFE1UL) /* return to Handler mode, uses MSP after return, restore floating-point state */ +#define EXC_RETURN_THREAD_MSP_FPU (0xFFFFFFE9UL) /* return to Thread mode, uses MSP after return, restore floating-point state */ +#define EXC_RETURN_THREAD_PSP_FPU (0xFFFFFFEDUL) /* return to Thread mode, uses PSP after return, restore floating-point state */ + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IP[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv7.h" + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + uint32_t mvfr0; + + mvfr0 = SCB->MVFR0; + if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) + { + return 2U; /* Double + Single precision FPU */ + } + else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) + { + return 1U; /* Single precision FPU */ + } + else + { + return 0U; /* No FPU */ + } +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ########################## Cache functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_CacheFunctions Cache Functions + \brief Functions that configure Instruction and Data cache. + @{ + */ + +/* Cache Size ID Register Macros */ +#define CCSIDR_WAYS(x) (((x) & SCB_CCSIDR_ASSOCIATIVITY_Msk) >> SCB_CCSIDR_ASSOCIATIVITY_Pos) +#define CCSIDR_SETS(x) (((x) & SCB_CCSIDR_NUMSETS_Msk ) >> SCB_CCSIDR_NUMSETS_Pos ) + + +/** + \brief Enable I-Cache + \details Turns on I-Cache + */ +__STATIC_INLINE void SCB_EnableICache (void) +{ + #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) + __DSB(); + __ISB(); + SCB->ICIALLU = 0UL; /* invalidate I-Cache */ + __DSB(); + __ISB(); + SCB->CCR |= (uint32_t)SCB_CCR_IC_Msk; /* enable I-Cache */ + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Disable I-Cache + \details Turns off I-Cache + */ +__STATIC_INLINE void SCB_DisableICache (void) +{ + #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) + __DSB(); + __ISB(); + SCB->CCR &= ~(uint32_t)SCB_CCR_IC_Msk; /* disable I-Cache */ + SCB->ICIALLU = 0UL; /* invalidate I-Cache */ + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Invalidate I-Cache + \details Invalidates I-Cache + */ +__STATIC_INLINE void SCB_InvalidateICache (void) +{ + #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) + __DSB(); + __ISB(); + SCB->ICIALLU = 0UL; + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Enable D-Cache + \details Turns on D-Cache + */ +__STATIC_INLINE void SCB_EnableDCache (void) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/ /* Level 1 data cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* invalidate D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do { + SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) | + ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk) ); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); + __DSB(); + + SCB->CCR |= (uint32_t)SCB_CCR_DC_Msk; /* enable D-Cache */ + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Disable D-Cache + \details Turns off D-Cache + */ +__STATIC_INLINE void SCB_DisableDCache (void) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/ /* Level 1 data cache */ + __DSB(); + + SCB->CCR &= ~(uint32_t)SCB_CCR_DC_Msk; /* disable D-Cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* clean & invalidate D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do { + SCB->DCCISW = (((sets << SCB_DCCISW_SET_Pos) & SCB_DCCISW_SET_Msk) | + ((ways << SCB_DCCISW_WAY_Pos) & SCB_DCCISW_WAY_Msk) ); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Invalidate D-Cache + \details Invalidates D-Cache + */ +__STATIC_INLINE void SCB_InvalidateDCache (void) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/ /* Level 1 data cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* invalidate D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do { + SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) | + ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk) ); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Clean D-Cache + \details Cleans D-Cache + */ +__STATIC_INLINE void SCB_CleanDCache (void) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/ /* Level 1 data cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* clean D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do { + SCB->DCCSW = (((sets << SCB_DCCSW_SET_Pos) & SCB_DCCSW_SET_Msk) | + ((ways << SCB_DCCSW_WAY_Pos) & SCB_DCCSW_WAY_Msk) ); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Clean & Invalidate D-Cache + \details Cleans and Invalidates D-Cache + */ +__STATIC_INLINE void SCB_CleanInvalidateDCache (void) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/ /* Level 1 data cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* clean & invalidate D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do { + SCB->DCCISW = (((sets << SCB_DCCISW_SET_Pos) & SCB_DCCISW_SET_Msk) | + ((ways << SCB_DCCISW_WAY_Pos) & SCB_DCCISW_WAY_Msk) ); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief D-Cache Invalidate by address + \details Invalidates D-Cache for the given address + \param[in] addr address (aligned to 32-byte boundary) + \param[in] dsize size of memory block (in number of bytes) +*/ +__STATIC_INLINE void SCB_InvalidateDCache_by_Addr (uint32_t *addr, int32_t dsize) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + int32_t op_size = dsize; + uint32_t op_addr = (uint32_t)addr; + int32_t linesize = 32; /* in Cortex-M7 size of cache line is fixed to 8 words (32 bytes) */ + + __DSB(); + + while (op_size > 0) { + SCB->DCIMVAC = op_addr; + op_addr += (uint32_t)linesize; + op_size -= linesize; + } + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief D-Cache Clean by address + \details Cleans D-Cache for the given address + \param[in] addr address (aligned to 32-byte boundary) + \param[in] dsize size of memory block (in number of bytes) +*/ +__STATIC_INLINE void SCB_CleanDCache_by_Addr (uint32_t *addr, int32_t dsize) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + int32_t op_size = dsize; + uint32_t op_addr = (uint32_t) addr; + int32_t linesize = 32; /* in Cortex-M7 size of cache line is fixed to 8 words (32 bytes) */ + + __DSB(); + + while (op_size > 0) { + SCB->DCCMVAC = op_addr; + op_addr += (uint32_t)linesize; + op_size -= linesize; + } + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief D-Cache Clean and Invalidate by address + \details Cleans and invalidates D_Cache for the given address + \param[in] addr address (aligned to 32-byte boundary) + \param[in] dsize size of memory block (in number of bytes) +*/ +__STATIC_INLINE void SCB_CleanInvalidateDCache_by_Addr (uint32_t *addr, int32_t dsize) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + int32_t op_size = dsize; + uint32_t op_addr = (uint32_t) addr; + int32_t linesize = 32; /* in Cortex-M7 size of cache line is fixed to 8 words (32 bytes) */ + + __DSB(); + + while (op_size > 0) { + SCB->DCCIMVAC = op_addr; + op_addr += (uint32_t)linesize; + op_size -= linesize; + } + + __DSB(); + __ISB(); + #endif +} + + +/*@} end of CMSIS_Core_CacheFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM7_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Include/core_cmFunc.h b/STM32CubeMX/revF/Drivers/CMSIS/Include/core_cmFunc.h old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Include/core_cmFunc.h rename to STM32CubeMX/revF/Drivers/CMSIS/Include/core_cmFunc.h diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Include/core_cmInstr.h b/STM32CubeMX/revF/Drivers/CMSIS/Include/core_cmInstr.h old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Include/core_cmInstr.h rename to STM32CubeMX/revF/Drivers/CMSIS/Include/core_cmInstr.h diff --git a/STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Include/core_cmSimd.h b/STM32CubeMX/revF/Drivers/CMSIS/Include/core_cmSimd.h old mode 100755 new mode 100644 similarity index 100% rename from STM32CubeMX/SCSI2SD-V6/Drivers/CMSIS/Include/core_cmSimd.h rename to STM32CubeMX/revF/Drivers/CMSIS/Include/core_cmSimd.h diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Include/core_sc000.h b/STM32CubeMX/revF/Drivers/CMSIS/Include/core_sc000.h new file mode 100644 index 00000000..9b67c92f --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Include/core_sc000.h @@ -0,0 +1,1022 @@ +/**************************************************************************//** + * @file core_sc000.h + * @brief CMSIS SC000 Core Peripheral Access Layer Header File + * @version V5.0.5 + * @date 28. May 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_SC000_H_GENERIC +#define __CORE_SC000_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup SC000 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS SC000 definitions */ +#define __SC000_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __SC000_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __SC000_CMSIS_VERSION ((__SC000_CMSIS_VERSION_MAIN << 16U) | \ + __SC000_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_SC (000U) /*!< Cortex secure core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_SC000_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_SC000_H_DEPENDANT +#define __CORE_SC000_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __SC000_REV + #define __SC000_REV 0x0000U + #warning "__SC000_REV not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group SC000 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core MPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t _reserved0:1; /*!< bit: 0 Reserved */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[31U]; + __IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[31U]; + __IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[31U]; + __IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[31U]; + uint32_t RESERVED4[64U]; + __IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + uint32_t RESERVED0[1U]; + __IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + uint32_t RESERVED1[154U]; + __IOM uint32_t SFCR; /*!< Offset: 0x290 (R/W) Security Features Control Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ +} SCnSCB_Type; + +/* Auxiliary Control Register Definitions */ +#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ +#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ +} MPU_Type; + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 8U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0xFFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register Definitions */ +#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ + +#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ + +#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ + +#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ + +#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ + +#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ + +#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief SC000 Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. + Therefore they are not covered by the SC000 header file. + @{ + */ +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else +/*#define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping not available for SC000 */ +/*#define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping not available for SC000 */ + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ +/*#define NVIC_GetActive __NVIC_GetActive not available for SC000 */ + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* The following EXC_RETURN values are saved the LR on exception entry */ +#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ +#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ +#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ + + +/* Interrupt Priorities are WORD accessible only under Armv6-M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_SC000_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Include/core_sc300.h b/STM32CubeMX/revF/Drivers/CMSIS/Include/core_sc300.h new file mode 100644 index 00000000..3e8a4710 --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Include/core_sc300.h @@ -0,0 +1,1915 @@ +/**************************************************************************//** + * @file core_sc300.h + * @brief CMSIS SC300 Core Peripheral Access Layer Header File + * @version V5.0.6 + * @date 04. June 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_SC300_H_GENERIC +#define __CORE_SC300_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup SC3000 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS SC300 definitions */ +#define __SC300_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __SC300_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __SC300_CMSIS_VERSION ((__SC300_CMSIS_VERSION_MAIN << 16U) | \ + __SC300_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_SC (300U) /*!< Cortex secure core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_SC300_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_SC300_H_DEPENDANT +#define __CORE_SC300_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __SC300_REV + #define __SC300_REV 0x0000U + #warning "__SC300_REV not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group SC300 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:1; /*!< bit: 9 Reserved */ + uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ + uint32_t _reserved1:8; /*!< bit: 16..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit */ + uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ +#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ +#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[24U]; + __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[24U]; + __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[24U]; + __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[24U]; + __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[56U]; + __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED5[644U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHP[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + uint32_t RESERVED0[5U]; + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ + uint32_t RESERVED1[129U]; + __IOM uint32_t SFCR; /*!< Offset: 0x290 (R/W) Security Features Control Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLBASE_Pos 29U /*!< SCB VTOR: TBLBASE Position */ +#define SCB_VTOR_TBLBASE_Msk (1UL << SCB_VTOR_TBLBASE_Pos) /*!< SCB VTOR: TBLBASE Mask */ + +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x3FFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ +#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ +#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + uint32_t RESERVED1[1U]; +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[29U]; + __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ + __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ + __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[6U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ +#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Integration Write Register Definitions */ +#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ +#define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ + +/* ITM Integration Read Register Definitions */ +#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ +#define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ + +/* ITM Integration Mode Control Register Definitions */ +#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ +#define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED0[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Mask Register Definitions */ +#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ +#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ +#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ + +#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ +#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ +#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ + +#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ +#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ + +#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ +#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ + +#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ +#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ + +#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ +#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ + __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ + __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ + __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration ETM Data Register Definitions (FIFO0) */ +#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ +#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ + +#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ +#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ + +#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ +#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ + +#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ +#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ + +#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ +#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ + +#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ +#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ + +#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ +#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ + +/* TPI ITATBCTR2 Register Definitions */ +#define TPI_ITATBCTR2_ATREADY2_Pos 0U /*!< TPI ITATBCTR2: ATREADY2 Position */ +#define TPI_ITATBCTR2_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2_Pos*/) /*!< TPI ITATBCTR2: ATREADY2 Mask */ + +#define TPI_ITATBCTR2_ATREADY1_Pos 0U /*!< TPI ITATBCTR2: ATREADY1 Position */ +#define TPI_ITATBCTR2_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1_Pos*/) /*!< TPI ITATBCTR2: ATREADY1 Mask */ + +/* TPI Integration ITM Data Register Definitions (FIFO1) */ +#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ +#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ + +#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ +#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ + +#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ +#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ + +#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ +#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ + +#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ +#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ + +#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ +#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ + +#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ +#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ + +/* TPI ITATBCTR0 Register Definitions */ +#define TPI_ITATBCTR0_ATREADY2_Pos 0U /*!< TPI ITATBCTR0: ATREADY2 Position */ +#define TPI_ITATBCTR0_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2_Pos*/) /*!< TPI ITATBCTR0: ATREADY2 Mask */ + +#define TPI_ITATBCTR0_ATREADY1_Pos 0U /*!< TPI ITATBCTR0: ATREADY1 Position */ +#define TPI_ITATBCTR0_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1_Pos*/) /*!< TPI ITATBCTR0: ATREADY1 Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ +#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ + +#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ +#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ + __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ + __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ + __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ +} MPU_Type; + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register Definitions */ +#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ + +#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ + +#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ + +#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ + +#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ + +#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ + +#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ +#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ +#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ +#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ +#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ +#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ +#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ +#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* The following EXC_RETURN values are saved the LR on exception entry */ +#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ +#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ +#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ + + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << 8U) ); /* Insert write key and priorty group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IP[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_SC300_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Include/mpu_armv7.h b/STM32CubeMX/revF/Drivers/CMSIS/Include/mpu_armv7.h new file mode 100644 index 00000000..01422033 --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Include/mpu_armv7.h @@ -0,0 +1,270 @@ +/****************************************************************************** + * @file mpu_armv7.h + * @brief CMSIS MPU API for Armv7-M MPU + * @version V5.0.4 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2017-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef ARM_MPU_ARMV7_H +#define ARM_MPU_ARMV7_H + +#define ARM_MPU_REGION_SIZE_32B ((uint8_t)0x04U) ///!< MPU Region Size 32 Bytes +#define ARM_MPU_REGION_SIZE_64B ((uint8_t)0x05U) ///!< MPU Region Size 64 Bytes +#define ARM_MPU_REGION_SIZE_128B ((uint8_t)0x06U) ///!< MPU Region Size 128 Bytes +#define ARM_MPU_REGION_SIZE_256B ((uint8_t)0x07U) ///!< MPU Region Size 256 Bytes +#define ARM_MPU_REGION_SIZE_512B ((uint8_t)0x08U) ///!< MPU Region Size 512 Bytes +#define ARM_MPU_REGION_SIZE_1KB ((uint8_t)0x09U) ///!< MPU Region Size 1 KByte +#define ARM_MPU_REGION_SIZE_2KB ((uint8_t)0x0AU) ///!< MPU Region Size 2 KBytes +#define ARM_MPU_REGION_SIZE_4KB ((uint8_t)0x0BU) ///!< MPU Region Size 4 KBytes +#define ARM_MPU_REGION_SIZE_8KB ((uint8_t)0x0CU) ///!< MPU Region Size 8 KBytes +#define ARM_MPU_REGION_SIZE_16KB ((uint8_t)0x0DU) ///!< MPU Region Size 16 KBytes +#define ARM_MPU_REGION_SIZE_32KB ((uint8_t)0x0EU) ///!< MPU Region Size 32 KBytes +#define ARM_MPU_REGION_SIZE_64KB ((uint8_t)0x0FU) ///!< MPU Region Size 64 KBytes +#define ARM_MPU_REGION_SIZE_128KB ((uint8_t)0x10U) ///!< MPU Region Size 128 KBytes +#define ARM_MPU_REGION_SIZE_256KB ((uint8_t)0x11U) ///!< MPU Region Size 256 KBytes +#define ARM_MPU_REGION_SIZE_512KB ((uint8_t)0x12U) ///!< MPU Region Size 512 KBytes +#define ARM_MPU_REGION_SIZE_1MB ((uint8_t)0x13U) ///!< MPU Region Size 1 MByte +#define ARM_MPU_REGION_SIZE_2MB ((uint8_t)0x14U) ///!< MPU Region Size 2 MBytes +#define ARM_MPU_REGION_SIZE_4MB ((uint8_t)0x15U) ///!< MPU Region Size 4 MBytes +#define ARM_MPU_REGION_SIZE_8MB ((uint8_t)0x16U) ///!< MPU Region Size 8 MBytes +#define ARM_MPU_REGION_SIZE_16MB ((uint8_t)0x17U) ///!< MPU Region Size 16 MBytes +#define ARM_MPU_REGION_SIZE_32MB ((uint8_t)0x18U) ///!< MPU Region Size 32 MBytes +#define ARM_MPU_REGION_SIZE_64MB ((uint8_t)0x19U) ///!< MPU Region Size 64 MBytes +#define ARM_MPU_REGION_SIZE_128MB ((uint8_t)0x1AU) ///!< MPU Region Size 128 MBytes +#define ARM_MPU_REGION_SIZE_256MB ((uint8_t)0x1BU) ///!< MPU Region Size 256 MBytes +#define ARM_MPU_REGION_SIZE_512MB ((uint8_t)0x1CU) ///!< MPU Region Size 512 MBytes +#define ARM_MPU_REGION_SIZE_1GB ((uint8_t)0x1DU) ///!< MPU Region Size 1 GByte +#define ARM_MPU_REGION_SIZE_2GB ((uint8_t)0x1EU) ///!< MPU Region Size 2 GBytes +#define ARM_MPU_REGION_SIZE_4GB ((uint8_t)0x1FU) ///!< MPU Region Size 4 GBytes + +#define ARM_MPU_AP_NONE 0U ///!< MPU Access Permission no access +#define ARM_MPU_AP_PRIV 1U ///!< MPU Access Permission privileged access only +#define ARM_MPU_AP_URO 2U ///!< MPU Access Permission unprivileged access read-only +#define ARM_MPU_AP_FULL 3U ///!< MPU Access Permission full access +#define ARM_MPU_AP_PRO 5U ///!< MPU Access Permission privileged access read-only +#define ARM_MPU_AP_RO 6U ///!< MPU Access Permission read-only access + +/** MPU Region Base Address Register Value +* +* \param Region The region to be configured, number 0 to 15. +* \param BaseAddress The base address for the region. +*/ +#define ARM_MPU_RBAR(Region, BaseAddress) \ + (((BaseAddress) & MPU_RBAR_ADDR_Msk) | \ + ((Region) & MPU_RBAR_REGION_Msk) | \ + (MPU_RBAR_VALID_Msk)) + +/** +* MPU Memory Access Attributes +* +* \param TypeExtField Type extension field, allows you to configure memory access type, for example strongly ordered, peripheral. +* \param IsShareable Region is shareable between multiple bus masters. +* \param IsCacheable Region is cacheable, i.e. its value may be kept in cache. +* \param IsBufferable Region is bufferable, i.e. using write-back caching. Cacheable but non-bufferable regions use write-through policy. +*/ +#define ARM_MPU_ACCESS_(TypeExtField, IsShareable, IsCacheable, IsBufferable) \ + ((((TypeExtField ) << MPU_RASR_TEX_Pos) & MPU_RASR_TEX_Msk) | \ + (((IsShareable ) << MPU_RASR_S_Pos) & MPU_RASR_S_Msk) | \ + (((IsCacheable ) << MPU_RASR_C_Pos) & MPU_RASR_C_Msk) | \ + (((IsBufferable ) << MPU_RASR_B_Pos) & MPU_RASR_B_Msk)) + +/** +* MPU Region Attribute and Size Register Value +* +* \param DisableExec Instruction access disable bit, 1= disable instruction fetches. +* \param AccessPermission Data access permissions, allows you to configure read/write access for User and Privileged mode. +* \param AccessAttributes Memory access attribution, see \ref ARM_MPU_ACCESS_. +* \param SubRegionDisable Sub-region disable field. +* \param Size Region size of the region to be configured, for example 4K, 8K. +*/ +#define ARM_MPU_RASR_EX(DisableExec, AccessPermission, AccessAttributes, SubRegionDisable, Size) \ + ((((DisableExec ) << MPU_RASR_XN_Pos) & MPU_RASR_XN_Msk) | \ + (((AccessPermission) << MPU_RASR_AP_Pos) & MPU_RASR_AP_Msk) | \ + (((AccessAttributes) ) & (MPU_RASR_TEX_Msk | MPU_RASR_S_Msk | MPU_RASR_C_Msk | MPU_RASR_B_Msk))) + +/** +* MPU Region Attribute and Size Register Value +* +* \param DisableExec Instruction access disable bit, 1= disable instruction fetches. +* \param AccessPermission Data access permissions, allows you to configure read/write access for User and Privileged mode. +* \param TypeExtField Type extension field, allows you to configure memory access type, for example strongly ordered, peripheral. +* \param IsShareable Region is shareable between multiple bus masters. +* \param IsCacheable Region is cacheable, i.e. its value may be kept in cache. +* \param IsBufferable Region is bufferable, i.e. using write-back caching. Cacheable but non-bufferable regions use write-through policy. +* \param SubRegionDisable Sub-region disable field. +* \param Size Region size of the region to be configured, for example 4K, 8K. +*/ +#define ARM_MPU_RASR(DisableExec, AccessPermission, TypeExtField, IsShareable, IsCacheable, IsBufferable, SubRegionDisable, Size) \ + ARM_MPU_RASR_EX(DisableExec, AccessPermission, ARM_MPU_ACCESS_(TypeExtField, IsShareable, IsCacheable, IsBufferable), SubRegionDisable, Size) + +/** +* MPU Memory Access Attribute for strongly ordered memory. +* - TEX: 000b +* - Shareable +* - Non-cacheable +* - Non-bufferable +*/ +#define ARM_MPU_ACCESS_ORDERED ARM_MPU_ACCESS_(0U, 1U, 0U, 0U) + +/** +* MPU Memory Access Attribute for device memory. +* - TEX: 000b (if non-shareable) or 010b (if shareable) +* - Shareable or non-shareable +* - Non-cacheable +* - Bufferable (if shareable) or non-bufferable (if non-shareable) +* +* \param IsShareable Configures the device memory as shareable or non-shareable. +*/ +#define ARM_MPU_ACCESS_DEVICE(IsShareable) ((IsShareable) ? ARM_MPU_ACCESS_(0U, 1U, 0U, 1U) : ARM_MPU_ACCESS_(2U, 0U, 0U, 0U)) + +/** +* MPU Memory Access Attribute for normal memory. +* - TEX: 1BBb (reflecting outer cacheability rules) +* - Shareable or non-shareable +* - Cacheable or non-cacheable (reflecting inner cacheability rules) +* - Bufferable or non-bufferable (reflecting inner cacheability rules) +* +* \param OuterCp Configures the outer cache policy. +* \param InnerCp Configures the inner cache policy. +* \param IsShareable Configures the memory as shareable or non-shareable. +*/ +#define ARM_MPU_ACCESS_NORMAL(OuterCp, InnerCp, IsShareable) ARM_MPU_ACCESS_((4U | (OuterCp)), IsShareable, ((InnerCp) & 2U), ((InnerCp) & 1U)) + +/** +* MPU Memory Access Attribute non-cacheable policy. +*/ +#define ARM_MPU_CACHEP_NOCACHE 0U + +/** +* MPU Memory Access Attribute write-back, write and read allocate policy. +*/ +#define ARM_MPU_CACHEP_WB_WRA 1U + +/** +* MPU Memory Access Attribute write-through, no write allocate policy. +*/ +#define ARM_MPU_CACHEP_WT_NWA 2U + +/** +* MPU Memory Access Attribute write-back, no write allocate policy. +*/ +#define ARM_MPU_CACHEP_WB_NWA 3U + + +/** +* Struct for a single MPU Region +*/ +typedef struct { + uint32_t RBAR; //!< The region base address register value (RBAR) + uint32_t RASR; //!< The region attribute and size register value (RASR) \ref MPU_RASR +} ARM_MPU_Region_t; + +/** Enable the MPU. +* \param MPU_Control Default access permissions for unconfigured regions. +*/ +__STATIC_INLINE void ARM_MPU_Enable(uint32_t MPU_Control) +{ + __DSB(); + __ISB(); + MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; +#endif +} + +/** Disable the MPU. +*/ +__STATIC_INLINE void ARM_MPU_Disable(void) +{ + __DSB(); + __ISB(); +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; +#endif + MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk; +} + +/** Clear and disable the given MPU region. +* \param rnr Region number to be cleared. +*/ +__STATIC_INLINE void ARM_MPU_ClrRegion(uint32_t rnr) +{ + MPU->RNR = rnr; + MPU->RASR = 0U; +} + +/** Configure an MPU region. +* \param rbar Value for RBAR register. +* \param rsar Value for RSAR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegion(uint32_t rbar, uint32_t rasr) +{ + MPU->RBAR = rbar; + MPU->RASR = rasr; +} + +/** Configure the given MPU region. +* \param rnr Region number to be configured. +* \param rbar Value for RBAR register. +* \param rsar Value for RSAR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegionEx(uint32_t rnr, uint32_t rbar, uint32_t rasr) +{ + MPU->RNR = rnr; + MPU->RBAR = rbar; + MPU->RASR = rasr; +} + +/** Memcopy with strictly ordered memory access, e.g. for register targets. +* \param dst Destination data is copied to. +* \param src Source data is copied from. +* \param len Amount of data words to be copied. +*/ +__STATIC_INLINE void orderedCpy(volatile uint32_t* dst, const uint32_t* __RESTRICT src, uint32_t len) +{ + uint32_t i; + for (i = 0U; i < len; ++i) + { + dst[i] = src[i]; + } +} + +/** Load the given number of MPU regions from a table. +* \param table Pointer to the MPU configuration table. +* \param cnt Amount of regions to be configured. +*/ +__STATIC_INLINE void ARM_MPU_Load(ARM_MPU_Region_t const* table, uint32_t cnt) +{ + const uint32_t rowWordSize = sizeof(ARM_MPU_Region_t)/4U; + while (cnt > MPU_TYPE_RALIASES) { + orderedCpy(&(MPU->RBAR), &(table->RBAR), MPU_TYPE_RALIASES*rowWordSize); + table += MPU_TYPE_RALIASES; + cnt -= MPU_TYPE_RALIASES; + } + orderedCpy(&(MPU->RBAR), &(table->RBAR), cnt*rowWordSize); +} + +#endif diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Include/mpu_armv8.h b/STM32CubeMX/revF/Drivers/CMSIS/Include/mpu_armv8.h new file mode 100644 index 00000000..62571da5 --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Include/mpu_armv8.h @@ -0,0 +1,333 @@ +/****************************************************************************** + * @file mpu_armv8.h + * @brief CMSIS MPU API for Armv8-M MPU + * @version V5.0.4 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2017-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef ARM_MPU_ARMV8_H +#define ARM_MPU_ARMV8_H + +/** \brief Attribute for device memory (outer only) */ +#define ARM_MPU_ATTR_DEVICE ( 0U ) + +/** \brief Attribute for non-cacheable, normal memory */ +#define ARM_MPU_ATTR_NON_CACHEABLE ( 4U ) + +/** \brief Attribute for normal memory (outer and inner) +* \param NT Non-Transient: Set to 1 for non-transient data. +* \param WB Write-Back: Set to 1 to use write-back update policy. +* \param RA Read Allocation: Set to 1 to use cache allocation on read miss. +* \param WA Write Allocation: Set to 1 to use cache allocation on write miss. +*/ +#define ARM_MPU_ATTR_MEMORY_(NT, WB, RA, WA) \ + (((NT & 1U) << 3U) | ((WB & 1U) << 2U) | ((RA & 1U) << 1U) | (WA & 1U)) + +/** \brief Device memory type non Gathering, non Re-ordering, non Early Write Acknowledgement */ +#define ARM_MPU_ATTR_DEVICE_nGnRnE (0U) + +/** \brief Device memory type non Gathering, non Re-ordering, Early Write Acknowledgement */ +#define ARM_MPU_ATTR_DEVICE_nGnRE (1U) + +/** \brief Device memory type non Gathering, Re-ordering, Early Write Acknowledgement */ +#define ARM_MPU_ATTR_DEVICE_nGRE (2U) + +/** \brief Device memory type Gathering, Re-ordering, Early Write Acknowledgement */ +#define ARM_MPU_ATTR_DEVICE_GRE (3U) + +/** \brief Memory Attribute +* \param O Outer memory attributes +* \param I O == ARM_MPU_ATTR_DEVICE: Device memory attributes, else: Inner memory attributes +*/ +#define ARM_MPU_ATTR(O, I) (((O & 0xFU) << 4U) | (((O & 0xFU) != 0U) ? (I & 0xFU) : ((I & 0x3U) << 2U))) + +/** \brief Normal memory non-shareable */ +#define ARM_MPU_SH_NON (0U) + +/** \brief Normal memory outer shareable */ +#define ARM_MPU_SH_OUTER (2U) + +/** \brief Normal memory inner shareable */ +#define ARM_MPU_SH_INNER (3U) + +/** \brief Memory access permissions +* \param RO Read-Only: Set to 1 for read-only memory. +* \param NP Non-Privileged: Set to 1 for non-privileged memory. +*/ +#define ARM_MPU_AP_(RO, NP) (((RO & 1U) << 1U) | (NP & 1U)) + +/** \brief Region Base Address Register value +* \param BASE The base address bits [31:5] of a memory region. The value is zero extended. Effective address gets 32 byte aligned. +* \param SH Defines the Shareability domain for this memory region. +* \param RO Read-Only: Set to 1 for a read-only memory region. +* \param NP Non-Privileged: Set to 1 for a non-privileged memory region. +* \oaram XN eXecute Never: Set to 1 for a non-executable memory region. +*/ +#define ARM_MPU_RBAR(BASE, SH, RO, NP, XN) \ + ((BASE & MPU_RBAR_BASE_Msk) | \ + ((SH << MPU_RBAR_SH_Pos) & MPU_RBAR_SH_Msk) | \ + ((ARM_MPU_AP_(RO, NP) << MPU_RBAR_AP_Pos) & MPU_RBAR_AP_Msk) | \ + ((XN << MPU_RBAR_XN_Pos) & MPU_RBAR_XN_Msk)) + +/** \brief Region Limit Address Register value +* \param LIMIT The limit address bits [31:5] for this memory region. The value is one extended. +* \param IDX The attribute index to be associated with this memory region. +*/ +#define ARM_MPU_RLAR(LIMIT, IDX) \ + ((LIMIT & MPU_RLAR_LIMIT_Msk) | \ + ((IDX << MPU_RLAR_AttrIndx_Pos) & MPU_RLAR_AttrIndx_Msk) | \ + (MPU_RLAR_EN_Msk)) + +/** +* Struct for a single MPU Region +*/ +typedef struct { + uint32_t RBAR; /*!< Region Base Address Register value */ + uint32_t RLAR; /*!< Region Limit Address Register value */ +} ARM_MPU_Region_t; + +/** Enable the MPU. +* \param MPU_Control Default access permissions for unconfigured regions. +*/ +__STATIC_INLINE void ARM_MPU_Enable(uint32_t MPU_Control) +{ + __DSB(); + __ISB(); + MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; +#endif +} + +/** Disable the MPU. +*/ +__STATIC_INLINE void ARM_MPU_Disable(void) +{ + __DSB(); + __ISB(); +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; +#endif + MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk; +} + +#ifdef MPU_NS +/** Enable the Non-secure MPU. +* \param MPU_Control Default access permissions for unconfigured regions. +*/ +__STATIC_INLINE void ARM_MPU_Enable_NS(uint32_t MPU_Control) +{ + __DSB(); + __ISB(); + MPU_NS->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB_NS->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; +#endif +} + +/** Disable the Non-secure MPU. +*/ +__STATIC_INLINE void ARM_MPU_Disable_NS(void) +{ + __DSB(); + __ISB(); +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB_NS->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; +#endif + MPU_NS->CTRL &= ~MPU_CTRL_ENABLE_Msk; +} +#endif + +/** Set the memory attribute encoding to the given MPU. +* \param mpu Pointer to the MPU to be configured. +* \param idx The attribute index to be set [0-7] +* \param attr The attribute value to be set. +*/ +__STATIC_INLINE void ARM_MPU_SetMemAttrEx(MPU_Type* mpu, uint8_t idx, uint8_t attr) +{ + const uint8_t reg = idx / 4U; + const uint32_t pos = ((idx % 4U) * 8U); + const uint32_t mask = 0xFFU << pos; + + if (reg >= (sizeof(mpu->MAIR) / sizeof(mpu->MAIR[0]))) { + return; // invalid index + } + + mpu->MAIR[reg] = ((mpu->MAIR[reg] & ~mask) | ((attr << pos) & mask)); +} + +/** Set the memory attribute encoding. +* \param idx The attribute index to be set [0-7] +* \param attr The attribute value to be set. +*/ +__STATIC_INLINE void ARM_MPU_SetMemAttr(uint8_t idx, uint8_t attr) +{ + ARM_MPU_SetMemAttrEx(MPU, idx, attr); +} + +#ifdef MPU_NS +/** Set the memory attribute encoding to the Non-secure MPU. +* \param idx The attribute index to be set [0-7] +* \param attr The attribute value to be set. +*/ +__STATIC_INLINE void ARM_MPU_SetMemAttr_NS(uint8_t idx, uint8_t attr) +{ + ARM_MPU_SetMemAttrEx(MPU_NS, idx, attr); +} +#endif + +/** Clear and disable the given MPU region of the given MPU. +* \param mpu Pointer to MPU to be used. +* \param rnr Region number to be cleared. +*/ +__STATIC_INLINE void ARM_MPU_ClrRegionEx(MPU_Type* mpu, uint32_t rnr) +{ + mpu->RNR = rnr; + mpu->RLAR = 0U; +} + +/** Clear and disable the given MPU region. +* \param rnr Region number to be cleared. +*/ +__STATIC_INLINE void ARM_MPU_ClrRegion(uint32_t rnr) +{ + ARM_MPU_ClrRegionEx(MPU, rnr); +} + +#ifdef MPU_NS +/** Clear and disable the given Non-secure MPU region. +* \param rnr Region number to be cleared. +*/ +__STATIC_INLINE void ARM_MPU_ClrRegion_NS(uint32_t rnr) +{ + ARM_MPU_ClrRegionEx(MPU_NS, rnr); +} +#endif + +/** Configure the given MPU region of the given MPU. +* \param mpu Pointer to MPU to be used. +* \param rnr Region number to be configured. +* \param rbar Value for RBAR register. +* \param rlar Value for RLAR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegionEx(MPU_Type* mpu, uint32_t rnr, uint32_t rbar, uint32_t rlar) +{ + mpu->RNR = rnr; + mpu->RBAR = rbar; + mpu->RLAR = rlar; +} + +/** Configure the given MPU region. +* \param rnr Region number to be configured. +* \param rbar Value for RBAR register. +* \param rlar Value for RLAR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegion(uint32_t rnr, uint32_t rbar, uint32_t rlar) +{ + ARM_MPU_SetRegionEx(MPU, rnr, rbar, rlar); +} + +#ifdef MPU_NS +/** Configure the given Non-secure MPU region. +* \param rnr Region number to be configured. +* \param rbar Value for RBAR register. +* \param rlar Value for RLAR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegion_NS(uint32_t rnr, uint32_t rbar, uint32_t rlar) +{ + ARM_MPU_SetRegionEx(MPU_NS, rnr, rbar, rlar); +} +#endif + +/** Memcopy with strictly ordered memory access, e.g. for register targets. +* \param dst Destination data is copied to. +* \param src Source data is copied from. +* \param len Amount of data words to be copied. +*/ +__STATIC_INLINE void orderedCpy(volatile uint32_t* dst, const uint32_t* __RESTRICT src, uint32_t len) +{ + uint32_t i; + for (i = 0U; i < len; ++i) + { + dst[i] = src[i]; + } +} + +/** Load the given number of MPU regions from a table to the given MPU. +* \param mpu Pointer to the MPU registers to be used. +* \param rnr First region number to be configured. +* \param table Pointer to the MPU configuration table. +* \param cnt Amount of regions to be configured. +*/ +__STATIC_INLINE void ARM_MPU_LoadEx(MPU_Type* mpu, uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt) +{ + const uint32_t rowWordSize = sizeof(ARM_MPU_Region_t)/4U; + if (cnt == 1U) { + mpu->RNR = rnr; + orderedCpy(&(mpu->RBAR), &(table->RBAR), rowWordSize); + } else { + uint32_t rnrBase = rnr & ~(MPU_TYPE_RALIASES-1U); + uint32_t rnrOffset = rnr % MPU_TYPE_RALIASES; + + mpu->RNR = rnrBase; + while ((rnrOffset + cnt) > MPU_TYPE_RALIASES) { + uint32_t c = MPU_TYPE_RALIASES - rnrOffset; + orderedCpy(&(mpu->RBAR)+(rnrOffset*2U), &(table->RBAR), c*rowWordSize); + table += c; + cnt -= c; + rnrOffset = 0U; + rnrBase += MPU_TYPE_RALIASES; + mpu->RNR = rnrBase; + } + + orderedCpy(&(mpu->RBAR)+(rnrOffset*2U), &(table->RBAR), cnt*rowWordSize); + } +} + +/** Load the given number of MPU regions from a table. +* \param rnr First region number to be configured. +* \param table Pointer to the MPU configuration table. +* \param cnt Amount of regions to be configured. +*/ +__STATIC_INLINE void ARM_MPU_Load(uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt) +{ + ARM_MPU_LoadEx(MPU, rnr, table, cnt); +} + +#ifdef MPU_NS +/** Load the given number of MPU regions from a table to the Non-secure MPU. +* \param rnr First region number to be configured. +* \param table Pointer to the MPU configuration table. +* \param cnt Amount of regions to be configured. +*/ +__STATIC_INLINE void ARM_MPU_Load_NS(uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt) +{ + ARM_MPU_LoadEx(MPU_NS, rnr, table, cnt); +} +#endif + +#endif + diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Include/tz_context.h b/STM32CubeMX/revF/Drivers/CMSIS/Include/tz_context.h new file mode 100644 index 00000000..0d09749f --- /dev/null +++ b/STM32CubeMX/revF/Drivers/CMSIS/Include/tz_context.h @@ -0,0 +1,70 @@ +/****************************************************************************** + * @file tz_context.h + * @brief Context Management for Armv8-M TrustZone + * @version V1.0.1 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2017-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef TZ_CONTEXT_H +#define TZ_CONTEXT_H + +#include + +#ifndef TZ_MODULEID_T +#define TZ_MODULEID_T +/// \details Data type that identifies secure software modules called by a process. +typedef uint32_t TZ_ModuleId_t; +#endif + +/// \details TZ Memory ID identifies an allocated memory slot. +typedef uint32_t TZ_MemoryId_t; + +/// Initialize secure context memory system +/// \return execution status (1: success, 0: error) +uint32_t TZ_InitContextSystem_S (void); + +/// Allocate context memory for calling secure software modules in TrustZone +/// \param[in] module identifies software modules called from non-secure mode +/// \return value != 0 id TrustZone memory slot identifier +/// \return value 0 no memory available or internal error +TZ_MemoryId_t TZ_AllocModuleContext_S (TZ_ModuleId_t module); + +/// Free context memory that was previously allocated with \ref TZ_AllocModuleContext_S +/// \param[in] id TrustZone memory slot identifier +/// \return execution status (1: success, 0: error) +uint32_t TZ_FreeModuleContext_S (TZ_MemoryId_t id); + +/// Load secure context (called on RTOS thread context switch) +/// \param[in] id TrustZone memory slot identifier +/// \return execution status (1: success, 0: error) +uint32_t TZ_LoadContext_S (TZ_MemoryId_t id); + +/// Store secure context (called on RTOS thread context switch) +/// \param[in] id TrustZone memory slot identifier +/// \return execution status (1: success, 0: error) +uint32_t TZ_StoreContext_S (TZ_MemoryId_t id); + +#endif // TZ_CONTEXT_H diff --git a/STM32CubeMX/revF/Drivers/CMSIS/Lib/ARM/arm_cortexM3b_math.lib b/STM32CubeMX/revF/Drivers/CMSIS/Lib/ARM/arm_cortexM3b_math.lib new file mode 100644 index 0000000000000000000000000000000000000000..1a8f571b71f0356199a032fa1e9f0453a07b13e1 GIT binary patch literal 13694834 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
=G`ur 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

32L1~hjy`JMH*GljqHS>`g((0i(FcqL{d&)V=> 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%0Dn!FH(>mFEZ3<<-LMgQL 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�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 z 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

=5Esda@G--jJH~J25Mt!yGfk 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

cQ?(QNkO+%a{G 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 z zoh~k&^_-(_^X zbLzgP(j5I(;_KoH@P2XrysX~d(Wc;_Zgq^TK6o_rckPfqXe}LCSY&St?gNQm(Un2=S=mQ8NE$Kxn3Zo#Q&a`=`r>_@ZC}=sU%(bB_FpAy#wDS&) z;2a}cx@4mifFl0kuAaW}BCEj2+LyFmJO}M>NdH&UK0@!32)&ct;!WuN)Pm!qH}`hO z!Riru+wD!oJo%eq|2$OCh5zDu+wDzy&l(eVLhol5EjTWvT(&t`p<}mq7CuSr-p3VB zwxQh7L@n~NjZDcG4HLI!L7Jq>Ft52F#{B_i?g=h5?;*Ub; z)zO4fNt|6HE}rksy)<(&p>t+USE$IyPMebuMW{6N><7g)5c=(tGr0J-;p{7EGC640 z4ZYefkCxsQ(bAg%ZnGJ03v0*02Aw_k0@aec>d$(K!(ls zLiuk?<%g-M56`AKdE&EB{-P!Cr}EUIPEejaP37l)jFrDJJ8kYo(Uhm`p7WY`1j;|< ziLSh=`8E5Bboq6ey{>8Vgjku8IE~Dp7HeX9;Ay63UMr<1J1zCrC~1+UXztzOMWp54 zr5Rc67``EKb7=IZ($Ln>(4i9no?H~9ubj6mP-799zw|M!mC2I#ykYSscz-=RBWsgp zV`OdWwk+ewQt#!kLsO47wG=foLIJED8sTAtl!*kl$$~b&GDd1v$uaXl4a&k5qG6h8owThsh0@Me3eEX`c3Scc(G;SlbN+9|FQL#kmZxSl%j`m< zVMMN_VBTu3o~U6VCeU(e1z3_Q544VgEz3A}Z!~BX2|2b)yFk2qB1XL{;*`OIAeJFB zVNw}XJ=1<6E?w--{pcz2%0P{QWwi`olcqx!?euzaHDtUF8BLb0Lf9i34DY+*wU?SY z4fRhnS^7QV)|1@1KgpSfs7cKhT@+bv!2)p)L_NB4I-(}CUQ|)ifD0}ZUxBFmb0b%L zWTDfUaYB*I8eQVJ655xS)QS(5I#fNgmYC!U6IS`LIEb#tFRR>wBjWB%ckZ>TB3FLG zgz`Yp6lxU+i+cb!{z5`ghgH61vQF@eA40-kj+2BD%%_7xQ3X9Jo`<0S$(uAOav{j7 zv4nEjo;)eEK(sJd`~ngl&5x82zM`rc0c|X5gKV`2#Tn-dL^c8oFBgxT?9RQpU{cOp zhBfDix<8RK72t)x7EglnTT^gWMb_kOWiYi|6FAF^U39v57Mx#R9a&zZS!0)GEzOY? z+GEFg$)qouDA`6Xx=DN`%bolE!bwH3c}!7UH%w84Pb!M+mEjf-L(~Jl$weu9S)#~b zwp7V+h-#Ljrb-$xBP5=Ls2hr;sOZb{(Q01Sz?d2u=%uCsdby1?K3b$#oPR1FSmMsT zqtxir+xkA14#WS)(&uJgDIFm)rdWJuk}m8nY7MBQW)zW7pc@ltp0E#;G# zgx9OI{Z%ED_K%X;&}~kbZbUxM(hX4-DBa*%7*jVIK%JB=z6RYsR}rNkqQH&@8wY!E z1OTswVPs$%a@cJts~1j&sSEaZ?bGBaH>fnqD=jmJil|&o%ap@8YPd#1U0B46$jg(y zB`#g&&OJ~$U7e!l@6whh*7PaYKaEpu1hyH>p6ToLH+3;E^S&mlQ-p{B!&F;4hCzoXb!_tUlbj3t~N zNu&206X_3we*Zf05!Z6XpEgy1KkmZ88&GWAI~vaZ5Xc`|CqC(7_DpWFkEAE|N7jk! zT`Oouha7r=vq(~k5dW}kfg%a?zdKbNaIK^_#j<%&iKPm%o#^`p4R4xbVb92@grPR8 z39+_)N@~$LG=|BmakO(ZI1s|S3|VcqV_TZ@%u0xD1};w z!%_!vQ0X8J#-YRE8R+oH>DVKVZ^F*3uB)ri(xndLhWcpSZaYr$uuL%CV^gx_U)jeP zRaaDtS0p!lT6OH)o~{;u*1FNvAj&k;P|m2ju0~vvfaJArK>B9L-cA1R9feqqY%pkU5 zCu8vU4dMq{gCbZ^L_2s$LU(v1s zntsrL+MBlgxps6>A_KjJB@{UKOCke{unBEdw={`QtyrO>(~yXoZExC&Oo}c$JX>^Z zE$HkD1gH;9uJEwQ$vZ6kpX1ng|^6W%gCLf z;h`QJyN4MLdM-w2AIDK+?SW0=@*JsC-{77oda)v;8|lI7Y1N?Dzqg3bPGDfujTw-B z%z#uR2Be;$)rqFt;TG|ZVvUjZE|vSzOxir*TJ^A2y8%T8zD1>B2{{8pBjhyJzR@af zTqzSP8BV38WC$&Zp>fn?XdGpRv31uW#deEhjfX6L@J#W#Qi3cVkunmARFTA}TAA&KMqEW_DWJW2nyGSM_*@xMP*9^Whp;wI3xuFI2|ACY1`(-1>(%Eb|^wgewiat}q7yB(8>E#mh4Rn(r*XHVQZ8;?^N zRWpfmLoJvk*e&|FFxI}eRlJlh)eZCw2gcA8ZXL#%0J?r>=8$*ISZ^=(x2V3M2?aRm z#l1w;f{mm>OiySOmf0k``lUL(Qwt3RcRFs<`D;@>OPfKXD^(oRo7nCDc%TINZN98 zeWtLbH7}&p|I=)F+Xuv5tHX)`+Y%KDrW~4)DGTnLsVT7=<4|^5!EI|_`Ji|@TrXwP z$<&(4qC>ExOw>QqqE(+iM_g4ZyM@SIdRE6!Sfo0JZKO`dc6+;F8`yQ?vXouM!F6p22tcw$@th=|OGh%Cu9xY->A44mdjzcOPX2&Pf zacB}Fi=haOla{3aJ}6G04^8DapY5A#YwO!_Gn(avkKZ;oNev%%devzA9*%ZH#Xs* zDuZr3R}X!wisdB(W;81Bt*Y~6d}^wKjB)ur%-~et>m1`1d^B|6uW?A31a$`8|Is@r z6Ql#zv@c9Skh+s=QHr4)8RTaeCnAEeScm&CQaedekTa9~ z$#HUuK_F{3I5#e=NX7yF%4rxL?N^d&7)v#hk}^9b6|A%8N;Q|2OW<__koA|711C=s zaDdw>(t%{<%##5t(;*niLJsDVlN_s*pJC*sqY&q(LlvBJmk#w;Q%FgwqAyek#qeo= zd@G(VNWbEAgXr+hI5`ZXv;Z;J%&nSRIoFwVT597$Wt*~aZ{=BTd9G)=3d>7H_dsf8 zxF>n7vAotVB#$b~Lq)`-Iou0Zt6LuHVXIRu)Kc|ynC!Ih08*B`Pq)04y5w1HdD@uF zGK`w=0LcX2wU#$CfoI*xFq#kLF%9`puMop%uza`8-9C3KQn_AvX>DvJ6smZ5~{M)FwRscWp&#k$%)EE zJ2}bGq5KSE^CDTAwq&3*ZOxEneOrm->kI|2Bo{}1nP6+BD2Z;%i!!UZ?66_#A6@90hbv2AWb|Tif z%4rz8bTIMn*NBolpy?@WkQh>Z9Fh+32zkn|eSh+&MD${IXY zB`vyVosj{B_s$o~lhWOWF}{`^FtmJT`ne~%G)%&GdCo5BDK70P`hcN5^7FAOGuqeH z@5#>}9P;C{e7u6g)O3X2369~l84kI@T^urS2kj!DooNGIp%9&2IY3q$ksyZi75W6sdn=sLP1 z2)msIg5Wp`;W&+>6W`1t=0I_GC-uxY#IAqb-!nAorzJ!BaIjzq@%Quw2Znlr>w1TV z1HoBF;~==vRX_u{7ieS+vc^}8tF7{J0>&}e5Lc=w69#&v2?VvhC?Bo zL^EPDg0HNwD9?wh^*|GcCFq3Db*rTr_6`m2vRqQcp1z)-hq5oKA!eSs>hQ~u6l$g| z;K?7Fan|$%Ls$`*S=Lg~i?o?6FVae;kv#b=ux`s}-#{>GMtJfY!@lV@aroNr60rO8 z*Vg3KiED2={i+-`7k9%e;rQ!gM<;HcD)6CP>?!T63+}jjJpsS{8JvZ;ozTgAL9uK$AA3@4-hob=FXk-ns#GM<2NBq`~3;PRR8Fwid~ zZMNYRz`;{J2*<_ci9fO7OMw5I4POSl!-k&%+$^t%zZym2=eF>ZfZt)mR{;;$aL7-< zyF~RU`R;$%aL9Lm*M>vB`+6G=`R+a&4*71RQ9a-X`EIjJ0f&6o!?y5p;2*K!=q+8R z+i=`P<}~vY@w0({%ND)@_{VHG&ee8qu;H+c(=5Y?pNlEyH*Mi%z|Xhgu!RFQQ4i>G zADTd&HSwjuzi7j8KED{T;rYOkhw4Fmx>xxv8@>|m2W@yE+_&LJKjKMf zii2RcAuVwrO#&2i*F2+C4`27kuKFInZotdP!PVdE-wGn2QWV*{2|O? z2_oM~f8&=7k#3nD?m(X*A?lKZ z^$bxDB>pLew=n!VL)O=U{2)3f>XwACzl5hV^fUYrL)cS>f0p4l7{18xEd^Z}3{j_v z-i3UV5cwwIc??-E7xOXg4n1qgo@gJ|5Y+kcWsGqNe-P^ecK?epsU{qDJk{=h5vJgT zqg`6d{(1KBdolSZ{0mraB>1w@%Xm{k0WZ>5%wu>4!~bCT2L&D4?l&|3eFbUxgyK6< zza$)Eh0L~paDnnqc!lAg6ihsgVJkznZ{mH7|5d>x zE;mUXjQ2A9Fv9~3f6VY_3MQv9^fFw_kjqE%Rg6E$P{;eT!e?>%W}#o8^v$}M;k69^ zi{TLkQ`r6~YZz~0*u(G+hF?=K)y)v?Ch<>2A1L7f!;dn2O2OG|huN8ow=nz!!^ar@ zL%})g7_xompuZ*lb5On{d`H2#vl*^nSj`aSmgwfPedfNz_+J#9hxU-d=UvJ0Ck%h3 z;Czf1D182IhHO`AyU9Q85{B0^e2pRNmENrI^ba!p62r$8T)=i%;A0%^D)C)#3q$5} zLaxG37-IOef(tpH7Bc-pPS+x~*P{PabQ#<(W?aNL>v>|W!cXM#ec~4xKce8`lNoY( zS^Oh~pH#^3T!uej$n`mMuEH}}@62-;A7%I%hQCvg`Zh}U$!v#{&u9E9h7T*a1Puhy zEm_U5fngiNvlwzYS;G0V1nroN_asBk=OtXfm%O3;X;@Emo@9pe8D=v)li^l|++KS^ zjNiuaZieXhBtO>Q!{y4u_VxTxg)e2fOHW}upJ6FOPUlkYzn1Q1e{Q#y?q{6q^V0hn ze~2Nsk4xF!OSv2`{hJEU=K7P(cFktF*_%jS& zXZQz(+&(UwrSN4QhAS8rFg%UnW`<`o3^3$!wd|9OU(N7FhPN|h{g!cgUG`)4f05xU z4Bt}F%XaamGky}oWem$0vVFWAjCV5ZVaWFKvYou#UU+Zia4s+2uQUD>LoTOYE~nn# zEC1yQ3{x2{V7Qzi=iBmH##yiBTz-~wJ}&3-v-~4WcdddeS&v+FuC9KA@xLlq_z1%%7&4uY?dRim)OU>vFXHl1#PzDE zUiq8jJ>=JE4nxj2${j`l7QYJ2lWs?h0=ks6s~d2qc47UxKrYGpLu1{8T?07Is=)HY zyZ?cp-Ger#*>M~YJp^|91|-{nT0u4nXvGz4%>JF&RD~U2>V)PU!=VC})zyugi1!ri z7#W-6$=;}2!BJAxgr3eG27Ul^ubh4Z*YamHNv` zo?SV8G$nXf?4>Y&;c(xU^)BwpYstI9+jY$C=e-L-kR#SGNVi zydkXd4;So2v>kh7w4Ie3JDU3U4)}^HqR1H-=^OFGa)E%1Q*kccbmQOAvaiLveYCN4 zpw!<)T*8ymgN0&6zMig^@Q;p`)@&Wx#>n;@;7R5dsI)gzBGNr>+RUkj2pkJ_mp^By>;G= z-WqSax3%6|y{4(CXmeAEZ*xETfI0Zx_wKT_rvWS z8*4Y#DYP8uh9++d9Y$U6t*@!B@V3>TS>bJMt8cIH*5g9CJw--SU$@uWhTC9*Bcom~ zjN0GV9plx4tr&5db>;G^V&z2!##64s4d~UyjH1U=&L%`xSu3N*%-ac-m9y{IRJV#e zNsp(@M<^dz1&B>Nbs#Dmt`gD^any+j9@G?B`4~@Q5`{sOH**2fC!WTP*->LW(=x$v zXH+0$T+0B{D9AGAjEjPbE!#A!DV%0Gu<@8#A&?AaTmsD4$CCZJ8HlqL(AUlqc^tKV zS{G96;D=jE2Lr{TdlP5m|3lq46F>NB*c^B_9Vp0{b@GJ(-_)f#N_w;i%MvO z7Ny|%1OCzqUw2VyWhKb`ZEf2yu9#+=`Yr7nW)ce@3#)NJlu?~IK=8Bq%)t$IaZd=; zqlc1-K^O>naZSmDD6)~Ph~e*>=r1$BGKPN?{&H61^%cLrgUgP_=9ptkH5~qbHP#Iq z<{rb2gsF$~VBSeT-td6kB-o!69B;-A!VP1Cfzdu(uG<-F;}X6M>cQN!tG|a10r!p? zm~0zOUBRyIKKY(8+g+=7O&JNZ5}T79^Th(kB7ApnqR7VK&$Nxzs4Xfeti-#!#Ujf= zUbBV6X=E5#F1QzCx-2;*rb+S?3Y&u^j<_GkgCL~{Sl^LP3H}mm{jl3{FFfpYc;69~ z?)C_}wZJuRICUHc)+xgH)c_wR0)8l|^k7{}(n$n=z5>((s2`o!CU|H!IiJNJimM+T z7QxSf^%~*PM1Yzuf}a!XIPviN|JZvI_&BR_fBZeOBx#$rX~X0t&cX+)Hsm z1?d%)|Mxk|`@Zw$on#WKfA9VL-ga`%dCqg5=Q+>WcjqTTB6oUvu5TuxS8I|1R(ApZ zG~lN`C7%^<2M|)hgM2CBy$ZY(^p{3@dLBRZDfujVPDec0qY4S8!n5c(<0bf=kDvOI z;LSN32*?ZiC-EHD0HVUcI_EX~IgFqB6y7BOnDFL;ma9Y|nfx$6ZpK^i65MO?Q=g(o z`o|ob`W9xvmVw_!{POX0iJ#*A}-{rlCOm5Ey0h<2l8w(`AWWkHR+e&uf8PmRZ$rVDI}N*&!WGoqhLia^(j1A zZ>V(J&;Sxm3JIo)2O*f^vGGc{m7cw@C(-l9Td~h41ODn$d@XuzAidnKkYFl2OFROQ zuko|J5kOe!!oA-+zJPNlLKZ=JNKjKUAYQ_(1#p=5v2R4Ee9`&;n zo`v2O9{4GG=_WiYy%78qJu;KgBl?OS$)oVB^bVTnVa-*?!}?o7Jg$K|3qOhn*1VG9 z-3~v6NBK+fwbJ{H32*)sc!y1R3ru)c{XGRg(lyDqa0kcS*?_6| zR>Q97odUZPKl$B&aE`Aj7fe+LP#t8#y9sHKd8!Q_izndSO}w^S@y;moR(MRGue`dV zrrhVN@_9U74i|s1+ErOu>G70TRO5+M`p%zwaiFD*DK52?pGShKk?=j_oW?cUw`wlbI!Tqm1UWkuhf^__vXPH0IRv_ zSTK0tmCw89ywX>G&zlGLAbizFjx{wMc;#e{cTZl&)8D<(`SRg_cH{h)4{y*u<2w4~ zt6zoSxk95ZHv3U{nQvY12|E&WA|BDBe5K*l-6^NVa0z2?q_VHvTV3WYa&2$@{ z_&5o&inrO%W=u<)k5kMr`KPOk)P@;`ShqTq(v4O%VPaZjUpH@{oQIuknZqH@L;pYB zn{|&VN%{S=bpKyw-RJxt%=gqcnMJQCXQXAMXJll|$(WllFFiAZdJBntT*@5(4m3zr33516i%S7TNPY+E z7LUGv&Se<~(l1Xt=)S^r$oT=sRqW!$d*T1A%%Aez(wQCxds}s~Kk*==#!f_~EaJ>Q zDdXiv#fks_`{Q+hB6imOPF9;{w_<~v2~|IVW736CxTY*T((C89MG1SIHb8HKMrq<( zU8k#Q(E*y+?ud=z7GUa-pG1=?bpv<~WV;2pZX01n=&D8Fu?*LB__vJ^t+1$i0_X)JBA zd#>|2Eo}|l_g@TGy7Pxx+G6}WDQ&S60Q@@{w)dv3Nn3nU+G;o(#1G;21l>+2VJuEt zhMh&4L#ih9}(r&nc+cfP`&2bU+f-lAI0PN-xPqkN;=C~F{!spUh7y#w1SI816 zOJf}hpJ7R>!QUB(L_GP8u^x}d=PC92s`8P|A`x0nA`hQ;eQD)-pI1P`oelMXQclE$ zo#c?GVF_4MQ|_&4;a-7;CLN9J23EPZO2^=L)^u(Q5u@=Tx&s=g+p#-LM+kLxGz1&5 z?@r(-uTk98Hr$U})yF*L99IGchljQ&LgHg15@0%7E2O7`ySn(E3U8&iytI^4>%{Fl zfzC*Ms4G(6j>E=VBRJ730!gn%c!k>=JL$;$G#-{y!ycR(1`~N|n8LzpoEuI6B%B;h z@X^l>CqO4f5%B|cDIuy9!=@*WjF7*hzBy7AQMhI(QSh4e!f`vByISj{Y7?+4%Wbgz z6b54+5*JxZ=r`2S-WY5NSeZ5k{GGUjDAMe2Y24D@(U2HO`3n9C^psa?S4(Fw)UwS! zU_*OXT}vQ2;fCPmU_-z@Y*(AVCD_y!NFq~x%X#+U8lWm$Q3G2$18w|Jc}Jir7{+Vs z$Z=h5ol=GVP<=QOq(|5x?NX;Q%kk5*sjFvg>bYiTK0e zKu4zm4z>n?+7j3tXz`TsG@{(y7~GTcp--^k&sAzB;3{5h=cbL&)}fOmPR5WKNMVAI8m~%$TQ(txze)_=Q$-M+azI&W zRV6^<03pK=sPMhsiK>3_LHIrJ!4pm7qsPvSA~E}cx=--&Z}s>}QLn#SvVohp0P-Hm z1&~r-c~yCJS!FrE7fKcY8!T!{OUuftO1)*3)fMGcRTb6VDzLbi6p6SHg^CJ|?Pmm_ z$N*AVQBeliB^*Yv0j#{Vro5)Isx*emmpfsmq3KWKyy(dMeX%7DtaOATLbct{196@882 zt1Ch1zP`|2-`8=C={itq|F8+1sQl|qK6XiPgUMf)VY-C4h0EQjr-M2FA)Rj3y=8h> z{QpDuw@;PZbpI3+=2r~C|_=b<|Uut_nF->@z9&3>+7&2dyYNSVJ^ z4oHU{+8>k?1Z2JVXSM}m+ez}8^s&hBCTX=gQcsN*ej5850g#yt$lnQqR5Kv|APBMy zhZxm41>f(WsOSWFn+NbE9BhzP@Jl(|AgIxg8H;o|i{NbNnZ)s{Q3dDe9_(`1rD6()iVKaS(Ow>$~d)hGX8sE|w-oU%fk`Bbv+M9^HYxZko&GrZE?0(~M4ti)H9z zHHn?B15_{rBElPPgHQ-w)e*WR{Sd46kP8`toHwx=?nFKy=bdalcOv=8c^|9wgvRx- z53w_aQwDy5oh95d^b724;g-Q)W`0f$*J|T+T*bf11kR z)eO|7YcoT28QaZJUDA-?MbG#OLGNT;21t^;lWjI&x|mxGm@eg3$;6=d0(*xECJEv? zToX_i@tr21F5$a48;r7LO2q_{0=&TbIRYNyl4*Cr3Z8Zf@G{%ELS#WPUZ6F&Jp4|h zalkTkXj{X!LR;%faU<_04JBfEj6Km)rq_IIH44UA60(P4!28Y;}T_7H*&4aYV1CY)Ou zgK+NcAJEwQoaCew+1rogI0R=nuo=$L*dC2t2WK!`S6Jlf8}_`1puIa{ed7?RCpt1R z5F05hss(glw5QNJ(a7y~7#Df=?m#W*DfD(hbGLzL!}LV^W<>NpBHB8wqskZ9T+(ux}(b!O57y#fRhhQ2M=!PxI{gP$e`SpU*2kTV~IP7qsaZeI1NYbVzYr z|0T0fA5CVE$^-$Ag@RDrGm201KbOzX6`w8tTt3IZr@jSx<2ewqM-4%&!+y%6qoYye z(SHEYB>>|b@DVr9rFESmQ72`)F_G&ucDq1qPCzu}8y)dJftY}2PIn#gK_DWX!P=b6 zlyI_;mGE@a*p~z%SWkoab%8h?9-ml4d)L7GfwhzRmSSlOfBD7$c^jquwgB2s;5sb( zlX9)k8ZdD;!3pa|o{&Yo+J7)MgeHG`Yz&j2ZJizM*nCJ!P}_{hVYriRLp2xMUOzlE zHZm+9m1H4p!@~~tZcOvx=@%nBt&y>9y%N;QE(h;uL$#`?$Z<bGLh&|M#cW0^UzHYKsuxL!-C9yU?__o|8!6MPh*RrsyO?{rEBG~HMa4Pa1K7HN(& z1=<1~!Fr@bzQe`Nrm-c~;?E_f=aLyqCoWCT0|3V+^Vue0$-*V6`yYz?v- zHh6rMT}7S?NvcVli7=Q3;3rpbJ%wc?21Zo0c*{p}-Y(6#Tjd}+2SIZ&7a`h-`v;P= z!71h;{VEpw++)fEA_GCskV5Qb&|Jydaf9l=W6lwIrwH*V#%~Sfos)PsnC_|H;o+-s zG^V#*)61a|KCVPTy6VGl8di?&z+Ko#K~%5ks^JM6eGTkXq_SKCD^OM}ja9XEwO}_w zH5r&6)1nCOGt*$8RW6jZwr`vk&v@!Wwrs-;s-59w2@#YL-W zsz+lNP%=ngpJ$Dy(24?_olsRUDTR>;>QFo)r52HYf+-$Vf_|ynQBGfmV@Gr}LNm!@ z14Bd*3k`o^&0S4_$YyNNKn>kLI2;|rYrlA8D%ck6MAHubZ|Ep3K;d(~eZ%9JX0jq4 z$J&7imyFc^FuY*pK|`R=>wEhnRgLxhrYO?K-x!Y!Uc_o^rws9T-7V7;8*bj`P$Gkk zy(Hgu_Q&z&?&#=1|30p{Lb0oe>>D?Fq(j8E$a5Cb7Fi`?gy|>5^^?GWLdK_^*i3O= zprakrQ*eHtoM@xk+ELX(L*;-yLofxPwdiLFAhi=f^99gz9Ea3FE90+mgqHTEI$(?Lp2s^;&GqFa?r%5;M)8seUdl{8o+?B_EEQ11@hy##EFvNC>!on$4 zxO%lm`C~`MBo&j6sr~0##zhF^ z=;aER9syj#6&?In#6nznMq7RiDk7S|ybxUpg;NegsKx(WiIb_=LsBkAbBLKl`4 z)pP93QdAEH>F<`(|I3oIS7bsY=L%%X>GGll8v=h?3VedgktjtXB_-*8Q*lzYRsw?I z54pYwxrU;=0hqc_t9p^6TQZd(0BT<)YQrPDsEE=0aw-+A3Sp(G$bjs(Kz1B-aV2D| z?_ZH&>H0$YWZ^ZOQ&&L-9xwB{6H&O^P3y3j!%tl?GC+b}3?iWUq?_tcbVphme1-j( z@|Im3Q>*Ohrd1UWpz*ADg+vIW8@=HG3KSpU~TP z@vaEg=3PQh`eMCx9KiATK;R&@j4TQXbPl){n?|znbnq>^`2Zj`GO{B&)Q3gW?O14k zhOye)9qej$x~e`zr=eeC2!Xe14@M#h543ByFs=4!2fNN1LIt?iF2H^#yV(dpO_4&k zrT;0KHq|8py27?4{<@RhZD3PFrm8;`j586D*=K%E7?J6YMDXaZcBfYRC7N*6nVQHb zDx5i}z)Vi%n2UYRpn}>^m)$m|cevRX63`QvMQIY8ALl?~kf;+<)*rjE%SxA3RI^ht zqM$Jm%^T9#H>^RYVJbsn&h@)0q^giqNZZK0k;b031W@?43Hi}<_9x7&(j)SOcdgKM zV)nZh+3%a_>t5L(?HM)W_b22u;K`5Gt3B5ImWm%vDwV+dy|pxAR4+#zsy_}acCJF> zB?^H3CIBIPO1Vwhxt}~h&g_o2m{E8>1_(8 zXA^*$5o=9|3FA%WAU>`$go_vU+IFM;%U=^UHYnn0?dH5NPT2N6sztVIVhwmK%-Sw-nG< zfpG|SBR`1^X$^F01S=1Kh(1DDqsG4D2n9W5>wM+Diki|&>|Cy{sj5M~c*a2+I>ng0 z(~si`5!wmpslerR>{*i^*ha$5!NyLE2J!Zs$4Bg+Gb8va6oRi(A^gB0m(ytG+)APb z6n^NCOtD#n=G7>6-U)tTHAef-TYY&ntKswCh-at^X9`3(gsH3a)>UE%{woLHwo*=t z#@>W*u(bi}u5^lrj`#2-ShW=e%ehXG5M6Dy`)h{O4x2k9o<8%EFp&}++#B6DD(72h z$o&nSaUmYk#I6VIwMi7ExR^$g!WRJ^*8|Y{VYpKTvxX|tLpm4=FQA4tHDgs82WEUF_)|)M%0LaBW(q}`EaJXJG$D?T zDB`2wBIh;YqgirG0PG1w06{Gw4B?ADErfkqNYGg~TL}zmb`qRZ0y^qOf~>oVu@a624NE1s@b3 zO=-CWUtkk`MC`$;U06Ny_x480N+*zxJ7cjpjE=%+2|u9{^=$MM?nZ&fZWyFpVd3t| zGO|ZG?J~pwGk*#=;VH&}6+n!69?W?cd7xlmYV0A-EIf`2)@R9VZR*S(;mlIwBqPP; zPcHsfY;|R5YE6Qw%rp%Z9I;h_L1S$SG#;NEGlM|V@TPQlx~ippOGKQ_Iu9EX+uI@m zI^KnP@&y~Ot=Q6q9br{LZ2xX=YuSc*-z1@5nhJ-L5j#z8dyDONW{2=hvT(Ec>@w%#5HIF@|3NM`N5V}-ox9httKsG& zII8Q>P5)2!Vdo+Nk-KmoWj8sqi~r!r%)`O&&S+em`VKl)YI$+&vlv4coeeuyy7J=n z!*~S(Qjs%5%g@$c;KKF~jG*0w$V0uc$nGlmZ(xsPxQmZCry_YIktCd)1vfnPz`kDQ<49V$Xx- zGwv)>C-k>n9HZCXN>Hdx?DOKoqhsM61N}0o9V;_6&ZK7mv&nst-soswq_5w{bsa$- z0J9IUzs_+NA5OC{W82Kk?9`ITjIE!B8EMOLoLx58U3_yoPXQxl7G`$(N*)caGiQul z4a$E`&mf(3;K^d1d3hEDpdQbXD}W;}-ayyuW;=+F&<`qtk%0*#3ksT#v8(2}i=W7t z0ZmsE(L~}FbAcz(#R1W5*J5@P=zet04CpdSZF^aHGP-uMkAdc&XF`)FY7&~1TCT^~ z1E6_qZg!sEi*kRIa)ciqWOL;CkyXj&a(-nlEVxfN4+WUYy1T-$GA(aYT=-|^Z5j}^ z1$mqLge^<3jSuu0I_L3lFJ=c8xQl-}uR!oTuJeS=C3wP?;e2pjwszdi^FHK1!4v*D zf+uXbf+uVqJDwCz_vP%v;Q9Sb!IR}Eo@5g|$(G@~CliI%#53(w#gqI6PqGP~WV7SR z^OpNfb|-i~FdxNkGwrLE7iAFZ3CKi&U3n8>Y?kL!VdT!pi*GY>t}NMfydX-IC)T{; zhB7&mv|;vZFgdtj1{uv%D0&8_B>pUW6~uovBjQxMieyMi94(QSo$h0Q1@R*bXCS$$ zh$JUYRbKj4?EMQ-{<3C5oSLucBuBfI{tCMav|n75mDk@t))E_1wT_lI06^nlbUTNj zwshoSlD#9gCpIz~GsB&E@y@*ieSL$}YKls}jw5!`0SGNS<3-8}V?d$Cv~{>|pdTj` z6rW5lV4q`lf6?=gaI+77FOne{;Fb`X;&OjdEEF{O%#%5nB0qVl0-lXH_% zqs$i_+yq_E_fU<}!z&q7S=+~UsCpw)!_v&r{OtMJi+KG3+cG0h8$EWaRx`iG{s{Kh zE}xS9_0+BEs?uZpXTcbZj2FSg60rgvFtdfmgVSK}QC^*G3&v6roYpHt^eL8cC@Gk{qb zRUyl3*$bX2;|S|gD; z?W_^@DrkQ(KPRtEkiDKYLz= zjX=D2x#%72^APBV1t|(dgB(2#M5ioKAnK;++R5Hx5-9r}LZAiT&d;86qn$uhbuRiX z`vnC0(yGk7R-Rm_G&Jj63dXJa?1|_WVgSvjR^ZAI`GMw9uw@x{<&DLREW!JB*%z@l zPeHGDb&5P>CrI+(i7+J(DxTRtV+WSGi{E#8syt9)pjpKOt|{Zev-aWuyB0iN0go0# zS8?nSjU~2Ssp?A%orVV|t8DRo?6&3Z;vW>wfYp?0vu8z`Te5`R2UcG#nhC3^v}enT zD{#rh>~moCV6k<^hi5vK7$=qTq)|Ce7DDs%l9=(qREH>M#uO8uVZtmwCI`{n{HA8tcqY0#n%$)R`I?!l2%Z_jbXdwA0AnJX$A3*muF{#(S^5mP@=knae-}X+)N~%X^CCi4+iriDOB7Nn! z*<)b!kZ)>MLSF_eQkW@LydNT}W!qSB1?I%rlVEjYDQ9IrJ#Sa?@^+1ju7R3r+C_`o znB${KdO`U|?4i@##g~;Wu{KtwiGQ1H$|=*_AsWquDg_;1Ibs_$GvkSKN(K83nEh!g zW-@71qKlNFXi%pjRc4etr`*YI_PC3GS)P+TW>f1dFE$h#*}hL`Fe`5YGpIC)Cp&Hw zJ?em26uN97`ySZtuk=j87TL?Rk}`E1QN3p6ji5&mm$OHNzC@Re)RMzxBU`S>Nt0#c zRrs<4?9vtP;#;exP>GzcQu-H#kn7(ju_4=n1lb5Z%a9F0mI&EkTbfih>Od{eXJ3G9 z_g33vL}b{pSa7HhR{+S_F!T&eT@JG@dGW%{Fb%Q6=styxe1k$GK-sy4ltuY$S}yO- zQN=YHk75$fl9tQA!Vau-7e87vQ<-ejcY2wUO2bnxw}V{=X`Wm^Luu?&^zBGP>6QBu zyB*RzUprH2Y*rETQb@1ly1|_7sYC36mG0X6H?ZG1SN9GM#3Ow5bC~yBsOl&{A1862 z-*N1#`_Tp*V@bqE)M$NUGX7EEAKJ(+ajg>cX;TI0;|&_DfMVm`@kH`30R54T>;o=I zUZU&dt@uR#*hY4PYc=iY;9W0JW*I^dqMxuWkYxb>_h+(4T}8A~%&P|xSt=mg2!CKm zE68>%?He8AX1v3wLX2&n9Gi6yk7Mwv9q%5C?TTY9gBP1^xOYsIIM^kOHr!$6Nv?Hh zwSPK`{UJdHilLI>D3^g95i+nNDadei7BU<@8+*iYChS~)Lj&Gc5#0IT2~8XtH|tJD zd4xw8>(~@+{+G8gTJ2SS_H#}RN2}gGwWs~;H6)7=~<6J~)mLzViXLk!RW>4cM_3ZOp41XAx3d}+mA8laYkh+*9g_j!Gb3zkzufZ%t zxHG_hCG{{%3NHlM>zqPsSGXZnA+*|S8rlAI$_K4o{uu=OMkBj29orA7bchJ&@-{@%>Kqa25n?*ZEf)<$rW5#xs#Pcnd-Ss z?3Go;)Lzl90UCZ#hq@qp)pKDqQ7i|og~1eV*)FjhOv0vh)ZW^{KDc_d3Qk=js=hvdY1|Ss zVu@H0N85amEN0*CV26tJWVFPNh(iCIC@EiME=mBACMPU*wciS}my3CUP25Ie6y2h4 ziK3g(`K6M}N6p=0$lNWq!*uWC1L*F3$Q~@G+q^SIb}w_gjqNd1<{zkiyp!FzhL`z7 z35?Q@oF}%_kXlqbqc-H23o_~h2!%33Vvr$nY5xeeS#W^S-OWWs-o<`w%UG{3(49?< zF=`OfMuuQ~R4_i;orLkjo7wdxJn=0tRwE5IoFZRb!D@=|3xe+pwtTl?FtM54v33pB zXLRgI*3R1Flt;x#;(~ZPMhRw(KF+iaZ*5^eSah2^(0cHVgCCe=w0a8-Iatp;+hMTxrbTlTV z1Q-|h@`ZOHHULwKJz^HSn}WxN`gngdSKIL1dF-o+q6@9kEE?3qj@ZgRomS^Bovl_k zT+_{dmnaa|<<#;_qf294NU{H?>GJk>vb)bn$OclEC{R%4@T^q1?ylLY61y>8$j@GP z`-Y#ti#?qvmr&_cVoj&fVQ7*^>Yu66+E1O&uBqV7f_0ak(J**RMZ>U_#L3xat~X2_ zyKdapz#D^puV@tdebVg{ZhfC`_k=P3m)pJ1>@d~a-4obKha;?LUiRs>9zm)Hog~0} z(2SFT1{@vBMcL^Y`PtrewZDq8?^p1K#u_K1sqy|wbTlbW+VO-qQEyXCqVQfP8kh;A zhTmscsVyW=-epsb5Ek_bI1&^UKzFaQ=9N`yd)cj(_9E+zl<&sm zB2VhsLMjsOs1QzXsJL(d8gVd1C%MS%h*jhxwNLi3W0kxtPSUb!-b&9&E-_j(OP4;0 zR6HIph?As9%Fld;yXxx$VZ4lHfN=P&s};v@BDguI zy+ga$@M#IOHQ{0JSyG4>xN_ln61U*F^`-ORCEnyZd7dULIRwMQTnL~oQ~o~m z)RqejvgQ(;ET_)X$jF-y%E6`8b8vybuxgq|!OAl=ZH02on>T-6CP?Qm1#LEu>&ES;?|Sz%;F7F*5Pm#SjJe+%1OqXOK^M zroi_K2Zit{IL?YMW+Y$PVvX={W}GaVR>QI5EH(+JrnQj8nXw_W9Eo!lQmoYgkhAS1_)}JDCkx(iS;}*$NK#EZS2!uD zJ5J`5C|`uhN|sIm)3mOWd2ZUAgWR+whv)UJ<(!gZP6-gVDTk(=C#?|r9l}Zo-NLGA z?^Kw?^IghOvXGn+=}aTX`NAQ5qQXIN^nQF9q?h)s+vn%3{;#&$BOpzm-? zSv74yS`q33Vb!#q%A4p9Du>{_OW~8>5D}#EILs}e5mzxFW$zY_vobfpF(MqfOG&O# z<`EY}9ff@ZLpiRmNhxb3d^`TA*nD&Gxt_nluc;cY5AY-d9%9SNcv( z0oJa?tjyRzbkMVQ?a*)p$MUfRhoR{xtqG1}*$kK5;4KdBxt(?q(9X17(RiHhE*;&s zs|SbK;G6JL!p54KGG7V*Q(0M#n;F*j#>Y3}%J#9?#9F)^x^`_p+~MK=F?uj`?b@CJ z{6U{HK0daQ-Uz~Or(H2n90POQ#?g&4vk1AXtf!k=W?W)7I1%X^9*fYFAuScI8%Fp& z{jpuceX))G!y~=1xms`t)aWUoU3eF0bUl*BS61q+UW*$r-i8kGq>4~sZ$DQdxe@tT z&-ivS2l%VN@i=ax88s=vSLrP+@!@Gb;H01ly5V!<8C(r}heviAHqK(tKwr#5$!DvG z*~iYG_!yFK>T&D!tR0?p()7jRm=Ty=(o)v5>Wt?Xt|eVbp0(}JZu{84u9$5?c-96J z&UEW;K+SInnBnrYHG#VE>}_{Msi|%=m?AG&V#Jki4J)Op8BkB z4%BZl!}WJ^ISmoi^hz!Y;jVr>sDcBlvDu|o??}H#=y_JpkE>eFY-XyvdI^XYG{KD{ z^a*Ypo=j|=x)&sC(Z~ERMct*n^+&kBCfzOs2K{*to7|v3?*ZvfgFpVOk9pug z6|H~WaH9!OANNmJE|}zxu9W&%F5GB4^pE_}mg`>w+|=7tAGy(x=pVV!S=B$1=VSyK zQ4kToxxZ6xTsVOECAbm41UE>`{f)wh1Nxi$F6BmeayKY9h(Wh=OH6LGZF85H+-S?@ z{LSQE1otmZ?rgZfV{)T=I_I+{H)zfIu*r=s%bfQpH;5s=a{_Qf6wQ^*<2MH~=x)R> z<44k+27g2;;|{p_x5%NPUC8J%xvSv@P4U4WuZ^ewz~nv+?hl#VE8*@mxle~%&#wr7 z2C~FYP5#T_zSHDh19z{<4gP6ZOBA2r@BW9$4gT&YOm6UZ-(Yfszk9&s27fo=C_c~w zf482e;0Ax!V1f*FJzB|MHQW@R6VVsQ#cb&wZXk+7rgJ(tI9e5pIS&O>l;M z#r<2QX$qGi!*LVg=F4#8rf?jNaNIP7n3&n1Z(%eHI78i8 zNG9avW+6tY|aVf;t#M=(Yu6X{CwX}^#r;>G2Kp1Fy03H<2#fe2+AxTrNpR*E{5_BYmR$uP0Nb$A6*^ zOYVm;?l;3P#h{to(BqkA_RG6+6(nOs`a2N6|HxEfu;=3e% z+C>7M_H$|eS(xc(Ni!r(so(Smr2Bt_nIZE{MyGW5OY^m*$U!IVW411=8Fg zO_@LDTqE62N>hbS2Dabhk_M3Tb{_n*R{yf{oIY`dxtbl;|%&{^I6e zg}HFPG*?U0FHPiI!docyv+yU<{TE?op}r&ktgEH@18M$Jn2XRKApb?Xr787Fbu+=U zFO%jC(tKH(Qm)0V!oB!i()_G69~b5lsfQ&#=|;UtbeG&JO-bjZV&Oh%Sej1@bE!2n(DF&^$oY07jyO_uM|ekb76Z6`d>9BD3+X1+AfmF5;{%KF+9m+sr8 zd5<(dB~2;6N9HS!)UW4H!heP2yW(`|UMtNCY07x6knPus-4ZVAtrdr)TbAb)4@&nV z(vr283Z zz9P*(N>kR4E9VOLN{=*GOLLtx&yr@BG~Xf3UTMmFwekbfeXTTalI9)Kl=7{V`E}*@ zCHzHc{#=@`3$sA#rC_miFPG*@X;w;8>ZhPny1S*>CrzoZ0;#70Szi>~CjDi8Dfpsv zKP63>PYYx|E%<|guS%0rnSa-m3iz7;kml#5`CVyB{jT|~bpKVDC6azgm2^uzmW)cbtmjK) zdX{`l!aplbS*}X{EZl47NmHiJTCa51Ni!tP_et|+X-Yb4rQX;6M8c)M*Zy6&*Gc;8 z&Xn%W(j1cJd!+e6Y0Cb|y62=@#{Y~(!hJ@*G-bIvL+bgAb_su{G-bVd#_y#2e}w5h zEX{98Q{wrg{(Q0?^<5|YOJ)8jmF225AmDm`59xK5L*wI#Du=cXlUwWbn`}q5b@b?H zvU9nGj> z4mq*|o2IbCOWeS`eI&k4@{0E0rQtp6wvP;t$Jdoc{JZF0*2rK_e8;BX*v?o%X@me? zuPJ1bN!nfn?;R)H$i9J*#&?gLx38xx8WC@pSb~dXXav~XUqJzOg+slezVe1`{WXzJ zekHLffQ~#gLc}7w<29YV!_Bet_Ekixh@V+Fb@e1@SMMdih<9XQb5or!u(PdVvM`wY zjA6#PY~2n7*yiT}aC_p=_H+G}!+}1V0J}y9Mlof&D~>t*5gu&&9v*B*&8E(l!M(eD zrPaxTL36#mJWTZk^pZ_vd;7ljf^B2L(5{L|3sFgoN*^YI1$q-b9}yWFtEk(ut0%C> ziz{9QdO|WvrD6I$0ldzqN%tWuP<$Y@v)(bi!NVhkB+1aG$sTWrth4#Q3_?h;(9 z!|PCee)TB&XhA_|b1Po-_U|b#2o*FGY$~WL2p5C`1^)FdrKMdh<-V?#QeVN=^({VM zK^TxQAYnj)fj|I%w-n$W=9XlSL7>iGUCHx4pr@dq1FyZrM#l;Ypwz*Eo+L{LrfekRtO{3w$W{eN_f+y#q5=z4 zHlyIFDwUZeN0sqx^MnjLs|>-z8VZ;}M&==BofSlAOI0|-d|;w6 zyG+0d%sL0?q2EsOt7;&{T0lK3OXw+-`WZERMp}Y;Dy7<5j1erAQk?J{E=44TQfnj< z0;Ez(DS%zNAovVQB{g-kEtN9ttV$&hJF8O3LmDYbB`TGql(mou{q{tJ6CO5ve}CbAw&llRQ=Lp?tCzI)VjwhGbF@UP)Fbf%_)IdE(b3f!omM zqnZL=*}t}P*%@q2+P4(l;s3w-x(VIfx3S}3`tCf4chgU9Xuxg}>_3W4wBm)}#_^%v zu>m}u+nsD<5>Ec~VQd;5?4wJ*3&u1IwzZaMEZQ@`*AesG^=em?mNqxNb&g{ZTjDqw z=L$|?`MBJfwyA3MrR%&kSeskM@*D)3&m2xIN6T};z6`@J6W4qLoCEO;B>RXjt&(V0}qDtdL+zJjXSLoqXqJ;15RS`ls+N0YuS;buRShD$%hFKg^Gt@fO?* z_u9#Ljvatuj!k_FNGHU5BYye#kv{QroCgzpRrX%+65JmA)F)+ftO3A8Zz1_-;Yai; z@Kf|If!#!JA#gHo1WbLBo+kCD_?}Gh=u}8B6`o8t9q(`EJsSoddjocpe9I}WNMWYmqOX!Z#}clT1HS_N z)Tj7bxH*Hrg%(H`FP$2 z?+U<7^6iVmO?shxuo^$5KTEy44-s+S1%LG^`LI5v(uTY)Ci#el`jnmcs4%cz>;c+K zu&7V@?EpX}2CVPL&-EGn!8(rKE|9La;)gY0^&KP}FMbpcH-5yI;?<0w8Sfi>6g{lD>UdaxGsoi!k~a%K z;)^w}qquD zHN$R7w?h;zL*iwd@K##z&WBs!on*qZ@IABxeoDUOQ{e4Kwml#I6pz#JQ}S8pec&bd zDS9MRGQ8s^JgW1O;9W_&Q1qy8lMJuWgs18kioZoKSDp=+(u)`NWb~S$_S@l4@m1{t zg|o!>`lEm;`Kn=8^iF}@iJ$y#fa&;}a=}#Poa!JG-i^S?Jkn&t$1gY z;n7jk=PR$Ss44gPs=OW#{^JvWvD#HxS?TeVS5#G&bNKmlFAlUcGKUfil$ln@|LRQc z`Y}}~TpQRNscq9XKXP_c{E@>=@nh|pw<%t%J(kfFe|c@wtBof$E@*VU+Mb~u?|hHz zc;`GOq9|CrVO)?$$o&-#J)wnz5WB^{;m;I1*jNgp1e0xJqgu-hi8NxErBy%`;x*jM9{} zy2uu{XKbS>=im@w;bxd^c!6WP?rQukT8q+?5tf>xX7)km9s4Lhk{X;yt73W4+)%pbIuEck z=4Q?Xi_;c6AHI08+wD9vttxGC+7kRuN?Yu5IBzUT>q=YfPIm$YrrWve6gV=;;bNfh zgYaoYfZPryZwR5t&DGo&X*b+Jy+j)9gfz!R9+>KDgr!kqTa;UxAkYCTRR&8m)&*ld zen2Fv`2*s)a7)C^uu4R-@{eIrslneFh(tX3jjn-Z|5rrcZ8!o30wO*$Ic4Xko+m5#x0g`v0Yfjd4#w=CoQ zIQD1h2%*l7hG1i3MB*r~QQU<#+>Z=B<|*g65->PCv^^0L9~+SX)8SPiJspj$SAuye zyp`Va(o#;X6ZhK$IwSR=E<9(Ct9-PYs6L~I| z!oq5t%uN6!oXt(}(NE_lKqo~J@dI@!A#%83(-TKV$lp=l9I1*ZTr-p?c+Gm@xSh>i zt#wkh3D_80Ovd(8n6lDDU4=T@8-pzYE7Qh+zZ2K|M4J6Aja%9~8WIC3U%{WEkE|-v zOL?_+wR8qUE!*q^HnexuwFHtAZU}A;HU#X$cD4Cif=z9KBr?^voM#`d0jjbUHL$fa z(8iB#cLbV(VZ3LK9M{#>DOKnX)rTWNdgdJRZjvO%c8u@pG28XD#0~1YUA&YY4)Ag; zu>r$1w*Houh(8<-baWcvU~3SlErHE}7Ec-1Ddq0Q5GRL=mG~&6K+R3juvB|?ayule z6*0~|nTcz4j9Y*l>u_;}xZ6ZxQrCmV%**gw4mNCF1n+;-{*cHHkH#|j+If9Tur8sP zdVMuGDj6ZgAhSiN8o=u_Y>9+K>LcN<#zq`!k9YYUwoG1d1K)Bvd)f6rQ=EM*RP%eRqUlBr{f}{8no-8OyFrF-Y zZUk@Dw>8nv!|OBpqp_8|x&`4#L!iDT?9m*nA`wzeTUcWy$_k~80;f9C8f^2d#jaV6 zjlqrmrW{aKT2%?qI6%lM1S)*5ccQ9ad=P#QeDM4c`RK7Tqe#qtpzafV{98Rf^aa?v zB^$Vj3n1^2TmUKcl~{nOtIE+1 zl~s9bDk^-Hz6vnAoPjoq0J4f%eFqJ&MT=J$KK9ByWFVxd(+?UUM6|hTuQH%A?oz{7 z8y->tW<_6P`07d!y00&^*Y|Z?W4aEM+COXpCo2DXlaE~z++gz8Wtc7@ZsBq_>giz4 ze@LfWb#Iv-7XSay{q0lbHr+qPM7cu`AhV(=GvBHENyV5G;A6U{P3qjGd+LgrI&nTO zbSd>>&FuFYzEYBevT&c_ZI@1;FuZkXrc0&=DFW!9@yY^Lp>2(QQHMiD3CEKG>@erS z1Hgl*3rRHgIE6qVmDP@3)tag%RqqTAA_sg+#|I%()ohcgIsSJzXU-rofL%>6&VxM1 zRL_&DLR0L1V0a`(??o04HbwlM?XAIjyPEY!3H}Ic&M7~G=XvM|0c=u?<2P(eeY2ly zSaTdz4pQdtl>^eDxAh0*1OZtu{+Vro*mjb!y!g>PQmv(C@MNZ-sS;(2?rZw75q{TH;60v`#9WSp=V3talioK{Pm_X2x| z2_^~Rs#z0I7xA4Ypf2INI2(+wWlF^ak^;QI`Z)p~xsqvj!3v&s3h*-9xk6+?FA#Mq_1ppWr zqHVSstEFzUzY}$`^rBbQ26{~xXGS7z?U9ZE#+=mY#VfRfqw!d8AzrzQjg5~Cp_=id zOCQFd4}8>7EsO*T$46s*)Z@qHTU!GDO;+!{vFJ|n#zcrdZsbFQGK@q}#}*eNO7Up# zPRw~wrY3cJii_Y!q0T|n#8{J%Eu5o+e5ypELK$?Y7#C2`(-=l>0*2^!bk%o)f@Fo` z6?jNPW3RIaE?H(l;@0N7(;vEX@d_YS^WW4FNB($EpuT33jY2_m79==NRF!u6ILRP}lO=DjYh+sVp;@1V@ba--MAN#ebA6Pr7Zz)zX@Ru*^8!H?(i~6)1 zz;#&mC*=yBHDF?}6V{D9A?tOu|6ptgP5$=S7^XklIy>51`2H@o&3Jf))~B|yZK&pA z+v|si#zuzagN-btZFtzh-i>KKJgZ`ar*$y4tyiMj2dw>*gB_sG25}CC!dO`0q3qdm z1R+OAt9`)9KBR*Brwhsv^q@zb>^2p2V!EJP2|*9~Sr_|+3K|NBrj$1{GTe*XW$|Qe z@6Hgl8n~-K5!&!q7kh}NMoDL!kkHrIaJ;>r0`gFrP}@|5Y7e{F5hYRUG!nH&2Zrp$ zIgrM_r^Mk@OycOFq&T|U8mZbR(%6eimQY8q)gRt8jfMtVqoX?wtz44MeyzmN2?$Z* zBLY{cBr#;|k#u&MW4Xvlb^dSwp{HbBhgWn$Bl3Y!%ENz4XV*Gpg6ISUYkDPya0Tm0 zA-|l#ZnK1>sRV3I=c#QQx-}|Z72XEcwU^FepK!=h(CEkN$+U`Vq#k3U>W<7|4=E{3 zM1%~yhsp6p943e7Ljf8f)1V+9zm*B&fco~<5Y~!1Xei*!b-0}QPWjTqmAu~DpKAS? z%4l2doa)tYq@ba@J_g4kbYg8vV(Tl_Db>R!%Ku(fF=B#`BD4y>)%cxG>42siE1>}l z%E}_mk)}Xfpd(n1l*o6u*x58zE0g0jwa(k>r^N+N1$D^%b_jT46aKuzUT5QvuBQzY z*&1XwZ1DIhyNWy)l2ns86Jan7z)!B-dJ4-(42-B~*_Mywyj_}ex5`0u27%h(ix6$Q z-38XBR7)`r>DQpx=N?lY5E%%1h7^xZ(~cWd{~dFV$U8-dM=^eDDDRxayTNn^{0OMOO{a!{}>Zry`Z*8d!m{Vri_Zt*Zt5 z5UR<*{3!2gz1=yy5yW8K4qi0$vVN~js}$$(B#9H2ZqP9QTrOjh4b8k3qU{iT*5wc@ zp|w@|C~whOv~~E=UTH6-4KzxdUUOMkvs0$U|)(-qK! zX%);=;7NfS1Ix#>=#IlIQoO5V>G`~tHL&h z0$b|?A&gG+%$FdJ9->)=m^8^0O!PtSY=ksw3aZ_ReF9;-cf-$&$Gr;Xhi|ePN*uFl)^{^btoQaQj5qx!4!`wLBG`PD5o#Ou_HPfp_$~d zfgvJ@g@(Vd=B}ndWHYvApoZ=r9FC6RC0#t=6l@E2qG<>JH*}O1pzt~0zTt69Gg%Rj zW9>kMOGfH{7+#0+pdrxb^}YR(s>XVLOB3niZ;VFwkc!t@j3`bl6wA>-3dY@;|Y z(9w?RDLB7RPP9>N?WpRYp>n{UA(#TtTJ*C7klG2L`2y%Ujzj98mGRd&LQ8v7o!3*i zHem_>b=`|A&*Pn_=KAsy_cxpaqj;qQuTZ8QPZc5|mI^51_!h`+$K(`77-Bm`Vd0c2 zT)o<({IMfrl8Q;k)c$iVN$31DXIs9^mj|?|7FS9D>5OHa|JTxba~N&4S_!`1wO&$NR%Rxl9F`4sW_=xD*?gq zhg@HTTtiXb08Cw|RlUg3EtyIX0JX0Ywc(LnRK#e0IhBf5g|O08WI*;?AUh7axQ;Q_ z_pivXbafzovhW(tsjDCZkC%Dfi74Fdrgd1%;is+`86ZI~1`*JF(oJigJUl>h`7WK_Y~LcW$=GOZ{Nkc zB3PSu2|ekH_119!$KwNmgV-{%C?wE1;96`N$;Pw1x9sKvfY`{$j_6Py7EQNfq5T=g zYHxS2tJ&$Q`VgIlevKgn-hn+Bi6lIJuHC}4+NT}tI%^0O;99!?`V%Z_$8PMh(q$FZ>{N^p z%ZZqX<_&4=8`hxHFqI)O=lWe0QdLMQq;2HhNMlc10w{djg#2ha`x9nX>4A2_yH@Br zG5cMM?Dx%d_6BA#36Dqmpj|#a2*fwj*{7Way~FW+ByR#uyL2SlpUz+pJ6Eb8iR1;F z#Iz?iKg?jCb+7D?_KceG`x9~+@Z`tp)$VG3L&Og!l}h0K-dY+ls+Xe<)gK2IJ6ECc z5(U716MzstrQD|M+)o~_+js!(z%B~vi;I?>02qks0CL}=2_Qn+E0P+vkIKY^^_xofgz=_w5FghWLdCH1k2G3}AKm#;PIDaBJ2+E5QpD^r z`zUrOh|ML&Jm$R)hs*ILtB2-%)ZuhFzl=wP**6^xftF5xdT{94WIu;JVRYLO(4P{OkJh7t`bA=Upe@;m2y%v z_9ldbtqoXrrSm&z6kKR9)Q*l!<{OaHB^xv;t8jUT6<$-IG~4^#0bo} z4B+xj$)&Pf(JwB9PH0D!$0E>w0X4L#8LQGb+Ttt0pHli$25RUuQz+785%(>k32}5p z5g!E?Ij<2P&5~OJU{4?d2xjBLgVf4?TwU`P9Pn3#$s_89fi>nenKVc+2|?UjRKF|Fi5+?!rhf+ zWRG&%WrzW0{uFS+Q;Y*EfEe>UnDZ|3K*7M&*h8FIcpR6T&yv~N)R{fPnWe@_MvBXy zT>P)t>dMg6ngmsuX&NdxVygm!#@ZBUJU%&Q27#pEP3iD-RZIJph&YvX9yTPlw?zVU zunYC%3pQR`v84+;!m5JU{@vczvJLaTNkYFg6%HpOcADJE$3oXk8ViYiCi?yo;hg1? zSK=XB@w%#5HIF@|3NM`N5V}-ox9httKsG& zII8Q>P5)2!Vdo+Nk-KmoWj8sqi~r!r%)`;{&S+em>kc|rYI$+&vlv4coeeuyy7J=n z!+3!KQjs%5%g@$c;KKF~jG*0w$V0uc$nGlmZ(xsPxQmZCry_YIktCd)ZDwY6YDr|q)=$HXwBybkpsQ`O9mGfI2Nl7{z=V+n1Pl~7ea`s{H{C=k3$#N7=vI(AK%W&S4i9&1QnRcq;N&bQ-*#u9r+41Cg z%l#(16FeW7k7Bo(_EpQPFo^X8WTL>XyooS2%k!x)a%belw;4HCmTWp+5T(i!YhH0f znVd=5F#9!_99%GijAkknJp)q`f0n%p;=h^^ajIQKG9)FAmPpG^_p!f%_>qM(kla*6 zk`t#YFa0X^{)H%iSu-I{&DV62quok>gOFD}Z;>+c_HiHQqMcr`QtK;vL^JFkaO zTRQSE$=(s$6B`+gnc>d7c<0`MzP>?fHAN*~#}PZ}0ECvE@gik~F`!Um+B)1f(2o-e zs&>niR2!qcW7xe>kdzus!+t+s zQRa&dZi24od#Fa~;gt-ktnFhvRK1a@VQJ=Qe)jzAMZEriZJCj$jUGEytC?S8e+2t$ zmru$5dTQ4alX@EV$HDYkJEoKq=hv}I7rBcM;+FaRxUw;%`brPU*p1$P*tCpObbfb$07Xw)BcshQ;j-FcmnFeFMPig{-*rw zh5PMxmXnActhGrajVqFe9G*xd?aS5xGeU^SDWvMNbN?FFcr^JukyX zAl|!N^bYoU2=v2(6a}I|j-CdhQH7N(1LI0XV1COP9Ul}7yXv~ z0s?($Rc2l*PcBp%nsqJ(<5qq4M05)=faX&xaAk=6K=UZrvW(mF#$ra6;C;L7i`bi| zpx3)PMIN#fBzf>en34w-&+MPE1IygS?>jwJ9w;%;tl|OJl=0wMdvSnW3m&h4M~k7W zIQEFf65Fm+^(BT*!-JDmw)j4F+j4jD4+>|%YD%@)vm(tcS;FoEtFIQ#gw<5qvt`8< zxa4B?Ik0-L*gE6GGo4C|lS+Bgs2nE?p?P{q%=locLzFXPiiyuKVU{10gJ^mpyvQv% z#_q{=7k_w-b>=65sq6^qOpOd-Q18WCx8P9PY2yPjwgHvTjPsG7l@tma;#YGG*YUzh+N@^6S%37FkxOY$Pz%T$3pCggyCe_ADsB zbcQv*+G%5_BF)v27vE!c%PErqJ661oJo#q!xjc9Ax4l!clIqb}$+DrdBKMT6NMAW_ z_83?_OfjM#ZBv{>8%30Y@&)b!}yj|m>YoMl@cG2QC z=J;rmUQqrKd+0QG@nvO8tc{gv;$O5?=5)y5lxgk|jb=iXf{w2ou??D;@x(c$g8c@} z{xlUcnKX)-NEwO-bt+P2M#*!^o$O|hyZD#oImu%-wa)TlL$Q(V`-BFw@+L5YN|Si9 z<3`b=4wyxu%NDZlf$jcE&lGHty-X`9Q^yh2YgXO}dIWJfdqn6W~MUPrtkDJC6$J!UTz1w4$?fieumQ6r|8>}hSDqdC3ZWc zdA@e0(%7sb=B1Ec$#sJ{+f#?w11sIN_itdobFS_k9EeBw>gO=;xlq+nfId#*KELDG zSNEe0IL4BQkEqf5#$^1Xz(2H+UE*3L=+mYO(8t}?SOLYxz2k}GUjX_e8`%e3lDtIM z$y@P>{IQMf2G?rZ(ZRc3pv*FaAVfc5TOi8-{_oFZkGhIzrI=R_BC=FKwh{iokXDfG zSlWksyUC1q7*&X|?UQ4(?%{C^UbW-hW3gRvtYz?Gvkmu-sS*dfgwcjO%sk1p4z2c2 zXR$vd$UrevG92YHup>eSb|eKEj?O}c!)IfUIL?Hf>u+el8!Cc3|2v_HL*r)M$taKT z2xA?aqRs#EHb$$x%Flkzso`kV+o$%lpS`AJqo+7#ESy$*eI2_j4bclXBYv}_@q8V- zo@ktlNX?SOt@Z3~A;#=!{G^_Jo{QlR<5GcH=;EUd>>E-Sv!w7+1A9(rg6=h#g$Q>B z*sr7>W=Y|N0DGNNXzdC&q$-3~drc$TpHBIpwaY()VBctDSEgh8A(ajh;apxQa%JJj zwHA(CR4spPWFO&ykk%;&dZdZnDFkfsOIF)N`7_F)aF34fGHqTKB@(--o7iXc@X7Qt z6@f>a*;gciQNSS~YZL~cx5t9)M+N~IhZ#|LJ;;s;3P|M? zGpJU3|2gb0GE_MAP%oatF3q4EwY76{tzc~=wA!0Du`4rZBWr7Gi$6)O;L6IKtQ^Wz z&uwC_tSYAVigpdq@Pj(k1=*{f3!{l*IcO~mrf|!436DwSXQy@4-rB-GxO%k;PF*6Z zwhOXX=TdOq;F*GBYe9Fkx0l*b)x3d>`=_RwKU+AK4fqgFCUiOdBX z?rLTCpT3Hu!Fk`2onkn}qY=cL%aA_U0|U=z1fzqP+LHF37`Clw8{TYXk0%7?v7t!t zz%Y2=rKZ5J^T6Hlk>NgEyN3}DS}y6JeH_QN4Ue|5D+{?y14DakY z&hwn-Jm)#jxu5sE=a3$(o>mQdy{BD#WQG8nZY+TGV*#Wh2_W?htxhuCPPdCcDbW~d zA5pn4&7{o}uhjr+brewK;#*W2mXNc5Y=WFd-3uM!z1w7BrNH^Llmek82{g`_0*x~) zaCY6bPnq4~SmPm!pSnc+Tq!{oPe>U>iBwUHNz1`(Df>pJI9X_BV?ydkDC{qVlJRxn zq6|=Za@JB;`}MGRu25Fk_-!Os)!p`WRdwSAzf^POthq-`nS0cBn4S}I0^M^0#Y5!w z*muV8@G`H*+8#r7{^PZec8Pno%Q_#gfmQoa^3;|ZGK=nK^oAUJMMir7rBG)`4Fal^ z;*NWqVMzpQxSNNDyj%PzX~brGf#Gaw5u*hmYhQX(PF2%U(smLTH< zUik)HsSU!MYLDC1?xEn((E&NI%rollIw-ypue!1-Er-E8;#5-I=dOS^* z@npPS%A|9tHJ?StU`d&%zobQL{}2(kRLJ%{al4(>!tZ!Vweb5%o!kTVv5{?r)`Mdg zWUD^tRjvD=k8z*E%?-Of)7C;>Ue5_TVrzhVrm-gu-=dTV_7lD0yA`s>NKBK}XLvuMMvRmu<4jzdXxOM%L*(!g9mBNMRG+Y% z)TxoD9DC{B1aIewI383DKu^DRm>t{No>6lv^8s{n8PVFG^octwldEj@Hoo53Rh}_K zg;u28X{DUm<4EN|w9;Tp&g?3SQ;8~{s(sghc)n8B#Ti!C{Zwhr>>8tMN*J5ZqLoa? z(<&Wi4<^&`^c+SOV+k5(Zmj;!fOvoLb{enKXT3c8FdlVMsa8v6m&e+%3}zoPJSvQw zUq{6`^rfl%=ri2i&=3fR4Z|Yg>$mP!e18+c(LwE<#x<5tDA3l7^N|$&YKyKeXb9r^ zq^^b*<0{Jor|jUQ9^*=j62_O5-64Oc@dk_56~I@XP5xjACsi3&;Byf9(6_2sUNT^P zqZ;3;I?uG34P$gl{j(s8G>h2rLD3u!>WY(X4L z?L;DEX@cfhW+xcNa*Y!63XR|zaqYBZud+zQyn3raDav*sY0k_n+>4Iu2gNz$SW|$T zxANe5j&$IP^R-#iZ z2@dX8PQ!3(TKO`=*rbuHtmRqDAUc1gRC9Bc1fDbivi=rw;KWG+4oJH|I*_b_RnlWy z4kAXfkb{NfB*%6|GmN4fRFmQysDk>C1NC>1Px&&%?^Ote@M$`}5zi5%Us;YpeE3$J z9EMR*f{;5`)~>8s>CC)nS#YhgO=Ub;5vwd>GxJqjBo*9^SZm^mMA~VQn%5Gc)*`5Y zm@LPWa4oq-XojsWv`|ac-7wij@gAfsk#}2Ur7jWu7SSdI_fgizdq^Q5H&|pA0%GI& zFq#kLF&p_1Pzdg%w5a=69$2{#sccpxjkb_59WH1gq}ata6jAI^s9}W2;moXCR*uZM z2szej5eRKN2mVx)+R1@yHP^}#sS3Db>})MiONNooaE?IG{fj#Cri`bT$HAL zxw5S9FPD-WONzjFKqH26keyKaQspFu9_2KQ*J)0Q^Yt1jT1jYx(R4yCQ;72ERS3~B zSn{n>vGz+RA{rnEMH3~5VGO28aEJg^^uuYat6>bW6QM3wPQy5&y-EJCMpVornxFhe zNg&n7G3kJem`(v1`=~-LT2=>STp@XDNv{cwpeL)4HF&C4TJ+d1BNqxEUoEy|=HPDm z={k16(DGUAXPy`(VDf#$eQEhXS;au<>*z{XNhmJHYRu$N@36bLcyug+&++l<4KvvZ zdKWl_*JU`|26u2s&qK6(fOe#f^u}UzX6eLczA4ZlCB6XF76w`KMYZ0Q>cOS9JrPyrTFd%CN;naV z&Ryui0J=w>&(VY1rAmA#2*)aV8l%Usy-oVTAIC5ESaK7DsIaDYBQAZ|8TXH@_A zpj(-Eq4$RCb}Sw)!w|!K&`ZYQ_&h!i$A|H8IOYUdFPot;SO9)X<1XXX{{j90<1Pe- z{H%}KaLCWPoAGq`(}(x`h&4da44Y36a5VG!k^UJP10;W2TBJYv2lF9+^w;Lo2%JWg z`XL;hh4~PU0jc@8fv-c5%QZ!%Z|To8j>80yzBnA|i^Cye>HpFEKw!V6do_;mgx6^t z!d3wH*l_e;OHCc&kN#@O?`;07f&a*cX9Iu4hGPi2swq<2X@ za71OevSs>~fNbJOU*=C4PlrE}lzA_3`K)%(#on2{HoO}6W*c6PnG1!N5BN6%zsrV$ zH{&uJegW{UHhc$)#Pc@%Jm8!Zc9u5sCyiulnUNIihVq7s*KflCX)U-PeL z|6GEIcPqii48u+Eo0uCX&?O(}59(#!Y{hJRo^(Z)%AQ5GeHUJ@Q;c!VM3OZsgLKg{qe3}G+n{}YC=58)1! zF$oJ91{h8-d>g|%8GeBw>+5(`;ZD>=lH)95xSL^w;S~&TXZR6@Uu5_UL*yUHapf{Z z8zAw$45JL+z>xKFu^iLx(6gTG`6Vn85JbMn^7UzqfC>K`x_>+UI!v?)haE4p)33#} zobWfHC^Nmt?*B2v*iHB+vGhprS*4fpYXzyglm67sNO&>Bzh{VYOLT{}`yGsbLqS?n zA%7?8kAzbUzs2z16?AQ4h&Gb=TqhWwWXSw3=1;#$(bIp*@V5$PpdL{8j1Gou-;9ql z{znBfx!h!SF+RxfYK9LnM0-l|GJmAtl5B>ke?(tW$B@g%l3N&moS_c)JB2Uh^et^+ z{5poWGWvyc^>0vFDPBh z-^%b2hOa2NVi!ZU?}{PDQNAeLia#m1ayi4T4E+pIZi#Ot+h^sE8UMY4t5!372g4sQ z{7(f}_cJ`oknKusGs(?GTwd0H zTjA$<8D7p1{S4XTJg(1qD;1u{dgoon_$0#*F#M&0)OS(%^VtsPU&;6_48N@4Ml=w_ zw{ZuII(vXS#=Bib<;?s0~k&l|aZZ+t<~X&OL$?j;OYGt6gr3B!F1xxIGB z7{8n0hZ%l?A?xqva^+_Gx__hmH*vh1E?~TvVFg1@=O*sIHXUU;w_BS|GS2mR)BTJ; z$dKE|O>FN?T#h%rto-x2{^YY=^Euvpu7CM$%*XNOA7}g;hMZ6NpJANi%|FHX_Za@1 z;r}q?_Hpx4g>QB<+{&l zMcru${t|c$n~+vPjR7(T`D7YzTX zU~v}1a~Xyh_A_KT#qVXD^P`yix#CBe&hkq#6kf8CVHLwhhI<)u{+Dn*mvH(^o?(Bk z4<%<5zJu$*j$FpKGQ5xB0}Q!ddEcsV@82x|w=6LTh zyvK1MGroz}!w#bai)1C{skakG30+Xy+Xr}9yRfERBG+mov8le%-Vq#aRbtVwePASN zC(uSUJC4Jm#}tl*=t&4ZF(M=ASBuO>2`x-x89H(pJG8K!Or6_&XgpTJvG(@ie&S;# zhsMXIVkM;!{|KGt8X4}39o`e1JQDSkMu_0`+Ct7;>+VNL?-a2`dV4EMukaiU9lX3E zqAop22&qnyM1bRi6%^q3Sj(ZKeV$|SWEQaiHb-S z#b?(`pH&Ij)yK&%;vFB_+g$Gp9BE6UjCIf@0vzzm061=O^w1^#%CW$}OzqY6fv{{0 zi~r*#hY{@1F&XS|&7Q8%@bM8}Y4vQuV6^^z8K(Mjy80$^sQpB{=fGsJW27PyA}R4n z8NjNtVsEDVCL)uQ74`c@`U1ziI1^T}$K@a!4U7MA0Ii7 zCs6ON_H+g=srGbq2Ex^z0PdDMR%(QX`aGUaTnrPPnDlsH&f%dxLmeBBtH`3geM6B! ze9r|tFoHKmGha#A$`%_!S38d?YaZlkDupfHsvceTD0nJ`Z$@yH-!k~D89t-(a-P06 z)vbC!v8PfI5|mG@7bGT?ijh!B3~HLJd`zWZEb_GSZi3v@UV17Hb^q@SVcBA|Izd(>_+Cp|r$XgBNk@ z#RdnFmJ5f|$Tc>&;9ifpv6PgNE!nfkZw1y%Qhgkl%S!?29HJbMB?;r+#D5dmZ%|P-=1plzcAl7Ka=7+TuJD>P4a0;s* zZIc9fWYJXQIoCo^3i6!esmXKQFpIoe(6z2`x_*j(jri$D`z7$DZ3ROre3z%l_X+Ur z*O3D1coXc0t@H9dsL44SAJ&>g%;d756A1c4HT^doJ)@3 zAJ)~(NAr>W?R>Am)nE*9kf_|GG zLsXB<7&8FYhn}KWnuueRiep~N^AK6AfI^G2RwmuAoTQn1(=1b7;f)4m4(+_sA z>sPP_xYn->?pf?tK)OAPpMG?_3HoiL@RVl#Xubsfwow`$)=YrRC!%oM>{m$X(E3%v zJ&S&Ym%;Bw{Pd&aP0+9KG#FASf7|Q8_m5f_pw^H2ADe#LNgmmd>PI<#v*@?|W$bTz z7XJE~MZd})fq~MjAI+Cwzp5fcMKt|rK5jR3J*tIGM6+fB)al58+m?>HCxB}^d*PlX z9d*y*eSaqW^`qlWuyX_1`b|@uPnld+I^G4EO~2{?1WtCLaqp0XJqX$j=he61AIZ>AdqgwY{4gFc8+$mf-w(cL;n;^?K7J&R(smfX zCHV1kBb9GAev}U4p&z9S;p6xS_u@xL&6g;T(yQfB+0=ZA z@*aktmPb(YCCYmYep(*sqxll$ow3PVYU9H@EqglN3e+rrc%Np<@BmA^H(n+TyLEcSw+xVz$ zoQ?1EHoon1@I7JU)9n!1Ai*v-od%8QlnyU`v&H*snDcJt)BOj9OGw9Uw}7V8TMf6C zhj+TPH(5Wo-HU2}N@IY!O`*2R#&`SWXeOx~>qqm^VA;m^!6`5t(oBGoZ%0{0soVDW z%Bw4C%6+~nuiK43JnBDQepOahy4~d!mAFEcp39bA69_d4hmKB4EYNaQJRjUo4T|hd zY0P`T*!$q_=GcP|H^-iDH@wYIu+aE&W^?Sbv8HpHRy^PCGMY;NSf1s`d*F}d=Q$d7 zHw4%HOYZKUHyr)R^XOZ{t>MI*Yo_y|02rpKtG`hrMX4p6bqNM+< zee`oSZpNd+fFb^D%Ue(wt6|=n=)gd4MU`9)3+$!S?bIVfQ;DN|-z~(=G5)ECbG&)#x5@h@uc@BA;eHw_#XR=%;?%a068 z?z3FJPo{~jx_lenSMfOIlKXZ;T)859xshRHhzv)DGt-rsmYJTJk(rsfBy(wIR>rbS z>c`_psZ<637G#jI;`DH&mKN%n^mAcj&XsR+z1ew#x^D9RB7H39|^8_dv=Q^)QhgbSJYtq+(``D$#o1Wtkd?E-bnrS$$QV^dRzzt)Y z&jz>(3~`A`z?UR&dkoQGBdv!!FP@7k>iT#t3V>)kCBPRDhUg}e?SU`FM2$n8A@*t? zfwxDE{;ohI;?8f1_PO0Ycd6G`m5)LbiO`!H^6+_gmR9ccc@;I>)z|{tqpPzq*whqZ9_=-O zPYE9S27R(i`zOQp0f9CZ`uiZpa| z<7#_+_PalVZ);T`_G*GxxV@>1K2)E_BjNj9H@@FRB>ep@g@x1lf;Wy3_YH5HkNFjE z9Cbz#kv>Rg4be7OE;DmDLH^E$mPl1Z^V+E-!E3jR4-;U1qreG+L7->_$--Q!@A}#(<)4ul3#`r+mSH&MEPkXg?hq{6tp##YSHnw-y zhXS(;ZVc`XHU^T1?QZjjg3WD#S#)X$9ZVjs5vEG2YG8j?piO?>-5F>OhHB@8HyN5+g9-bQMv%Af_#A)iLTiu!-4#;}U+@Rq|TYo4N@rT2K&Mu1_ zYz=}n6xbUGxyxi8QR!~#km7L2lAK|9^m>#yj27gnnSG6JS0Di2=L&Vyj&(ASqXdUp zsPj&kllW-9YkT4W?!bpBKTs^=-}cbIbOO{uyGk zY;GYq(imt6h24f@OC&<3X$u>oNIPM)3Gh@$T7zxwVr+;t#3XQRD3ye=(yB_3ra(eb zAyUEB-s!4A^+5S!@WE9`%4uf{zr*ri1K16Hi{)z?LD{~c zAi2HYB`s#!K%4zm8#&(ix7mD>Wx=~`{-zG|WyBp)?K^h}aFA2dBp!_1vIA5pesyCfF&do5qqB(5&p zXL%>fr;l3RrZ)3s)BThHjL&3a0jILIA--VJp(E3AeSmma#vud1gQP1>4Dl$1Kqcj7 z$82hCO_OeShKErCzHahEkgaJ>Qm7^WH)YH+g7^T*T7oGVBe%1_{V5Cb8QZH96Dx7gRv;+GaS9H%ux#{8v5pdH3$ zztSiKaJ%?hu@7n|)8u#Tlc2*(WYy|O19e*X8RBIkpfFjKKNAJHW>H=t3W|)RSj{;F zzt%xXF$Ky#59BvWvL#m2uak63xTaq(=~fhGv7|U|a3BiGSdQN;I@1#w<4B@E#h}H}upGjnb0B&}jeg)IbzVta`_> z92V)>E57xXtMsl_sR%Je&;~MG96dU@(@o=YLg{lDH%=R>bWg>wT`cM@cNg^0ha>0? zOSieZ#>R%hoVb`m$)d+4(s|z1f4Fzta5>T@4r6PX;c}(XYzu2&)*!?sGR;{Ub7zVQ{ugbpJ=DXQIsp+FG&UQr`almkNV5j!P{>?ia-QS0uQGQ&O~E>tK7 z{+hT*;T-yDv0LFB{5j#5(s1fEZlTrjH`{2Y7A-cSsY}pCG&Q~iy^IF)YtE^tV$y`C#h_%sg;$(+mv54JrwPxABb!ta#2OSF=i^7KA{%KQupR^2 z)^IRP(^pJlTQIK0$QuZLG*N9;^PCFM!ma27uwmB_)l`W?!L|ShL!-2x))2KcZ1#7d zO=d5;VQr}2#&KaJ($*g73}DVlgI?T7J3JAK_7~vByXfT9_$ZngKZf*SO!^Ry{uT=} zfr6=t=m3rQaY)y`fPYV-_wi`&5%R`Dh&gYRQ-dvuZSH|F_Zx`Xe>gfY1(o`G$H#}F;|1Gl zK^>atEAUP?Np~`itK7#AqZM=)c)MY_yCAf2exU;k5_%sAZJk%sfsuu1`dJ9=l-9rp zfQI-nq3xYW@c7ucA^sa^{hp4lf@8hIQ&B1d_*S&{NNfycg=vQP4TY%>QvQzj4Ix`^ zcF|n$An^X-D-3Z5&`@J%V1Io9Y9@qqjQ1WI=`F~QO-&rmx8ZRo6}ro+%6#xe8CR{X zo1z~c7>`a%F}85Au~paUA?{X;Epd#ta$_>yrx@e-?D=jo-Va9PGorRT|K%%tJ`pnc3wwI2;(D0JlS`8a zjDOF6)`pR1<(*vZD?*H-%RdyI#PVlbS7$pm`_ZeZ1J)V!5)}u~%ta41jEzo?kMZS= zcwtiaIfu9c%Y3+*#R@Oqbsgwu*5mIkZQ~aF{ z>Yp#DWH5uCc8a@n(CPVt?k5H_=%-xbqdI6uxMNOzJI2TQaqKLvkL^FwLA?e}Akc#9 z{^Sx5(9$T`ObSx=njDL@4^luG%1~yTOHl2@Y2uXDsC6EVT6>2^ldE$>y7;zMM@q4& zV}@dNOgu4BwO>mY&uCpbI)knL@Sb@rG}PKVam2F98#BazX*Em%N|o5S;?*XJ4_SLE zL%i8>o+?T8{%`=H=Zv}@7x8qA^JSw{hF{JQ?{sj6m;zMPbkPj)s;Fm#{8Fa4DHNU16m845T%10VM>0L zhMD2f2C8`gO$zey+Z;C!XlQTkz`LSOnhH4c94=?RlW%>vS+;xErrLg{GTYX>qWaA* zs%eH|&cX4*IleW8r}b7krFPgR`ERQ!MoREdg0|qd6~7B8AJBEC-NOGv76>5i}*3i=zFK_RCdmh!(ciW{;*rV zjiWhz(sz2fG{eVvBgj{C8cx&7$-_908aasO6+<=L6l1;vJ0H2s@4!6TiC1G)ZQUX4 zL#QTz^-($0daY}C<4A$ZN~^Bl%XyXJ8Xk){YxxEX%g5!i7TM6v8y&PALaw@;6h-uI zl^!Zv#rT!rNBf?=lsB*_eJC$;1}`3G%^Bo~UKF*zl=RM%Vdd;E_ex-^MACc(HEvl2 zD;2nAAX1RuOXs`i%heDp^tAZ*;te(4imDg*^zOP!i|@dGfz*U!JUB5)>npW7Y*R;I ze?y=HvlFxM#i?V4Xwe~NEHVY-eNZ}^pp9OFYPV7!CpcL;52K9=b@B3$xwKliZ7VJH z7~*ou2KM#2x4R1xS-^7yrV7p~VLXC16n8c0m&iZH5|6Gy|7p5WPoD#FxOXB#E6I~X zqa+Y78h$TYx|;)$z1W(87J6`atalQ(>f$b^U|X;YT|46cgUJ#Ci(K;^7@NW}QzGLT zygN|gW)t;Cfs3Nt=m^YpeeYnTs;NO9z(n?VS;)lT;;FWFDiD7*an4h0wYlD*RYo+) zHTi~fFowHrCnkmlPe{uZsQpCb-nGlkh)V4?_eIEC6qSe-W{?tDgxZ_yz3zhI zxL5cunqJa)Ztrxpw3nA+|ATXA0ylTyBFog%sYAr2QWI4gUxnC1Se(KPLv5!hD45fP zTerHkKXzoyFfrMf`hRI<96?fEfM|-`1t+#`b8kh0a0Q<#0uLwTTs4J;rS z?DAHZnE;$|)jRyxNQF8_jMQFGDrO6YRJ;qRz_Abu$y%@{pUTpY3( z9r$Y$SUMGu9p|3*ZgScl>GrG=Injt?)jMyYDdAClwq`Wf@O)FyE12q`&mR=c`gYB#%)+BHg5L4&fC)>C&5{bJA-MB*-wNE<4yAng_0Pjo|;9946pA~?* zBF&yu{wHYJ)YJ&ngRWWBTqK7j=|Xed>kW?g@jhFw;s zuBw@xDQGWJ-k7YM-U!B*GQ=mHp8m1e3DP%CX0m)F*`Lf5 zpL1^3L8MJh@hY15yr*b>m?=J$wt29(Z^F($7+2E3$B$^xyQ}4?5I>wzE5Y~6#M+2i zJmz^>R zbNnct29guY+Z4ffM4yQ#LA4UItI|DuuW(HrS zX83`FU#HQ^d7_9KNcf?HBgF<1T34ggd8g$$(3tK2Yof1AW;J~N57ODujjst*IE1OM z^ww8m3jQ;P+_q9qhQ{86aIm!z?_KHp9s00GzJk?TQSds~sWPIwE$RN6QN6?F{mf^s zyu>Y}^bQ~IJu$)SEi~o+su^(sjv>ab2kfaGx)Ws68Iqj+LV?j@GEYTkA&S{g_E);{r&xsveIef2>dN7aT=}$8H$pT|vRo$})2IO4(&d0apGraoSyo4^}|2)_Jhzz0C~+gVPWX$jHJ| zIJbO}krk&N*@H5&)MDa9N&RP6|DTiE%CgknH3H|I`JW`C> zX>zBW3*9nfE~MUZnfps#(y>!$2p-X?w?^1aGidM)b z@~q9I&dR10muto}tb>%L4W?5QMs{f%_Clt09Ie813-95LSH-o?><&7~Lw$C=T)f$t z(;=(5+<%aV&5^*Vs!M#kcn5GfgQK<{!}L#!Tb-*Fg?HgTB;M=HF8q~a*#>;R-PIdY z-);vTn~e=I?6a7}5M7KpHoG>&8pd$B0<Ib=H4#>pg9$~==qW|A+fs#y-J5%OhSt$-mtrGtVncquWMdpP44yljfjaTCgnk4lbVq+7N;lo3NoYjua z%M2Mw-w;-l2O|Bw69bWfL7%jBgg(p9cHAWXv?Q(Y;q-*a!~uI`$;=WTnb($fVqIeOY`QGM`_Xy}|EAy+2JQ!VeE}IX3uFRLSLX z{_|2eaD49uRA8#>X%&vm=^OUMl>f2~dxn&2#fCit%C$;G8ygz1Y%bH0mLqOhkyiNc zSsoSV88c3}Tq;huGM)ElWgBPgao&gWr{aWvu8I?`JQXKg?qqRNI@8`FZbh8mU8dp` zxjIgAsW{1%>HP3AR9ah{>F4V>$zR1uE)^%alEo>@R@zJA9>n?a<*0UhXtlZsmaTDyLi(|)W1~=5l-FL ze43-*%J{i>J7hnzdew%(!O2i`RJS_Dh9MA|hSk|5)LJ?=V3EBudMr9V5w+8u8)99@ zhXw|Qsn=AEe7$7sq7NX9?96AVC`^KdI@8v%fuTWsp`hbg#!{Pl`zNt`pLX7%5nN&9 zOP6ev`k_cut9;>AiGHd=PqnZ{3=+Qp#nUvmy4{?Y#k?B=())iYMDp z?r4%0dD%v06^kz;DR-Uw|G%Wzaz!QOjCck~`MdQqOOw^2ELQ{EI9o4wQ;X6k8yPfN zhb9l}c4L`=S2L&cvzKSDmhA^z>#Z_vjo7JKUG^{He-QmU&zm#)+o)fQ&+2)iKZ8i$ znJiK&iOcK7b*s|~Z^)Y~(iKY=8mY+5&t8$9BvNVU<)0JpLZtt4el8dPPCkK3jbn8~ zueQshrFSK?^rlCe*^GC_wc{9jqqFB;z%QlCu3(u-thb1(Fsnk5H?miJ&9Qk6GHkgA z%KwX0ew>>6_-tBHBt8P=uig09RGwPY8OjsURDR`~So!znXRo|Anevp~E1nY%L-{A% z$(2_%zy3t2F263b*EMaPK3isFEFd$e#hRHO5Y6Y()GXD_=eNm^tnTKQq|4ASzk zO}QJw7``EKD`@nm($Lw|)TI*vnOqbkRnA-1sIiF5U;3EV%48{f)wuXIWPc$)cSD;N zV{B;avn=D-px(=2ho&BF>R8mw2nDcVY=VaoGEOA8Qx>$s!Jwxpno#4U0U^R z@s{kg!bdSePDL5xjI6EZ7>J5Vf-)dUP=m5~g=m;&S|@v-O`+^dl|n1Nk)OTf_GAiC)4BQ=;y<9!7q=|i&?>VF zjfRo9mV$Y!xq708g_uCgr4?YAsyxs-3bric2)xOtRV3utF8eC+(zzJ*ZcQ-`9t3e5 zG85*EgQ{otPs9!D(+aP@Ak{cfV_;bw2e3KQA&YiSK)e%i{2XzFEL+8}M>HDWccp4C zHFX*ro@uh2`@~)6r4|05U;$ChX}081k>%E`5%(dguWVaLRC8G`X;jjHYpxNWK~(n_ zCa(C%LZ>t1oKl%Jy2NoMv@b8I6(1~hsCs5CG07Dstny=V5M571R=G9Lix20e72di% zapfm2QXUAJky-`9lHQLSY!O3gmsP%Hvd)Q!Zy|=?pQRWkFrSW&C5`AS;)jUn{}j!c z6uA&&)mTEgY|ot(S|D0mD1L$%zEYeRL;Q-WY6P^gs135!9u#MsFOb*>ti4%0e12Nt z9VK&0<}$1$C)E9!lBoc%{V(x2B)>S1WL0EM$yNqa%QZu?%-D6i#Z!>{?2g3pn#>wU zv}kFL4Y6Z(oR>_7l0_xk$aU`%pV^RB_zmxzQL%ZS=ko;lN3`anbr=`X~s1v82IvxZP*@}%$##8#D62Q-^>*mXN}Hu zl{1tK8dRhj8D-D8_lWno(+dByJa_h#&26&{(b4Gmp%co2t2Rty1(g=@c;H6KqXAfg zLD#Po-$u08R=Vei7RAfGE1)1ja+%EB+b-KHsR}U z5Z7%=E4;I64wLYDmA1dCgwp;=G8?+Bh|`VOS6R9t$Qq>^Tx)05jRsKX<%`clw|lFT z6hsu*$!KtN07n4uY8XZawjqbzma=-`WSGY2aPJAtj&g%aqe$6#1yn@kYFeHg&QZfP z5$nYwUP4};_s`;n&1r=X)htw}r1?9)PP1wwb1$z`ybIbqzH@=vB+t>;q7CI&-m~Iv zX!EbN3)LpcTf_}1uY*A^w8HdR1A?sCB!P;A^g6EFU0us^s<+~i{M z%x;QLDYa6{Omd%4oELD&L#6L7@ zc(NU92XHnw!C0r&gjm}?CAa7qo5JMPIMXv39f{#xhO9ORaPF9{ad0z@Hr!$5iQjb? zwZFMY{3=cdN}<-_wA4YIQaXrJDd=!|5js4)8+*j@P1q&=#>Q$LyVPOYP#=xkZO2I- zmkGvuY)ZELFZ&py_U(T0Qz;FfR=svu*E+#im$RQ7AfJ`M)7@R2|Cwc z5h~mh5I-`e)Tcg-=Y4*fuZAOhBYBHH&{T z!_Q`yxdc4aBL0~L%x>7Z1pK*0d{b)>;v@_uO#(g=N=(8KlJMoA_%}-cr(r=7UJQ!o zl?3E+iUriD{n*9g_Z%vmdZ=eE7T0A`iQ3;avsFm!B#hek?GZO;(ni+S){uXeQX!3% zH`6#&sJ_2P{CrCx^;fiOfTkZbp!Q^M`F&v9!hRz9_b>7L{Sd z#kZ(5EFowA*aSI^x)(acd$-BNN`dofDFs4H5@?(;1sZ2q;Ox38U$1+#bx$5!;%Qra5oPPdAImc z(umFW0>jzVB1Q{B*2q*5pH>l{?wKXx&+Qer70Jv`NU@%2h_Mvo#SyHw1V63feL88p z2QZn~E8btco!T?{?1@`v<54Q3Y9?`ctR1riyG0)rM%}CX#E*-my8T1r{ZnWP_l@IB z0A0WH3W!`kH8_a2=?M)0^7_E+m3IUr7!#HofiuH5fJ$cjjQbRB?(^-Lw$}ghdQR98Tf5yejjeR}gcaS( z3Dec5MD<~i1bQF3aRTVTF|b^nospTJ?JcSOS+DqRh3se&(`0ou-k+&~CZ)+Z6PG3$ zZR$l7IqF1zGHtc+CoCuRh2$xRY`PP|OMN1a2UP>m)2|(7f4H`1)Z77m0DWUdwD$IX zac5<6mCa7dcl+!r&luT4D^l*XQqJtCq;eoyX|N?{c9q4cM3qm~K0Y9xuatFhhLv^q zR(kR58ly)`7}C$8l}yLeDjjCWC)4rt97Yyn2^wc^%=uMRoI@X)%5Ofy-3<+aaM&;` z5VAeGZcplJXfdv`JaEVk4(c(kv?yVG zNZB3ocN%Z7Xk7t(G}(D{FZcU09vJQmVPRN&-(B09k(vIdI}60SBaAARS0n!7AyoEe8=JS;)aca*|`a zq8Ua}4oYxw4pc#X$btGh$ftan;`b_qLijWt--zc3(yuJXAU=F6P7cGUC_%`bD{EKQ ztaN5xv@Ez**`_j{tcX<>v6=a*Es_fEMyxgQL?Z39NX=`BP-_uXKunh7Nw|vKA~eHR z7h0&L>Ta0qqIeHdmdLv;vQn3bev4=mveYo@<2|GhkQ*#A3jwk5d>GA#@|cZ$2q*-1 zfLhf3D-W#Phg3Ezl15udm<|`T5K`=78;U6QDAX`Q_m@jajwMB4 zJfIQ7ILJ;YeW`L1LyvMA#_KdE#rb-T6s;sQ!e}}nmnlT~^eTkt81?v8saX4^6A=xN zgQAI&!!QQZBsfHXD*E9x*3~eE*ojb=E2m)`(cUC~SR*Rt5zSA2qa={(K%3$7mtob@HswSym@VX3#+u#lk z>3N8D573UZk=|I0&McicG17;R*x(y?L&C0_nlfLJ{8w37juRP*`(snPa8&zbbh;R~ zg%%eN0uPT3PSO>j#l?L?_=mA(Y-(~B-3^3YP9srBoJ8a}g`)@G$|B@QSzixz%Q(Dl zcp54kqHhID#t`(_V02_`Ai8UCY`j0Z)Ci735Z(SWf~$Zgb|P1NWu@ii#W?ihHJA^# zs3`084@&D1j&w)+rVbGtf<6;du^0}YnXskbSLrP+^5Hf;@T6b_I@EL54rzhoW8+6G zmyF`r&_L8Jhb9R&SbW0#@mC)y)J#^tyLfCd88Q%!Vd}r&yrg25Xe3!Sq*+X>xQp9i z&i2Wnk!VuOyNiQy-));XsP_8;>~tP75~&B5+V(_LnQJZU11aG|EIN0g2P5bnc|J!E zZkH*7x z9b)Y$2Hl;w&aoEBLDqA&@U_4{sd1O_>i+=$0OKwMCi(BN;UxcUjHkmNfBF$? zfS?&RpB~_7=Jg}}Gc*QB{unOlNBX0GFdy-6uZ__x0tpL8-hNJ&l@<$tv{%Xlj zY&dwAeBFj;1OJo_#}IVMyKVRy;3sT2h9yfb(>R17y-Righbo3ETc$7b6&sH9Wqyb8 zboe7lnYRI#&uRy*{5CS%Yn!H_@P_+ z4{i8)!0)i(+kyAmaKxYPwc&_A?PVK|_|v{>!x4Yltu`F-rya84h(8T7)dPJHf0|k5 zfFpj_DVu*4@Hg3Tbc-%C|G|%Y#+f| zx)9|B<=wa&KluQs$ISnHg%dA7)Sgh82~s^qTOc{UfigjyC`S^04|No{Kt2#IP=_TQ zH?}>9On9V`gNEn z6An9GXs2I`X*J+A%7?8jf7JSzs2z16?AQ4h&GP+TqhWwWXSw3=1;#$(bIp*@V5$PT*R=0 zA=@|OT;qS1^n1pS6?m5W@k6_b~jtg3Hnvu49OHf%IH9!ti>APbj#Y z?XWzL@pgu9W%vlgR}@^aiy_;0#Sr5tUlh-ZKPk9!Im4|C{R~lViEky_XXTF>|Gk2% zRx^AD!yhpGPX$-^Gd#+W?MiJj$<2Nx{oTpTy7V0uVtL|JQw2&itk)5-{<}l zvP^ph3B!}d6zLh$?yXVf2kn#Srqka34c%uiY`m?`HU6hM!=_`n$PYx!Jz%-zfi09Pg$J7%yg6!I0CriTkfjN14v; z)~1t;bA8@)KjRNFdrpCRkF znak_u?=t-vhCgNaqJkc_izkQi^B8VsSjmv>f&B9>oN#W>rsXo7KW=ZiQ$i$1{g zPch_rRrFhh7iTf#{3-S_UeBIMCoJUkSj1nwzm6)g2P8cP0!Dw$E;9>2;nskX=YmLOF z`bK+4a5PnkMZy4;OOATikZq_A(U@wLx2N*834y6 zjvl(iUpW>SND^RVVrT;Erz0^e-jA0YMzBN2WU#|Ed%8ly$47jn)w2bI(fa#knCi>v z>YB)*_7m-%1Czmyk%~x&q{Js>0IR}^y_xQdh)hma)bAVV3mo&}OjpGomxF9HEZ)bF zOMC|7BXqVI6&6+6@FoQ1W*pbF%W{J?+JT40v`X)P-$s*sNB~bD)o8x?+p2To-in3P{N=D1Azek@AKfu=kVT2 z&(-0sJq>#r6UoxEt1REJ4Tx)J5vu z7F!oN?4s(T47;ehC_`GANcAX{T;#S#g??>y(I#VYbx{hi@|u#6N@m-WkR;<5*a|OT z42$tmBogt}L}tVq>5q78q5}iH6;Ha1bG5$MXAVhQW{c_=j=;Op6l2w@@hfXy29zgTA)F;(U0~^;7eNzhE(_t zrpSjiKm+Si=A+|HuwU9Q!SR&IW$B*4mwpOfhm-In}%@KJa>-{Y`#(M&!AYu|Rh<-Z4BFq6+Q0vguO^s~YZS0;YD@FN|lJmcqx z03u!o06i;6mYZDsuucxF5yr`D0lo@9l2?JBmdEKZMK z>sJZ)Ecz7|!S6==^rPcV(68__U`V0-ZO;VXKWbrsT0iQ4Z2D~{d28^a`caPGEc$JK z4Exibg};7g(XaAeFmz}pK+Tt6zsfU+ifH=LeB5s6dQ^+Fie}9OsMC=Fw=ErYcLLXT z_QE|&I_hAP46==Wbi4_6ZXmndt(gEdUqU(>pCG@E|MTYzi*@P1%6{f<+8 zTZW&0bi4`r9UlP0v}OX-d31~=|M8|qup14pu@m<^<`jtL^Ij^#^Kh50M6?@;CmPjysI_)1+wR1 z{P2EPKX3U@xO6%wPWll}cD3{U0yvcuN^cr|ny&?J8{dt2z_q+|8()IF8$IyT@~CXi zCJ*Jslt*$kU!pv+pO#1ZXud@KZnnw8dsmYW@8IInaVv1L7o`{Py=LY6ppB2pp^i6E z-e+ul%je*G#KyP6#+R60Dx^?rB*c4Dk&Tbq#@YB9ZG7A3 z;G=S-8<&9Mg`ZjL?QZg`ua zV4?Bl%;wlBYt$4oOWt{0c&vm9N%k|P5H;I?7bsMXKO{G5<#%1SMHm&}{tFOMY zVdTjdzJzetNhfXK5{sH#m-$Ni&)Ua1XX6GtDpVNS&$_aO!w+#oWq)5~RX?t(q=m4+ zUOI(NJu)=4>|~SOLd^V1S*|~jsjy;z6$t&sGU`CwDzYkMX|lUSjAWu|4OXJ%w(W-iHGnwgccER*{0_|YjnAazPWAH&7@5+j6PB7yYXOC)*( zUII1xy8@AjJHIK~=XU$trCwiEzVx6MFy!I$?kug`>GLXTxT~=NR9qB~uoB^KL5WyX zQ|_$^Nv}X-v&lwoi>usQWpc<Wm~JeUQ!?qMlnWGjljW{?3M$NL57h+NmVLYqyK!?P}?6t!LB5aaWcn;r3IQveI~4 zb#%5j1w(to*L=1yUo1B3Ff9--Bcb9M5rD!H)uFU)*lK*{NZq*v&$j} zTZ3Q?1@;C)?lNgpD&0*TQXCF8lCuSmUQ-goXgr>p*>A{3MKvt=CRV89ZLHIH93?nF zLY*yNJAvt-PD8+&Li&OVMDBqL^}L1ZE3-D(TQ#DY4_&M?h}Ss$7Dsd@wiWHGeoW_ ztYCT@;s}Hr{M1b0AYLg9p+J=y*y7uUkmuqvd8W@6lr)%{Eqq=Ccg43g)6Xs2Gx}$U z&9b?L;7DVjAry8SjxCW0nWimlh$8KT(I&uC9cc}=xr?!h)ew`wu?bWX%1Wy$L7D;y zMTJNOS9_KRx;yUR=sgY5cnc}N1FR!dBM?X|n<*lix@KyRM5ZPM< zWTOh8sMyVSqeV`z;#)1BMH#O(Q7V zHxwkd_q(LUOdDvk-)bYr8~-+&PqHj{x6R+wVZMyGL+agR=7YWbA)oFvy*WP;{Qutc zPo67xnf@te%KOa#Toi4E`5x1c4P(!M515`wa_57lr)ikEGv_19mTZ^A!hWyi%bLX1 zh5Ib;Wcl<_%iGjuzHGXm5`giUY%JhZ);7c!OgeOAI*#lY56d`Y0CxQ5+FOGS$y(Nbi}OcVdrA2TJP%?Z1hUOAj{g?>8e06)!iM9tM#z}I)Cjc0 z*z8vtg#d0Be=GJu?PQw#j(rkzc!{i99ciFW3qM1=Oav4ri}GipAlEF)D?~w&krb;r zr{LE*C@H2u+2?`$MoG5BYWj7OZVA`)>m}Wa!Yq~)#|;idK^e>On?*-<@-ipiBE!$h zBeUCaKbBEtLJY^J;ne-FT(_s8N{5^=HqMxhCLEYUgZhS^`k_%;9vB+!AD$YBV!2dr z9LBiHnuX%~Y_*!ODitB72wH8xWzD0LJKZ!cCzL*6apQ!aO7~O@yS}3Ca(6)=ee8km zuymWdYiw*7%!vyllq`B&BAw@5{fB$U4VNQr;xKlI87@~E&9<MS`11CTr$OZcljoncbf2=II>9M z8~iBL#Ymc(YZ7xp%)P^Msf1Z!3_9;iDyZZc0y8&7L-ISj8@eEYqrz7YxX8i~FNz2b zKkw}u##=rKdQ3urK0U$D(RFy?*(QTq=^2d1D>U+?(%P;|Ut zTP>(V6MY5V=_ct;#&MPV_+hky?gDQ&EO!@#HqI|}U_nCfBcZMHYC15o5KTV|p?E2W z6yl>jL;RS~_D({_#tre`KkWC@V}e#BV4}eUS2Z92e0W z;$|1k1rGx6AHKp6cK{7Fb_Vv>7ocWBNXK~Zp^@H#{MgjQ;d~n&cRHXOuXug%MHyGE zt(&4B9vF{KOEI=^v9VY_jDD||1<1vZBow(IbcmRfh~G?O(JA z^U-1knM?_ACrD6+`<{-cB?<3Ilclu2OJ(YeVmGNuogwa4j4g4DwsK=K-lrJj`0V*^GTskHC1O|JK}nn$CFEw z2aJDbf7XVPXXX7`?JGizqRT%Noy78ITUTd$NbXM(2ds-vc1(cx-WwyBl)jpgiPHBx==h3LOcW5-ZIyaZIbwq zwWl(~n;qw=l2q>x2M~JBsOxcyO~*K2@JVI(-^G z?Pn^pZQaQB zn+HVD48@#-6?Q%-(uubycR#S|W;GqO&BbV048N+k(Nkv zpe@iDY(P%rJ6vKn&DF|yzNX*vw)*Mig1dqS1n#2-V?Bvce@h^?!0 z`zpJ)xvwOxX2eW_5orK^{O;CWP)2HCMn$h})C!)aPMc^GFvBL~sEVyK4eSIpzRQH)#aopqIawG zP}wTRuLM8ZyX>XBfko+icbPMI@i=SFAV>6~sQsm+cb*I@XMed@0$U}L<}0Xi%PLr@ zz|sDZg8W`OQ$1gtsnubdIs*F} z0v(v0n1wG+9Wz9W4l!eqDH!jA()s_f_a^XlRn`9Z*>_0NCT-KCw4tQwZF*ahG)Z$a zr)hxKYmRgpn_j4~)b#Nibb z#R09L^8c>A*FNXmn|srnQ2G0Nzu)~dU1zPm_F8MNJ@2#6-VLxuFG00hsSgtzEuDMO zMm2Tv@{qZ-nwPttmU;|v4rK#}`aByvIgu>j*#}oO#*{D?KpTn+lJraD7qG;mYtS#u zXVlY|f$Z%W570{T#NY@C#EXVMi)~$7{ed0Wnt>L2U}&^w0yo*>0;R^5#!htY(Ek^c zr3ox@&9{Ga63a}Hj7RbAK*ftC>aPN~GkMSvnCtpQ1A&T$I(cXk`QvXwCI+`XwX{-! z_`8X7o?@%bhaB2usEKaLBhG;k?vouK9~?L+J(r{Q6VdaQEgnWxYI8lOB5zSt0#=*> zV%#)?3@U7V+=*=zXZqV)u{;Iz2}03FwX~wCgNI5%dy;6HK<}cTA_9BIkM0YkrzH=$ zgWin)NisCGZmliyg+Evdrql{6%DDl5~;xH4s*#`ut(&p z5&&s8KpM7oj=vMWh{#d1#Lg{8&1kUxQ*8Y^mYsd75F$I*pimyGEJkp{;4iYl$GIM< zTBLH4MGx4jlWw)b7_4yE^$plH(jz;7*(tz_>`O8!(t6Te#dZxFuzzr zAoF22wV@b}G}ZfZ2C(GKLmXSL>=~dp?L+pCnx;>W+G4il4CHsl9Xa3ANdg|T1QgFf zb-o&2s(u=B9KT7hl3+MqwP9_BJm&ueGQ>*AZhsgt18h+odl zTxwUk;fia#&(Z%0qkWegis0S6OZmxsSsytMkbH6?a1pkQENxTll5hn!jiljP+#B}G z2|#dcY;Vsnv-MS(!r<>ST;!l-`SA+C&! zp(9)oEy5wExZa9DU6E#wD*p?#Y-(BrcFi4C`0GybDT|vrGTr>?Xi|wv%t8BAxkyZR zAb<;Pja!ZCZ_g7j)^tbM|DiyAnBM<6Ze+{@pwc8 z%^x)*KanW@fR$A`9F+L3P`(Z?epjIQJ(wu|f>li7lZn14S~{)JT@*AHS3NrsFcCEg zgx_M~vQs8uj-Q0nKys?ZpMY6RK-#Lfm_$qmR955Z6P%fNd{FzIINsC<>2YmTF2 zSygd4b}m;|RaBu|Jn5hfooY_rS%VJ~0<;s*Q-*`y#8b8~s10;%Yi#JmY!G*@d3>b) zX*+|jOf&e(HN%e_{5p+R&Lc%sLBcZ*R*KCcw5~>}E1H&PH)FQ{Y-FfRW+g)Y8|iH8 z!q)^U9^%xN7uA+y3jRxn+_q9mj>g`Ej>hJCymzHP`3hEVMZxP_r^<+~mZNXh)SN!l3^GYuom1cq@%h zk$n01ubBQTfiw)7DHeG$SBB=&f;a}ENROtglGlJAt&&GXz@9)vP}0KU5WgDJ!q~@^ z1)a6?wZM`V&4N=-iDm(5r+B$Ef_#ZAz`mya6**Hy`BT39sp9;p86F@?jP#SN$n;OC z)K^Az7Y*mbjh*sI>AvzA{MuC!{Ez@^ic2H-6*tL8!tSgXM(16FkMc{3r;(5Qg250# zdrnWj{6eM2v&ECM9~BA4V zU!09cicvdFZj^JO%V*4m)H^P7f63c=aJs$1 z#UgROGrdh#bGiQ@6PqJ}Q&pGv2JtcAat23jJ%;K3DXwxZRTSQZdylxznU?oEM@kkx z#qR70sqe5G9czuO5cXM2V2Cb89cx`#p}J9AhybeyO)|36jOV1W1A}AeH(~NfUof!0 z0^ys*-AV4e!_L`69u5}?REj(jMI;XMPs2R&yO4Q}YZjS~XOz$bkjpc@X-9G8eU7P#~7ONdY=cH5Ojb4$1~vFRAf z$Xkx1;{1i~yz3KX4p=FRP!`Q!v6CTv<_wCDLGm9HlgMZ7xT;qcUReY|sKeFUn&8L^ z)zhK0X%5n({DX#IY;f8tf=cGS;<99S-uIK{Ak(##WFm9(q`@=f;sen%SGu?kazC+P z4sr$Mc63{1HoEqSPeSG&=OR;PY7Ci_TdsS>9gz9T!nCZKBGmgMR3d5+Ku?aW8WdG} zayh@f5Dz$oHwzV*>bkqku{I%Vdq{<+WNjZ*Pm8m*_p7H=r8YF!Z~0uN!<{ZJSnSUG zX|h-8JZkF1lS}EuQ6B&5{ie7TI`3G7YPW;-RrApmqksdZJ^5K}mMA|ox)C*FYY!%OC1xvh%C7EVoG;$`B)OHlt(=OUcCuVYz` zek<|U;xfp7eramfz`#UPa74E{M%Ew*4MXZ65^60SSy*Im4^9Qg#)EdcGb_}2V6eY` zh6^grecE}4MsTr_EuUng z)CWTXV?F(Y)5TVSk+m;rt9TmLUz`4~W_^U+r4e>7aEsSq_hZYBkKNqc9S5&R*lqVW z74rq(5*MeUf-e6Tx7+S-vU}mAxD9qcxnkLIDdn=w$qK!Fe`n#7#NLBk@njpy9Zl3C zFWboE0&y>ra?^?b=Ox9KD=H~R#q&tYzpb2EnyeOOks9EJ`FfFuT9jVd$e_vEGqG2< z8z}}}%^b;2Ta>m`wjX#}X_aYf#7@m>%6G)?q5g`KW>tSR^=si-eGK(Sq4bJqN~t6+ zsukxgb?04>Ih)eO3+Jj-WMro;PKcsZI(pI9#FbF`omClJ{M-4gDK(DO4ZYefkCxsQ z(bAg%ZnGJ04{OIU_C{yVy+DnWF1vyhlUQpJQ!%STkvGy7f8Vio88U2<7sh`_8b3x& zeRwu4&KIAC@rPEwlg3kvI>UG(n#M2rFdKhecG{9d(Tu0;Ui`AS55_;{iEg~A`Lzd& zb@_Ffy{_r=gjku8IET!j7HejDKs3{n+D7TgPD{BdN?K$oT5`L19%=dfnvARt4BwEr z#Wea;X=ra~=+udTOfCwND(5ZB)L2C3FMUjFWwMl=IwoF&>~CaeWVL89MpjF&u0sF*|;qe>GS^MK8mr4K8wFS#f?EjcNQL2`7t^epjJ81#%cPJ?KYW9ESx zl!Y5a!!*-7X*+EOrJbb=TKq_M+JbAN8AMIz(%*=m!=P`jOUY`M*@Z^Kh+Ip-ywzMi zQNuz^pykpEuq0I;XdMMxmT}(QM9?Y{a%`9OKJn&>81=4?QwI-%SclAnS#?nLO#7L* zV5K|nLnp_p12qPo)jEL9nhsgC)BWNK==e2sG+Dk1VUK7qyzh$FUux7Nxh zo#f8@QO+Dx&FZ%3s>pN8mWj_o)&041Q8k%~{H+(%AON%71w** zdA}&lh@G<8eU=p*36AYKs63dOHH{TiTEydl8zqkhU=a>oxkUUBY7dorW>JgcWqXq{ zdm7Qare=*{L=fWDBVu1>+D2~4khalNrYcD@ZIey-$_vDKYutG^R?OlOUa!*rSCvru zKT2l9w#8w#5qqj-8=@>zw&7`cOxtJxbyBwYI&Aw)Wt4)50y`0G9O=gq0K6K8k%4W< zVfUr1UN{-1J~-5KP_v`lpwcK(T4oLvQMsCyDTi~^aE*t0u!t9tmnVH&T(H)icTd$^ zZHk(|$F?b^H8S@y+r^cz=HX3qv?h9vz8z~QzcODGH^Z7|tLJJ>l(&dkapYHQ-(byl z)rh!bt-Jd3o5icn^?gHwp@4k*IVwjk)O2_;#tGl&cNF{Te!LlIg-<~4waplsRV%a>X#8L&>P5gr+hBwWzydURm6AZOmO^CJaQ*w*$ z(Me2RjicQY!Ql|zWyor?8|RMc8i!}5(e65|Jn_2@qxui0ir9-ERa|CfD?QGHpBcu7jb zr&VuX+T%6iPue!RGDEp$4#pYPSJ#U36Og=)ZAjldWjtFet|l30AW`!aabunMlrm%f zGG3??UzKLmbl^~ddHCWJ_2PT%i+M_Tv0gl_JVECg%)^9R{of<%SsJ^^G97?2e(A-rshiKnx5SJ!m`ytg1mEcTSDKfcoWJXqwOf)TTG>DJONXYBB zBi+4K+^P(0s$o^TRsFN-p~A-}hi#jeWhOxBn_I<~%=oeVGMj*Vwux`EfY^?mO~Bu` zi63YSnm7rAQImj=gd&qLh$P(GD1K}S;55uh!t0IV6(s?=9A^PFsy~0a_%p}qh(Ffz zr;GEFs6_4RoY^Wwb`nPQ_1ndzNwkr*xw)w(MyZg_%ADyODpXHz7r$PYNBtG;8ldS1 z4XC|o>z?jF7bP;#TUbhgbH5}qun3#bUVUSe_~`oeIyw!BsM+?WtXJ~Vx*>*FFdHnDh;@8Ru@_0nbNF`E58l#qjSSfp? zU0j@JW@AL^NGSX-g_84i;i3#sd2-xRSN%|jcsWm2*zj#6R@KdYNLAgi!7tTZIcx4# zQ|4~99j5!BoIrOUMDY+A-S(X^JiN^8wzkJmoxh{{flhJj23hCBEwE}oN}k$MLvGRi zjNXuAugGW*U=->MnL$96Qrt<8Gc1W<4R5ifJYdgf%`7-k(QmkhhVl+;@ID*xd;OCUy=c4M}jmg9gaZAAlYR~AiCvKgM2dIpy znZ!AvR?HIY9(_OIfgRt! zGqck+ytVneyT!$YVW#1YEB8BItO7)}EHh^eOfe11%u#b0330UOc#y3G83*^u7w^h! z5N0)d%x-o!MGubj%kgNYvH9sU#r@%?E3eWj8r&leN45P}UR|_&zFysYdAE2q+#u=8 z+3h)oFRghYrT(Ah%bVXNKD9Bd7_culd;?0ZrBEP-8ij5b_N4Q zs#6&7G44~ixzD$I+FJk1>^^8mZ0&aUG`7;=6IOID2hFEmC8`&LB+z@&jT1lzj)CRU zw8W(Bw4%c5U-pP6%4A0qnI@~NDf*=vXi}PtqhV>H(WYKRk)uxZC(~97f6#iQzK{at zkWF_&c&Sgsu}0MZboc28vp-zkJ!0;F-i^L7F<5;Drp>uRvK){iEXkt9BK05>WBNqE9J5-&hWDC-il9;Z83VZh#`Fpt7JN!Q|T}} zKADc^W^u9@jj%Xrb^7mu;sp9WRetl?(N$OH@8~cLi-eEgx|;F%O#mkcwYD1{utJ*r zEn9IslA^!gqO1EE8gYA4XWcgAeO3St*}*|Q#(OPF2R@|iYN}~B&b4TrethKFP}A6i zgQ^U=#asR8TUEMb4{kIn@vW+J6+SgpLB@pq9tP9XsAtmY&tq_&SK)jvBZLwfHSmWx zWJf}RJmbLlUwCt)Ji=jxcwP>f_D2lMEW9yTbNVdSTy1Q(>k6x4@wn7@%i zN>dbnkwPejPt);@c)B3_O41GD!?)t}U>IeEh`DJ=^^&S3&ZJXQ8kZ~Il!ucQvBDy5 zWxh&_q@sJEwJMxQq)irS>vAGgTLcvmljU#{t_imYTj8ryEYvdfG`Q^4@BlKF$fsFk zWiAnGETT=wLc^#H50FAYuCvH21jPDPaGDS0F%9|PSBPOWSkzrhb}!k9RBlxyjcy}h zI$ooNkYT6WP^j3hP{U}V2WQgelu~5QsmQTri$G}02?(d6)JhMyyJfj7p(;xa;|zsT zR=2N^lBisC&?7x`Dw<(*t&pW@M+QpM&J0=Bca=&>js^K(+^rGAIFlb?^jYeW7`oM? zVZ2LolFoN)B!3B^0Y(!DIa?trq(>n{$Ee4bsO_`p)JE-4*%y-#oE2RK^(=KGl^`ZG+v_j%4L?Jp_oFMbzw zaFS3^fYq3Z!JZ*cLBYsq0H5RI)f=Xy$kb!$>_WH^w$Ort0pJ~@0~2&bXhA{m zApXNxGc-A|h3*EzE~nujBu+p%PT}arx3Y*iT+-W3-7*fZ8=8g*d+6<8;V7a`4Frcr z`-58sM#uVs3ysDR2%_76hH(|p_$K6vucWxDr~rpvybbr^78T{az5(ey!jbM^@8lkW zgRp0OG8Dq$Gvl`O`^t-o^L@BY4?J-=fe!WDvQc{A!06aM>q)AZ8te~x+Pt8@Edp`cM$2%DU@=Q`p`n z!w`<+m%A;w5kgd4Gq@g?KI~|em!0w{(OYmAuBV`0$x#n#$PTe~6oc+|T<2N0&0n|O zPB(ACl`>RR+a0*5aKi(*GzA}}2IrhnePaWjc@M31Q)Yw7uiFsxl3_SLj}OD~VSE^l zIYIKvw)oY+zo>DS@z(Ewf0A(*B9r`&+i;TqQN|Mxj(_?mmH|OCZ2r1|qnXz~8J?&y zKnlljN&jRx`Umqz;pnf;Up;UdQR*Mz=q$`1;TVvbKM(K~h_X{tRQeV^p>Z50fb@mo zNM9HZ5et8y`GLTH3+ptF_=M+b9Ksd@UuwhAe=Yc{4M%^q;Ab`*ybB((;c39XY{M}G zU2u&JUk3c34acx#!Py#zFr;_EM&K~TaHYxgCH=#OBYjE##dre3k)))nfy>`ghk*_t zsl|p@0*B4&hwxI&TqwT$0bdRL5*xl2c(V;Z88{820KejC0X_=PqcXJ$LM+i;wz?ObBR^DwQnr>7jaT|eHLI!?3k2(Yr_kGZ?@rdXY$`|IF;plZ8-V<4*XGhDo1%ic{gsxpZo!*pPB#J z3MXFvQF~(K8%875W3&a5;}Mhz;zT);@JZBB-~#zTxIi72bd)0rZSj&go`i_Eh~p7X z@gyDbB(%j_!0{wRyd}h+h`K^BSwREwWH`!4D)GZlQa^BbR^n1FaG7$1YyOoSoIc3V)Sx_)OB#&aWo=o0z%+lARKwybxV@FjFPyWgKN& zhF3G(%CLiB5Az3E?rzotdoxLow);HHya>Ml^F%xSF3j-=zZ>&Vf=?-V#?Kl4h2^77 zl6Il&NVuKhnGE+agnSu}_D90o8Q#wjev$N_F@zrocc3guh`J)7pW!&ek21WG;Wrqv zy$;k@iswY#kr3rm!qXTA7`}($wG2Pa@S6;uXNY{F_^u3wsIwB^!4UqI__++(E*Hx& z{SG^8$*eFUUXjZ1bcX-V5apA?9op|VF#d>wv;;!oPSg_#CmBA<@TUs8)-Xhy zMtrV=3@>KL{4VBCc%Pytyu|R23MQV)u#F-6H}MX}|EgdTmz$(c#s?U_pW!_WF+L!B zl76D#0`$p*FF-w$a5F z_A|Vd;nx*RaWh=O5bXfjnKI1qLku5Na1r}qQ6}T93_rr~yA1!K;NmR|*}sbi8Atgd zJ&WH^aLFQu>lxNCM7brtCG4LiFEIXR1yeC>q43m?G5it3Unsb=kKulX>{n`oDPG$7 z46kAMGDEg2y;U0}#hMZ5?Utyf}W*=t!Nrt~>_>lqd@ zJe6S=!?PInG30W!_7cXgV0azFTNtu^Yq`9xeS+!FGkl5R>k4|=FWz*lkvrt*c|4 z?OMm>XC3F`Ixau!KFEAmDVWQ4ZLLRN=*3K8m?s75f$49PeS?aH_+Q^M(qCQHVvY zLi3c`aifqf6z%B++^e6k23;uERs*5Q-jSYR97R=V(eU1WIA|x(#xgsO!<|PJj)mh1 z2tGJ074)e^VWW^1lCf+Y*o&=E*vF;LS>7`iDrBuay|__Qv zdP94+H%{yedW!=@C@QkWoVhmLhnPi^#1;s)wY3BrDjEY7#Q}9mNkmNbvKbK$43trX z;f}Vxw*J!k-2+vDPI>0AErQ8BGDgAz`$JWoeWTlgXC5pIRFFQqUHWWE$gVs?MVJ5n*?YjDX`2NA{diQ$FhNj}l>cd~h7=rNbdC){n_( zd!}Txy;a*gn}!Yy`-&@LMT67&`edBSbLgs?z@FBFt=`=ejcvnafhLj?o|Jy90xR~d zbU#F3Vxp{e=Wwrost9MeD)z7(WT#=VK8#%GGZ-JHv&^WlsM3ZvA1F6txRza(8yJo7?+vctJZui!DJG^avZ_TEr;^MBRQeRh7 zvCq3}Q&mB9;z3=bn++Mf6UZE90w>5cN=^Sal*I!#x z>23F)QR!`K_jgo!{kRKms@P~6?Dcxvagj@Ke8TI6JBJ2)@mKQl6Pss{*p;s3)iXKl%n-N`Qu8bZtcW2a8&cL^4x>e{&dpxB+!gzJ(rBw+? zOgyz9su->m(h+ggiU=8$-&Q`x)0{*R5dMOxk4%ZDC1Xj{9M88naNK#71sT^$`y9%! zj5+U8pkha~gL5nbHW~BFe<@(znQz9PXU^-&A7|ay_r(%>9Cdw89iEkqkRDH6j;y?h z7Ej#`yXTe?5=ULN@&^&(shbobB1;f+4t0@wxB1pZjytcqDC5qnF3OlzCQ?0$Cl|Tx zQL*1%U9`!VUtN>}th}Zq#FN?fBt*&hIkv)c7{g+G6bJ--Re>2=12~AkueZFS4=3{D z*WSJh!-x3U{X06g%`pN#=2e}1ltG)>`v=%n=Ew!RtY-x3p+V`)AdK_8xJG0~6xj?` z#-RIV(q%?h#h^!#FJ~@ZU&%W=g6wQ;jyZrVlq1^zzXr5nW7+v_DLD3U9dcIf8F9a4j2; zW}Kl2zIx#0#K1po1JG3lBM{)H}yCp)Nz?x?~@*Mwwpg80? z&x}u=3u`k`Jl8)hFCyQP)`KCMpCkFs1K*8W7$D1YTx~s5=z=W#7osQrX}$}9Ya8&m z0OiG%ubFINSo^l~EkZhsoSA%%VbHLCrhkimfhWB8Gq&I_8-G-u@#hEtLNC>2`Yrkm z{`1fi|FnHYz-{strvOjIAIU4jpO(kz(DD{%LhZE(*FT*`_Mhfk{uMBEY9>I<$N8rD zRv-;d(yf2YC;kS4&AydXC$)V(Jjbwar5DWsrCI;9-U$2FkgRQ*2~hJz*tcdERDE|Q zpZFeVHv87YFQ$E17mj7$`h0}JM)RljM%cH$4IG!7Truri{~~yz*>@G_Hv3M#4Y>AS z37%c*&k>QoCsV$?h(G;{VP6i(zf>~;YQ6~n<$4fyAO7@@`9u%|n|--20@wCYI~~Km z+}99x5&rZ~>y7YV-ZU6GH4~ubi?A>62MGI*nS6r!ADev}NZvC1QT-^zUkv*;z$Xh| zM7aKGy%F}64}qagGXZM82>Z(KfhwZupXTFsL)W9~42amOnE;uO_T1RhvH5J^+RsIJ zj**VdA?(FL-86q%Z$vuk$S*gWT&7;x#v+ckuO9Xl|0xRJqoCRRd>{q5wh!+IV%c{f z6Jf-we=+PkkOKy?QU5ewgr5)G42GvP6QJh9I|RFZw7hDzyX*0+{TI>hPQMrX+-^g- z{%Lu52V=^{2WL;mMI=8Jf0SOl_ln84*TzTX zQ0tA9H*MovGz;HFHa;3_X?c<9y%u2^_#^w4%)<92gk8>jlpZZF!Y>~=4Pn|ZX*NE* zOSJptBNR{bonYgOuq zEWV>Qz74VYE+L<3y}BKu^hfyRk{r;8PU$GZUktsMAZ)?S%%}SgiWiZNs~!VQ>#fAI zmUkkao%rM5RYy?m4{Hoiw=dL|+W0<>c~$b!D10Im#`nov!LuilZ(~VSsmJ#7l~$Hj zmHK=YMII0S;ivw`%dYbBa*wC9ytqmLmXdvE3^AK^#+OI)Q%sqa_uO|C?ftBSbJ-aB|U$4VUZ z@RJNFO@)M{tf|L;MjDTHo$ETqQnw940qi}7f2&cB0B!c#vf zg-Sn_)zgHS`K7d66Cu}O6$7gx`m1U5+hHr)s^GgFB-VMKQ>=72)Ys7B|M`E0|FPQ1 zzkiPZ|Lgw(|I^@Re&rvF)BKY%==nI8|BKyXy)OSo(OdXAkN^73oc)z|R%4z?!lZM4lb;omkI;&?R9oL=!Dr_GH96#xEL zr0pI`oXeFsIYMXR;;Ub5wgIlMa&@^0$MvYcIraNa(U=f3&&;8c6iA0h;jp+49Dg+! zs>f+Q5{IUX2k9o!9$JgnhwtKh>)o{APCPivW;gB(*~8Cg_73f*)5zuFcL&Uy4&get&y+}_@Z=)jh~pX+J+^Zm_T$6 zc011{0wPT(^w@|ex<$eRpu3$@#GbG$A$>(czgwJ;kd85@_7O(Uj`vYQsV%z)&or{u zzdSs&8=_0&fa?{h(?(j3=hF>A(`o%9lGhM+E(*f1qg{fip-F}~1EDnJFE_*v0QnPm zIagoP=??@v*$u&7kH_aJF7j1mqmTvy^kR$xd_|jz%QyLo6t$zXz7ABMWRVDelS{;^ zs?wsWCK=?f-)geav&B_fRAF++({Va?w~?Z-nneasw6@On`o@Na0P|2Kqo8q|2{$@` z^V=sprFO#5=*XUMN@!w?3APV>mG$)baGf^HQ&v=7R9ajtrFG(*AAe_{uB|Ij*NRV` zcLnfWv5Le&4G8LJZRn(r^p6n`@$Iq)-!4N5f4fX^@o0U$97YKHemN|}{DL`*IwOfl zAEdK|Xp^ibGjljWHSKlV0u=$xYp0TgBD-HCZ|AnI=2~`b7|Q&Jr6tG4#m zhQ=m;q|yd|O(%{!3T&%sYS`J@ULPJwhbsM)d=yocUplC{tEscGt!a1ki1n>qwN3um zg6kW1G}im0$L(sVX=>cs;*VidUDKJ-h!nBPutu5TN^uYuRBUyS4$_m zu%@l9BhX0Ky~Ez^EMj8se8{<3tvK})xXgJQdrl~1V)6wB?@3hE` z&5dAf^6&6Bc}k>DsdP8ANpUz}N{-m`^;)0!0Zpi5_i?&?0TaGa7V5Ym>vSYXArACV zXTC5e@zEN?O8lJ!bs`yce1i7Y1onCiks|jZ)HOBMhE>-hUzH)!1LPnSx&So?xQ$0F zV@jYd(9zYR#dWJGFJS|K%l9$Wh?!8WV=TH8DcF? zWbUko;6S~E&IY^Tr zp~w&^=lw;~6$9!A!2vaOr4#DIS0UcQ0b}Jv{aC;<tcMKXFKe4R4ZHD+6`ZY2nWherk&zUu zIj87{9F!DOpzQNN{-7jVVm19dNwFQg>d6drq8Xqp?67 zy=xHL3{GqyitLpIL5yRw~++~$M%CulLq%2;_qPT9~_^-W73G}PiQb(TH6qHWHe-m zH-YYKXass-V9*dBauP~8a$o@2aWT*i{|=zz!6`#r3AC}JHYeB9Kk7M`sC|2b{gW`M zw`Xi@FgTWzTMg>qcyCV8bc1}3#_>MSfxT!2Jvl{P@Z3!hT7PVz{c{rfSrXcOOiTNR z=VIwsArvntkwSb_X^0mHZEYuXbj%R{1GIK~TW8Kx&(LI$$^gE!C*ISbDyy_3WI#9$C?jrRcj* zgsMZ1lm5@2hx=$TgIuNrcp@Yy$33a_Z2RZxc}eTp`Onq!3iQ-9!EdqzBK2q?NOeaI zmC^C>9+c64fY7A~lalapw=AW#ohnmj6uSvk>I`wSV%!$SXe&1+<7X9P7@s}gO~yOH zhdp1+XaV5)_`DTc3Dn_V22IF@XSnt#@JH5M8p4bD}vsM5OpI0 zy?Jom$Ky$UvltmMeE-668%7?N_lMR05Ml&f{+{3jmO)!O+gqFDemJq)x`;-;;}W~6 zsoYaHIx;af$`@FQHe>VG9O6A#=EF5JR(yKLCU*BRYxIcKe{hHkXs|(=8{0bYDn-VM zu2wQAJKBuuJDlR*bkv$-MU@O@)FV!Dla4xltf;$)!HoK4m-w8H+SbuFtG#VwqkTAf z7gy-^?Q5f61E)G@L7U%jiMwcNlzb)yDSu6jhFS+GqKsuIx6LM~`aZWftSxFjhDFUi zgCo(+xgbIOP@5yA*vv6wu{kClnW*aTCy3{@Ep6?M%{3j{kKv)g=AQ9=mRCNQD1N2Q zFa;=6LSu?oyCghj_2EQuzT+fSl4@%@{D?iP>RQ|?)HcQ!u2LEPTcWta!5Lx-P^#(H z9O6}~XT$oKt_2M>c#CpO$2HK1G2C^B z7l^yG6*eKt206l%{3;DI$O%Z6l)sCwjwn_fiYKoB({3t=|@JFwvPo{i8 z*Nr!#eoV?r0^0&x{Vo3X#yaFgw!k>rY zc2FPuJ|sJQCqj%qILmA9P=I6D&#W11M})f zyc(-$>1x7$gh~QfAC*I`x4VWnh7?4s;TfOdyoz%Tk3}4}e1nJOFLHlU8|{;jt1cId ze0sM^KPqDd_$$O8?JX~&yn#pQJOY_Bc<~rBXOJU$QPloYvgjBYR?6XW&jhwiM9o)F z!g44ibFDQm zcRelj7~&kt1`hRkHh6L(S-`Uou4;@aVJv_)6c<+Mm&h+*iAUFBt-I7O~10me+J3c-*a8P3g{DrqK|56MNRCr?SF9&j^p+c+{zh$I(3Y&RBED1<698B2a8jfVW{mC zIXSbsaQ%9Z4#$p+87?LtQ~xi$jFVnUbD$>QlXEaP*Rvi8!hM3O2vF3bX*wj0ev}6~ zTK^oP!7m?inF+wTVLe0dL@LzTY-IMFQV}Z}QgJ0xfzvnUlC@xu$X6u*(r$n>Y(pJ? zCwvi+qh^VnTaKF1VEw1q`gbfl`&1!BcCJC8JXTqZ;D*6pWP^`$JyNwuKKtSwHSzf2x2E8 z7YA1c``?KIOD8STk1MZ*&fWxBe6r4)D3b6gH@%0&8h-qa;Rs=Vv4lY8!)|IrF&t^C z_vH*=$(x5bwqDsYKyTWI>>V{tpB}ZvY|9zQ?~FTgzNeD}JZ1?fo`dRqHM~^)G~_sb zlVBymaJ*{6+6>2UEwtEh+`iBnrK&N1lN_Jd&Y0K5H-S?pb;*IV`nt=dzML`QduPwl z{|Tdg{q;eTOZmxsSs(G8LYo}2$cey3*fO%TO|eVD71%VAhHHv%*e@pl!LhNuJtO^i zX}Sk5+Mg7n`eujtm^fKCA8ODrUEVyM@{K1Zt?Xn_Aq5Vv_oss)Fcpoi;2rlnS?oh z5>5ljiREpIW)>5WwuX_2>43^=Jbi*Q6ORvS-xJ518X-NdjmpJ%lt1!lG5+YhnNnKg zxY{9=%9$cokHsgjLqTmWvDPs^<8Zhf-;4|}ocB1KF6Xy!$+CFRQSWc+tO=Y^;=@F4 z8a+2Uxra2-SB7~Ab|XKG4QciC-3Z=1fTG3-B@Kr7fupU_Q&Q+F^_5i>mt*I0WmQEL z%Eglo+R&-yYuhV_{ubcuUs?y z$ic7EXyrUoL=_}F<6x!OEJEvQl)9p6dA2rY`_D#(%4Aj|<`i_S_os+L%^;Q(T&ULDc=xT|&zh*@5u(^f#%$1k0 zg_NG513d@FdA)_E+}|@5=iu^A?0Udnn{ZR|@@OWhLJ{EsGXlLo?C8|dB4g#6F~0BA zNo#Fr=-Ad2*8x+-}M_|YnPLluCVNRCm#EKHS(T zpOo$^pTVzP6~PY)u%@^)f?siyd?f77ieYr#H8?%Aq<9+nxGxwC0kr4z(*D@ye>>h#B9O506(g zweAe4ud~j?hQ!vEfS*3_LOc0fl%QSM(uEyi6^+>b-P+Q$8|%I?V!t>Wj})VJn%pSo zLYL2&3#oTp=Khkm^~#Gr4YOuV)_KJ=w9%(wlNroIFWvNh=;GJ-T?+4C(FWN>9=Dm) zaoMzDeFSb!!`jGL+F&|4Zlo2rU@xS*ZGQ!(TX+v|yd@4f)7tiWkW0?M*;wtA-Md4kz_lWD9X?eeMq-5c<@y?!*`ewY* zvDU~6VV}hWhUj9{vDTFpsvE_H6|joXB>G_eIce;`;28Q%m^{)K4D7E!_-1i;k~{CP zb2gEO!$ks>B9BB7=_`ZGkBRR><~6QaWIC3I$s|tWC(;9#Y{cS=$HI)8ee{{pu-IsSOSGTRxZRaHoq47Q6F)n(S3NkD5C1 zOfGL=p|d7|m0bh7=J5 z=j|z|v^JdytF%rES32oQ>7=JW~&svgR=^MO1uW)znqhB zYF$+}#1xL6$Vf}{i8mnpFiszfyE@ydNNnNMCUWB=Yhfg{vql$RU=<3 z89V6%2qP`&c`6DMV4=>md9;6U0ADC*Jt-`;p{H*GyZ3459U8&KMz(yCjZz;B35@mh z4^9_b1xD7sq^;sbKvD0ehbi@a33FTaPe=~=VHl0vu^0sc6qe)u85Z23~-yx zczako4l(HLxfiIB(q&hWViIdDVk%};DDp^MM;Y+MN4iM&m%3LUz3s5f#Dkxx0ptMDh=%o z4V^j>kjX_sQsum5nHr18{H2d+txT4(Q^&+>ko}G9jI0(d#>i^vwLIgv-Dx*^(7Z&rzIyvF-VRsm!2iQ3WJ{U#%T~ua?CtXgR*dgXqaYt zCvB(AptQ4;L5m;BPFrwoG=r$=T>2aFa~Sl^btzfRGP}@d7?Eo!n75j%Cu&%T3A9{V z0hXl71FfTA%QDX9n+RG(LXPdy-Y4EX5u@Jqaq8ef5bKbcFslx#o@qZ57p!#Wedy$P zb)d$;vswqRS<@klcDi3&0Uf`FjwZ`jA?y(ihWB0Z`b$lnMu%p)Ed8_Mrjy)xKgyYd zs#)C@T@`t5*)s82sJcIQE~;kpUQ|`mfy+K1z5-Qu=0&df$U>(xj%TEa`o?6&M7(1hliL4YJi96la_-5ZMSUzf|0}%AI#Z;jEIm3~R{|b$_O0D!|KsB_4+4 z*N-7t6txiT{DJKg_0#vqopS${9)q4JzVQM%i=Xt>Su*JMR~z8L?9~ zyU((MBf+sf2bBj?v!=0vN{e_raHHhW04&0xE0>5LLhYe)&n#+Dylih$W=|uU*VL>r zj0i%!dPMBYOxwsU8PYa-%2Xw3rfsqbUwMHzZ;d5!E#eXvi)VIId?Y`Ke`Slf#B#R_v2+0rI z7ATUy|Jzf^7l_!4JVO0O&RPnno8z_a^h9lAjaah?P4##1`k$Ko~ z-)Yz*j&H)wsHv~7)Y_#D(}wzJ-0nM0@|a98-eXg;<^QseF{&@C5idz;__XTnOMARV z{7KtJ*M}(A%)vOL`s!M7egcx$u?^{)r;KN7#nmL^3?yovB5te`pHgPbU&ae{;;Yh( znhqQ)Fb`jRqF#KDeKAi7FV>5vl_%(2gL#;6t6%(*{V-1n&-umcQbKcAM}53T7}b|I zh(n1~4w}1a<`C_B4dT*7Y(J#hp%R=aD@7((j?Bo)k%^||jRx^?83}nEcci(K@%ro zFlrL;kx*n329bn&8^w<;0i1?8NqD_cyrLu^m*Xs;M)l`U7k}nh9r4F{{&aC(5|yZ3 zoikg7$WFqjzJ9y7G>JB{Ha9ob#3&WgS(!7PLxt+;?c&$#@~FR}T>~`zpaHcvZQauy z=%PdhdJ9V_aPF6IRYi7MLVNX%P2!{L*X!ssB%)^9o3=iaqRS4?79Cp)x_kQis1McM z8^pMOTK)4TagR-m*(0y-lVYgPvWqzqDdq@?IcM{2&EoSXuOn;lz39%eY` zxfr2+97m1K_q2#hbEHj!BU4fAVnfI_vV+ajropa{w~9~C5MZ;71(1C#fJ`I-WS*hT ziDui8R`G@sjgj^~mHX07+CAY`^|Mv`0YwJBMWta0J@$=`)1$HZ)i!Zmu1u^Hcq}WW zKv+ovjiaVO<0uP^ZMzPkn@>!SV~vMAe)tUWYh?s^JR)VJ5~(7MQOiNBls(ceF3vNv zF(P#&6#kb&$@#i)Q3j|yIc}+|eyBsdoF^-6_%;%&>gGPAs&3femujw@HFv8ibGO4tn=X(ShXJ|Pi?6ox9EOGZ^*G% zWV8n`3OPt-5KyIbU<}(VB*7Z)W}+eQ5&$i5=pWf(_K3(PvNGIvWpA8C5fhb3(0{ zCD=XsfG{?{wNt!MAkFO?9P67zQ@C>sX9DQ@otZ=A+R1?d>~B$hLlX*c((?z1s}&nb zgP5Ms03fqhGGVhW!t>qZxX_6ElCeHXl%s^+q0zp59rVV_oRJ)0DN=|bUvg(=r)_v^ z^LKZPiwna{!y8xbcf42yh-z78&KQ_t8kU)(<}woEXwmT?TM04_?v*dzmDwQ7YWA4j z>~4x49O;+i(M)6W(`SnN!%bISrByVzM;wl7`?0*bX!(4-y7}^M@oKn1(wDQ_a|~Zv z^Fm7fKh2jnze{{-V^}d@U!p?6m80`=W#Mh}btQIVJeQqTc=P6$-Yp&vw@bNnHnWc9 z(NTC(ChDK*(dsXpEiNyU-9qFpJ*#6VDpnoCE;1)$x4qr44eYvcT7&Ei28vXtFyLd{ zr*LzhZ}+sd{+HQ((2m&J?e1x8rNbwz=w1$*PrXW1F9u1V_o5pofDRl3%cW_FN!e*d zh1I|85l@uKjwUiqR##K>OEu7>G#N+3(nO<8y@(=5o#!Q zf4@an_cJu&7NyR*ZN~eo035P|gL;hjT9giaNZHj?({7w=(K`M3$g`oQu?YuN8Fb6K z`q8(lSY9&VMxzqnsybKUQ&SaWyjOk?v;SD%>%9F7`DpaOALNid2?^>Py1#{gkMqCc zHph5wa>O0i@<+bdB-R)kapAdR4G<@8K|G-m_wc#AMso5g$xd9W=T>)IrMs5NmV?{6G7)%!e84sG%aakL?(bTWY^a9}qTv!RL@-wBa34l> zCn*kk%p^KJtV%WrWG#Z^#^sd@aM-_kGz^cXm8KZR8jU0;FG@~<={Xh6j+bL_WvUzd~?fsYTtjWcQMtNaa>V(&#o4rsFkQ z2pM*|4TXyB3N?%-dT=IfPANs^oQfQ4wg`l_oPcmDO0D#O`(BpI5~{M)FwRgYWp(=s zDT&HO2R+h5r=l4~*9uvhc4VM5?aYv6eOIZJsipyK6`Zy8@Ia?trq(>n{$4JSSshTVDN#ZVqH?Y+c2g#^8*|$fAjq`6n!5i?E5@tmG+mE^%uX3 zE;p2ffIObqr6c?t?fMg#bSAFt~$jUA`=hm&~4h68bMZ-)%rLpu&=7u#@8C`9L+ zjvpNE#fNVQ4ZBrgOI1~gFJJywUS5h*918kElUs1S`$TZM05^>m6bu0G7#*0P>qQF+ zdI#|z#;2jli7j-W5Ozil2O)6+%5ic>H@>e$%;A#WZtB8u;N8$POn`cPbBJTGXf|Is z3K3HS!Qs*V;Ff{WvA*C!qj3ZR>E@teTq88T3Ay7dDef&Tz=0WW!;QFsMR~DrKzfmI zq(9g@xrg8&*)&p%TXdE~H%8^%^30EJ+*noULjjp8 z>#h$@VauEhLpY9f?zZGc2vKp(;Cfsnv7=F5q{=5xZ^1pgo`QNMM?I)%0L0o+4CLE! zMQGhNf8BOF-MnE}%1}{l_v@lU4iDfW7JTR$oOg!xjSYB|tLHna*6m(6Ou_vH<`2DU z7>-Zy!*G0jABJPzk%l$Ep-^^D3Z>#;g!I**zi)!bm)qC`2#lPc1?$dR)4aZ$(u1p)AjVkd|8@?X+Z8jXboO^BfO5pi6 zJP*^*=WTd7@at?i-pe}d{=j`|4wO0dgZ=Q0c+`gDe1BnaDg-vUBGuTyqTdbUJ}QX z5b+jqJi;lSq$8e$ws;FTo`i_Eg!rjW5=2>(bi|VoWjmGlH?w}=$N`BM82(xpi4f`C43f>a)b+%5yAz^hJ?uT)r6yNCMnYKFHnyq_WbD8qlo@J$6BD4Rrgpl(X&XE@IA zqYP0VWjNX&3E5u9TMBog+z_4WyM(7P3@}9bmh@{GewyJo89vYObp>4+4ADkVJQwPZ zgh7VqGGx14EXVXa?5rh!ehXERAo4|)C*)Th;a|h>z)n986L-Sl$5ZU|Lzw0h{$Uhd zrsvzkKaT|l!oP^+Pl7KhyNuTq6d;k^B9-Ck4F8=W+6)SJXusdU_#+C^)RDrSl?*2t zKFSd7vGmIthG;`2evskC44L1>{0UsH6JAo`34c^D5%q)OC$=$U|0dqS_+J%F;&PM3 z^(Se7>F;NF55p%I{zSnAXpc$$0x!eO47q$PxSa8a8R~d{Qusnn-@C6gNY(Ya}NH?S_QI3_ry1F$EW~9~NaY-pcSJ48P0p z9||ts!jS#Dc#v_FFVeI44F#7hVz{1R4MUV$;#x#(r4lWBfvfH!@^7C*&#o zgi(f%E4ZBVX*u&R=X9-Lf35hO;>+N6G2;;9Z0Ct}3O|v{_laL({1pXPu42gLW#tbQ zeo_&`a~S@BA=l^3B?`}EyED&be1hR88U9v5>Z{0~tJn{#-plyq4DVHNH5v%wTfLEC z1H*QPXENk+vYPW}HQF&5?_q|V&#Sq9uYOh0X_`QMo&^k-GR$Up2E&~UxxMy;7{8g} z?F_%bknQ(yx$>}oJ%3Q)Ygq4^lNm2ySjLdkxrY0%HT#*)?be!$8Rz=E=1#`%X2|X1 z8us@ZF2`&Broywi{$#UXvsrI8*T3u*=3~9t2N?eVL(Zq{uQ1Mfvkx==B*R}b{5?Z% zAJ;Ba_*xIc^$ZIcp31O`;aLp(7;?Ehu$&?L$J@zxH^Y90>@P3-$;<79_a+YK^5XpliwOfuS;N< z!f+YGbqqP**3~i2cCF*`vySs|9haYVA7s9(6wGBi^0>a`)hK%2dl+*5=5hJmP^{=1 z{+;1h89vI8{k!2ejK85^KFiOqV4VG!Kh8L}^ZA^g`JZI^ml<-s%KxLn3z8Xf{uC53 zUdynJ;fEMr&yeL5u-^+_U^@G|;O`1AWch`sFusG~2*Yz3ev~1PPYR!AoYTK?slqpA zGvs==k^Q`}mFe$d$nEOJR~i4Sf<^Z+e25|Q`PhFxZbyArs_GK|6sq z%h_=pSUsw6ENo9e@WElJpieDU8-=vcjpgjXUTpWm-ZXV~^q#R$A#3gF#U060g?q+E zCqsqBftq1DQ8qBt8``_QabjQ4TO1%lQIRcX?6vbgNZ36|>;Zr8VC(ome_vg1Pe5J3 z5+OmoKu3fF17#FpxTCGFt-rK>_dr#kQ=X@6i(oR3jFGUw{!mqC-{`jBnFq@P6{OE@ zpFTGevMUczSfFTZaL3kKpMPIV*-T@w02{=+fRe(!WPOc{fTJHr_MA~uKI-p}5@C3J za2)Hl!y&v>7?aWVOvz|_tG0JG4ILQv6<5ZJ2Iuwl$vBng&^0`PJ*@{@y}KtG+lI>m zO(Z2eDg9WDR_t5p?u)?0L|N_5;a>k#5zePo>|r^{PQ%NDFmj>KV0@U)X`@1;N*&(N zp!|&C%6VCSP!`7bTF-P*Fwu=#Tx!){qwjJb_j)_GHRB@knyFH6o44M(-COJJ@V5EA zHJh4>i@TaieO*n(KJTtgO+KHu1C$O>IzVak`~CQTrx(XpckC$lzQ3b$d)@YWg;oIF z*5qxaGqU|&e{D^rx7~k6rMIo!-%;uHzVxwuW*XwP^B{jkE39lFK92)FJqI-fp zy@P=Pd{t&4cn1~x<%X?vu`6^1^s3V4MRACyxP|-Gt4kk6kEi&}h^}&6Mvs~0GpaG? z>f1BjstKe$o~jUGyt?Gmsu?6Eo~jX54A&Ith&ZZBgbZq=tbB~8jfo;4`WwPN>76*5 zIhIIm_I!&4$DLQ1kZ~;^%%LpHnDZ_TDt1I8Ime=4lQF+?AO+035SX#wW(m-ZL7Z)Y zzA%^AJ_c*jI(Y>R^~YCa@a+`l#n>;u9Z)S5KmpD2r;sTQWt;Sq^@wjb(7=H zt8U7;^QxONrj?npEsA5%!fla?{r2jnO~(A{rW9c1IVB;UOt&XtmI5%x)_D#CU<|4P zfk1IZAg1;JZYby}t@8EZP;&g*+jr4uWX{q4KlZ)_KJKF0|2O+c(l%|=w3N_>uuVfr z(zImr4rzf+vT0&B$&%glMRdty(}t$WHjk1bNaZE+5-txBxPXWVdVL|HB1)}@i0B0Y zc?kF7yA)JJ&?+eZ@0rK%mER_tP`Uo^|Nr}BGc#w-oO9;PnfcA@Hxt|xX`W?5eDy3k z2M#?zz1I+vs?>Wt*p5CaQgtaRCP$&uSb+OhCMDs`W=#^fe=?jKLTwVb1ARUmD)5)T zx82cbOKZ~J=vv-A{-5d{TRO(?Zhyq|V*t?aqMzJ>fgLW`KNX*7#cjw<<3qh;1Gp%- zYl@9k_|T~jL)-4bK04F9U`)eUT?_GkJ6{sb_co}FU0T}Q^wv49MQn-dXnaO-49mw^ z*0j@BYbaY=T8pK;Wh~D{p!v+@)^fBw5B$q8+UAtfvpM=aid%pglGGp9w}DG3Fh9hf z3j8P9>XCjI<_9f!STAwJyUT{R4q-(bUOmmA4X+;I2M9qvlvjE%FUI-u0RH_0!2%U9 z#f40McwPDUM`_igv|^*@`cP{0+_!^J3iRA5%I8fcUmf@;S>g3UKCKZy^{6;I-T@$_ zfQPO7so}j3c$fp!AH~5ptuJu)AzD*;e>f_L63m}ZGWGR0wj-Hf-e17XY&>W`u~4hZJx)U)tH_^`I9 zt;dhb+9Q6h?QoIC1&5x6m*bz0eDYEBsD7F0{RhHX_z}HI{1iQz51rlvV0#1N)g$R? zQqKx6hst(}^40O6J9nlc23N^P{7v#LzZYR8pCA4t@-2S|&B3dPS5Ff8^1lRxW`zV- z;Yqtv^5q`}E6~&*iO2V`nB+SFdeP;>+;cMdPIwG)1v)i@uT6g^yat@B9Pn)N748F$ zlYBP=Zj!I45n-jja`-*sr|eYaw}{H@CH&N*^kS2*xB>{5DnPCB(O>QQ_{0Kl*K21zfsDI^icL$-VbAz#@W4tPHT%p~6gm4%WI zYY@rgn|J_mq(k*2k#FJ=Ana2}a21|SzP)G*R20Wn0jyJ)E*I}5vTN$ZNkHPrCBeR zne}&+3D3^=A;c;9mQR8A0?hji#8Wae@B$LXAjqep?R|=2X#$C z;9Y3KQ|%Dx$)=YpZU#*0kL)@b-#ehr+YnFrtw@gd@kYd{eAJlmj)C8epL{;vg=+t( z3c*$F3$>*tyc^L*Wp+B?v4jQh&JO~I+A#HSdM8$tmHSMOzoMqHw!-hPF7^5Fhe!O! zLRwW-mCsjE<*yNtGv=Nb3^g&A5({LRR>=P=4%(e}P=ms?fz6s|c{=YubwlF*{TmX8 z+O^URiF-?nwFf;9!1u>{+O?l7N9Y9#{q;+w+F!r4-_>yXTbXZX9{u7gi`|*81kZW( zPv-a2j$isi*I!HPT!h_l`l0r*S6|7^bidL#`pZM@p{_%r z^6yd#U>_oE2-UtLxi@2Tdq zZoy4-_Mdn-6?#vQm7U6%mNs9*XUVdlb(N9oF#QnkQXkTE!D1~_*}`PK{N?4|?`F$f zF7e$r`~Ui%q<>6b%IBY>|Ns1dK>yS&nVtP()>%HB2KkS${a@;3tCam~rSITz^QC~* z8arn}_Ixc}OK0h>ba#d)!<&(ok)Dx}F(+eg#=P{*4C*ad`@&=*{|YonSr$25spW;< zqw3icSp1<2T^F&2xr?=jz89F+B;C!@-9%s@KP%g8d3Wo~ziNAT?RCKVb*9FSM1w7L zz+RAf^P*A3-~Wod?V-$hJn7>@bTTl$W5%`|&ExWp?!cTiBD@sFC9$ub@}iqnq&Y7T z(J@l0hrtQ*BeV`AA~*zWAkm03jk54MKY(A_0NtnBO%v?u2x1Kf*5Fi_Qr_)8OkTh6 zZlgJM?mY+@Ke`Q9s%+PTd$t*buyloEZ(ab>)7yw=EJjEDy^ZjJZNxo>@8m`JiLv+qg1=e9>8&~@;bZXc zk#KnVL!*jK8jHvvIbr;w8bfbJe{$ig*BDLRs)s=9OkcAhNT5?SM(Nc2!H8GWmPBnO9eC% zZEOJ4&rx_le!)z@+S-cJ+7OQlHg3?-$Zud(lve8){CuM5)-W-$)M^rdl7*ukjV(=0 zF^NMJoT5f?D&KHFPS79oRhR*T!$aGxki^)C1eiXD7Shwl)(uK9Uu9`kX+>EXrxwLY zOTlQYA>0{jXvYWQTVnVMTO^WEO^AxLH$~~lgJ~jcUwZrSr8k(!FTE)(yvDcQ7J%hz zZ%d5+y|)EADT~M-s7nda9vVKqaAbx89SzN~>X^bcLy1DESuY$n+T7V%FI8*7uBvdr z4p5r%GOMn_9qmmmp`e{`xo^_cy7S>h~z-QONY1#XE1c|DfcfZ;&pKqwRo zL?XeCr~wwJq2Q)q$XCvFO4i*J=Hzh17au{Cpf%+WdkL?{B)dB4{VE@N%^uCf(M`rl zQ?9i*97UX;W5T1kie>mM2QxMgHGGV=^u%`fG?vM?I5dP>>MfPE)L*Ny#W7M3OfE)^ z0d7NLOC%)L5Q}s+HQ}&?m~U`UV@qSPZ~zJ}E1W3VTjZPYtz7Bbi*H#aSU^oUzP&{n z%h8DyP85MhFwzj9#tH{hb7DvZD3`#*uLvoR!4VGWZ53stSP5kt_fWwn*#8atoIP;NLYy-@r$6%|$06?hw!SC`gSR{E>_ zm0NL?{g7tUvdE~Q@V#(tL( zD;ZENfsIvg@eIIgf@`#BGu01-r8NTRWa zDFrI2Ykqc4u%97VrZdAB0Rzvx8A{{Kq(F&cK?$sU;ZaNuFk^|4B`uDR)0L zBCOeao<&+V!~)Uw)|LjRmi1?rc%(I3%FhwG4c#GtO^R{-mThim4sZ=?u7fH-%KW_w zKsxl${-A;&Alt=1vCR2Yj7^5ONUJrm26}1Xr?IyQ0An&Be5>wV1ulJpU>e2aRtAC!wnX?SrU(nU0^{4EBWiD!(Z~eBtOE_ zC&l5#?YajO-8>_j>nrf8_b*?cp{`1pkB1v4jk#@yJyF-bp{ssih$dbJhI$9b`{Ee- zseR?>IT>SYeCy9wUOZW;5Yb7{wm)26J~Vcck9y}6q|cyyIGw7>H=e-ezPPW#SJ*=z z4B>THR^*Eg4-W#_KIKH&qQ}G14{j1I)Vl-2ks1cRX9Cs-{H!VV~SJ3EO7QT!CVo7MTk<9gcr*vTR&6Mvtb zBEmBDbL>7Z6jRTgUL)#i@ ziO?VxL)m8ZYti#Y06!Y8wu;eCC18RGub<}MRMA0V8 zD7xiupx1(11J@TPJIYuIAV~Y!sr9^k{PRwVLQIooT#YKpt zRPRI9#E6rSZJfIY`823Rg)-=@Ixe7~hlwKvL-sp58={~fS>dA?T(Xc!YvZy~t3sRhBa`Uf<2 zft!Lxu0gORQeRl)>l^lckf6Og;(g-~si%8nWFS6LSX2k- zz-Uil=|mIvJ7JvbJ8K78L0@5MCp32ph&E17v~Na4?*vICmX=G!reO)!>|clfYU~JZsV_v$1d;Ga_x4@gh53o`(H;4wu;s){UwL)8AF;4;(c1cm z{b1ine1elPrArJa@}cy*6rbkV^Pxs)IzC@jd^XRX53gv`F?tA$P<2RgT>mArP#;ZZ zkjexBpN)c0+>?q=^FNo*FBG56|6D$Yz^5Suy>Saf?$JUJ>qvlXbab>EHu?_$It5^y z13vEMR$3nwg*wUX#)Q>r>^6beY(X^HjgEM?K(yeQ%Uwsj2Z$(Vur?Pn6`ZVOCA{1; z_Dz8Z*3%$9BoL>=lS}j1Cr|yrx=DRYv3!UBd}D+>K@`17hiwtGpTe_W_9x|Y>gjfFd_!uTZ+oB!qA-=zjZ8a_eqP4lLY%7|%`1Xe3p|O!+d4VX_ zNY;JL#m>ewAFlZ^((~25t-TV}Ibq%FE_N|>Hi&aeID$nP&c~T8M-Xy^wYtx{*}tiz zf$5TR1U>0NH@ih8otQ4^7DCXIe%Zr5tCEHz;VI<}j|}(X_+ngP+`BVOZw;J4p$M(} zn}^*;Q=_CaPDto$Y&g;0PYHP{O{i@uLUsGS?0}M}bsC9Uy9b7x#kn|*{aA^^shGsk zQ%Q03usu_C-%n%DD_O!FEvw4Vk6dsWm-jWT!ozAXy$pX;{2-b9K5#b8flTv;wgWY0FNmB{< zbbyz(W9rs!am)2qu&z6Q4*RT2)`F%0)=;KZTod&et*SdPhux>7FcA?l@E#_|7kQYR z9&Ml)2hgA(AHS8BaX>?RYZxm=9W)eh=ej)Ze7C%Lg=7DYe5U%KutTF>->3GITtCtMEI4$^ox#tcM0MC@YUO$2J7pf*mal zD2aTRhn-4ewQ@OLQ>(qL0a{$}RZ@pM;DmrHUlGqc?DY=u=z2OpVb&nKZk^9x)mh{_ zhoqXsnFxbv5OHz^*H>6hVqio?i?@6vSK6t$cPk5`Z$#)Fd@izW-S3d(9h{;K=_lJb zTaU>GgaJX%kV5Re&^*cB;|A4#MavPkQ-pjJJl`>a4HJaDjT1v3@6wjx%T-%a-c zITC6d!&L&8srl8u5+*=4c<#Pwxs8Cc+59xEQ#YL-Vsz+mIQZdL_zi+j#(2fF} zolsRvQVJt6w4t~#Of4e6h$$XbgMOv^QBPk+U`O|8jAoL@28M_r78?G{nmacHW1Fx+ z11)s_;BfaCZg$3nVl8bgQM}s0|1Ua92q=8cw{LhH(@b{6!&o~I>5`H9E5mJNKD-F@ zdHvGl?PL&t*Tb?*vEk+dml7FloF)08yFY>Zl}ASh`uB3p z6^d;}H#%79b!H#xJPa*gd3gR8r){dqQ z8ma*7NrEW=twldY0I8iIUS9w`&2dN_v@-q%M+miVs4w*uuCXlPzo|!Y<@rh{YPh~i ziThvN1EaVJ2DhT7o==s+l1l{?d3*ibAj{@fGeZD)OyDhH#&wFab(hIzb1y(L-gRlJ(6X8T9f|kDdXXZPq>bUgScY zA4g)(C>P0+As5#m7dX^oCPfQ$Te%7Xpmr0eVFT>wd!Y+kiRuEE;B z>=j0c;#>ivoX!?)*bw-OQs5(8k3=mJB`Hbwo2rv)wJZomJmmTY7(_txQ7^Tj=#GRM{e}IQ@|Im3(_7isPb=+%<`*>$ zpMGRY87}NEiKd*m#1|z3j~fKaX27~cbT7qw8gyK*rWsk#T)#7g!kX*%MzBnC-8t9j zrHVd(i1*LyCynb;8^DPJ!bFdskIg*dJ02~yHG7%-pU~U)@U95f);&T`>I;ZT;{cAw z2LhL1%gCazK<9v~v1ue5*F@j6n-2iuBO^Pyhx)K+x*ZGcPcl|_n~QynouHZz(P`+X zD^_m8y~LNqViV@umbIIhR`-O9U1Lw75?t++V4s`aXe6LlkwSN*{{@;h)g=PD!geJ7 zrkj1*z@`_OYW`F*&O~HpuPrlOu^29R)^6A8zDX0VI#UxFMTIj56}ZW%9P+Sx4Jv32 zb=e(r`bjVQx&__BteYmmM==2h32$N$bwbMef)~52bXi3+I~5~J8W-8TK8=0Po^%?f zG9~6*f22~X21%uK%-mnn*b}w{3g59HZ%t>fV`g=9H$L@&`CTn^Z8g8EVSbOKv%g># zlkj+^FLAQdOMv)RI{Tu#pm#X2m*ln3bSg)p{lyISHTO!D#7bVUv6eltc_xE>*}Jm8 zyJysl-*2%r;K_$Is6E#F1dnGX)k@&~-d-Cqs+Xe<)gK2IJ58bS8U?^U6MzuDpu#3| z?x%=19U=gCVHXAU#l@SQ02qks01AIn5A&BY5p%s@g#qNo^fo2a%>Y8gF3yyX6ft|uZp97-vAM*U$Gpqs z^0>ZfkI>u?xZEE1w{Xcdd&Jck3`GO6)5`rA$W7qQjhEaH6wqIZaR_!JKZ*@$jr7$B zRvrKmeT4ERoHpeOxA@A}`YZgEwPjV1u+6m~Z#QA>g zDN`KS#v;uvO;L;nabKX%PwbyIBj7`9iQunN2tRenLHw7Xc($rU#)>mN&{%aTCwo*Zg#@>WTOKT(6UFj++Q=KcG!GU;^{LlmWh<^!Lz#ej>`EK8ghS6XIzLwsIlt- zdu^4Ez@qvrK1pmtDUpc6u(@d#IlSMqXh$h6*5k-C!Tv%Qc9-1Y$ zCBU9QBoNdrX$W8RX(8+rLV{@hY$Y(LIZ1Hx$xadwcS=`8J;+~>1lZTKySi{sX~`ac z$)2*3J(Dy*kRcgEuhI30!ECHxDOZr^%e;cirT?1n+v6&CKsd8Y7pbK2#|0cQRb zaKcxN4^{v%=6NvZUF3s;fvK_kIJ3w&&a0m#vo)zRyPq>ljg!n2mp{4q-*(iMp{dmt zRhelTDmdV%0)xhy6lgp=IcEler0GrN@I-Z}eRE8Fo3#xa65HEiLHfK4?c{R~QCqO3 z3p>K9Td@7Ry)CpA^S((^zcdvNCnI*6+|0*9S4|oVi8U^Lf62RA@}du~jZu?vOfq$C z)M4BthQy&oH?@{h_L^Kvk?UScAQQJH$49m7vNr66^oDm= zW4MKNcDz@nMb=5;%oI5*GerffqfQZ=%TY>*Gf-bqG1@9YCtLqX3(ed z&v9Y<2S)JTgvdj^@!0Na#IIxbXLySbxThj{z)BK9PV%4wNqiHSjdA2dpn1J#3YxB^ z7Mc{~G!Hw_EXODD?3e7vpm}IYnrB*RB1kk@&SaXndK|~vR&MZBWE^dPWnoo4X!hHoP7+G|CF9VI_tnS z)7*Hu2?Ef7YvmQdm6vFwvxl=?#7F1{4Z+C3gkge$=7a3YdEVmhXUu@6X9Lkh;TCg& zC(*?RqS>Cs>=U4S>zo|~z;%|FeACNI<^G^w;a53Y z`-5Z=0Xhc)K386V&XIu6Wm?|Ggow|~+c+S63-UJh3160A zn;7Ubbk6hPUCb_C;4S{Ic?E*!VVx&@9>Ej74EH_rvbDozo_E9k1W&~02%hle3ZC%! zoOn_`y&qxMg6B^%1y7cvc#==>BwvR6&P-HV6VJ3`6;Fy6Jjo|`lFx}Jw=M5m>~`?{ z{CrfqO|-9C9`He|Cm<6g_T)`Ouvwl@g;6*oFR|6ITv@Z}^MY<_JhA4LFqFxeqz$v* zfXO8bW?*QhO3^bgCGn@&YassX84;(}RTM)~;&>Bj+39}vHxNIta0Zf_sz`F;)a0dK z$u3-o`j<5m;`I8OPIA1r(qCa$g7))^vhw=-$3pQT)#_+@0{}D)ic?vrwRGiSlD#9o zCq6P7H^bd|iRf7aeSL%U))b9=Jx7ev2M}6z#`9zfV?d#oY3p#`KtH}vP<%2a)u!&= zG3?%_op)#i7ijt1#~YI&lbH2qc%|ZoT`Y$fGS>Gi0+;MgXGQ4?2ll7_3|m%Uq|mX zYf(?b{xFzc?ZlKUaeh5Jf04KN;@qj2E|@!0rYt8vdqJ85Q?BUwUt`yR>35IKk>=ka z&)yRKSk=&r?eb{pJ+_u!kMQcvc!#AON8cMSd-)a!aO(V3kf{Uf4PX{VRWNxid%^cz zE0>_a<`+Qt?{eWssHwLW(}EKA83@1cxc5?cYEdT%Pe5Jxg%?WUKarokaG#U#RNM<* zX8R%h<34BMMa{3@Tc+&SqrY`^ou?%$jPw~42DMm|^8=uspR6$DCqFy$7KglWD_VFb zdmefD+=`sM2)b{`+yd(Ti9B>PHAPh>KvS9mhw^dD644joHi{ zIeBf0jF#8dV`#>eC)VY#LsRuO6&Eowf&n%RkIHTY=ZOq=a6?;E>yXi`D9>nL@0h(^ z%K9<;NVd25Vf2tw5k@=AYpdP|A~UfGBdkdZ^RP*nMUM)tFT5l_dtQcvK)iRk=ydi~ z2=q)riUQFfM=t}>DYFVh-85Z0*_%xQWuGntTJXdC>^V0$2}DijqF323A<#FE&&+G( z#f3&gv(Keq+^Wx>h;AVU(0pnIp$uUUG>?KU%Q*aREN++t@7rac%icN$z1~$R@{pY% z$%7Zdlsu?=BJy-(9Kd zOAMWc2Pdm+@!jl}<=*0-7S4dxlxlNkMVec(gxw8R-zl02tEsf-$cig)$$9Kvu)3$% zKI6lUP8G&cWxQyV#mP!&o?a3&KA7qd^~{)J;xkN`<;Ub8UOh2h<(3>`cjkJFuU&1Q z`LQsS9YLL`VGsuOUff^|4rNipzInEeim@Mo!=H~3hf$2DZG%QcBIFW93`Wlw?fODEdx)kzyW6=|-H zyu==JSWcM?II-ewd-J@-KP;V+l~j+;O4bdX6@{l{Mf%F|vIoKHKL6CLguV<` zq%c#ict1om%Z|C?3d~8cN5SfbGS13*dfut#~}Mw2KzEF~>)f^n&uw*nP)& zi!Ul)Vt-kgCjK4FlvAd;L%cLCO$s``a>O=hX2uKWm`e6rFnfI}X0m8hp^K8CY*42n zRc2H?$K1|t^m&VaRgsfCXH)AeFFq6>*}hk3Fe`5YGpIC)Cp&JGJ?enj6uN97`!U$= ztMX037UpGINtrs2XkN4OM$jWj$k`)8U!u!KYRTcUkuO(R(q!3q6Ta+XcK!-)@y*p! zs6@_JDgBE|$o20~*pO|3MK(guGGs%NB|rI#A2=+1DZ4T{RAd2!kDqw+!{+ z2mm=7hMs|`%VE|fuU2WNP}5O>K8|&t-(l>l``J2t#$v@s z)@XfWGX6o}U%H-s*mJy~Pn#-0ANTHH1r!_i4qM4T2lV^bv&%e^yhPW@+wqC~q4n%~ z&nnu{!Mk3d%rb-^MBlP4kYxb>_b0OlJVmrp%$o<1S*jpg34dTnE68>&?Zav0cT><<ucaPlN#VI5 zdy`XW?Tj?0Duh;dRTJBnPIl1R8JIz`?=`W@)3N=KYKO>hF0T~1vU23wD@QJxmcKQz zkMl$*>y#7Szk%H@1PlcvtF5B`8TC+vN5^-WHZO}BiQUv2*q8M5$@DT6fd`t|wTcY~F3+HitgWq~KoYCq%F3Or95Sk>H?mibFQ)eu z?HZur2X&|mvX6f{f>#vF!P~-Mim-eyu^ddorghZa9Aa0jTBVXxmx!9}g6vhfl$^it zOv$mefbQ0ycc^;3fsFUR>V6qw517d4Z{$_IoD99Q%w!JQ$s8myXRf=Wm3{7n<4GEP z?>n+n45xTDT5u^gq;Khg<2p0Z(mjZ&E$Q!xW7~?h?yXk#uq83i4P}BShQkvtH6@0h zC+%Nj|M|LyqwMz8yv|!CFls+6 zPi(0nwW#-u+K^+e$Y>8B6iSf9AV*kf{|L5OaDdU>%|%1r$zE_|thX2F&Zfo~EeL5N zLohxl7$59P!uV^O*mWhm@NGF(BMmm3B3~TAYRd3)g70&Ve79mSv59?h&1!1T=(8u; zI%^M;jf#=PnTd9c63iNXm}%?Y+00&C!^Q0#80j5HQ@D8qX9B4Dom)uY`tkmL>~9h8 zh7b%m1=rAEhJ9PR&%>y>ezMR zvU(f?KKBX?RM7$w$kAfR=i&J>b@R9st27UzEs7-J^Z%P!+F>leDZ}Z)NXGE-~I{wk~}V zsdzq~6Zz0zd^{h|O`&8qY?CYee9X9URo7ont^E_>i(Q6zI@CXuzUD zeB{{_XbItZ{YSe1*t*ZN2d}=D9v~&3PFuSMwUgzCk`$xS8`9TiJ zqwdgq+xk7u|B8DgQ@KO(pwvI<;v}|0I}sPByH+6J#=XTywcw&aPk}aX-pTXa8Mx$L z+;O$oYus{`W(8?lx&g>a!wrN+5Vw3Afd(YZW`r@<3?#rj1yC57W`L&6S3yEvpaQt^ zU3m@KSq6xZ7p>ALN7)`^&7Cn1ci1l`FL{;};|RGxQ>45JVc56yN;fx2~Q5e zH0>B9(3YuqKYDe`1qOL@2~M74=V|2R%?IU{r8RSK*uU^ZwrK zDb@%QmcXYPU?DC60|wAUWG?Qtv_^0u05=$5Nd&;gW1%!Z>@geV5EKF2yJfK;%Vh^cffMt}r+pD73y8%0plLgaC0tjnxG;hcgJYc&8AY�^WJ>Mi!F?}F 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%0Ds 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¥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�`VjVIQX4OH}GxsOry44v)*PNTK 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%0DL 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

#j*+ZuGf^?! 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 U13N6AxLYAE5lpV1p~>=ha9 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

dV)?# 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

#ET+~jpTcJ2eAcz52p6Q1EW`fN(T*G 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