From f7b8df78b031b46c22501c27d1f86036d0d3af2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E5=A3=AE=E4=BC=9F?= <14858320+wen-zhuangwei@user.noreply.gitee.com> Date: Fri, 13 Sep 2024 11:54:28 +0800 Subject: [PATCH 01/10] 12111 --- .../inc/sample_acmp_interrupt.h | 31 + .../acmp/sample_acmp_interrupt/init/main.c | 56 + .../acmp/sample_acmp_interrupt/init/main.h | 63 + .../sample_acmp_interrupt/init/system_init.c | 157 ++ .../acmp/sample_acmp_interrupt/readme.md | 20 + .../src/sample_acmp_interrupt.c | 78 + .../inc/sample_acmp_out_result.h | 31 + .../acmp/sample_acmp_out_result/init/main.c | 56 + .../acmp/sample_acmp_out_result/init/main.h | 59 + .../sample_acmp_out_result/init/system_init.c | 130 ++ .../acmp/sample_acmp_out_result/readme.md | 18 + .../src/sample_acmp_out_result.c | 38 + .../inc/sample_adc_associative_trigger_apt.h | 33 + .../init/main.c | 37 + .../init/main.h | 52 + .../init/system_init.c | 214 ++ .../readme.md | 18 + .../src/sample_adc_associative_trigger_apt.c | 59 + .../inc/sample_adc_continue_trigger.h | 33 + .../sample_adc_continue_trigger/init/main.c | 36 + .../sample_adc_continue_trigger/init/main.h | 48 + .../init/system_init.c | 140 ++ .../adc/sample_adc_continue_trigger/readme.md | 18 + .../src/sample_adc_continue_trigger.c | 65 + .../inc/sample_adc_over_sample.h | 31 + .../adc/sample_adc_over_sample/init/main.c | 36 + .../adc/sample_adc_over_sample/init/main.h | 46 + .../sample_adc_over_sample/init/system_init.c | 138 ++ .../adc/sample_adc_over_sample/readme.md | 18 + .../src/sample_adc_over_sample.c | 61 + .../inc/sample_adc_oversampling_it.h | 31 + .../sample_adc_oversampling_it/init/main.c | 51 + .../sample_adc_oversampling_it/init/main.h | 55 + .../init/system_init.c | 138 ++ .../adc/sample_adc_oversampling_it/readme.md | 18 + .../src/sample_adc_oversampling_it.c | 58 + .../inc/sample_adc_single_trigger.h | 31 + .../adc/sample_adc_single_trigger/init/main.c | 35 + .../adc/sample_adc_single_trigger/init/main.h | 46 + .../init/system_init.c | 128 ++ .../adc/sample_adc_single_trigger/readme.md | 18 + .../src/sample_adc_single_trigger.c | 55 + .../inc/sample_adc_single_trigger_dma.h | 32 + .../sample_adc_single_trigger_dma/init/main.c | 37 + .../sample_adc_single_trigger_dma/init/main.h | 51 + .../init/system_init.c | 170 ++ .../sample_adc_single_trigger_dma/readme.md | 18 + .../src/sample_adc_single_trigger_dma.c | 59 + .../inc/sample_adc_single_trigger_it.h | 32 + .../sample_adc_single_trigger_it/init/main.c | 35 + .../sample_adc_single_trigger_it/init/main.h | 48 + .../init/system_init.c | 140 ++ .../sample_adc_single_trigger_it/readme.md | 18 + .../src/sample_adc_single_trigger_it.c | 57 + .../inc/sample_adc_single_with_ppb.h | 30 + .../sample_adc_single_with_ppb/init/main.c | 51 + .../sample_adc_single_with_ppb/init/main.h | 56 + .../init/system_init.c | 144 ++ .../adc/sample_adc_single_with_ppb/readme.md | 20 + .../src/sample_adc_single_with_ppb.c | 131 ++ .../inc/sample_adc_sync_sample.h | 32 + .../adc/sample_adc_sync_sample/init/main.c | 35 + .../adc/sample_adc_sync_sample/init/main.h | 46 + .../sample_adc_sync_sample/init/system_init.c | 137 ++ .../adc/sample_adc_sync_sample/readme.md | 18 + .../src/sample_adc_sync_sample.c | 63 + .../inc/sample_adc_sync_sample_dma.h | 32 + .../sample_adc_sync_sample_dma/init/main.c | 37 + .../sample_adc_sync_sample_dma/init/main.h | 51 + .../init/system_init.c | 180 ++ .../adc/sample_adc_sync_sample_dma/readme.md | 18 + .../src/sample_adc_sync_sample_dma.c | 62 + .../inc/sample_adc_sync_sample_it.h | 32 + .../adc/sample_adc_sync_sample_it/init/main.c | 35 + .../adc/sample_adc_sync_sample_it/init/main.h | 48 + .../init/system_init.c | 142 ++ .../adc/sample_adc_sync_sample_it/readme.md | 18 + .../src/sample_adc_sync_sample_it.c | 58 + .../inc/sample_apt_single_resistor.h | 45 + .../sample_apt_single_resistor/init/main.c | 57 + .../sample_apt_single_resistor/init/main.h | 61 + .../init/system_init.c | 310 +++ .../apt/sample_apt_single_resistor/readme.md | 29 + .../src/sample_apt_single_resistor.c | 244 ++ .../inc/sample_can_send_receive.h | 31 + .../can/sample_can_send_receive/init/main.c | 49 + .../can/sample_can_send_receive/init/main.h | 55 + .../init/system_init.c | 140 ++ .../can/sample_can_send_receive/readme.md | 26 + .../src/sample_can_send_receive.c | 123 ++ .../capm_hall_sample/inc/capm_hall_sample.h | 41 + .../capm/capm_hall_sample/init/main.c | 57 + .../capm/capm_hall_sample/init/main.h | 58 + .../capm/capm_hall_sample/init/system_init.c | 170 ++ .../capm/capm_hall_sample/readme.md | 18 + .../capm_hall_sample/src/capm_hall_sample.c | 79 + .../inc/cfd_check_error_sample.h | 32 + .../cfd/sample_cfd_check_error/init/main.c | 55 + .../cfd/sample_cfd_check_error/init/main.h | 59 + .../sample_cfd_check_error/init/system_init.c | 124 ++ .../cfd/sample_cfd_check_error/readme.md | 21 + .../src/cfd_check_error_sample.c | 94 + .../inc/cmm_check_error_sample.h | 32 + .../cmm/sample_cmm_check_error/init/main.c | 55 + .../cmm/sample_cmm_check_error/init/main.h | 60 + .../sample_cmm_check_error/init/system_init.c | 136 ++ .../cmm/sample_cmm_check_error/readme.md | 20 + .../src/cmm_check_error_sample.c | 88 + .../inc/sample_crc_gen_algo.h | 30 + .../crc/sample_crc_gen_algo/init/main.c | 54 + .../crc/sample_crc_gen_algo/init/main.h | 54 + .../sample_crc_gen_algo/init/system_init.c | 92 + .../crc/sample_crc_gen_algo/readme.md | 16 + .../src/sample_crc_gen_algo.c | 91 + .../inc/sample_crc_load_algo.h | 31 + .../crc/sample_crc_load_algo/init/main.c | 55 + .../crc/sample_crc_load_algo/init/main.h | 56 + .../sample_crc_load_algo/init/system_init.c | 104 + .../crc/sample_crc_load_algo/readme.md | 18 + .../src/sample_crc_load_algo.c | 69 + drivers_sample/dac/sample_dac/init/main.c | 33 + drivers_sample/dac/sample_dac/init/main.h | 43 + .../dac/sample_dac/init/system_init.c | 70 + drivers_sample/dac/sample_dac/readme.md | 18 + .../inc/sample_dma_list_transfer.h | 32 + .../dma/sample_dma_list_transfer/readme.md | 18 + .../src/sample_dma_list_transfer.c | 117 + .../inc/sample_dma_list_transfer_continue.h | 32 + .../readme.md | 19 + .../src/sample_dma_list_transfer_continue.c | 70 + .../sysinit/main.c | 37 + .../sysinit/main.h | 48 + .../sysinit/system_init.c | 123 ++ .../inc/sample_dma_mem_to_mem.h | 33 + .../dma/sample_dma_mem_to_mem/init/main.c | 36 + .../dma/sample_dma_mem_to_mem/init/main.h | 48 + .../sample_dma_mem_to_mem/init/system_init.c | 133 ++ .../dma/sample_dma_mem_to_mem/readme.md | 18 + .../src/sample_dma_mem_to_mem.c | 61 + .../inc/sample_dma_mem_to_per.h | 32 + .../dma/sample_dma_mem_to_per/readme.md | 18 + .../src/sample_dma_mem_to_per.c | 118 + .../inc/sample_dma_per_to_mem.h | 32 + .../dma/sample_dma_per_to_mem/readme.md | 18 + .../src/sample_dma_per_to_mem.c | 128 ++ .../inc/sample_dma_per_to_per.h | 32 + .../dma/sample_dma_per_to_per/readme.md | 18 + .../src/sample_dma_per_to_per.c | 127 ++ .../inc/sample_flash_blocking.h | 29 + .../flash/sample_flash_blocking/init/main.c | 34 + .../flash/sample_flash_blocking/init/main.h | 43 + .../sample_flash_blocking/init/system_init.c | 91 + .../flash/sample_flash_blocking/readme.md | 19 + .../src/sample_flash_blocking.c | 95 + .../inc/sample_flash_blocking_mode.h | 29 + .../sample_flash_blocking_mode/init/main.c | 51 + .../sample_flash_blocking_mode/init/main.h | 48 + .../init/system_init.c | 95 + .../sample_flash_blocking_mode/readme.md | 19 + .../src/sample_flash_blocking_mode.c | 95 + .../inc/sample_flash_interrupt.h | 29 + .../flash/sample_flash_interrupt/init/main.c | 34 + .../flash/sample_flash_interrupt/init/main.h | 43 + .../sample_flash_interrupt/init/system_init.c | 91 + .../flash/sample_flash_interrupt/readme.md | 19 + .../src/sample_flash_interrupt.c | 149 ++ .../inc/sample_flash_interrupt_mode.h | 29 + .../sample_flash_interrupt_mode/init/main.c | 51 + .../sample_flash_interrupt_mode/init/main.h | 48 + .../init/system_init.c | 94 + .../sample_flash_interrupt_mode/readme.md | 19 + .../src/sample_flash_interrupt_mode.c | 151 ++ .../inc/gpio_circle_sample.h | 30 + .../gpio/sample_gpio_circle/init/main.c | 37 + .../gpio/sample_gpio_circle/init/main.h | 47 + .../sample_gpio_circle/init/system_init.c | 123 ++ .../gpio/sample_gpio_circle/readme.md | 22 + .../src/gpio_circle_sample.c | 99 + .../inc/gpio_interrupt_sample.h | 30 + .../gpio/sample_gpio_interrupt/init/main.c | 37 + .../gpio/sample_gpio_interrupt/init/main.h | 49 + .../sample_gpio_interrupt/init/system_init.c | 137 ++ .../gpio/sample_gpio_interrupt/readme.md | 22 + .../src/gpio_interrupt_sample.c | 126 ++ .../sample_gpio_key/inc/gpio_key_sample.h | 30 + .../gpio/sample_gpio_key/init/main.c | 36 + .../gpio/sample_gpio_key/init/main.h | 48 + .../gpio/sample_gpio_key/init/system_init.c | 121 + drivers_sample/gpio/sample_gpio_key/readme.md | 17 + .../sample_gpio_key/src/gpio_key_sample.c | 65 + .../sample_gpio_led/inc/gpio_led_sample.h | 30 + .../gpio/sample_gpio_led/init/main.c | 36 + .../gpio/sample_gpio_led/init/main.h | 46 + .../gpio/sample_gpio_led/init/system_init.c | 109 + drivers_sample/gpio/sample_gpio_led/readme.md | 19 + .../sample_gpio_led/src/gpio_led_sample.c | 49 + .../inc/sample_gpt_period_interrupt.h | 32 + .../sample_gpt_period_interrupt/init/main.c | 51 + .../sample_gpt_period_interrupt/init/main.h | 53 + .../init/system_init.c | 137 ++ .../gpt/sample_gpt_period_interrupt/readme.md | 24 + .../src/sample_gpt_period_interrupt.c | 51 + .../inc/sample_gpt_pwm_output.h | 32 + .../gpt/sample_gpt_pwm_output/init/main.c | 51 + .../gpt/sample_gpt_pwm_output/init/main.h | 52 + .../sample_gpt_pwm_output/init/system_init.c | 118 + .../gpt/sample_gpt_pwm_output/readme.md | 24 + .../src/sample_gpt_pwm_output.c | 45 + .../inc/sample_gpt_simplerun.h | 32 + .../gpt/sample_gpt_simplerun/init/main.c | 36 + .../gpt/sample_gpt_simplerun/init/main.h | 46 + .../sample_gpt_simplerun/init/system_init.c | 112 + .../gpt/sample_gpt_simplerun/readme.md | 18 + .../src/sample_gpt_simplerun.c | 53 + .../inc/sample_i2c_blocking_stlm75.h | 29 + .../sample_i2c_blocking_stlm75/init/main.c | 35 + .../sample_i2c_blocking_stlm75/init/main.h | 46 + .../init/system_init.c | 127 ++ .../i2c/sample_i2c_blocking_stlm75/readme.md | 18 + .../src/sample_i2c_blocking_stlm75.c | 80 + .../inc/sample_i2c_dma_stlm75.h | 29 + .../i2c/sample_i2c_dma_stlm75/init/main.c | 37 + .../i2c/sample_i2c_dma_stlm75/init/main.h | 53 + .../sample_i2c_dma_stlm75/init/system_init.c | 192 ++ .../i2c/sample_i2c_dma_stlm75/readme.md | 18 + .../src/sample_i2c_dma_stlm75.c | 110 + .../inc/sample_i2c_interrupt_stlm75.h | 29 + .../sample_i2c_interrupt_stlm75/init/main.c | 35 + .../sample_i2c_interrupt_stlm75/init/main.h | 50 + .../init/system_init.c | 157 ++ .../i2c/sample_i2c_interrupt_stlm75/readme.md | 18 + .../src/sample_i2c_interrupt_stlm75.c | 110 + .../inc/sample_i2c_master_blocking_at24c64.h | 29 + .../init/main.c | 52 + .../init/main.h | 51 + .../init/system_init.c | 125 ++ .../readme.md | 19 + .../src/sample_i2c_master_blocking_at24c64.c | 202 ++ .../inc/sample_i2c_master_dma_at24c64.h | 29 + .../sample_i2c_master_dma_at24c64/init/main.c | 53 + .../sample_i2c_master_dma_at24c64/init/main.h | 54 + .../init/system_init.c | 212 ++ .../sample_i2c_master_dma_at24c64/readme.md | 19 + .../src/sample_i2c_master_dma_at24c64.c | 286 +++ .../inc/sample_i2c_master_interrupt_at24c64.h | 29 + .../init/main.c | 51 + .../init/main.h | 55 + .../init/system_init.c | 156 ++ .../readme.md | 19 + .../src/sample_i2c_master_interrupt_at24c64.c | 293 +++ .../inc/sample_i2c_slave_blocking.h | 29 + .../i2c/sample_i2c_slave_blocking/init/main.c | 51 + .../i2c/sample_i2c_slave_blocking/init/main.h | 51 + .../init/system_init.c | 129 ++ .../i2c/sample_i2c_slave_blocking/readme.md | 23 + .../src/sample_i2c_slave_blocking.c | 148 ++ .../inc/sample_i2c_slave_dma.h | 29 + .../i2c/sample_i2c_slave_dma/init/main.c | 53 + .../i2c/sample_i2c_slave_dma/init/main.h | 54 + .../sample_i2c_slave_dma/init/system_init.c | 216 ++ .../i2c/sample_i2c_slave_dma/readme.md | 23 + .../src/sample_i2c_slave_dma.c | 208 ++ .../inc/sample_i2c_slave_interrupt.h | 29 + .../sample_i2c_slave_interrupt/init/main.c | 52 + .../sample_i2c_slave_interrupt/init/main.h | 55 + .../init/system_init.c | 159 ++ .../i2c/sample_i2c_slave_interrupt/readme.md | 23 + .../src/sample_i2c_slave_interrupt.c | 206 ++ .../iocmg/iolist_sample/inc/iolist_sample.h | 30 + .../iocmg/iolist_sample/init/main.c | 34 + .../iocmg/iolist_sample/init/main.h | 47 + .../iocmg/iolist_sample/init/system_init.c | 86 + drivers_sample/iocmg/iolist_sample/readme.md | 14 + .../iocmg/iolist_sample/src/iolist_sample.c | 103 + .../sample_iocfg_list/inc/sample_iocfg_list.h | 30 + .../iocmg/sample_iocfg_list/init/main.c | 50 + .../iocmg/sample_iocfg_list/init/main.h | 49 + .../sample_iocfg_list/init/system_init.c | 92 + .../iocmg/sample_iocfg_list/readme.rd | 14 + .../sample_iocfg_list/src/sample_iocfg_list.c | 106 + drivers_sample/open_mcu | 1 + drivers_sample/open_mcu_1 | 1 + drivers_sample/pga/sample_pga/init/main.c | 33 + drivers_sample/pga/sample_pga/init/main.h | 43 + .../pga/sample_pga/init/system_init.c | 88 + drivers_sample/pga/sample_pga/readme.md | 14 + .../pga/sample_pga_extra_resistor/init/main.c | 34 + .../pga/sample_pga_extra_resistor/init/main.h | 43 + .../init/system_init.c | 88 + .../pga/sample_pga_extra_resistor/readme.md | 14 + .../inc/sample_pga_result_sampling.h | 31 + .../sample_pga_result_sampling/init/main.c | 52 + .../sample_pga_result_sampling/init/main.h | 54 + .../init/system_init.c | 143 ++ .../pga/sample_pga_result_sampling/readme.md | 16 + .../src/sample_pga_result_sampling.c | 51 + drivers_sample/pic/1726194739756.jpg | Bin 0 -> 5782 bytes drivers_sample/pic/1726194776437.jpg | Bin 0 -> 29480 bytes drivers_sample/pic/1726194794028.jpg | Bin 0 -> 62232 bytes drivers_sample/pic/1726194824764.jpg | Bin 0 -> 2866 bytes drivers_sample/pic/1726194869607.jpg | Bin 0 -> 166495 bytes .../pic/1726194906962-1726195658552-18.jpg | Bin 0 -> 4937 bytes drivers_sample/pic/1726194906962.jpg | Bin 0 -> 4937 bytes drivers_sample/pic/1726194945180.jpg | Bin 0 -> 171355 bytes .../pic/1726194962547-1726195476280-9.jpg | Bin 0 -> 7234 bytes drivers_sample/pic/1726194962547.jpg | Bin 0 -> 7234 bytes drivers_sample/pic/1726194980430.jpg | Bin 0 -> 10987 bytes drivers_sample/pic/1726195007716.jpg | Bin 0 -> 5702 bytes drivers_sample/pic/1726195033006.jpg | Bin 0 -> 2418 bytes drivers_sample/pic/1726195055385.jpg | Bin 0 -> 4448 bytes drivers_sample/pic/1726195173004.jpg | Bin 0 -> 538 bytes drivers_sample/pic/1726195185553.jpg | Bin 0 -> 538 bytes .../pmc/sample_pmc_pvd/inc/sample_pmc_pvd.h | 27 + drivers_sample/pmc/sample_pmc_pvd/init/main.c | 42 + drivers_sample/pmc/sample_pmc_pvd/init/main.h | 48 + .../pmc/sample_pmc_pvd/init/system_init.c | 120 + drivers_sample/pmc/sample_pmc_pvd/readme.md | 17 + .../pmc/sample_pmc_pvd/src/sample_pmc_pvd.c | 53 + .../sample_pmc_wakeup/inc/sample_pmc_wakeup.h | 31 + .../pmc/sample_pmc_wakeup/init/main.c | 42 + .../pmc/sample_pmc_wakeup/init/main.h | 46 + .../pmc/sample_pmc_wakeup/init/system_init.c | 107 + .../pmc/sample_pmc_wakeup/readme.md | 17 + .../sample_pmc_wakeup/src/sample_pmc_wakeup.c | 68 + .../qdm/sample_qdm_m/inc/sample_qdm_m.h | 26 + drivers_sample/qdm/sample_qdm_m/init/main.c | 37 + drivers_sample/qdm/sample_qdm_m/init/main.h | 49 + .../qdm/sample_qdm_m/init/system_init.c | 175 ++ drivers_sample/qdm/sample_qdm_m/readme.md | 24 + .../qdm/sample_qdm_m/src/sample_qdm_m.c | 41 + .../qdm/sample_qdm_mt/inc/sample_qdm_mt.h | 26 + drivers_sample/qdm/sample_qdm_mt/init/main.c | 37 + drivers_sample/qdm/sample_qdm_mt/init/main.h | 46 + .../qdm/sample_qdm_mt/init/system_init.c | 154 ++ drivers_sample/qdm/sample_qdm_mt/readme.md | 13 + .../qdm/sample_qdm_mt/src/sample_qdm_mt.c | 42 + .../inc/sample_spi_blocking_kta7953.h | 28 + .../sample_spi_blocking_kta7953/init/main.c | 35 + .../sample_spi_blocking_kta7953/init/main.h | 46 + .../init/system_init.c | 163 ++ .../spi/sample_spi_blocking_kta7953/readme.md | 18 + .../src/sample_spi_blocking_kta7953.c | 95 + .../inc/sample_spi_blocking_w25q32.h | 28 + .../sample_spi_blocking_w25q32/init/main.c | 50 + .../sample_spi_blocking_w25q32/init/main.h | 50 + .../init/system_init.c | 157 ++ .../spi/sample_spi_blocking_w25q32/readme.md | 20 + .../src/sample_spi_blocking_w25q32.c | 244 ++ .../inc/sample_spi_blocking_w25q32_internal.h | 28 + .../init/main.c | 51 + .../init/main.h | 50 + .../init/system_init.c | 157 ++ .../readme.md | 20 + .../src/sample_spi_blocking_w25q32_internal.c | 224 ++ .../inc/sample_spi_dma_kta7953.h | 28 + .../spi/sample_spi_dma_kta7953/init/main.c | 37 + .../spi/sample_spi_dma_kta7953/init/main.h | 55 + .../sample_spi_dma_kta7953/init/system_init.c | 256 +++ .../spi/sample_spi_dma_kta7953/readme.md | 20 + .../src/sample_spi_dma_kta7953.c | 164 ++ .../inc/sample_spi_dma_w25q32.h | 28 + .../spi/sample_spi_dma_w25q32/init/main.c | 51 + .../spi/sample_spi_dma_w25q32/init/main.h | 59 + .../sample_spi_dma_w25q32/init/system_init.c | 250 +++ .../spi/sample_spi_dma_w25q32/readme.md | 20 + .../src/sample_spi_dma_w25q32.c | 288 +++ .../inc/sample_spi_dma_w25q32_internal.h | 28 + .../init/main.c | 52 + .../init/main.h | 59 + .../init/system_init.c | 250 +++ .../sample_spi_dma_w25q32_internal/readme.md | 20 + .../src/sample_spi_dma_w25q32_internal.c | 269 +++ .../inc/sample_spi_interrupt_kta7953.h | 28 + .../sample_spi_interrupt_kta7953/init/main.c | 35 + .../sample_spi_interrupt_kta7953/init/main.h | 52 + .../init/system_init.c | 207 ++ .../sample_spi_interrupt_kta7953/readme.md | 20 + .../src/sample_spi_interrupt_kta7953.c | 163 ++ .../inc/sample_spi_interrupt_w25q32.h | 28 + .../sample_spi_interrupt_w25q32/init/main.c | 50 + .../sample_spi_interrupt_w25q32/init/main.h | 56 + .../init/system_init.c | 203 ++ .../spi/sample_spi_interrupt_w25q32/readme.md | 20 + .../src/sample_spi_interrupt_w25q32.c | 286 +++ .../sample_spi_interrupt_w25q32_internal.h | 28 + .../init/main.c | 51 + .../init/main.h | 56 + .../init/system_init.c | 203 ++ .../readme.md | 20 + .../sample_spi_interrupt_w25q32_internal.c | 268 +++ .../sample_spi_master/inc/sample_spi_master.h | 28 + .../spi/sample_spi_master/init/main.c | 50 + .../spi/sample_spi_master/init/main.h | 50 + .../spi/sample_spi_master/init/system_init.c | 157 ++ .../spi/sample_spi_master/readme.md | 18 + .../sample_spi_master/src/sample_spi_master.c | 97 + .../inc/sample_spi_microwire_master.h | 28 + .../sample_spi_microwire_master/init/main.c | 34 + .../sample_spi_microwire_master/init/main.h | 43 + .../init/system_init.c | 125 ++ .../spi/sample_spi_microwire_master/readme.md | 26 + .../src/sample_spi_microwire_master.c | 84 + .../inc/sample_spi_microwire_slave.h | 28 + .../sample_spi_microwire_slave/init/main.c | 35 + .../sample_spi_microwire_slave/init/main.h | 46 + .../init/system_init.c | 163 ++ .../spi/sample_spi_microwire_slave/readme.md | 26 + .../src/sample_spi_microwire_slave.c | 118 + .../sample_spi_slave/inc/sample_spi_slave.h | 28 + .../spi/sample_spi_slave/init/main.c | 35 + .../spi/sample_spi_slave/init/main.h | 46 + .../spi/sample_spi_slave/init/system_init.c | 163 ++ drivers_sample/spi/sample_spi_slave/readme.md | 18 + .../sample_spi_slave/src/sample_spi_slave.c | 97 + .../inc/sample_timer_interrupt.h | 32 + .../timer/sample_timer_interrupt/init/main.c | 48 + .../timer/sample_timer_interrupt/init/main.h | 52 + .../sample_timer_interrupt/init/system_init.c | 123 ++ .../timer/sample_timer_interrupt/readme.md | 18 + .../src/sample_timer_interrupt.c | 65 + .../sample_tsensor/inc/sample_tsensor.h | 32 + .../tsensor/sample_tsensor/readme.txt | 6 + .../sample_tsensor/src/sample_tsensor.c | 48 + .../inc/sample_uart_baud_detect.h | 33 + .../uart/sample_uart_baud_detect/init/main.c | 50 + .../uart/sample_uart_baud_detect/init/main.h | 55 + .../init/system_init.c | 136 ++ .../uart/sample_uart_baud_detect/readme.md | 19 + .../src/sample_uart_baud_detect.c | 67 + .../inc/sample_uart_blocking_rx.h | 35 + .../uart/sample_uart_blocking_rx/init/main.c | 34 + .../uart/sample_uart_blocking_rx/init/main.h | 43 + .../init/system_init.c | 90 + .../uart/sample_uart_blocking_rx/readme.md | 23 + .../src/sample_uart_blocking_rx.c | 53 + .../inc/sample_uart_blocking_tx.h | 35 + .../uart/sample_uart_blocking_tx/init/main.c | 34 + .../uart/sample_uart_blocking_tx/init/main.h | 48 + .../init/system_init.c | 91 + .../uart/sample_uart_blocking_tx/readme.md | 22 + .../src/sample_uart_blocking_tx.c | 53 + .../inc/sample_uart_character_match.h | 35 + .../sample_uart_character_match/init/main.c | 50 + .../sample_uart_character_match/init/main.h | 53 + .../init/system_init.c | 129 ++ .../sample_uart_character_match/readme.md | 16 + .../src/sample_uart_character_match.c | 67 + .../inc/sample_uart_dma_rx.h | 33 + .../uart/sample_uart_dma_rx/init/main.c | 48 + .../uart/sample_uart_dma_rx/init/main.h | 58 + .../sample_uart_dma_rx/init/system_init.c | 142 ++ .../uart/sample_uart_dma_rx/readme.md | 22 + .../src/sample_uart_dma_rx.c | 59 + .../sample_uart_dma_rx_cyclically_stored.h | 34 + .../init/main.c | 51 + .../init/main.h | 54 + .../init/system_init.c | 131 ++ .../readme.md | 21 + .../sample_uart_dma_rx_cyclically_stored.c | 65 + .../inc/sample_uart_dma_tx.h | 33 + .../uart/sample_uart_dma_tx/init/main.c | 48 + .../uart/sample_uart_dma_tx/init/main.h | 57 + .../sample_uart_dma_tx/init/system_init.c | 144 ++ .../uart/sample_uart_dma_tx/readme.md | 22 + .../src/sample_uart_dma_tx.c | 58 + ...sample_uart_dma_tx_dma_rx_simultaneously.h | 33 + .../init/main.c | 48 + .../init/main.h | 54 + .../init/system_init.c | 158 ++ .../readme.md | 22 + ...sample_uart_dma_tx_dma_rx_simultaneously.c | 113 + ...sample_uart_dma_tx_int_rx_simultaneously.h | 33 + .../init/main.c | 48 + .../init/main.h | 57 + .../init/system_init.c | 150 ++ .../readme.md | 22 + ...sample_uart_dma_tx_int_rx_simultaneously.c | 115 + ...sample_uart_int_tx_dma_rx_simultaneously.h | 34 + .../init/main.c | 48 + .../init/main.h | 57 + .../init/system_init.c | 150 ++ .../readme.md | 22 + ...sample_uart_int_tx_dma_rx_simultaneously.c | 115 + ...sample_uart_int_tx_int_rx_simultaneously.h | 33 + .../init/main.c | 47 + .../init/main.h | 53 + .../init/system_init.c | 118 + .../readme.md | 22 + ...sample_uart_int_tx_int_rx_simultaneously.c | 114 + .../inc/sample_uart_interrupt_rx.h | 33 + .../uart/sample_uart_interrupt_rx/init/main.c | 47 + .../uart/sample_uart_interrupt_rx/init/main.h | 53 + .../init/system_init.c | 119 + .../uart/sample_uart_interrupt_rx/readme.md | 22 + .../src/sample_uart_interrupt_rx.c | 64 + .../inc/sample_uart_interrupt_tx.h | 33 + .../uart/sample_uart_interrupt_tx/init/main.c | 47 + .../uart/sample_uart_interrupt_tx/init/main.h | 53 + .../init/system_init.c | 118 + .../uart/sample_uart_interrupt_tx/readme.md | 20 + .../src/sample_uart_interrupt_tx.c | 58 + .../inc/sample_uart_interrupt_tx_after_rx.h | 33 + .../init/main.c | 47 + .../init/main.h | 52 + .../init/system_init.c | 118 + .../readme.md | 22 + .../src/sample_uart_interrupt_tx_after_rx.c | 114 + .../sample_uart_single_wire_communication.h | 55 + .../init/main.c | 51 + .../init/main.h | 60 + .../init/system_init.c | 268 +++ .../readme.md | 28 + .../sample_uart_single_wire_communication.c | 354 +++ .../inc/sample_iwdg_refresh.h | 30 + .../wdg/sample_iwdg_refresh/init/main.c | 52 + .../wdg/sample_iwdg_refresh/init/main.h | 59 + .../sample_iwdg_refresh/init/system_init.c | 112 + .../wdg/sample_iwdg_refresh/readme.md | 18 + .../src/sample_iwdg_refresh.c | 58 + .../sample_iwdg_reset/inc/iwdg_reset_sample.h | 30 + .../wdg/sample_iwdg_reset/init/main.c | 51 + .../wdg/sample_iwdg_reset/init/main.h | 47 + .../wdg/sample_iwdg_reset/init/system_init.c | 118 + .../wdg/sample_iwdg_reset/readme.md | 18 + .../sample_iwdg_reset/src/iwdg_reset_sample.c | 78 + .../sample_wdg_reset/inc/wdg_reset_sample.h | 30 + .../wdg/sample_wdg_reset/init/main.c | 35 + .../wdg/sample_wdg_reset/init/main.h | 48 + .../wdg/sample_wdg_reset/init/system_init.c | 116 + drivers_sample/wdg/sample_wdg_reset/readme.md | 18 + .../sample_wdg_reset/src/wdg_reset_sample.c | 77 + .../inc/sample_wwdg_refresh.h | 30 + .../wdg/sample_wwdg_refresh/init/main.c | 50 + .../wdg/sample_wwdg_refresh/init/main.h | 52 + .../sample_wwdg_refresh/init/system_init.c | 119 + .../wdg/sample_wwdg_refresh/readme.md | 18 + .../src/sample_wwdg_refresh.c | 76 + .../1726194739756.jpg" | Bin 0 -> 5782 bytes .../1726194776437.jpg" | Bin 0 -> 29480 bytes .../1726194794028.jpg" | Bin 0 -> 62232 bytes .../1726194824764.jpg" | Bin 0 -> 2866 bytes .../1726194869607.jpg" | Bin 0 -> 166495 bytes .../1726194906962.jpg" | Bin 0 -> 4937 bytes .../1726194945180.jpg" | Bin 0 -> 171355 bytes .../1726194962547.jpg" | Bin 0 -> 7234 bytes .../1726194980430.jpg" | Bin 0 -> 10987 bytes .../1726195007716.jpg" | Bin 0 -> 5702 bytes .../1726195033006.jpg" | Bin 0 -> 2418 bytes .../1726195055385.jpg" | Bin 0 -> 4448 bytes .../1726195173004.jpg" | Bin 0 -> 538 bytes .../1726195185553.jpg" | Bin 0 -> 538 bytes ...07\345\257\274\346\211\213\345\206\214.md" | 1967 +++++++++++++++++ 552 files changed, 36371 insertions(+) create mode 100644 drivers_sample/acmp/sample_acmp_interrupt/inc/sample_acmp_interrupt.h create mode 100644 drivers_sample/acmp/sample_acmp_interrupt/init/main.c create mode 100644 drivers_sample/acmp/sample_acmp_interrupt/init/main.h create mode 100644 drivers_sample/acmp/sample_acmp_interrupt/init/system_init.c create mode 100644 drivers_sample/acmp/sample_acmp_interrupt/readme.md create mode 100644 drivers_sample/acmp/sample_acmp_interrupt/src/sample_acmp_interrupt.c create mode 100644 drivers_sample/acmp/sample_acmp_out_result/inc/sample_acmp_out_result.h create mode 100644 drivers_sample/acmp/sample_acmp_out_result/init/main.c create mode 100644 drivers_sample/acmp/sample_acmp_out_result/init/main.h create mode 100644 drivers_sample/acmp/sample_acmp_out_result/init/system_init.c create mode 100644 drivers_sample/acmp/sample_acmp_out_result/readme.md create mode 100644 drivers_sample/acmp/sample_acmp_out_result/src/sample_acmp_out_result.c create mode 100644 drivers_sample/adc/sample_adc_associative_trigger_of_apt/inc/sample_adc_associative_trigger_apt.h create mode 100644 drivers_sample/adc/sample_adc_associative_trigger_of_apt/init/main.c create mode 100644 drivers_sample/adc/sample_adc_associative_trigger_of_apt/init/main.h create mode 100644 drivers_sample/adc/sample_adc_associative_trigger_of_apt/init/system_init.c create mode 100644 drivers_sample/adc/sample_adc_associative_trigger_of_apt/readme.md create mode 100644 drivers_sample/adc/sample_adc_associative_trigger_of_apt/src/sample_adc_associative_trigger_apt.c create mode 100644 drivers_sample/adc/sample_adc_continue_trigger/inc/sample_adc_continue_trigger.h create mode 100644 drivers_sample/adc/sample_adc_continue_trigger/init/main.c create mode 100644 drivers_sample/adc/sample_adc_continue_trigger/init/main.h create mode 100644 drivers_sample/adc/sample_adc_continue_trigger/init/system_init.c create mode 100644 drivers_sample/adc/sample_adc_continue_trigger/readme.md create mode 100644 drivers_sample/adc/sample_adc_continue_trigger/src/sample_adc_continue_trigger.c create mode 100644 drivers_sample/adc/sample_adc_over_sample/inc/sample_adc_over_sample.h create mode 100644 drivers_sample/adc/sample_adc_over_sample/init/main.c create mode 100644 drivers_sample/adc/sample_adc_over_sample/init/main.h create mode 100644 drivers_sample/adc/sample_adc_over_sample/init/system_init.c create mode 100644 drivers_sample/adc/sample_adc_over_sample/readme.md create mode 100644 drivers_sample/adc/sample_adc_over_sample/src/sample_adc_over_sample.c create mode 100644 drivers_sample/adc/sample_adc_oversampling_it/inc/sample_adc_oversampling_it.h create mode 100644 drivers_sample/adc/sample_adc_oversampling_it/init/main.c create mode 100644 drivers_sample/adc/sample_adc_oversampling_it/init/main.h create mode 100644 drivers_sample/adc/sample_adc_oversampling_it/init/system_init.c create mode 100644 drivers_sample/adc/sample_adc_oversampling_it/readme.md create mode 100644 drivers_sample/adc/sample_adc_oversampling_it/src/sample_adc_oversampling_it.c create mode 100644 drivers_sample/adc/sample_adc_single_trigger/inc/sample_adc_single_trigger.h create mode 100644 drivers_sample/adc/sample_adc_single_trigger/init/main.c create mode 100644 drivers_sample/adc/sample_adc_single_trigger/init/main.h create mode 100644 drivers_sample/adc/sample_adc_single_trigger/init/system_init.c create mode 100644 drivers_sample/adc/sample_adc_single_trigger/readme.md create mode 100644 drivers_sample/adc/sample_adc_single_trigger/src/sample_adc_single_trigger.c create mode 100644 drivers_sample/adc/sample_adc_single_trigger_dma/inc/sample_adc_single_trigger_dma.h create mode 100644 drivers_sample/adc/sample_adc_single_trigger_dma/init/main.c create mode 100644 drivers_sample/adc/sample_adc_single_trigger_dma/init/main.h create mode 100644 drivers_sample/adc/sample_adc_single_trigger_dma/init/system_init.c create mode 100644 drivers_sample/adc/sample_adc_single_trigger_dma/readme.md create mode 100644 drivers_sample/adc/sample_adc_single_trigger_dma/src/sample_adc_single_trigger_dma.c create mode 100644 drivers_sample/adc/sample_adc_single_trigger_it/inc/sample_adc_single_trigger_it.h create mode 100644 drivers_sample/adc/sample_adc_single_trigger_it/init/main.c create mode 100644 drivers_sample/adc/sample_adc_single_trigger_it/init/main.h create mode 100644 drivers_sample/adc/sample_adc_single_trigger_it/init/system_init.c create mode 100644 drivers_sample/adc/sample_adc_single_trigger_it/readme.md create mode 100644 drivers_sample/adc/sample_adc_single_trigger_it/src/sample_adc_single_trigger_it.c create mode 100644 drivers_sample/adc/sample_adc_single_with_ppb/inc/sample_adc_single_with_ppb.h create mode 100644 drivers_sample/adc/sample_adc_single_with_ppb/init/main.c create mode 100644 drivers_sample/adc/sample_adc_single_with_ppb/init/main.h create mode 100644 drivers_sample/adc/sample_adc_single_with_ppb/init/system_init.c create mode 100644 drivers_sample/adc/sample_adc_single_with_ppb/readme.md create mode 100644 drivers_sample/adc/sample_adc_single_with_ppb/src/sample_adc_single_with_ppb.c create mode 100644 drivers_sample/adc/sample_adc_sync_sample/inc/sample_adc_sync_sample.h create mode 100644 drivers_sample/adc/sample_adc_sync_sample/init/main.c create mode 100644 drivers_sample/adc/sample_adc_sync_sample/init/main.h create mode 100644 drivers_sample/adc/sample_adc_sync_sample/init/system_init.c create mode 100644 drivers_sample/adc/sample_adc_sync_sample/readme.md create mode 100644 drivers_sample/adc/sample_adc_sync_sample/src/sample_adc_sync_sample.c create mode 100644 drivers_sample/adc/sample_adc_sync_sample_dma/inc/sample_adc_sync_sample_dma.h create mode 100644 drivers_sample/adc/sample_adc_sync_sample_dma/init/main.c create mode 100644 drivers_sample/adc/sample_adc_sync_sample_dma/init/main.h create mode 100644 drivers_sample/adc/sample_adc_sync_sample_dma/init/system_init.c create mode 100644 drivers_sample/adc/sample_adc_sync_sample_dma/readme.md create mode 100644 drivers_sample/adc/sample_adc_sync_sample_dma/src/sample_adc_sync_sample_dma.c create mode 100644 drivers_sample/adc/sample_adc_sync_sample_it/inc/sample_adc_sync_sample_it.h create mode 100644 drivers_sample/adc/sample_adc_sync_sample_it/init/main.c create mode 100644 drivers_sample/adc/sample_adc_sync_sample_it/init/main.h create mode 100644 drivers_sample/adc/sample_adc_sync_sample_it/init/system_init.c create mode 100644 drivers_sample/adc/sample_adc_sync_sample_it/readme.md create mode 100644 drivers_sample/adc/sample_adc_sync_sample_it/src/sample_adc_sync_sample_it.c create mode 100644 drivers_sample/apt/sample_apt_single_resistor/inc/sample_apt_single_resistor.h create mode 100644 drivers_sample/apt/sample_apt_single_resistor/init/main.c create mode 100644 drivers_sample/apt/sample_apt_single_resistor/init/main.h create mode 100644 drivers_sample/apt/sample_apt_single_resistor/init/system_init.c create mode 100644 drivers_sample/apt/sample_apt_single_resistor/readme.md create mode 100644 drivers_sample/apt/sample_apt_single_resistor/src/sample_apt_single_resistor.c create mode 100644 drivers_sample/can/sample_can_send_receive/inc/sample_can_send_receive.h create mode 100644 drivers_sample/can/sample_can_send_receive/init/main.c create mode 100644 drivers_sample/can/sample_can_send_receive/init/main.h create mode 100644 drivers_sample/can/sample_can_send_receive/init/system_init.c create mode 100644 drivers_sample/can/sample_can_send_receive/readme.md create mode 100644 drivers_sample/can/sample_can_send_receive/src/sample_can_send_receive.c create mode 100644 drivers_sample/capm/capm_hall_sample/inc/capm_hall_sample.h create mode 100644 drivers_sample/capm/capm_hall_sample/init/main.c create mode 100644 drivers_sample/capm/capm_hall_sample/init/main.h create mode 100644 drivers_sample/capm/capm_hall_sample/init/system_init.c create mode 100644 drivers_sample/capm/capm_hall_sample/readme.md create mode 100644 drivers_sample/capm/capm_hall_sample/src/capm_hall_sample.c create mode 100644 drivers_sample/cfd/sample_cfd_check_error/inc/cfd_check_error_sample.h create mode 100644 drivers_sample/cfd/sample_cfd_check_error/init/main.c create mode 100644 drivers_sample/cfd/sample_cfd_check_error/init/main.h create mode 100644 drivers_sample/cfd/sample_cfd_check_error/init/system_init.c create mode 100644 drivers_sample/cfd/sample_cfd_check_error/readme.md create mode 100644 drivers_sample/cfd/sample_cfd_check_error/src/cfd_check_error_sample.c create mode 100644 drivers_sample/cmm/sample_cmm_check_error/inc/cmm_check_error_sample.h create mode 100644 drivers_sample/cmm/sample_cmm_check_error/init/main.c create mode 100644 drivers_sample/cmm/sample_cmm_check_error/init/main.h create mode 100644 drivers_sample/cmm/sample_cmm_check_error/init/system_init.c create mode 100644 drivers_sample/cmm/sample_cmm_check_error/readme.md create mode 100644 drivers_sample/cmm/sample_cmm_check_error/src/cmm_check_error_sample.c create mode 100644 drivers_sample/crc/sample_crc_gen_algo/inc/sample_crc_gen_algo.h create mode 100644 drivers_sample/crc/sample_crc_gen_algo/init/main.c create mode 100644 drivers_sample/crc/sample_crc_gen_algo/init/main.h create mode 100644 drivers_sample/crc/sample_crc_gen_algo/init/system_init.c create mode 100644 drivers_sample/crc/sample_crc_gen_algo/readme.md create mode 100644 drivers_sample/crc/sample_crc_gen_algo/src/sample_crc_gen_algo.c create mode 100644 drivers_sample/crc/sample_crc_load_algo/inc/sample_crc_load_algo.h create mode 100644 drivers_sample/crc/sample_crc_load_algo/init/main.c create mode 100644 drivers_sample/crc/sample_crc_load_algo/init/main.h create mode 100644 drivers_sample/crc/sample_crc_load_algo/init/system_init.c create mode 100644 drivers_sample/crc/sample_crc_load_algo/readme.md create mode 100644 drivers_sample/crc/sample_crc_load_algo/src/sample_crc_load_algo.c create mode 100644 drivers_sample/dac/sample_dac/init/main.c create mode 100644 drivers_sample/dac/sample_dac/init/main.h create mode 100644 drivers_sample/dac/sample_dac/init/system_init.c create mode 100644 drivers_sample/dac/sample_dac/readme.md create mode 100644 drivers_sample/dma/sample_dma_list_transfer/inc/sample_dma_list_transfer.h create mode 100644 drivers_sample/dma/sample_dma_list_transfer/readme.md create mode 100644 drivers_sample/dma/sample_dma_list_transfer/src/sample_dma_list_transfer.c create mode 100644 drivers_sample/dma/sample_dma_list_transfer_continue/inc/sample_dma_list_transfer_continue.h create mode 100644 drivers_sample/dma/sample_dma_list_transfer_continue/readme.md create mode 100644 drivers_sample/dma/sample_dma_list_transfer_continue/src/sample_dma_list_transfer_continue.c create mode 100644 drivers_sample/dma/sample_dma_list_transfer_continue/sysinit/main.c create mode 100644 drivers_sample/dma/sample_dma_list_transfer_continue/sysinit/main.h create mode 100644 drivers_sample/dma/sample_dma_list_transfer_continue/sysinit/system_init.c create mode 100644 drivers_sample/dma/sample_dma_mem_to_mem/inc/sample_dma_mem_to_mem.h create mode 100644 drivers_sample/dma/sample_dma_mem_to_mem/init/main.c create mode 100644 drivers_sample/dma/sample_dma_mem_to_mem/init/main.h create mode 100644 drivers_sample/dma/sample_dma_mem_to_mem/init/system_init.c create mode 100644 drivers_sample/dma/sample_dma_mem_to_mem/readme.md create mode 100644 drivers_sample/dma/sample_dma_mem_to_mem/src/sample_dma_mem_to_mem.c create mode 100644 drivers_sample/dma/sample_dma_mem_to_per/inc/sample_dma_mem_to_per.h create mode 100644 drivers_sample/dma/sample_dma_mem_to_per/readme.md create mode 100644 drivers_sample/dma/sample_dma_mem_to_per/src/sample_dma_mem_to_per.c create mode 100644 drivers_sample/dma/sample_dma_per_to_mem/inc/sample_dma_per_to_mem.h create mode 100644 drivers_sample/dma/sample_dma_per_to_mem/readme.md create mode 100644 drivers_sample/dma/sample_dma_per_to_mem/src/sample_dma_per_to_mem.c create mode 100644 drivers_sample/dma/sample_dma_per_to_per/inc/sample_dma_per_to_per.h create mode 100644 drivers_sample/dma/sample_dma_per_to_per/readme.md create mode 100644 drivers_sample/dma/sample_dma_per_to_per/src/sample_dma_per_to_per.c create mode 100644 drivers_sample/flash/sample_flash_blocking/inc/sample_flash_blocking.h create mode 100644 drivers_sample/flash/sample_flash_blocking/init/main.c create mode 100644 drivers_sample/flash/sample_flash_blocking/init/main.h create mode 100644 drivers_sample/flash/sample_flash_blocking/init/system_init.c create mode 100644 drivers_sample/flash/sample_flash_blocking/readme.md create mode 100644 drivers_sample/flash/sample_flash_blocking/src/sample_flash_blocking.c create mode 100644 drivers_sample/flash/sample_flash_blocking_mode/inc/sample_flash_blocking_mode.h create mode 100644 drivers_sample/flash/sample_flash_blocking_mode/init/main.c create mode 100644 drivers_sample/flash/sample_flash_blocking_mode/init/main.h create mode 100644 drivers_sample/flash/sample_flash_blocking_mode/init/system_init.c create mode 100644 drivers_sample/flash/sample_flash_blocking_mode/readme.md create mode 100644 drivers_sample/flash/sample_flash_blocking_mode/src/sample_flash_blocking_mode.c create mode 100644 drivers_sample/flash/sample_flash_interrupt/inc/sample_flash_interrupt.h create mode 100644 drivers_sample/flash/sample_flash_interrupt/init/main.c create mode 100644 drivers_sample/flash/sample_flash_interrupt/init/main.h create mode 100644 drivers_sample/flash/sample_flash_interrupt/init/system_init.c create mode 100644 drivers_sample/flash/sample_flash_interrupt/readme.md create mode 100644 drivers_sample/flash/sample_flash_interrupt/src/sample_flash_interrupt.c create mode 100644 drivers_sample/flash/sample_flash_interrupt_mode/inc/sample_flash_interrupt_mode.h create mode 100644 drivers_sample/flash/sample_flash_interrupt_mode/init/main.c create mode 100644 drivers_sample/flash/sample_flash_interrupt_mode/init/main.h create mode 100644 drivers_sample/flash/sample_flash_interrupt_mode/init/system_init.c create mode 100644 drivers_sample/flash/sample_flash_interrupt_mode/readme.md create mode 100644 drivers_sample/flash/sample_flash_interrupt_mode/src/sample_flash_interrupt_mode.c create mode 100644 drivers_sample/gpio/sample_gpio_circle/inc/gpio_circle_sample.h create mode 100644 drivers_sample/gpio/sample_gpio_circle/init/main.c create mode 100644 drivers_sample/gpio/sample_gpio_circle/init/main.h create mode 100644 drivers_sample/gpio/sample_gpio_circle/init/system_init.c create mode 100644 drivers_sample/gpio/sample_gpio_circle/readme.md create mode 100644 drivers_sample/gpio/sample_gpio_circle/src/gpio_circle_sample.c create mode 100644 drivers_sample/gpio/sample_gpio_interrupt/inc/gpio_interrupt_sample.h create mode 100644 drivers_sample/gpio/sample_gpio_interrupt/init/main.c create mode 100644 drivers_sample/gpio/sample_gpio_interrupt/init/main.h create mode 100644 drivers_sample/gpio/sample_gpio_interrupt/init/system_init.c create mode 100644 drivers_sample/gpio/sample_gpio_interrupt/readme.md create mode 100644 drivers_sample/gpio/sample_gpio_interrupt/src/gpio_interrupt_sample.c create mode 100644 drivers_sample/gpio/sample_gpio_key/inc/gpio_key_sample.h create mode 100644 drivers_sample/gpio/sample_gpio_key/init/main.c create mode 100644 drivers_sample/gpio/sample_gpio_key/init/main.h create mode 100644 drivers_sample/gpio/sample_gpio_key/init/system_init.c create mode 100644 drivers_sample/gpio/sample_gpio_key/readme.md create mode 100644 drivers_sample/gpio/sample_gpio_key/src/gpio_key_sample.c create mode 100644 drivers_sample/gpio/sample_gpio_led/inc/gpio_led_sample.h create mode 100644 drivers_sample/gpio/sample_gpio_led/init/main.c create mode 100644 drivers_sample/gpio/sample_gpio_led/init/main.h create mode 100644 drivers_sample/gpio/sample_gpio_led/init/system_init.c create mode 100644 drivers_sample/gpio/sample_gpio_led/readme.md create mode 100644 drivers_sample/gpio/sample_gpio_led/src/gpio_led_sample.c create mode 100644 drivers_sample/gpt/sample_gpt_period_interrupt/inc/sample_gpt_period_interrupt.h create mode 100644 drivers_sample/gpt/sample_gpt_period_interrupt/init/main.c create mode 100644 drivers_sample/gpt/sample_gpt_period_interrupt/init/main.h create mode 100644 drivers_sample/gpt/sample_gpt_period_interrupt/init/system_init.c create mode 100644 drivers_sample/gpt/sample_gpt_period_interrupt/readme.md create mode 100644 drivers_sample/gpt/sample_gpt_period_interrupt/src/sample_gpt_period_interrupt.c create mode 100644 drivers_sample/gpt/sample_gpt_pwm_output/inc/sample_gpt_pwm_output.h create mode 100644 drivers_sample/gpt/sample_gpt_pwm_output/init/main.c create mode 100644 drivers_sample/gpt/sample_gpt_pwm_output/init/main.h create mode 100644 drivers_sample/gpt/sample_gpt_pwm_output/init/system_init.c create mode 100644 drivers_sample/gpt/sample_gpt_pwm_output/readme.md create mode 100644 drivers_sample/gpt/sample_gpt_pwm_output/src/sample_gpt_pwm_output.c create mode 100644 drivers_sample/gpt/sample_gpt_simplerun/inc/sample_gpt_simplerun.h create mode 100644 drivers_sample/gpt/sample_gpt_simplerun/init/main.c create mode 100644 drivers_sample/gpt/sample_gpt_simplerun/init/main.h create mode 100644 drivers_sample/gpt/sample_gpt_simplerun/init/system_init.c create mode 100644 drivers_sample/gpt/sample_gpt_simplerun/readme.md create mode 100644 drivers_sample/gpt/sample_gpt_simplerun/src/sample_gpt_simplerun.c create mode 100644 drivers_sample/i2c/sample_i2c_blocking_stlm75/inc/sample_i2c_blocking_stlm75.h create mode 100644 drivers_sample/i2c/sample_i2c_blocking_stlm75/init/main.c create mode 100644 drivers_sample/i2c/sample_i2c_blocking_stlm75/init/main.h create mode 100644 drivers_sample/i2c/sample_i2c_blocking_stlm75/init/system_init.c create mode 100644 drivers_sample/i2c/sample_i2c_blocking_stlm75/readme.md create mode 100644 drivers_sample/i2c/sample_i2c_blocking_stlm75/src/sample_i2c_blocking_stlm75.c create mode 100644 drivers_sample/i2c/sample_i2c_dma_stlm75/inc/sample_i2c_dma_stlm75.h create mode 100644 drivers_sample/i2c/sample_i2c_dma_stlm75/init/main.c create mode 100644 drivers_sample/i2c/sample_i2c_dma_stlm75/init/main.h create mode 100644 drivers_sample/i2c/sample_i2c_dma_stlm75/init/system_init.c create mode 100644 drivers_sample/i2c/sample_i2c_dma_stlm75/readme.md create mode 100644 drivers_sample/i2c/sample_i2c_dma_stlm75/src/sample_i2c_dma_stlm75.c create mode 100644 drivers_sample/i2c/sample_i2c_interrupt_stlm75/inc/sample_i2c_interrupt_stlm75.h create mode 100644 drivers_sample/i2c/sample_i2c_interrupt_stlm75/init/main.c create mode 100644 drivers_sample/i2c/sample_i2c_interrupt_stlm75/init/main.h create mode 100644 drivers_sample/i2c/sample_i2c_interrupt_stlm75/init/system_init.c create mode 100644 drivers_sample/i2c/sample_i2c_interrupt_stlm75/readme.md create mode 100644 drivers_sample/i2c/sample_i2c_interrupt_stlm75/src/sample_i2c_interrupt_stlm75.c create mode 100644 drivers_sample/i2c/sample_i2c_master_blocking_at24c64/inc/sample_i2c_master_blocking_at24c64.h create mode 100644 drivers_sample/i2c/sample_i2c_master_blocking_at24c64/init/main.c create mode 100644 drivers_sample/i2c/sample_i2c_master_blocking_at24c64/init/main.h create mode 100644 drivers_sample/i2c/sample_i2c_master_blocking_at24c64/init/system_init.c create mode 100644 drivers_sample/i2c/sample_i2c_master_blocking_at24c64/readme.md create mode 100644 drivers_sample/i2c/sample_i2c_master_blocking_at24c64/src/sample_i2c_master_blocking_at24c64.c create mode 100644 drivers_sample/i2c/sample_i2c_master_dma_at24c64/inc/sample_i2c_master_dma_at24c64.h create mode 100644 drivers_sample/i2c/sample_i2c_master_dma_at24c64/init/main.c create mode 100644 drivers_sample/i2c/sample_i2c_master_dma_at24c64/init/main.h create mode 100644 drivers_sample/i2c/sample_i2c_master_dma_at24c64/init/system_init.c create mode 100644 drivers_sample/i2c/sample_i2c_master_dma_at24c64/readme.md create mode 100644 drivers_sample/i2c/sample_i2c_master_dma_at24c64/src/sample_i2c_master_dma_at24c64.c create mode 100644 drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/inc/sample_i2c_master_interrupt_at24c64.h create mode 100644 drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/init/main.c create mode 100644 drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/init/main.h create mode 100644 drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/init/system_init.c create mode 100644 drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/readme.md create mode 100644 drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/src/sample_i2c_master_interrupt_at24c64.c create mode 100644 drivers_sample/i2c/sample_i2c_slave_blocking/inc/sample_i2c_slave_blocking.h create mode 100644 drivers_sample/i2c/sample_i2c_slave_blocking/init/main.c create mode 100644 drivers_sample/i2c/sample_i2c_slave_blocking/init/main.h create mode 100644 drivers_sample/i2c/sample_i2c_slave_blocking/init/system_init.c create mode 100644 drivers_sample/i2c/sample_i2c_slave_blocking/readme.md create mode 100644 drivers_sample/i2c/sample_i2c_slave_blocking/src/sample_i2c_slave_blocking.c create mode 100644 drivers_sample/i2c/sample_i2c_slave_dma/inc/sample_i2c_slave_dma.h create mode 100644 drivers_sample/i2c/sample_i2c_slave_dma/init/main.c create mode 100644 drivers_sample/i2c/sample_i2c_slave_dma/init/main.h create mode 100644 drivers_sample/i2c/sample_i2c_slave_dma/init/system_init.c create mode 100644 drivers_sample/i2c/sample_i2c_slave_dma/readme.md create mode 100644 drivers_sample/i2c/sample_i2c_slave_dma/src/sample_i2c_slave_dma.c create mode 100644 drivers_sample/i2c/sample_i2c_slave_interrupt/inc/sample_i2c_slave_interrupt.h create mode 100644 drivers_sample/i2c/sample_i2c_slave_interrupt/init/main.c create mode 100644 drivers_sample/i2c/sample_i2c_slave_interrupt/init/main.h create mode 100644 drivers_sample/i2c/sample_i2c_slave_interrupt/init/system_init.c create mode 100644 drivers_sample/i2c/sample_i2c_slave_interrupt/readme.md create mode 100644 drivers_sample/i2c/sample_i2c_slave_interrupt/src/sample_i2c_slave_interrupt.c create mode 100644 drivers_sample/iocmg/iolist_sample/inc/iolist_sample.h create mode 100644 drivers_sample/iocmg/iolist_sample/init/main.c create mode 100644 drivers_sample/iocmg/iolist_sample/init/main.h create mode 100644 drivers_sample/iocmg/iolist_sample/init/system_init.c create mode 100644 drivers_sample/iocmg/iolist_sample/readme.md create mode 100644 drivers_sample/iocmg/iolist_sample/src/iolist_sample.c create mode 100644 drivers_sample/iocmg/sample_iocfg_list/inc/sample_iocfg_list.h create mode 100644 drivers_sample/iocmg/sample_iocfg_list/init/main.c create mode 100644 drivers_sample/iocmg/sample_iocfg_list/init/main.h create mode 100644 drivers_sample/iocmg/sample_iocfg_list/init/system_init.c create mode 100644 drivers_sample/iocmg/sample_iocfg_list/readme.rd create mode 100644 drivers_sample/iocmg/sample_iocfg_list/src/sample_iocfg_list.c create mode 160000 drivers_sample/open_mcu create mode 160000 drivers_sample/open_mcu_1 create mode 100644 drivers_sample/pga/sample_pga/init/main.c create mode 100644 drivers_sample/pga/sample_pga/init/main.h create mode 100644 drivers_sample/pga/sample_pga/init/system_init.c create mode 100644 drivers_sample/pga/sample_pga/readme.md create mode 100644 drivers_sample/pga/sample_pga_extra_resistor/init/main.c create mode 100644 drivers_sample/pga/sample_pga_extra_resistor/init/main.h create mode 100644 drivers_sample/pga/sample_pga_extra_resistor/init/system_init.c create mode 100644 drivers_sample/pga/sample_pga_extra_resistor/readme.md create mode 100644 drivers_sample/pga/sample_pga_result_sampling/inc/sample_pga_result_sampling.h create mode 100644 drivers_sample/pga/sample_pga_result_sampling/init/main.c create mode 100644 drivers_sample/pga/sample_pga_result_sampling/init/main.h create mode 100644 drivers_sample/pga/sample_pga_result_sampling/init/system_init.c create mode 100644 drivers_sample/pga/sample_pga_result_sampling/readme.md create mode 100644 drivers_sample/pga/sample_pga_result_sampling/src/sample_pga_result_sampling.c create mode 100644 drivers_sample/pic/1726194739756.jpg create mode 100644 drivers_sample/pic/1726194776437.jpg create mode 100644 drivers_sample/pic/1726194794028.jpg create mode 100644 drivers_sample/pic/1726194824764.jpg create mode 100644 drivers_sample/pic/1726194869607.jpg create mode 100644 drivers_sample/pic/1726194906962-1726195658552-18.jpg create mode 100644 drivers_sample/pic/1726194906962.jpg create mode 100644 drivers_sample/pic/1726194945180.jpg create mode 100644 drivers_sample/pic/1726194962547-1726195476280-9.jpg create mode 100644 drivers_sample/pic/1726194962547.jpg create mode 100644 drivers_sample/pic/1726194980430.jpg create mode 100644 drivers_sample/pic/1726195007716.jpg create mode 100644 drivers_sample/pic/1726195033006.jpg create mode 100644 drivers_sample/pic/1726195055385.jpg create mode 100644 drivers_sample/pic/1726195173004.jpg create mode 100644 drivers_sample/pic/1726195185553.jpg create mode 100644 drivers_sample/pmc/sample_pmc_pvd/inc/sample_pmc_pvd.h create mode 100644 drivers_sample/pmc/sample_pmc_pvd/init/main.c create mode 100644 drivers_sample/pmc/sample_pmc_pvd/init/main.h create mode 100644 drivers_sample/pmc/sample_pmc_pvd/init/system_init.c create mode 100644 drivers_sample/pmc/sample_pmc_pvd/readme.md create mode 100644 drivers_sample/pmc/sample_pmc_pvd/src/sample_pmc_pvd.c create mode 100644 drivers_sample/pmc/sample_pmc_wakeup/inc/sample_pmc_wakeup.h create mode 100644 drivers_sample/pmc/sample_pmc_wakeup/init/main.c create mode 100644 drivers_sample/pmc/sample_pmc_wakeup/init/main.h create mode 100644 drivers_sample/pmc/sample_pmc_wakeup/init/system_init.c create mode 100644 drivers_sample/pmc/sample_pmc_wakeup/readme.md create mode 100644 drivers_sample/pmc/sample_pmc_wakeup/src/sample_pmc_wakeup.c create mode 100644 drivers_sample/qdm/sample_qdm_m/inc/sample_qdm_m.h create mode 100644 drivers_sample/qdm/sample_qdm_m/init/main.c create mode 100644 drivers_sample/qdm/sample_qdm_m/init/main.h create mode 100644 drivers_sample/qdm/sample_qdm_m/init/system_init.c create mode 100644 drivers_sample/qdm/sample_qdm_m/readme.md create mode 100644 drivers_sample/qdm/sample_qdm_m/src/sample_qdm_m.c create mode 100644 drivers_sample/qdm/sample_qdm_mt/inc/sample_qdm_mt.h create mode 100644 drivers_sample/qdm/sample_qdm_mt/init/main.c create mode 100644 drivers_sample/qdm/sample_qdm_mt/init/main.h create mode 100644 drivers_sample/qdm/sample_qdm_mt/init/system_init.c create mode 100644 drivers_sample/qdm/sample_qdm_mt/readme.md create mode 100644 drivers_sample/qdm/sample_qdm_mt/src/sample_qdm_mt.c create mode 100644 drivers_sample/spi/sample_spi_blocking_kta7953/inc/sample_spi_blocking_kta7953.h create mode 100644 drivers_sample/spi/sample_spi_blocking_kta7953/init/main.c create mode 100644 drivers_sample/spi/sample_spi_blocking_kta7953/init/main.h create mode 100644 drivers_sample/spi/sample_spi_blocking_kta7953/init/system_init.c create mode 100644 drivers_sample/spi/sample_spi_blocking_kta7953/readme.md create mode 100644 drivers_sample/spi/sample_spi_blocking_kta7953/src/sample_spi_blocking_kta7953.c create mode 100644 drivers_sample/spi/sample_spi_blocking_w25q32/inc/sample_spi_blocking_w25q32.h create mode 100644 drivers_sample/spi/sample_spi_blocking_w25q32/init/main.c create mode 100644 drivers_sample/spi/sample_spi_blocking_w25q32/init/main.h create mode 100644 drivers_sample/spi/sample_spi_blocking_w25q32/init/system_init.c create mode 100644 drivers_sample/spi/sample_spi_blocking_w25q32/readme.md create mode 100644 drivers_sample/spi/sample_spi_blocking_w25q32/src/sample_spi_blocking_w25q32.c create mode 100644 drivers_sample/spi/sample_spi_blocking_w25q32_internal/inc/sample_spi_blocking_w25q32_internal.h create mode 100644 drivers_sample/spi/sample_spi_blocking_w25q32_internal/init/main.c create mode 100644 drivers_sample/spi/sample_spi_blocking_w25q32_internal/init/main.h create mode 100644 drivers_sample/spi/sample_spi_blocking_w25q32_internal/init/system_init.c create mode 100644 drivers_sample/spi/sample_spi_blocking_w25q32_internal/readme.md create mode 100644 drivers_sample/spi/sample_spi_blocking_w25q32_internal/src/sample_spi_blocking_w25q32_internal.c create mode 100644 drivers_sample/spi/sample_spi_dma_kta7953/inc/sample_spi_dma_kta7953.h create mode 100644 drivers_sample/spi/sample_spi_dma_kta7953/init/main.c create mode 100644 drivers_sample/spi/sample_spi_dma_kta7953/init/main.h create mode 100644 drivers_sample/spi/sample_spi_dma_kta7953/init/system_init.c create mode 100644 drivers_sample/spi/sample_spi_dma_kta7953/readme.md create mode 100644 drivers_sample/spi/sample_spi_dma_kta7953/src/sample_spi_dma_kta7953.c create mode 100644 drivers_sample/spi/sample_spi_dma_w25q32/inc/sample_spi_dma_w25q32.h create mode 100644 drivers_sample/spi/sample_spi_dma_w25q32/init/main.c create mode 100644 drivers_sample/spi/sample_spi_dma_w25q32/init/main.h create mode 100644 drivers_sample/spi/sample_spi_dma_w25q32/init/system_init.c create mode 100644 drivers_sample/spi/sample_spi_dma_w25q32/readme.md create mode 100644 drivers_sample/spi/sample_spi_dma_w25q32/src/sample_spi_dma_w25q32.c create mode 100644 drivers_sample/spi/sample_spi_dma_w25q32_internal/inc/sample_spi_dma_w25q32_internal.h create mode 100644 drivers_sample/spi/sample_spi_dma_w25q32_internal/init/main.c create mode 100644 drivers_sample/spi/sample_spi_dma_w25q32_internal/init/main.h create mode 100644 drivers_sample/spi/sample_spi_dma_w25q32_internal/init/system_init.c create mode 100644 drivers_sample/spi/sample_spi_dma_w25q32_internal/readme.md create mode 100644 drivers_sample/spi/sample_spi_dma_w25q32_internal/src/sample_spi_dma_w25q32_internal.c create mode 100644 drivers_sample/spi/sample_spi_interrupt_kta7953/inc/sample_spi_interrupt_kta7953.h create mode 100644 drivers_sample/spi/sample_spi_interrupt_kta7953/init/main.c create mode 100644 drivers_sample/spi/sample_spi_interrupt_kta7953/init/main.h create mode 100644 drivers_sample/spi/sample_spi_interrupt_kta7953/init/system_init.c create mode 100644 drivers_sample/spi/sample_spi_interrupt_kta7953/readme.md create mode 100644 drivers_sample/spi/sample_spi_interrupt_kta7953/src/sample_spi_interrupt_kta7953.c create mode 100644 drivers_sample/spi/sample_spi_interrupt_w25q32/inc/sample_spi_interrupt_w25q32.h create mode 100644 drivers_sample/spi/sample_spi_interrupt_w25q32/init/main.c create mode 100644 drivers_sample/spi/sample_spi_interrupt_w25q32/init/main.h create mode 100644 drivers_sample/spi/sample_spi_interrupt_w25q32/init/system_init.c create mode 100644 drivers_sample/spi/sample_spi_interrupt_w25q32/readme.md create mode 100644 drivers_sample/spi/sample_spi_interrupt_w25q32/src/sample_spi_interrupt_w25q32.c create mode 100644 drivers_sample/spi/sample_spi_interrupt_w25q32_internal/inc/sample_spi_interrupt_w25q32_internal.h create mode 100644 drivers_sample/spi/sample_spi_interrupt_w25q32_internal/init/main.c create mode 100644 drivers_sample/spi/sample_spi_interrupt_w25q32_internal/init/main.h create mode 100644 drivers_sample/spi/sample_spi_interrupt_w25q32_internal/init/system_init.c create mode 100644 drivers_sample/spi/sample_spi_interrupt_w25q32_internal/readme.md create mode 100644 drivers_sample/spi/sample_spi_interrupt_w25q32_internal/src/sample_spi_interrupt_w25q32_internal.c create mode 100644 drivers_sample/spi/sample_spi_master/inc/sample_spi_master.h create mode 100644 drivers_sample/spi/sample_spi_master/init/main.c create mode 100644 drivers_sample/spi/sample_spi_master/init/main.h create mode 100644 drivers_sample/spi/sample_spi_master/init/system_init.c create mode 100644 drivers_sample/spi/sample_spi_master/readme.md create mode 100644 drivers_sample/spi/sample_spi_master/src/sample_spi_master.c create mode 100644 drivers_sample/spi/sample_spi_microwire_master/inc/sample_spi_microwire_master.h create mode 100644 drivers_sample/spi/sample_spi_microwire_master/init/main.c create mode 100644 drivers_sample/spi/sample_spi_microwire_master/init/main.h create mode 100644 drivers_sample/spi/sample_spi_microwire_master/init/system_init.c create mode 100644 drivers_sample/spi/sample_spi_microwire_master/readme.md create mode 100644 drivers_sample/spi/sample_spi_microwire_master/src/sample_spi_microwire_master.c create mode 100644 drivers_sample/spi/sample_spi_microwire_slave/inc/sample_spi_microwire_slave.h create mode 100644 drivers_sample/spi/sample_spi_microwire_slave/init/main.c create mode 100644 drivers_sample/spi/sample_spi_microwire_slave/init/main.h create mode 100644 drivers_sample/spi/sample_spi_microwire_slave/init/system_init.c create mode 100644 drivers_sample/spi/sample_spi_microwire_slave/readme.md create mode 100644 drivers_sample/spi/sample_spi_microwire_slave/src/sample_spi_microwire_slave.c create mode 100644 drivers_sample/spi/sample_spi_slave/inc/sample_spi_slave.h create mode 100644 drivers_sample/spi/sample_spi_slave/init/main.c create mode 100644 drivers_sample/spi/sample_spi_slave/init/main.h create mode 100644 drivers_sample/spi/sample_spi_slave/init/system_init.c create mode 100644 drivers_sample/spi/sample_spi_slave/readme.md create mode 100644 drivers_sample/spi/sample_spi_slave/src/sample_spi_slave.c create mode 100644 drivers_sample/timer/sample_timer_interrupt/inc/sample_timer_interrupt.h create mode 100644 drivers_sample/timer/sample_timer_interrupt/init/main.c create mode 100644 drivers_sample/timer/sample_timer_interrupt/init/main.h create mode 100644 drivers_sample/timer/sample_timer_interrupt/init/system_init.c create mode 100644 drivers_sample/timer/sample_timer_interrupt/readme.md create mode 100644 drivers_sample/timer/sample_timer_interrupt/src/sample_timer_interrupt.c create mode 100644 drivers_sample/tsensor/sample_tsensor/inc/sample_tsensor.h create mode 100644 drivers_sample/tsensor/sample_tsensor/readme.txt create mode 100644 drivers_sample/tsensor/sample_tsensor/src/sample_tsensor.c create mode 100644 drivers_sample/uart/sample_uart_baud_detect/inc/sample_uart_baud_detect.h create mode 100644 drivers_sample/uart/sample_uart_baud_detect/init/main.c create mode 100644 drivers_sample/uart/sample_uart_baud_detect/init/main.h create mode 100644 drivers_sample/uart/sample_uart_baud_detect/init/system_init.c create mode 100644 drivers_sample/uart/sample_uart_baud_detect/readme.md create mode 100644 drivers_sample/uart/sample_uart_baud_detect/src/sample_uart_baud_detect.c create mode 100644 drivers_sample/uart/sample_uart_blocking_rx/inc/sample_uart_blocking_rx.h create mode 100644 drivers_sample/uart/sample_uart_blocking_rx/init/main.c create mode 100644 drivers_sample/uart/sample_uart_blocking_rx/init/main.h create mode 100644 drivers_sample/uart/sample_uart_blocking_rx/init/system_init.c create mode 100644 drivers_sample/uart/sample_uart_blocking_rx/readme.md create mode 100644 drivers_sample/uart/sample_uart_blocking_rx/src/sample_uart_blocking_rx.c create mode 100644 drivers_sample/uart/sample_uart_blocking_tx/inc/sample_uart_blocking_tx.h create mode 100644 drivers_sample/uart/sample_uart_blocking_tx/init/main.c create mode 100644 drivers_sample/uart/sample_uart_blocking_tx/init/main.h create mode 100644 drivers_sample/uart/sample_uart_blocking_tx/init/system_init.c create mode 100644 drivers_sample/uart/sample_uart_blocking_tx/readme.md create mode 100644 drivers_sample/uart/sample_uart_blocking_tx/src/sample_uart_blocking_tx.c create mode 100644 drivers_sample/uart/sample_uart_character_match/inc/sample_uart_character_match.h create mode 100644 drivers_sample/uart/sample_uart_character_match/init/main.c create mode 100644 drivers_sample/uart/sample_uart_character_match/init/main.h create mode 100644 drivers_sample/uart/sample_uart_character_match/init/system_init.c create mode 100644 drivers_sample/uart/sample_uart_character_match/readme.md create mode 100644 drivers_sample/uart/sample_uart_character_match/src/sample_uart_character_match.c create mode 100644 drivers_sample/uart/sample_uart_dma_rx/inc/sample_uart_dma_rx.h create mode 100644 drivers_sample/uart/sample_uart_dma_rx/init/main.c create mode 100644 drivers_sample/uart/sample_uart_dma_rx/init/main.h create mode 100644 drivers_sample/uart/sample_uart_dma_rx/init/system_init.c create mode 100644 drivers_sample/uart/sample_uart_dma_rx/readme.md create mode 100644 drivers_sample/uart/sample_uart_dma_rx/src/sample_uart_dma_rx.c create mode 100644 drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/inc/sample_uart_dma_rx_cyclically_stored.h create mode 100644 drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/init/main.c create mode 100644 drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/init/main.h create mode 100644 drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/init/system_init.c create mode 100644 drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/readme.md create mode 100644 drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/src/sample_uart_dma_rx_cyclically_stored.c create mode 100644 drivers_sample/uart/sample_uart_dma_tx/inc/sample_uart_dma_tx.h create mode 100644 drivers_sample/uart/sample_uart_dma_tx/init/main.c create mode 100644 drivers_sample/uart/sample_uart_dma_tx/init/main.h create mode 100644 drivers_sample/uart/sample_uart_dma_tx/init/system_init.c create mode 100644 drivers_sample/uart/sample_uart_dma_tx/readme.md create mode 100644 drivers_sample/uart/sample_uart_dma_tx/src/sample_uart_dma_tx.c create mode 100644 drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/inc/sample_uart_dma_tx_dma_rx_simultaneously.h create mode 100644 drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/init/main.c create mode 100644 drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/init/main.h create mode 100644 drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/init/system_init.c create mode 100644 drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/readme.md create mode 100644 drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/src/sample_uart_dma_tx_dma_rx_simultaneously.c create mode 100644 drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/inc/sample_uart_dma_tx_int_rx_simultaneously.h create mode 100644 drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/init/main.c create mode 100644 drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/init/main.h create mode 100644 drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/init/system_init.c create mode 100644 drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/readme.md create mode 100644 drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/src/sample_uart_dma_tx_int_rx_simultaneously.c create mode 100644 drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/inc/sample_uart_int_tx_dma_rx_simultaneously.h create mode 100644 drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/init/main.c create mode 100644 drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/init/main.h create mode 100644 drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/init/system_init.c create mode 100644 drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/readme.md create mode 100644 drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/src/sample_uart_int_tx_dma_rx_simultaneously.c create mode 100644 drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/inc/sample_uart_int_tx_int_rx_simultaneously.h create mode 100644 drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/init/main.c create mode 100644 drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/init/main.h create mode 100644 drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/init/system_init.c create mode 100644 drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/readme.md create mode 100644 drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/src/sample_uart_int_tx_int_rx_simultaneously.c create mode 100644 drivers_sample/uart/sample_uart_interrupt_rx/inc/sample_uart_interrupt_rx.h create mode 100644 drivers_sample/uart/sample_uart_interrupt_rx/init/main.c create mode 100644 drivers_sample/uart/sample_uart_interrupt_rx/init/main.h create mode 100644 drivers_sample/uart/sample_uart_interrupt_rx/init/system_init.c create mode 100644 drivers_sample/uart/sample_uart_interrupt_rx/readme.md create mode 100644 drivers_sample/uart/sample_uart_interrupt_rx/src/sample_uart_interrupt_rx.c create mode 100644 drivers_sample/uart/sample_uart_interrupt_tx/inc/sample_uart_interrupt_tx.h create mode 100644 drivers_sample/uart/sample_uart_interrupt_tx/init/main.c create mode 100644 drivers_sample/uart/sample_uart_interrupt_tx/init/main.h create mode 100644 drivers_sample/uart/sample_uart_interrupt_tx/init/system_init.c create mode 100644 drivers_sample/uart/sample_uart_interrupt_tx/readme.md create mode 100644 drivers_sample/uart/sample_uart_interrupt_tx/src/sample_uart_interrupt_tx.c create mode 100644 drivers_sample/uart/sample_uart_interrupt_tx_after_rx/inc/sample_uart_interrupt_tx_after_rx.h create mode 100644 drivers_sample/uart/sample_uart_interrupt_tx_after_rx/init/main.c create mode 100644 drivers_sample/uart/sample_uart_interrupt_tx_after_rx/init/main.h create mode 100644 drivers_sample/uart/sample_uart_interrupt_tx_after_rx/init/system_init.c create mode 100644 drivers_sample/uart/sample_uart_interrupt_tx_after_rx/readme.md create mode 100644 drivers_sample/uart/sample_uart_interrupt_tx_after_rx/src/sample_uart_interrupt_tx_after_rx.c create mode 100644 drivers_sample/uart/sample_uart_single_wire_communication/inc/sample_uart_single_wire_communication.h create mode 100644 drivers_sample/uart/sample_uart_single_wire_communication/init/main.c create mode 100644 drivers_sample/uart/sample_uart_single_wire_communication/init/main.h create mode 100644 drivers_sample/uart/sample_uart_single_wire_communication/init/system_init.c create mode 100644 drivers_sample/uart/sample_uart_single_wire_communication/readme.md create mode 100644 drivers_sample/uart/sample_uart_single_wire_communication/src/sample_uart_single_wire_communication.c create mode 100644 drivers_sample/wdg/sample_iwdg_refresh/inc/sample_iwdg_refresh.h create mode 100644 drivers_sample/wdg/sample_iwdg_refresh/init/main.c create mode 100644 drivers_sample/wdg/sample_iwdg_refresh/init/main.h create mode 100644 drivers_sample/wdg/sample_iwdg_refresh/init/system_init.c create mode 100644 drivers_sample/wdg/sample_iwdg_refresh/readme.md create mode 100644 drivers_sample/wdg/sample_iwdg_refresh/src/sample_iwdg_refresh.c create mode 100644 drivers_sample/wdg/sample_iwdg_reset/inc/iwdg_reset_sample.h create mode 100644 drivers_sample/wdg/sample_iwdg_reset/init/main.c create mode 100644 drivers_sample/wdg/sample_iwdg_reset/init/main.h create mode 100644 drivers_sample/wdg/sample_iwdg_reset/init/system_init.c create mode 100644 drivers_sample/wdg/sample_iwdg_reset/readme.md create mode 100644 drivers_sample/wdg/sample_iwdg_reset/src/iwdg_reset_sample.c create mode 100644 drivers_sample/wdg/sample_wdg_reset/inc/wdg_reset_sample.h create mode 100644 drivers_sample/wdg/sample_wdg_reset/init/main.c create mode 100644 drivers_sample/wdg/sample_wdg_reset/init/main.h create mode 100644 drivers_sample/wdg/sample_wdg_reset/init/system_init.c create mode 100644 drivers_sample/wdg/sample_wdg_reset/readme.md create mode 100644 drivers_sample/wdg/sample_wdg_reset/src/wdg_reset_sample.c create mode 100644 drivers_sample/wdg/sample_wwdg_refresh/inc/sample_wwdg_refresh.h create mode 100644 drivers_sample/wdg/sample_wwdg_refresh/init/main.c create mode 100644 drivers_sample/wdg/sample_wwdg_refresh/init/main.h create mode 100644 drivers_sample/wdg/sample_wwdg_refresh/init/system_init.c create mode 100644 drivers_sample/wdg/sample_wwdg_refresh/readme.md create mode 100644 drivers_sample/wdg/sample_wwdg_refresh/src/sample_wwdg_refresh.c create mode 100644 "drivers_sample/\345\233\276\347\211\207/1726194739756.jpg" create mode 100644 "drivers_sample/\345\233\276\347\211\207/1726194776437.jpg" create mode 100644 "drivers_sample/\345\233\276\347\211\207/1726194794028.jpg" create mode 100644 "drivers_sample/\345\233\276\347\211\207/1726194824764.jpg" create mode 100644 "drivers_sample/\345\233\276\347\211\207/1726194869607.jpg" create mode 100644 "drivers_sample/\345\233\276\347\211\207/1726194906962.jpg" create mode 100644 "drivers_sample/\345\233\276\347\211\207/1726194945180.jpg" create mode 100644 "drivers_sample/\345\233\276\347\211\207/1726194962547.jpg" create mode 100644 "drivers_sample/\345\233\276\347\211\207/1726194980430.jpg" create mode 100644 "drivers_sample/\345\233\276\347\211\207/1726195007716.jpg" create mode 100644 "drivers_sample/\345\233\276\347\211\207/1726195033006.jpg" create mode 100644 "drivers_sample/\345\233\276\347\211\207/1726195055385.jpg" create mode 100644 "drivers_sample/\345\233\276\347\211\207/1726195173004.jpg" create mode 100644 "drivers_sample/\345\233\276\347\211\207/1726195185553.jpg" create mode 100644 "drivers_sample/\345\256\236\351\252\214\346\214\207\345\257\274\346\211\213\345\206\214.md" diff --git a/drivers_sample/acmp/sample_acmp_interrupt/inc/sample_acmp_interrupt.h b/drivers_sample/acmp/sample_acmp_interrupt/inc/sample_acmp_interrupt.h new file mode 100644 index 000000000..40fc5e55f --- /dev/null +++ b/drivers_sample/acmp/sample_acmp_interrupt/inc/sample_acmp_interrupt.h @@ -0,0 +1,31 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_acmp_interrupt.h + * @author MCU Driver Team + * @brief acmp sample module. + * @details This file provides sample code for users to help use + * the interrupt function of the acmp. + */ + +#ifndef SAMPLE_ACMP_INTERRUPT_H +#define SAMPLE_ACMP_INTERRUPT_H + +#include "main.h" +/* ACMP interrupt caller function. */ +void ACMP_CompareInt(void); +#endif \ No newline at end of file diff --git a/drivers_sample/acmp/sample_acmp_interrupt/init/main.c b/drivers_sample/acmp/sample_acmp_interrupt/init/main.c new file mode 100644 index 000000000..c9f921f03 --- /dev/null +++ b/drivers_sample/acmp/sample_acmp_interrupt/init/main.c @@ -0,0 +1,56 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ + +#include "typedefs.h" +#include "feature.h" +#include "sample_acmp_interrupt.h" +#include "main.h" +/* USER CODE BEGIN 0 */ + //APT_PWMInitHALSample(); + /* USER CODE END 0 */ +ACMP_Handle g_acmp0; +DAC_Handle g_dac0; +UART_Handle g_uart0; +/* USER CODE BEGIN 1 */ + /* USER CODE END 1 */ + +int main(void) +{ + /* USER CODE BEGIN 2 */ + /* USER CODE END 2 */ + ACMP_CompareInt(); + /* USER CODE BEGIN 3 */ +/* USER CODE END 3 */ + while (1) { + /* USER CODE BEGIN 4 */ + /* 建议用户放置周期性执行代码 */ + /* USER CODE END 4 */ + } + /* USER CODE BEGIN 5 */ + /* 建议用户放置代码流程 */ + /* USER CODE END 5 */ + return BASE_STATUS_OK; +} + +/* USER CODE BEGIN 6 */ +/* 建议用户放置自定义函数 */ +/* USER CODE END 6 */ \ No newline at end of file diff --git a/drivers_sample/acmp/sample_acmp_interrupt/init/main.h b/drivers_sample/acmp/sample_acmp_interrupt/init/main.h new file mode 100644 index 000000000..fd633ecfb --- /dev/null +++ b/drivers_sample/acmp/sample_acmp_interrupt/init/main.h @@ -0,0 +1,63 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "acmp.h" +#include "acmp_ex.h" +#include "uart.h" +#include "uart_ex.h" +#include "dac.h" +#include "crg.h" +#include "iocmg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define XTAL_DRV_LEVEL4 0x03U +#define XTAL_DRV_LEVEL3 0x02U +#define XTAL_DRV_LEVEL2 0x01U +#define XTAL_DRV_LEVEL1 0x00U + +extern ACMP_Handle g_acmp0; +extern DAC_Handle g_dac0; +extern UART_Handle g_uart0; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +void ACMP0PositveCallFunc(void *handle); +void ACMP0NegativeCallFunc(void *handle); +void ACMP0EdgedCallFunc(void *handle); + +/* USER CODE BEGIN 0 */ +/* USER CODE 区域内代码不会被覆盖,区域外会被生成的默认代码覆盖(其余USER CODE 区域同理) */ +/* USER CODE END 0 */ + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/acmp/sample_acmp_interrupt/init/system_init.c b/drivers_sample/acmp/sample_acmp_interrupt/init/system_init.c new file mode 100644 index 000000000..cac67856c --- /dev/null +++ b/drivers_sample/acmp/sample_acmp_interrupt/init/system_init.c @@ -0,0 +1,157 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" +#include "iocmg_ip.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 48; /* PLL Multiplier 48 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.clk1MDiv = (25 - 1); /* The 1 MHz freq is equal to the input clock frequency / (clk_1m_div + 1). 25 is the div of the clk_1m in CLOCK. */ + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +__weak void ACMP0PositveCallFunc(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN ACMP0PositveCallFunc */ + /* USER CODE END ACMP0PositveCallFunc */ +} + +__weak void ACMP0NegativeCallFunc(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN ACMP0NegativeCallFunc */ + /* USER CODE END ACMP0NegativeCallFunc */ +} + +__weak void ACMP0EdgedCallFunc(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN ACMP0EdgedCallFunc */ + /* USER CODE END ACMP0EdgedCallFunc */ +} + +static void ACMP0_Init(void) +{ + HAL_CRG_IpEnableSet(ACMP0_BASE, IP_CLK_ENABLE); /* ACMP clock bit reset. */ + g_acmp0.baseAddress = ACMP0_BASE; + g_acmp0.inOutConfig.inputNNum = ACMP_INPUT_N_SELECT3; + g_acmp0.inOutConfig.inputPNum = ACMP_INPUT_P_SELECT5; + g_acmp0.inOutConfig.polarity = ACMP_OUT_NOT_INVERT; + g_acmp0.filterCtrl.filterMode = ACMP_FILTER_NONE; + g_acmp0.hysteresisVol = ACMP_HYS_VOL_30MV; + g_acmp0.interruptEn = BASE_CFG_SET; + HAL_ACMP_Init(&g_acmp0); + HAL_ACMP_RegisterCallBack(&g_acmp0, ACMP_POS_INT, ACMP0PositveCallFunc); + HAL_ACMP_RegisterCallBack(&g_acmp0, ACMP_NEG_INT, ACMP0NegativeCallFunc); + HAL_ACMP_RegisterCallBack(&g_acmp0, ACMP_EDGE_INT, ACMP0EdgedCallFunc); + IRQ_Register(IRQ_ACMP_INT, HAL_ACMP_IrqHandler, &g_acmp0); + IRQ_SetPriority(IRQ_ACMP_INT, 1); /* 1 is priority value */ + IRQ_EnableN(IRQ_ACMP_INT); +} + +static void DAC0_Init(void) +{ + HAL_CRG_IpEnableSet(DAC0_BASE, IP_CLK_ENABLE); /* DAC0 clock enable. */ + + g_dac0.baseAddress = DAC0; + g_dac0.dacValue = 250; + HAL_DAC_Init(&g_dac0); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); /* UART0 clock enable. */ + g_uart0.baseAddress = UART0; + + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; + g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + SYSCTRL0->SC_SYS_STAT.BIT.update_mode = 0; + SYSCTRL0->SC_SYS_STAT.BIT.update_mode_clear = 1; + /* Config PIN39 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_3_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_3_AS_UART0_TXD, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_3_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_3_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_3_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN40 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_4_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_4_AS_UART0_RXD, PULL_UP); /* Pull-up and Pull-down, UART RX recommend PULL_UP */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_4_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_4_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_4_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN4 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_6_AS_ACMP_N3); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_6_AS_ACMP_N3, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_6_AS_ACMP_N3, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_6_AS_ACMP_N3, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_6_AS_ACMP_N3, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN1 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_7_AS_ACMP0_OUT); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_7_AS_ACMP0_OUT, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_7_AS_ACMP0_OUT, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_7_AS_ACMP0_OUT, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_7_AS_ACMP0_OUT, DRIVER_RATE_2); /* Output signal edge fast/slow */ +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + ACMP0_Init(); + DAC0_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/acmp/sample_acmp_interrupt/readme.md b/drivers_sample/acmp/sample_acmp_interrupt/readme.md new file mode 100644 index 000000000..f66fcc0bd --- /dev/null +++ b/drivers_sample/acmp/sample_acmp_interrupt/readme.md @@ -0,0 +1,20 @@ +# 比较器 -- 比较器中断使用样例 +## 关键字: ACMP比较器, 比较器中断使用样例 + +**【功能描述】** ++ ACMP输出比较结果,会根据ACMP比较结果, 触发不同类型的中断回调函数。 + ++ 输出比较结果为上升沿时,会触发上升沿回调函数,输出结果为下降沿时,会触发下降沿回调函数。 + +**【示例配置】** ++ 初始化ACMP,配置ACMP的N端和P端口输入,配置ACMP比较结果输出,管脚配置可以在ACMP配置界面中,配置“Input And Output Setting”进行更改。 + ++ ACMP的比较结果输出,当配置的正端的电压值高于负端的电压值时输出高,反之则输出低。示例中输入源、输出的配置,可以通过ACMP的配置界面,或在“system_init.c”文件中修改ACMP初始化代码实现。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,ACMP初始化和配置完成后,会在IOCMG_26输出输入源的比较结果,并调用触发相应的回调函数,用户可以通过交换输入源信号,并测量输出端的电压,比较输入源的电压大小。 + +**【注意事项】** ++ 输入的比较电压不能超过0V~输入电源大小(3.3V)。 + ++ 最小可识别有效差分输入电压为20mV。 \ No newline at end of file diff --git a/drivers_sample/acmp/sample_acmp_interrupt/src/sample_acmp_interrupt.c b/drivers_sample/acmp/sample_acmp_interrupt/src/sample_acmp_interrupt.c new file mode 100644 index 000000000..39aaf5ea8 --- /dev/null +++ b/drivers_sample/acmp/sample_acmp_interrupt/src/sample_acmp_interrupt.c @@ -0,0 +1,78 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_acmp_interrupt.c + * @author MCU Driver Team + * @brief can sample module. + * @details This file provides sample code for users to help use + * the interrupt function of the acmp. + */ +#include "sample_acmp_interrupt.h" +#include "main.h" +#include "debug.h" + +/** + * @brief ACMP Positve Callback function. + * @param handle ACMP handle. + * @retval None. + */ +void ACMP0PositveCallFunc(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN ACMP0PositveCallFunc */ + DBG_PRINTF("ACMP positive callback function.\r\n"); + /* USER CODE END ACMP0PositveCallFunc */ +} + +/** + * @brief ACMP Negative Callback function. + * @param handle ACMP handle. + * @retval None. + */ +void ACMP0NegativeCallFunc(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN ACMP0NegativeCallFunc */ + DBG_PRINTF("ACMP negative callback function.\r\n"); + /* USER CODE END ACMP0NegativeCallFunc */ +} + +/** + * @brief ACMP Edge callback function. + * @param handle ACMP handle. + * @retval None. + */ +void ACMP0EdgedCallFunc(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN ACMP0EdgedCallFunc */ + DBG_PRINTF("ACMP edge callback funtion.\r\n"); + /* USER CODE END ACMP0EdgedCallFunc */ +} + +/** + * @brief Example of comparing ACMP results + * @param None. + * @retval None. + */ +void ACMP_CompareInt(void) +{ + SystemInit(); + DBG_PRINTF("Example: ACMP comparison result interrupt. The ACMP output comparison result triggers different types\ + of interrupts, such as rising edge triggle positve call back function, falling edge triggle negative\ + callback function, and flip edge triggle edge callback funtion.\r\n"); +} \ No newline at end of file diff --git a/drivers_sample/acmp/sample_acmp_out_result/inc/sample_acmp_out_result.h b/drivers_sample/acmp/sample_acmp_out_result/inc/sample_acmp_out_result.h new file mode 100644 index 000000000..00dc659db --- /dev/null +++ b/drivers_sample/acmp/sample_acmp_out_result/inc/sample_acmp_out_result.h @@ -0,0 +1,31 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_acmp_out_result.h + * @author MCU Driver Team + * @brief acmp sample module. + * @details This file provides sample code for users to help use + * the compare function of the acmp. + */ + +#ifndef SAMPLE_ACMP_OUT_RESULT_H +#define SAMPLE_ACMP_OUT_RESULT_H + +#include "main.h" +/* ACMP interrupt caller function. */ +void ACMP_CompareResultOutput(void); +#endif \ No newline at end of file diff --git a/drivers_sample/acmp/sample_acmp_out_result/init/main.c b/drivers_sample/acmp/sample_acmp_out_result/init/main.c new file mode 100644 index 000000000..ff8f2443c --- /dev/null +++ b/drivers_sample/acmp/sample_acmp_out_result/init/main.c @@ -0,0 +1,56 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ + +#include "typedefs.h" +#include "feature.h" +#include "sample_acmp_out_result.h" +#include "main.h" +/* USER CODE BEGIN 0 */ + //APT_PWMInitHALSample(); + /* USER CODE END 0 */ +ACMP_Handle g_acmp0; +DAC_Handle g_dac0; +UART_Handle g_uart0; +/* USER CODE BEGIN 1 */ + /* USER CODE END 1 */ + +int main(void) +{ + /* USER CODE BEGIN 2 */ + /* USER CODE END 2 */ + ACMP_CompareResultOutput(); + /* USER CODE BEGIN 3 */ +/* USER CODE END 3 */ + while (1) { + /* USER CODE BEGIN 4 */ + /* 建议用户放置周期性执行代码 */ + /* USER CODE END 4 */ + } + /* USER CODE BEGIN 5 */ + /* 建议用户放置代码流程 */ + /* USER CODE END 5 */ + return BASE_STATUS_OK; +} + +/* USER CODE BEGIN 6 */ +/* 建议用户放置自定义函数 */ +/* USER CODE END 6 */ \ No newline at end of file diff --git a/drivers_sample/acmp/sample_acmp_out_result/init/main.h b/drivers_sample/acmp/sample_acmp_out_result/init/main.h new file mode 100644 index 000000000..3f9acb527 --- /dev/null +++ b/drivers_sample/acmp/sample_acmp_out_result/init/main.h @@ -0,0 +1,59 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "acmp.h" +#include "acmp_ex.h" +#include "uart.h" +#include "uart_ex.h" +#include "dac.h" +#include "crg.h" +#include "iocmg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define XTAL_DRV_LEVEL4 0x03U +#define XTAL_DRV_LEVEL3 0x02U +#define XTAL_DRV_LEVEL2 0x01U +#define XTAL_DRV_LEVEL1 0x00U + +extern ACMP_Handle g_acmp0; +extern DAC_Handle g_dac0; +extern UART_Handle g_uart0; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +/* USER CODE BEGIN 0 */ +/* USER CODE 区域内代码不会被覆盖,区域外会被生成的默认代码覆盖(其余USER CODE 区域同理) */ +/* USER CODE END 0 */ + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/acmp/sample_acmp_out_result/init/system_init.c b/drivers_sample/acmp/sample_acmp_out_result/init/system_init.c new file mode 100644 index 000000000..b171e1edb --- /dev/null +++ b/drivers_sample/acmp/sample_acmp_out_result/init/system_init.c @@ -0,0 +1,130 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" +#include "iocmg_ip.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 48; /* PLL Multiplier 48 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.clk1MDiv = (25 - 1); /* The 1 MHz freq is equal to the input clock frequency / (clk_1m_div + 1). 25 is the div of the clk_1m in CLOCK. */ + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void ACMP0_Init(void) +{ + HAL_CRG_IpEnableSet(ACMP0_BASE, IP_CLK_ENABLE); /* ACMP clock bit reset. */ + g_acmp0.baseAddress = ACMP0_BASE; + g_acmp0.inOutConfig.inputNNum = ACMP_INPUT_N_SELECT3; + g_acmp0.inOutConfig.inputPNum = ACMP_INPUT_P_SELECT5; + g_acmp0.inOutConfig.polarity = ACMP_OUT_NOT_INVERT; + g_acmp0.filterCtrl.filterMode = ACMP_FILTER_NONE; + g_acmp0.hysteresisVol = ACMP_HYS_VOL_30MV; + g_acmp0.interruptEn = BASE_CFG_UNSET; + HAL_ACMP_Init(&g_acmp0); +} + +static void DAC0_Init(void) +{ + HAL_CRG_IpEnableSet(DAC0_BASE, IP_CLK_ENABLE); /* DAC0 clock enable. */ + + g_dac0.baseAddress = DAC0; + g_dac0.dacValue = 250; + HAL_DAC_Init(&g_dac0); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); /* UART0 clock enable. */ + g_uart0.baseAddress = UART0; + + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; + g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + SYSCTRL0->SC_SYS_STAT.BIT.update_mode = 0; + SYSCTRL0->SC_SYS_STAT.BIT.update_mode_clear = 1; + /* Config PIN39 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_3_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_3_AS_UART0_TXD, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_3_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_3_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_3_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN40 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_4_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_4_AS_UART0_RXD, PULL_UP); /* Pull-up and Pull-down, UART RX recommend PULL_UP */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_4_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_4_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_4_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN4 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_6_AS_ACMP_N3); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_6_AS_ACMP_N3, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_6_AS_ACMP_N3, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_6_AS_ACMP_N3, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_6_AS_ACMP_N3, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN1 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_7_AS_ACMP0_OUT); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_7_AS_ACMP0_OUT, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_7_AS_ACMP0_OUT, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_7_AS_ACMP0_OUT, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_7_AS_ACMP0_OUT, DRIVER_RATE_2); /* Output signal edge fast/slow */ +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + ACMP0_Init(); + DAC0_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/acmp/sample_acmp_out_result/readme.md b/drivers_sample/acmp/sample_acmp_out_result/readme.md new file mode 100644 index 000000000..7992f5e80 --- /dev/null +++ b/drivers_sample/acmp/sample_acmp_out_result/readme.md @@ -0,0 +1,18 @@ +# 模拟比较器基本使用 - 内部DAC输出电压和外部输入电压比较 +## 关键字: ACMP, DAC内部输入 + +**【功能描述】** ++ 对两个输入源进行电压比较,输出比较结果。输入和输出信号都可配,本示例中的输入的N端信号为DAC的内部输出,输入的P端信号为GPIO2_6,在GPIO0_7中输出比较结 果。 + +**【示例配置】** ++ ACMP的输入比较信号,可在ACMP配置界面中,配置“Input And Output Setting”进行更改。 + ++ 当配置的正端的电压值高于负端的电压值时输出高,反之则输出低。示例中输入源、输出的配置,可以通过ACMP的配置界面,或在“system_init.c”文件中修改ACMP初始化代码实现。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,ACMP初始化和配置完成后,会在GPIO0_7输出输入源的比较结果。用户可以通过交换N端口输入电压,并测量输出端的电压,比较输入源的电压大小。 + +**【注意事项】** ++ 输入的比较电压不能超过0V~输入电源大小(3.3V)。 + ++ 最小可识别有效差分输入电压为20mV。 \ No newline at end of file diff --git a/drivers_sample/acmp/sample_acmp_out_result/src/sample_acmp_out_result.c b/drivers_sample/acmp/sample_acmp_out_result/src/sample_acmp_out_result.c new file mode 100644 index 000000000..70dee0f49 --- /dev/null +++ b/drivers_sample/acmp/sample_acmp_out_result/src/sample_acmp_out_result.c @@ -0,0 +1,38 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_acmp_out_result.c + * @author MCU Driver Team + * @brief can sample module. + * @details This file provides sample code for users to help use + * the compare function of the acmp. + */ +#include "sample_acmp_out_result.h" +#include "main.h" +#include "debug.h" + +/** + * @brief Example of comparing ACMP results + * @param None. + * @retval None. + */ +void ACMP_CompareResultOutput(void) +{ + SystemInit(); + DBG_PRINTF("Example: ACMP comparison result output, N pole requires an external input of the voltage to be\ + compared. P pole input source from DAC out(0.8V), ACMP result is output GPIO0_7.\r\n"); +} \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_associative_trigger_of_apt/inc/sample_adc_associative_trigger_apt.h b/drivers_sample/adc/sample_adc_associative_trigger_of_apt/inc/sample_adc_associative_trigger_apt.h new file mode 100644 index 000000000..4b69d63a4 --- /dev/null +++ b/drivers_sample/adc/sample_adc_associative_trigger_of_apt/inc/sample_adc_associative_trigger_apt.h @@ -0,0 +1,33 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_adc_associative_trigger_apt.h + * @author MCU Driver Team + * @brief adc sample module. + * @details This file provides users with sample code to help use ADC function: + * ADC sampling by software trigger + */ +#ifndef SAMPLE_ADC_SINGLETRIGGER_H +#define SAMPLE_ADC_SINGLETRIGGER_H + +#include "debug.h" +#include "adc.h" +#include "apt.h" +#include "main.h" + +void ADC_AptTrigger(void); +#endif \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_associative_trigger_of_apt/init/main.c b/drivers_sample/adc/sample_adc_associative_trigger_of_apt/init/main.c new file mode 100644 index 000000000..f4ccb25a4 --- /dev/null +++ b/drivers_sample/adc/sample_adc_associative_trigger_of_apt/init/main.c @@ -0,0 +1,37 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ +#include "feature.h" +#include "main.h" +#include "sample_adc_associative_trigger_apt.h" + +UART_Handle g_uart0; +APT_Handle g_hAptU; +APT_OutCtrlProtect g_hProtectU; +ADC_Handle g_adc; + +int main(void) +{ + ADC_AptTrigger(); + while (1) { + } + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_associative_trigger_of_apt/init/main.h b/drivers_sample/adc/sample_adc_associative_trigger_of_apt/init/main.h new file mode 100644 index 000000000..b54e8e573 --- /dev/null +++ b/drivers_sample/adc/sample_adc_associative_trigger_of_apt/init/main.h @@ -0,0 +1,52 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "adc.h" +#include "apt.h" +#include "uart.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +extern UART_Handle g_uart0; + +extern APT_Handle g_hAptU; + +extern APT_OutCtrlProtect g_hProtectU; +extern ADC_Handle g_adc; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +void ADC_Init2FromApt(ADC_Handle *handle); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_associative_trigger_of_apt/init/system_init.c b/drivers_sample/adc/sample_adc_associative_trigger_of_apt/init/system_init.c new file mode 100644 index 000000000..ca9b70076 --- /dev/null +++ b/drivers_sample/adc/sample_adc_associative_trigger_of_apt/init/system_init.c @@ -0,0 +1,214 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +__weak void ADC_Init2FromApt(ADC_Handle *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN ADC_Init2FromApt */ + /* USER CODE END ADC_Init2FromApt */ +} + +static void ADC1_Init(void) +{ + HAL_CRG_IpEnableSet(ADC1_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(ADC1_BASE, CRG_ADC_CLK_SELECT_PLL_DIV); + HAL_CRG_IpClkDivSet(ADC1_BASE, CRG_ADC_DIV_5); + + g_adc.baseAddress = ADC1; + g_adc.socPriority = ADC_PRIMODE_ALL_ROUND; + g_adc.vrefBuf = ADC_VREF_2P5V; + g_adc.irqNumOver = IRQ_ADC1_OVINT; + g_adc.ADC_IntxParam[0].irqNum = IRQ_ADC1_INT1; /* interrupt 0 */ + g_adc.ADC_IntxParam[1].irqNum = IRQ_ADC1_INT2; /* interrupt 1 */ + g_adc.ADC_IntxParam[2].irqNum = IRQ_ADC1_INT3; /* interrupt 2 */ + g_adc.ADC_IntxParam[3].irqNum = IRQ_ADC1_INT4; /* interrupt 3 */ + + HAL_ADC_Init(&g_adc); + + SOC_Param socParam = {0}; + socParam.adcInput = ADC_CH_ADCINA1; + + socParam.sampleHoldTime = 2; /* adc sample holed time 2 adc_clk */ + socParam.sampleTotalTime = 127; /* adc sample total time 127 adc_clk */ + socParam.softTrigSource = ADC_TRIGSOC_NONESOFT; + socParam.intTrigSource = ADC_TRIGSOC_NONEINT; + socParam.periphTrigSource = ADC_TRIGSOC_APT0_SOCA; + socParam.finishMode = ADC_SOCFINISH_INT2; + HAL_ADC_ConfigureSoc(&g_adc, ADC_SOC_NUM1, &socParam); + + HAL_ADC_RegisterCallBack(&g_adc, ADC_CALLBACK_INT2, ADC_Init2FromApt); + IRQ_SetPriority(IRQ_ADC1_INT2, 4); /* Set the priority to level 4 */ + IRQ_EnableN(IRQ_ADC1_INT2); + HAL_ADC_IrqService(&g_adc); +} + +static void APT0_Init(void) +{ + HAL_CRG_IpEnableSet(APT0_BASE, IP_CLK_ENABLE); + + g_hAptU.baseAddress = APT0; + g_hAptU.irqNumEvt = IRQ_APT0_EVT; + g_hAptU.irqNumTmr = IRQ_APT0_TMR; + + /* Clock Settings */ + g_hAptU.waveform.dividerFactor = 1 - 1; + /* Timer Settings */ + g_hAptU.waveform.timerPeriod = 20000; /* timerPeriod is 20000 */ + g_hAptU.waveform.cntMode = APT_COUNT_MODE_UP_DOWN; + + /* Wave Form */ + g_hAptU.waveform.basicType = APT_PWM_BASIC_A_LOW_B_HIGH; + g_hAptU.waveform.chAOutType = APT_PWM_OUT_BASIC_TYPE; + g_hAptU.waveform.chBOutType = APT_PWM_OUT_BASIC_TYPE; + g_hAptU.waveform.divInitVal = 0U; + g_hAptU.waveform.cntInitVal = 0U; + g_hAptU.waveform.cntCmpLeftEdge = 1; + g_hAptU.waveform.cntCmpRightEdge = 19999; /* cntCmpRightEdge is 19999 */ + g_hAptU.waveform.cntCmpLoadMode = APT_BUFFER_INDEPENDENT_LOAD; + g_hAptU.waveform.cntCmpLoadEvt = APT_COMPARE_LOAD_EVENT_ZERO; + g_hAptU.waveform.deadBandCnt = 60; /* deadBandCnt is 60 */ + + /* ADC Triggle SOCA */ + g_hAptU.adcTrg.trgEnSOCA = BASE_CFG_ENABLE; + g_hAptU.adcTrg.cntCmpSOCA = 1; + g_hAptU.adcTrg.trgSrcSOCA = APT_CS_SRC_CNTR_CMPA_UP; + g_hAptU.adcTrg.trgScaleSOCA = 1; + + /* ADC Triggle SOCB */ + g_hAptU.adcTrg.trgEnSOCB = BASE_CFG_ENABLE; + g_hAptU.adcTrg.cntCmpSOCB = 1; + g_hAptU.adcTrg.trgSrcSOCB = APT_CS_SRC_CNTR_CMPB_UP; + g_hAptU.adcTrg.trgScaleSOCB = 1; + + g_hAptU.adcTrg.cntCmpLoadMode = APT_BUFFER_INDEPENDENT_LOAD; + g_hAptU.adcTrg.cntCmpLoadEvt = APT_COMPARE_LOAD_EVENT_ZERO; + + /* Timer Triggle */ + g_hAptU.tmrInterrupt.tmrInterruptEn = BASE_CFG_ENABLE; + g_hAptU.tmrInterrupt.tmrInterruptSrc = APT_INT_SRC_CNTR_ZERO_PERIOD; + g_hAptU.tmrInterrupt.tmrInterruptScale = 1; + + /* Output Protect */ + g_hProtectU.ocEventEn = BASE_CFG_ENABLE; + g_hProtectU.ocEventMode = APT_OUT_CTRL_ONE_SHOT; + g_hProtectU.evtPolarity = APT_EM_EVENT_POLARITY_INVERT; + g_hProtectU.ocEvent = APT_OC_GPIO_EVENT_1; + g_hProtectU.cbcClrMode = APT_CLEAR_CBC_ON_CNTR_ZERO; + g_hProtectU.ocAction = APT_OUT_CTRL_ACTION_LOW; + g_hProtectU.ocEvtInterruptEn = true; + HAL_APT_ProtectInit(&g_hAptU, &g_hProtectU); + + HAL_APT_PWMInit(&g_hAptU); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); + + g_uart0.baseAddress = UART0; + g_uart0.irqNum = IRQ_UART0; + + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + IOConfig_RegStruct *iconfig = IOCONFIG; + + iconfig->iocmg_21.BIT.func = 0x8; /* 0x8 is ADC1_ANA_A1 */ + iconfig->iocmg_21.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_21.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_21.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_21.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_21.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_32.BIT.func = 0x3; /* 0x3 is APT0_PWMA */ + iconfig->iocmg_32.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_32.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_32.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_32.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_32.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_35.BIT.func = 0x3; /* 0x3 is APT0_PWMB */ + iconfig->iocmg_35.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_35.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_35.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_35.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_35.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ + iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ + iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + APT0_Init(); + ADC1_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_associative_trigger_of_apt/readme.md b/drivers_sample/adc/sample_adc_associative_trigger_of_apt/readme.md new file mode 100644 index 000000000..5792eef52 --- /dev/null +++ b/drivers_sample/adc/sample_adc_associative_trigger_of_apt/readme.md @@ -0,0 +1,18 @@ +# 使用APT对ADC进行周期采样功能 +## 关键字: ADC, APT触发 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、中断和ADC控制器初始化和功能配置。示例中使用APT触发ADC采样,采样结束后触发ADC中断,并在中断回调函数中读取ADC转换结果。 + +**【示例配置】** ++ ADC触发源:APT。在"SystemInit()”中配置了APT的SOCA可以触发ADC采样。使用接口"HAL_APT_StartModule()”启动APT,在APT的每个周期中都会产生对ADC的触发请求。APT的触发配置请见"System_Init()”内APT初始化的部分。 + ++ ADC采样源:挂载到SOC0“adcInput”的外部采样源。SOC可以配置为“ADC_SOC_NUM0~ADC_SOC_NUM15”中任何一个。 + ++ ADC采样结果:ADC中断回调函数中读取结果。中断回调函数的配置请见"System_Init()”内ADC初始化的部分。在回调函数中调用“HAL_ADC_GetConvResult()”获取结果。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码中APT会周期性的对ADC进行触发采样。采样成功后,会通过串口打印中断服务函数内读取到的ADC采样结果。在串口打印输出中,会不断打印中断回调函数中读出的ADC采样结果。 + +**【注意事项】** ++ 示例代码使用UART0进行结果打印输出,需要对UART0进行初始化配置。 \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_associative_trigger_of_apt/src/sample_adc_associative_trigger_apt.c b/drivers_sample/adc/sample_adc_associative_trigger_of_apt/src/sample_adc_associative_trigger_apt.c new file mode 100644 index 000000000..05180c45f --- /dev/null +++ b/drivers_sample/adc/sample_adc_associative_trigger_of_apt/src/sample_adc_associative_trigger_apt.c @@ -0,0 +1,59 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_adc_associative_trigger_apt.c + * @author MCU Driver Team + * @brief adc sample sampling by apt trigger. + * @details Use APT to trigger ADC sampling, trigger an ADC interrupt after sampling, and read the ADC conversion + * result in the interrupt callback function. + * (1) ADC strigger source is APT0_SOCA. Select the ADC trigger source in "socParam.periphTrigSource" + * from SystemInit() and modify the initialization interface of the APT. + * (2) ADC sample source is ADC1_SOC1. Select sample source in "g_adc.baseAddress" and "ADC_SOC_NUM1" + * from SystemInit(). External input source: GPIO2_2/GPIO2_3 + * (3) The ADC conversion result is read from the interrupt callback function ADC_Init2FromApt interface. + * If interrupt is not used, after the conversion is complete, use HAL_ADC_GetConvResult() to obtain result. + * Check whether the ADC conversion is complete through the HAL_ADC_CheckSocFinish() interface. + */ +#include "sample_adc_associative_trigger_apt.h" + +/** + * @brief ADC sampling interrupt callback triggered by APT. + * @param None. + * @retval None. + */ +void ADC_Init2FromApt(ADC_Handle *handle) +{ + BASE_FUNC_UNUSED(handle); + unsigned int ret = HAL_ADC_GetConvResult(&g_adc, ADC_SOC_NUM1); /* Read ADC sample result */ + DBG_PRINTF("APT trigger sampling completed, result: %x\r\n", ret); + float voltage = (float)ret / (float)4096 * 3.3; /* 4096 and 3.3 are for Sample Value Conversion */ + DBG_PRINTF("voltage: %f\r\n", voltage); +} + +/** + * @brief ADC single channel sample by trigger from apt. + * @param None. + * @retval None. + */ +void ADC_AptTrigger(void) +{ + SystemInit(); + DBG_PRINTF("ADC_AptTrigger begin\r\n"); + HAL_ADC_StartIt(&g_adc); + HAL_APT_StartModule(RUN_APT0); /* APT0 is enable and generates the APT0_SOCA trigger signal */ + return; +} \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_continue_trigger/inc/sample_adc_continue_trigger.h b/drivers_sample/adc/sample_adc_continue_trigger/inc/sample_adc_continue_trigger.h new file mode 100644 index 000000000..0227a13c8 --- /dev/null +++ b/drivers_sample/adc/sample_adc_continue_trigger/inc/sample_adc_continue_trigger.h @@ -0,0 +1,33 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_adc_continue_trigger.h + * @author MCU Driver Team + * @brief adc sample module. + * @details This file provides users with sample code to help use ADC function: + * ADC Continuous Sampling Function: The first time is triggered by software, + * and the subsequent consecutive sampling is triggered by interrupts. + */ +#ifndef SAMPLE_ADC_CONTINUESAMPLE_H +#define SAMPLE_ADC_CONTINUESAMPLE_H + +#include "debug.h" +#include "adc.h" +#include "main.h" + +void ADC_ContinueSample(void); +#endif \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_continue_trigger/init/main.c b/drivers_sample/adc/sample_adc_continue_trigger/init/main.c new file mode 100644 index 000000000..5e269fbde --- /dev/null +++ b/drivers_sample/adc/sample_adc_continue_trigger/init/main.c @@ -0,0 +1,36 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "feature.h" +#include "main.h" +#include "sample_adc_continue_trigger.h" + +UART_Handle g_uart0; +ADC_Handle g_adc; + +int main(void) +{ + ADC_ContinueSample(); + while (1) { + } + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_continue_trigger/init/main.h b/drivers_sample/adc/sample_adc_continue_trigger/init/main.h new file mode 100644 index 000000000..9df26b874 --- /dev/null +++ b/drivers_sample/adc/sample_adc_continue_trigger/init/main.h @@ -0,0 +1,48 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "adc.h" +#include "uart.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +extern UART_Handle g_uart0; + +extern ADC_Handle g_adc; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +void ADC_ContinueInt(ADC_Handle *handle); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_continue_trigger/init/system_init.c b/drivers_sample/adc/sample_adc_continue_trigger/init/system_init.c new file mode 100644 index 000000000..d94418ac1 --- /dev/null +++ b/drivers_sample/adc/sample_adc_continue_trigger/init/system_init.c @@ -0,0 +1,140 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +__weak void ADC_ContinueInt(ADC_Handle *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN ADC_ContinueInt */ + /* USER CODE END ADC_ContinueInt */ +} + +static void ADC1_Init(void) +{ + HAL_CRG_IpEnableSet(ADC1_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(ADC1_BASE, CRG_ADC_CLK_SELECT_PLL_DIV); + HAL_CRG_IpClkDivSet(ADC1_BASE, CRG_ADC_DIV_5); + + g_adc.baseAddress = ADC1; + g_adc.socPriority = ADC_PRIMODE_ALL_ROUND; + g_adc.vrefBuf = ADC_VREF_2P5V; + g_adc.irqNumOver = IRQ_ADC1_OVINT; + g_adc.ADC_IntxParam[0].irqNum = IRQ_ADC1_INT1; /* interrupt 0 */ + g_adc.ADC_IntxParam[1].irqNum = IRQ_ADC1_INT2; /* interrupt 1 */ + g_adc.ADC_IntxParam[2].irqNum = IRQ_ADC1_INT3; /* interrupt 2 */ + g_adc.ADC_IntxParam[3].irqNum = IRQ_ADC1_INT4; /* interrupt 3 */ + + HAL_ADC_Init(&g_adc); + + SOC_Param socParam = {0}; + socParam.adcInput = ADC_CH_ADCINA1; + + socParam.sampleHoldTime = 2; /* adc sample holed time 2 adc_clk */ + socParam.sampleTotalTime = 127; /* adc sample total time 127 adc_clk */ + socParam.softTrigSource = ADC_TRIGSOC_SOFT; + socParam.intTrigSource = ADC_TRIGSOC_INT2; + socParam.periphTrigSource = ADC_TRIGSOC_NONEPERIPH; + socParam.finishMode = ADC_SOCFINISH_INT2; + HAL_ADC_ConfigureSoc(&g_adc, ADC_SOC_NUM1, &socParam); + + HAL_ADC_RegisterCallBack(&g_adc, ADC_CALLBACK_INT2, ADC_ContinueInt); + IRQ_SetPriority(IRQ_ADC1_INT2, 4); /* Set the priority to level 4 */ + IRQ_EnableN(IRQ_ADC1_INT2); + HAL_ADC_IrqService(&g_adc); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); + + g_uart0.baseAddress = UART0; + g_uart0.irqNum = IRQ_UART0; + + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + IOConfig_RegStruct *iconfig = IOCONFIG; + + iconfig->iocmg_21.BIT.func = 0x8; /* 0x8 is ADC1_ANA_A1 */ + iconfig->iocmg_21.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_21.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_21.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_21.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_21.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ + iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ + iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; +} + +void SystemInit(void) +{ + IOConfig(); + ADC1_Init(); + UART0_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_continue_trigger/readme.md b/drivers_sample/adc/sample_adc_continue_trigger/readme.md new file mode 100644 index 000000000..8de1d26e8 --- /dev/null +++ b/drivers_sample/adc/sample_adc_continue_trigger/readme.md @@ -0,0 +1,18 @@ +# 单次触发ADC,可以产生连续的采样效果 +## 关键字: ADC, 连续采样 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、中断和ADC控制器初始化和功能配置。示例中使用软件触发ADC开始采样,采样结束后触发ADC中断,并在中断回调函数中读取ADC转换结果。在每次完成采样结束后,内部会自动产生触发请求,实现连续采样功能。 + +**【示例配置】** ++ ADC触发源:软件触发。使用接口"HAL_ADC_SoftTrigSample()”启动软件触发。连续采样功能中,首次触发来自软件或者其他触发源,后面持续的请求来自ADC内部。 + ++ ADC采样源:挂载到SOC1 “adcInput”的外部采样源。SOC可以配置为“ADC_SOC_NUM0~ADC_SOC_NUM15”中任何一个 + ++ ADC采样结果:ADC中断回调函数中读取结果。中断回调函数的配置请见"System_Init()”内ADC初始化内容。在回调函数中调用“HAL_ADC_GetConvResult()”获取结果。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后,软件触发后,ADC进行连续触发采样,持续产生中断。采样成功后,会通过串口打印中断服务函数内读取到的ADC采样结果。在串口打印输出中,会不断打印中断回调函数中读出的ADC采样结果。 + +**【注意事项】** ++ 示例代码使用UART0进行结果打印输出,需要对UART0进行初始化配置。 \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_continue_trigger/src/sample_adc_continue_trigger.c b/drivers_sample/adc/sample_adc_continue_trigger/src/sample_adc_continue_trigger.c new file mode 100644 index 000000000..8ad708b05 --- /dev/null +++ b/drivers_sample/adc/sample_adc_continue_trigger/src/sample_adc_continue_trigger.c @@ -0,0 +1,65 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_adc_continue_trigger.c + * @author MCU Driver Team + * @brief adc sample module. + * @details In continuous mode, the ADC uses its internal interrupts to continuously trigger ADC sampling. After + * sampling is complete, an ADC interrupt is triggered. The ADC conversion result can be read in the + * interrupt callback function. ADC Continuous Sampling Function: The first time is triggered by software, + * and the subsequent consecutive sampling is triggered by interrupts. + * (1) ADC strigger source is ADC1 interrupt2(IRQ_ADC1_INT2). Select the ADC trigger source in + * "socParam.intTrigSource" of SystemInit(). + * (2) ADC sample source is ADC1_SOC1. Select sample source in "g_adc.baseAddress" and "ADC_SOC_NUM1" + * of SystemInit(). External input source: GPIO2_2/GPIO2_3 + * (3) The ADC conversion result is read from the interrupt callback function ADC_ContinueInt interface. + * If interrupt is not used, after the conversion is complete, use HAL_ADC_GetConvResult() to obtain result. + * Check whether the ADC conversion is complete through the HAL_ADC_CheckSocFinish() interface. + */ +#include "sample_adc_continue_trigger.h" + +/** + * @brief User callback function of ADC interrupt one. + * @param adcHandle ADC handle. + * @retval None. + */ +void ADC_ContinueInt(ADC_Handle *adcHandle) +{ + DBG_PRINTF("ADC_Int1Finish\r\n"); + unsigned int ret = HAL_ADC_GetConvResult(adcHandle, ADC_SOC_NUM1); + float voltage = (float)ret / (float)4096 * 3.3; /* 4096 and 3.3 are for Sample Value Conversion */ + DBG_PRINTF("result: %d, voltage: %f\r\n", ret, voltage); +} + +/** + * @brief Continuous sample function by using internal interrupt. + * @param None. + * @retval None. + */ +void ADC_ContinueSample(void) +{ + SystemInit(); + DBG_PRINTF("ADC_ContinueSample begin\r\n"); + HAL_ADC_StartIt(&g_adc); /* Enable ADC interrupt */ + /* The first trigger, then internal interrupt triggered continuous sampling */ + HAL_ADC_SoftTrigSample(&g_adc, ADC_SOC_NUM1); + /* + To disable the continuous sampling function, perform the following sampling methods: + (1) Disable the ADC interrupt and use IRQ_DisableN(). + (2) Configure the SOC trigger source and remove interrupt triggering. + */ +} \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_over_sample/inc/sample_adc_over_sample.h b/drivers_sample/adc/sample_adc_over_sample/inc/sample_adc_over_sample.h new file mode 100644 index 000000000..435baa6ca --- /dev/null +++ b/drivers_sample/adc/sample_adc_over_sample/inc/sample_adc_over_sample.h @@ -0,0 +1,31 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_adc_over_sample.h + * @author MCU Driver Team + * @brief adc sample module. + * @details This file provides users with sample code to help use ADC function. + */ +#ifndef SAMPLE_ADC_OVERSAMPLE_H +#define SAMPLE_ADC_OVERSAMPLE_H + +#include "debug.h" +#include "adc.h" +#include "main.h" + +void ADC_OverSample(void); +#endif \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_over_sample/init/main.c b/drivers_sample/adc/sample_adc_over_sample/init/main.c new file mode 100644 index 000000000..b276dd494 --- /dev/null +++ b/drivers_sample/adc/sample_adc_over_sample/init/main.c @@ -0,0 +1,36 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "feature.h" +#include "main.h" +#include "sample_adc_over_sample.h" + +UART_Handle g_uart0; +ADC_Handle g_adc; + +int main(void) +{ + ADC_OverSample(); + while (1) { + } + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_over_sample/init/main.h b/drivers_sample/adc/sample_adc_over_sample/init/main.h new file mode 100644 index 000000000..0289e7961 --- /dev/null +++ b/drivers_sample/adc/sample_adc_over_sample/init/main.h @@ -0,0 +1,46 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "adc.h" +#include "uart.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +extern UART_Handle g_uart0; + +extern ADC_Handle g_adc; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_over_sample/init/system_init.c b/drivers_sample/adc/sample_adc_over_sample/init/system_init.c new file mode 100644 index 000000000..c379b76aa --- /dev/null +++ b/drivers_sample/adc/sample_adc_over_sample/init/system_init.c @@ -0,0 +1,138 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void ADC1_Init(void) +{ + HAL_CRG_IpEnableSet(ADC1_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(ADC1_BASE, CRG_ADC_CLK_SELECT_PLL_DIV); + HAL_CRG_IpClkDivSet(ADC1_BASE, CRG_ADC_DIV_5); + + g_adc.baseAddress = ADC1; + g_adc.socPriority = ADC_PRIMODE_ALL_ROUND; + g_adc.vrefBuf = ADC_VREF_2P5V; + g_adc.irqNumOver = IRQ_ADC1_OVINT; + g_adc.ADC_IntxParam[0].irqNum = IRQ_ADC1_INT1; /* interrupt 0 */ + g_adc.ADC_IntxParam[1].irqNum = IRQ_ADC1_INT2; /* interrupt 1 */ + g_adc.ADC_IntxParam[2].irqNum = IRQ_ADC1_INT3; /* interrupt 2 */ + g_adc.ADC_IntxParam[3].irqNum = IRQ_ADC1_INT4; /* interrupt 3 */ + + HAL_ADC_Init(&g_adc); + + SOC_Param socParam = {0}; + socParam.adcInput = ADC_CH_ADCINA1; + + socParam.sampleHoldTime = 2; /* adc sample holed time 2 adc_clk */ + socParam.sampleTotalTime = 127; /* adc sample total time 127 adc_clk */ + socParam.softTrigSource = ADC_TRIGSOC_SOFT; + socParam.intTrigSource = ADC_TRIGSOC_NONEINT; + socParam.periphTrigSource = ADC_TRIGSOC_NONEPERIPH; + socParam.finishMode = ADC_SOCFINISH_NONE; + HAL_ADC_ConfigureSoc(&g_adc, ADC_SOC_NUM3, &socParam); + + socParam.adcInput = ADC_CH_ADCINA1; + + socParam.sampleHoldTime = 2; /* adc sample holed time 2 adc_clk */ + socParam.sampleTotalTime = 127; /* adc sample total time 127 adc_clk */ + socParam.softTrigSource = ADC_TRIGSOC_SOFT; + socParam.intTrigSource = ADC_TRIGSOC_NONEINT; + socParam.periphTrigSource = ADC_TRIGSOC_NONEPERIPH; + socParam.finishMode = ADC_SOCFINISH_NONE; + HAL_ADC_ConfigureSoc(&g_adc, ADC_SOC_NUM5, &socParam); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); + + g_uart0.baseAddress = UART0; + g_uart0.irqNum = IRQ_UART0; + + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + IOConfig_RegStruct *iconfig = IOCONFIG; + + iconfig->iocmg_21.BIT.func = 0x8; /* 0x8 is ADC1_ANA_A1 */ + iconfig->iocmg_21.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_21.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_21.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_21.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_21.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ + iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ + iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; +} + +void SystemInit(void) +{ + IOConfig(); + ADC1_Init(); + UART0_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_over_sample/readme.md b/drivers_sample/adc/sample_adc_over_sample/readme.md new file mode 100644 index 000000000..161013de9 --- /dev/null +++ b/drivers_sample/adc/sample_adc_over_sample/readme.md @@ -0,0 +1,18 @@ +# 同时对同一采样源采样,实现过采样功能 +## 关键字: ADC, 过采样 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、中断和ADC控制器初始化和功能配置。过采样示例中,ADC对同一条通道使用两个SOC来采样两次,使用软件触发ADC采样,触发采样后自行判断ADC转换完成后,再自行读取两个结果,此时结果为两倍过采样。 + +**【示例配置】** ++ ADC触发源:软件触发。使用接口"HAL_ADC_SoftTrigSample()”启动软件触发。连续采样功能中,首次触发来自软件或者其他触发源,后面持续的请求来自ADC内部。 + ++ ADC采样源:挂载到SOC3和SOC5外部采样源。SOC可以配置为“ADC_SOC_NUM0~ADC_SOC_NUM15”中任意两个。过采样中需要保证SOC3和SOC5采样源一致,要配置“SystemInit()”中“adcInput”参数一致。 + ++ ADC采样结果:自行判断转换完成后,再读取结果。使用接口“HAL_ADC_CheckSocFinish()”判断是否转换完成,返回值OK表示转换结束,再使用“HAL_ADC_GetConvResult()”接口,读取采样结果。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成,软件触发后,ADC进行同时对同一个采样源采样两次。等待5ms后检查ADC采样结是否转换完成,若转换完成串口打印出采样结果,若采样未完成打印未完成提示字符串。 + +**【注意事项】** ++ 示例代码使用UART0进行结果打印输出,需要对UART0进行初始化配置。 \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_over_sample/src/sample_adc_over_sample.c b/drivers_sample/adc/sample_adc_over_sample/src/sample_adc_over_sample.c new file mode 100644 index 000000000..b51705ae9 --- /dev/null +++ b/drivers_sample/adc/sample_adc_over_sample/src/sample_adc_over_sample.c @@ -0,0 +1,61 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_adc_over_sample.c + * @author MCU Driver Team + * @brief adc over sample module. + * @details In the oversampling example, the ADC samples the same channel twice and uses software to trigger ADC + * sampling. After the sampling is triggered, determines the ADC conversion is complete and reads the result. + * (1) ADC strigger source is software. Use HAL_ADC_SoftTrigMultiSample() to configure software tirgger SOC3 + * and SOC5. + * (2) ADC sample source is ADC1_SOC3 and ADC1_SOC5. Select sample source in "g_adc.baseAddress" of + * SystemInit(), "ADC_SOC_NUM3" and "ADC_SOC_NUM5" can be Modified. External input source: GPIO2_2/GPIO2_3. + * (3) The ADC conversion result is read from HAL_ADC_GetConvResult interface. + * If interrupt is not used, after the conversion is complete, use HAL_ADC_GetConvResult() to obtain result. + * Check whether the ADC conversion is complete through the HAL_ADC_CheckSocFinish() interface. + */ + +#include "sample_adc_over_sample.h" +/** + * @brief ADC over sample. + * @param None. + * @retval None. + */ +void ADC_OverSample(void) +{ + SystemInit(); + DBG_PRINTF("ADC_overSample begin\r\n"); + + ADC_SoftMultiTrig softTrig = {0}; + softTrig.BIT.trigSoc3 = BASE_CFG_ENABLE; + softTrig.BIT.trigSoc5 = BASE_CFG_ENABLE; + HAL_ADC_SoftTrigMultiSample(&g_adc, softTrig); /* Trigger both SOC3 and SOC5 */ + + BASE_FUNC_DELAY_MS(5); /* delay 5 ms */ + if (HAL_ADC_CheckSocFinish(&g_adc, ADC_SOC_NUM3) == BASE_STATUS_ERROR) { + DBG_PRINTF("SOC3 did not complete sampling and conversion\r\n"); + return; + } + if (HAL_ADC_CheckSocFinish(&g_adc, ADC_SOC_NUM5) == BASE_STATUS_ERROR) { + DBG_PRINTF("SOC5 did not complete sampling and conversion\r\n"); + return; + } + /* Read sampling results */ + unsigned ret1 = HAL_ADC_GetConvResult(&g_adc, ADC_SOC_NUM3); + unsigned ret2 = HAL_ADC_GetConvResult(&g_adc, ADC_SOC_NUM5); + DBG_PRINTF("ret1: %x, ret2: %x\r\n", ret1, ret2); +} \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_oversampling_it/inc/sample_adc_oversampling_it.h b/drivers_sample/adc/sample_adc_oversampling_it/inc/sample_adc_oversampling_it.h new file mode 100644 index 000000000..f5bb2399c --- /dev/null +++ b/drivers_sample/adc/sample_adc_oversampling_it/inc/sample_adc_oversampling_it.h @@ -0,0 +1,31 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_adc_oversampling_it.h + * @author MCU Driver Team + * @brief adc sample module. + * @details This file provides users with sample code to help use ADC function. + */ +#ifndef SAMPLE_ADC_OVERSAMPLING_IT_H +#define SAMPLE_ADC_OVERSAMPLING_IT_H + +#include "debug.h" +#include "adc.h" +#include "main.h" + +void ADC_OverSamplingIt(void); +#endif \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_oversampling_it/init/main.c b/drivers_sample/adc/sample_adc_oversampling_it/init/main.c new file mode 100644 index 000000000..c73cfd047 --- /dev/null +++ b/drivers_sample/adc/sample_adc_oversampling_it/init/main.c @@ -0,0 +1,51 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ + +#include "typedefs.h" +#include "feature.h" +#include "sample_adc_oversampling_it.h" +#include "main.h" +/* USER CODE BEGIN 0 */ +/* USER CODE END 0 */ +UART_Handle g_uart0; +ADC_Handle g_adc; +/* USER CODE BEGIN 1 */ +/* USER CODE END 1 */ + +int main(void) +{ + /* USER CODE BEGIN 2 */ + /* USER CODE END 2 */ + ADC_OverSamplingIt(); + /* USER CODE BEGIN 3 */ + /* USER CODE END 3 */ + while (1) { + /* USER CODE BEGIN 4 */ + /* USER CODE END 4 */ + } + /* USER CODE BEGIN 5 */ + /* USER CODE END 5 */ + return BASE_STATUS_OK; +} + +/* USER CODE BEGIN 6 */ +/* USER CODE END 6 */ \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_oversampling_it/init/main.h b/drivers_sample/adc/sample_adc_oversampling_it/init/main.h new file mode 100644 index 000000000..1e369a07d --- /dev/null +++ b/drivers_sample/adc/sample_adc_oversampling_it/init/main.h @@ -0,0 +1,55 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "adc.h" +#include "adc_ex.h" +#include "uart.h" +#include "uart_ex.h" +#include "crg.h" +#include "iocmg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define XTAL_DRV_LEVEL4 0x03U +#define XTAL_DRV_LEVEL3 0x02U +#define XTAL_DRV_LEVEL2 0x01U +#define XTAL_DRV_LEVEL1 0x00U + +extern UART_Handle g_uart0; +extern ADC_Handle g_adc; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +void ADC_OversamplingCalBack(ADC_Handle *handle); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_oversampling_it/init/system_init.c b/drivers_sample/adc/sample_adc_oversampling_it/init/system_init.c new file mode 100644 index 000000000..f99f4aeaf --- /dev/null +++ b/drivers_sample/adc/sample_adc_oversampling_it/init/system_init.c @@ -0,0 +1,138 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" +#include "iocmg_ip.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; /* crg address */ + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 48; /* PLL Multiplier 48 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { /* crg initialization */ + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +__weak void ADC_OversamplingCalBack(ADC_Handle *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN ADC_OversamplingCalBack */ + /* USER CODE END ADC_OversamplingCalBack */ +} + +static void ADC0_Init(void) +{ + HAL_CRG_IpEnableSet(ADC0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(ADC0_BASE, CRG_ADC_CLK_ASYN_PLL_DIV); + HAL_CRG_IpClkDivSet(ADC0_BASE, CRG_ADC_DIV_2); + + g_adc.baseAddress = ADC0; + g_adc.socPriority = ADC_PRIMODE_ALL_ROUND; + + HAL_ADC_Init(&g_adc); /* adc initialization */ + ADC_OversamplingParam over = {0}; + over.multiple = ADC_OVERSAMPLING_64X; /* 64x oversampling */ + over.rightShift = ADC_RIGHTSHIFT_BIT3; /* The sampling result is shifted rightwards by 3 bits */ + over.oversamplingInt = BASE_CFG_ENABLE; + HAL_ADC_ConfigureOversamplingEx(&g_adc, ADC_SOC_NUM1, &over); + + SOC_Param socParam = {0}; + socParam.adcInput = ADC_CH_ADCINA2; /* PIN47(ADC AIN2) */ + socParam.sampleTotalTime = ADC_SOCSAMPLE_5CLK; /* adc sample total time 5 adc_clk */ + socParam.trigSource = ADC_TRIGSOC_SOFT; + socParam.continueMode = BASE_CFG_DISABLE; + socParam.finishMode = ADC_SOCFINISH_NONE; + HAL_ADC_ConfigureSoc(&g_adc, ADC_SOC_NUM1, &socParam); + + HAL_ADC_RegisterCallBack(&g_adc, ADC_CALLBACK_EVENT_OVERSAMPLING, (ADC_CallbackType)ADC_OversamplingCalBack); + + IRQ_Register(IRQ_ADC0_EVENT, HAL_ADC_IrqHandlerAllEvent, &g_adc); + IRQ_SetPriority(IRQ_ADC0_EVENT, 1); /* The priority is 1 */ + IRQ_EnableN(IRQ_ADC0_EVENT); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + + g_uart0.baseAddress = UART0; /* uart address */ + /* UART parameter settings */ + g_uart0.baudRate = UART0_BAND_RATE; /* uart baud rate */ + g_uart0.dataLength = UART_DATALENGTH_8BIT; /* uart datalength */ + g_uart0.stopBits = UART_STOPBITS_ONE; /* uart stop bit */ + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; + g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); /* uart initialization */ +} + +static void IOConfig(void) +{ + SYSCTRL0->SC_SYS_STAT.BIT.update_mode = 0; + SYSCTRL0->SC_SYS_STAT.BIT.update_mode_clear = 1; + HAL_IOCMG_SetPinAltFuncMode(GPIO0_5_AS_ADC_AIN2); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_5_AS_ADC_AIN2, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_5_AS_ADC_AIN2, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_5_AS_ADC_AIN2, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_5_AS_ADC_AIN2, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + ADC0_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_oversampling_it/readme.md b/drivers_sample/adc/sample_adc_oversampling_it/readme.md new file mode 100644 index 000000000..45e4a1cf3 --- /dev/null +++ b/drivers_sample/adc/sample_adc_oversampling_it/readme.md @@ -0,0 +1,18 @@ +# 配置过采样精度,实现过采样功能,在中断中读取结果 +## 关键字: ADC, 过采样配置,中断 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、中断和ADC控制器初始化和功能配置。过采样示例中,ADC对同一条通道使用两个SOC来采样两次,使用软件触发ADC采样,触发采样后自行判断ADC转换完成后,再自行读取两个结果,此时结果为两倍过采样。 + +**【示例配置】** ++ ADC触发源:软件触发。使用接口"HAL_ADC_SoftTrigSample()”启动软件触发。 + ++ ADC采样源:挂载到SOC1部采样源。SOC可以配置为“ADC_SOC_NUM0~ADC_SOC_NUM15”中任意一个个。配置过采样的参数请见“HAL_ADC_ConfigureOversamplingEx()”接口。通过选择过采样倍数和结果右移比特数来共同决定过采样精度。 + ++ ADC采样结果:在过采样的中断中读出过采样的结果。过采样结果有单独的寄存器读取,需要使用“HAL_ADC_GetOversamplingResultEx()”进行读取。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成,软件触发。过采样全过程结束后,会在过采样的中断回调函数中打印出过采样的结果。 + +**【注意事项】** ++ 示例代码使用UART0进行结果打印输出,需要对UART0进行初始化配置。 \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_oversampling_it/src/sample_adc_oversampling_it.c b/drivers_sample/adc/sample_adc_oversampling_it/src/sample_adc_oversampling_it.c new file mode 100644 index 000000000..22b635c30 --- /dev/null +++ b/drivers_sample/adc/sample_adc_oversampling_it/src/sample_adc_oversampling_it.c @@ -0,0 +1,58 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_adc_oversampling_it.c + * @author MCU Driver Team + * @brief adc sample module. + * @details In oversampling mode, the ADC uses software triggers oversampling on the same channel. + * the ADC interrupt is triggered and conversion result is read in Oversampling event interrupt function. + * (1) ADC strigger source is software. Use HAL_ADC_SoftTrigSample() to configure software tirgger SOC1. + * (2) ADC sample source is SOC1. Select sample source in "g_adc.baseAddress" of SystemInit(), + * "ADC_SOC_NUM1" can be Modified. + * (3) The ADC conversion result is read from interrupt callback function ADC_OversamplingCalBack interface. + * If interrupt is not used, after the conversion is complete, use HAL_ADC_GetOversamplingResultEx() to obtain + * result. Check whether ADC conversion is complete through the HAL_ADC_CheckOversamplingFinishEx() interface. + */ +#include "adc_ex.h" +#include "sample_adc_oversampling_it.h" + +/** + * @brief ADC Oversampling callback function. + * @param handle. + * @retval None. + */ +void ADC_OversamplingCalBack(ADC_Handle *handle) +{ + BASE_FUNC_UNUSED(handle); + unsigned int ret = HAL_ADC_GetOversamplingResultEx(&g_adc); /* Software trigger ADC sampling */ + DBG_PRINTF("ADC_OversamplingCalBack, result: %x\r\n", ret); + float voltage = ((float)ret / (float)4096 * 3.3) / (float)(64 >> 3); /* 4096 , 3.3, 64 , 3 are for Conversion */ + DBG_PRINTF("voltage: %f\r\n", voltage); +} + +/** + * @brief ADC single channel sample without DMA and interrupt. + * @param None. + * @retval None. + */ +void ADC_OverSamplingIt(void) +{ + SystemInit(); + DBG_PRINTF("ADC_OverSamplingIt begin\r\n"); + HAL_ADC_SoftTrigSample(&g_adc, ADC_SOC_NUM1); /* Software trigger ADC sampling */ + return; +} \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_single_trigger/inc/sample_adc_single_trigger.h b/drivers_sample/adc/sample_adc_single_trigger/inc/sample_adc_single_trigger.h new file mode 100644 index 000000000..61f774166 --- /dev/null +++ b/drivers_sample/adc/sample_adc_single_trigger/inc/sample_adc_single_trigger.h @@ -0,0 +1,31 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_adc_single_trigger.h + * @author MCU Driver Team + * @brief adc sample module. + * @details This file provides users with sample code to help use ADC function. + */ +#ifndef SAMPLE_ADC_SINGLETRIGGER_H +#define SAMPLE_ADC_SINGLETRIGGER_H + +#include "debug.h" +#include "adc.h" +#include "main.h" + +void ADC_SingleTrigger(void); +#endif \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_single_trigger/init/main.c b/drivers_sample/adc/sample_adc_single_trigger/init/main.c new file mode 100644 index 000000000..26fd70a25 --- /dev/null +++ b/drivers_sample/adc/sample_adc_single_trigger/init/main.c @@ -0,0 +1,35 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ +#include "feature.h" +#include "main.h" +#include "sample_adc_single_trigger.h" + +UART_Handle g_uart0; +ADC_Handle g_adc; + +int main(void) +{ + ADC_SingleTrigger(); + while (1) { + } + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_single_trigger/init/main.h b/drivers_sample/adc/sample_adc_single_trigger/init/main.h new file mode 100644 index 000000000..0289e7961 --- /dev/null +++ b/drivers_sample/adc/sample_adc_single_trigger/init/main.h @@ -0,0 +1,46 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "adc.h" +#include "uart.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +extern UART_Handle g_uart0; + +extern ADC_Handle g_adc; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_single_trigger/init/system_init.c b/drivers_sample/adc/sample_adc_single_trigger/init/system_init.c new file mode 100644 index 000000000..09b25530d --- /dev/null +++ b/drivers_sample/adc/sample_adc_single_trigger/init/system_init.c @@ -0,0 +1,128 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void ADC1_Init(void) +{ + HAL_CRG_IpEnableSet(ADC1_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(ADC1_BASE, CRG_ADC_CLK_SELECT_PLL_DIV); + HAL_CRG_IpClkDivSet(ADC1_BASE, CRG_ADC_DIV_5); + + g_adc.baseAddress = ADC1; + g_adc.socPriority = ADC_PRIMODE_ALL_ROUND; + g_adc.vrefBuf = ADC_VREF_2P5V; + g_adc.irqNumOver = IRQ_ADC1_OVINT; + g_adc.ADC_IntxParam[0].irqNum = IRQ_ADC1_INT1; /* interrupt 0 */ + g_adc.ADC_IntxParam[1].irqNum = IRQ_ADC1_INT2; /* interrupt 1 */ + g_adc.ADC_IntxParam[2].irqNum = IRQ_ADC1_INT3; /* interrupt 2 */ + g_adc.ADC_IntxParam[3].irqNum = IRQ_ADC1_INT4; /* interrupt 3 */ + + HAL_ADC_Init(&g_adc); + + SOC_Param socParam = {0}; + socParam.adcInput = ADC_CH_ADCINA1; + + socParam.sampleHoldTime = 2; /* adc sample holed time 2 adc_clk */ + socParam.sampleTotalTime = 127; /* adc sample total time 127 adc_clk */ + socParam.softTrigSource = ADC_TRIGSOC_SOFT; + socParam.intTrigSource = ADC_TRIGSOC_NONEINT; + socParam.periphTrigSource = ADC_TRIGSOC_NONEPERIPH; + socParam.finishMode = ADC_SOCFINISH_NONE; + HAL_ADC_ConfigureSoc(&g_adc, ADC_SOC_NUM1, &socParam); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); + + g_uart0.baseAddress = UART0; + g_uart0.irqNum = IRQ_UART0; + + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + IOConfig_RegStruct *iconfig = IOCONFIG; + + iconfig->iocmg_21.BIT.func = 0x8; /* 0x8 is ADC1_ANA_A1 */ + iconfig->iocmg_21.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_21.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_21.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_21.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_21.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ + iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ + iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; +} + +void SystemInit(void) +{ + IOConfig(); + ADC1_Init(); + UART0_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_single_trigger/readme.md b/drivers_sample/adc/sample_adc_single_trigger/readme.md new file mode 100644 index 000000000..9c1e6fa6f --- /dev/null +++ b/drivers_sample/adc/sample_adc_single_trigger/readme.md @@ -0,0 +1,18 @@ +# 单次触发ADC完成一次采样转换 +## 关键字: ADC, 判断采样完成 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、中断和ADC控制器初始化和功能配置。ADC在单次采样模式下,使用软件触发ADC采样,触发采样后自行判断ADC转换完成后,再自行读取结果。 + +**【示例配置】** ++ ADC触发源:软件触发。使用接口"HAL_ADC_SoftTrigSample()”启动软件触发。 + ++ ADC采样源:挂载到SOC1 外部采样源。SOC的在文件“system_init.c”中配置,SOC可以配置为“ADC_SOC_NUM0~ADC_SOC_NUM15”中任何一个。 + ++ ADC采样结果:自行判断转换完成后,再读取结果。使用接口“HAL_ADC_CheckSocFinish()”判断是否转换完成,返回值OK表示转换结束,再使用“HAL_ADC_GetConvResult()”接口,读取采样结果。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成,软件触发后,ADC进行单次采样转换。等待10ms后检查ADC采样结是否转换完成,若转换完成串口打印出采样结果,若采样未完成打印未完成提示字符串。 + +**【注意事项】** ++ 示例代码使用UART0进行结果打印输出,需要对UART0进行初始化配置。 \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_single_trigger/src/sample_adc_single_trigger.c b/drivers_sample/adc/sample_adc_single_trigger/src/sample_adc_single_trigger.c new file mode 100644 index 000000000..090e9aca6 --- /dev/null +++ b/drivers_sample/adc/sample_adc_single_trigger/src/sample_adc_single_trigger.c @@ -0,0 +1,55 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_adc_single_trigger.c + * @author MCU Driver Team + * @brief adc sample module. + * @details In single sampling mode, the ADC is triggered by software. After the sampling is triggered, the ADC + * determines that the ADC conversion is complete and reads the result. + * (1) ADC strigger source is software. Use HAL_ADC_SoftTrigSample() to configure software tirgger SOC1. + * (2) ADC sample source is ADC1_SOC1. Select sample source in "g_adc.baseAddress" of SystemInit(), + * "ADC_SOC_NUM1" can be Modified. External input source: GPIO2_2/GPIO2_3. + * (3) If interrupt is not used, after the conversion is complete, use HAL_ADC_GetConvResult() to get result. + * Check whether the ADC conversion is complete through the HAL_ADC_CheckSocFinish() interface. + */ +#include "sample_adc_single_trigger.h" + +/** + * @brief ADC single channel sample without DMA and interrupt. + * @param None. + * @retval None. + */ +void ADC_SingleTrigger(void) +{ + SystemInit(); + DBG_PRINTF("ADC_SingleTrigger begin\r\n"); + + HAL_ADC_SoftTrigSample(&g_adc, ADC_SOC_NUM1); /* Software trigger ADC sampling */ + + BASE_FUNC_DELAY_MS(10); /* delay 10 ms */ + + if (HAL_ADC_CheckSocFinish(&g_adc, ADC_SOC_NUM1) == BASE_STATUS_ERROR) { + DBG_PRINTF("ADC did not complete sampling and conversion\r\n"); + return; + } + + unsigned int ret = HAL_ADC_GetConvResult(&g_adc, ADC_SOC_NUM1); /* Software trigger ADC sampling */ + DBG_PRINTF("Sampling completed, result: %x\r\n", ret); + float voltage = (float)ret / (float)4096 * 3.3; /* 4096 and 3.3 are for Sample Value Conversion */ + DBG_PRINTF("voltage: %f\r\n", voltage); + return; +} \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_single_trigger_dma/inc/sample_adc_single_trigger_dma.h b/drivers_sample/adc/sample_adc_single_trigger_dma/inc/sample_adc_single_trigger_dma.h new file mode 100644 index 000000000..0242aafc4 --- /dev/null +++ b/drivers_sample/adc/sample_adc_single_trigger_dma/inc/sample_adc_single_trigger_dma.h @@ -0,0 +1,32 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_adc_single_trigger_dma.h + * @author MCU Driver Team + * @brief adc sample module. + * @details This file provides users with sample code to help use ADC function: + * ADC sampling by software trigger with dma + */ +#ifndef SAMPLE_ADC_SINGLETRIGGER_DMA_H +#define SAMPLE_ADC_SINGLETRIGGER_DMA_H + +#include "debug.h" +#include "adc.h" +#include "main.h" + +void ADC_SingleTriggerDma(void); +#endif \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_single_trigger_dma/init/main.c b/drivers_sample/adc/sample_adc_single_trigger_dma/init/main.c new file mode 100644 index 000000000..1f84553cb --- /dev/null +++ b/drivers_sample/adc/sample_adc_single_trigger_dma/init/main.c @@ -0,0 +1,37 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ +#include "feature.h" +#include "main.h" +#include "sample_adc_single_trigger_dma.h" + +UART_Handle g_uart0; +ADC_Handle g_adc; + +DMA_Handle g_dmac; + +int main(void) +{ + ADC_SingleTriggerDma(); + while (1) { + } + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_single_trigger_dma/init/main.h b/drivers_sample/adc/sample_adc_single_trigger_dma/init/main.h new file mode 100644 index 000000000..42c24eecd --- /dev/null +++ b/drivers_sample/adc/sample_adc_single_trigger_dma/init/main.h @@ -0,0 +1,51 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "adc.h" +#include "uart.h" +#include "crg.h" +#include "dma.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +extern UART_Handle g_uart0; + +extern ADC_Handle g_adc; + +extern DMA_Handle g_dmac; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +void ADC1DMACallback(ADC_Handle *handle); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_single_trigger_dma/init/system_init.c b/drivers_sample/adc/sample_adc_single_trigger_dma/init/system_init.c new file mode 100644 index 000000000..9f1769b9e --- /dev/null +++ b/drivers_sample/adc/sample_adc_single_trigger_dma/init/system_init.c @@ -0,0 +1,170 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void DMA_Channel1Init(void *handle) +{ + DMA_ChannelParam dma_param; + dma_param.direction = DMA_PERIPH_TO_MEMORY_BY_DMAC; /* DMA transmission direction */ + dma_param.srcAddrInc = DMA_ADDR_UNALTERED; + dma_param.destAddrInc = DMA_ADDR_UNALTERED; + dma_param.srcPeriph = DMA_REQUEST_ADC1; /* ADC as DMA Request Source */ + dma_param.destPeriph = DMA_REQUEST_MEM; + dma_param.srcWidth = DMA_TRANSWIDTH_BYTE; + dma_param.destWidth = DMA_TRANSWIDTH_BYTE; + dma_param.srcBurst = DMA_BURST_LENGTH_1; + dma_param.destBurst = DMA_BURST_LENGTH_1; + dma_param.pHandle = handle; + HAL_DMA_InitChannel(&g_dmac, &dma_param, DMA_CHANNEL_ONE); /* Initializing the DMA Channel */ +} + +static void DMA_Init(void) +{ + g_dmac.baseAddress = DMA; + g_dmac.srcByteOrder = DMA_BYTEORDER_SMALLENDIAN; + g_dmac.destByteOrder = DMA_BYTEORDER_SMALLENDIAN; + g_dmac.irqNumTc = IRQ_DMA_TC; + g_dmac.irqNumError = IRQ_DMA_ERR; + HAL_DMA_IRQService(&g_dmac); + IRQ_EnableN(IRQ_DMA_TC); + IRQ_EnableN(IRQ_DMA_ERR); + HAL_DMA_Init(&g_dmac); /* Initializing the DMA controller */ + + DMA_Channel1Init((void *)(&g_adc)); +} + +__weak void ADC1DMACallback(ADC_Handle *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN ADC1DMACallback */ + /* USER CODE END ADC1DMACallback */ +} + +static void ADC1_Init(void) +{ + HAL_CRG_IpEnableSet(ADC1_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(ADC1_BASE, CRG_ADC_CLK_SELECT_PLL_DIV); + HAL_CRG_IpClkDivSet(ADC1_BASE, CRG_ADC_DIV_5); + + g_adc.baseAddress = ADC1; + g_adc.socPriority = ADC_PRIMODE_ALL_ROUND; + g_adc.vrefBuf = ADC_VREF_2P5V; + g_adc.irqNumOver = IRQ_ADC1_OVINT; + g_adc.ADC_IntxParam[0].irqNum = IRQ_ADC1_INT1; /* interrupt 0 */ + g_adc.ADC_IntxParam[1].irqNum = IRQ_ADC1_INT2; /* interrupt 1 */ + g_adc.ADC_IntxParam[2].irqNum = IRQ_ADC1_INT3; /* interrupt 2 */ + g_adc.ADC_IntxParam[3].irqNum = IRQ_ADC1_INT4; /* interrupt 3 */ + + g_adc.dmaHandle = &g_dmac; + g_adc.adcDmaChn = 1; /* DMA Channel 1 */ + HAL_ADC_RegisterCallBack(&g_adc, ADC_CALLBACK_DMA, ADC1DMACallback); + + HAL_ADC_Init(&g_adc); + + SOC_Param socParam = {0}; + socParam.adcInput = ADC_CH_ADCINA1; + + socParam.sampleHoldTime = 2; /* adc sample holed time 2 adc_clk */ + socParam.sampleTotalTime = 127; /* adc sample total time 127 adc_clk */ + socParam.softTrigSource = ADC_TRIGSOC_SOFT; + socParam.intTrigSource = ADC_TRIGSOC_NONEINT; + socParam.periphTrigSource = ADC_TRIGSOC_NONEPERIPH; + socParam.finishMode = ADC_SOCFINISH_DMA; + HAL_ADC_ConfigureSoc(&g_adc, ADC_SOC_NUM1, &socParam); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); + + g_uart0.baseAddress = UART0; + g_uart0.irqNum = IRQ_UART0; + + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + IOConfig_RegStruct *iconfig = IOCONFIG; + + iconfig->iocmg_21.BIT.func = 0x8; /* 0x8 is ADC1_ANA_A1 */ + iconfig->iocmg_21.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_21.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_21.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_21.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_21.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ + iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ + iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; +} + +void SystemInit(void) +{ + IOConfig(); + DMA_Init(); + ADC1_Init(); + UART0_Init(); + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_single_trigger_dma/readme.md b/drivers_sample/adc/sample_adc_single_trigger_dma/readme.md new file mode 100644 index 000000000..0e5ceb911 --- /dev/null +++ b/drivers_sample/adc/sample_adc_single_trigger_dma/readme.md @@ -0,0 +1,18 @@ +# 配置ADC的单次采样功能,利用DMA搬运结果 +## 关键字: ADC, DMA搬运结果 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、中断和ADC控制器初始化和功能配置。ADC在单次采样模式下,使用软件触发ADC采样,采样结束后触发DMA搬运结果。搬运结束产生中断,在ADC的DMA完成回调函数中读出结果。 + +**【示例配置】** ++ ADC触发源:软件。使用接口"HAL_ADC_SoftTrigSample()”完成软件触发。“HAL_ADC_StartDma()”用于配置DMA搬运的源目地址。 + ++ ADC采样源: 挂载到SOC1 外部采样源。SOC的在文件“system_init.c”中配置,SOC可以配置为“ADC_SOC_NUM0~ADC_SOC_NUM15”中任何一个。 + ++ ADC采样结果:DMA完成的回调函数中读取结果。DMA配置请见"SystemInit()”。示例代码中,提前开辟了保存ADC采样结果的内存,DMA搬运结束后,直接从内存读取结果。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码中会对ADC进行软件触发采样,采样完成触发DMA搬运数据。在完成对ADC采样结果搬运后,会产生中断告知用户,在ADC的DMA完成搬运的中断回调函数中,从预设置的内存中读出DMA的搬运结果,利用串口输出对结果进行打印。 + +**【注意事项】** ++ 示例代码使用UART0进行结果打印输出,需要对UART0配置。 diff --git a/drivers_sample/adc/sample_adc_single_trigger_dma/src/sample_adc_single_trigger_dma.c b/drivers_sample/adc/sample_adc_single_trigger_dma/src/sample_adc_single_trigger_dma.c new file mode 100644 index 000000000..70d836102 --- /dev/null +++ b/drivers_sample/adc/sample_adc_single_trigger_dma/src/sample_adc_single_trigger_dma.c @@ -0,0 +1,59 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_adc_single_trigger_dma.c + * @author MCU Driver Team + * @brief adc sample module. + * @details In single sampling mode, the ADC sampling is triggered by software. After the sampling is complete, + * the DMA is triggered to transfer the result. + * (1) ADC strigger source is software. Use HAL_ADC_SoftTrigSample() to configure software tirgger SOC1. + * (2) ADC sample source is ADC1_SOC1. Select sample source in "g_adc.baseAddress" of SystemInit(), + * "ADC_SOC_NUM3" can be Modified. External input source: GPIO2_2/GPIO2_3 + * (3) The ADC conversion result is read from DMA interrupt callback function ADC1DMACallback(). + */ + +#include "sample_adc_single_trigger_dma.h" + +static unsigned int g_adcRet[10] = {0}; +/** + * @brief User callback function of ADC interrupt one. + * @param adcHandle ADC handle. + * @retval None. + */ +void ADC_DMACallback(ADC_Handle *adcHandle) +{ + BASE_FUNC_UNUSED(adcHandle); + DBG_PRINTF("DMACallback\r\n"); + DBG_PRINTF("result: %d\r\n", g_adcRet[0]); + float voltage = (float)g_adcRet[0] / (float)4096 * 3.3; /* 4096 and 3.3 are for Sample Value Conversion */ + DBG_PRINTF("voltage: %f\r\n", voltage); +} + +/** + * @brief ADC channels sample with DMA. Transfers four SOC conversion results in one DMA request. + * @param None. + * @retval None. + */ +void ADC_SingleTriggerDma(void) +{ + SystemInit(); + DBG_PRINTF("ADC_SingleTriggerDma begin\r\n"); + + HAL_ADC_StartDma(&g_adc, ADC_SOC_NUM1, ADC_SOC_NUM1, g_adcRet); /* Transfer converted data of SOC1 */ + + HAL_ADC_SoftTrigSample(&g_adc, ADC_SOC_NUM1); /* Software triggers SOC1 */ +} \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_single_trigger_it/inc/sample_adc_single_trigger_it.h b/drivers_sample/adc/sample_adc_single_trigger_it/inc/sample_adc_single_trigger_it.h new file mode 100644 index 000000000..b35681567 --- /dev/null +++ b/drivers_sample/adc/sample_adc_single_trigger_it/inc/sample_adc_single_trigger_it.h @@ -0,0 +1,32 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_adc_single_trigger_it.h + * @author MCU Driver Team + * @brief adc sample module. + * @details This file provides users with sample code to help use ADC function: + * ADC sampling by software trigger + */ +#ifndef SAMPLE_ADC_SINGLETRIGGER_IT_H +#define SAMPLE_ADC_SINGLETRIGGER_IT_H + +#include "debug.h" +#include "adc.h" +#include "main.h" + +void ADC_SingleTriggerIT(void); +#endif \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_single_trigger_it/init/main.c b/drivers_sample/adc/sample_adc_single_trigger_it/init/main.c new file mode 100644 index 000000000..1e9d6aea3 --- /dev/null +++ b/drivers_sample/adc/sample_adc_single_trigger_it/init/main.c @@ -0,0 +1,35 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ +#include "feature.h" +#include "main.h" +#include "sample_adc_single_trigger_it.h" + +UART_Handle g_uart0; +ADC_Handle g_adc; + +int main(void) +{ + ADC_SingleTriggerIT(); + while (1) { + } + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_single_trigger_it/init/main.h b/drivers_sample/adc/sample_adc_single_trigger_it/init/main.h new file mode 100644 index 000000000..3386a5210 --- /dev/null +++ b/drivers_sample/adc/sample_adc_single_trigger_it/init/main.h @@ -0,0 +1,48 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "adc.h" +#include "uart.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +extern UART_Handle g_uart0; + +extern ADC_Handle g_adc; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +void ADC_Int1Finish(ADC_Handle *handle); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_single_trigger_it/init/system_init.c b/drivers_sample/adc/sample_adc_single_trigger_it/init/system_init.c new file mode 100644 index 000000000..447acce0c --- /dev/null +++ b/drivers_sample/adc/sample_adc_single_trigger_it/init/system_init.c @@ -0,0 +1,140 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +__weak void ADC_Int1Finish(ADC_Handle *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN ADC_Int1Finish */ + /* USER CODE END ADC_Int1Finish */ +} + +static void ADC1_Init(void) +{ + HAL_CRG_IpEnableSet(ADC1_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(ADC1_BASE, CRG_ADC_CLK_SELECT_PLL_DIV); + HAL_CRG_IpClkDivSet(ADC1_BASE, CRG_ADC_DIV_5); + + g_adc.baseAddress = ADC1; + g_adc.socPriority = ADC_PRIMODE_ALL_ROUND; + g_adc.vrefBuf = ADC_VREF_2P5V; + g_adc.irqNumOver = IRQ_ADC1_OVINT; + g_adc.ADC_IntxParam[0].irqNum = IRQ_ADC1_INT1; /* interrupt 0 */ + g_adc.ADC_IntxParam[1].irqNum = IRQ_ADC1_INT2; /* interrupt 1 */ + g_adc.ADC_IntxParam[2].irqNum = IRQ_ADC1_INT3; /* interrupt 2 */ + g_adc.ADC_IntxParam[3].irqNum = IRQ_ADC1_INT4; /* interrupt 3 */ + + HAL_ADC_Init(&g_adc); + + SOC_Param socParam = {0}; + socParam.adcInput = ADC_CH_ADCINA1; + + socParam.sampleHoldTime = 2; /* adc sample holed time 2 adc_clk */ + socParam.sampleTotalTime = 127; /* adc sample total time 127 adc_clk */ + socParam.softTrigSource = ADC_TRIGSOC_SOFT; + socParam.intTrigSource = ADC_TRIGSOC_NONEINT; + socParam.periphTrigSource = ADC_TRIGSOC_NONEPERIPH; + socParam.finishMode = ADC_SOCFINISH_INT1; + HAL_ADC_ConfigureSoc(&g_adc, ADC_SOC_NUM0, &socParam); + + HAL_ADC_RegisterCallBack(&g_adc, ADC_CALLBACK_INT1, ADC_Int1Finish); + IRQ_SetPriority(IRQ_ADC1_INT1, 7); /* Set the priority to level 7 */ + IRQ_EnableN(IRQ_ADC1_INT1); + HAL_ADC_IrqService(&g_adc); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); + + g_uart0.baseAddress = UART0; + g_uart0.irqNum = IRQ_UART0; + + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + IOConfig_RegStruct *iconfig = IOCONFIG; + + iconfig->iocmg_21.BIT.func = 0x8; /* 0x8 is ADC1_ANA_A1 */ + iconfig->iocmg_21.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_21.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_21.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_21.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_21.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ + iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ + iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; +} + +void SystemInit(void) +{ + IOConfig(); + ADC1_Init(); + UART0_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_single_trigger_it/readme.md b/drivers_sample/adc/sample_adc_single_trigger_it/readme.md new file mode 100644 index 000000000..fb280a9d8 --- /dev/null +++ b/drivers_sample/adc/sample_adc_single_trigger_it/readme.md @@ -0,0 +1,18 @@ +# 配置ADC的单次采样功能,中断回调中读取结果 +## 关键字: ADC, 单次采样, 中断 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、中断和ADC控制器初始化和功能配置。ADC在单次采样模式下,使用软件触发ADC采样,采样结束后触发ADC中断,并在中断回调函数中读取ADC转换结果。 + +**【示例配置】** ++ ADC触发源:软件。使用接口"HAL_ADC_SoftTrigSample()”完成软件触发。 + ++ ADC采样源: 挂载到SOC1 外部采样源。SOC的在文件“system_init.c”中配置,SOC可以配置为“ADC_SOC_NUM0~ADC_SOC_NUM15”中任何一个。 + ++ ADC采样结果:ADC中断回调函数中读取结果。ADC可以选择4个数据完成中断的任一个,配置请见"System_Init()”。在回调函数中调用“HAL_ADC_GetConvResult()”获取结果。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码中会对ADC进行软件触发采样。采样成功后,在中断回调函数中会通过串口打印读取到的ADC采样结果。 + +**【注意事项】** ++ 示例代码使用UART0进行结果打印输出,需要对UART0配置。 diff --git a/drivers_sample/adc/sample_adc_single_trigger_it/src/sample_adc_single_trigger_it.c b/drivers_sample/adc/sample_adc_single_trigger_it/src/sample_adc_single_trigger_it.c new file mode 100644 index 000000000..59eb3c1c6 --- /dev/null +++ b/drivers_sample/adc/sample_adc_single_trigger_it/src/sample_adc_single_trigger_it.c @@ -0,0 +1,57 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_adc_single_trigger_it.c + * @author MCU Driver Team + * @brief adc sample module. + * @details In single sampling mode, the ADC sampling is triggered by software. After the sampling is complete, + * the ADC interrupt is triggered and the ADC conversion result is read in the interrupt callback function. + * (1) ADC strigger source is software. Use HAL_ADC_SoftTrigSample() to configure software tirgger SOC0. + * (2) ADC sample source is ADC1_SOC0. Select sample source in "g_adc.baseAddress" of SystemInit(), + * "ADC_SOC_NUM0" can be Modified. External input source: GPIO2_2/GPIO2_3 + * (3) The ADC conversion result is read from interrupt callback function ADC_Int1Finish interface. + * If interrupt is not used, after the conversion is complete, use HAL_ADC_GetConvResult() to obtain result. + * Check whether the ADC conversion is complete through the HAL_ADC_CheckSocFinish() interface. + */ +#include "sample_adc_single_trigger_it.h" + +/** + * @brief User callback function of ADC interrupt one. + * @param adcHandle ADC handle. + * @retval None. + */ +void ADC_Int1Finish(ADC_Handle *adcHandle) +{ + DBG_PRINTF("ADC_Int1Finish\r\n"); + unsigned int ret = HAL_ADC_GetConvResult(adcHandle, ADC_SOC_NUM0); + DBG_PRINTF("result: %d\r\n", ret); + float voltage = (float)ret / (float)4096 * 3.3; /* 4096 and 3.3 are for Sample Value Conversion */ + DBG_PRINTF("voltage: %f\r\n", voltage); +} + +/** + * @brief ADC single channel sample with interrupt. Each channel independently generate an interrupt. + * @param None. + * @retval None. + */ +void ADC_SingleTriggerIT(void) +{ + SystemInit(); + DBG_PRINTF("ADC_SingleTriggerIT begin\r\n"); + HAL_ADC_StartIt(&g_adc); + HAL_ADC_SoftTrigSample(&g_adc, ADC_SOC_NUM0); /* Software trigger ADC sampling */ +} \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_single_with_ppb/inc/sample_adc_single_with_ppb.h b/drivers_sample/adc/sample_adc_single_with_ppb/inc/sample_adc_single_with_ppb.h new file mode 100644 index 000000000..7d2137584 --- /dev/null +++ b/drivers_sample/adc/sample_adc_single_with_ppb/inc/sample_adc_single_with_ppb.h @@ -0,0 +1,30 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_adc_single_with_ppb.h + * @author MCU Driver Team + * @brief adc sample module. + * @details In the post-processing example of the ADC, there is the normal trigger sampling function and four + * post-processing functions: error calculation, upper threshold detection, lower threshold detection, + * and zero-crossing detection. + */ +#ifndef SAMPLE_ADC_SINGLE_WITH_PPB_H +#define SAMPLE_ADC_SINGLE_WITH_PPB_H +#include "debug.h" +#include "main.h" +void ADC_SingleTriggerItWithPPB(void); +#endif \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_single_with_ppb/init/main.c b/drivers_sample/adc/sample_adc_single_with_ppb/init/main.c new file mode 100644 index 000000000..18ad93d8e --- /dev/null +++ b/drivers_sample/adc/sample_adc_single_with_ppb/init/main.c @@ -0,0 +1,51 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ + +#include "typedefs.h" +#include "feature.h" +#include "sample_adc_single_with_ppb.h" +#include "main.h" +/* USER CODE BEGIN 0 */ +/* USER CODE END 0 */ +UART_Handle g_uart0; +ADC_Handle g_adc; +/* USER CODE BEGIN 1 */ +/* USER CODE END 1 */ + +int main(void) +{ + /* USER CODE BEGIN 2 */ + /* USER CODE END 2 */ + ADC_SingleTriggerItWithPPB(); + /* USER CODE BEGIN 3 */ + /* USER CODE END 3 */ + while (1) { + /* USER CODE BEGIN 4 */ + /* USER CODE END 4 */ + } + /* USER CODE BEGIN 5 */ + /* USER CODE END 5 */ + return BASE_STATUS_OK; +} + +/* USER CODE BEGIN 6 */ +/* USER CODE END 6 */ \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_single_with_ppb/init/main.h b/drivers_sample/adc/sample_adc_single_with_ppb/init/main.h new file mode 100644 index 000000000..c79ba4522 --- /dev/null +++ b/drivers_sample/adc/sample_adc_single_with_ppb/init/main.h @@ -0,0 +1,56 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "adc.h" +#include "adc_ex.h" +#include "uart.h" +#include "uart_ex.h" +#include "crg.h" +#include "iocmg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define XTAL_DRV_LEVEL4 0x03U +#define XTAL_DRV_LEVEL3 0x02U +#define XTAL_DRV_LEVEL2 0x01U +#define XTAL_DRV_LEVEL1 0x00U + +extern UART_Handle g_uart0; +extern ADC_Handle g_adc; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +void ADCOversampingCallback(ADC_Handle *handle); +void ADC_Int1Finish(ADC_Handle *handle); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_single_with_ppb/init/system_init.c b/drivers_sample/adc/sample_adc_single_with_ppb/init/system_init.c new file mode 100644 index 000000000..628749430 --- /dev/null +++ b/drivers_sample/adc/sample_adc_single_with_ppb/init/system_init.c @@ -0,0 +1,144 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" +#include "iocmg_ip.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; /* crg address */ + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 48; /* PLL Multiplier 48 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { /* crg initialization */ + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +__weak void ADC_Int1Finish(ADC_Handle *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN ADC0_CALLBACK_INT1 */ + /* USER CODE END ADC0_CALLBACK_INT1 */ +} + +__weak void ADCOversampingCallback(ADC_Handle *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN ADCOversampingCallback */ + /* USER CODE END ADCOversampingCallback */ +} + +static void ADC0_Init(void) +{ + HAL_CRG_IpEnableSet(ADC0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(ADC0_BASE, CRG_ADC_CLK_ASYN_PLL_DIV); + HAL_CRG_IpClkDivSet(ADC0_BASE, CRG_ADC_DIV_2); + + g_adc.baseAddress = ADC0; + g_adc.socPriority = ADC_PRIMODE_ALL_ROUND; + + HAL_ADC_Init(&g_adc); /* adc initialization */ + + SOC_Param socParam = {0}; + socParam.adcInput = ADC_CH_ADCINA2; /* PIN47(ADC AIN2) */ + socParam.sampleTotalTime = ADC_SOCSAMPLE_5CLK; /* adc sample total time 5 adc_clk */ + socParam.trigSource = ADC_TRIGSOC_SOFT; + socParam.continueMode = BASE_CFG_DISABLE; + socParam.finishMode = ADC_SOCFINISH_INT1; + HAL_ADC_ConfigureSoc(&g_adc, ADC_SOC_NUM1, &socParam); + + HAL_ADC_RegisterCallBack(&g_adc, ADC_CALLBACK_INT1, (ADC_CallbackType)ADC_Int1Finish); + HAL_ADC_RegisterCallBack(&g_adc, ADC_CALLBACK_EVENT_OVERSAMPLING, (ADC_CallbackType)ADCOversampingCallback); + + IRQ_Register(IRQ_ADC0_INT1, HAL_ADC_IrqHandlerDataB, &g_adc); + IRQ_SetPriority(IRQ_ADC0_INT1, 7); /* The priority is 7 */ + IRQ_EnableN(IRQ_ADC0_INT1); + IRQ_Register(IRQ_ADC0_EVENT, HAL_ADC_IrqHandlerAllEvent, &g_adc); + IRQ_SetPriority(IRQ_ADC0_EVENT, 6); /* The priority is 6 */ + IRQ_EnableN(IRQ_ADC0_EVENT); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + + g_uart0.baseAddress = UART0; /* uart address */ + /* UART parameter settings */ + g_uart0.baudRate = UART0_BAND_RATE; /* uart baud rate */ + g_uart0.dataLength = UART_DATALENGTH_8BIT; /* uart datalength */ + g_uart0.stopBits = UART_STOPBITS_ONE; /* uart stop bit */ + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; + g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); /* uart initialization */ +} + +static void IOConfig(void) +{ + SYSCTRL0->SC_SYS_STAT.BIT.update_mode = 0; + SYSCTRL0->SC_SYS_STAT.BIT.update_mode_clear = 1; + HAL_IOCMG_SetPinAltFuncMode(GPIO0_5_AS_ADC_AIN2); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_5_AS_ADC_AIN2, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_5_AS_ADC_AIN2, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_5_AS_ADC_AIN2, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_5_AS_ADC_AIN2, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + ADC0_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_single_with_ppb/readme.md b/drivers_sample/adc/sample_adc_single_with_ppb/readme.md new file mode 100644 index 000000000..a83d0ef52 --- /dev/null +++ b/drivers_sample/adc/sample_adc_single_with_ppb/readme.md @@ -0,0 +1,20 @@ +# ADC的后处理功能 +## 关键字: ADC, 误差计算,阈值检测 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、中断和ADC控制器初始化和功能配置。ADC的后处理功能,当ADC完成一次普通的采样完成后,对于采样结果进行处理操作。 ++ 误差计算功能:设置一个参考值,采样结束后,自动计算出参考值和采样结果的差值,并保存在寄存器中。 ++ 阈值检测功能:设置阈值的上下限,当参考值和采样结果的差值大于上阈值或者小于下阈值,会产生中断。 + +**【示例配置】** ++ ADC触发源:软件触发。使用接口"HAL_ADC_SoftTrigSample()”启动软件触发。示例中一个触发了三次,第一次触发读出普通的采样结果;设置后处理参数,第二次触发进行后处理功能;修改后处理参数,第三次触发再次进行后处理功能。 + ++ ADC采样源:挂载到SOC1部采样源。SOC可以配置为“ADC_SOC_NUM0~ADC_SOC_NUM15”中任意一个。 + ++ ADC采样结果:在过采样的中断中读出过采样的结果。每次触发产生的采样结果均产生一个数据完成中断,在中断回调函数中使用“HAL_ADC_GetConvResult()”进行读取。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成,软件触发。第一次触发采样结束后,只打印出ADC的采样结果。后两次触发,按照后处理参数的配置和当前采样结果,触发不同的后处理中断,然后在中断回调函数中打印相应的字符串。 + +**【注意事项】** ++ 示例代码使用UART0进行结果打印输出,需要对UART0进行初始化配置。 \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_single_with_ppb/src/sample_adc_single_with_ppb.c b/drivers_sample/adc/sample_adc_single_with_ppb/src/sample_adc_single_with_ppb.c new file mode 100644 index 000000000..da275761f --- /dev/null +++ b/drivers_sample/adc/sample_adc_single_with_ppb/src/sample_adc_single_with_ppb.c @@ -0,0 +1,131 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_adc_single_with_ppb.c + * @author MCU Driver Team + * @brief adc sample module. + * @details In the post-processing example of the ADC, there is the normal trigger sampling function and four + * post-processing functions: error calculation, upper threshold detection, lower threshold detection, + * and zero-crossing detection. + */ +#include "sample_adc_single_with_ppb.h" + +void ADC_PPB1Error(void *handle); +void ADC_PPB1Up(void *handle); +void ADC_PPB1Down(void *handle); +void ADC_PPB1Zero(void *handle); +/** + * @brief User callback function of ADC interrupt one. + * @param handle ADC handle. + * @retval None. + */ +void ADC_Int1Finish(ADC_Handle *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("ADC_Int1Finish\r\n"); + unsigned int ret = HAL_ADC_GetConvResult(&g_adc, ADC_SOC_NUM1); + DBG_PRINTF("result: %d\r\n", ret); + float voltage = (float)ret / (float)4096 * 3.3; /* 4096 and 3.3 are for Sample Value Conversion */ + DBG_PRINTF("voltage: %f\r\n", voltage); +} + +/** + * @brief User callback function of ADC interrupt one. + * @param handle ADC handle. + * @retval None. + */ +void ADC_PPB1Error(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("ADC_PPB1Error: Calculation error completed, errorRef - result\r\n"); + int ret = HAL_ADC_GetPPBxErrorResultEx(&g_adc, ADC_PPB_NUM1); /* Obtain the error value */ + DBG_PRINTF("ErrorResultEx: %d\r\n", ret); + unsigned int delay = HAL_ADC_GetPPBxDelayCntEx(&g_adc, ADC_PPB_NUM1); + DBG_PRINTF("delay: %d\r\n", delay); +} + +/** + * @brief User callback function of ADC interrupt one. + * @param handle ADC handle. + * @retval None. + */ +void ADC_PPB1Up(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("ADC_PPB1Up: The PPB upper threshold overflows\r\n"); +} + +/** + * @brief User callback function of ADC interrupt one. + * @param handle ADC handle. + * @retval None. + */ +void ADC_PPB1Down(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("ADC_PPB1Down: The PPB down threshold overflows\r\n"); +} + +/** + * @brief User callback function of ADC interrupt one. + * @param handle ADC handle. + * @retval None. + */ +void ADC_PPB1Zero(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("ADC_PPB1Zero\r\n"); +} + +/** + * @brief ADC single channel sample with interrupt. Each channel independently generate an interrupt. + * @param None. + * @retval None. + */ +void ADC_SingleTriggerItWithPPB(void) +{ + SystemInit(); + DBG_PRINTF("ADC_SingleTriggerItWithPPB begin\r\n"); + HAL_ADC_RegisterCallBack(&g_adc, ADC_CALLBACK_EVENT_PPB1_ERROR, ADC_PPB1Error); + HAL_ADC_RegisterCallBack(&g_adc, ADC_CALLBACK_EVENT_PPB1_UP, ADC_PPB1Up); + HAL_ADC_RegisterCallBack(&g_adc, ADC_CALLBACK_EVENT_PPB1_DOWN, ADC_PPB1Down); + HAL_ADC_RegisterCallBack(&g_adc, ADC_CALLBACK_EVENT_PPB1_ZERO, ADC_PPB1Zero); + HAL_ADC_StartIt(&g_adc); + HAL_ADC_SoftTrigSample(&g_adc, ADC_SOC_NUM1); /* Software trigger ADC sampling */ + + BASE_FUNC_DELAY_S(1); /* After the delay is 1s, the PPB is enabled for re-sampling */ + DBG_PRINTF("\r\nPPB1 Setting offset: -2000; errorRef: 100; threshold: < -10 or > 10\r\n"); + PPB_Function ppbfun = {0}; + ppbfun.offset = BASE_CFG_ENABLE; /* Using the Offset Calculation Function */ + ppbfun.detect = BASE_CFG_ENABLE; /* Use the threshold detection function for offset calculation results */ + ppbfun.delay = BASE_CFG_ENABLE; /* Enable the sampling delay recording function */ + HAL_ADC_ConfigurePPBxEx(&g_adc, ADC_SOC_NUM1, ADC_PPB_NUM1, &ppbfun); + + /* Sets -2000 as the offset value. The original result and offset result are summed up */ + HAL_ADC_SetPPBxOffsetEx(&g_adc, ADC_PPB_NUM1, -2000); + /* Set 100 as the error reference value. Error reference value minus offset calculation data */ + HAL_ADC_SetPPBxErrorRefEx(&g_adc, ADC_PPB_NUM1, 100); + /* Setting Comparison Thresholds 10 and -10. Check data that error reference value minus offset calculation data */ + HAL_ADC_SetPPBxThresholdEx(&g_adc, ADC_PPB_NUM1, 10, -10); + HAL_ADC_EnablePPBxEventIntEx(&g_adc); + HAL_ADC_SoftTrigSample(&g_adc, ADC_SOC_NUM1); /* Software trigger ADC sampling */ + + BASE_FUNC_DELAY_S(1); /* After the delay is 1s, the PPB is enabled for re-sampling */ + DBG_PRINTF("\r\nPPB1 Setting offset: -2000; errorRef: 40; threshold: < -10 or > 10\r\n"); + HAL_ADC_SetPPBxErrorRefEx(&g_adc, ADC_PPB_NUM1, 40); /* Set 40 as the error reference value */ + HAL_ADC_SoftTrigSample(&g_adc, ADC_SOC_NUM1); /* Software trigger ADC sampling */ +} \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_sync_sample/inc/sample_adc_sync_sample.h b/drivers_sample/adc/sample_adc_sync_sample/inc/sample_adc_sync_sample.h new file mode 100644 index 000000000..3bb03221c --- /dev/null +++ b/drivers_sample/adc/sample_adc_sync_sample/inc/sample_adc_sync_sample.h @@ -0,0 +1,32 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_adc_sync_sample.h + * @author MCU Driver Team + * @brief adc sample module. + * @details This file provides users with sample code to help use ADC function: + * ADC Dual-Channel synchronous sample. + */ +#ifndef SAMPLE_ADC_SYNCSAMPLE_H +#define SAMPLE_ADC_SYNCSAMPLE_H + +#include "debug.h" +#include "adc.h" +#include "main.h" + +void ADC_SyncSample(void); +#endif \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_sync_sample/init/main.c b/drivers_sample/adc/sample_adc_sync_sample/init/main.c new file mode 100644 index 000000000..2e9d48af3 --- /dev/null +++ b/drivers_sample/adc/sample_adc_sync_sample/init/main.c @@ -0,0 +1,35 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ +#include "feature.h" +#include "main.h" +#include "sample_adc_sync_sample.h" + +UART_Handle g_uart0; +ADC_Handle g_adc; + +int main(void) +{ + ADC_SyncSample(); + while (1) { + } + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_sync_sample/init/main.h b/drivers_sample/adc/sample_adc_sync_sample/init/main.h new file mode 100644 index 000000000..0289e7961 --- /dev/null +++ b/drivers_sample/adc/sample_adc_sync_sample/init/main.h @@ -0,0 +1,46 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "adc.h" +#include "uart.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +extern UART_Handle g_uart0; + +extern ADC_Handle g_adc; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_sync_sample/init/system_init.c b/drivers_sample/adc/sample_adc_sync_sample/init/system_init.c new file mode 100644 index 000000000..771dace70 --- /dev/null +++ b/drivers_sample/adc/sample_adc_sync_sample/init/system_init.c @@ -0,0 +1,137 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void ADC1_Init(void) +{ + HAL_CRG_IpEnableSet(ADC1_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(ADC1_BASE, CRG_ADC_CLK_SELECT_PLL_DIV); + HAL_CRG_IpClkDivSet(ADC1_BASE, CRG_ADC_DIV_5); + + g_adc.baseAddress = ADC1; + g_adc.socPriority = ADC_PRIMODE_ALL_ROUND; + g_adc.vrefBuf = ADC_VREF_2P5V; + g_adc.irqNumOver = IRQ_ADC1_OVINT; + g_adc.ADC_IntxParam[0].irqNum = IRQ_ADC1_INT1; /* interrupt 0 */ + g_adc.ADC_IntxParam[1].irqNum = IRQ_ADC1_INT2; /* interrupt 1 */ + g_adc.ADC_IntxParam[2].irqNum = IRQ_ADC1_INT3; /* interrupt 2 */ + g_adc.ADC_IntxParam[3].irqNum = IRQ_ADC1_INT4; /* interrupt 3 */ + + HAL_ADC_Init(&g_adc); + + SOC_SyncParam syncParam = {0}; + syncParam.ChannelA = ADC_CH_ADCINA1; + syncParam.ChannelB = ADC_CH_ADCINB2; + syncParam.group = ADC_SYNCSAMPLE_GROUP_1; + + syncParam.sampleHoldTime = 2; /* adc sample holed time 2 adc_clk */ + syncParam.sampleTotalTime = 127; /* adc sample total time 127 adc_clk */ + syncParam.softTrigSource = ADC_TRIGSOC_SOFT; + syncParam.intTrigSource = ADC_TRIGSOC_NONEINT; + syncParam.periphTrigSource = ADC_TRIGSOC_NONEPERIPH; + syncParam.finishMode = ADC_SOCFINISH_NONE; + HAL_ADC_StartSyncSample(&g_adc, &syncParam); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); + + g_uart0.baseAddress = UART0; + g_uart0.irqNum = IRQ_UART0; + + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + IOConfig_RegStruct *iconfig = IOCONFIG; + + iconfig->iocmg_21.BIT.func = 0x8; /* 0x8 is ADC1_ANA_A1 */ + iconfig->iocmg_21.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_21.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_21.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_21.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_21.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_23.BIT.func = 0x8; /* 0x8 is ADC1_ANA_B2 */ + iconfig->iocmg_23.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_23.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_23.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_23.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_23.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ + iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ + iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; +} + +void SystemInit(void) +{ + IOConfig(); + ADC1_Init(); + UART0_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_sync_sample/readme.md b/drivers_sample/adc/sample_adc_sync_sample/readme.md new file mode 100644 index 000000000..362f110d5 --- /dev/null +++ b/drivers_sample/adc/sample_adc_sync_sample/readme.md @@ -0,0 +1,18 @@ +# 单次触发ADC的同步采样功能,主动查询转换完成标志位读取结果 +## 关键字: ADC,同步采样,查询转换完成 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、中断和ADC控制器初始化和功能配置。ADC在同步采样模式下,使用软件触发ADC两条通路同步同时采样,触发采样后软件判断ADC转换完成后,如果转换完成则读取结果。 + +**【示例配置】** ++ ADC触发源:软件。使用接口”HAL_ADC_SoftTrigMultiSample()”完成软件同时触发。同步采样,要求两条采样通路触发源一致。 + ++ ADC采样源: 挂载到SOC0和SOC1的外部采样源。SOC的在文件“system_init.c”中配置,同步采样模式选择的SOC0和SOC1,它们的配置由"SystemInit()”接口中的"ADC_SYNCSAMPLE_GROUP_1"决定,ADC_SYNCSAMPLE_GROUP_1对应的两个SOC为SOC0和SOC1,可以配置为(ADC_SYNCSAMPLE_GROUP_1~8)。 + ++ ADC采样结果:自行判断转换完成后,再读取结果。使用接口“HAL_ADC_CheckSocFinish()”判断是否转换完成,返回值OK表示转换结束,再使用“HAL_ADC_GetConvResult()”接口,分别读取两路采样结果。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成,软件触发后,ADC进行单次采样转换。等待5ms后检查ADC采样结是否转换完成,若转换完成串口依次打印出两条通路的采样结果,若采样未完成打印未完成提示字符串。 + +**【注意事项】** ++ 示例代码使用UART0进行结果打印输出,需要对UART0配置。 diff --git a/drivers_sample/adc/sample_adc_sync_sample/src/sample_adc_sync_sample.c b/drivers_sample/adc/sample_adc_sync_sample/src/sample_adc_sync_sample.c new file mode 100644 index 000000000..09c441120 --- /dev/null +++ b/drivers_sample/adc/sample_adc_sync_sample/src/sample_adc_sync_sample.c @@ -0,0 +1,63 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_adc_sync_sample.c + * @author MCU Driver Team + * @brief adc sample module. + * @details In synchronous sampling mode, the ADC uses software to trigger simultaneous sampling of the two ADC + * channels. After sampling is triggered, the ADC determines that the ADC conversion is complete and reads + * the result ADC Dual-Channel synchronous sample, the trigger sources of the two channels must be the same. + * (1) ADC strigger source is software. Use HAL_ADC_SoftTrigMultiSample() to configure software tirgger SOC0 + * and SOC1. + * (2) ADC sample source is ADC1_SOC0 and ADC1_SOC1. Select sample source in "g_adc.baseAddress" of + * SystemInit(), SOC0 and SOC1 are determined by the ADC_SYNCSAMPLE_GROUP_1 in SystemInit(). + * (3) The ADC conversion result is read from HAL_ADC_GetConvResult(). + * After the conversion is complete, use HAL_ADC_GetConvResult() to obtain result. + * Check whether the ADC conversion is complete through the HAL_ADC_CheckSocFinish() interface. + */ + +#include "sample_adc_sync_sample.h" + +/** + * @brief ADC Dual-Channel synchronous sample. + * @param None. + * @retval None. + */ +void ADC_SyncSample(void) +{ + SystemInit(); + DBG_PRINTF("ADC_SyncSample begin\r\n"); + + ADC_SoftMultiTrig softTrig = {0}; + softTrig.BIT.trigSoc0 = BASE_CFG_ENABLE; + softTrig.BIT.trigSoc1 = BASE_CFG_ENABLE; + HAL_ADC_SoftTrigMultiSample(&g_adc, softTrig); /* Trigger both SOC0 and SOC1 */ + + BASE_FUNC_DELAY_MS(5); /* delay 5 ms */ + if (HAL_ADC_CheckSocFinish(&g_adc, ADC_SOC_NUM0) == BASE_STATUS_ERROR) { + DBG_PRINTF("SOC0 did not complete sampling and conversion\r\n"); + return; + } + if (HAL_ADC_CheckSocFinish(&g_adc, ADC_SOC_NUM1) == BASE_STATUS_ERROR) { + DBG_PRINTF("SOC1 did not complete sampling and conversion\r\n"); + return; + } + /* Read sampling results */ + unsigned ret1 = HAL_ADC_GetConvResult(&g_adc, ADC_SOC_NUM0); + unsigned ret2 = HAL_ADC_GetConvResult(&g_adc, ADC_SOC_NUM1); + DBG_PRINTF("ret1: %x, ret2: %x\r\n", ret1, ret2); +} \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_sync_sample_dma/inc/sample_adc_sync_sample_dma.h b/drivers_sample/adc/sample_adc_sync_sample_dma/inc/sample_adc_sync_sample_dma.h new file mode 100644 index 000000000..1de3c7ec6 --- /dev/null +++ b/drivers_sample/adc/sample_adc_sync_sample_dma/inc/sample_adc_sync_sample_dma.h @@ -0,0 +1,32 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_adc_sync_sample_dma.h + * @author MCU Driver Team + * @brief adc sample module. + * @details This file provides users with sample code to help use ADC function: + * ADC Dual-Channel synchronous sample with dma. + */ +#ifndef SAMPLE_ADC_SYNCSAMPLE_DMA_H +#define SAMPLE_ADC_SYNCSAMPLE_DMA_H + +#include "debug.h" +#include "adc.h" +#include "main.h" + +void ADC_SyncSampleWithDma(void); +#endif \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_sync_sample_dma/init/main.c b/drivers_sample/adc/sample_adc_sync_sample_dma/init/main.c new file mode 100644 index 000000000..ff3aa96f3 --- /dev/null +++ b/drivers_sample/adc/sample_adc_sync_sample_dma/init/main.c @@ -0,0 +1,37 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ +#include "feature.h" +#include "main.h" +#include "sample_adc_sync_sample_dma.h" + +UART_Handle g_uart0; +ADC_Handle g_adc; + +DMA_Handle g_dmac; + +int main(void) +{ + ADC_SyncSampleWithDma(); + while (1) { + } + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_sync_sample_dma/init/main.h b/drivers_sample/adc/sample_adc_sync_sample_dma/init/main.h new file mode 100644 index 000000000..afd1d3e69 --- /dev/null +++ b/drivers_sample/adc/sample_adc_sync_sample_dma/init/main.h @@ -0,0 +1,51 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "adc.h" +#include "uart.h" +#include "crg.h" +#include "dma.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +extern UART_Handle g_uart0; + +extern ADC_Handle g_adc; + +extern DMA_Handle g_dmac; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +void ADC_SyncIntCallBack(ADC_Handle *handle); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_sync_sample_dma/init/system_init.c b/drivers_sample/adc/sample_adc_sync_sample_dma/init/system_init.c new file mode 100644 index 000000000..21a1083a4 --- /dev/null +++ b/drivers_sample/adc/sample_adc_sync_sample_dma/init/system_init.c @@ -0,0 +1,180 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void DMA_Channel1Init(void *handle) +{ + DMA_ChannelParam dma_param; + dma_param.direction = DMA_PERIPH_TO_MEMORY_BY_DMAC; /* DMA transmission direction */ + dma_param.srcAddrInc = DMA_ADDR_INCREASE; + dma_param.destAddrInc = DMA_ADDR_INCREASE; + dma_param.srcPeriph = DMA_REQUEST_ADC1; /* ADC as DMA Request Source */ + dma_param.destPeriph = DMA_REQUEST_MEM; + dma_param.srcWidth = DMA_TRANSWIDTH_WORD; + dma_param.destWidth = DMA_TRANSWIDTH_WORD; + dma_param.srcBurst = DMA_BURST_LENGTH_16; + dma_param.destBurst = DMA_BURST_LENGTH_16; + dma_param.pHandle = handle; + HAL_DMA_InitChannel(&g_dmac, &dma_param, DMA_CHANNEL_ONE); /* Initializing the DMA Channel */ +} + +static void DMA_Init(void) +{ + g_dmac.baseAddress = DMA; + g_dmac.srcByteOrder = DMA_BYTEORDER_SMALLENDIAN; + g_dmac.destByteOrder = DMA_BYTEORDER_SMALLENDIAN; + g_dmac.irqNumTc = IRQ_DMA_TC; + g_dmac.irqNumError = IRQ_DMA_ERR; + HAL_DMA_IRQService(&g_dmac); + IRQ_EnableN(IRQ_DMA_TC); + IRQ_EnableN(IRQ_DMA_ERR); + HAL_DMA_Init(&g_dmac); /* Initializing the DMA controller */ + + DMA_Channel1Init((void *)(&g_adc)); +} + +__weak void ADC_SyncIntCallBack(ADC_Handle *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN ADC_SyncIntCallBack */ + /* USER CODE END ADC_SyncIntCallBack */ +} + +static void ADC1_Init(void) +{ + HAL_CRG_IpEnableSet(ADC1_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(ADC1_BASE, CRG_ADC_CLK_SELECT_PLL_DIV); + HAL_CRG_IpClkDivSet(ADC1_BASE, CRG_ADC_DIV_5); + + g_adc.baseAddress = ADC1; + g_adc.socPriority = ADC_PRIMODE_ALL_ROUND; + g_adc.vrefBuf = ADC_VREF_2P5V; + g_adc.irqNumOver = IRQ_ADC1_OVINT; + g_adc.ADC_IntxParam[0].irqNum = IRQ_ADC1_INT1; /* interrupt 0 */ + g_adc.ADC_IntxParam[1].irqNum = IRQ_ADC1_INT2; /* interrupt 1 */ + g_adc.ADC_IntxParam[2].irqNum = IRQ_ADC1_INT3; /* interrupt 2 */ + g_adc.ADC_IntxParam[3].irqNum = IRQ_ADC1_INT4; /* interrupt 3 */ + + g_adc.dmaHandle = &g_dmac; + g_adc.adcDmaChn = 1; /* DMA Channel 1 */ + HAL_ADC_RegisterCallBack(&g_adc, ADC_CALLBACK_DMA, ADC_SyncIntCallBack); + + HAL_ADC_Init(&g_adc); + + SOC_SyncParam syncParam = {0}; + syncParam.ChannelA = ADC_CH_ADCINA1; + syncParam.ChannelB = ADC_CH_ADCINB3; + syncParam.group = ADC_SYNCSAMPLE_GROUP_3; + + syncParam.sampleHoldTime = 2; /* adc sample holed time 2 adc_clk */ + syncParam.sampleTotalTime = 127; /* adc sample total time 127 adc_clk */ + syncParam.softTrigSource = ADC_TRIGSOC_SOFT; + syncParam.intTrigSource = ADC_TRIGSOC_NONEINT; + syncParam.periphTrigSource = ADC_TRIGSOC_NONEPERIPH; + syncParam.finishMode = ADC_SOCFINISH_DMA; + HAL_ADC_StartSyncSample(&g_adc, &syncParam); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); + + g_uart0.baseAddress = UART0; + g_uart0.irqNum = IRQ_UART0; + + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + IOConfig_RegStruct *iconfig = IOCONFIG; + + iconfig->iocmg_21.BIT.func = 0x8; /* 0x8 is ADC1_ANA_A1 */ + iconfig->iocmg_21.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_21.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_21.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_21.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_21.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_18.BIT.func = 0x8; /* 0x8 is ADC1_ANA_B3 */ + iconfig->iocmg_18.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_18.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_18.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_18.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_18.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ + iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ + iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; +} + +void SystemInit(void) +{ + IOConfig(); + DMA_Init(); + ADC1_Init(); + UART0_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_sync_sample_dma/readme.md b/drivers_sample/adc/sample_adc_sync_sample_dma/readme.md new file mode 100644 index 000000000..302614278 --- /dev/null +++ b/drivers_sample/adc/sample_adc_sync_sample_dma/readme.md @@ -0,0 +1,18 @@ +# 单次触发ADC的同步采样功能,采样结束使用DMA搬运结果 +## 关键字: ADC,同步采样,DMA搬运 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、中断和ADC控制器初始化和功能配置。ADC在同步采样模式下,使用软件触发ADC两条通路同步同时采样,采样结束后触发DMA搬运结果。 + +**【示例配置】** ++ ADC触发源:软件。使用接口”HAL_ADC_SoftTrigMultiSample()”完成软件同时触发。同步采样,要求两条采样通路触发源一致。 + ++ ADC采样源: 挂载到SOC4和SOC5的外部采样源。SOC的在文件“system_init.c”中配置,同步采样模式选择的SOC4和SOC5,它们的配置由"SystemInit()”接口中的"ADC_SYNCSAMPLE_GROUP_3"决定,ADC_SYNCSAMPLE_GROUP_3对应的两个SOC为SOC4和SOC5,可以配置为(ADC_SYNCSAMPLE_GROUP_1~8)。 + ++ ADC采样结果:DMA完成的回调函数中读取结果。DMA配置请见"SystemInit()”。示例代码中,提前开辟了保存ADC采样结果的内存,DMA搬运结束后,直接从内存读取结果。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码中会对ADC进行软件触发采样,采样完成触发DMA搬运数据。在完成对ADC采样结果搬运后,会产生中断告知用户,在ADC的DMA完成搬运的中断回调函数中,从预设置的内存中读出DMA的搬运结果,利用串口输出对结果进行打印。 + +**【注意事项】** ++ 示例代码使用UART0进行结果打印输出,需要对UART0配置。 diff --git a/drivers_sample/adc/sample_adc_sync_sample_dma/src/sample_adc_sync_sample_dma.c b/drivers_sample/adc/sample_adc_sync_sample_dma/src/sample_adc_sync_sample_dma.c new file mode 100644 index 000000000..3c747efbb --- /dev/null +++ b/drivers_sample/adc/sample_adc_sync_sample_dma/src/sample_adc_sync_sample_dma.c @@ -0,0 +1,62 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_adc_sync_sample_dma.c + * @author MCU Driver Team + * @brief adc sample module. + * @details This file provides users with sample code to help use ADC function: + * ADC Dual-Channel synchronous sample, the trigger sources of the two channels must be the same. + * (1) ADC strigger source is software. Use HAL_ADC_SoftTrigMultiSample() to configure software tirgger SOC4 + * and SOC5. + * (2) ADC sample source is ADC1_SOC4 and ADC1_SOC5. Select sample source in "g_adc.baseAddress" of +* SystemInit(), SOC4 and SOC5 are determined by the ADC_SYNCSAMPLE_GROUP_3 in SystemInit(). + * (3) The ADC conversion result is read from DMA interrupt callback function ADC_SyncIntCallBack(). + */ +#include "sample_adc_sync_sample_dma.h" +static unsigned int g_ret[10] = {0}; + +/** + * @brief User callback function of interrupt. + * @param adcHandle ADC handle. + * @retval None. + */ +void ADC_SyncIntCallBack(ADC_Handle *adcHandle) +{ + BASE_FUNC_UNUSED(adcHandle); + DBG_PRINTF("ADC_SyncIntCallBack\r\n"); + unsigned ret1 = HAL_ADC_GetConvResult(&g_adc, ADC_SOC_NUM4); + unsigned ret2 = HAL_ADC_GetConvResult(&g_adc, ADC_SOC_NUM5); + /* Compare the DMA transfer result with the result in the register */ + DBG_PRINTF("ret1: %x, ret2: %x\r\n", ret1, ret2); + DBG_PRINTF("g_ret1: %x, g_ret2: %x\r\n", g_ret[0], g_ret[1]); +} + +/** + * @brief ADC Dual-Channel synchronous sample with dma. + * @param None. + * @retval None. + */ +void ADC_SyncSampleWithDma(void) +{ + SystemInit(); + DBG_PRINTF("ADC_SyncSampleWithDma begin\r\n"); + HAL_ADC_StartDma(&g_adc, ADC_SOC_NUM4, ADC_SOC_NUM5, g_ret); + ADC_SoftMultiTrig softTrig = {0}; + softTrig.BIT.trigSoc4 = BASE_CFG_ENABLE; /* Group3 -- Synchronous sample group: SOC4 and SOC5 */ + softTrig.BIT.trigSoc5 = BASE_CFG_ENABLE; + HAL_ADC_SoftTrigMultiSample(&g_adc, softTrig); /* Trigger both SOC4 and SOC5 */ +} \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_sync_sample_it/inc/sample_adc_sync_sample_it.h b/drivers_sample/adc/sample_adc_sync_sample_it/inc/sample_adc_sync_sample_it.h new file mode 100644 index 000000000..d80612d02 --- /dev/null +++ b/drivers_sample/adc/sample_adc_sync_sample_it/inc/sample_adc_sync_sample_it.h @@ -0,0 +1,32 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_adc_sync_sample_it.h + * @author MCU Driver Team + * @brief adc sample module. + * @details This file provides users with sample code to help use ADC function: + * ADC Dual-Channel synchronous sample with dma. + */ +#ifndef SAMPLE_ADC_SYNCSAMPLE_IT_H +#define SAMPLE_ADC_SYNCSAMPLE_IT_H + +#include "debug.h" +#include "adc.h" +#include "main.h" + +void ADC_SyncSampleWithIt(void); +#endif \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_sync_sample_it/init/main.c b/drivers_sample/adc/sample_adc_sync_sample_it/init/main.c new file mode 100644 index 000000000..29a258f09 --- /dev/null +++ b/drivers_sample/adc/sample_adc_sync_sample_it/init/main.c @@ -0,0 +1,35 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ +#include "feature.h" +#include "main.h" +#include "sample_adc_sync_sample_it.h" + +UART_Handle g_uart0; +ADC_Handle g_adc; + +int main(void) +{ + ADC_SyncSampleWithIt(); + while (1) { + } + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_sync_sample_it/init/main.h b/drivers_sample/adc/sample_adc_sync_sample_it/init/main.h new file mode 100644 index 000000000..e9be60344 --- /dev/null +++ b/drivers_sample/adc/sample_adc_sync_sample_it/init/main.h @@ -0,0 +1,48 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "adc.h" +#include "uart.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +extern UART_Handle g_uart0; + +extern ADC_Handle g_adc; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +void ADC1Interrupt4Callback(ADC_Handle *handle); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_sync_sample_it/init/system_init.c b/drivers_sample/adc/sample_adc_sync_sample_it/init/system_init.c new file mode 100644 index 000000000..e62df67d0 --- /dev/null +++ b/drivers_sample/adc/sample_adc_sync_sample_it/init/system_init.c @@ -0,0 +1,142 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +__weak void ADC1Interrupt4Callback(ADC_Handle *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN ADC1Interrupt4Callback */ + /* USER CODE END ADC1Interrupt4Callback */ +} + +static void ADC1_Init(void) +{ + HAL_CRG_IpEnableSet(ADC1_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(ADC1_BASE, CRG_ADC_CLK_SELECT_PLL_DIV); + HAL_CRG_IpClkDivSet(ADC1_BASE, CRG_ADC_DIV_5); + + g_adc.baseAddress = ADC1; + g_adc.socPriority = ADC_PRIMODE_ALL_PRIORITY; + g_adc.vrefBuf = ADC_VREF_2P5V; + g_adc.irqNumOver = IRQ_ADC1_OVINT; + g_adc.ADC_IntxParam[0].irqNum = IRQ_ADC1_INT1; /* interrupt 0 */ + g_adc.ADC_IntxParam[1].irqNum = IRQ_ADC1_INT2; /* interrupt 1 */ + g_adc.ADC_IntxParam[2].irqNum = IRQ_ADC1_INT3; /* interrupt 2 */ + g_adc.ADC_IntxParam[3].irqNum = IRQ_ADC1_INT4; /* interrupt 3 */ + + HAL_ADC_Init(&g_adc); + + SOC_SyncParam syncParam = {0}; + syncParam.ChannelA = ADC_CH_ADCINA1; + syncParam.ChannelB = ADC_CH_ADCINB1; + syncParam.group = ADC_SYNCSAMPLE_GROUP_3; + + syncParam.sampleHoldTime = 2; /* adc sample holed time 2 adc_clk */ + syncParam.sampleTotalTime = 127; /* adc sample total time 127 adc_clk */ + syncParam.softTrigSource = ADC_TRIGSOC_SOFT; + syncParam.intTrigSource = ADC_TRIGSOC_NONEINT; + syncParam.periphTrigSource = ADC_TRIGSOC_NONEPERIPH; + syncParam.finishMode = ADC_SOCFINISH_INT4; + HAL_ADC_StartSyncSample(&g_adc, &syncParam); + + HAL_ADC_RegisterCallBack(&g_adc, ADC_CALLBACK_INT4, ADC1Interrupt4Callback); + IRQ_SetPriority(IRQ_ADC1_INT4, 1); + IRQ_EnableN(IRQ_ADC1_INT4); + HAL_ADC_IrqService(&g_adc); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); + + g_uart0.baseAddress = UART0; + g_uart0.irqNum = IRQ_UART0; + + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + IOConfig_RegStruct *iconfig = IOCONFIG; + + iconfig->iocmg_21.BIT.func = 0x8; /* 0x8 is ADC1_ANA_A1 */ + iconfig->iocmg_21.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_21.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_21.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_21.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_21.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ + iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ + iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + ADC1_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/adc/sample_adc_sync_sample_it/readme.md b/drivers_sample/adc/sample_adc_sync_sample_it/readme.md new file mode 100644 index 000000000..82b32cbbc --- /dev/null +++ b/drivers_sample/adc/sample_adc_sync_sample_it/readme.md @@ -0,0 +1,18 @@ +# 单次触发ADC的同步采样功能,中断回调函数中读取结果 +## 关键字: ADC,同步采样,中断 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、中断和ADC控制器初始化和功能配置。ADC在同步采样模式下,使用软件触发ADC两条通路同步同时采样,采样结束后触发ADC中断,并在中断回调函数中读取ADC转换结果。 + +**【示例配置】** ++ ADC触发源:软件。使用接口”HAL_ADC_SoftTrigMultiSample()”完成软件同时触发。同步采样,要求两条采样通路触发源一致。 + ++ ADC采样源: 挂载到SOC4和SOC5的外部采样源。SOC的在文件“system_init.c”中配置,同步采样模式选择的SOC4和SOC5,它们的配置由"SystemInit()”接口中的"ADC_SYNCSAMPLE_GROUP_3"决定,ADC_SYNCSAMPLE_GROUP_3对应的两个SOC为SOC4和SOC5,可以配置为(ADC_SYNCSAMPLE_GROUP_1~8)。 + ++ ADC采样结果:ADC中断回调函数中读取结果。ADC可以选择4个数据完成中断的任一个,配置请见"System_Init()”。在回调函数中调用“HAL_ADC_GetConvResult()”获取结果。同步采样功能中,当两条通路采样完成时,触发中断。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成,软件触发后,ADC进行单次采样转换。两条通路都采样成功后,在中断回调函数中会通过串口打印读取到的ADC采样结果。 + +**【注意事项】** ++ 示例代码使用UART0进行结果打印输出,需要对UART0配置。 diff --git a/drivers_sample/adc/sample_adc_sync_sample_it/src/sample_adc_sync_sample_it.c b/drivers_sample/adc/sample_adc_sync_sample_it/src/sample_adc_sync_sample_it.c new file mode 100644 index 000000000..0a7320dba --- /dev/null +++ b/drivers_sample/adc/sample_adc_sync_sample_it/src/sample_adc_sync_sample_it.c @@ -0,0 +1,58 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_adc_sync_sample_it.c + * @author MCU Driver Team + * @brief adc sample module. + * @details In synchronous sampling mode, software triggers simultaneous sampling of the two ADC channels. After + * sampling, an ADC interrupt is triggered and conversion result is read in the interrupt callback function. + * (1) ADC strigger source is software. Use HAL_ADC_SoftTrigMultiSample() to configure software tirgger SOC4 + * and SOC5. + * (2) ADC sample source is ADC1_SOC4 and ADC1_SOC5. Select sample source in "g_adc.baseAddress" of + * SystemInit(), SOC4 and SOC5 are determined by the ADC_SYNCSAMPLE_GROUP_3 in SystemInit(). + * (3) The ADC conversion result is read from ADC interrupt callback function ADC1Interrupt4Callback(). + */ +#include "sample_adc_sync_sample_it.h" + +/** + * @brief User callback function of ADC interrupt one. + * @param adcHandle ADC handle. + * @retval None. + */ +void ADC1Interrupt4Callback(ADC_Handle *adcHandle) +{ + BASE_FUNC_UNUSED(adcHandle); + DBG_PRINTF("ADC1Interrupt4Callback\r\n"); /* ADC Synchronous Sampling Complete */ + unsigned ret1 = HAL_ADC_GetConvResult(&g_adc, ADC_SOC_NUM4); + unsigned ret2 = HAL_ADC_GetConvResult(&g_adc, ADC_SOC_NUM5); + DBG_PRINTF("ret1: %x, ret2: %x\r\n", ret1, ret2); +} + +/** + * @brief ADC Dual-Channel synchronous sample with interrupt. + * @param None. + * @retval None. + */ +void ADC_SyncSampleWithIt(void) +{ + SystemInit(); + DBG_PRINTF("ADC_SyncSampleWithIt begin\r\n"); + ADC_SoftMultiTrig softTrig = {0}; + softTrig.BIT.trigSoc4 = BASE_CFG_ENABLE; /* Group3 -- Synchronous sample group: SOC4 and SOC5 */ + softTrig.BIT.trigSoc5 = BASE_CFG_ENABLE; + HAL_ADC_SoftTrigMultiSample(&g_adc, softTrig); /* Trigger both SOC4 and SOC5 */ +} \ No newline at end of file diff --git a/drivers_sample/apt/sample_apt_single_resistor/inc/sample_apt_single_resistor.h b/drivers_sample/apt/sample_apt_single_resistor/inc/sample_apt_single_resistor.h new file mode 100644 index 000000000..6ec216fa1 --- /dev/null +++ b/drivers_sample/apt/sample_apt_single_resistor/inc/sample_apt_single_resistor.h @@ -0,0 +1,45 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file apt_hal_sample.h + * @author MCU Driver Team + * @brief Header file containing functions prototypes of APT module HAL sample. + */ + +#ifndef McuMagicTag_APT_HAL_SAMPLE_H +#define McuMagicTag_APT_HAL_SAMPLE_H + +#include "apt_ip.h" +#include "interrupt.h" + +/** + * @brief ADC current sample mode. + */ +typedef enum { + ADC_SINGLE_RESISTOR = 0x00000000U, + ADC_THREE_RESISTORS = 0x00000001U, +} ADC_SampleMode; + +void APT_PWMInitHALSample(void); +void APT_SetPWMDutyU(unsigned int duty); +void APT_SetPWMDutyV(unsigned int duty); +void APT_SetPWMDutyW(unsigned int duty); +void APT_SetADCTrgTime(unsigned short cntCmpSOCA, unsigned short cntCmpSOCB, ADC_SampleMode mode); +void APT_PhaseOut(bool enable); +void APT_RunAllPwm(void); +void APT_StopAllPwm(void); +#endif /* McuMagicTag_APT_HAL_SAMPLE_H */ \ No newline at end of file diff --git a/drivers_sample/apt/sample_apt_single_resistor/init/main.c b/drivers_sample/apt/sample_apt_single_resistor/init/main.c new file mode 100644 index 000000000..528c579f0 --- /dev/null +++ b/drivers_sample/apt/sample_apt_single_resistor/init/main.c @@ -0,0 +1,57 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ + +#include "typedefs.h" +#include "feature.h" +#include "sample_apt_single_resistor.h" +#include "main.h" +/* USER CODE BEGIN 0 */ + //APT_PWMInitHALSample(); + /* USER CODE END 0 */ +UART_Handle g_uart0Handle; +APT_Handle g_hAptU; +APT_Handle g_hAptV; +APT_Handle g_hAptW; +/* USER CODE BEGIN 1 */ + /* USER CODE END 1 */ + +int main(void) +{ + /* USER CODE BEGIN 2 */ + /* USER CODE END 2 */ + APT_PWMInitHALSample(); + /* USER CODE BEGIN 3 */ +/* USER CODE END 3 */ + while (1) { + /* USER CODE BEGIN 4 */ + /* 建议用户放置周期性执行代码 */ + /* USER CODE END 4 */ + } + /* USER CODE BEGIN 5 */ + /* 建议用户放置代码流程 */ + /* USER CODE END 5 */ + return BASE_STATUS_OK; +} + +/* USER CODE BEGIN 6 */ +/* 建议用户放置自定义函数 */ +/* USER CODE END 6 */ \ No newline at end of file diff --git a/drivers_sample/apt/sample_apt_single_resistor/init/main.h b/drivers_sample/apt/sample_apt_single_resistor/init/main.h new file mode 100644 index 000000000..2c9109f5c --- /dev/null +++ b/drivers_sample/apt/sample_apt_single_resistor/init/main.h @@ -0,0 +1,61 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "apt.h" +#include "uart.h" +#include "uart_ex.h" +#include "crg.h" +#include "iocmg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define XTAL_DRV_LEVEL4 0x03U +#define XTAL_DRV_LEVEL3 0x02U +#define XTAL_DRV_LEVEL2 0x01U +#define XTAL_DRV_LEVEL1 0x00U + +extern UART_Handle g_uart0Handle; +extern APT_Handle g_hAptU; +extern APT_Handle g_hAptV; +extern APT_Handle g_hAptW; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +void AptUTimerCallback(void *aptHandle); +void AptUEventCallback(void *aptHandle); + +/* USER CODE BEGIN 0 */ +/* USER CODE 区域内代码不会被覆盖,区域外会被生成的默认代码覆盖(其余USER CODE 区域同理) */ +/* USER CODE END 0 */ + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/apt/sample_apt_single_resistor/init/system_init.c b/drivers_sample/apt/sample_apt_single_resistor/init/system_init.c new file mode 100644 index 000000000..82dff9d90 --- /dev/null +++ b/drivers_sample/apt/sample_apt_single_resistor/init/system_init.c @@ -0,0 +1,310 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" +#include "iocmg_ip.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 48; /* PLL Multiplier 48 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.clk1MDiv = (25 - 1); /* The 1 MHz freq is equal to the input clock frequency / (clk_1m_div + 1). 25 is the div of the clk_1m in CLOCK. */ + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +__weak void AptUEventCallback(void *aptHandle) +{ + BASE_FUNC_UNUSED(aptHandle); + /* USER CODE BEGIN APT0_EVENT_INTERRUPT */ + /* USER CODE END APT0_EVENT_INTERRUPT */ +} + +__weak void AptUTimerCallback(void *aptHandle) +{ + BASE_FUNC_UNUSED(aptHandle); + /* USER CODE BEGIN APT0_TIMER_INTERRUPT */ + /* USER CODE END APT0_TIMER_INTERRUPT */ +} + +static void APT0_ProtectInit(void) +{ + APT_OutCtrlProtectEx protectApt = {0}; + protectApt.ocEventEnEx = BASE_CFG_ENABLE; + protectApt.ocEventModeEx = APT_OUT_CTRL_ONE_SHOT; + protectApt.ocActionEx = APT_OUT_CTRL_ACTION_LOW; + protectApt.ocActionBEx = APT_OUT_CTRL_ACTION_LOW; + protectApt.ocEvtInterruptEnEx = BASE_CFG_ENABLE; + protectApt.ocSysEvent = APT_SYS_EVT_DEBUG | APT_SYS_EVT_CLK | APT_SYS_EVT_MEM; + protectApt.originalEvtEx = APT_EM_ORIGINAL_SRC_POE0; + protectApt.filterCycleNumEx = 0; + HAL_APT_ProtectInitEx(&g_hAptU, &protectApt); +} + +static void APT0_Init(void) +{ + HAL_CRG_IpEnableSet(APT0_BASE, IP_CLK_ENABLE); + + g_hAptU.baseAddress = APT0; + + /* Clock Settings */ + g_hAptU.waveform.dividerFactor = 1 - 1; + /* Timer Settings */ + g_hAptU.waveform.timerPeriod = 20000; /* 20000 is count period of APT time-base timer */ + g_hAptU.waveform.cntMode = APT_COUNT_MODE_UP_DOWN; + + /* Wave Form */ + g_hAptU.waveform.basicType = APT_PWM_BASIC_A_LOW_B_HIGH; + g_hAptU.waveform.chAOutType = APT_PWM_OUT_BASIC_TYPE; + g_hAptU.waveform.chBOutType = APT_PWM_OUT_BASIC_TYPE; + g_hAptU.waveform.divInitVal = 0; + g_hAptU.waveform.cntInitVal = 0; + g_hAptU.waveform.cntCmpLeftEdge = 1; /* 1 is count compare point of the left edge of PWM waveform */ + g_hAptU.waveform.cntCmpRightEdge = 19999; /* 19999 is count compare point of the right edge of PWM waveform */ + g_hAptU.waveform.cntCmpLoadMode = APT_BUFFER_INDEPENDENT_LOAD; + g_hAptU.waveform.cntCmpLoadEvt = APT_COMPARE_LOAD_EVENT_ZERO; + g_hAptU.waveform.deadBandCnt = 10; /* 10 is dead-band value */ + + /* ADC Trigger SOCA */ + g_hAptU.adcTrg.trgEnSOCA = BASE_CFG_ENABLE; + g_hAptU.adcTrg.cntCmpSOCA = 1; /* 1 is count compare point of ADC trigger source SOCA when using CMPA */ + g_hAptU.adcTrg.trgSrcSOCA = APT_CS_SRC_CNTR_CMPA_UP; + g_hAptU.adcTrg.trgScaleSOCA = 1; + + /* ADC Trigger SOCB */ + g_hAptU.adcTrg.trgEnSOCB = BASE_CFG_ENABLE; + g_hAptU.adcTrg.cntCmpSOCB = 1; + g_hAptU.adcTrg.trgSrcSOCB = APT_CS_SRC_CNTR_CMPB_UP; + g_hAptU.adcTrg.trgScaleSOCB = 1; + + g_hAptU.adcTrg.cntCmpLoadMode = APT_BUFFER_INDEPENDENT_LOAD; + g_hAptU.adcTrg.cntCmpLoadEvt = APT_COMPARE_LOAD_EVENT_ZERO; + + /* Timer Trigger */ + g_hAptU.tmrInterrupt.tmrInterruptEn = BASE_CFG_ENABLE; + g_hAptU.tmrInterrupt.tmrInterruptSrc = APT_INT_SRC_CNTR_ZERO_PERIOD; + g_hAptU.tmrInterrupt.tmrInterruptScale = 1; + + APT0_ProtectInit(); + + HAL_APT_PWMInit(&g_hAptU); + HAL_APT_RegisterCallBack(&g_hAptU, APT_EVENT_INTERRUPT, AptUEventCallback); + IRQ_SetPriority(IRQ_APT0_EVT, 1); /* 1 is priority value */ + IRQ_Register(IRQ_APT0_EVT, HAL_APT_EventIrqHandler, &g_hAptU); + IRQ_EnableN(IRQ_APT0_EVT); + HAL_APT_RegisterCallBack(&g_hAptU, APT_TIMER_INTERRUPT, AptUTimerCallback); + IRQ_SetPriority(IRQ_APT0_TMR, 1); /* 1 is priority value */ + IRQ_Register(IRQ_APT0_TMR, HAL_APT_TimerIrqHandler, &g_hAptU); + IRQ_EnableN(IRQ_APT0_TMR); +} + +static void APT1_ProtectInit(void) +{ + APT_OutCtrlProtectEx protectApt = {0}; + protectApt.ocEventEnEx = BASE_CFG_ENABLE; + protectApt.ocEventModeEx = APT_OUT_CTRL_ONE_SHOT; + protectApt.ocActionEx = APT_OUT_CTRL_ACTION_LOW; + protectApt.ocActionBEx = APT_OUT_CTRL_ACTION_LOW; + protectApt.ocEvtInterruptEnEx = BASE_CFG_DISABLE; + protectApt.ocSysEvent = APT_SYS_EVT_DEBUG | APT_SYS_EVT_CLK | APT_SYS_EVT_MEM; + protectApt.originalEvtEx = APT_EM_ORIGINAL_SRC_POE0; + protectApt.filterCycleNumEx = 0; + HAL_APT_ProtectInitEx(&g_hAptV, &protectApt); +} + +static void APT1_Init(void) +{ + HAL_CRG_IpEnableSet(APT1_BASE, IP_CLK_ENABLE); + + g_hAptV.baseAddress = APT1; + + /* Clock Settings */ + g_hAptV.waveform.dividerFactor = 1 - 1; + /* Timer Settings */ + g_hAptV.waveform.timerPeriod = 20000; /* 20000 is count period of APT time-base timer */ + g_hAptV.waveform.cntMode = APT_COUNT_MODE_UP_DOWN; + + /* Wave Form */ + g_hAptV.waveform.basicType = APT_PWM_BASIC_A_LOW_B_HIGH; + g_hAptV.waveform.chAOutType = APT_PWM_OUT_BASIC_TYPE; + g_hAptV.waveform.chBOutType = APT_PWM_OUT_BASIC_TYPE; + g_hAptV.waveform.divInitVal = 0; + g_hAptV.waveform.cntInitVal = 0; + g_hAptV.waveform.cntCmpLeftEdge = 1; /* 1 is count compare point of the left edge of PWM waveform */ + g_hAptV.waveform.cntCmpRightEdge = 19999; /* 19999 is count compare point of the right edge of PWM waveform */ + g_hAptV.waveform.cntCmpLoadMode = APT_BUFFER_INDEPENDENT_LOAD; + g_hAptV.waveform.cntCmpLoadEvt = APT_COMPARE_LOAD_EVENT_ZERO; + g_hAptV.waveform.deadBandCnt = 10; /* 10 is dead-band value */ + + APT1_ProtectInit(); + + HAL_APT_PWMInit(&g_hAptV); +} + +static void APT2_ProtectInit(void) +{ + APT_OutCtrlProtectEx protectApt = {0}; + protectApt.ocEventEnEx = BASE_CFG_ENABLE; + protectApt.ocEventModeEx = APT_OUT_CTRL_ONE_SHOT; + protectApt.ocActionEx = APT_OUT_CTRL_ACTION_LOW; + protectApt.ocActionBEx = APT_OUT_CTRL_ACTION_LOW; + protectApt.ocEvtInterruptEnEx = BASE_CFG_DISABLE; + protectApt.ocSysEvent = APT_SYS_EVT_DEBUG | APT_SYS_EVT_CLK | APT_SYS_EVT_MEM; + protectApt.originalEvtEx = APT_EM_ORIGINAL_SRC_POE0; + protectApt.filterCycleNumEx = 0; + HAL_APT_ProtectInitEx(&g_hAptW, &protectApt); +} + +static void APT2_Init(void) +{ + HAL_CRG_IpEnableSet(APT2_BASE, IP_CLK_ENABLE); + + g_hAptW.baseAddress = APT2; + + /* Clock Settings */ + g_hAptW.waveform.dividerFactor = 1 - 1; + /* Timer Settings */ + g_hAptW.waveform.timerPeriod = 20000; /* 20000 is count period of APT time-base timer */ + g_hAptW.waveform.cntMode = APT_COUNT_MODE_UP_DOWN; + + /* Wave Form */ + g_hAptW.waveform.basicType = APT_PWM_BASIC_A_LOW_B_HIGH; + g_hAptW.waveform.chAOutType = APT_PWM_OUT_BASIC_TYPE; + g_hAptW.waveform.chBOutType = APT_PWM_OUT_BASIC_TYPE; + g_hAptW.waveform.divInitVal = 0; + g_hAptW.waveform.cntInitVal = 0; + g_hAptW.waveform.cntCmpLeftEdge = 1; /* 1 is count compare point of the left edge of PWM waveform */ + g_hAptW.waveform.cntCmpRightEdge = 19999; /* 19999 is count compare point of the right edge of PWM waveform */ + g_hAptW.waveform.cntCmpLoadMode = APT_BUFFER_INDEPENDENT_LOAD; + g_hAptW.waveform.cntCmpLoadEvt = APT_COMPARE_LOAD_EVENT_ZERO; + g_hAptW.waveform.deadBandCnt = 10; /* 10 is dead-band value */ + + APT2_ProtectInit(); + + HAL_APT_PWMInit(&g_hAptW); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); /* UART0 clock enable. */ + g_uart0Handle.baseAddress = UART0; + + g_uart0Handle.baudRate = UART0_BAND_RATE; + g_uart0Handle.dataLength = UART_DATALENGTH_8BIT; + g_uart0Handle.stopBits = UART_STOPBITS_ONE; + g_uart0Handle.parity = UART_PARITY_NONE; + g_uart0Handle.txMode = UART_MODE_BLOCKING; + g_uart0Handle.rxMode = UART_MODE_BLOCKING; + g_uart0Handle.fifoMode = BASE_CFG_ENABLE; + g_uart0Handle.fifoTxThr = UART_FIFODEPTH_SIZE8; + g_uart0Handle.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart0Handle.hwFlowCtr = BASE_CFG_DISABLE; + g_uart0Handle.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart0Handle.handleEx.msbFirst = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0Handle); +} + +static void IOConfig(void) +{ + SYSCTRL0->SC_SYS_STAT.BIT.update_mode = 0; + SYSCTRL0->SC_SYS_STAT.BIT.update_mode_clear = 1; + /* Config PIN39 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_3_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_3_AS_UART0_TXD, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_3_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_3_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_3_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN40 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_4_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_4_AS_UART0_RXD, PULL_UP); /* Pull-up and Pull-down, UART RX recommend PULL_UP */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_4_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_4_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_4_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN19 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO3_0_AS_APT0_PWMA); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO3_0_AS_APT0_PWMA, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO3_0_AS_APT0_PWMA, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO3_0_AS_APT0_PWMA, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO3_0_AS_APT0_PWMA, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN23 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO4_0_AS_APT0_PWMB); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO4_0_AS_APT0_PWMB, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO4_0_AS_APT0_PWMB, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO4_0_AS_APT0_PWMB, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO4_0_AS_APT0_PWMB, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN21 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO3_2_AS_APT2_PWMA); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO3_2_AS_APT2_PWMA, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO3_2_AS_APT2_PWMA, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO3_2_AS_APT2_PWMA, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO3_2_AS_APT2_PWMA, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN25 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO4_2_AS_APT2_PWMB); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO4_2_AS_APT2_PWMB, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO4_2_AS_APT2_PWMB, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO4_2_AS_APT2_PWMB, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO4_2_AS_APT2_PWMB, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN20 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO3_1_AS_APT1_PWMA); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO3_1_AS_APT1_PWMA, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO3_1_AS_APT1_PWMA, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO3_1_AS_APT1_PWMA, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO3_1_AS_APT1_PWMA, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN24 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO4_1_AS_APT1_PWMB); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO4_1_AS_APT1_PWMB, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO4_1_AS_APT1_PWMB, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO4_1_AS_APT1_PWMB, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO4_1_AS_APT1_PWMB, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN1 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_7_AS_POE0); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_7_AS_POE0, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_7_AS_POE0, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_7_AS_POE0, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_7_AS_POE0, DRIVER_RATE_2); /* Output signal edge fast/slow */ +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + APT0_Init(); + APT1_Init(); + APT2_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/apt/sample_apt_single_resistor/readme.md b/drivers_sample/apt/sample_apt_single_resistor/readme.md new file mode 100644 index 000000000..3d4224711 --- /dev/null +++ b/drivers_sample/apt/sample_apt_single_resistor/readme.md @@ -0,0 +1,29 @@ +# 高级脉宽调制PWM-单电阻采样电机控制 +## 关键字: 互补PWM波, 电机控制, 单电阻采样 + +**【功能描述】** ++ 该示例为单电阻采样的电机控制样例,输出U,V和W相的带死区的互补PWM波。 + ++ 在U相配置有触发ADC采样的SOC信号。 + +**【示例配置】** ++ 通过配置APT0,APT1和APT2来配置U,V,W相的互补PWM波。APT0、APT1、APT2的配置分别对应U、V、W相的互补PWM波。 + ++ PWM输出保护,三相PWM输出都配置了保护时间,分别为指定管脚拉高保护,调试模式保护,时钟错误保护,内存泄漏保护。 + ++ 以上配置可通过APT配置界面进行更改,或在“system_init.c”中更改APT对应的配置。 + +**【示例效果】** ++ 若保护事件来临,APT模块会停止PWM波的输出,保护电机等硬件设备。 + +**【注意事项】** ++ 占空比可通过“HAL_APT_SetPWMDutyByNumber”进行更改。 + ++ 分频器的分频系数的范围为 0到4095,计数器的计数周期值的范围为 0到65535。死区延时计数值范围 0到65535。 + ++ PWM 波的频率: +```c +①递增/递减计时模式,PWM 波的频率 = 工作时钟频率 / ((分频器的分频系数+1)*(计数器的计数周期值+1)); +②先增后减计时模式,PWM 波的频率 = 工作时钟频率 / ((分频器的分频系数+1)*(计数器的计数周期值*2))。 +``` ++ 死区的宽度:插入死区的宽度 = 工作时钟周期 * 死区延时计数值。 \ No newline at end of file diff --git a/drivers_sample/apt/sample_apt_single_resistor/src/sample_apt_single_resistor.c b/drivers_sample/apt/sample_apt_single_resistor/src/sample_apt_single_resistor.c new file mode 100644 index 000000000..5b8d57a25 --- /dev/null +++ b/drivers_sample/apt/sample_apt_single_resistor/src/sample_apt_single_resistor.c @@ -0,0 +1,244 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_apt_single_resistor.c + * @author MCU Driver Team + * @brief APT module sample of HAL API. + * This file provides some configuration example of APT module HAL API. + * + PWM waveform configuration and ADC trigger time configuration sample. + * + Output control protection configuration sample. + * + Interrupt callback function and user registration function sample. + * + APT module synchronization sample. + */ + +#include "sample_apt_single_resistor.h" +#include "apt.h" +#include "debug.h" +#include "crg.h" +#include "gpio.h" +#include "main.h" +#include "debug.h" + +/** + * APTx module base definition of three phases. + */ +#define APT_U APT0 /* Base address of U phase APT module */ +#define APT_V APT1 /* Base address of V phase APT module */ +#define APT_W APT2 /* Base address of W phase APT module */ + +/** + * APT module run control definition. + */ +#define APT_RUN_U RUN_APT0 +#define APT_RUN_V RUN_APT1 +#define APT_RUN_W RUN_APT2 + +/** + * APT interrupt number definition of three phases. + * IGBT - APT2, APT3, APT4 (U, V, W phase) + * IPM - APT5, APT6, ATP7 (U, V, W phase) + */ +#define APT_U_EVT_IRQ IRQ_APT0_EVT +#define APT_U_TMR_IRQ IRQ_APT0_TMR +#define APT_V_EVT_IRQ IRQ_APT1_EVT +#define APT_V_TMR_IRQ IRQ_APT1_TMR +#define APT_W_EVT_IRQ IRQ_APT2_EVT +#define APT_W_TMR_IRQ IRQ_APT2_TMR + +/* APT module interrupt priority. */ +#define EVT_INTERRUPT_PRIORITY 7 +#define TMR_INTERRUPT_PRIORITY 6 + +/* Use sync-out pulse from APT_U as the sync-in source for slave APT module. */ +#define APT_SYNC_IN_SRC APT_SYNCIN_SRC_APT0_SYNCOUT + +/* Some configuration values of APT modules. */ +/* You can also use HAL_CRG_GetIpFreq(APT_U) to get the CPU clock frequency (In units of Hz). */ +#define APT_CLK_FREQ HAL_CRG_GetIpFreq((void *)APT_U) +#define APT_PWM_FREQ 5000U /* Set PWM frequency to 5000Hz. */ +#define APT_TIMER_PERIOD (APT_CLK_FREQ / (APT_PWM_FREQ * 2)) /* Period value when using APT_COUNT_MODE_UP_DOWN. */ +#define APT_DIVIDER_FACTOR 1U /* The APT clock is not divided. */ +#define DB_CNT_PER_US (APT_CLK_FREQ / 1000000) /* Dead-Band delay counter period when Dead-Band time is 1us */ +#define DB_US 3U /* Dead-Band time, in units of us */ + + +/** + * @brief Timer interrupt callback function of U phase APT module. + * @param aptHandle APT module handle. + * @retval None. + */ +void AptUTimerCallback(void *aptHandle) +{ + APT_Handle *handle = (APT_Handle *)aptHandle; + /* read counter direction */ + if (DCL_APT_GetCounterDirection(handle->baseAddress) == APT_COUNTER_STATUS_COUNT_DOWN) { + DBG_PRINTF("Count Down\r\n"); + } else if (DCL_APT_GetCounterDirection(handle->baseAddress) == APT_COUNTER_STATUS_COUNT_UP) { + DBG_PRINTF("Count Up\r\n"); + } +} + +/** + * @brief Event interrupt callback function of U phase APT module. + * @param aptHandle APT module handle. + * @retval None. + */ +void AptUEventCallback(void *aptHandle) +{ + BASE_FUNC_UNUSED(aptHandle); +} + +/** + * @brief Interrupt initialization of U phase APT. + * @retval None. + */ +static void InterruptInitAptU(void) +{ + /* Timer interrupt and event interrupt of U phase APT module. */ + IRQ_SetPriority(APT_U_EVT_IRQ, EVT_INTERRUPT_PRIORITY); + IRQ_SetPriority(APT_U_TMR_IRQ, TMR_INTERRUPT_PRIORITY); + IRQ_Register(IRQ_APT0_EVT, HAL_APT_EventIrqHandler, &g_hAptU); + IRQ_Register(IRQ_APT0_TMR, HAL_APT_TimerIrqHandler, &g_hAptU); + IRQ_EnableN(APT_U_EVT_IRQ); + IRQ_EnableN(APT_U_TMR_IRQ); + HAL_APT_RegisterCallBack(&g_hAptU, APT_EVENT_INTERRUPT, AptUEventCallback); + HAL_APT_RegisterCallBack(&g_hAptU, APT_TIMER_INTERRUPT, AptUTimerCallback); +} + +/** + * @brief APT Synchronize initialize. + * @retval None. + */ +static void APT_SyncMasterInit(APT_Handle *aptHandle) +{ + HAL_APT_MasterSyncInit(aptHandle, APT_SYNC_OUT_ON_CNTR_ZERO); +} + + +static void APT_SyncSlaveInit(APT_Handle *aptHandle) +{ + APT_SlaveSyncIn aptSlave; + aptSlave.divPhase = 0; /* divide phase value */ + aptSlave.cntPhase = 0; /* counter phase value */ + aptSlave.syncCntMode = APT_COUNT_MODE_AFTER_SYNC_UP; + aptSlave.syncInSrc = APT_SYNC_IN_SRC; /* sync source selection */ + aptSlave.cntrSyncSrc = APT_CNTR_SYNC_SRC_SYNCIN; + HAL_APT_SlaveSyncInit(aptHandle, &aptSlave); +} + +/** + * @brief Initialize and start the APT modules of U, V, W phases. + * @param mode: ADC sampling mode. + * @retval None. + */ +void APT_PWMInitHALSample(void) +{ + /* Initialize GPIO pin for timer interrupt test. */ + SystemInit(); + IRQ_Enable(); + InterruptInitAptU(); + /* Initial APT module synchronization. */ + APT_SyncMasterInit(&g_hAptU); + APT_SyncSlaveInit(&g_hAptV); + APT_SyncSlaveInit(&g_hAptW); + + /* Start APT module of U, V, W phases. */ + HAL_APT_StartModule(APT_RUN_U | APT_RUN_V | APT_RUN_W); +} + +/** + * @brief Modify the duty ratio of PWM waveform for U phase APT. + * @param duty Duty of PWM waveform. + * @retval None. + */ +void APT_SetPWMDutyU(unsigned int duty) +{ + HAL_APT_SetPWMDutyByNumber(&g_hAptU, duty); +} + +/** + * @brief Modify the duty ratio of PWM waveform for V phase APT. + * @param duty Duty of PWM waveform. + * @retval None. + */ +void APT_SetPWMDutyV(unsigned int duty) +{ + HAL_APT_SetPWMDutyByNumber(&g_hAptV, duty); +} + +/** + * @brief Modify the duty ratio of PWM waveform for W phase APT. + * @param duty Duty of PWM waveform. + * @retval None. + */ +void APT_SetPWMDutyW(unsigned int duty) +{ + HAL_APT_SetPWMDutyByNumber(&g_hAptW, duty); +} + +/** + * @brief Modify the ADC trigger time of master APT module (U phase). + * @param cntCmpSOCA Count compare value of SOCA. + * @param cntCmpSOCB Counnt compare value of SOCB. + * @retval None. + */ +void APT_SetADCTrgTime(unsigned short cntCmpSOCA, unsigned short cntCmpSOCB, ADC_SampleMode mode) +{ + /* AptU use CMPA and CMPB as the trigger source of SOCA and SOCB. */ + /* SOCA is used to trigger 1st ADC sampling when using single resistor sampling. */ + /* SOCB is used to trigger 2nd ADC sampling when using single resistor sampling. */ + if (mode == ADC_SINGLE_RESISTOR) { + HAL_APT_SetADCTriggerTime(&g_hAptU, cntCmpSOCA, cntCmpSOCB); + } else { + HAL_APT_SetADCTriggerTime(&g_hAptU, cntCmpSOCA, cntCmpSOCB); + HAL_APT_SetADCTriggerTime(&g_hAptV, cntCmpSOCA, cntCmpSOCB); + HAL_APT_SetADCTriggerTime(&g_hAptW, cntCmpSOCA, cntCmpSOCB); + } +} + +/** + * @brief PWM waveform output control. + * @param enable pwm waveform output enable. + * @retval None. + */ +void APT_PhaseOut(bool enable) +{ + if (enable == true) { + /* Enable PWM U waveform output. */ + DCL_APT_DisableSwContPWMAction(APT_U, APT_PWM_CHANNEL_A); + DCL_APT_DisableSwContPWMAction(APT_U, APT_PWM_CHANNEL_B); + /* Enable PWM V waveform output. */ + DCL_APT_DisableSwContPWMAction(APT_V, APT_PWM_CHANNEL_A); + DCL_APT_DisableSwContPWMAction(APT_V, APT_PWM_CHANNEL_B); + /* Enable PWM W waveform output. */ + DCL_APT_DisableSwContPWMAction(APT_W, APT_PWM_CHANNEL_A); + DCL_APT_DisableSwContPWMAction(APT_W, APT_PWM_CHANNEL_B); + } else { + /* Disable PWM U waveform output. */ + DCL_APT_EnableSwContPWMAction(APT_U, APT_PWM_CHANNEL_A); + DCL_APT_EnableSwContPWMAction(APT_U, APT_PWM_CHANNEL_B); + DCL_APT_ForcePWMOutputLow(APT_U); + /* Disable PWM V waveform output. */ + DCL_APT_EnableSwContPWMAction(APT_V, APT_PWM_CHANNEL_A); + DCL_APT_EnableSwContPWMAction(APT_V, APT_PWM_CHANNEL_B); + DCL_APT_ForcePWMOutputLow(APT_V); + /* Disable PWM W waveform output. */ + DCL_APT_EnableSwContPWMAction(APT_W, APT_PWM_CHANNEL_A); + DCL_APT_EnableSwContPWMAction(APT_W, APT_PWM_CHANNEL_B); + DCL_APT_ForcePWMOutputLow(APT_W); + } +} diff --git a/drivers_sample/can/sample_can_send_receive/inc/sample_can_send_receive.h b/drivers_sample/can/sample_can_send_receive/inc/sample_can_send_receive.h new file mode 100644 index 000000000..378ee15a0 --- /dev/null +++ b/drivers_sample/can/sample_can_send_receive/inc/sample_can_send_receive.h @@ -0,0 +1,31 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_can_send_receive.h + * @author MCU Driver Team + * @brief can sample module. + * @details This file provides sample code for users to help use + * the filtering function of the CAN. + */ + +#ifndef SAMPLE_CAN_SEND_RECEIVE_H +#define SAMPLE_CAN_SEND_RECEIVE_H + +#include "main.h" + +int CAN_ReceiveFilter(void); +#endif \ No newline at end of file diff --git a/drivers_sample/can/sample_can_send_receive/init/main.c b/drivers_sample/can/sample_can_send_receive/init/main.c new file mode 100644 index 000000000..08142ef2d --- /dev/null +++ b/drivers_sample/can/sample_can_send_receive/init/main.c @@ -0,0 +1,49 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ + +#include "typedefs.h" +#include "feature.h" +#include "sample_can_send_receive.h" +#include "main.h" +/* USER CODE BEGIN 0 */ +/* USER CODE END 0 */ +CAN_Handle g_can; +UART_Handle g_uart0; +/* USER CODE BEGIN 1 */ +/* USER CODE END 1 */ +int main(void) +{ + /* USER CODE BEGIN 2 */ + /* USER CODE END 2 */ + CAN_ReceiveFilter(); + /* USER CODE BEGIN 3 */ + /* USER CODE END 3 */ + while (1) { + /* USER CODE BEGIN 4 */ + /* USER CODE END 4 */ + } + /* USER CODE BEGIN 5 */ + /* USER CODE END 5 */ + return BASE_STATUS_OK; +} +/* USER CODE BEGIN 6 */ +/* USER CODE END 6 */ \ No newline at end of file diff --git a/drivers_sample/can/sample_can_send_receive/init/main.h b/drivers_sample/can/sample_can_send_receive/init/main.h new file mode 100644 index 000000000..ae1c13877 --- /dev/null +++ b/drivers_sample/can/sample_can_send_receive/init/main.h @@ -0,0 +1,55 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "uart_ex.h" +#include "can.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define XTAL_DRV_LEVEL4 0x03U +#define XTAL_DRV_LEVEL3 0x02U +#define XTAL_DRV_LEVEL2 0x01U +#define XTAL_DRV_LEVEL1 0x00U + +extern CAN_Handle g_can; +extern UART_Handle g_uart0; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + + +void CAN_ReadFinish(void *handle); +void CAN_WriteFinish(void *handle); +void CAN_Transmit_Error(void *handle); +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/can/sample_can_send_receive/init/system_init.c b/drivers_sample/can/sample_can_send_receive/init/system_init.c new file mode 100644 index 000000000..d4409cb62 --- /dev/null +++ b/drivers_sample/can/sample_can_send_receive/init/system_init.c @@ -0,0 +1,140 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" +#include "iocmg.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 48; /* PLL Multiplier 48 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +__weak void CAN_ReadFinish(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN CAN_READ_FINISH */ + /* USER CODE END CAN_READ_FINISH */ +} + +__weak void CAN_WriteFinish(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN CAN_WRITE_FINISH */ + /* USER CODE END CAN_WRITE_FINISH */ +} + +__weak void CAN_Transmit_Error(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN CAN_TRANSMIT_ERROR */ + /* USER CODE END CAN_TRANSMIT_ERROR */ +} + +static void CAN_Init(void) +{ + HAL_CRG_IpEnableSet(CAN_BASE, IP_CLK_ENABLE); + + g_can.baseAddress = CAN; + + g_can.typeMode = CAN_MODE_NORMAL; + g_can.seg1Phase = CAN_SEG1_6TQ; + g_can.seg2Phase = CAN_SEG2_3TQ; + g_can.sjw = CAN_SJW_2TQ; + g_can.prescalser = 25; /* 25 is frequency division coefficient */ + g_can.rxFIFODepth = 3; /* A maximum of 3 packet objects are in RX FIFO */ + g_can.autoRetrans = BASE_CFG_ENABLE; + HAL_CAN_Init(&g_can); + HAL_CAN_RegisterCallBack(&g_can, CAN_READ_FINISH, CAN_ReadFinish); + HAL_CAN_RegisterCallBack(&g_can, CAN_WRITE_FINISH, CAN_WriteFinish); + HAL_CAN_RegisterCallBack(&g_can, CAN_TRNS_ERROR, CAN_Transmit_Error); + IRQ_Register(IRQ_CAN, HAL_CAN_IrqHandler, &g_can); + IRQ_SetPriority(IRQ_CAN, 1); + IRQ_EnableN(IRQ_CAN); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + + g_uart0.baseAddress = UART0; + + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; + g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + HAL_IOCMG_SetPinAltFuncMode(GPIO3_5_AS_CAN_TX); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO3_5_AS_CAN_TX, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO3_5_AS_CAN_TX, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO3_5_AS_CAN_TX, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO3_5_AS_CAN_TX, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + CAN_Init(); + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/can/sample_can_send_receive/readme.md b/drivers_sample/can/sample_can_send_receive/readme.md new file mode 100644 index 000000000..0d8394784 --- /dev/null +++ b/drivers_sample/can/sample_can_send_receive/readme.md @@ -0,0 +1,26 @@ +# 控制局域网-发送扩展数据帧和接收符合过滤规则的扩展帧数据 +## 关键字: CAN, 总线 + +**【功能描述】** ++ CAN向总线发送扩展帧数据,并从总线上接收符合过滤规则的扩展帧数据。 + ++ CAN模块数据的发送和接收采用的都是中断形式。 + +**【示例配置】** ++ 初始化CAN:通过g_can.typeMode配置CAN的工作模式,配置CAN的传输波特率,接收FIFO的深度以及否开启自动重传。这些配置可以通过CAN的配置界面进行更改。默认配置参数可以通过CAN的配置界面或“system_init.c”文件中的进行查看。 + ++ 发送数据帧g_sendFrame:分配发送数据帧的类型为扩展帧,指定发送帧的ID,填入需要发送的数据和长度,调用“HAL_CAN_Write”函数进行数据的发送。发送成功之后会调用回调函数“Can_WriteFinish”,此回调函数可以通过“HAL_CAN_RegisterCallBack”进行注册。 + ++ 接收数据帧g_receiveFrame: 存储接收到的数据,会存入接收到的帧类型,帧ID,帧数据域。 + ++ 过滤条件rxFilter:配置过滤的帧类型和过滤ID和过滤掩码。并通过“HAL_CAN_ReadIT”使过滤规则生效,接收成功之后,会调用接收成功回调函数“Can_ReadFinish”,此回调函数也可以通过“HAL_CAN_RegisterCallBack”进行注册。 + +**【示例效果】** ++ 编译烧录此示例,此示例会向总线发送ID为0x1314的扩展数据帧,数据内容为字符‘0’。接收总线上ID为0x1X14的扩展帧(X代表任意0-F的数字)。 + ++ 串口0打印提示信息:CAN发送给总线的数据和接收到总线的数据。 + +**【注意事项】** ++ 发送给总线的数据帧为扩展帧类型,且满足过滤条件,才会被接收,其他数据默认会被总线丢弃。 + ++ 此示例默认开启自动重发,数据发送失败,会重新发送。若不想重发,需在配置中关闭“Auto Retransmission”项,或在“system_init.c”中关闭“g_can.autoRetrans”配置项。 \ No newline at end of file diff --git a/drivers_sample/can/sample_can_send_receive/src/sample_can_send_receive.c b/drivers_sample/can/sample_can_send_receive/src/sample_can_send_receive.c new file mode 100644 index 000000000..2ecbb6b9a --- /dev/null +++ b/drivers_sample/can/sample_can_send_receive/src/sample_can_send_receive.c @@ -0,0 +1,123 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_can_send_receive.c + * @author MCU Driver Team + * @brief can sample module. + * @details This file provides sample code for users to help use + * the filtering function of the CAN. + */ +#include "sample_can_send_receive.h" +#include "main.h" +#include "debug.h" + +/** + * @brief User-defined read completion callback function. + * @param UART_Handle UART handle. + * @retval None. + */ +void CAN_ReadFinish(void *handle) +{ + CAN_Handle *canHandle = (CAN_Handle *)handle; + DBG_PRINTF("CAN Read Finish\r\n"); + DBG_PRINTF("data[0]: %d \r\n", canHandle->rxFrame->frame[0]); /* frame[0] data */ + DBG_PRINTF("data[1]: %d \r\n", canHandle->rxFrame->frame[1]); /* frame[1] data */ + DBG_PRINTF("data[2]: %d \r\n", canHandle->rxFrame->frame[2]); /* frame[2] data */ + DBG_PRINTF("data[3]: %d \r\n", canHandle->rxFrame->frame[3]); /* frame[3] data */ + DBG_PRINTF("data[4]: %d \r\n", canHandle->rxFrame->frame[4]); /* frame[4] data */ + DBG_PRINTF("data[5]: %d \r\n", canHandle->rxFrame->frame[5]); /* frame[5] data */ + DBG_PRINTF("data[6]: %d \r\n", canHandle->rxFrame->frame[6]); /* frame[6] data */ + DBG_PRINTF("data[7]: %d \r\n", canHandle->rxFrame->frame[7]); /* frame[7] data */ + DBG_PRINTF("ID: 0x%x \r\n", canHandle->rxFrame->CANId); + DBG_PRINTF("len: %d \r\n", canHandle->rxFrame->dataLength); + DBG_PRINTF("type: %d \r\n", canHandle->rxFrame->type); + BASE_FUNC_UNUSED(canHandle); + return; +} + +/** + * @brief User-defined write completion callback function. + * @param CAN_Handle CAN handle. + * @retval None. + */ +void CAN_WriteFinish(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("CAN Write Finish\r\n"); + return; +} +/** + * Sample Note: + * baund rate : 100k Bit/s + * To-be-received data frame : Extended Data Frame, ID = 0x1314 + * + * There are two filtering methods: + * 1. Receive only the specified ID: + * rxFilter.receiveType = CAN_FilterFrame_EXT_DATA; + * rxFilter.filterID = 0x1314; + * rxFilter.filterMask = 0xFFFFFFFF; + * + * 2. Use mask to receive: + * rxFilter.receiveType = CAN_FilterFrame_EXT_DATA; + * rxFilter.filterID = 0x131_; + * rxFilter.filterMask = 0xFFFFFFF0; + * + * rxFilter.receiveType = CAN_FilterFrame_EXT_DATA; + * rxFilter.filterID = 0x13_4; + * rxFilter.filterMask = 0xFFFFFF0F; + * + * rxFilter.receiveType = CAN_FilterFrame_EXT_DATA; + * rxFilter.filterID = 0x1_14; + * rxFilter.filterMask = 0xFFFFF0FF; + * + * rxFilter.receiveType = CAN_FilterFrame_EXT_DATA; + * rxFilter.filterID = 0x_314; + * rxFilter.filterMask = 0xFFFF0FFF; + * + * The value of the ID mask bit, which is not used for filtering. + * + * Do not filter by ID: + * rxFilter.filterMask = 0x00000000; + * + * Both standard frames and extended frames can be received: + * rxFilter.receiveType = CAN_FilterFrame_STD_EXT_DATA; + */ +/** + * @brief CAN sample code for configuring the filtering function and can send and receive packets. + * @param None. + * @retval None. + */ +CANFrame g_sendFrame; +CANFrame g_receiveFrame; +int CAN_ReceiveFilter(void) +{ + SystemInit(); + DBG_PRINTF("CAN Init \r\n"); + CAN_FilterConfigure rxFilter; + g_can.rxFrame = &g_receiveFrame; /* Address for storing received frame data */ + DBG_PRINTF("CAN interrupt register \r\n"); + g_sendFrame.type = CAN_TYPEFRAME_EXT_DATA; /* Transmit extended data frame */ + g_sendFrame.CANId = 0x1314; /* 0x1314 is ID of transmitted data frames */ + g_sendFrame.dataLength = 1; /* 1 is length of the sent frame */ + g_sendFrame.frame[0] = '0'; + HAL_CAN_Write(&g_can, &g_sendFrame); + rxFilter.receiveType = CAN_FILTERFRAME_EXT_DATA; + rxFilter.filterID = 0x1014; /* 0x1014 and 0xFFFFF0FF constitute filtering rules */ + rxFilter.filterMask = 0xFFFFF0FF; /* 0xFFFFF0FF is filter ID mask */ + HAL_CAN_ReadIT(&g_can, &g_receiveFrame, &rxFilter); + return 0; +} \ No newline at end of file diff --git a/drivers_sample/capm/capm_hall_sample/inc/capm_hall_sample.h b/drivers_sample/capm/capm_hall_sample/inc/capm_hall_sample.h new file mode 100644 index 000000000..a106aa41d --- /dev/null +++ b/drivers_sample/capm/capm_hall_sample/inc/capm_hall_sample.h @@ -0,0 +1,41 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file capm_hall_sample.h + * @author MCU Driver Team + * @brief CAPM HAL level module driver head file. + * This file shows a sample to get hall position information + */ +#ifndef McuMagicTag_CAPM_HALL_SAMPLE_H +#define McuMagicTag_CAPM_HALL_SAMPLE_H +#include "baseinc.h" +#include "capm_ip.h" +#include "capm.h" + +#define CAPM_PART_A 1 +#define CAPM_PART_B 5 +#define CAPM_PART_C 4 +#define CAPM_PART_D 6 +#define CAPM_PART_E 2 +#define CAPM_PART_F 3 + +#define CAPM_HIGH 0 +#define CAPM_LOW 1 + +unsigned char CAPM_GetHallValue(void); +void CAPM_HallSample(void); +#endif \ No newline at end of file diff --git a/drivers_sample/capm/capm_hall_sample/init/main.c b/drivers_sample/capm/capm_hall_sample/init/main.c new file mode 100644 index 000000000..5c87670ea --- /dev/null +++ b/drivers_sample/capm/capm_hall_sample/init/main.c @@ -0,0 +1,57 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ + +#include "typedefs.h" +#include "feature.h" +#include "capm_hall_sample.h" +#include "main.h" +/* USER CODE BEGIN 0 */ + //APT_PWMInitHALSample(); + /* USER CODE END 0 */ +CAPM_Handle g_capmAConfig; +CAPM_Handle g_capmBConfig; +CAPM_Handle g_capmCConfig; +UART_Handle g_uart0; +/* USER CODE BEGIN 1 */ + /* USER CODE END 1 */ + +int main(void) +{ + /* USER CODE BEGIN 2 */ + /* USER CODE END 2 */ + CAPM_HallSample(); + /* USER CODE BEGIN 3 */ +/* USER CODE END 3 */ + while (1) { + /* USER CODE BEGIN 4 */ + /* 建议用户放置周期性执行代码 */ + /* USER CODE END 4 */ + } + /* USER CODE BEGIN 5 */ + /* 建议用户放置代码流程 */ + /* USER CODE END 5 */ + return BASE_STATUS_OK; +} + +/* USER CODE BEGIN 6 */ +/* 建议用户放置自定义函数 */ +/* USER CODE END 6 */ \ No newline at end of file diff --git a/drivers_sample/capm/capm_hall_sample/init/main.h b/drivers_sample/capm/capm_hall_sample/init/main.h new file mode 100644 index 000000000..ff3e7293e --- /dev/null +++ b/drivers_sample/capm/capm_hall_sample/init/main.h @@ -0,0 +1,58 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "uart_ex.h" +#include "capm.h" +#include "crg.h" +#include "iocmg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define XTAL_DRV_LEVEL4 0x03U +#define XTAL_DRV_LEVEL3 0x02U +#define XTAL_DRV_LEVEL2 0x01U +#define XTAL_DRV_LEVEL1 0x00U + +extern CAPM_Handle g_capmAConfig; +extern CAPM_Handle g_capmBConfig; +extern CAPM_Handle g_capmCConfig; +extern UART_Handle g_uart0; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +/* USER CODE BEGIN 0 */ +/* USER CODE 区域内代码不会被覆盖,区域外会被生成的默认代码覆盖(其余USER CODE 区域同理) */ +/* USER CODE END 0 */ + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/capm/capm_hall_sample/init/system_init.c b/drivers_sample/capm/capm_hall_sample/init/system_init.c new file mode 100644 index 000000000..616920766 --- /dev/null +++ b/drivers_sample/capm/capm_hall_sample/init/system_init.c @@ -0,0 +1,170 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" +#include "iocmg_ip.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 48; /* PLL Multiplier 48 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.clk1MDiv = (25 - 1); /* The 1 MHz freq is equal to the input clock frequency / (clk_1m_div + 1). 25 is the div of the clk_1m in CLOCK. */ + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void CAPM0_Init(void) +{ + HAL_CRG_IpEnableSet(CAPM0_BASE, IP_CLK_ENABLE); + + g_capmAConfig.baseAddress = CAPM0; + + g_capmAConfig.deburrNum = 0; + g_capmAConfig.capMode = CAPM_CONTINUECAP; + g_capmAConfig.preScale = 0; + g_capmAConfig.capRegConfig[CAPM_ECR_NUM1].capEvent = CAPM_RISING; + g_capmAConfig.capRegConfig[CAPM_ECR_NUM1].regReset = CAPM_NOTRESET; + g_capmAConfig.capRegConfig[CAPM_ECR_NUM2].capEvent = CAPM_FALLING; + g_capmAConfig.capRegConfig[CAPM_ECR_NUM2].regReset = CAPM_NOTRESET; + g_capmAConfig.useCapNum = 2; + g_capmAConfig.tscntDiv = 1 - 1; + g_capmAConfig.inputSrc = CAPM_INPUT; + HAL_CAPM_Init(&g_capmAConfig); +} + +static void CAPM1_Init(void) +{ + HAL_CRG_IpEnableSet(CAPM1_BASE, IP_CLK_ENABLE); + + g_capmBConfig.baseAddress = CAPM1; + + g_capmBConfig.deburrNum = 0; + g_capmBConfig.capMode = CAPM_CONTINUECAP; + g_capmBConfig.preScale = 0; + g_capmBConfig.capRegConfig[CAPM_ECR_NUM1].capEvent = CAPM_RISING; + g_capmBConfig.capRegConfig[CAPM_ECR_NUM1].regReset = CAPM_NOTRESET; + g_capmBConfig.capRegConfig[CAPM_ECR_NUM2].capEvent = CAPM_FALLING; + g_capmBConfig.capRegConfig[CAPM_ECR_NUM2].regReset = CAPM_NOTRESET; + g_capmBConfig.useCapNum = 2; + g_capmBConfig.tscntDiv = 1 - 1; + g_capmBConfig.inputSrc = CAPM_INPUT; + HAL_CAPM_Init(&g_capmBConfig); +} + +static void CAPM2_Init(void) +{ + HAL_CRG_IpEnableSet(CAPM2_BASE, IP_CLK_ENABLE); + + g_capmCConfig.baseAddress = CAPM2; + + g_capmCConfig.deburrNum = 0; + g_capmCConfig.capMode = CAPM_CONTINUECAP; + g_capmCConfig.preScale = 0; + g_capmCConfig.capRegConfig[CAPM_ECR_NUM1].capEvent = CAPM_RISING; + g_capmCConfig.capRegConfig[CAPM_ECR_NUM1].regReset = CAPM_NOTRESET; + g_capmCConfig.capRegConfig[CAPM_ECR_NUM2].capEvent = CAPM_FALLING; + g_capmCConfig.capRegConfig[CAPM_ECR_NUM2].regReset = CAPM_NOTRESET; + g_capmCConfig.useCapNum = 2; + g_capmCConfig.tscntDiv = 1 - 1; + g_capmCConfig.inputSrc = CAPM_INPUT; + HAL_CAPM_Init(&g_capmCConfig); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); /* UART0 clock enable. */ + g_uart0.baseAddress = UART0; + + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; + g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + /* Config PIN39 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_3_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_3_AS_UART0_TXD, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_3_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_3_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_3_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN40 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_4_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_4_AS_UART0_RXD, PULL_UP); /* Pull-up and Pull-down, UART RX recommend PULL_UP */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_4_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_4_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_4_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN33 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO5_0_AS_CAPM0_IN); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO5_0_AS_CAPM0_IN, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO5_0_AS_CAPM0_IN, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO5_0_AS_CAPM0_IN, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO5_0_AS_CAPM0_IN, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN32 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_1_AS_CAPM1_IN); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_1_AS_CAPM1_IN, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_1_AS_CAPM1_IN, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_1_AS_CAPM1_IN, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_1_AS_CAPM1_IN, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN31 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_0_AS_CAPM2_IN); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_0_AS_CAPM2_IN, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_0_AS_CAPM2_IN, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_0_AS_CAPM2_IN, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_0_AS_CAPM2_IN, DRIVER_RATE_2); /* Output signal edge fast/slow */ +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + CAPM0_Init(); + CAPM1_Init(); + CAPM2_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/capm/capm_hall_sample/readme.md b/drivers_sample/capm/capm_hall_sample/readme.md new file mode 100644 index 000000000..063867325 --- /dev/null +++ b/drivers_sample/capm/capm_hall_sample/readme.md @@ -0,0 +1,18 @@ +# CAPM读取电机HALL位置传感器 +## 关键字: CAPM, HALL传感器 + +**【功能描述】** ++ 使用三个CAPM捕获三个HALL传感器的电平信息 + +**【示例配置】** ++ 捕获模式:可通过“g_capmAConfig.capMode”进行配置,默认为连续捕获CAPM_CONTINUECAP + ++ 预分频:对CAPM输入信号进行预分频,可通过”g_capmAConfig.preScale“进行配置,默认为不分频 + ++ 捕获寄存器配置:可通过”g_capmAConfig.capRegConfig“进行配置,默认为上升沿捕获,每次复位 + +**【示例效果】** ++ 在IOCMG_15、IOCMG_18和IOCMG_19输入HALL传感器的输入信号。在串口打印的数据中的每一位表示当前时刻的对应的HALL传感器的电平状态。 + +**【注意事项】** ++ 需要转动电机才能进行CAPM捕获霍尔传感器信号 diff --git a/drivers_sample/capm/capm_hall_sample/src/capm_hall_sample.c b/drivers_sample/capm/capm_hall_sample/src/capm_hall_sample.c new file mode 100644 index 000000000..98721f9b9 --- /dev/null +++ b/drivers_sample/capm/capm_hall_sample/src/capm_hall_sample.c @@ -0,0 +1,79 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file capm_hall_sample.c + * @author MCU Driver Team + * @brief CAPM use HALL sensor implementation sample. + * @details This file provides CAPM use HALL sensor implementation sample. + */ +#include "capm_hall_sample.h" +#include "interrupt.h" +#include "debug.h" +#include "main.h" + +#define FIRST_BIT_SHIFT 1 +#define SECOND_BIT_SHIFT 2 + +/** + * @brief Calculate current level + * @param handle: CAPM handle. + * @retval none + */ +static unsigned char CAPM_CalculateLevel(CAPM_Handle *handle) +{ + unsigned char hallNextECR; + + CAPM_ASSERT_PARAM(handle != NULL); + hallNextECR = HAL_CAPM_GetNextLoadECRNum(handle); /* get next ECR number */ + if (hallNextECR == CAPM_NEXT_LOAD_ECR1 || hallNextECR == CAPM_NEXT_LOAD_ECR3) { + return CAPM_LOW; /* current level is low */ + } else { + return CAPM_HIGH; /* current level is high */ + } +} + +/** + * @brief Get current Hall position value. + * @param None. + * @retval current position:CAPM_PART_A~F. + */ +unsigned char CAPM_GetHallValue(void) +{ + unsigned char hallALevel, hallBLevel, hallCLevel; + unsigned char hallPosition; + hallALevel = CAPM_CalculateLevel(&g_capmAConfig); /* get A phase's level */ + hallBLevel = CAPM_CalculateLevel(&g_capmBConfig); /* get B phase's level */ + hallCLevel = CAPM_CalculateLevel(&g_capmCConfig); /* get C phase's level */ + hallPosition = hallALevel << SECOND_BIT_SHIFT; /* move to the 2nd bit */ + hallPosition |= hallBLevel << FIRST_BIT_SHIFT; /* move to the 1st bit */ + hallPosition |= hallCLevel; + return hallPosition; +} + +/** + * @brief Sample of reading hall sensor value. + * @param None. + * @retval None. + */ +void CAPM_HallSample(void) +{ + SystemInit(); + while (1) { + unsigned char data = CAPM_GetHallValue(); /* get hall sensor value */ + DBG_PRINTF("hall = 0x%x\r\n", data); + } +} \ No newline at end of file diff --git a/drivers_sample/cfd/sample_cfd_check_error/inc/cfd_check_error_sample.h b/drivers_sample/cfd/sample_cfd_check_error/inc/cfd_check_error_sample.h new file mode 100644 index 000000000..8c11fcf38 --- /dev/null +++ b/drivers_sample/cfd/sample_cfd_check_error/inc/cfd_check_error_sample.h @@ -0,0 +1,32 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file cfd_check_error_sample.h + * @author MCU Driver Team + * @brief cfd sample module. + * @details This file provides sample code for users to test using the CFD module. + */ + +#ifndef McuMagicTag_CFD_CHECK_ERROR_SAMPLE_H +#define McuMagicTag_CFD_CHECK_ERROR_SAMPLE_H + +/* Includes ------------------------------------------------------------------*/ +#include "baseinc.h" + +BASE_StatusType CFD_SampleMain(void); + +#endif /* McuMagicTag_CFD_CHECK_ERROR_SAMPLE_H */ diff --git a/drivers_sample/cfd/sample_cfd_check_error/init/main.c b/drivers_sample/cfd/sample_cfd_check_error/init/main.c new file mode 100644 index 000000000..01587d8b0 --- /dev/null +++ b/drivers_sample/cfd/sample_cfd_check_error/init/main.c @@ -0,0 +1,55 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ + +#include "typedefs.h" +#include "feature.h" +#include "cfd_check_error_sample.h" +#include "main.h" +/* USER CODE BEGIN 0 */ + //APT_PWMInitHALSample(); + /* USER CODE END 0 */ +CFD_Handle g_cfd; +UART_Handle g_uart0; +/* USER CODE BEGIN 1 */ + /* USER CODE END 1 */ + +int main(void) +{ + /* USER CODE BEGIN 2 */ + /* USER CODE END 2 */ + CFD_SampleMain(); + /* USER CODE BEGIN 3 */ +/* USER CODE END 3 */ + while (1) { + /* USER CODE BEGIN 4 */ + /* 建议用户放置周期性执行代码 */ + /* USER CODE END 4 */ + } + /* USER CODE BEGIN 5 */ + /* 建议用户放置代码流程 */ + /* USER CODE END 5 */ + return BASE_STATUS_OK; +} + +/* USER CODE BEGIN 6 */ +/* 建议用户放置自定义函数 */ +/* USER CODE END 6 */ \ No newline at end of file diff --git a/drivers_sample/cfd/sample_cfd_check_error/init/main.h b/drivers_sample/cfd/sample_cfd_check_error/init/main.h new file mode 100644 index 000000000..5edd2c7ff --- /dev/null +++ b/drivers_sample/cfd/sample_cfd_check_error/init/main.h @@ -0,0 +1,59 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "uart_ex.h" +#include "cfd.h" +#include "crg.h" +#include "iocmg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define XTAL_DRV_LEVEL4 0x03U +#define XTAL_DRV_LEVEL3 0x02U +#define XTAL_DRV_LEVEL2 0x01U +#define XTAL_DRV_LEVEL1 0x00U + +extern CFD_Handle g_cfd; +extern UART_Handle g_uart0; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +void CFDCheckEndCallback(CFD_Handle *handle); +void CFD_CheckErrorCallback(CFD_Handle *handle); + +/* USER CODE BEGIN 0 */ +/* USER CODE 区域内代码不会被覆盖,区域外会被生成的默认代码覆盖(其余USER CODE 区域同理) */ +/* USER CODE END 0 */ + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/cfd/sample_cfd_check_error/init/system_init.c b/drivers_sample/cfd/sample_cfd_check_error/init/system_init.c new file mode 100644 index 000000000..0db784208 --- /dev/null +++ b/drivers_sample/cfd/sample_cfd_check_error/init/system_init.c @@ -0,0 +1,124 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" +#include "iocmg_ip.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 48; /* PLL Multiplier 48 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.clk1MDiv = (25 - 1); /* The 1 MHz freq is equal to the input clock frequency / (clk_1m_div + 1). 25 is the div of the clk_1m in CLOCK. */ + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +__weak void CFDCheckEndCallback(CFD_Handle *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN CFD_INT_CHECK_END_MASK */ + /* USER CODE END CFD_INT_CHECK_END_MASK */ +} + +__weak void CFD_CheckErrorCallback(CFD_Handle *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN CFD_INT_PLL_REF_CLOCK_STOP_MASK */ + /* USER CODE END CFD_INT_PLL_REF_CLOCK_STOP_MASK */ +} + +static BASE_StatusType CFD_Init(void) +{ + HAL_CRG_IpEnableSet(CFD_BASE, IP_CLK_ENABLE); + + g_cfd.baseAddress = CFD; + g_cfd.upperBound = 12; + g_cfd.interruptType = CFD_INT_PLL_REF_CLOCK_STOP_MASK; + + HAL_CFD_RegisterCallback(&g_cfd, CFD_INT_CHECK_END_MASK, (CFD_CallBackFuncType)CFDCheckEndCallback); + HAL_CFD_RegisterCallback(&g_cfd, CFD_INT_PLL_REF_CLOCK_STOP_MASK, (CFD_CallBackFuncType)CFD_CheckErrorCallback); + + IRQ_Register(IRQ_CFD, HAL_CFD_IrqHandler, &g_cfd); + IRQ_SetPriority(IRQ_CFD, 1); /* 1 is priority value */ + IRQ_EnableN(IRQ_CFD); + return HAL_CFD_Init(&g_cfd); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); /* UART0 clock enable. */ + g_uart0.baseAddress = UART0; + + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; + g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + /* Config PIN39 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_3_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_3_AS_UART0_TXD, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_3_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_3_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_3_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN40 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_4_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_4_AS_UART0_RXD, PULL_UP); /* Pull-up and Pull-down, UART RX recommend PULL_UP */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_4_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_4_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_4_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + CFD_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/cfd/sample_cfd_check_error/readme.md b/drivers_sample/cfd/sample_cfd_check_error/readme.md new file mode 100644 index 000000000..80ba155fa --- /dev/null +++ b/drivers_sample/cfd/sample_cfd_check_error/readme.md @@ -0,0 +1,21 @@ +# 验证CFD的时钟失效保护功能 +## 关键字: CFD, 时钟失效, 中断 + +**【功能描述】** ++ 监测目标时钟(HOSC或TCXO)是否失效,每隔5s分别注入时钟失效中断和解除时钟失效中断,用于验证CFD的时钟失效保护功能。 + +**【示例配置】** ++ CFD参考时钟源:参考时钟源固定为内部低速时钟CLK_LOSC,默认为不分频。 + ++ CFD目标时钟源:目标时钟源固定为HOSC或TCXO,分频比固定为2048。 + ++ CFD上限值: 上限值可通过“g_cfd.upperBound”配置。 + ++ CFD中断类型:中断类型可通过“g_cfd.interruptType”进行配置,默认为时钟失效中断。 + +**【示例效果】** ++ Debug串口首先每隔1s打印出监测目标时钟频率的CFDCNTLOCK锁存值,在注入时钟失效中断后每隔1s分别打印时钟失效回调函数中的log, 5s后解除时钟失效中断后再每隔1s打印CFDCNTLOCK锁存值,循环往复。 + +**【注意事项】** ++ 时钟失效中断触发硬件系统事件2会自动关闭APT并将主时钟切换为LOSC进行保护,用户可在中断服务函数中进行时钟恢复或者复位等安全操作; ++ 每次中断触发后自行判断计数值是否在门限内,非门限内则判定为异常时钟;该模块目标时钟分配比固化为2048分频,参考时钟不分频。 diff --git a/drivers_sample/cfd/sample_cfd_check_error/src/cfd_check_error_sample.c b/drivers_sample/cfd/sample_cfd_check_error/src/cfd_check_error_sample.c new file mode 100644 index 000000000..fb43875a8 --- /dev/null +++ b/drivers_sample/cfd/sample_cfd_check_error/src/cfd_check_error_sample.c @@ -0,0 +1,94 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file cfd_check_error_sample.c + * @author MCU Driver Team + * @brief The CFD module monitors abnormal clocks, inject clock error after loop times in cycles. + * @details Check whether the PLL reference clock (TCXO or HOSC) fails by using \ + * the LOSC = 32Khz clock. If the clock fails, the interrupt service function \ + * is triggered for processing, and the hardware system event 2 is triggered to \ + * disable the APT and switch the master clock to the LOSC for protection. \ + * Users can perform secure operations such as clock recovery or reset in the \ + * interrupt service function. If the interrupt trigger mode is set to non-clock failure mode, \ + * the user needs to determine whether the count value is within the threshold after each interrupt \ + * is triggered. If the count value is not within the threshold, the clock is considered abnormal. + * For details about the PLL reference clock recovery mechanism, see the chip technical guide. \ + * The interrupt type can be configured by users. Only the upper threshold is available. \ + * For details about the calculation method, see the chip technical guide. + */ + +/* Includes ------------------------------------------------------------------*/ +#include "interrupt.h" +#include "debug.h" +#include "cfd.h" +#include "cfd_check_error_sample.h" +#include "main.h" +#include "crg.h" + +#define LOOP_TIMES 5 + +unsigned int g_loopTimes = 0; + +void CFD_CheckErrorCallback(CFD_Handle *handle); + +/** + * @brief Sample main function. + * @param None. + * @return @ref BASE_StatusType + */ +BASE_StatusType CFD_SampleMain(void) +{ + SystemInit(); + HAL_CFD_Start(&g_cfd); + + while (1) { + /* If ref clk cnt value bigger than upperbound, then junp to callback */ + BASE_FUNC_DELAY_S(1); + DBG_PRINTF("main loop, ref clk cnt value = %d\r\n", DCL_CFD_GetCntValue(g_cfd.baseAddress)); + if (g_loopTimes++ >= LOOP_TIMES) { + g_loopTimes = 0; + /* Inject interrupt type error, trig int jump to callback */ + DBG_PRINTF("Inject interrupt type error\r\n"); + DCL_CFD_EnableInterruptInject(g_cfd.baseAddress, g_cfd.interruptType); + } + } + return BASE_STATUS_OK; +} + +/** + * @brief Interrupt callback function triggered by module check errors. + * @param handle CFD handle. + * @return None. + */ +void CFD_CheckErrorCallback(CFD_Handle *handle) +{ + CFD_Handle* cfdHandle = (CFD_Handle*)handle; + while (1) { + /* after inject error, core freq switch to losc = 32khz */ + DBG_PRINTF("In CFD interrupt function : clock frequency error and \ + core freq = %dhz\r\n", HAL_CRG_GetCoreClkFreq()); + BASE_FUNC_DELAY_S(1); + /* loop control */ + if (g_loopTimes++ >= LOOP_TIMES) { + g_loopTimes = 0; + /* Disable Inject interrupt type error, jump to main loop */ + DBG_PRINTF("Disable inject interrupt type error\r\n"); + DCL_CFD_DisableInterruptInject(cfdHandle->baseAddress, cfdHandle->interruptType); + return; + } + } +} \ No newline at end of file diff --git a/drivers_sample/cmm/sample_cmm_check_error/inc/cmm_check_error_sample.h b/drivers_sample/cmm/sample_cmm_check_error/inc/cmm_check_error_sample.h new file mode 100644 index 000000000..21bca7e0b --- /dev/null +++ b/drivers_sample/cmm/sample_cmm_check_error/inc/cmm_check_error_sample.h @@ -0,0 +1,32 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file cmm_check_error_sample.h + * @author MCU Driver Team + * @brief cmm module sample + * @details This file provides sample code for users to test using the CMM module. + */ + +#ifndef McuMagicTag_CMM_CHECK_ERROR_SAMPLE_H +#define McuMagicTag_CMM_CHECK_ERROR_SAMPLE_H + +/* Includes ------------------------------------------------------------------*/ +#include "baseinc.h" + +BASE_StatusType CMM_SampleMain(void); + +#endif /* McuMagicTag_CMM_CHECK_ERROR_SAMPLE_H */ diff --git a/drivers_sample/cmm/sample_cmm_check_error/init/main.c b/drivers_sample/cmm/sample_cmm_check_error/init/main.c new file mode 100644 index 000000000..09c8ab1ea --- /dev/null +++ b/drivers_sample/cmm/sample_cmm_check_error/init/main.c @@ -0,0 +1,55 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ + +#include "typedefs.h" +#include "feature.h" +#include "cmm_check_error_sample.h" +#include "main.h" +/* USER CODE BEGIN 0 */ + //APT_PWMInitHALSample(); + /* USER CODE END 0 */ +CMM_Handle g_cmm; +UART_Handle g_uart0; +/* USER CODE BEGIN 1 */ + /* USER CODE END 1 */ + +int main(void) +{ + /* USER CODE BEGIN 2 */ + /* USER CODE END 2 */ + CMM_SampleMain(); + /* USER CODE BEGIN 3 */ +/* USER CODE END 3 */ + while (1) { + /* USER CODE BEGIN 4 */ + /* 建议用户放置周期性执行代码 */ + /* USER CODE END 4 */ + } + /* USER CODE BEGIN 5 */ + /* 建议用户放置代码流程 */ + /* USER CODE END 5 */ + return BASE_STATUS_OK; +} + +/* USER CODE BEGIN 6 */ +/* 建议用户放置自定义函数 */ +/* USER CODE END 6 */ \ No newline at end of file diff --git a/drivers_sample/cmm/sample_cmm_check_error/init/main.h b/drivers_sample/cmm/sample_cmm_check_error/init/main.h new file mode 100644 index 000000000..792bdb13f --- /dev/null +++ b/drivers_sample/cmm/sample_cmm_check_error/init/main.h @@ -0,0 +1,60 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "uart_ex.h" +#include "cmm.h" +#include "crg.h" +#include "iocmg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define XTAL_DRV_LEVEL4 0x03U +#define XTAL_DRV_LEVEL3 0x02U +#define XTAL_DRV_LEVEL2 0x01U +#define XTAL_DRV_LEVEL1 0x00U + +extern CMM_Handle g_cmm; +extern UART_Handle g_uart0; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +void CMMCounterOverFlowCallback(CMM_Handle *handle); +void CMMCheckEndCallback(CMM_Handle *handle); +void CMM_CheckErrorCallback(CMM_Handle *handle); + +/* USER CODE BEGIN 0 */ +/* USER CODE 区域内代码不会被覆盖,区域外会被生成的默认代码覆盖(其余USER CODE 区域同理) */ +/* USER CODE END 0 */ + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/cmm/sample_cmm_check_error/init/system_init.c b/drivers_sample/cmm/sample_cmm_check_error/init/system_init.c new file mode 100644 index 000000000..32d1f2a93 --- /dev/null +++ b/drivers_sample/cmm/sample_cmm_check_error/init/system_init.c @@ -0,0 +1,136 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" +#include "iocmg_ip.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 48; /* PLL Multiplier 48 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.clk1MDiv = (25 - 1); /* The 1 MHz freq is equal to the input clock frequency / (clk_1m_div + 1). 25 is the div of the clk_1m in CLOCK. */ + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +__weak void CMMCounterOverFlowCallback(CMM_Handle *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN CMM_INT_COUNTER_OVERFLOW_MASK */ + /* USER CODE END CMM_INT_COUNTER_OVERFLOW_MASK */ +} + +__weak void CMMCheckEndCallback(CMM_Handle *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN CMM_INT_CHECK_END_MASK */ + /* USER CODE END CMM_INT_CHECK_END_MASK */ +} + +__weak void CMM_CheckErrorCallback(CMM_Handle *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN CMM_INT_FREQ_ERR_MASK */ + /* USER CODE END CMM_INT_FREQ_ERR_MASK */ +} + +static BASE_StatusType CMM_Init(void) +{ + HAL_CRG_IpEnableSet(CMM_BASE, IP_CLK_ENABLE); + + g_cmm.baseAddress = CMM; + g_cmm.targetFreqDivision = CMM_TARGET_FREQ_DIV_8192; + g_cmm.refFreqDivision = CMM_REF_FREQ_DIV_0; + g_cmm.targetClockSource = CMM_TARGET_CLK_LOSC; + g_cmm.refClockSource = CMM_REF_CLK_LOSC; + g_cmm.upperBound = 12; + g_cmm.lowerBound = 8; + g_cmm.interruptType = CMM_INT_FREQ_ERR_MASK; + + HAL_CMM_RegisterCallback(&g_cmm, CMM_INT_COUNTER_OVERFLOW_MASK, (CMM_CallBackFuncType)CMMCounterOverFlowCallback); + HAL_CMM_RegisterCallback(&g_cmm, CMM_INT_CHECK_END_MASK, (CMM_CallBackFuncType)CMMCheckEndCallback); + HAL_CMM_RegisterCallback(&g_cmm, CMM_INT_FREQ_ERR_MASK, (CMM_CallBackFuncType)CMM_CheckErrorCallback); + IRQ_Register(IRQ_CMM, HAL_CMM_IrqHandler, &g_cmm); + IRQ_SetPriority(IRQ_CMM, 1); /* 1 is priority value */ + IRQ_EnableN(IRQ_CMM); + return HAL_CMM_Init(&g_cmm); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); /* UART0 clock enable. */ + g_uart0.baseAddress = UART0; + + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; + g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + /* Config PIN39 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_3_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_3_AS_UART0_TXD, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_3_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_3_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_3_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN40 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_4_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_4_AS_UART0_RXD, PULL_UP); /* Pull-up and Pull-down, UART RX recommend PULL_UP */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_4_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_4_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_4_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + CMM_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/cmm/sample_cmm_check_error/readme.md b/drivers_sample/cmm/sample_cmm_check_error/readme.md new file mode 100644 index 000000000..1d4198cfd --- /dev/null +++ b/drivers_sample/cmm/sample_cmm_check_error/readme.md @@ -0,0 +1,20 @@ +# 验证CMM时钟频率监测功能,同时验证CMM频率错误中断功能 +## 关键字: CMM, 时钟频率监测, 中断 + +**【功能描述】** ++ 用于检查目标时钟(LOSC/HOSC/TCXO/HS_CLK/LS_CLK)频率是否发生错误。每隔5s分别注入频率错误中断,用于验证CMM的频率中断处理函数。 + +**【示例配置】** ++ CMM参考时钟源:参考时钟源可通过“g_cmm.refClockSource”配置,默认为内部低速时钟CMM_REF_CLK_LOSC,分频比可通过“g_cmm.refFreqDivision”配置,默认为不分频CMM_REF_FREQ_DIV_0。 + ++ CMM目标时钟源:目标时钟源可通过“g_cmm.targetClockSource”配置,默认为内部低速时钟CMM_TARGET_CLK_LOSC,分频比可通过“g_cmm.targetFreqDivision”配置,默认为8192分频CMM_TARGET_FREQ_DIV_8192。 + ++ CMM上下限值: 上限值可通过“g_cmm.upperBound”配置,下限值可通过“g_cmm.lowerBound”配置。 + ++ CMM中断类型:中断类型可通过“g_cmm.interruptType”进行配置,默认为频率错误中断。 + +**【示例效果】** ++ Debug串口首先每隔1s打印出监测目标时钟频率的CMCNTLOCK锁存值,在注入频率错误中断后每隔1s分别打印频率错误回调函数中的log, 5s后解除频率错误中断后再每隔1s打印CMCNTLOCK锁存值,循环往复。 + +**【注意事项】** ++ 上下限值的范围可反应系统对目标时钟偏差的冗余度,可自行设计门限值和时钟分频比,门限值具体计算方法请参照芯片技术指南。 diff --git a/drivers_sample/cmm/sample_cmm_check_error/src/cmm_check_error_sample.c b/drivers_sample/cmm/sample_cmm_check_error/src/cmm_check_error_sample.c new file mode 100644 index 000000000..7a54a84a9 --- /dev/null +++ b/drivers_sample/cmm/sample_cmm_check_error/src/cmm_check_error_sample.c @@ -0,0 +1,88 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file cmm_check_error_sample.c + * @author MCU Driver Team + * @brief The CMM module monitors abnormal clocks and inject error after loop times in circle. + * @details Use the reference clock (LOSC/HOSC/TCXO/HS_CLK) to check whether the target target \ + * clock (LOSC/HOSC/TCXO/HS_CLK/LS_CLK) is invalid. If the (LOSC/HOSC/TCXO/HS_CLK/LS_CLK) is invalid, \ + * the interrupt service function is triggered for processing. You can design security protection \ + * measures for the interrupt service function. If the interrupt trigger mode is set to non-clock \ + * failure mode, the user needs to determine whether the count value is within the threshold after \ + * each interrupt is triggered. If the count value is not within the threshold, the clock is \ + * considered abnormal. + * The threshold includes the upper and lower thresholds. The upper and lower thresholds reflect \ + * the redundancy of the system for the target clock offset. You can design the thresholds by yourself. \ + * For details about how to calculate the thresholds, see the chip technical guide. + */ + +/* Includes ------------------------------------------------------------------*/ +#include "interrupt.h" +#include "debug.h" +#include "cmm.h" +#include "cmm_check_error_sample.h" +#include "main.h" + +#define LOOP_TIMES 5 + +unsigned int g_loopTimes = 0; + +void CMM_CheckErrorCallback(CMM_Handle *handle); + +/** + * @brief Sample main function. + * @param None. + * @return @ref BASE_StatusType + */ +BASE_StatusType CMM_SampleMain(void) +{ + SystemInit(); + HAL_CMM_Start(&g_cmm); + while (1) { + /* If ref clk cnt value bigger than upperbound, then junp to callback */ + BASE_FUNC_DELAY_S(1); + DBG_PRINTF("main loop, CMM count value = %d\r\n", DCL_CMM_GetCntValue(g_cmm.baseAddress)); + if (g_loopTimes++ >= LOOP_TIMES - 1) { + g_loopTimes = 0; + /* Inject error, trig int jump to callback */ + DBG_PRINTF("\r\n Inject interrupt type error !\r\n"); + DCL_CMM_EnableInterruptInject(g_cmm.baseAddress, g_cmm.interruptType); + } + } + return BASE_STATUS_OK; +} + +/** + * @brief Interrupt callback function triggered by module check errors. + * @param handle CMM handle. + * @return None. + */ +void CMM_CheckErrorCallback(CMM_Handle *handle) +{ + CMM_Handle *cmmHandle = (CMM_Handle*)handle; + while (1) { + DBG_PRINTF("In CMM interrupt function : clock frequency error\r\n"); + BASE_FUNC_DELAY_S(1); + if (g_loopTimes++ >= LOOP_TIMES - 1) { + g_loopTimes = 0; + /* Disable Inject interrupt type error, trig int jump to callback */ + DBG_PRINTF("\r\n Disable inject interrupt type error\r\n"); + DCL_CMM_DisableInterruptInject(cmmHandle->baseAddress, cmmHandle->interruptType); + return; + } + } +} \ No newline at end of file diff --git a/drivers_sample/crc/sample_crc_gen_algo/inc/sample_crc_gen_algo.h b/drivers_sample/crc/sample_crc_gen_algo/inc/sample_crc_gen_algo.h new file mode 100644 index 000000000..8a7d9a8e6 --- /dev/null +++ b/drivers_sample/crc/sample_crc_gen_algo/inc/sample_crc_gen_algo.h @@ -0,0 +1,30 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_crc_gen_algo.h + * @author MCU Driver Team + * @brief CRC module sample + * @details The header file contains the following declaration: + * crc to generate crc check value of input data. + */ + +#ifndef CRC_GEN_SAMPLE_H +#define CRC_GEN_SAMPLE_H + +BASE_StatusType CRC_GenerateSample(void); + +#endif /* CRC_GEN_SAMPLE_H */ \ No newline at end of file diff --git a/drivers_sample/crc/sample_crc_gen_algo/init/main.c b/drivers_sample/crc/sample_crc_gen_algo/init/main.c new file mode 100644 index 000000000..2fa0b75b2 --- /dev/null +++ b/drivers_sample/crc/sample_crc_gen_algo/init/main.c @@ -0,0 +1,54 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ + +#include "typedefs.h" +#include "feature.h" +#include "sample_crc_gen_algo.h" +#include "main.h" +/* USER CODE BEGIN 0 */ + //APT_PWMInitHALSample(); + /* USER CODE END 0 */ +UART_Handle g_uart0; +/* USER CODE BEGIN 1 */ + /* USER CODE END 1 */ + +int main(void) +{ + /* USER CODE BEGIN 2 */ + /* USER CODE END 2 */ + CRC_GenerateSample(); + /* USER CODE BEGIN 3 */ +/* USER CODE END 3 */ + while (1) { + /* USER CODE BEGIN 4 */ + /* 建议用户放置周期性执行代码 */ + /* USER CODE END 4 */ + } + /* USER CODE BEGIN 5 */ + /* 建议用户放置代码流程 */ + /* USER CODE END 5 */ + return BASE_STATUS_OK; +} + +/* USER CODE BEGIN 6 */ +/* 建议用户放置自定义函数 */ +/* USER CODE END 6 */ \ No newline at end of file diff --git a/drivers_sample/crc/sample_crc_gen_algo/init/main.h b/drivers_sample/crc/sample_crc_gen_algo/init/main.h new file mode 100644 index 000000000..d059d7d88 --- /dev/null +++ b/drivers_sample/crc/sample_crc_gen_algo/init/main.h @@ -0,0 +1,54 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "uart_ex.h" +#include "crg.h" +#include "iocmg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define XTAL_DRV_LEVEL4 0x03U +#define XTAL_DRV_LEVEL3 0x02U +#define XTAL_DRV_LEVEL2 0x01U +#define XTAL_DRV_LEVEL1 0x00U + +extern UART_Handle g_uart0; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +/* USER CODE BEGIN 0 */ +/* USER CODE 区域内代码不会被覆盖,区域外会被生成的默认代码覆盖(其余USER CODE 区域同理) */ +/* USER CODE END 0 */ + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/crc/sample_crc_gen_algo/init/system_init.c b/drivers_sample/crc/sample_crc_gen_algo/init/system_init.c new file mode 100644 index 000000000..2d6c1013f --- /dev/null +++ b/drivers_sample/crc/sample_crc_gen_algo/init/system_init.c @@ -0,0 +1,92 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" +#include "iocmg_ip.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 48; /* PLL Multiplier 48 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.clk1MDiv = (25 - 1); /* The 1 MHz freq is equal to the input clock frequency / (clk_1m_div + 1). 25 is the div of the clk_1m in CLOCK. */ + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); /* UART0 clock enable. */ + g_uart0.baseAddress = UART0; + + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; + g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + /* Config PIN39 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_3_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_3_AS_UART0_TXD, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_3_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_3_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_3_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN40 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_4_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_4_AS_UART0_RXD, PULL_UP); /* Pull-up and Pull-down, UART RX recommend PULL_UP */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_4_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_4_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_4_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/crc/sample_crc_gen_algo/readme.md b/drivers_sample/crc/sample_crc_gen_algo/readme.md new file mode 100644 index 000000000..04177085c --- /dev/null +++ b/drivers_sample/crc/sample_crc_gen_algo/readme.md @@ -0,0 +1,16 @@ +# 配置CRC参数,运用CRC16_XMODEM算法对一组数据进行运算生成CRC值 +## 关键字: CRC, CRC16_XMODEM + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、CRC初始化和功能配置。CRC计算方式有两种:1.运用CRC16_XMODEM算法模式对一组数据进行运算生成CRC值;2.根据CRC16_XMODEM算法属性配置对一组数据进行运算生成CRC值。 + +**【示例配置】** ++ 算法模式计算:配置算法模式CRC16_XMODEM,对长度为1024数组中的数据进行CRC累计计算,调用“HAL_CRC_Init()”进行初始化配置,之后调用"HAL_CRC_Accumulate()"接口对输入的数据进行CRC累计计算生成CRC校验结果值。 + ++ 算法属性配置计算:配置CRC16_XMODEM算法属性,对长度为1024数组中的数据进行CRC累计计算,调用“HAL_CRC_Init()”进行初始化配置,之后调用"HAL_CRC_Accumulate()"接口对输入的数据进行CRC累计计算生成CRC校验结果值。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后,Debug串口打印根据算法模式配置生成的CRC值和已运算数据的大小,然后打印根据算法属性配置生成的CRC值和已运算数据的大小。 + +**【注意事项】** ++ NA \ No newline at end of file diff --git a/drivers_sample/crc/sample_crc_gen_algo/src/sample_crc_gen_algo.c b/drivers_sample/crc/sample_crc_gen_algo/src/sample_crc_gen_algo.c new file mode 100644 index 000000000..0f1116983 --- /dev/null +++ b/drivers_sample/crc/sample_crc_gen_algo/src/sample_crc_gen_algo.c @@ -0,0 +1,91 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_crc_gen_algo.c + * @author MCU Driver Team + * @brief Generates the CRC value. + * @details Setting a group of unsigned short values increasing from 0 and performing CRC accumulation \ + * operation on the grouping values to generate a CRC value; + */ + +/* Includes ------------------------------------------------------------------*/ +#include "debug.h" +#include "crc.h" +#include "main.h" +#include "sample_crc_gen_algo.h" + +#define TABLE_SIZE 1024 + +static unsigned short g_crcTempData[TABLE_SIZE] = {0}; + +/** + * @brief To test the function of generating a CRC value By Algorithm. + * @param None + * @retval Value of @ref BASE_StatusType. + */ +static BASE_StatusType CRC_GenerateByAlgorithm(void) +{ + CRC_Handle genAlgo = {0}; + genAlgo.handleEx.algoMode = CRC16_XMODEM; /* crc algorithm mode CRC16_XMODEM */ + genAlgo.baseAddress = CRC; + genAlgo.inputDataFormat = CRC_MODE_BIT16; /* crc data size */ + HAL_CRC_Init(&genAlgo); + unsigned int res = HAL_CRC_Accumulate(&genAlgo, g_crcTempData, TABLE_SIZE); + DBG_PRINTF("\r\n res %x size %d \r\n", res, TABLE_SIZE); + return BASE_STATUS_OK; +} + +/** + * @brief To test the function of generating a CRC value By Algorithm Attribute. + * @param None + * @retval Value of @ref BASE_StatusType. + */ +static BASE_StatusType CRC_GenerateByAlgorithmAttr(void) +{ + CRC_Handle genAlgoAttr = {0}; + genAlgoAttr.baseAddress = CRC; + genAlgoAttr.inputDataFormat = CRC_MODE_BIT16; /* crc input data size */ + genAlgoAttr.initValueType = TYPE_CRC_INIT_VALUE_0000; + genAlgoAttr.polyMode = CRC16_1021_POLY_MODE; + genAlgoAttr.xorEndianEnbaleType = ENABLE_XOR_ENABLE_LSB; /* enabel xor and enable lsb */ + genAlgoAttr.reverseEnableType = REVERSE_INPUT_FALSE_OUTPUT_FALSE; + genAlgoAttr.resultXorValueType = TYPE_CRC_XOR_VALUE_0000; + HAL_CRC_Init(&genAlgoAttr); + unsigned int res = HAL_CRC_Accumulate(&genAlgoAttr, g_crcTempData, TABLE_SIZE); + DBG_PRINTF("\r\n res %x size %d \r\n", res, TABLE_SIZE); + return BASE_STATUS_OK; +} + +/** + * @brief To test the function of generating a CRC value. + * @param None + * @retval Value of @ref BASE_StatusType. + */ +BASE_StatusType CRC_GenerateSample(void) +{ + SystemInit(); + HAL_CRG_IpEnableSet(CRC_BASE, IP_CLK_ENABLE); + for (unsigned int i = 0 ; i < TABLE_SIZE; i++) { + g_crcTempData[i] = i; + } + DBG_PRINTF("GenerateByAlgorithm:------ \r\n"); + CRC_GenerateByAlgorithm(); /* crc gen by algorithm */ + DBG_PRINTF("GenerateByAlgorithmAttr:------ \r\n"); + CRC_GenerateByAlgorithmAttr(); /* crc gen by algorithm attr */ + return BASE_STATUS_OK; +} + diff --git a/drivers_sample/crc/sample_crc_load_algo/inc/sample_crc_load_algo.h b/drivers_sample/crc/sample_crc_load_algo/inc/sample_crc_load_algo.h new file mode 100644 index 000000000..2b8889bdc --- /dev/null +++ b/drivers_sample/crc/sample_crc_load_algo/inc/sample_crc_load_algo.h @@ -0,0 +1,31 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_crc_load_algo.h + * @author MCU Driver Team + * @brief CRC module sample + * @details The header file contains the following declaration: + * This file provides sample code for users to help use crc to + * set and load crc init value. + */ + +#ifndef CRC_LOAD_SAMPLE_H +#define CRC_LOAD_SAMPLE_H + +BASE_StatusType CRC_LoadSample(void); + +#endif /* CRC_LOAD_SAMPLE_H */ \ No newline at end of file diff --git a/drivers_sample/crc/sample_crc_load_algo/init/main.c b/drivers_sample/crc/sample_crc_load_algo/init/main.c new file mode 100644 index 000000000..257d4717d --- /dev/null +++ b/drivers_sample/crc/sample_crc_load_algo/init/main.c @@ -0,0 +1,55 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ + +#include "typedefs.h" +#include "feature.h" +#include "sample_crc_load_algo.h" +#include "main.h" +/* USER CODE BEGIN 0 */ + //APT_PWMInitHALSample(); + /* USER CODE END 0 */ +CRC_Handle g_loadCrcHandle; +UART_Handle g_uart0; +/* USER CODE BEGIN 1 */ + /* USER CODE END 1 */ + +int main(void) +{ + /* USER CODE BEGIN 2 */ + /* USER CODE END 2 */ + CRC_LoadSample(); + /* USER CODE BEGIN 3 */ +/* USER CODE END 3 */ + while (1) { + /* USER CODE BEGIN 4 */ + /* 建议用户放置周期性执行代码 */ + /* USER CODE END 4 */ + } + /* USER CODE BEGIN 5 */ + /* 建议用户放置代码流程 */ + /* USER CODE END 5 */ + return BASE_STATUS_OK; +} + +/* USER CODE BEGIN 6 */ +/* 建议用户放置自定义函数 */ +/* USER CODE END 6 */ \ No newline at end of file diff --git a/drivers_sample/crc/sample_crc_load_algo/init/main.h b/drivers_sample/crc/sample_crc_load_algo/init/main.h new file mode 100644 index 000000000..226ebae97 --- /dev/null +++ b/drivers_sample/crc/sample_crc_load_algo/init/main.h @@ -0,0 +1,56 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "uart_ex.h" +#include "crc.h" +#include "crg.h" +#include "iocmg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define XTAL_DRV_LEVEL4 0x03U +#define XTAL_DRV_LEVEL3 0x02U +#define XTAL_DRV_LEVEL2 0x01U +#define XTAL_DRV_LEVEL1 0x00U + +extern CRC_Handle g_loadCrcHandle; +extern UART_Handle g_uart0; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +/* USER CODE BEGIN 0 */ +/* USER CODE 区域内代码不会被覆盖,区域外会被生成的默认代码覆盖(其余USER CODE 区域同理) */ +/* USER CODE END 0 */ + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/crc/sample_crc_load_algo/init/system_init.c b/drivers_sample/crc/sample_crc_load_algo/init/system_init.c new file mode 100644 index 000000000..06b14eff5 --- /dev/null +++ b/drivers_sample/crc/sample_crc_load_algo/init/system_init.c @@ -0,0 +1,104 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" +#include "iocmg_ip.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 48; /* PLL Multiplier 48 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.clk1MDiv = (25 - 1); /* The 1 MHz freq is equal to the input clock frequency / (clk_1m_div + 1). 25 is the div of the clk_1m in CLOCK. */ + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void CRC_Init(void) +{ + HAL_CRG_IpEnableSet(CRC_BASE, IP_CLK_ENABLE); + + g_loadCrcHandle.baseAddress = CRC; + + g_loadCrcHandle.inputDataFormat = CRC_MODE_BIT16; + g_loadCrcHandle.handleEx.algoMode = CRC16_XMODEM; + HAL_CRC_Init(&g_loadCrcHandle); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); /* UART0 clock enable. */ + g_uart0.baseAddress = UART0; + + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; + g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + /* Config PIN39 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_3_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_3_AS_UART0_TXD, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_3_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_3_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_3_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN40 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_4_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_4_AS_UART0_RXD, PULL_UP); /* Pull-up and Pull-down, UART RX recommend PULL_UP */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_4_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_4_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_4_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + CRC_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/crc/sample_crc_load_algo/readme.md b/drivers_sample/crc/sample_crc_load_algo/readme.md new file mode 100644 index 000000000..16d1b1822 --- /dev/null +++ b/drivers_sample/crc/sample_crc_load_algo/readme.md @@ -0,0 +1,18 @@ +# 通过改变初始值配置,对同一组数据进行不同CRC算法运算验证 +## 关键字: CRC算法,初始值 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、CRC初始化和功能配置。通过load初始值配置,不改变其他配置CRC16_XMODEM算法修改为CRC16_CCIT-FALSE,并对同一组数据进行CRC运算验证。 + +**【示例配置】** ++ 在"SystemInit()”接口中配置CRC输入数据长度、算法模式等参数。 + ++ 在进行load初始值配置之前,根据CRC16_XMODEM算法对输入数据0x5678调用“HAL_CRC_SetInputDataGetCheck()”进行CRC计算对比结果。 + ++ 调用“HAL_CRC_SetCheckInData()”修改初始值0xFFFF,再调用"HAL_CRC_SetInputDataGetCheck()"对输入数据0x5678进行CRC计算对比结果。加载初始值后,CRC16_XMODEM算法修改为CRC16_CCIT-FALSE算法。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后,串口打印原始算法对数据运算生成的CRC数值,并与CRC16_XMODEM算法运算的标准值对比验证正确性;load初始值后,打印load后的初始值,并对同一组数据运算生成CRC数值,并与CRC16_CCIT-FALSE算法运算的标准值对比验证正确性。 + +**【注意事项】** ++ NA \ No newline at end of file diff --git a/drivers_sample/crc/sample_crc_load_algo/src/sample_crc_load_algo.c b/drivers_sample/crc/sample_crc_load_algo/src/sample_crc_load_algo.c new file mode 100644 index 000000000..c9db4fa09 --- /dev/null +++ b/drivers_sample/crc/sample_crc_load_algo/src/sample_crc_load_algo.c @@ -0,0 +1,69 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_crc_load_algo.c + * @author MCU Driver Team + * @brief CRC module load init data config sample + * @details Perform the CRC16_XMODEM algorithm operation on the 16-bit data of 0x5678 to obtain a CRC value. \ + * Compare the CRC value with the standard value to determine whether the value is correct. Then load \ + * the initial value 0x0000 to the CRC module. Therefore, the CRC16_XMODEM algorithm is configured as \ + * the CRC16_CCIT-FALSE algorithm, and then the value 0x5678 is calculated. The CRC value generated \ + * after the calculation is compared with the standard value to determine whether the value of the \ + * initial load value is correct. + */ + +/* Includes ------------------------------------------------------------------*/ +#include "debug.h" +#include "crc.h" +#include "main.h" +#include "sample_crc_load_algo.h" + +#define CRC_XMODEM_REF_VALUE 0x5b86 +#define CRC_CCITFALSE_REF_VALUE 0xDF46 + +/** + * @brief To test the function of loading the check_in value to crc_data register. + * The load value is read from crc_out. + * The value is reversed and the original crc_out is overwritten. + * @param None + * @retval Value of @ref BASE_StatusType. + */ +BASE_StatusType CRC_LoadSample(void) +{ + SystemInit(); + /* CRC16_XMODEM Algrithem, init data = 0x0000 */ + unsigned int preLoadCrcValue = HAL_CRC_SetInputDataGetCheck(&g_loadCrcHandle, 0x00005678); + DBG_PRINTF("preLoadCrcValue: 0x%x \r\n", preLoadCrcValue); + if (preLoadCrcValue == CRC_XMODEM_REF_VALUE) { + DBG_PRINTF("CRC Algrithem is CRC16_XMODEM, inputData is 0x5678 \r\n"); + } else { + DBG_PRINTF("CRC Algrithem is not right for this sample! \r\n"); + } + /* load init data 0xffff, crc algrithem from CRC16_XMODEM to CRC16_CCIT-FALSE */ + HAL_CRC_SetCheckInData(&g_loadCrcHandle, 0xFFFF); + unsigned int initData = HAL_CRC_LoadCheckInData(&g_loadCrcHandle); + /* CRC16_CCIT-FALSE Algrithem, init data = 0xffff */ + unsigned int afterLoadCrcValue = HAL_CRC_SetInputDataGetCheck(&g_loadCrcHandle, 0x00005678); + DBG_PRINTF("initData: 0x%x \r\n", initData); + DBG_PRINTF("afterLoadCrcValue: 0x%x \r\n", afterLoadCrcValue); + if (afterLoadCrcValue == CRC_CCITFALSE_REF_VALUE) { + DBG_PRINTF("CRC Algrithem is CRC16_CCIT-FALSE, load init data success! \r\n"); + } else { + DBG_PRINTF("load init data fail ! \r\n"); + } + return BASE_STATUS_OK; +} diff --git a/drivers_sample/dac/sample_dac/init/main.c b/drivers_sample/dac/sample_dac/init/main.c new file mode 100644 index 000000000..263921187 --- /dev/null +++ b/drivers_sample/dac/sample_dac/init/main.c @@ -0,0 +1,33 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ +#include "feature.h" +#include "main.h" + +DAC_Handle g_dac; + +int main(void) +{ + SystemInit(); + while (1) { + } + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/dac/sample_dac/init/main.h b/drivers_sample/dac/sample_dac/init/main.h new file mode 100644 index 000000000..fbb529b7a --- /dev/null +++ b/drivers_sample/dac/sample_dac/init/main.h @@ -0,0 +1,43 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "dac.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +extern DAC_Handle g_dac; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/dac/sample_dac/init/system_init.c b/drivers_sample/dac/sample_dac/init/system_init.c new file mode 100644 index 000000000..8769cd02f --- /dev/null +++ b/drivers_sample/dac/sample_dac/init/system_init.c @@ -0,0 +1,70 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void DAC0_Init(void) +{ + g_dac.baseAddress = DAC0_BASE; /* DAC0 base address */ + g_dac.dacEn = BASE_CFG_ENABLE; + g_dac.dacValue = 128; /* 128: output 1.65v at 3.3v power supply */ + g_dac.dacTstModeEn = BASE_CFG_DISABLE; + HAL_DAC_Init(&g_dac); +} + +static void IOConfig(void) +{ + IOConfig_RegStruct *iconfig = IOCONFIG; + + iconfig->iocmg_33.BIT.func = 0x8; /* 0x8 is DAC0_ANA_OUT */ + iconfig->iocmg_33.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_33.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_33.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_33.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_33.BIT.se = BASE_CFG_DISABLE; +} + +void SystemInit(void) +{ + IOConfig(); + DAC0_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/dac/sample_dac/readme.md b/drivers_sample/dac/sample_dac/readme.md new file mode 100644 index 000000000..4c0942b31 --- /dev/null +++ b/drivers_sample/dac/sample_dac/readme.md @@ -0,0 +1,18 @@ +# 数模转换-将数字信号转换成对应的模拟电压量 +## 关键字: DAC, 数模转换 + +**【功能描述】** ++ 将软件配置的8bit数字信号,转换成对应的模拟电压量,实现数字到模拟的转换,转换成的模拟信号可便于模拟运算。 + +**【示例配置】** ++ DAC输出的模拟电压期望值为: V = ( DAC.value * ( VDDA – VSSA )) / 256。 + ++ 本示例中DAC.value的值为128,其值可在DAC模块的配置界面中进行更改,可以在“system_init.c”文件中进行更改,以满足输出不同的电压值。 + +**【示例效果】** ++ 输出的电压值可配置,在IOCMG_33可测量到DAC的输出值,默认值为1.55V。 + +**【注意事项】** ++ DAC.value的配置范围为0-255,超出部分将溢出。 + ++ 转速速率为300kHz。 \ No newline at end of file diff --git a/drivers_sample/dma/sample_dma_list_transfer/inc/sample_dma_list_transfer.h b/drivers_sample/dma/sample_dma_list_transfer/inc/sample_dma_list_transfer.h new file mode 100644 index 000000000..409b72414 --- /dev/null +++ b/drivers_sample/dma/sample_dma_list_transfer/inc/sample_dma_list_transfer.h @@ -0,0 +1,32 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_dma_list_transfer.h + * @author MCU Driver Team + * @brief dma sample module. + * @details This file provides sample code for users to help use + * the data transfer function of the dma. + */ +#ifndef SAMPLE_DMA_LIST_TRANSFER_H +#define SAMPLE_DMA_LIST_TRANSFER_H + +#include "dma.h" +#include "debug.h" +#include "interrupt.h" + +int DMA_MemoryToMemoryList(void); +#endif \ No newline at end of file diff --git a/drivers_sample/dma/sample_dma_list_transfer/readme.md b/drivers_sample/dma/sample_dma_list_transfer/readme.md new file mode 100644 index 000000000..7a4adb3ea --- /dev/null +++ b/drivers_sample/dma/sample_dma_list_transfer/readme.md @@ -0,0 +1,18 @@ +# 配置DMA链式传输功能,中断回调中读取搬运结果 +## 关键字: DMA, 链式传输, 中断 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、中断和DMA控制器初始化和功能配置。DMA链式传输,从内存搬运到内存,链式传输中内存地址可以不连续,DMA搬运结束后触发DMA中断,在中断回调函数中读取搬运后的结果。 + +**【示例配置】** ++ 对于“HAL_DMA_InitNewNode()”创建链表节点,设置源地址和目标地址及搬运长度。 + ++ 使用“HAL_DMA_ListAddNode()”接口,将每一个不连续内存进行连接。 + ++ 将第一个内存块的地址和选择的DMA传输通道作为入参传递至“HAL_DMA_StartListTransfer()”,使能DMA传递。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后。DMA搬运结束后,会上报中断,在中断回调函数中查看源目端数据是否一致。 + +**【注意事项】** ++ NA \ No newline at end of file diff --git a/drivers_sample/dma/sample_dma_list_transfer/src/sample_dma_list_transfer.c b/drivers_sample/dma/sample_dma_list_transfer/src/sample_dma_list_transfer.c new file mode 100644 index 000000000..861436e6a --- /dev/null +++ b/drivers_sample/dma/sample_dma_list_transfer/src/sample_dma_list_transfer.c @@ -0,0 +1,117 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_dma_list_transfer.c + * @author MCU Driver Team + * @brief dma sample module, scatter gather DMA. + * @details This file provides sample code for users to help use + * the data transfer function of the dma in chain transmission mode. + */ +#include "sample_dma_list_transfer.h" + +#define NUM 100 +static unsigned char g_str1[NUM] = "1234567890123456789012345678901234567890123456789012345678901234567890"; +static unsigned char g_str2[NUM] = {0}; +static unsigned char g_str3[NUM] = {0}; +static DMA_Handle g_dmac; +static DMA_ChannelParam g_param; + +/** + * @brief DMA controller initialization. + * @param None. + * @retval None. + */ +static void DMA_ControllerInit(void) +{ + g_dmac.baseAddress = DMA; + g_dmac.srcByteOrder = DMA_BYTEORDER_SMALLENDIAN; + g_dmac.destByteOrder = DMA_BYTEORDER_SMALLENDIAN; + g_dmac.irqNumTc = IRQ_DMA_TC; + g_dmac.irqNumError = IRQ_DMA_ERR; + HAL_DMA_Init(&g_dmac); +} + +/** + * @brief DMA interrupt initialization. + * @param handle DMA handle. + * @retval None. + */ +static void DMA_InterruptInit(DMA_Handle *handle) +{ + IRQ_Enable(); + handle->irqNumTc = IRQ_DMA_TC; + handle->irqNumError = IRQ_DMA_ERR; + HAL_DMA_IRQService(handle); + IRQ_EnableN(IRQ_DMA_TC); + IRQ_EnableN(IRQ_DMA_ERR); +} + +/** + * @brief User-defined callback function for completing the transfer of memory to the memory. + * @param handle callback handle. + * @retval None. + */ +static void DMA_MemToMemFinishList(void *handle) +{ + DBG_PRINTF("g_str1->g_str2 Finish!\r\n"); + DBG_PRINTF("src_memory g_str1: %s\r\n", g_str1); + DBG_PRINTF("dest_memory g_str2: %s\r\n", g_str2); + DBG_PRINTF("dest_memory g_str3: %s\r\n", g_str3); + if (handle == NULL) { + DBG_PRINTF("handle is nullptr!\r\n"); + } + BASE_FUNC_UNUSED(handle); +} + +static DMA_LinkList g_firstNode; +static DMA_LinkList g_secondNode; +/** + * @brief DMA sample code for the transfer of DMA chain transmission. + * @param None. + * @retval None. + */ +int DMA_MemoryToMemoryList(void) +{ + DBG_UartPrintInit(BAUDRATE); /* baud rate is 115200 */ + DBG_PRINTF("MemoryToMemoryList Begin: \r\n"); + DBG_PRINTF("src_memory g_str1: %s\r\n", g_str1); + DBG_PRINTF("dest_memory g_str2: %s\r\n", g_str2); + DBG_PRINTF("dest_memory g_str3: %s\r\n", g_str3); + + unsigned int channel = 2; /* select transfer channel 2 */ + DMA_ControllerInit(); + DMA_InterruptInit(&g_dmac); + HAL_DMA_RegisterCallback(&g_dmac, DMA_CHANNEL_FINISH, channel, DMA_MemToMemFinishList); + + g_param.direction = DMA_MEMORY_TO_MEMORY_BY_DMAC; + g_param.srcAddrInc = DMA_ADDR_UNALTERED; + g_param.destAddrInc = DMA_ADDR_INCREASE; + g_param.srcWidth = DMA_TRANSWIDTH_BYTE; + g_param.destWidth = DMA_TRANSWIDTH_BYTE; + g_param.srcBurst = DMA_BURST_LENGTH_1; + g_param.destBurst = DMA_BURST_LENGTH_1; + g_param.pHandle = &g_dmac; + /* The transmission length is defined as 5 */ + HAL_DMA_InitNewNode(&g_firstNode, &g_param, (uintptr_t)(void *)g_str1, (uintptr_t)(void *)g_str2, 5); + /* The transmission length is defined as 50 */ + HAL_DMA_InitNewNode(&g_secondNode, &g_param, (uintptr_t)(void *)g_str1, (uintptr_t)(void *)g_str3, 50); + + HAL_DMA_ListAddNode(&g_firstNode, &g_secondNode); + HAL_DMA_StartListTransfer(&g_dmac, &g_firstNode, channel); + DBG_PRINTF("End!\r\n"); + return 0; +} \ No newline at end of file diff --git a/drivers_sample/dma/sample_dma_list_transfer_continue/inc/sample_dma_list_transfer_continue.h b/drivers_sample/dma/sample_dma_list_transfer_continue/inc/sample_dma_list_transfer_continue.h new file mode 100644 index 000000000..1268c1c3b --- /dev/null +++ b/drivers_sample/dma/sample_dma_list_transfer_continue/inc/sample_dma_list_transfer_continue.h @@ -0,0 +1,32 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_dma_list_transfer_continue.h + * @author MCU Driver Team + * @brief Single-node continuous transmission. + * @details The DMA is used to transfer data from the memory to the memory. + * Single-node continuous transmission. + */ +#ifndef SAMPLE_DMA_LISTTRANSFERCOUNTINUE_H +#define SAMPLE_DMA_LISTTRANSFERCOUNTINUE_H + +#include "debug.h" +#include "dma.h" +#include "main.h" + +void DMA_List_transfer_continue(void); +#endif \ No newline at end of file diff --git a/drivers_sample/dma/sample_dma_list_transfer_continue/readme.md b/drivers_sample/dma/sample_dma_list_transfer_continue/readme.md new file mode 100644 index 000000000..fc2202829 --- /dev/null +++ b/drivers_sample/dma/sample_dma_list_transfer_continue/readme.md @@ -0,0 +1,19 @@ +# 配置DMA单节点连续链式传输功能 +## 关键字: DMA, 单节点,连续链式传输 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、中断和DMA控制器初始化和功能配置。DMA链式传输,从内存到内存,使用DMA搬运,链表单节点连续传输。 + +**【示例配置】** ++ “SystemInit()”中配置DMA源和目的大小端、开启中断等参数。 + ++ 链表连续处理:首先,将使用“HAL_DMA_InitNewNode()”接口配置目的内存需要接收的数据长度和内存地址,得到一个节点; +然后,使用“HAL_DMA_ListAddNode()”接口,将上一步的节点作为两个入参,使得链表循环。 + ++ 使能DMA搬运:将第一个内存块的地址和选择的DMA传输通道作为入参传递至“HAL_DMA_StartListTransfer()”,使能DMA传递 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后。DMA搬运结束后,会上报中断,在中断回调函数中查看源目端数据是否一致。 + +**【注意事项】** ++ NA \ No newline at end of file diff --git a/drivers_sample/dma/sample_dma_list_transfer_continue/src/sample_dma_list_transfer_continue.c b/drivers_sample/dma/sample_dma_list_transfer_continue/src/sample_dma_list_transfer_continue.c new file mode 100644 index 000000000..83944652a --- /dev/null +++ b/drivers_sample/dma/sample_dma_list_transfer_continue/src/sample_dma_list_transfer_continue.c @@ -0,0 +1,70 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_dma_list_transfer_continue.c + * @author MCU Driver Team + * @brief Single-node continuous transmission. + * @details The DMA is used to transfer data from the memory to the memory. + * Single-node continuous transmission. + */ +#include "sample_dma_list_transfer_continue.h" + +static unsigned char g_src[5] = "ABC"; +static unsigned char g_dest[5] = ""; +static DMA_LinkList g_node; +static DMA_ChannelParam g_param; +/** + * @brief DMA sample code for the transfer of list node continue transmission. + * @param None. + * @retval None. + */ +void DMA_List_transfer_continue(void) +{ + SystemInit(); + DBG_PRINTF("ListTransferContinue Begin: \r\n"); + DBG_PRINTF("Before transmission, src: %s\r\n", g_src); + DBG_PRINTF("Before transmission, dest: %s\r\n", g_dest); + unsigned int channel = 2; /* select transfer channel 2 */ + unsigned int dataLength = 3; /* The length of the transferred characters is 3 */ + unsigned int count = 0; + g_param.direction = DMA_MEMORY_TO_MEMORY_BY_DMAC; + g_param.srcAddrInc = DMA_ADDR_INCREASE; + g_param.destAddrInc = DMA_ADDR_INCREASE; + g_param.srcWidth = DMA_TRANSWIDTH_BYTE; + g_param.destWidth = DMA_TRANSWIDTH_BYTE; + g_param.srcBurst = DMA_BURST_LENGTH_1; + g_param.destBurst = DMA_BURST_LENGTH_1; + g_param.pHandle = &g_dmac; + HAL_DMA_InitNewNode(&g_node, &g_param, (uintptr_t)(void *)g_src, (uintptr_t)(void *)g_dest, dataLength); + HAL_DMA_ListAddNode(&g_node, &g_node); + HAL_DMA_StartListTransfer(&g_dmac, &g_node, channel); + DBG_PRINTF("DMA Start Transport!\r\n"); + while (1) { + BASE_FUNC_DelayUs(500); /* delay 500 us */ + if (count % 100 == 0 && count <= 2000) { /* 100 and 2000 are used for control printf */ + DBG_PRINTF("src: %s, dest: %s\r\n", g_src, g_dest); + if (count == 1500) { /* 1500 for turning off DMA transport */ + HAL_DMA_StopChannel(&g_dmac, channel); + DBG_PRINTF("DMA Stop Transport!\r\n"); + } + g_src[0] += 1; + g_src[1] += 1; + g_src[2] += 1; /* Change the character of the subscript is 2 */ + } + count++; + } +} \ No newline at end of file diff --git a/drivers_sample/dma/sample_dma_list_transfer_continue/sysinit/main.c b/drivers_sample/dma/sample_dma_list_transfer_continue/sysinit/main.c new file mode 100644 index 000000000..fb60e4c70 --- /dev/null +++ b/drivers_sample/dma/sample_dma_list_transfer_continue/sysinit/main.c @@ -0,0 +1,37 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ +#include "typedefs.h" +#include "feature.h" +#include "main.h" +#include "sample_dma_list_transfer_continue.h" + +UART_Handle g_uart0; + +DMA_Handle g_dmac; + +int main(void) +{ + DMA_List_transfer_continue(); + while (1) { + } + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/dma/sample_dma_list_transfer_continue/sysinit/main.h b/drivers_sample/dma/sample_dma_list_transfer_continue/sysinit/main.h new file mode 100644 index 000000000..ea243033c --- /dev/null +++ b/drivers_sample/dma/sample_dma_list_transfer_continue/sysinit/main.h @@ -0,0 +1,48 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "crg.h" +#include "dma.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +extern UART_Handle g_uart0; + +extern DMA_Handle g_dmac; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +void MemoryDMACallback(void *handle); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/dma/sample_dma_list_transfer_continue/sysinit/system_init.c b/drivers_sample/dma/sample_dma_list_transfer_continue/sysinit/system_init.c new file mode 100644 index 000000000..b1365052d --- /dev/null +++ b/drivers_sample/dma/sample_dma_list_transfer_continue/sysinit/system_init.c @@ -0,0 +1,123 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void DMA_Channel2Init(void) +{ + DMA_ChannelParam dma_param; + dma_param.direction = DMA_MEMORY_TO_MEMORY_BY_DMAC; + dma_param.srcAddrInc = DMA_ADDR_INCREASE; + dma_param.destAddrInc = DMA_ADDR_INCREASE; + dma_param.srcPeriph = DMA_REQUEST_MEM; + dma_param.destPeriph = DMA_REQUEST_MEM; + dma_param.srcWidth = DMA_TRANSWIDTH_BYTE; + dma_param.destWidth = DMA_TRANSWIDTH_BYTE; + dma_param.srcBurst = DMA_BURST_LENGTH_1; + dma_param.destBurst = DMA_BURST_LENGTH_1; + dma_param.pHandle = NULL; + HAL_DMA_InitChannel(&g_dmac, &dma_param, DMA_CHANNEL_TWO); +} + +static void DMA_Init(void) +{ + g_dmac.baseAddress = DMA; + g_dmac.srcByteOrder = DMA_BYTEORDER_SMALLENDIAN; + g_dmac.destByteOrder = DMA_BYTEORDER_SMALLENDIAN; + g_dmac.irqNumTc = IRQ_DMA_TC; + g_dmac.irqNumError = IRQ_DMA_ERR; + HAL_DMA_IRQService(&g_dmac); + IRQ_EnableN(IRQ_DMA_TC); + IRQ_EnableN(IRQ_DMA_ERR); + HAL_DMA_Init(&g_dmac); + + DMA_Channel2Init(); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); + + g_uart0.baseAddress = UART0; + g_uart0.irqNum = IRQ_UART0; + + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + IOConfig_RegStruct *iconfig = IOCONFIG; + + iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ + iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ + iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; +} + +void SystemInit(void) +{ + IOConfig(); + DMA_Init(); + UART0_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/dma/sample_dma_mem_to_mem/inc/sample_dma_mem_to_mem.h b/drivers_sample/dma/sample_dma_mem_to_mem/inc/sample_dma_mem_to_mem.h new file mode 100644 index 000000000..c83928d60 --- /dev/null +++ b/drivers_sample/dma/sample_dma_mem_to_mem/inc/sample_dma_mem_to_mem.h @@ -0,0 +1,33 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_dma_mem_to_mem.h + * @author MCU Driver Team + * @brief adc sample module. + * @brief dma sample module, memory-to-memory transfer. + * @details This file provides sample code for users to help use + * the data transfer function of the dma. + */ +#ifndef SAMPLE_DMA_MEMTOPER_H +#define SAMPLE_DMA_MEMTOPER_H + +#include "debug.h" +#include "dma.h" +#include "main.h" + +void DMA_MemoryToMemory(void); +#endif \ No newline at end of file diff --git a/drivers_sample/dma/sample_dma_mem_to_mem/init/main.c b/drivers_sample/dma/sample_dma_mem_to_mem/init/main.c new file mode 100644 index 000000000..89ffdc1fc --- /dev/null +++ b/drivers_sample/dma/sample_dma_mem_to_mem/init/main.c @@ -0,0 +1,36 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ +#include "feature.h" +#include "main.h" +#include "sample_dma_mem_to_mem.h" + +UART_Handle g_uart0; + +DMA_Handle g_dmac; + +int main(void) +{ + DMA_MemoryToMemory(); + while (1) { + } + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/dma/sample_dma_mem_to_mem/init/main.h b/drivers_sample/dma/sample_dma_mem_to_mem/init/main.h new file mode 100644 index 000000000..30a7c0e10 --- /dev/null +++ b/drivers_sample/dma/sample_dma_mem_to_mem/init/main.h @@ -0,0 +1,48 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "crg.h" +#include "dma.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +extern UART_Handle g_uart0; + +extern DMA_Handle g_dmac; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +void UART0_TXDMACallback(UART_Handle *handle); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/dma/sample_dma_mem_to_mem/init/system_init.c b/drivers_sample/dma/sample_dma_mem_to_mem/init/system_init.c new file mode 100644 index 000000000..3dc6940d1 --- /dev/null +++ b/drivers_sample/dma/sample_dma_mem_to_mem/init/system_init.c @@ -0,0 +1,133 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void DMA_Channel2Init(void *handle) +{ + DMA_ChannelParam dma_param; + dma_param.direction = DMA_MEMORY_TO_MEMORY_BY_DMAC; + dma_param.srcAddrInc = DMA_ADDR_INCREASE; + dma_param.destAddrInc = DMA_ADDR_INCREASE; + dma_param.srcPeriph = DMA_REQUEST_MEM; + dma_param.destPeriph = DMA_REQUEST_MEM; + dma_param.srcWidth = DMA_TRANSWIDTH_BYTE; + dma_param.destWidth = DMA_TRANSWIDTH_BYTE; + dma_param.srcBurst = DMA_BURST_LENGTH_1; + dma_param.destBurst = DMA_BURST_LENGTH_1; + dma_param.pHandle = handle; + HAL_DMA_InitChannel(&g_dmac, &dma_param, DMA_CHANNEL_TWO); +} + +static void DMA_Init(void) +{ + g_dmac.baseAddress = DMA; + g_dmac.srcByteOrder = DMA_BYTEORDER_SMALLENDIAN; + g_dmac.destByteOrder = DMA_BYTEORDER_SMALLENDIAN; + g_dmac.irqNumTc = IRQ_DMA_TC; + g_dmac.irqNumError = IRQ_DMA_ERR; + HAL_DMA_IRQService(&g_dmac); + IRQ_EnableN(IRQ_DMA_TC); + IRQ_EnableN(IRQ_DMA_ERR); + HAL_DMA_Init(&g_dmac); + + DMA_Channel2Init((void *)(&g_uart0)); +} + +__weak void UART0_TXDMACallback(UART_Handle *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN UART0_TXDMACallback */ + /* USER CODE END UART0_TXDMACallback */ +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); + + g_uart0.baseAddress = UART0; + g_uart0.irqNum = IRQ_UART0; + + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); + g_uart0.dmaHandle = &g_dmac; + g_uart0.uartDmaTxChn = DMA_CHANNEL_TWO; + HAL_UART_RegisterCallBack(&g_uart0, UART_WRITE_DMA_FINISH, UART0_TXDMACallback); +} + +static void IOConfig(void) +{ + IOConfig_RegStruct *iconfig = IOCONFIG; + + iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ + iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ + iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; +} + +void SystemInit(void) +{ + IOConfig(); + DMA_Init(); + UART0_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/dma/sample_dma_mem_to_mem/readme.md b/drivers_sample/dma/sample_dma_mem_to_mem/readme.md new file mode 100644 index 000000000..1b1aed5ab --- /dev/null +++ b/drivers_sample/dma/sample_dma_mem_to_mem/readme.md @@ -0,0 +1,18 @@ +# 配置DMA内存到内存传输功能,中断回调中读取搬运结果 +## 关键字: DMA, 中断,内存到内存 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、中断、DMA通道初始化和DMA控制器初始化配置。DMA传输,从内存搬运到内存,DMA搬运结束后触发DMA中断,在中断回调函数中读取搬运后的结果。 + +**【示例配置】** ++ 在“SystemInit()”中配置DMA源和目的大小端、中断、配置通道相关参数进行初始化。 + ++ 将搬运的源端地址和目的端地址传入“HAL_DMA_StartIT()”接口,搬运的数据长度和DMA的通道号也作为入参传递进去。。 + ++ 实现“DMA_MemToMemCallBack()”中断回调函数。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后。DMA搬运结束后,会上报中断,在中断回调中查看源目端数据是否一致。 + +**【注意事项】** ++ NA \ No newline at end of file diff --git a/drivers_sample/dma/sample_dma_mem_to_mem/src/sample_dma_mem_to_mem.c b/drivers_sample/dma/sample_dma_mem_to_mem/src/sample_dma_mem_to_mem.c new file mode 100644 index 000000000..bddb05d0f --- /dev/null +++ b/drivers_sample/dma/sample_dma_mem_to_mem/src/sample_dma_mem_to_mem.c @@ -0,0 +1,61 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_dma_mem_to_mem.c + * @author MCU Driver Team + * @brief dma sample module, memory-to-memory transfer. + * @details The DMA is used to transfer data from the memory to the memory. + * After the transfer is complete, the DMA interrupt is triggered. + * (1) Transfer configuration: Transfer the source and destination addresses to the HAL_DMA_StartIT() API. + * Transfer the length of the transferred data and the DMA channel number as input parameters. + * (2) Result judgment: After the DMA transfer is complete, in the interrupt callback function, check whether + * the source and destination data are consistent. + */ +#include "sample_dma_mem_to_mem.h" + +static unsigned char g_str1[10] = "12345678"; +static unsigned char g_str2[10] = ""; +void DMA_MemToMemCallBack(void *handle); +/** + * @brief User-defined callback function for completing the transfer of memory to the memory. + * @param handle callback handle. + * @retval None. + */ +void DMA_MemToMemCallBack(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("DMA_MemToMemCallBack\r\n"); + DBG_PRINTF("After transmission, src: %s\r\n", g_str1); + DBG_PRINTF("After transmission, dest: %s\r\n", g_str2); +} + +/** + * @brief DMA sample code for the transfer of memory to the memory. + * @param None. + * @retval None. + */ +void DMA_MemoryToMemory(void) +{ + SystemInit(); + DBG_PRINTF("MemoryToMemory Begin: \r\n"); + DBG_PRINTF("Before transmission, src: %s\r\n", g_str1); + DBG_PRINTF("Before transmission, dest: %s\r\n", g_str2); + unsigned int channel = 2; /* select transfer channel 2 */ + HAL_DMA_RegisterCallback(&g_dmac, DMA_CHANNEL_FINISH, channel, DMA_MemToMemCallBack); + /* The transmission length is defined as 8 */ + HAL_DMA_StartIT(&g_dmac, (uintptr_t)(void *)g_str1, (uintptr_t)(void *)g_str2, 8, channel); +} \ No newline at end of file diff --git a/drivers_sample/dma/sample_dma_mem_to_per/inc/sample_dma_mem_to_per.h b/drivers_sample/dma/sample_dma_mem_to_per/inc/sample_dma_mem_to_per.h new file mode 100644 index 000000000..88883e315 --- /dev/null +++ b/drivers_sample/dma/sample_dma_mem_to_per/inc/sample_dma_mem_to_per.h @@ -0,0 +1,32 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_dma_mem_to_per.h + * @author MCU Driver Team + * @brief dma sample module. + * @details This file provides sample code for users to help use + * the data transfer function of the dma. + */ +#ifndef SAMPLE_DMA_MEM_TO_PER_H +#define SAMPLE_DMA_MEM_TO_PER_H + +#include "dma.h" +#include "debug.h" +#include "interrupt.h" + +int DMA_MemoryToPeriphIT(void); +#endif \ No newline at end of file diff --git a/drivers_sample/dma/sample_dma_mem_to_per/readme.md b/drivers_sample/dma/sample_dma_mem_to_per/readme.md new file mode 100644 index 000000000..f2d505621 --- /dev/null +++ b/drivers_sample/dma/sample_dma_mem_to_per/readme.md @@ -0,0 +1,18 @@ +# 配置DMA内存到外设传输,传输完成进入中断回调函数 +## 关键字: DMA, 内存到外设, 中断 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、中断和DMA控制器初始化和功能配置。从内存到外设uart tx,使用DMA搬运,搬运结束后触发DMA中断。 + +**【示例配置】** ++ “HAL_DMA_Init()”接口配置DMA源和目的大小端、中断进行初始化,“HAL_DMA_InitChannel()”进行通道初始化配置。 + ++ 将搬运的源端地址和目的端地址传入“HAL_DMA_StartIT()”接口,搬运的数据长度和DMA的通道号也作为入参传递进去,调用完成之后要发送uart tx DMA请求。 + ++ 当DMA传输完成,“DMA_MemToPeriFinish()”中断回调函数中打印log。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后。DMA搬运结束后,会上报中断,在中断函数中打印传输完成log,并且在串口助手上显示搬运完成的数据。 + +**【注意事项】** ++ 如果要在串口助手上显示搬运完成的数据,要设置外设为对应的uart串口。 \ No newline at end of file diff --git a/drivers_sample/dma/sample_dma_mem_to_per/src/sample_dma_mem_to_per.c b/drivers_sample/dma/sample_dma_mem_to_per/src/sample_dma_mem_to_per.c new file mode 100644 index 000000000..231a0cbfd --- /dev/null +++ b/drivers_sample/dma/sample_dma_mem_to_per/src/sample_dma_mem_to_per.c @@ -0,0 +1,118 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_dma_mem_to_per.c + * @author MCU Driver Team + * @brief dma sample module, memory-to-peripheral transfer. + * @details This file provides sample code for users to help use + * the data transfer function of the dma. + */ +#include "sample_dma_mem_to_per.h" + +#define NUM 10 +static UART_Handle g_uartHandle; +static unsigned char g_str1[NUM] = "123456789"; +static DMA_Handle g_dmac; +static DMA_ChannelParam g_param; + +/** + * @brief DMA controller initialization. + * @param None. + * @retval None. + */ +static void DMA_ControllerInit(void) +{ + g_dmac.baseAddress = DMA; + g_dmac.srcByteOrder = DMA_BYTEORDER_SMALLENDIAN; + g_dmac.destByteOrder = DMA_BYTEORDER_SMALLENDIAN; + g_dmac.irqNumTc = IRQ_DMA_TC; + g_dmac.irqNumError = IRQ_DMA_ERR; + HAL_DMA_Init(&g_dmac); +} + +/** + * @brief DMA interrupt initialization. + * @param handle DMA handle. + * @retval None. + */ +static void DMA_InterruptInit(DMA_Handle *handle) +{ + IRQ_Enable(); + handle->irqNumTc = IRQ_DMA_TC; + handle->irqNumError = IRQ_DMA_ERR; + HAL_DMA_IRQService(handle); + IRQ_EnableN(IRQ_DMA_TC); + IRQ_EnableN(IRQ_DMA_ERR); +} + +/** + * @brief User-defined callback function for completing the transfer of memory to the peripheral. + * @param handle callback handle. + * @retval None. + */ +static void DMA_MemToPeriFinish(void *handle) +{ + DBG_PRINTF("Interrupt Finish!\r\n"); + BASE_FUNC_UNUSED(handle); +} + +/** + * @brief DMA sample code for the transfer of memory to the peripheral. + * @param None. + * @retval None. + */ +int DMA_MemoryToPeriphIT(void) +{ + g_uartHandle.baseAddress = UART0; + g_uartHandle.baudRate = 115200; /* baud rate is 115200 */ + g_uartHandle.dataLength = UART_DATALENGTH_8BIT; + g_uartHandle.stopBits = UART_STOPBITS_ONE; + g_uartHandle.parity = UART_PARITY_NONE; + g_uartHandle.fifoMode = true; + g_uartHandle.fifoTxThr = UART_FIFOFULL_ONE_TWO; + g_uartHandle.fifoRxThr = UART_FIFOFULL_ONE_TWO; + g_uartHandle.hwFlowCtr = UART_HW_FLOWCTR_DISABLE; + HAL_UART_Init(&g_uartHandle); + + DBG_PRINTF("MemoryToPeriph Begin: \r\n"); + DBG_PRINTF("src_memory g_str1: %s\r\n", g_str1); + unsigned int channel = 3; /* select transfer channel 3 */ + DMA_ControllerInit(); + DMA_InterruptInit(&g_dmac); + HAL_DMA_RegisterCallback(&g_dmac, DMA_CHANNEL_FINISH, channel, DMA_MemToPeriFinish); + g_param.direction = DMA_MEMORY_TO_PERIPH_BY_DMAC; + g_param.srcAddrInc = DMA_ADDR_INCREASE; + g_param.destAddrInc = DMA_ADDR_UNALTERED; + g_param.destPeriph = DMA_REQUEST_UART0_TX; + g_param.srcWidth = DMA_TRANSWIDTH_BYTE; + g_param.destWidth = DMA_TRANSWIDTH_BYTE; + g_param.srcBurst = DMA_BURST_LENGTH_4; + g_param.destBurst = DMA_BURST_LENGTH_4; + g_param.pHandle = &g_uartHandle; + HAL_DMA_InitChannel(&g_dmac, &g_param, channel); + unsigned int ret; + ret = HAL_DMA_StartIT(&g_dmac, (uintptr_t)(void *)g_str1, (uintptr_t)(void *)&(g_uartHandle.baseAddress->UART_DR), + 6, channel); /* The transmission length is defined as 6 */ + if (ret == BASE_STATUS_ERROR) { + DBG_PRINTF("HAL_DMA_StartIT: BASE_STATUS_ERROR\r\n"); + } else { + g_uartHandle.baseAddress->UART_DMACR.BIT.txdmae = BASE_CFG_ENABLE; + DBG_PRINTF("HAL_DMA_StartIT: BASE_STATUS_OK\r\n"); + } + DBG_PRINTF("End:\r\n"); + return 0; +} \ No newline at end of file diff --git a/drivers_sample/dma/sample_dma_per_to_mem/inc/sample_dma_per_to_mem.h b/drivers_sample/dma/sample_dma_per_to_mem/inc/sample_dma_per_to_mem.h new file mode 100644 index 000000000..7265024ae --- /dev/null +++ b/drivers_sample/dma/sample_dma_per_to_mem/inc/sample_dma_per_to_mem.h @@ -0,0 +1,32 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_dma_per_to_mem.h + * @author MCU Driver Team + * @brief dma sample module. + * @details This file provides sample code for users to help use + * the data transfer function of the dma. + */ +#ifndef SAMPLE_DMA_PER_TO_MEM_H +#define SAMPLE_DMA_PER_TO_MEM_H + +#include "dma.h" +#include "debug.h" +#include "interrupt.h" + +int DMA_PeriphToMemoryIT(void); +#endif \ No newline at end of file diff --git a/drivers_sample/dma/sample_dma_per_to_mem/readme.md b/drivers_sample/dma/sample_dma_per_to_mem/readme.md new file mode 100644 index 000000000..042f64d13 --- /dev/null +++ b/drivers_sample/dma/sample_dma_per_to_mem/readme.md @@ -0,0 +1,18 @@ +# 配置DMA外设到内存传输,传输完成进入中断回调函数 +## 关键字: DMA, 外设到内存, 中断 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、中断和DMA控制器初始化和功能配置。从外设uart rx到内存,使用DMA搬运,搬运结束后触发DMA中断。 + +**【示例配置】** ++ “HAL_DMA_Init()”接口配置DMA源和目的大小端、中断进行初始化,“HAL_DMA_InitChannel()”进行通道初始化配置。 + ++ 将搬运的源端地址和目的端地址传入“HAL_DMA_StartIT()”接口,搬运的数据长度和DMA的通道号也作为入参传递进去,调用完成之后要发送uart rx DMA请求。 + ++ 当DMA传输完成,“DMA_PeriphToMemFinish()”中断回调函数中打印log,并且再次调用“HAL_DMA_StartIT()”接口进行下一次搬运,调用完成后发送uart rx DMA请求。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后。在串口助手上发送数据,DMA搬运结束后,会上报中断,在中断函数中打印传输完成log,查看数据是否正确。 + +**【注意事项】** ++ 如果要在串口助手上发送数据进行DMA搬运到内存,要设置外设为对应的uart串口。 \ No newline at end of file diff --git a/drivers_sample/dma/sample_dma_per_to_mem/src/sample_dma_per_to_mem.c b/drivers_sample/dma/sample_dma_per_to_mem/src/sample_dma_per_to_mem.c new file mode 100644 index 000000000..845fe8fdc --- /dev/null +++ b/drivers_sample/dma/sample_dma_per_to_mem/src/sample_dma_per_to_mem.c @@ -0,0 +1,128 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_dma_per_to_mem.c + * @author MCU Driver Team + * @brief dma sample module, peripheral-to-memory transfer. + * @details This file provides sample code for users to help use + * the data transfer function of the dma. + */ +#include "sample_dma_per_to_mem.h" + +#define NUM 10 +static UART_Handle g_uart; +static unsigned char g_str2[NUM] = {0}; +static DMA_Handle g_dmac; +static DMA_ChannelParam g_param; + +/** + * @brief DMA controller initialization. + * @param None. + * @retval None. + */ +static void DMA_ControllerInit(void) +{ + g_dmac.baseAddress = DMA; + g_dmac.srcByteOrder = DMA_BYTEORDER_SMALLENDIAN; + g_dmac.destByteOrder = DMA_BYTEORDER_SMALLENDIAN; + g_dmac.irqNumTc = IRQ_DMA_TC; + g_dmac.irqNumError = IRQ_DMA_ERR; + HAL_DMA_Init(&g_dmac); +} + +/** + * @brief DMA interrupt initialization. + * @param handle DMA handle. + * @retval None. + */ +static void DMA_InterruptInit(DMA_Handle *handle) +{ + IRQ_Enable(); + handle->irqNumTc = IRQ_DMA_TC; + handle->irqNumError = IRQ_DMA_ERR; + HAL_DMA_IRQService(handle); + IRQ_EnableN(IRQ_DMA_TC); + IRQ_EnableN(IRQ_DMA_ERR); +} + +/** + * @brief User-defined callback function for completing the transfer of peripheral to the memory. + * @param handle callback handle. + * @retval None. + */ +static void DMA_PeriphToMemFinish(void *handle) +{ + DMA_Handle *dmaHandle = (DMA_Handle *)handle; + DBG_PRINTF("Interrupt Finish!\r\n"); + DBG_PRINTF("g_str2:%s\r\n", g_str2); + DBG_PRINTF("Process channel: %d\r\n", dmaHandle->currentChannel); + unsigned int ret; + ret = HAL_DMA_StartIT(dmaHandle, (uintptr_t)(void *)&(g_uart.baseAddress->UART_DR), + (uintptr_t)(void *)g_str2, 8, dmaHandle->currentChannel); /* Transmission length is 8 */ + if (ret == BASE_STATUS_ERROR) { + DBG_PRINTF("HAL_DMA_StartIT: BASE_STATUS_ERROR\r\n"); + } else { + g_uart.baseAddress->UART_DMACR.BIT.rxdmae = BASE_CFG_ENABLE; + } +} + +/** + * @brief DMA sample code for the transfer of peripheral to the memory. + * @param None. + * @retval None. + */ +int DMA_PeriphToMemoryIT(void) +{ + g_uart.baseAddress = UART0; + g_uart.baudRate = 115200; /* baud rate is 115200 */ + g_uart.dataLength = UART_DATALENGTH_8BIT; + g_uart.stopBits = UART_STOPBITS_ONE; + g_uart.parity = UART_PARITY_NONE; + g_uart.fifoMode = true; + g_uart.fifoTxThr = UART_FIFOFULL_ONE_TWO; + g_uart.fifoRxThr = UART_FIFOFULL_ONE_TWO; + g_uart.hwFlowCtr = UART_HW_FLOWCTR_DISABLE; + g_uart.baseAddress = UART0; + HAL_UART_Init(&g_uart); + + DBG_PRINTF("PeriphToMemory Begin: \r\n"); + DBG_PRINTF("Please enter a string to the peripheral\r\n"); + unsigned int channel = 1; /* select transfer channel 1 */ + + DMA_ControllerInit(); + DMA_InterruptInit(&g_dmac); + HAL_DMA_RegisterCallback(&g_dmac, DMA_CHANNEL_FINISH, channel, DMA_PeriphToMemFinish); + g_param.direction = DMA_PERIPH_TO_MEMORY_BY_DMAC; + g_param.srcAddrInc = DMA_ADDR_UNALTERED; + g_param.destAddrInc = DMA_ADDR_INCREASE; + g_param.srcPeriph = DMA_REQUEST_UART0_RX; + g_param.srcWidth = DMA_TRANSWIDTH_BYTE; + g_param.destWidth = DMA_TRANSWIDTH_BYTE; + g_param.srcBurst = DMA_BURST_LENGTH_1; + g_param.destBurst = DMA_BURST_LENGTH_4; + g_param.pHandle = &g_dmac; + HAL_DMA_InitChannel(&g_dmac, &g_param, channel); + unsigned int ret; + ret = HAL_DMA_StartIT(&g_dmac, (uintptr_t)(void *)&(g_uart.baseAddress->UART_DR), + (uintptr_t)(void *)g_str2, 8, channel); /* The transmission length is defined as 8 */ + if (ret == BASE_STATUS_ERROR) { + DBG_PRINTF("HAL_DMA_StartIT: BASE_STATUS_ERROR\r\n"); + } else { + g_uart.baseAddress->UART_DMACR.BIT.rxdmae = BASE_CFG_ENABLE; + } + return 0; +} \ No newline at end of file diff --git a/drivers_sample/dma/sample_dma_per_to_per/inc/sample_dma_per_to_per.h b/drivers_sample/dma/sample_dma_per_to_per/inc/sample_dma_per_to_per.h new file mode 100644 index 000000000..3c4702407 --- /dev/null +++ b/drivers_sample/dma/sample_dma_per_to_per/inc/sample_dma_per_to_per.h @@ -0,0 +1,32 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_dma_per_to_per.h + * @author MCU Driver Team + * @brief dma sample module. + * @details This file provides sample code for users to help use + * the data transfer function of the dma. + */ +#ifndef SAMPLE_DMA_PER_TO_PER_H +#define SAMPLE_DMA_PER_TO_PER_H + +#include "dma.h" +#include "debug.h" +#include "interrupt.h" + +int DMA_PeriphToPeriphIT(void); +#endif \ No newline at end of file diff --git a/drivers_sample/dma/sample_dma_per_to_per/readme.md b/drivers_sample/dma/sample_dma_per_to_per/readme.md new file mode 100644 index 000000000..b5fd1d2f7 --- /dev/null +++ b/drivers_sample/dma/sample_dma_per_to_per/readme.md @@ -0,0 +1,18 @@ +# 配置DMA外设到外设传输,传输完成进入中断回调函数 +## 关键字: DMA, 外设到外设, 中断 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、中断和DMA控制器初始化和功能配置。从外设uart rx到uart tx ,使用DMA搬运,搬运结束后触发DMA中断。 + +**【示例配置】** ++ “HAL_DMA_Init()”接口配置DMA源和目的大小端、中断进行初始化,“HAL_DMA_InitChannel()”进行通道初始化配置。 + ++ 将搬运的源端地址和目的端地址传入“HAL_DMA_StartIT()”接口,搬运的数据长度和DMA的通道号也作为入参传递进去,调用完成之后要发送uart rx 和 uart tx DMA请求。 + ++ 当DMA传输完成,“DMA_PeriToPeriFinish()”中断回调函数中打印log。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后。在串口助手上发送数据,DMA搬运结束后,会上报中断,在中断函数中打印传输完成log,此时在另一个串口助手上显示搬运完成的数据。 + +**【注意事项】** ++ 如果要在串口助手上发送数据到另一个串口助手上显示数据,要设置外设为对应的uart串口,比如其中一个串口助手连接uart tx,一个串口助手连接uart rx。 \ No newline at end of file diff --git a/drivers_sample/dma/sample_dma_per_to_per/src/sample_dma_per_to_per.c b/drivers_sample/dma/sample_dma_per_to_per/src/sample_dma_per_to_per.c new file mode 100644 index 000000000..523b36d4f --- /dev/null +++ b/drivers_sample/dma/sample_dma_per_to_per/src/sample_dma_per_to_per.c @@ -0,0 +1,127 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_dma_per_to_per.c + * @author MCU Driver Team + * @brief dma sample module, peripheral-to-peripheral transfer. + * @details This file provides sample code for users to help use + * the data transfer function of the dma. + */ +#include "sample_dma_per_to_per.h" + +static UART_Handle g_uart1; +static UART_Handle g_uart0; +static DMA_Handle g_dmac; +static DMA_ChannelParam g_param; + +/** + * @brief DMA controller initialization. + * @param None. + * @retval None. + */ +static void DMA_ControllerInit(void) +{ + g_dmac.baseAddress = DMA; + g_dmac.srcByteOrder = DMA_BYTEORDER_SMALLENDIAN; + g_dmac.destByteOrder = DMA_BYTEORDER_SMALLENDIAN; + g_dmac.irqNumTc = IRQ_DMA_TC; + g_dmac.irqNumError = IRQ_DMA_ERR; + HAL_DMA_Init(&g_dmac); +} + +/** + * @brief DMA interrupt initialization. + * @param handle DMA handle. + * @retval None. + */ +static void DMA_InterruptInit(DMA_Handle *handle) +{ + IRQ_Enable(); + handle->irqNumTc = IRQ_DMA_TC; + handle->irqNumError = IRQ_DMA_ERR; + HAL_DMA_IRQService(handle); + IRQ_EnableN(IRQ_DMA_TC); + IRQ_EnableN(IRQ_DMA_ERR); +} + +/** + * @brief User-defined callback function for completing the transfer of peripheral to the peripheral. + * @param handle callback handle. + * @retval None. + */ +static void DMA_PeriToPeriFinish(void *handle) +{ + DBG_PRINTF("Interrupt Finish!\r\n"); + BASE_FUNC_UNUSED(handle); +} + +/** + * @brief DMA sample code for the transfer of peripheral to the peripheral. + * @param None. + * @retval None. + */ +int DMA_PeriphToPeriphIT(void) +{ + g_uart0.baseAddress = UART0; + g_uart0.baudRate = 115200; /* baud rate is 115200 */ + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.fifoMode = true; + g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.hwFlowCtr = UART_HW_FLOWCTR_DISABLE; + HAL_UART_Init(&g_uart0); + + g_uart1.baseAddress = UART1; + g_uart1.baudRate = 115200; /* baud rate is 115200 */ + g_uart1.dataLength = UART_DATALENGTH_8BIT; + g_uart1.stopBits = UART_STOPBITS_ONE; + g_uart1.parity = UART_PARITY_NONE; + g_uart1.fifoMode = true; + g_uart1.fifoTxThr = UART_FIFOFULL_ONE_TWO; + g_uart1.fifoRxThr = UART_FIFOFULL_ONE_TWO; + g_uart1.hwFlowCtr = UART_HW_FLOWCTR_DISABLE; + HAL_UART_Init(&g_uart1); + + DBG_PRINTF("PeriphToPeriph Begin: \r\n"); + unsigned int channel = 0; /* select transfer channel 0 */ + DMA_ControllerInit(); + DMA_InterruptInit(&g_dmac); + HAL_DMA_RegisterCallback(&g_dmac, DMA_CHANNEL_FINISH, channel, DMA_PeriToPeriFinish); + g_param.direction = DMA_PERIPH_TO_PERIPH_BY_DMAC; + g_param.srcAddrInc = DMA_ADDR_UNALTERED; + g_param.destAddrInc = DMA_ADDR_UNALTERED; + g_param.destPeriph = DMA_REQUEST_UART0_TX; + g_param.srcPeriph = DMA_REQUEST_UART1_RX; + g_param.srcWidth = DMA_TRANSWIDTH_BYTE; + g_param.destWidth = DMA_TRANSWIDTH_BYTE; + g_param.srcBurst = DMA_BURST_LENGTH_1; + g_param.destBurst = DMA_BURST_LENGTH_1; + g_param.pHandle = &g_dmac; + HAL_DMA_InitChannel(&g_dmac, &g_param, channel); + unsigned int ret; + ret = HAL_DMA_StartIT(&g_dmac, (uintptr_t)(void *)&(g_uart1.baseAddress->UART_DR), + (uintptr_t)(void *)&(g_uart0.baseAddress->UART_DR), 8, channel); /* Tx length is 8 */ + if (ret == BASE_STATUS_ERROR) { + DBG_PRINTF("HAL_DMA_StartIT: BASE_STATUS_ERROR\r\n"); + } else { + g_uart1.baseAddress->UART_DMACR.BIT.rxdmae = BASE_CFG_ENABLE; + g_uart0.baseAddress->UART_DMACR.BIT.txdmae = BASE_CFG_ENABLE; + } + return 0; +} \ No newline at end of file diff --git a/drivers_sample/flash/sample_flash_blocking/inc/sample_flash_blocking.h b/drivers_sample/flash/sample_flash_blocking/inc/sample_flash_blocking.h new file mode 100644 index 000000000..28a94c3af --- /dev/null +++ b/drivers_sample/flash/sample_flash_blocking/inc/sample_flash_blocking.h @@ -0,0 +1,29 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_flash_blocking.h + * @author MCU Driver Team + * @brief FLASH module sample. + * @details This file provides sample code for users to help use + * the functionalities of the FLASH. + */ +#ifndef McuMagicTag_SAMPLE_EFLASH_BLOCKING_H +#define McuMagicTag_SAMPLE_EFLASH_BLOCKING_H + +void FlashBlockingProcessing(void); + +#endif \ No newline at end of file diff --git a/drivers_sample/flash/sample_flash_blocking/init/main.c b/drivers_sample/flash/sample_flash_blocking/init/main.c new file mode 100644 index 000000000..0fbfd61e9 --- /dev/null +++ b/drivers_sample/flash/sample_flash_blocking/init/main.c @@ -0,0 +1,34 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ +#include "feature.h" +#include "main.h" +#include "sample_flash_blocking.h" + +UART_Handle g_uart0; + +int main(void) +{ + FlashBlockingProcessing(); + while (1) { + } + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/flash/sample_flash_blocking/init/main.h b/drivers_sample/flash/sample_flash_blocking/init/main.h new file mode 100644 index 000000000..e9b54f86f --- /dev/null +++ b/drivers_sample/flash/sample_flash_blocking/init/main.h @@ -0,0 +1,43 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +extern UART_Handle g_uart0; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/flash/sample_flash_blocking/init/system_init.c b/drivers_sample/flash/sample_flash_blocking/init/system_init.c new file mode 100644 index 000000000..12a1fff57 --- /dev/null +++ b/drivers_sample/flash/sample_flash_blocking/init/system_init.c @@ -0,0 +1,91 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); + + g_uart0.baseAddress = UART0; + g_uart0.irqNum = IRQ_UART0; + + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + IOConfig_RegStruct *iconfig = IOCONFIG; + + iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ + iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ + iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/flash/sample_flash_blocking/readme.md b/drivers_sample/flash/sample_flash_blocking/readme.md new file mode 100644 index 000000000..be9fffa7a --- /dev/null +++ b/drivers_sample/flash/sample_flash_blocking/readme.md @@ -0,0 +1,19 @@ +# 配置FLASH以阻塞方式进行擦除、写入,通过Debug串口打印读取的操作数据 +## 关键字: FLASH, 擦除,写入,读取,阻塞方式 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、FLASH控制器初始化和功能配置。通过阻塞方式对FLASH的PAGE 15区域进行擦除、写入操作,通过Debug串口打印读取的操作数据。 + +**【示例配置】** ++ FLASH操作内存选择:示例代码中选择了FLASH的PAGE 15区域进行操作,也可以选择其他FLASH的其它PAGE X进行操作。 + ++ FLASH初始化:调用接口"HAL_FLASH_Init()”完成对示例代码中FLASH的基地址、PE(擦除、写入方式)方式进行配置。 + ++ 操作FLASH PAGE 15进行擦除、写入、读取操作:通过调用 "HAL_FLASH_EraseBlocking()"接口以阻塞方式实现对目标页的擦除;通过调用"HAL_FLASH_WriteBlocking()"接口以阻塞方式实现将数据写入到目标页中;通过调用"HAL_FLASH_Read()"接口实现对目标页内容的读取。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码中会依次对FLASH的目标页进行擦除、写入、读取测试。功能正常时Debug串口打印成功log信息及读取的数据内容;功能异常时Debug串口打印失败log信息。 + +**【注意事项】** ++ 示例代码使用UART0进行结果打印输出,需要对UART0配置。 ++ 对FLASH进行擦除和写操作时需谨慎操作,避免对存放运行程序代码的分区进行擦、写操作,否则会导致运行出错。 \ No newline at end of file diff --git a/drivers_sample/flash/sample_flash_blocking/src/sample_flash_blocking.c b/drivers_sample/flash/sample_flash_blocking/src/sample_flash_blocking.c new file mode 100644 index 000000000..19c18b036 --- /dev/null +++ b/drivers_sample/flash/sample_flash_blocking/src/sample_flash_blocking.c @@ -0,0 +1,95 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_flash_blocking.c + * @author MCU Driver Team + * @brief Sample for Flash Module Blocking. + * @details This file provides sample code for users to operate the flash memory in blocking mode. + * This example code operates on page15 of the flash memory. (Be careful when performing the flash erasing + * operation to avoid damaging the running program code). + * This sample code demonstrates how to use the module initialization, read, write, and erase interfaces by + * operating on page 15 of the flash memory. The operation data is printed and output through the serial port. + */ +#include "main.h" +#include "flash.h" +#include "debug.h" +#include "sample_flash_blocking.h" + +#define FLASH_TEMP_DATA_SIZE 4096 + +#define FLASH_SAMPLE_ERASE_NUM 1 /* Number of flash pages erased at a time */ +#define FLASH_SAMPLE_ERASE_START_ADDR FLASH_PAGE_9 /* The erase address must be 8k aligned. */ +#define FLASH_SAMPLE_READ_START_ADDR FLASH_PAGE_9 /* The read address must be byte-aligned. */ +#define FLASH_SAMPLE_WRITE_START_ADDR FLASH_PAGE_9 /* The write address must be 16-byte aligned. */ + +static FLASH_Handle g_flashBlockingHandle; +static unsigned char g_tempData[FLASH_TEMP_DATA_SIZE] = {0}; + +/** + * @brief Flash bloccking sample init. + * @param None + * @retval None + */ +static void FlashBlockingInit(void) +{ + g_flashBlockingHandle.baseAddress = EFC; + g_flashBlockingHandle.peMode = FLASH_PE_OP_BLOCK; + HAL_FLASH_Init(&g_flashBlockingHandle); +} + +/** + * @brief Flash bloccking sample processing. + * @param None + * @retval None + */ +void FlashBlockingProcessing(void) +{ + BASE_StatusType ret; + unsigned char dataBuff[FLASH_TEMP_DATA_SIZE + 1] = {0}; + + SystemInit(); + FlashBlockingInit(); + for (unsigned int i = 0 ; i < FLASH_TEMP_DATA_SIZE; i++) { + g_tempData[i] = 0xA5; + } + + ret = HAL_FLASH_EraseBlocking(&g_flashBlockingHandle, FLASH_ERASE_MODE_PAGE, + FLASH_SAMPLE_ERASE_START_ADDR, FLASH_SAMPLE_ERASE_NUM); + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("Erase:0x%x fail\r\n ", FLASH_SAMPLE_ERASE_START_ADDR); + } + + ret = HAL_FLASH_WriteBlocking(&g_flashBlockingHandle, (uintptr_t)g_tempData, + FLASH_SAMPLE_WRITE_START_ADDR, FLASH_TEMP_DATA_SIZE); + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("Write:0x%x fail\r\n ", FLASH_SAMPLE_WRITE_START_ADDR); + } + + ret = HAL_FLASH_Read(&g_flashBlockingHandle, FLASH_SAMPLE_READ_START_ADDR, FLASH_TEMP_DATA_SIZE, + dataBuff, FLASH_TEMP_DATA_SIZE); + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("Read:0x%x fail\r\n ", FLASH_TEMP_DATA_SIZE); + } + DBG_PRINTF("read addr :0x%x \r\n ", FLASH_SAMPLE_READ_START_ADDR); + for (unsigned int i = 0; i < FLASH_TEMP_DATA_SIZE; i++) { + DBG_PRINTF("%x ", dataBuff[i]); + } + DBG_PRINTF("\r\n"); + while (1) { + ; + } +} \ No newline at end of file diff --git a/drivers_sample/flash/sample_flash_blocking_mode/inc/sample_flash_blocking_mode.h b/drivers_sample/flash/sample_flash_blocking_mode/inc/sample_flash_blocking_mode.h new file mode 100644 index 000000000..34b203a44 --- /dev/null +++ b/drivers_sample/flash/sample_flash_blocking_mode/inc/sample_flash_blocking_mode.h @@ -0,0 +1,29 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_flash_blocking_mode.h + * @author MCU Driver Team + * @brief FLASH module sample. + * @details This file provides sample code for users to help use + * the functionalities of the FLASH. + */ +#ifndef McuMagicTag_SAMPLE_EFLASH_BLOCKING_MODE_H +#define McuMagicTag_SAMPLE_EFLASH_BLOCKING_MODE_H + +void FlashBlockingProcessing(void); + +#endif \ No newline at end of file diff --git a/drivers_sample/flash/sample_flash_blocking_mode/init/main.c b/drivers_sample/flash/sample_flash_blocking_mode/init/main.c new file mode 100644 index 000000000..f3372a5f2 --- /dev/null +++ b/drivers_sample/flash/sample_flash_blocking_mode/init/main.c @@ -0,0 +1,51 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ + +#include "typedefs.h" +#include "feature.h" +#include "sample_flash_blocking_mode.h" +#include "main.h" + +/* USER CODE BEGIN 0 */ +/* USER CODE END 0 */ +UART_Handle g_uart0; +/* USER CODE BEGIN 1 */ +/* USER CODE END 1 */ + +int main(void) +{ + /* USER CODE BEGIN 2 */ + /* USER CODE END 2 */ + FlashBlockingProcessing(); + /* USER CODE BEGIN 3 */ + /* USER CODE END 3 */ + while (1) { + /* USER CODE BEGIN 4 */ + /* USER CODE END 4 */ + } + /* USER CODE BEGIN 5 */ + /* USER CODE END 5 */ + return BASE_STATUS_OK; +} + +/* USER CODE BEGIN 6 */ +/* USER CODE END 6 */ \ No newline at end of file diff --git a/drivers_sample/flash/sample_flash_blocking_mode/init/main.h b/drivers_sample/flash/sample_flash_blocking_mode/init/main.h new file mode 100644 index 000000000..4d9eb3456 --- /dev/null +++ b/drivers_sample/flash/sample_flash_blocking_mode/init/main.h @@ -0,0 +1,48 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define XTAL_DRV_LEVEL4 0x03U +#define XTAL_DRV_LEVEL3 0x02U +#define XTAL_DRV_LEVEL2 0x01U +#define XTAL_DRV_LEVEL1 0x00U + +extern UART_Handle g_uart0; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/flash/sample_flash_blocking_mode/init/system_init.c b/drivers_sample/flash/sample_flash_blocking_mode/init/system_init.c new file mode 100644 index 000000000..85672d703 --- /dev/null +++ b/drivers_sample/flash/sample_flash_blocking_mode/init/system_init.c @@ -0,0 +1,95 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" +#include "iocmg_ip.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + /* Clock-related parameter configuration. */ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_1; + + /* Initialize the clock configuration. */ + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); + /* UART-related parameter configuration. */ + g_uart0.baseAddress = UART0; + + g_uart0.baudRate = UART0_BAND_RATE; /* Setting the UART Baud Rate. */ + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; /* Disable uart fifo mode. */ + g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; + g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; + /* Initializing the UART0. */ + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/flash/sample_flash_blocking_mode/readme.md b/drivers_sample/flash/sample_flash_blocking_mode/readme.md new file mode 100644 index 000000000..63ca3f06f --- /dev/null +++ b/drivers_sample/flash/sample_flash_blocking_mode/readme.md @@ -0,0 +1,19 @@ +# 配置FLASH以阻塞方式进行擦除、写入,通过Debug串口打印读取的操作数据 +## 关键字: FLASH, 擦除,写入,读取,阻塞方式 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、FLASH控制器初始化和功能配置。通过阻塞方式对FLASH的PAGE 58-61区域进行擦除、写入操作,通过Debug串口打印读取的操作数据。 + +**【示例配置】** ++ FLASH操作内存选择:示例代码中选择了FLASH的PAGE 58-61区域进行操作,也可以选择其他FLASH的其它PAGE X进行操作。 + ++ FLASH初始化:调用接口"HAL_GPIO_Init()”完成对示例代码中FLASH的基地址、PE(擦除、写入方式)方式进行配置。 + ++ 操作FLASH PAGE 58-61进行擦除、写入、读取操作:通过调用 "HAL_FLASH_EraseBlocking()"接口以阻塞方式实现对目标页的擦除;通过调用"HAL_FLASH_WriteBlocking()"接口以阻塞方式实现将数据写入到目标页中;通过调用"HAL_FLASH_Read()"接口实现对目标页内容的读取。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码中会依次对FLASH的目标页进行擦除、写入、读取测试。功能正常时Debug串口打印成功log信息及读取的数据内容;功能异常时Debug串口打印失败log信息。 + +**【注意事项】** ++ 示例代码使用UART0进行结果打印输出,需要对UART0配置。 ++ 对FLASH进行擦除和写操作时需谨慎操作,避免对存放运行程序代码的分区进行擦、写操作,否则会导致运行出错。 \ No newline at end of file diff --git a/drivers_sample/flash/sample_flash_blocking_mode/src/sample_flash_blocking_mode.c b/drivers_sample/flash/sample_flash_blocking_mode/src/sample_flash_blocking_mode.c new file mode 100644 index 000000000..57e1f2b19 --- /dev/null +++ b/drivers_sample/flash/sample_flash_blocking_mode/src/sample_flash_blocking_mode.c @@ -0,0 +1,95 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_flash_blocking_mode.c + * @author MCU Driver Team + * @brief Sample for Flash Module Blocking. + * @details This file provides sample code for users to operate the flash memory in blocking mode. + * This example code operates on page58-page61 of the flash memory. (Be careful when + * performing the flash erasing operation to avoid damaging the running program code). + * This sample code demonstrates how to use the module initialization, read, write, and erase interfaces by + * operating on page58-page61 of the flash memory. The operation data is printed + * and output through the serial port. + */ +#include "main.h" +#include "flash.h" +#include "debug.h" +#include "sample_flash_blocking_mode.h" + +#define FLASH_TEMP_DATA_SIZE 4096 + +#define FLASH_SAMPLE_ERASE_NUM 4 /* Number of flash pages erased at a time */ +#define FLASH_SAMPLE_ERASE_START_ADDR FLASH_PAGE_58 /* The erase address must be 1k aligned. */ +#define FLASH_SAMPLE_READ_START_ADDR FLASH_PAGE_58 /* The read address must be byte-aligned. */ +#define FLASH_SAMPLE_WRITE_START_ADDR FLASH_PAGE_58 /* The write address must be 16-byte aligned. */ + +static FLASH_Handle g_flashBlockingHandle; +static unsigned char g_tempData[FLASH_TEMP_DATA_SIZE] = {0}; + +/** + * @brief Flash bloccking sample init. + * @param None + * @retval None + */ +static void FlashBlockingInit(void) +{ + g_flashBlockingHandle.baseAddress = EFC; + g_flashBlockingHandle.peMode = FLASH_PE_OP_BLOCK; + HAL_FLASH_Init(&g_flashBlockingHandle); +} + +/** + * @brief Flash bloccking sample processing. + * @param None + * @retval None + */ +void FlashBlockingProcessing(void) +{ + BASE_StatusType ret; + unsigned char dataBuff[FLASH_TEMP_DATA_SIZE + 1] = {0}; + + SystemInit(); + FlashBlockingInit(); + /* Configure data to be written. */ + for (unsigned int i = 0 ; i < FLASH_TEMP_DATA_SIZE; i++) { + g_tempData[i] = 0xA5; + } + /* Perform the erase operation. */ + ret = HAL_FLASH_EraseBlocking(&g_flashBlockingHandle, FLASH_ERASE_MODE_PAGE, + FLASH_SAMPLE_ERASE_START_ADDR, FLASH_SAMPLE_ERASE_NUM); + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("Erase:0x%x fail\r\n ", FLASH_SAMPLE_ERASE_START_ADDR); + } + /* Perform the programe operation. */ + ret = HAL_FLASH_WriteBlocking(&g_flashBlockingHandle, (uintptr_t)g_tempData, + FLASH_SAMPLE_WRITE_START_ADDR, FLASH_TEMP_DATA_SIZE); + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("Write:0x%x fail\r\n ", FLASH_SAMPLE_WRITE_START_ADDR); + } + /* Perform the read operation. */ + ret = HAL_FLASH_Read(&g_flashBlockingHandle, FLASH_SAMPLE_READ_START_ADDR, FLASH_TEMP_DATA_SIZE, + dataBuff, FLASH_TEMP_DATA_SIZE); + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("Read:0x%x fail\r\n ", FLASH_TEMP_DATA_SIZE); + } + DBG_PRINTF("read addr :0x%x \r\n ", FLASH_SAMPLE_READ_START_ADDR); + for (unsigned int i = 0; i < FLASH_TEMP_DATA_SIZE; i++) { + DBG_PRINTF("%x ", dataBuff[i]); + } + DBG_PRINTF("\r\n"); + return; +} \ No newline at end of file diff --git a/drivers_sample/flash/sample_flash_interrupt/inc/sample_flash_interrupt.h b/drivers_sample/flash/sample_flash_interrupt/inc/sample_flash_interrupt.h new file mode 100644 index 000000000..273426f7b --- /dev/null +++ b/drivers_sample/flash/sample_flash_interrupt/inc/sample_flash_interrupt.h @@ -0,0 +1,29 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_flash_interrupt.h + * @author MCU Driver Team + * @brief FLASH module sample. + * @details This file provides sample code for users to help use + * the functionalities of the FLASH. + */ +#ifndef McuMagicTag_SAMPLE_EFLASH_INTERRUPT_H +#define McuMagicTag_SAMPLE_EFLASH_INTERRUPT_H + +void FlashInterruptProcessing(void); + +#endif \ No newline at end of file diff --git a/drivers_sample/flash/sample_flash_interrupt/init/main.c b/drivers_sample/flash/sample_flash_interrupt/init/main.c new file mode 100644 index 000000000..c81f9dae8 --- /dev/null +++ b/drivers_sample/flash/sample_flash_interrupt/init/main.c @@ -0,0 +1,34 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ +#include "feature.h" +#include "main.h" +#include "sample_flash_interrupt.h" + +UART_Handle g_uart0; + +int main(void) +{ + FlashInterruptProcessing(); + while (1) { + } + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/flash/sample_flash_interrupt/init/main.h b/drivers_sample/flash/sample_flash_interrupt/init/main.h new file mode 100644 index 000000000..e9b54f86f --- /dev/null +++ b/drivers_sample/flash/sample_flash_interrupt/init/main.h @@ -0,0 +1,43 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +extern UART_Handle g_uart0; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/flash/sample_flash_interrupt/init/system_init.c b/drivers_sample/flash/sample_flash_interrupt/init/system_init.c new file mode 100644 index 000000000..12a1fff57 --- /dev/null +++ b/drivers_sample/flash/sample_flash_interrupt/init/system_init.c @@ -0,0 +1,91 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); + + g_uart0.baseAddress = UART0; + g_uart0.irqNum = IRQ_UART0; + + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + IOConfig_RegStruct *iconfig = IOCONFIG; + + iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ + iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ + iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/flash/sample_flash_interrupt/readme.md b/drivers_sample/flash/sample_flash_interrupt/readme.md new file mode 100644 index 000000000..724032ac9 --- /dev/null +++ b/drivers_sample/flash/sample_flash_interrupt/readme.md @@ -0,0 +1,19 @@ +# 配置FLASH以中断方式进行擦除、写入,通过Debug串口打印读取操作数据 +## 关键字: FLASH, 擦除,写入,读取,中断方式 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、FLASH控制器初始化和功能配置。通过中断方式对FLASH的PAGE 15区域进行擦除、写入,通过Debug串口打印读取的操作数据。 + +**【示例配置】** ++ FLASH操作内存选择:示例代码中选择了FLASH的PAGE 15区域进行操作,也可以选择其他FLASH的其它PAGE X进行操作。 + ++ FLASH初始化:调用接口"HAL_FLASH_Init()”完成对示例代码中FLASH的基地址、PE(擦除、写入方式)方式、回调函数、中断号进行配置。 + ++ 操作FLASH PAGE 15进行擦除、写入、读取操作:通过调用 "HAL_FLASH_EraseIT()"接口以中断方式实现对目标页的擦除;通过调用"HAL_FLASH_WriteIT()"接口以中断方式实现将数据写入到目标页中;通过调用"HAL_FLASH_Read()"接口实现对目标页内容的读取。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码中会依次对FLASH的目标页进行擦除、写入、读取测试。功能正常时Debug串口打印成功log信息及读取的数据内容;功能异常时Debug串口打印失败log信息。 + +**【注意事项】** ++ 示例代码使用UART0进行结果打印输出,需要对UART0配置。 ++ 对FLASH进行擦除和写操作时需谨慎操作,避免对存放运行程序代码的分区进行擦、写操作,否则会导致运行出错。 \ No newline at end of file diff --git a/drivers_sample/flash/sample_flash_interrupt/src/sample_flash_interrupt.c b/drivers_sample/flash/sample_flash_interrupt/src/sample_flash_interrupt.c new file mode 100644 index 000000000..04afe1926 --- /dev/null +++ b/drivers_sample/flash/sample_flash_interrupt/src/sample_flash_interrupt.c @@ -0,0 +1,149 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_flash_interrupt.c + * @author MCU Driver Team + * @brief Sample for Flash Module Interrupt. + * @details This file provides sample code for users to operate the flash memory in Interrupt mode. + * This example code operates on page15 of the flash memory. (Be careful when performing the flash erasing + * operation to avoid damaging the running program code). + * This sample code demonstrates how to use the module initialization, read, write, and erase interfaces by + * operating on page 15 of the flash memory. The operation data is printed and output through the serial port. + */ +#include "main.h" +#include "flash.h" +#include "debug.h" +#include "sample_flash_interrupt.h" + +#define FLASH_SAMPLE_FLAG_UNSET 0 +#define FLASH_SAMPLE_FLAG_SET 1 + +#define FLASH_TEMP_DATA_SIZE 4096 + +#define FLASH_SAMPLE_ERASE_NUM 1 /* Number of flash pages erased at a time */ +#define FLASH_SAMPLE_ERASE_START_ADDR FLASH_PAGE_9 /* The erase address must be 8k aligned. */ +#define FLASH_SAMPLE_READ_START_ADDR FLASH_PAGE_9 /* The read address must be byte-aligned. */ +#define FLASH_SAMPLE_WRITE_START_ADDR FLASH_PAGE_9 /* The write address must be 16-byte aligned. */ + +static FLASH_Handle g_flashInterruptHandle; +static unsigned char g_tempData[FLASH_TEMP_DATA_SIZE] = {0}; +static volatile unsigned int g_eraseDoneFlag = FLASH_SAMPLE_FLAG_UNSET; +static volatile unsigned int g_writeDoneFlag = FLASH_SAMPLE_FLAG_UNSET; + +/** + * @brief Flash interrupt sample handle. + * @param handle Flash handle. + * @param event Flash callback event. + * @param opAddr Current operation address. + * @retval None + */ +static void FlashInterruptHandle(void *handle, FLASH_CallBackEvent event, unsigned int opAddr) +{ + BASE_FUNC_UNUSED(handle); + switch (event) { + case FLASH_WRITE_EVENT_SUCCESS : /* One-time write success callback. */ + DBG_PRINTF("write success \r\n 0x%x \r\n", opAddr); + break; + case FLASH_WRITE_EVENT_DONE : /* All content is written. */ + g_writeDoneFlag = FLASH_SAMPLE_FLAG_SET; + DBG_PRINTF("write done \r\n"); + break; + case FLASH_WRITE_EVENT_FAIL : /* Write failed. */ + DBG_PRINTF("wtite failed\r\n 0x%x \r\n", opAddr); + break; + case FLASH_ERASE_EVENT_SUCCESS : /* One-time erase success callback. */ + DBG_PRINTF("erase success \r\n 0x%x \r\n", opAddr); + break; + case FLASH_ERASE_EVENT_DONE: /* All erase operations are complete. */ + g_eraseDoneFlag = FLASH_SAMPLE_FLAG_SET; + DBG_PRINTF("erase done \r\n"); + break; + case FLASH_ERASE_EVENT_FAIL : /* Erase failed. */ + DBG_PRINTF("erase failed\r\n 0x%x \r\n", opAddr); + break; + default : + break; + } +} + +/** + * @brief Flash interrupt sample init. + * @param None + * @retval None + */ +static void FlashInterruptInit(void) +{ + g_flashInterruptHandle.baseAddress = EFC; + g_flashInterruptHandle.peMode = FLASH_PE_OP_IT; + HAL_FLASH_Init(&g_flashInterruptHandle); + HAL_FLASH_RegisterCallback(&g_flashInterruptHandle, FlashInterruptHandle); + + IRQ_Register(IRQ_EFC, HAL_FLASH_IrqHandler, &g_flashInterruptHandle); + IRQ_Register(IRQ_EFC_ERR, HAL_FLASH_IrqHandlerError, &g_flashInterruptHandle); + IRQ_SetPriority(IRQ_EFC_ERR, 1); /* set flash interrupt priority to 1 */ + IRQ_SetPriority(IRQ_EFC, 1); /* set flash interrupt priority to 1 */ + IRQ_EnableN(IRQ_EFC); + IRQ_EnableN(IRQ_EFC_ERR); +} + +/** + * @brief Flash interrupt sample processing. + * @param None + * @retval None + */ +void FlashInterruptProcessing(void) +{ + BASE_StatusType ret; + unsigned char dataBuff[FLASH_TEMP_DATA_SIZE + 1] = {0}; + + SystemInit(); + FlashInterruptInit(); + for (unsigned int i = 0 ; i < FLASH_TEMP_DATA_SIZE; i++) { + g_tempData[i] = 0x5A; + } + + ret = HAL_FLASH_EraseIT(&g_flashInterruptHandle, FLASH_ERASE_MODE_PAGE, + FLASH_SAMPLE_ERASE_START_ADDR, FLASH_SAMPLE_ERASE_NUM); + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("Erase:0x%x fail\r\n ", FLASH_SAMPLE_ERASE_START_ADDR); + } + while (g_eraseDoneFlag == FLASH_SAMPLE_FLAG_UNSET) { + ; + } + + ret = HAL_FLASH_WriteIT(&g_flashInterruptHandle, (uintptr_t)g_tempData, + FLASH_SAMPLE_WRITE_START_ADDR, FLASH_TEMP_DATA_SIZE); + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("Write:0x%x fail\r\n ", FLASH_SAMPLE_WRITE_START_ADDR); + } + while (g_writeDoneFlag == FLASH_SAMPLE_FLAG_UNSET) { + ; + } + ret = HAL_FLASH_Read(&g_flashInterruptHandle, FLASH_SAMPLE_READ_START_ADDR, FLASH_TEMP_DATA_SIZE, + dataBuff, FLASH_TEMP_DATA_SIZE); + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("Read:0x%x fail\r\n ", FLASH_TEMP_DATA_SIZE); + } + DBG_PRINTF("read addr :0x%x \r\n ", FLASH_SAMPLE_READ_START_ADDR); + for (unsigned int i = 0; i < FLASH_TEMP_DATA_SIZE; i++) { + DBG_PRINTF("%x ", dataBuff[i]); + } + DBG_PRINTF("\r\n"); + while (1) { + ; + } +} \ No newline at end of file diff --git a/drivers_sample/flash/sample_flash_interrupt_mode/inc/sample_flash_interrupt_mode.h b/drivers_sample/flash/sample_flash_interrupt_mode/inc/sample_flash_interrupt_mode.h new file mode 100644 index 000000000..8ae6d5609 --- /dev/null +++ b/drivers_sample/flash/sample_flash_interrupt_mode/inc/sample_flash_interrupt_mode.h @@ -0,0 +1,29 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_flash_interrupt_mode.h + * @author MCU Driver Team + * @brief FLASH module sample. + * @details This file provides sample code for users to help use + * the functionalities of the FLASH. + */ +#ifndef McuMagicTag_SAMPLE_EFLASH_INTERRUPT_MODE_H +#define McuMagicTag_SAMPLE_EFLASH_INTERRUPT_MODE_H + +void FlashInterruptProcessing(void); + +#endif \ No newline at end of file diff --git a/drivers_sample/flash/sample_flash_interrupt_mode/init/main.c b/drivers_sample/flash/sample_flash_interrupt_mode/init/main.c new file mode 100644 index 000000000..4b521d02a --- /dev/null +++ b/drivers_sample/flash/sample_flash_interrupt_mode/init/main.c @@ -0,0 +1,51 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ + +#include "typedefs.h" +#include "feature.h" +#include "sample_flash_interrupt_mode.h" +#include "main.h" + +/* USER CODE BEGIN 0 */ +/* USER CODE END 0 */ +UART_Handle g_uart0; +/* USER CODE BEGIN 1 */ +/* USER CODE END 1 */ + +int main(void) +{ + /* USER CODE BEGIN 2 */ + /* USER CODE END 2 */ + FlashInterruptProcessing(); + /* USER CODE BEGIN 3 */ + /* USER CODE END 3 */ + while (1) { + /* USER CODE BEGIN 4 */ + /* USER CODE END 4 */ + } + /* USER CODE BEGIN 5 */ + /* USER CODE END 5 */ + return BASE_STATUS_OK; +} + +/* USER CODE BEGIN 6 */ +/* USER CODE END 6 */ \ No newline at end of file diff --git a/drivers_sample/flash/sample_flash_interrupt_mode/init/main.h b/drivers_sample/flash/sample_flash_interrupt_mode/init/main.h new file mode 100644 index 000000000..4d9eb3456 --- /dev/null +++ b/drivers_sample/flash/sample_flash_interrupt_mode/init/main.h @@ -0,0 +1,48 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define XTAL_DRV_LEVEL4 0x03U +#define XTAL_DRV_LEVEL3 0x02U +#define XTAL_DRV_LEVEL2 0x01U +#define XTAL_DRV_LEVEL1 0x00U + +extern UART_Handle g_uart0; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/flash/sample_flash_interrupt_mode/init/system_init.c b/drivers_sample/flash/sample_flash_interrupt_mode/init/system_init.c new file mode 100644 index 000000000..76d16b56d --- /dev/null +++ b/drivers_sample/flash/sample_flash_interrupt_mode/init/system_init.c @@ -0,0 +1,94 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" +#include "iocmg_ip.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + /* Clock-related parameter configuration. */ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_1; + /* Initialize the clock configuration. */ + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); + /* UART-related parameter configuration. */ + g_uart0.baseAddress = UART0; + + g_uart0.baudRate = UART0_BAND_RATE; /* Setting the UART Baud Rate. */ + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; /* Disable uart fifo mode. */ + g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; + g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; + /* Initializing the UART0. */ + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/flash/sample_flash_interrupt_mode/readme.md b/drivers_sample/flash/sample_flash_interrupt_mode/readme.md new file mode 100644 index 000000000..ab52ee138 --- /dev/null +++ b/drivers_sample/flash/sample_flash_interrupt_mode/readme.md @@ -0,0 +1,19 @@ +# 配置FLASH以中断方式进行擦除、写入,通过Debug串口打印读取操作数据 +## 关键字: FLASH, 擦除,写入,读取,中断方式 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、FLASH控制器初始化和功能配置。通过中断方式对FLASH的PAGE 58-61区域进行擦除、写入,通过Debug串口打印读取的操作数据。 + +**【示例配置】** ++ FLASH操作内存选择:示例代码中选择了FLASH的PAGE 58-61区域进行操作,也可以选择其他FLASH的其它PAGE X进行操作。 + ++ FLASH初始化:调用接口"HAL_GPIO_Init()”完成对示例代码中FLASH的基地址、PE(擦除、写入方式)方式、回调函数、中断号进行配置。 + ++ 操作FLASH PAGE 58-61进行擦除、写入、读取操作:通过调用 "HAL_FLASH_EraseIT()"接口以中断方式实现对目标页的擦除;通过调用"HAL_FLASH_WriteIT()"接口以中断方式实现将数据写入到目标页中;通过调用"HAL_FLASH_Read()"接口实现对目标页内容的读取。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码中会依次对FLASH的目标页进行擦除、写入、读取测试。功能正常时Debug串口打印成功log信息及读取的数据内容;功能异常时Debug串口打印失败log信息。 + +**【注意事项】** ++ 示例代码使用UART0进行结果打印输出,需要对UART0配置。 ++ 对FLASH进行擦除和写操作时需谨慎操作,避免对存放运行程序代码的分区进行擦、写操作,否则会导致运行出错。 \ No newline at end of file diff --git a/drivers_sample/flash/sample_flash_interrupt_mode/src/sample_flash_interrupt_mode.c b/drivers_sample/flash/sample_flash_interrupt_mode/src/sample_flash_interrupt_mode.c new file mode 100644 index 000000000..e2656c49f --- /dev/null +++ b/drivers_sample/flash/sample_flash_interrupt_mode/src/sample_flash_interrupt_mode.c @@ -0,0 +1,151 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_flash_interrupt_mode.c + * @author MCU Driver Team + * @brief Sample for Flash Module Interrupt. + * @details This file provides sample code for users to operate the flash memory in Interrupt mode. + * This example code operates on page58-page61 of the flash memory. (Be careful when + * performing the flash erasing operation to avoid damaging the running program code). + * This sample code demonstrates how to use the module initialization, read, write, and erase interfaces by + * operating on page58-page61 of the flash memory. The operation data is printed + * and output through the serial port. + */ +#include "main.h" +#include "flash.h" +#include "debug.h" +#include "sample_flash_interrupt_mode.h" + +#define FLASH_SAMPLE_FLAG_UNSET 0 +#define FLASH_SAMPLE_FLAG_SET 1 + +#define FLASH_TEMP_DATA_SIZE 4096 + +#define FLASH_SAMPLE_ERASE_NUM 4 /* Number of flash pages erased at a time */ +#define FLASH_SAMPLE_ERASE_START_ADDR FLASH_PAGE_58 /* The erase address must be 1k aligned. */ +#define FLASH_SAMPLE_READ_START_ADDR FLASH_PAGE_58 /* The read address must be byte-aligned. */ +#define FLASH_SAMPLE_WRITE_START_ADDR FLASH_PAGE_58 /* The write address must be 16-byte aligned. */ + +static FLASH_Handle g_flashInterruptHandle; +static unsigned char g_tempData[FLASH_TEMP_DATA_SIZE] = {0}; +static volatile unsigned int g_eraseDoneFlag = FLASH_SAMPLE_FLAG_UNSET; +static volatile unsigned int g_writeDoneFlag = FLASH_SAMPLE_FLAG_UNSET; + +/** + * @brief Flash interrupt sample handle. + * @param handle Flash handle. + * @param event Flash callback event. + * @param opAddr Current operation address. + * @retval None + */ +static void FlashInterruptHandle(void *handle, FLASH_CallBackEvent event, unsigned int opAddr) +{ + BASE_FUNC_UNUSED(handle); + switch (event) { + case FLASH_WRITE_EVENT_SUCCESS : /* One-time write success callback. */ + DBG_PRINTF("write success \r\n 0x%x \r\n", opAddr); + break; + case FLASH_WRITE_EVENT_DONE : /* All content is written. */ + g_writeDoneFlag = FLASH_SAMPLE_FLAG_SET; + DBG_PRINTF("write done \r\n"); + break; + case FLASH_WRITE_EVENT_FAIL : /* Write failed. */ + DBG_PRINTF("wtite failed\r\n 0x%x \r\n", opAddr); + break; + case FLASH_ERASE_EVENT_SUCCESS : /* One-time erase success callback. */ + DBG_PRINTF("erase success \r\n 0x%x \r\n", opAddr); + break; + case FLASH_ERASE_EVENT_DONE: /* All erase operations are complete. */ + g_eraseDoneFlag = FLASH_SAMPLE_FLAG_SET; + DBG_PRINTF("erase done \r\n"); + break; + case FLASH_ERASE_EVENT_FAIL : /* Erase failed. */ + DBG_PRINTF("erase failed\r\n 0x%x \r\n", opAddr); + break; + default : + break; + } +} + +/** + * @brief Flash interrupt sample init. + * @param None + * @retval None + */ +static void FlashInterruptInit(void) +{ + g_flashInterruptHandle.baseAddress = EFC; + g_flashInterruptHandle.peMode = FLASH_PE_OP_IT; + HAL_FLASH_Init(&g_flashInterruptHandle); + HAL_FLASH_RegisterCallback(&g_flashInterruptHandle, FlashInterruptHandle); + + IRQ_Register(IRQ_EFC, HAL_FLASH_IrqHandler, &g_flashInterruptHandle); + IRQ_Register(IRQ_EFC_ERR, HAL_FLASH_IrqHandlerError, &g_flashInterruptHandle); + IRQ_SetPriority(IRQ_EFC_ERR, 1); /* set gpio1 interrupt priority to 1, 1~15 */ + IRQ_SetPriority(IRQ_EFC, 1); /* set gpio1 interrupt priority to 1, 1~15 */ + IRQ_EnableN(IRQ_EFC); + IRQ_EnableN(IRQ_EFC_ERR); +} + +/** + * @brief Flash interrupt sample processing. + * @param None + * @retval None + */ +void FlashInterruptProcessing(void) +{ + BASE_StatusType ret; + unsigned char dataBuff[FLASH_TEMP_DATA_SIZE + 1] = {0}; + + SystemInit(); + FlashInterruptInit(); + /* Configure data to be written. */ + for (unsigned int i = 0 ; i < FLASH_TEMP_DATA_SIZE; i++) { + g_tempData[i] = 0x5A; + } + /* Perform the erase operation. */ + ret = HAL_FLASH_EraseIT(&g_flashInterruptHandle, FLASH_ERASE_MODE_PAGE, + FLASH_SAMPLE_ERASE_START_ADDR, FLASH_SAMPLE_ERASE_NUM); + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("Erase:0x%x fail\r\n ", FLASH_SAMPLE_ERASE_START_ADDR); + } + while (g_eraseDoneFlag == FLASH_SAMPLE_FLAG_UNSET) { + ; + } + /* Perform the programe operation. */ + ret = HAL_FLASH_WriteIT(&g_flashInterruptHandle, (uintptr_t)g_tempData, + FLASH_SAMPLE_WRITE_START_ADDR, FLASH_TEMP_DATA_SIZE); + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("Write:0x%x fail\r\n ", FLASH_SAMPLE_WRITE_START_ADDR); + } + while (g_writeDoneFlag == FLASH_SAMPLE_FLAG_UNSET) { + ; + } + /* Perform the read operation. */ + ret = HAL_FLASH_Read(&g_flashInterruptHandle, FLASH_SAMPLE_READ_START_ADDR, FLASH_TEMP_DATA_SIZE, + dataBuff, FLASH_TEMP_DATA_SIZE); + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("Read:0x%x fail\r\n ", FLASH_TEMP_DATA_SIZE); + } + /* Printf the contents read from the flash memory. */ + DBG_PRINTF("read addr :0x%x \r\n ", FLASH_SAMPLE_READ_START_ADDR); + for (unsigned int i = 0; i < FLASH_TEMP_DATA_SIZE; i++) { + DBG_PRINTF("%x ", dataBuff[i]); + } + DBG_PRINTF("\r\n"); + return; +} \ No newline at end of file diff --git a/drivers_sample/gpio/sample_gpio_circle/inc/gpio_circle_sample.h b/drivers_sample/gpio/sample_gpio_circle/inc/gpio_circle_sample.h new file mode 100644 index 000000000..144adb00b --- /dev/null +++ b/drivers_sample/gpio/sample_gpio_circle/inc/gpio_circle_sample.h @@ -0,0 +1,30 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file gpio_circle_sample.h + * @author MCU Driver Team + * @brief GPIO module sample + * @details This file provides sample code for users to help use + * the circle input/output level of two GPIO groups. + */ + +#ifndef GPIO_CIRCLE_SAMPLE_H +#define GPIO_CIRCLE_SAMPLE_H + +BASE_StatusType GPIO_CircleSample(void); + +#endif /* GPIO_CIRCLE_SAMPLE_H */ \ No newline at end of file diff --git a/drivers_sample/gpio/sample_gpio_circle/init/main.c b/drivers_sample/gpio/sample_gpio_circle/init/main.c new file mode 100644 index 000000000..ad37d3921 --- /dev/null +++ b/drivers_sample/gpio/sample_gpio_circle/init/main.c @@ -0,0 +1,37 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ +#include "feature.h" +#include "main.h" +#include "gpio_circle_sample.h" + +UART_Handle g_uart0; + +GPIO_Handle g_targetHandle; +GPIO_Handle g_refHandle; + +int main(void) +{ + GPIO_CircleSample(); + while (1) { + } + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/gpio/sample_gpio_circle/init/main.h b/drivers_sample/gpio/sample_gpio_circle/init/main.h new file mode 100644 index 000000000..98e52e3b2 --- /dev/null +++ b/drivers_sample/gpio/sample_gpio_circle/init/main.h @@ -0,0 +1,47 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "gpio.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +extern UART_Handle g_uart0; + +extern GPIO_Handle g_targetHandle; +extern GPIO_Handle g_refHandle; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/gpio/sample_gpio_circle/init/system_init.c b/drivers_sample/gpio/sample_gpio_circle/init/system_init.c new file mode 100644 index 000000000..a5edf0d67 --- /dev/null +++ b/drivers_sample/gpio/sample_gpio_circle/init/system_init.c @@ -0,0 +1,123 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void GPIO_Init(void) +{ + HAL_CRG_IpEnableSet(GPIO0_BASE, IP_CLK_ENABLE); + g_targetHandle.baseAddress = GPIO2; /* GPIO group */ + g_targetHandle.dir = GPIO_INPUT_MODE; + g_targetHandle.value = GPIO_LOW_LEVEL; + g_targetHandle.interruptMode = GPIO_INT_TYPE_NONE; + g_targetHandle.pins = GPIO_PIN_0; /* PIN in group */ + HAL_GPIO_Init(&g_targetHandle); + + HAL_CRG_IpEnableSet(GPIO1_BASE, IP_CLK_ENABLE); + g_refHandle.baseAddress = GPIO1; /* GPIO group */ + g_refHandle.dir = GPIO_OUTPUT_MODE; + g_refHandle.value = GPIO_LOW_LEVEL; + g_refHandle.interruptMode = GPIO_INT_TYPE_NONE; + g_refHandle.pins = GPIO_PIN_0; /* PIN in group */ + HAL_GPIO_Init(&g_refHandle); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); + + g_uart0.baseAddress = UART0; + g_uart0.irqNum = IRQ_UART0; + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + IOConfig_RegStruct *iconfig = IOCONFIG; + + iconfig->iocmg_0.BIT.func = 0x0; /* 0x0 is GPIO0_0 */ + iconfig->iocmg_0.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_0.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_0.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_0.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_0.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_11.BIT.func = 0x0; /* 0x0 is GPIO1_0 */ + iconfig->iocmg_11.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_11.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_11.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_11.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_11.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ + iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ + iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + GPIO_Init(); + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/gpio/sample_gpio_circle/readme.md b/drivers_sample/gpio/sample_gpio_circle/readme.md new file mode 100644 index 000000000..796e8f3f2 --- /dev/null +++ b/drivers_sample/gpio/sample_gpio_circle/readme.md @@ -0,0 +1,22 @@ +# 配置GPIO的方向与电平功能,实现GPIO两个管脚的环回测试 +## 关键字: GPIO, 管脚方向,管脚电平,环回测试 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、GPIO控制器初始化和功能配置。在GPIO的回环测试中使用GPIO的两个管脚,一个用于输入信号,另一个用于输出信号,将两个GPIO管脚连接验证GPIO的电平和方向功能;然后将GPIO管脚的角色反转再进行方向和电平功能验证,实现环回测试。 + +**【示例配置】** ++ GPIO管脚选择:示例代码中选择了两个GPIO管脚用于环回测试。也可以选择其他GPIO管脚用于环回测试,在"GPIO_Init()"接口中的"g_gpiox.baseAddress"可以配置其它GPIOX,g_gpiox.pins可以配置“GPIO_PIN_0-GPIO_PIN_7”中的任意一个。 + ++ GPIO管脚初始化:调用接口"HAL_GPIO_Init()”完成对示例代码中GPIO两个管脚的方向、电平、中断模式配置。在进行GPIO管脚配置时,需将其中一个管脚配置成输入模式、低电平、不使用中断模式,将另一个管脚配置成输出模式、低电平、不使用中断模式。 + ++ GPIO环回实验过程: + 1. 对于输出管脚调用接口"HAL_GPIO_SetValue()"用于切换输出管脚的电平值,对于输入管脚调用接口"HAL_GPIO_GetPinValue()"实现对输入电平值的获取,比较输入管脚获取的电平与输出管脚输出的电平,测试管脚电平输出、电平输入功能; + 2. 调用接口"HAL_GPIO_SetDirection()"切换输入管脚与输出管脚的角色; + 3. 再执行步骤1,测试管脚的电平输出、电平输入功能。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码中会依次对两个GPIO管脚进行方向、电平功能测试。功能正常时Debug串口打印成功log信息;功能异常时Debug串口打印失败log信息。 + +**【注意事项】** ++ 示例代码使用UART0进行结果打印输出,需要对UART0配置。 ++ 示例代码中使用GPIO两个管脚需连接在一起。 \ No newline at end of file diff --git a/drivers_sample/gpio/sample_gpio_circle/src/gpio_circle_sample.c b/drivers_sample/gpio/sample_gpio_circle/src/gpio_circle_sample.c new file mode 100644 index 000000000..e94e5c6e8 --- /dev/null +++ b/drivers_sample/gpio/sample_gpio_circle/src/gpio_circle_sample.c @@ -0,0 +1,99 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file gpio_circle_sample.c + * @author MCU Driver Team + * @brief GPIO module circle sample + * @details Two groups of GPIOs are configured. One group is used to transmit signals and \ + * the other group is used to receive signals. Then, a loopback is formed. The pin numbers of the \ + * two groups correspond to the level and direction functions of the GPIOs. If the hardware environment \ + * does not support this function, you need to set up an environment for verification. + */ + +/* ---------------------------------- Includes -------------------------------- */ +#include "debug.h" +#include "gpio.h" +#include "main.h" +#include "gpio_circle_sample.h" + +/* ---------------------------------- Sample Parameters -------------------------------- */ +static BASE_StatusType GpioLoopBackTest(void); +/** + * @brief Handle GPIO circle loopBack sample. + * @param None + * @retval Value of @ref BASE_StatusType. + */ +BASE_StatusType GPIO_CircleSample(void) +{ + SystemInit(); + + if (GpioLoopBackTest() == BASE_STATUS_ERROR) { + return BASE_STATUS_ERROR; + } + return BASE_STATUS_OK; +} +/** + * @brief Handle GPIO loopBack test. + * @retval Value of @ref BASE_StatusType. + */ +static BASE_StatusType GpioLoopBackTest(void) +{ + GPIO_Value ret; + /* Configure refHandle output and targetHandle input, Test Circle: refHandle -> targetHandle */ + HAL_GPIO_SetDirection(&TARGET_HANDLE, TARGET_PIN, GPIO_INPUT_MODE); + HAL_GPIO_SetDirection(&REF_HANDLE, REF_PIN, GPIO_OUTPUT_MODE); + HAL_GPIO_SetValue(&REF_HANDLE, REF_PIN, GPIO_HIGH_LEVEL); /* set refHandle high level */ + BASE_FUNC_DELAY_MS(1); /* 1: Wait 1ms for the level signal to stabilize. */ + ret = HAL_GPIO_GetPinValue(&TARGET_HANDLE, TARGET_PIN); /* get targetHandle's level */ + if (ret != GPIO_HIGH_LEVEL) { + DBG_PRINTF("ref GPIO output to target GPIO high level error!\r\n"); + return BASE_STATUS_ERROR; + } else { + DBG_PRINTF("ref GPIO output to target GPIO high level success!\r\n"); + } + HAL_GPIO_SetValue(&REF_HANDLE, REF_PIN, GPIO_LOW_LEVEL); /* set refHandle low level */ + BASE_FUNC_DELAY_MS(1); /* 1: Wait 1ms for the level signal to stabilize. */ + ret = HAL_GPIO_GetPinValue(&TARGET_HANDLE, TARGET_PIN); /* get targetHandle's level */ + if (ret != GPIO_LOW_LEVEL) { + DBG_PRINTF("ref GPIO output to target GPIO low level error!\r\n"); + return BASE_STATUS_ERROR; + } else { + DBG_PRINTF("ref GPIO output to target GPIO low level success!\r\n"); + } + /* Configure targetHandle output and refHandle input, Test Circle: targetHandle -> refHandle */ + HAL_GPIO_SetDirection(&TARGET_HANDLE, TARGET_PIN, GPIO_OUTPUT_MODE); + HAL_GPIO_SetDirection(&REF_HANDLE, REF_PIN, GPIO_INPUT_MODE); + HAL_GPIO_SetValue(&TARGET_HANDLE, TARGET_PIN, GPIO_HIGH_LEVEL); /* set targetHandle high level */ + BASE_FUNC_DELAY_MS(1); /* 1: Wait 1ms for the level signal to stabilize. */ + ret = HAL_GPIO_GetPinValue(&REF_HANDLE, REF_PIN); /* get refHandle's level */ + if (ret != GPIO_HIGH_LEVEL) { + DBG_PRINTF("target GPIO output to ref GPIO high level error! \r\n"); + return BASE_STATUS_ERROR; + } else { + DBG_PRINTF("target GPIO output to ref GPIO high level success!\r\n"); + } + HAL_GPIO_SetValue(&TARGET_HANDLE, TARGET_PIN, GPIO_LOW_LEVEL); /* set targetHandle high level */ + BASE_FUNC_DELAY_MS(1); /* 1: Wait 1ms for the level signal to stabilize. */ + ret = HAL_GPIO_GetPinValue(&REF_HANDLE, REF_PIN); /* get refHandle's level */ + if (ret != GPIO_LOW_LEVEL) { + DBG_PRINTF("target GPIO output to ref GPIO low level error! \r\n"); + return BASE_STATUS_ERROR; + } else { + DBG_PRINTF("target GPIO output to ref GPIO low level success!\r\n"); + } + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/gpio/sample_gpio_interrupt/inc/gpio_interrupt_sample.h b/drivers_sample/gpio/sample_gpio_interrupt/inc/gpio_interrupt_sample.h new file mode 100644 index 000000000..b3b2eca26 --- /dev/null +++ b/drivers_sample/gpio/sample_gpio_interrupt/inc/gpio_interrupt_sample.h @@ -0,0 +1,30 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file gpio_interrupt_sample.h + * @author MCU Driver Team + * @brief GPIO module sample + * @details This file provides sample code for users to help use + * the register and trigger gpio interrupt. + */ + +#ifndef GPIO_INT_SAMPLE_H +#define GPIO_INT_SAMPLE_H + +void GPIO_InterruptSample(void); + +#endif /* GPIO_INT_SAMPLE_H */ \ No newline at end of file diff --git a/drivers_sample/gpio/sample_gpio_interrupt/init/main.c b/drivers_sample/gpio/sample_gpio_interrupt/init/main.c new file mode 100644 index 000000000..cafa0bdc1 --- /dev/null +++ b/drivers_sample/gpio/sample_gpio_interrupt/init/main.c @@ -0,0 +1,37 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ +#include "feature.h" +#include "main.h" +#include "gpio_interrupt_sample.h" + +UART_Handle g_uart0; + +GPIO_Handle g_intHandle; +GPIO_Handle g_trigHandle; + +int main(void) +{ + GPIO_InterruptSample(); + while (1) { + } + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/gpio/sample_gpio_interrupt/init/main.h b/drivers_sample/gpio/sample_gpio_interrupt/init/main.h new file mode 100644 index 000000000..e95bdb34e --- /dev/null +++ b/drivers_sample/gpio/sample_gpio_interrupt/init/main.h @@ -0,0 +1,49 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "gpio.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +extern UART_Handle g_uart0; + +extern GPIO_Handle g_intHandle; +extern GPIO_Handle g_trigHandle; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +void GPIO_CallBackFunc(void *param); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/gpio/sample_gpio_interrupt/init/system_init.c b/drivers_sample/gpio/sample_gpio_interrupt/init/system_init.c new file mode 100644 index 000000000..e8fd3a6f7 --- /dev/null +++ b/drivers_sample/gpio/sample_gpio_interrupt/init/system_init.c @@ -0,0 +1,137 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +__weak void GPIO_CallBackFunc(void *param) +{ + GPIO_Handle *handle = (GPIO_Handle *)param; + /* USER CODE BEGIN GPIO_CallBackFunc */ + /* USER CODE END GPIO_CallBackFunc */ + BASE_FUNC_UNUSED(handle); +} + +static void GPIO_Init(void) +{ + HAL_CRG_IpEnableSet(GPIO2_BASE, IP_CLK_ENABLE); + g_trigHandle.baseAddress = GPIO2; + g_trigHandle.dir = GPIO_OUTPUT_MODE; + g_trigHandle.value = GPIO_LOW_LEVEL; + g_trigHandle.interruptMode = GPIO_INT_TYPE_NONE; + g_trigHandle.pins = GPIO_PIN_0; + HAL_GPIO_Init(&g_trigHandle); + + HAL_CRG_IpEnableSet(GPIO1_BASE, IP_CLK_ENABLE); + g_intHandle.baseAddress = GPIO1; + g_intHandle.dir = GPIO_INPUT_MODE; + g_intHandle.value = GPIO_LOW_LEVEL; + g_intHandle.interruptMode = GPIO_INT_TYPE_HIGH_LEVEL; + g_intHandle.pins = GPIO_PIN_0; + HAL_GPIO_Init(&g_intHandle); + /* Register callback functions to be defined by users. */ + HAL_GPIO_RegisterCallBack(&g_intHandle, GPIO_PIN_0, GPIO_CallBackFunc); + g_intHandle.irqNum = IRQ_GPIO1; + HAL_GPIO_IRQService(&g_intHandle); /* Associating irqNum with Callbacks */ + IRQ_SetPriority(g_intHandle.irqNum, 1); /* set gpio1 interrupt priority to 1, 1~7 */ + IRQ_EnableN(g_intHandle.irqNum); /* gpio interrupt enable */ +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); + + g_uart0.baseAddress = UART0; + g_uart0.irqNum = IRQ_UART0; + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + IOConfig_RegStruct *iconfig = IOCONFIG; + + iconfig->iocmg_11.BIT.func = 0x0; /* 0x0 is GPIO1_0 */ + iconfig->iocmg_11.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_11.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_11.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_11.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_11.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_19.BIT.func = 0x0; /* 0x0 is GPIO2_0 */ + iconfig->iocmg_19.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_19.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_19.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_19.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_19.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ + iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ + iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + GPIO_Init(); + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/gpio/sample_gpio_interrupt/readme.md b/drivers_sample/gpio/sample_gpio_interrupt/readme.md new file mode 100644 index 000000000..21a7f2bc3 --- /dev/null +++ b/drivers_sample/gpio/sample_gpio_interrupt/readme.md @@ -0,0 +1,22 @@ +# 配置GPIO管脚的中断功能,实现GPIO不同触发方式下中断功能测试 +## 关键字: GPIO, 中断,触发方式 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、GPIO控制器初始化和功能配置。在示例代码的中断功能测试中使用GPIO的两个管脚,一个用于输出信号,另一个用于作为中断管脚接收信号,在不同中断方式下触发GPIO的中断功能。 + +**【示例配置】** ++ GPIO管脚选择:示例代码中选择了两个GPIO管脚用于中断功能测试。也可以选择其他GPIO管脚用于中断功能测试,在"GPIO_Init()"接口中的"g_gpiox.baseAddress"可以配置其它GPIOX,g_gpiox.pins可以配置“GPIO_PIN_0-GPIO_PIN_7”中的任意一个。 + ++ GPIO管脚初始化:调用接口"HAL_GPIO_Init()”完成对示例代码中GPIO两个管脚的方向、电平、中断模式配置。在进行GPIO管脚配置时,需将其中一个管脚配置成输出模式、低电平、不使用中断模式,将另一个管脚配置成输入模式、低电平、高电平中断模式。之后,再调用中断相关接口注册、开启中断功能。 + ++ GPIO中断功能测试过程: + 1. 对于输出管脚调用接口"HAL_GPIO_SetValue()"变换管脚输出电平,从而直接或间接构造出高电平、低电平、上升沿、下降沿输出信号; + 2. 对于输入管脚调用接口"HAL_GPIO_SetIrqType()"设置管脚不同的中断触发类型; + 3. 通过输出管脚和输入管脚的相互配合实现不同触发类型的中断功能测试。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码中会依次进行不同触发模式的中断功能测试。功能正常时Debug串口打印成功log信息;功能异常时Debug串口打印失败log信息。 + +**【注意事项】** ++ 示例代码使用UART0进行结果打印输出,需要对UART0配置。 ++ 示例代码中使用GPIO两个管脚需连接在一起。 \ No newline at end of file diff --git a/drivers_sample/gpio/sample_gpio_interrupt/src/gpio_interrupt_sample.c b/drivers_sample/gpio/sample_gpio_interrupt/src/gpio_interrupt_sample.c new file mode 100644 index 000000000..c5e807726 --- /dev/null +++ b/drivers_sample/gpio/sample_gpio_interrupt/src/gpio_interrupt_sample.c @@ -0,0 +1,126 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file gpio_interrupt_sample.c + * @author MCU Driver Team + * @brief GPIO module trigger each interrupt type sample + * @details Set two groups of GPIOs. One group is used to provide the trigger condition \ + * for triggering the interrupt, and the other group is used to provide the interrupt response. The \ + * pin numbers of the two groups correspond to each other to verify the five interrupt types. If the \ + * hardware environment does not support this function, you need to set up an environment for verification. + */ + +/* Includes ------------------------------------------------------------------*/ +#include "debug.h" +#include "gpio.h" +#include "main.h" +#include "gpio_interrupt_sample.h" + +#define GPIO_LEVEL_SHIFT_SAFE_TIME 1 +static bool g_intFlag = false; +/* prototype functions -------------------------------------------------------*/ +void GPIO_CallBackFunc(void *param); +static void GPIO_InterruptTest(void); +/* Macro definitions ---------------------------------------------------------*/ + +/* ---------------------------------- Sample Parameters -------------------------------- */ +/** + * @brief GPIO Interrupt sample. + * @param None + * @retval Value of @ref BASE_StatusType. + */ +void GPIO_InterruptSample(void) +{ + SystemInit(); + DBG_PRINTF("GPIO Interrupt Sample \r\n"); + GPIO_InterruptTest(); +} + +/** + * @brief GPIO Interrupt callback function. + * @param param Value of @ref GPIO_Handle. + * @retval None + */ +void GPIO_CallBackFunc(void *param) +{ + GPIO_Handle *handle = (GPIO_Handle *)param; + GPIO_ASSERT_PARAM(handle != NULL); + GPIO_InterruptMode mode = HAL_GPIO_GetPinIrqType(handle, handle->pins); + DBG_PRINTF("In intMode[%d]'s callback -- ", mode); + if (mode == GPIO_INT_TYPE_HIGH_LEVEL) { + /* reverse trigHandle's value */ + HAL_GPIO_SetValue(&TRIG_HANDLE, TRIG_PIN, GPIO_LOW_LEVEL); + } else if (mode == GPIO_INT_TYPE_LOW_LEVEL) { + /* reverse trigHandle's value */ + HAL_GPIO_SetValue(&TRIG_HANDLE, TRIG_PIN, GPIO_HIGH_LEVEL); + } + g_intFlag = true; +} +/** + * @brief Check GPIO Interrupt state. + * @param None. + * @retval None + */ +static void CheckGpioIntState(void) +{ + /* true means into interrupt callback, false is not */ + if (g_intFlag == true) { + DBG_PRINTF("success ! \r\n"); + } else { + DBG_PRINTF("fail ! \r\n"); + } + g_intFlag = false; /* resumn status is false */ +} +/** + * @brief GPIO Interrupt test scene one: GPIO2 -> GPIO1. + * @param trigHandle the handle provide trig source. + * @param intHandle the handle generate interrupt. + * @retval None + */ +static void GPIO_InterruptTest(void) +{ + /* Test high level interrupt type */ + DBG_PRINTF(" Test high level interrupt type : trig GPIO -> int GPIO high level-------------------- "); + HAL_GPIO_SetValue(&TRIG_HANDLE, TRIG_PIN, GPIO_HIGH_LEVEL); /* Provide high level trig condition */ + BASE_FUNC_DELAY_MS(GPIO_LEVEL_SHIFT_SAFE_TIME); + CheckGpioIntState(); + /* Test low level interrupt type */ + DBG_PRINTF(" Test low level interrupt type : trig GPIO -> int GPIO low level-------------------- "); + HAL_GPIO_SetIrqType(&INT_HANDLE, INT_PIN, GPIO_INT_TYPE_LOW_LEVEL); /* change interrupt type to low level */ + BASE_FUNC_DELAY_MS(GPIO_LEVEL_SHIFT_SAFE_TIME); + CheckGpioIntState(); + /* Test rise level interrupt type */ + DBG_PRINTF(" Test rise level interrupt type : trig GPIO -> int GPIO rising edge-------------------- "); + HAL_GPIO_SetIrqType(&INT_HANDLE, INT_PIN, GPIO_INT_TYPE_RISE_EDGE); /* change interrupt type to rise type */ + HAL_GPIO_SetValue(&TRIG_HANDLE, TRIG_PIN, GPIO_LOW_LEVEL); /* Provide rise level trig condition */ + BASE_FUNC_DELAY_MS(GPIO_LEVEL_SHIFT_SAFE_TIME); + HAL_GPIO_SetValue(&TRIG_HANDLE, TRIG_PIN, GPIO_HIGH_LEVEL); + CheckGpioIntState(); + /* Test fall level interrupt type */ + DBG_PRINTF(" Test fall level interrupt type : trig GPIO -> int GPIO falling edge-------------------- "); + HAL_GPIO_SetIrqType(&INT_HANDLE, INT_PIN, GPIO_INT_TYPE_FALL_EDGE); /* change interrupt type to fall type */ + HAL_GPIO_SetValue(&TRIG_HANDLE, TRIG_PIN, GPIO_LOW_LEVEL); + BASE_FUNC_DELAY_MS(GPIO_LEVEL_SHIFT_SAFE_TIME); + CheckGpioIntState(); + /* Test high/low both level interrupt type */ + DBG_PRINTF(" Test high/low both level interrupt type : trig GPIO -> int GPIO both edge-------------------- "); + HAL_GPIO_SetIrqType(&INT_HANDLE, INT_PIN, GPIO_INT_TYPE_BOTH_EDGE); /* change interrupt type to both type */ + HAL_GPIO_SetValue(&TRIG_HANDLE, TRIG_PIN, GPIO_HIGH_LEVEL); + BASE_FUNC_DELAY_MS(GPIO_LEVEL_SHIFT_SAFE_TIME); + HAL_GPIO_SetValue(&TRIG_HANDLE, TRIG_PIN, GPIO_LOW_LEVEL); + CheckGpioIntState(); +} \ No newline at end of file diff --git a/drivers_sample/gpio/sample_gpio_key/inc/gpio_key_sample.h b/drivers_sample/gpio/sample_gpio_key/inc/gpio_key_sample.h new file mode 100644 index 000000000..e490c9de9 --- /dev/null +++ b/drivers_sample/gpio/sample_gpio_key/inc/gpio_key_sample.h @@ -0,0 +1,30 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file gpio_key_sample.h + * @author MCU Driver Team + * @brief GPIO module sample + * @details This file provides sample code for users to help use + * the trigger an interrupt based on the key connected to the GPIO. + */ + +#ifndef GPIO_KEY_SAMPLE_H +#define GPIO_KEY_SAMPLE_H + +BASE_StatusType GPIO_KeySample(void); + +#endif /* GPIO_KEY_SAMPLE_H */ \ No newline at end of file diff --git a/drivers_sample/gpio/sample_gpio_key/init/main.c b/drivers_sample/gpio/sample_gpio_key/init/main.c new file mode 100644 index 000000000..f0e073cb1 --- /dev/null +++ b/drivers_sample/gpio/sample_gpio_key/init/main.c @@ -0,0 +1,36 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ +#include "feature.h" +#include "main.h" +#include "gpio_key_sample.h" + +UART_Handle g_uart0; + +GPIO_Handle g_keyHandle; + +int main(void) +{ + GPIO_KeySample(); + while (1) { + } + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/gpio/sample_gpio_key/init/main.h b/drivers_sample/gpio/sample_gpio_key/init/main.h new file mode 100644 index 000000000..fc21f4530 --- /dev/null +++ b/drivers_sample/gpio/sample_gpio_key/init/main.h @@ -0,0 +1,48 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "gpio.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +extern UART_Handle g_uart0; + +extern GPIO_Handle g_keyHandle; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +void GPIO_CallBackFunc(void *param); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/gpio/sample_gpio_key/init/system_init.c b/drivers_sample/gpio/sample_gpio_key/init/system_init.c new file mode 100644 index 000000000..7f07ca92a --- /dev/null +++ b/drivers_sample/gpio/sample_gpio_key/init/system_init.c @@ -0,0 +1,121 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +__weak void GPIO_CallBackFunc(void *param) +{ + GPIO_Handle *handle = (GPIO_Handle *)param; + /* USER CODE BEGIN GPIO_CallBackFunc */ + /* USER CODE END GPIO_CallBackFunc */ + BASE_FUNC_UNUSED(handle); +} + +static void GPIO_Init(void) +{ + HAL_CRG_IpEnableSet(GPIO3_BASE, IP_CLK_ENABLE); + g_keyHandle.baseAddress = GPIO3; + g_keyHandle.dir = GPIO_INPUT_MODE; + g_keyHandle.value = GPIO_LOW_LEVEL; + g_keyHandle.interruptMode = GPIO_INT_TYPE_RISE_EDGE; + g_keyHandle.pins = GPIO_PIN_0; + HAL_GPIO_Init(&g_keyHandle); + /* Register callback functions to be defined by users. */ + HAL_GPIO_RegisterCallBack(&g_keyHandle, GPIO_PIN_0, GPIO_CallBackFunc); + g_keyHandle.irqNum = IRQ_GPIO3; + HAL_GPIO_IRQService(&g_keyHandle); + IRQ_SetPriority(g_keyHandle.irqNum, 1); /* set gpio1 interrupt priority to 1, 1~7 */ + IRQ_EnableN(g_keyHandle.irqNum); /* gpio interrupt enable */ +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); + g_uart0.baseAddress = UART0; + g_uart0.irqNum = IRQ_UART0; + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + IOConfig_RegStruct *iconfig = IOCONFIG; + + iconfig->iocmg_27.BIT.func = 0x0; /* 0x0 is GPIO3_0 */ + iconfig->iocmg_27.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_27.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_27.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_27.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_27.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ + iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ + iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + GPIO_Init(); + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/gpio/sample_gpio_key/readme.md b/drivers_sample/gpio/sample_gpio_key/readme.md new file mode 100644 index 000000000..93ceff618 --- /dev/null +++ b/drivers_sample/gpio/sample_gpio_key/readme.md @@ -0,0 +1,17 @@ +# 配置GPIO管脚的中断功能,实现GPIO对按键检测 +## 关键字: GPIO, 中断,按键检测 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、GPIO控制器初始化和功能配置。在示例代码中通过中断的方式实现对按键的检测。 + +**【示例配置】** ++ GPIO管脚选择:示例代码中选择GPIO管脚用于通过中断方式进行按键检测。也可以选择其他GPIO管脚用于按键检测功能测试,在"GPIO_Init()"接口中的"g_gpiox.baseAddress"可以配置其它GPIOX,g_gpiox.pins可以配置“GPIO_PIN_0-GPIO_PIN_7”中的任意一个。 + ++ GPIO管脚初始化:调用接口"HAL_GPIO_Init()”完成对示例代码中GPIO管脚的方向、电平、中断模式配置。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码中在按键没有按下时Debug串口会一直打印等待按键的log信息,当连接的按键按下时功能正常时Debug串口打印成功log信息;功能异常时按下按键时Debug串口还是会一直打印等待按键的log信息。 + +**【注意事项】** ++ 示例代码使用UART0进行结果打印输出,需要对UART0配置。 ++ 示例代码中使用的GPIO管脚需和按键连接在一起。 \ No newline at end of file diff --git a/drivers_sample/gpio/sample_gpio_key/src/gpio_key_sample.c b/drivers_sample/gpio/sample_gpio_key/src/gpio_key_sample.c new file mode 100644 index 000000000..6ec5c721c --- /dev/null +++ b/drivers_sample/gpio/sample_gpio_key/src/gpio_key_sample.c @@ -0,0 +1,65 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file gpio_key_sample.c + * @author MCU Driver Team + * @brief GPIO module realize a key function sample + * @details GPIO Capturing Key Triggered Interrupt Service Function. If the hardware environment does \ + * not support this function, you need to set up an environment for verification. + */ + +/* Includes ------------------------------------------------------------------*/ +#include "debug.h" +#include "gpio.h" +#include "main.h" +#include "gpio_key_sample.h" + +#define PREVENT_SWIPE_SCREEN_TIME 50 +#define CYCLE_INTERVAL_TIME 500 + +/* prototype functions -------------------------------------------------------*/ +void GPIO_CallBackFunc(void *param); + +/* ---------------------------------- Sample Parameters ---------------------- */ +/** + * @brief GPIO key test sample. + * @param None + * @retval Value of @ref BASE_StatusType. + */ +BASE_StatusType GPIO_KeySample(void) +{ + SystemInit(); + /* Waiting for the key to come. */ + while (1) { + DBG_PRINTF("Wait key \r\n"); + BASE_FUNC_DELAY_MS(CYCLE_INTERVAL_TIME); + } + + return BASE_STATUS_OK; +} + +/** + * @brief GPIO register interrupt callback function. + * @param param Value of @ref GPIO_Handle. + * @retval None + */ +void GPIO_CallBackFunc(void *param) +{ + BASE_FUNC_UNUSED(param); + DBG_PRINTF("in GPIO Key Handler \r\n"); + BASE_FUNC_DELAY_MS(PREVENT_SWIPE_SCREEN_TIME); +} \ No newline at end of file diff --git a/drivers_sample/gpio/sample_gpio_led/inc/gpio_led_sample.h b/drivers_sample/gpio/sample_gpio_led/inc/gpio_led_sample.h new file mode 100644 index 000000000..c5ddef433 --- /dev/null +++ b/drivers_sample/gpio/sample_gpio_led/inc/gpio_led_sample.h @@ -0,0 +1,30 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file gpio_led_sample.h + * @author MCU Driver Team + * @brief GPIO module sample + * @details This file provides sample code for users to help use + * the GPIO flashing LEDs. + */ + +#ifndef GPIO_LED_SAMPLE_H +#define GPIO_LED_SAMPLE_H + +BASE_StatusType GPIO_LedSample(void); + +#endif /* GPIO_LED_SAMPLE_H */ \ No newline at end of file diff --git a/drivers_sample/gpio/sample_gpio_led/init/main.c b/drivers_sample/gpio/sample_gpio_led/init/main.c new file mode 100644 index 000000000..923c56289 --- /dev/null +++ b/drivers_sample/gpio/sample_gpio_led/init/main.c @@ -0,0 +1,36 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ +#include "feature.h" +#include "main.h" +#include "gpio_led_sample.h" + +UART_Handle g_uart0; + +GPIO_Handle g_ledHandle; + +int main(void) +{ + GPIO_LedSample(); + while (1) { + } + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/gpio/sample_gpio_led/init/main.h b/drivers_sample/gpio/sample_gpio_led/init/main.h new file mode 100644 index 000000000..d871dfc85 --- /dev/null +++ b/drivers_sample/gpio/sample_gpio_led/init/main.h @@ -0,0 +1,46 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "gpio.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +extern UART_Handle g_uart0; + +extern GPIO_Handle g_ledHandle; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/gpio/sample_gpio_led/init/system_init.c b/drivers_sample/gpio/sample_gpio_led/init/system_init.c new file mode 100644 index 000000000..604c645f1 --- /dev/null +++ b/drivers_sample/gpio/sample_gpio_led/init/system_init.c @@ -0,0 +1,109 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void GPIO_Init(void) +{ + HAL_CRG_IpEnableSet(GPIO5_BASE, IP_CLK_ENABLE); + g_ledHandle.baseAddress = GPIO5; /* can be config by ide */ + + g_ledHandle.dir = GPIO_OUTPUT_MODE; + g_ledHandle.value = GPIO_HIGH_LEVEL; + g_ledHandle.interruptMode = GPIO_INT_TYPE_NONE; + g_ledHandle.pins = GPIO_PIN_6; /* can be config by ide */ + HAL_GPIO_Init(&g_ledHandle); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); + + g_uart0.baseAddress = UART0; + g_uart0.irqNum = IRQ_UART0; + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + IOConfig_RegStruct *iconfig; + + iconfig->iocmg_49.BIT.func = 0x0; /* 0x0 is GPIO5_6 */ + iconfig->iocmg_49.BIT.ds = IO_DRV_LEVEL1; + iconfig->iocmg_49.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_49.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_49.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_49.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ + iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ + iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + GPIO_Init(); + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/gpio/sample_gpio_led/readme.md b/drivers_sample/gpio/sample_gpio_led/readme.md new file mode 100644 index 000000000..048b59644 --- /dev/null +++ b/drivers_sample/gpio/sample_gpio_led/readme.md @@ -0,0 +1,19 @@ +# 配置GPIO管脚的电平反转功能,实现GPIO管脚控制LED灯的亮灭 +## 关键字: GPIO, 电平反转,LED + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、GPIO控制器初始化和功能配置。在示例代码中通过控制GPIO管脚的电平翻转实现控制LED灯的亮灭控制。 + +**【示例配置】** ++ GPIO管脚选择:示例代码中选择GPIO管脚用于控制LED灯亮灭。也可以选择其他GPIO管脚用于控制LED的功能,在"GPIO_Init()"接口中的"g_gpiox.baseAddress"可以配置其它GPIOX,g_gpiox.pins可以配置“GPIO_PIN_0-GPIO_PIN_7”中的任意一个。 + ++ GPIO管脚初始化:调用接口"HAL_GPIO_Init()”完成对示例代码中GPIO管脚的方向、电平、中断模式配置。 + ++ GPIO管脚实现对LED灯控制:对于输出管脚调用接口"HAL_GPIO_TogglePin()"实现管脚电平翻转,结合延时函数实现GPIO管脚控制LED灯每50ms亮灭状态反转一次。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码中会控制GPIO管脚连接的LED每50ms进行一次亮灭,每反转一次电平Debug串口会打印一条信息。 + +**【注意事项】** ++ 示例代码使用UART0进行结果打印输出,需要对UART0配置。 ++ 示例代码中使用的GPIO管脚需和LED灯连接在一起。 \ No newline at end of file diff --git a/drivers_sample/gpio/sample_gpio_led/src/gpio_led_sample.c b/drivers_sample/gpio/sample_gpio_led/src/gpio_led_sample.c new file mode 100644 index 000000000..67ee9be6c --- /dev/null +++ b/drivers_sample/gpio/sample_gpio_led/src/gpio_led_sample.c @@ -0,0 +1,49 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file gpio_led_sample.c + * @author MCU Driver Team + * @brief GPIO module realize a led on/off function sample + * @details Controls the LED to turn on and off. The status is reversed every 50 ms. If the hardware environment \ + * does not support this function, you need to set up an environment for verification. + */ + +/* Includes ------------------------------------------------------------------*/ +#include "debug.h" +#include "gpio.h" +#include "main.h" +#include "gpio_led_sample.h" + +#define CYCLE_INTERVAL_TIME 500 + +/* ---------------------------------- Sample Parameters -------------------------------- */ +/** + * @brief Test GPIO PIN control LED. + * @param None + * @retval Value of @ref BASE_StatusType. + */ +BASE_StatusType GPIO_LedSample(void) +{ + SystemInit(); + /* Cycle control LED on and off. */ + while (1) { + BASE_FUNC_DELAY_MS(CYCLE_INTERVAL_TIME); + HAL_GPIO_TogglePin(&LED_HANDLE, LED_PIN); + DBG_PRINTF("LED Stata reverse! \r\n"); + } + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/gpt/sample_gpt_period_interrupt/inc/sample_gpt_period_interrupt.h b/drivers_sample/gpt/sample_gpt_period_interrupt/inc/sample_gpt_period_interrupt.h new file mode 100644 index 000000000..e4a97037e --- /dev/null +++ b/drivers_sample/gpt/sample_gpt_period_interrupt/inc/sample_gpt_period_interrupt.h @@ -0,0 +1,32 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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.. + * @file sample_gpt_period_interrupt.h + * @author MCU Driver Team + * @brief gpt sample module. + * @details This file provides users with sample code to help use GPT function: + * GPT runs、GPT period interrupt. + */ +#ifndef SAMPLE_GPT_PERIOD_INTERRUPT_H +#define SAMPLE_GPT_PERIOD_INTERRUPT_H + +#include "debug.h" +#include "gpt.h" +#include "main.h" + +void GPT_PeriodInterrupt(void); +#endif \ No newline at end of file diff --git a/drivers_sample/gpt/sample_gpt_period_interrupt/init/main.c b/drivers_sample/gpt/sample_gpt_period_interrupt/init/main.c new file mode 100644 index 000000000..488358078 --- /dev/null +++ b/drivers_sample/gpt/sample_gpt_period_interrupt/init/main.c @@ -0,0 +1,51 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ + +#include "typedefs.h" +#include "feature.h" +#include "sample_gpt_period_interrupt.h" +#include "main.h" +/* USER CODE BEGIN 0 */ +/* USER CODE END 0 */ +GPT_Handle g_gptHandle; +UART_Handle g_uart0Handle; +/* USER CODE BEGIN 1 */ +/* USER CODE END 1 */ + +int main(void) +{ + /* USER CODE BEGIN 2 */ + /* USER CODE END 2 */ + GPT_PeriodInterrupt(); + /* USER CODE BEGIN 3 */ + /* USER CODE END 3 */ + while (1) { + /* USER CODE BEGIN 4 */ + /* USER CODE END 4 */ + } + /* USER CODE BEGIN 5 */ + /* USER CODE END 5 */ + return BASE_STATUS_OK; +} + +/* USER CODE BEGIN 6 */ +/* USER CODE END 6 */ \ No newline at end of file diff --git a/drivers_sample/gpt/sample_gpt_period_interrupt/init/main.h b/drivers_sample/gpt/sample_gpt_period_interrupt/init/main.h new file mode 100644 index 000000000..07b818abd --- /dev/null +++ b/drivers_sample/gpt/sample_gpt_period_interrupt/init/main.h @@ -0,0 +1,53 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "uart_ex.h" +#include "gpt.h" +#include "gpt_ex.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define XTAL_DRV_LEVEL4 0x03U +#define XTAL_DRV_LEVEL3 0x02U +#define XTAL_DRV_LEVEL2 0x01U +#define XTAL_DRV_LEVEL1 0x00U + +extern GPT_Handle g_gptHandle; +extern UART_Handle g_uart0Handle; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); +void GPT2PWMOutputFinishCallBack(void *handle); +void GPT2PWMPeriodOutputFinishCallBack(void *handle); +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/gpt/sample_gpt_period_interrupt/init/system_init.c b/drivers_sample/gpt/sample_gpt_period_interrupt/init/system_init.c new file mode 100644 index 000000000..71aae6109 --- /dev/null +++ b/drivers_sample/gpt/sample_gpt_period_interrupt/init/system_init.c @@ -0,0 +1,137 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" +#include "iocmg.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 48; /* PLL Multiplier 48 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +__weak void GPT2PWMOutputFinishCallBack(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN IRQ_GPT2_INT */ + /* USER CODE END IRQ_GPT2_INT */ +} + +__weak void GPT2PWMPeriodOutputFinishCallBack(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN IRQ_GPT2_PRD_INT */ + /* USER CODE END IRQ_GPT2_PRD_INT */ +} + +static void GPT2_Init(void) +{ + HAL_CRG_IpEnableSet(GPT2_BASE, IP_CLK_ENABLE); + + g_gptHandle.baseAddress = GPT2; + g_gptHandle.clockDiv = 9; /* 9 is the internal frequency division of GPT */ + g_gptHandle.period = 49999; /* 49999 is the number of GPT counting cycles. */ + g_gptHandle.refA0.refdot = 10000; /* 10000 is the value of PWM reference point A. */ + g_gptHandle.refA0.refAction = GPT_ACTION_OUTPUT_HIGH; /* GPT Action high */ + g_gptHandle.refB0.refdot = 30000; /* 30000 is the value of PWM reference point B. */ + g_gptHandle.refB0.refAction = GPT_ACTION_OUTPUT_LOW; + g_gptHandle.bufLoad = BASE_CFG_ENABLE; + g_gptHandle.pwmKeep = BASE_CFG_ENABLE; + g_gptHandle.handleEx.periodIntEnable = BASE_CFG_ENABLE; + g_gptHandle.handleEx.outputFinIntEnable = BASE_CFG_ENABLE; + g_gptHandle.triggleAdcOutFinish = BASE_CFG_DISABLE; + g_gptHandle.triggleAdcPeriod = BASE_CFG_DISABLE; + HAL_GPT_Init(&g_gptHandle); + HAL_GPT_RegisterCallBack(&g_gptHandle, GPT_INT_PWM_OUTPUT_FIN, GPT2PWMOutputFinishCallBack); + IRQ_Register(IRQ_GPT2_INT, HAL_GPT_IrqOutFinishHandler, &g_gptHandle); + IRQ_SetPriority(IRQ_GPT2_INT, 1); + IRQ_EnableN(IRQ_GPT2_INT); + HAL_GPT_RegisterCallBack(&g_gptHandle, GPT_INT_PERIOD, GPT2PWMPeriodOutputFinishCallBack); + IRQ_Register(IRQ_GPT2_PRD_INT, HAL_GPT_IrqPeriodHandler, &g_gptHandle); + IRQ_SetPriority(IRQ_GPT2_PRD_INT, 1); + IRQ_EnableN(IRQ_GPT2_PRD_INT); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + g_uart0Handle.baseAddress = UART0; + g_uart0Handle.baudRate = UART0_BAND_RATE; + g_uart0Handle.dataLength = UART_DATALENGTH_8BIT; + g_uart0Handle.stopBits = UART_STOPBITS_ONE; + g_uart0Handle.parity = UART_PARITY_NONE; + g_uart0Handle.txMode = UART_MODE_BLOCKING; + g_uart0Handle.rxMode = UART_MODE_BLOCKING; + g_uart0Handle.fifoMode = BASE_CFG_ENABLE; + g_uart0Handle.fifoTxThr = UART_FIFODEPTH_SIZE8; + g_uart0Handle.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart0Handle.hwFlowCtr = BASE_CFG_DISABLE; + g_uart0Handle.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart0Handle.handleEx.msbFirst = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0Handle); +} + +static void IOConfig(void) +{ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO5_2_AS_GPT2_PWM); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO5_2_AS_GPT2_PWM, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO5_2_AS_GPT2_PWM, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO5_2_AS_GPT2_PWM, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO5_2_AS_GPT2_PWM, DRIVER_RATE_2); /* Output signal edge fast/slow */ +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + GPT2_Init(); + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/gpt/sample_gpt_period_interrupt/readme.md b/drivers_sample/gpt/sample_gpt_period_interrupt/readme.md new file mode 100644 index 000000000..eb7814a2b --- /dev/null +++ b/drivers_sample/gpt/sample_gpt_period_interrupt/readme.md @@ -0,0 +1,24 @@ +# 通用脉宽调制PWM-周期中断 +## 关键字: PWM, 周期中断 + +**【功能描述】** ++ 该GPT示例中产生连续的PWM波。 + ++ 每个PWM波输出完之后,都会产生周期中断。 + +**【示例配置】** ++ 示例默认输出周期为0.02s,占空比为40%的PWM波,其中周期可通过配置Period项更改,占空比可通过refA0和RefB0的参考值进行更改。 + ++ 每个PWM波输出完成之后,都会产生周期中断,调用周期中断回调函数,示例样例回调函数为“GPT2PWMPeriodOutputFinishCallBack”。 + +**【示例效果】** ++ 在IOCMG_8输出连续方波,如果IOCMG_8上无对应外设,可通过示波器观察方波的周期和占空比。 + ++ 串口0提示GPT输出信息和中期中断回调函数输出的信息。 + +**【注意事项】** ++ 更改PWM的周期和占空比一般先使用“HAL_GPT_GetConfig”获取GPT的配置,再使用“HAL_GPT_Config”更改GPT的配置。 + ++ 串口0输出提示信息。 + ++ ```c输出的PWMPWM频率=工作时钟频率/((分频系数+1)*(计数周期值+1))``` \ No newline at end of file diff --git a/drivers_sample/gpt/sample_gpt_period_interrupt/src/sample_gpt_period_interrupt.c b/drivers_sample/gpt/sample_gpt_period_interrupt/src/sample_gpt_period_interrupt.c new file mode 100644 index 000000000..2c31f3288 --- /dev/null +++ b/drivers_sample/gpt/sample_gpt_period_interrupt/src/sample_gpt_period_interrupt.c @@ -0,0 +1,51 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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.. + * @file sample_gpt_period_interrupt.c + * @author MCU Driver Team + * @brief gpt sample module. + * @details This file provides users with sample code to help use GPT function: + * 1) Generate a continuous square wave with period and duty set in the function SystemInit. + * 2) GPT period interrupt callback. + */ +#include "sample_gpt_period_interrupt.h" + +/** + * @brief GPT period interrupt callback + * @param None. + * @retval None. + */ +void GPT2PWMPeriodOutputFinishCallBack(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN IRQ_GPT2_PRD_INT */ + DBG_PRINTF("GPT period interrupt\n"); + /* USER CODE END IRQ_GPT2_PRD_INT */ +} + +/** + * @brief GPT run and modify period and duty during running. + * @param None. + * @retval None. + */ +void GPT_PeriodInterrupt(void) +{ + SystemInit(); + DBG_PRINTF("GPT Continued Run begin\r\n"); + HAL_GPT_Start(&g_gptHandle); + BASE_FUNC_DelaySeconds(10); /* Delay 10 seconds */ +} diff --git a/drivers_sample/gpt/sample_gpt_pwm_output/inc/sample_gpt_pwm_output.h b/drivers_sample/gpt/sample_gpt_pwm_output/inc/sample_gpt_pwm_output.h new file mode 100644 index 000000000..d6ffdd89c --- /dev/null +++ b/drivers_sample/gpt/sample_gpt_pwm_output/inc/sample_gpt_pwm_output.h @@ -0,0 +1,32 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_gpt_pwm_output.h + * @author MCU Driver Team + * @brief gpt sample module. + * @details This file provides users with sample code to help use GPT function: + * GPT runs. + */ +#ifndef SAMPLE_GPT_PWM_OUTPUT_H +#define SAMPLE_GPT_PWM_OUTPUT_H + +#include "debug.h" +#include "gpt.h" +#include "main.h" + +void GPT_SampleMain(void); +#endif \ No newline at end of file diff --git a/drivers_sample/gpt/sample_gpt_pwm_output/init/main.c b/drivers_sample/gpt/sample_gpt_pwm_output/init/main.c new file mode 100644 index 000000000..d2fa4c090 --- /dev/null +++ b/drivers_sample/gpt/sample_gpt_pwm_output/init/main.c @@ -0,0 +1,51 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ + +#include "typedefs.h" +#include "feature.h" +#include "sample_gpt_pwm_output.h" +#include "main.h" +/* USER CODE BEGIN 0 */ +/* USER CODE END 0 */ +GPT_Handle g_gptHandle; +UART_Handle g_uart0Handle; +/* USER CODE BEGIN 1 */ +/* USER CODE END 1 */ + +int main(void) +{ + /* USER CODE BEGIN 2 */ + /* USER CODE END 2 */ + GPT_SampleMain(); + /* USER CODE BEGIN 3 */ + /* USER CODE END 3 */ + while (1) { + /* USER CODE BEGIN 4 */ + /* USER CODE END 4 */ + } + /* USER CODE BEGIN 5 */ + /* USER CODE END 5 */ + return BASE_STATUS_OK; +} + +/* USER CODE BEGIN 6 */ +/* USER CODE END 6 */ \ No newline at end of file diff --git a/drivers_sample/gpt/sample_gpt_pwm_output/init/main.h b/drivers_sample/gpt/sample_gpt_pwm_output/init/main.h new file mode 100644 index 000000000..7c9ef5f69 --- /dev/null +++ b/drivers_sample/gpt/sample_gpt_pwm_output/init/main.h @@ -0,0 +1,52 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "uart_ex.h" +#include "gpt.h" +#include "gpt_ex.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define XTAL_DRV_LEVEL4 0x03U +#define XTAL_DRV_LEVEL3 0x02U +#define XTAL_DRV_LEVEL2 0x01U +#define XTAL_DRV_LEVEL1 0x00U + +extern GPT_Handle g_gptHandle; +extern UART_Handle g_uart0Handle; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/gpt/sample_gpt_pwm_output/init/system_init.c b/drivers_sample/gpt/sample_gpt_pwm_output/init/system_init.c new file mode 100644 index 000000000..aa921e15c --- /dev/null +++ b/drivers_sample/gpt/sample_gpt_pwm_output/init/system_init.c @@ -0,0 +1,118 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" +#include "iocmg.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 48; /* PLL Multiplier 48 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void GPT2_Init(void) +{ + HAL_CRG_IpEnableSet(GPT2_BASE, IP_CLK_ENABLE); + + g_gptHandle.baseAddress = GPT2; + g_gptHandle.clockDiv = 9; /* 9 is the internal frequency division of GPT */ + g_gptHandle.period = 49999; /* 49999 is the number of GPT counting cycles. */ + g_gptHandle.refA0.refdot = 10000; /* 10000 is the value of PWM reference point A. */ + g_gptHandle.refA0.refAction = GPT_ACTION_OUTPUT_HIGH; /* GPT Action high */ + g_gptHandle.refB0.refdot = 30000; /* 30000 is the value of PWM reference point B. */ + g_gptHandle.refB0.refAction = GPT_ACTION_OUTPUT_LOW; + g_gptHandle.bufLoad = BASE_CFG_ENABLE; + g_gptHandle.pwmKeep = BASE_CFG_ENABLE; + g_gptHandle.handleEx.periodIntEnable = BASE_CFG_DISABLE; + g_gptHandle.handleEx.outputFinIntEnable = BASE_CFG_DISABLE; + g_gptHandle.triggleAdcOutFinish = BASE_CFG_DISABLE; + g_gptHandle.triggleAdcPeriod = BASE_CFG_DISABLE; + + HAL_GPT_Init(&g_gptHandle); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + + g_uart0Handle.baseAddress = UART0; + + g_uart0Handle.baudRate = UART0_BAND_RATE; + g_uart0Handle.dataLength = UART_DATALENGTH_8BIT; + g_uart0Handle.stopBits = UART_STOPBITS_ONE; + g_uart0Handle.parity = UART_PARITY_NONE; + g_uart0Handle.txMode = UART_MODE_BLOCKING; + g_uart0Handle.rxMode = UART_MODE_BLOCKING; + g_uart0Handle.fifoMode = BASE_CFG_ENABLE; + g_uart0Handle.fifoTxThr = UART_FIFODEPTH_SIZE8; + g_uart0Handle.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart0Handle.hwFlowCtr = BASE_CFG_DISABLE; + g_uart0Handle.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart0Handle.handleEx.msbFirst = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0Handle); +} + +static void IOConfig(void) +{ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO5_2_AS_GPT2_PWM); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO5_2_AS_GPT2_PWM, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO5_2_AS_GPT2_PWM, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO5_2_AS_GPT2_PWM, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO5_2_AS_GPT2_PWM, DRIVER_RATE_2); /* Output signal edge fast/slow */ +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + GPT2_Init(); + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/gpt/sample_gpt_pwm_output/readme.md b/drivers_sample/gpt/sample_gpt_pwm_output/readme.md new file mode 100644 index 000000000..90349ef63 --- /dev/null +++ b/drivers_sample/gpt/sample_gpt_pwm_output/readme.md @@ -0,0 +1,24 @@ +# 通用脉宽调制PWM-输出频率和占空比可配的PWM波 +## 关键字: PWM, 占空比 + +**【功能描述】** ++ 该GPT示例中产生连续的PWM波。 + ++ 持续输出10s的PWM波之后,会更改PWM的周期和占空比。 + +**【示例配置】** ++ 示例默认输出频率50Hz,占空比为40%的PWM波,其中周期可通过配置Period项更改,占空比可通过refA0和RefB0的参考值进行更改。 + ++ 定时器计时10s之后,通过“HAL_GPT_Config”函数,更改GPT输出PWM波的周期和占空比。 + +**【示例效果】** ++ 在IOCMG_8输出连续方波,如果IOCMG_8上无对应外设,可通过示波器观察方波的周期和占空比。 + ++ 串口0提示GPT输出信息和更改参数的信息。 + +**【注意事项】** ++ 更改PWM的周期和占空比一般先使用“HAL_GPT_GetConfig”获取GPT的配置,再使用“HAL_GPT_Config”更改GPT的配置。 + ++ 串口0输出提示信息。 + ++ ```c输出的PWMPWM频率=工作时钟频率/((分频系数+1)*(计数周期值+1))``` \ No newline at end of file diff --git a/drivers_sample/gpt/sample_gpt_pwm_output/src/sample_gpt_pwm_output.c b/drivers_sample/gpt/sample_gpt_pwm_output/src/sample_gpt_pwm_output.c new file mode 100644 index 000000000..10f03685e --- /dev/null +++ b/drivers_sample/gpt/sample_gpt_pwm_output/src/sample_gpt_pwm_output.c @@ -0,0 +1,45 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_gpt_pwm_output.c + * @author MCU Driver Team + * @brief gpt sample module. + * @details This file provides users with sample code to help use GPT function: + * 1) Generate a continuous square wave with period and duty set in the function SystemInit. + * 2) Change the period and duty. + */ +#include "sample_gpt_pwm_output.h" + +/** + * @brief GPT run and modify period and duty during running. + * @param None. + * @retval None. + */ +void GPT_SampleMain(void) +{ + SystemInit(); + DBG_PRINTF("GPT Continued Run begin\r\n"); + HAL_GPT_Start(&g_gptHandle); + BASE_FUNC_DelaySeconds(10); /* Delay 10 seconds */ + DBG_PRINTF("Change the duty to 50%%\r\n"); + + HAL_GPT_GetConfig(&g_gptHandle); + g_gptHandle.period = 59999; /* 59999 is the number of GPT counting cycles. */ + g_gptHandle.refA0.refdot = 20000; /* 20000 is the value of PWM reference point A. */ + g_gptHandle.refB0.refdot = 50000; /* 50000 is the value of PWM reference point A. */ + HAL_GPT_Config(&g_gptHandle); +} diff --git a/drivers_sample/gpt/sample_gpt_simplerun/inc/sample_gpt_simplerun.h b/drivers_sample/gpt/sample_gpt_simplerun/inc/sample_gpt_simplerun.h new file mode 100644 index 000000000..91fd12586 --- /dev/null +++ b/drivers_sample/gpt/sample_gpt_simplerun/inc/sample_gpt_simplerun.h @@ -0,0 +1,32 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_gpt_simplerun.h + * @author MCU Driver Team + * @brief gpt sample module. + * @details This file provides users with sample code to help use GPT function: + * GPT runs. + */ +#ifndef SAMPLE_GPT_SIMPLERUN_H +#define SAMPLE_GPT_SIMPLERUN_H + +#include "debug.h" +#include "gpt.h" +#include "main.h" + +void GPT_SampleMain(void); +#endif \ No newline at end of file diff --git a/drivers_sample/gpt/sample_gpt_simplerun/init/main.c b/drivers_sample/gpt/sample_gpt_simplerun/init/main.c new file mode 100644 index 000000000..d2407363e --- /dev/null +++ b/drivers_sample/gpt/sample_gpt_simplerun/init/main.c @@ -0,0 +1,36 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "feature.h" +#include "main.h" +#include "sample_gpt_simplerun.h" + +GPT_Handle g_gptHandle; +UART_Handle g_uart0Handle; + +int main(void) +{ + GPT_SampleMain(); + while (1) { + } + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/gpt/sample_gpt_simplerun/init/main.h b/drivers_sample/gpt/sample_gpt_simplerun/init/main.h new file mode 100644 index 000000000..11edb26a6 --- /dev/null +++ b/drivers_sample/gpt/sample_gpt_simplerun/init/main.h @@ -0,0 +1,46 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "gpt.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +extern GPT_Handle g_gptHandle; + +extern UART_Handle g_uart0Handle; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/gpt/sample_gpt_simplerun/init/system_init.c b/drivers_sample/gpt/sample_gpt_simplerun/init/system_init.c new file mode 100644 index 000000000..70ada1e1c --- /dev/null +++ b/drivers_sample/gpt/sample_gpt_simplerun/init/system_init.c @@ -0,0 +1,112 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void GPT1_Init(void) +{ + HAL_CRG_IpEnableSet(GPT1_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(GPT1_BASE, CRG_PLL_NO_PREDV); + + g_gptHandle.baseAddress = GPT1; + g_gptHandle.period = 10000 * 1000; /* Period counter, Period = 10000us, 1000ns in 1us */ + g_gptHandle.duty = 10000 * 10 * 10; /* Duty counter, duty = 10000 / 10 us */ + g_gptHandle.pwmPolarity = BASE_CFG_ENABLE; /* Continuous output */ + g_gptHandle.pwmKeep = BASE_CFG_ENABLE; /* Continuous output */ + HAL_GPT_Init(&g_gptHandle); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); + + g_uart0Handle.baseAddress = UART0; + g_uart0Handle.irqNum = IRQ_UART0; + + g_uart0Handle.baudRate = UART0_BAND_RATE; + g_uart0Handle.dataLength = UART_DATALENGTH_8BIT; + g_uart0Handle.stopBits = UART_STOPBITS_ONE; + g_uart0Handle.parity = UART_PARITY_NONE; + g_uart0Handle.txMode = UART_MODE_BLOCKING; + g_uart0Handle.rxMode = UART_MODE_BLOCKING; + g_uart0Handle.fifoMode = BASE_CFG_ENABLE; + g_uart0Handle.fifoTxThr = UART_FIFOFULL_ONE_TWO; + g_uart0Handle.fifoRxThr = UART_FIFOFULL_ONE_TWO; + g_uart0Handle.hwFlowCtr = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0Handle); +} + +static void IOConfig(void) +{ + IOConfig_RegStruct *iconfig = IOCONFIG; + + iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ + iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ + iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_14.BIT.func = 0x2; /* 0x2 is GPT1_PWM */ + iconfig->iocmg_14.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_14.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_14.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_14.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_14.BIT.se = BASE_CFG_DISABLE; +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + GPT1_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/gpt/sample_gpt_simplerun/readme.md b/drivers_sample/gpt/sample_gpt_simplerun/readme.md new file mode 100644 index 000000000..c77b1f1cf --- /dev/null +++ b/drivers_sample/gpt/sample_gpt_simplerun/readme.md @@ -0,0 +1,18 @@ +# 输出占空比可配的PWM波 +## 关键字: PWM, PWM波 + +**【功能描述】** ++ 该GPT示例中产生连续的PWM波,周期和占空比可配。 + +**【示例配置】** ++ 该示例默认输出频率50Hz,占空比为40%的PWM波,周期和占空比均可通过“HAL_GPT_Config”进行更改。 + +**【示例效果】** ++ 串口0提示GPT输出信息和更改参数的信息。 + ++ 在IOCMG_8输出连续方波,如果IOCMG_8上无对应外设,可通过示波器观察方波的周期和占空比。 + +**【注意事项】** ++ 更改PWM的周期和占空比一般先使用“HAL_GPT_GetConfig”获取GPT的配置,再使用“HAL_GPT_Config”更改GPT的配置。 + ++ 输出频率计算:```c输出的PWMPWM频率=工作时钟频率/((分频系数+1)*(计数周期值+1))``` \ No newline at end of file diff --git a/drivers_sample/gpt/sample_gpt_simplerun/src/sample_gpt_simplerun.c b/drivers_sample/gpt/sample_gpt_simplerun/src/sample_gpt_simplerun.c new file mode 100644 index 000000000..7e6e9ad6b --- /dev/null +++ b/drivers_sample/gpt/sample_gpt_simplerun/src/sample_gpt_simplerun.c @@ -0,0 +1,53 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_gpt_simplerun.c + * @author MCU Driver Team + * @brief gpt sample module. + * @details This file provides users with sample code to help use GPT function: + * 1) Generate a continuous square wave with period and duty set in the function SystemInit. + * 2) Change the period and duty, or any parameters you need to modify during gpt running + * Output square wave at iocmg_8. If no peripheral is connected to iocmg_8, please use an + * oscilloscope to measure the output square wave. + */ +#include "sample_gpt_simplerun.h" + +/** + * @brief GPT run and modify period and duty during running. + * @param None. + * @retval None. + */ +void GPT_SampleMain(void) +{ + GPT_Handle gpt; + SystemInit(); + DBG_PRINTF("GPT Continued Run begin\r\n"); + HAL_GPT_Start(&g_gptHandle); + + BASE_FUNC_DelaySeconds(10); /* Delay 10 seconds */ + gpt.baseAddress = g_gptHandle.baseAddress; + if (HAL_GPT_GetConfig(&gpt) != BASE_STATUS_OK) { + return; + } + + DBG_PRINTF("Change GPT Period and duty\r\n"); + gpt.period = 5000000; /* Change period to 5000000 ns */ + gpt.duty = 1000000; /* Change period to 1000000 ns */ + if (HAL_GPT_Config(&gpt) != BASE_STATUS_OK) { + return; + } +} diff --git a/drivers_sample/i2c/sample_i2c_blocking_stlm75/inc/sample_i2c_blocking_stlm75.h b/drivers_sample/i2c/sample_i2c_blocking_stlm75/inc/sample_i2c_blocking_stlm75.h new file mode 100644 index 000000000..f8b03b2a0 --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_blocking_stlm75/inc/sample_i2c_blocking_stlm75.h @@ -0,0 +1,29 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_i2c_blocking_stlm75.h + * @author MCU Driver Team + * @brief I2C module sample. + * @details This file provides sample code for users to help use + * the functionalities of the I2C. + */ +#ifndef McuMagicTag_SAMPLE_I2C_BLOCKING_STLM75_H +#define McuMagicTag_SAMPLE_I2C_BLOCKING_STLM75_H + +unsigned int Stlm75SampleProcessing(void); + +#endif \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_blocking_stlm75/init/main.c b/drivers_sample/i2c/sample_i2c_blocking_stlm75/init/main.c new file mode 100644 index 000000000..fa66b1c86 --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_blocking_stlm75/init/main.c @@ -0,0 +1,35 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ +#include "feature.h" +#include "main.h" +#include "sample_i2c_blocking_stlm75.h" + +I2C_Handle g_i2cSampleHandle; +UART_Handle g_uart0; + +int main(void) +{ + Stlm75SampleProcessing(); + while (1) { + } + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_blocking_stlm75/init/main.h b/drivers_sample/i2c/sample_i2c_blocking_stlm75/init/main.h new file mode 100644 index 000000000..3172be17a --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_blocking_stlm75/init/main.h @@ -0,0 +1,46 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "i2c.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +extern I2C_Handle g_i2cSampleHandle; + +extern UART_Handle g_uart0; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_blocking_stlm75/init/system_init.c b/drivers_sample/i2c/sample_i2c_blocking_stlm75/init/system_init.c new file mode 100644 index 000000000..898405abd --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_blocking_stlm75/init/system_init.c @@ -0,0 +1,127 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" + +#define UART0_BAND_RATE 115200 + +#define I2C_FREQ_SCR 100000 +#define I2C_HOLD_DURATION 10 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void I2C_Init(void) +{ + HAL_CRG_IpEnableSet(I2C_BASE, IP_CLK_ENABLE); + + g_i2cSampleHandle.baseAddress = I2C; + g_i2cSampleHandle.irqNum = IRQ_I2C; + + g_i2cSampleHandle.addrMode = I2C_7_BITS; + g_i2cSampleHandle.sdaHoldTime = I2C_HOLD_DURATION; + g_i2cSampleHandle.freq = I2C_FREQ_SCR; + g_i2cSampleHandle.rxBuff = NULL; + g_i2cSampleHandle.txBuff = NULL; + g_i2cSampleHandle.ignoreAckFlag = BASE_CFG_DISABLE; + g_i2cSampleHandle.msgStopFlag = BASE_CFG_ENABLE; + g_i2cSampleHandle.state = I2C_STATE_RESET; + HAL_I2C_Init(&g_i2cSampleHandle); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); + + g_uart0.baseAddress = UART0; + g_uart0.irqNum = IRQ_UART0; + + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + IOConfig_RegStruct *iconfig = IOCONFIG; + + iconfig->iocmg_14.BIT.func = 0x5; /* 0x5 is I2C0_SCL */ + iconfig->iocmg_14.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_14.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_14.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_14.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_14.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_15.BIT.func = 0x5; /* 0x5 is I2C0_SDA */ + iconfig->iocmg_15.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_15.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_15.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_15.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_15.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ + iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ + iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + I2C_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_blocking_stlm75/readme.md b/drivers_sample/i2c/sample_i2c_blocking_stlm75/readme.md new file mode 100644 index 000000000..373c158ce --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_blocking_stlm75/readme.md @@ -0,0 +1,18 @@ +# 配置I2C作为主机以阻塞方式进行数据的接收、发送,通过Debug串口打印读取的数据 +## 关键字: I2C, 主机,数据读取,数据发送,阻塞方式 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、I2C控制器初始化和功能配置。通过阻塞方式与STLM75温度传感器进行数据的接收和数据的发送,通过Debug串口打印读取的温度数值。 + +**【示例配置】** + ++ I2C初始化:调用接口"HAL_I2C_Init()”完成对示例代码中I2C的基地址、寻址模式(7bit寻址或10bit寻址)、通讯速率等参数进行配置。 + ++ 操作I2C读取温度传感器的数值操作:通过调用 "HAL_I2C_MasterWriteBlocking()"接口以阻塞方式实现温度传感器的目标内存地址写入数据;通过调用"HAL_I2C_MasterReadBlocking()"接口以阻塞方式实现接收温度传感器发送的数据。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码中会通过I2C以阻塞方式读取温度传感器的数值,Debug串口打印读取的温度数值信息。 + +**【注意事项】** ++ 示例代码使用UART0进行结果打印输出,需要对UART0配置。 ++ I2C必须必须对接stlm75温度传感器,否则程序无法正常运行。 \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_blocking_stlm75/src/sample_i2c_blocking_stlm75.c b/drivers_sample/i2c/sample_i2c_blocking_stlm75/src/sample_i2c_blocking_stlm75.c new file mode 100644 index 000000000..2c2792295 --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_blocking_stlm75/src/sample_i2c_blocking_stlm75.c @@ -0,0 +1,80 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_i2c_blocking_stlm75.c + * @author MCU Driver Team + * @brief Sample for I2C Module Blocking. + * @details This sample is connected to the temperature sensor stlm75 to demonstrate how to use the HAL interface that + * operates in blocking mode in the I2C driver. + * This sample must be connected to the stlm75 temperature sensor. + * Run the sample and print the temperature value through the serial port. + */ +#include "main.h" +#include "i2c.h" +#include "debug.h" +#include "sample_i2c_blocking_stlm75.h" + +#define STLM75_DEV_ADDR_WRITE 0x90 +#define STLM75_DEV_ADDR_READ 0x91 + +#define MAX_TIMEOUT_VAL 5000 + +/** + * @brief I2c blocking sample lm75 read two byte. + * @param addr stlm75 address. + * @retval unsigned short. + */ +static unsigned short Stlm75ReadtwoByte(unsigned char addr) +{ + unsigned short temp; + unsigned char opAddr = addr; + unsigned char rxBuff[3]; + + HAL_I2C_MasterWriteBlocking(&g_i2cSampleHandle, STLM75_DEV_ADDR_WRITE, &opAddr, 1, MAX_TIMEOUT_VAL); + HAL_I2C_MasterReadBlocking(&g_i2cSampleHandle, STLM75_DEV_ADDR_READ, rxBuff, 2, MAX_TIMEOUT_VAL); /* Read 2 data */ + + temp = rxBuff[0]; + temp <<= 8; /* Shift left by 8 bits */ + temp = temp | rxBuff[1]; + return temp; +} + +/** + * @brief I2c blocking sample processing. + * @param addr lm75 address. + * @retval unsigned int, 0 is OK, other is fail. + */ +unsigned int Stlm75SampleProcessing(void) +{ + unsigned short temp; + float ftemp; + + SystemInit(); + while (1) { + temp = Stlm75ReadtwoByte(0x00); + temp >>= 5; /* Move the data by 5 bits to the right to obtain the lower 10 bits. */ + if ((temp & 0x0400) == 0x0400) { /* Determine the 10th digit. temp & 0x0400 */ + ftemp = -temp * 0.125; /* The formula is temp x 0.125. */ + } else { + ftemp = temp * 0.125; /* The formula is temp x 0.125. */ + } + DBG_PRINTF("ftemp = %f\r\n", ftemp); + BASE_FUNC_DELAY_MS(1000); /* Delay 1000ms */ + } + return 0; +} + diff --git a/drivers_sample/i2c/sample_i2c_dma_stlm75/inc/sample_i2c_dma_stlm75.h b/drivers_sample/i2c/sample_i2c_dma_stlm75/inc/sample_i2c_dma_stlm75.h new file mode 100644 index 000000000..b5e595905 --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_dma_stlm75/inc/sample_i2c_dma_stlm75.h @@ -0,0 +1,29 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_i2c_dma_stlm75.h + * @author MCU Driver Team + * @brief I2C module sample. + * @details This file provides sample code for users to help use + * the functionalities of the I2C. + */ +#ifndef McuMagicTag_SAMPLE_I2C_DMA_STLM75_H +#define McuMagicTag_SAMPLE_I2C_DMA_STLM75_H + +void Stlm75DmaSampleProcessing(void); + +#endif \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_dma_stlm75/init/main.c b/drivers_sample/i2c/sample_i2c_dma_stlm75/init/main.c new file mode 100644 index 000000000..e664ac529 --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_dma_stlm75/init/main.c @@ -0,0 +1,37 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ +#include "feature.h" +#include "main.h" +#include "sample_i2c_dma_stlm75.h" + +I2C_Handle g_i2cSampleHandle; +UART_Handle g_uart0; + +DMA_Handle g_dmac; + +int main(void) +{ + Stlm75DmaSampleProcessing(); + while (1) { + } + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_dma_stlm75/init/main.h b/drivers_sample/i2c/sample_i2c_dma_stlm75/init/main.h new file mode 100644 index 000000000..9eaeb40f0 --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_dma_stlm75/init/main.h @@ -0,0 +1,53 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "i2c.h" +#include "crg.h" +#include "dma.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +extern I2C_Handle g_i2cSampleHandle; + +extern UART_Handle g_uart0; + +extern DMA_Handle g_dmac; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +void Stlm75TxSampleHandle(I2C_Handle *handle); +void Stlm75RxSampleHandle(I2C_Handle *handle); +void Stlm75ErrSampleHandle(I2C_Handle *handle); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_dma_stlm75/init/system_init.c b/drivers_sample/i2c/sample_i2c_dma_stlm75/init/system_init.c new file mode 100644 index 000000000..9a3a65a7f --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_dma_stlm75/init/system_init.c @@ -0,0 +1,192 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" + +#define UART0_BAND_RATE 115200 + +#define I2C_FREQ_SCR 100000 +#define I2C_HOLD_DURATION 10 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void DMA_Channel2Init(void *handle) +{ + DMA_ChannelParam dma_param; + dma_param.direction = DMA_PERIPH_TO_MEMORY_BY_DMAC; + dma_param.srcAddrInc = DMA_ADDR_UNALTERED; + dma_param.destAddrInc = DMA_ADDR_UNALTERED; + dma_param.srcPeriph = DMA_REQUEST_I2C_RX; + dma_param.destPeriph = DMA_REQUEST_MEM; + dma_param.srcWidth = DMA_TRANSWIDTH_BYTE; + dma_param.destWidth = DMA_TRANSWIDTH_BYTE; + dma_param.srcBurst = DMA_BURST_LENGTH_1; + dma_param.destBurst = DMA_BURST_LENGTH_1; + dma_param.pHandle = handle; + HAL_DMA_InitChannel(&g_dmac, &dma_param, 2); /* Channel 2 */ +} + +static void DMA_Init(void) +{ + g_dmac.baseAddress = DMA; + g_dmac.srcByteOrder = DMA_BYTEORDER_SMALLENDIAN; + g_dmac.destByteOrder = DMA_BYTEORDER_SMALLENDIAN; + g_dmac.irqNumTc = IRQ_DMA_TC; + g_dmac.irqNumError = IRQ_DMA_ERR; + HAL_DMA_IRQService(&g_dmac); + IRQ_EnableN(IRQ_DMA_TC); + IRQ_EnableN(IRQ_DMA_ERR); + HAL_DMA_Init(&g_dmac); + + DMA_Channel2Init((void *)(&g_i2cSampleHandle)); +} + +__weak void Stlm75TxSampleHandle(I2C_Handle *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN Stlm75TxSampleHandle */ + /* USER CODE END Stlm75TxSampleHandle */ +} + +__weak void Stlm75RxSampleHandle(I2C_Handle *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN Stlm75RxSampleHandle */ + /* USER CODE END Stlm75RxSampleHandle */ +} + +__weak void Stlm75ErrSampleHandle(I2C_Handle *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN Stlm75ErrSampleHandle */ + /* USER CODE END Stlm75ErrSampleHandle */ +} + +static void I2C_Init(void) +{ + HAL_CRG_IpEnableSet(I2C_BASE, IP_CLK_ENABLE); + + g_i2cSampleHandle.baseAddress = I2C; + g_i2cSampleHandle.irqNum = IRQ_I2C; + + g_i2cSampleHandle.addrMode = I2C_7_BITS; + g_i2cSampleHandle.sdaHoldTime = I2C_HOLD_DURATION; + g_i2cSampleHandle.freq = I2C_FREQ_SCR; + g_i2cSampleHandle.rxBuff = NULL; + g_i2cSampleHandle.txBuff = NULL; + g_i2cSampleHandle.ignoreAckFlag = BASE_CFG_DISABLE; + g_i2cSampleHandle.msgStopFlag = BASE_CFG_ENABLE; + g_i2cSampleHandle.state = I2C_STATE_RESET; + g_i2cSampleHandle.rxWaterMark = 1; /* Rx water mark is 1 */ + g_i2cSampleHandle.txWaterMark = 16; /* Tx water mark is 16 */ + g_i2cSampleHandle.dmaHandle = &g_dmac; + g_i2cSampleHandle.dmaCh = 2; /* Channel is 2 */ + g_i2cSampleHandle.srcBurst = DMA_BURST_LENGTH_1; + g_i2cSampleHandle.destBurst = DMA_BURST_LENGTH_1; + g_i2cSampleHandle.srcWidth = DMA_TRANSWIDTH_BYTE; + g_i2cSampleHandle.destWidth = DMA_TRANSWIDTH_BYTE; + HAL_I2C_Init(&g_i2cSampleHandle); + + HAL_I2C_RegisterCallback(&g_i2cSampleHandle, I2C_MASTER_TX_COMPLETE_CB_ID, Stlm75TxSampleHandle); + HAL_I2C_RegisterCallback(&g_i2cSampleHandle, I2C_MASTER_RX_COMPLETE_CB_ID, Stlm75RxSampleHandle); + HAL_I2C_RegisterCallback(&g_i2cSampleHandle, I2C_ERROR_CB_ID, Stlm75ErrSampleHandle); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); + + g_uart0.baseAddress = UART0; + g_uart0.irqNum = IRQ_UART0; + + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + IOConfig_RegStruct *iconfig = IOCONFIG; + + iconfig->iocmg_66.BIT.func = 0x2; /* 0x2 is I2C0_SCL */ + iconfig->iocmg_66.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_66.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_66.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_66.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_66.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_67.BIT.func = 0x2; /* 0x2 is I2C0_SDA */ + iconfig->iocmg_67.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_67.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_67.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_67.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_67.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ + iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ + iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + DMA_Init(); + I2C_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_dma_stlm75/readme.md b/drivers_sample/i2c/sample_i2c_dma_stlm75/readme.md new file mode 100644 index 000000000..fdf5d2ae3 --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_dma_stlm75/readme.md @@ -0,0 +1,18 @@ +# 配置I2C作为主机以DMA方式进行数据的接收、发送,通过Debug串口打印读取的数据 +## 关键字: I2C, 主机,数据读取,数据发送,DMA方式 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、I2C控制器初始化和功能配置。通过DMA方式与STLM75温度传感器进行数据的接收和数据的发送,通过Debug串口打印读取的温度数值。 + +**【示例配置】** + ++ I2C初始化:调用接口"HAL_I2C_Init()”完成对示例代码中I2C的基地址、寻址模式(7bit寻址或10bit寻址)、通讯速率、DMA通道等参数进行配置。调用"HAL_I2C_RegisterCallback()"接口注册收发完成、传输错误时的回调函数。 + ++ 操作I2C读取温度传感器的数值操作:通过调用 "HAL_I2C_MasterWriteDMA()"接口以DMA方式实现温度传感器的目标内存地址写入数据;通过调用"HAL_I2C_MasterReadDMA()"接口以DMA方式实现接收温度传感器发送的数据。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码中会通过I2C以DMA方式读取温度传感器的数值,Debug串口打印发送或接收数据完成的信息与读取的温度数值信息。功能异常时会打印错误提示信息。 + +**【注意事项】** ++ 示例代码使用UART0进行结果打印输出,需要对UART0配置。 ++ I2C必须必须对接stlm75温度传感器,否则程序无法正常运行。 \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_dma_stlm75/src/sample_i2c_dma_stlm75.c b/drivers_sample/i2c/sample_i2c_dma_stlm75/src/sample_i2c_dma_stlm75.c new file mode 100644 index 000000000..67130b8bd --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_dma_stlm75/src/sample_i2c_dma_stlm75.c @@ -0,0 +1,110 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_i2c_dma_stlm75.c + * @author MCU Driver Team + * @brief Sample for I2C Module DMA. + * @details This sample is connected to the temperature sensor stlm75 to demonstrate how to use the HAL interface that + * operates in DMA mode in the I2C driver. + * This sample must be connected to the stlm75 temperature sensor. + * Run the sample and print the temperature value through the serial port. + */ +#include "main.h" +#include "i2c.h" +#include "debug.h" +#include "sample_i2c_dma_stlm75.h" + +#define DEV_ADDR_WRITE 0x90 +#define DEV_ADDR_READ 0x91 + + +static volatile unsigned char g_txFlang = 0; +static volatile unsigned char g_rxFlang = 0; + +static unsigned char g_rxBuff[3]; +static unsigned char g_txBuff[3]; + +/** + * @brief I2c dma sample stlm75 error handle. + * @param handle I2c handle. + * @retval None. + */ +void Stlm75ErrSampleHandle(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("errHandle\r\n"); +} + +/** + * @brief I2c dma sample stlm75 tx handle. + * @param handle I2c handle. + * @retval None. + */ +void Stlm75TxSampleHandle(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("txHandle\r\n"); + g_txFlang = 1; +} + +/** + * @brief I2c dma sample stlm75 rx handle. + * @param handle I2c handle. + * @retval None. + */ +void Stlm75RxSampleHandle(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("rxHandle\r\n"); + g_rxFlang = 1; +} + +/** + * @brief I2c dma sample stlm75 init. + * @param None. + * @retval None. + */ +void Stlm75DmaSampleProcessing(void) +{ + unsigned short temp = 0; + float ftemp = 0; + g_txBuff[0] = 0; + + SystemInit(); + HAL_I2C_MasterWriteDMA(&g_i2cSampleHandle, DEV_ADDR_WRITE, g_txBuff, 1); + while (1) { + if (g_rxFlang > 0) { + g_rxFlang = 0; + temp = g_rxBuff[0]; + temp <<= 8; /* Shift left by 8 bits */ + temp = temp | g_rxBuff[1]; + temp >>= 5; /* Move right by 5 digits */ + if ((temp & 0x0400) == 0x0400) { /* Determine the 10th digit. temp & 0x0400 */ + ftemp = -temp * 0.125; /* The formula is temp x 0.125. */ + } else { + ftemp = temp * 0.125; /* The formula is temp x 0.125. */ + } + DBG_PRINTF("ftemp = %f\r\n", ftemp); + HAL_I2C_MasterWriteDMA(&g_i2cSampleHandle, DEV_ADDR_WRITE, g_txBuff, 1); + } + if (g_txFlang > 0) { + g_txFlang = 0; + HAL_I2C_MasterReadDMA(&g_i2cSampleHandle, DEV_ADDR_READ, g_rxBuff, 2); /* Read 2 data */ + } + BASE_FUNC_DELAY_MS(500); /* Delay 500ms */ + } +} \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_interrupt_stlm75/inc/sample_i2c_interrupt_stlm75.h b/drivers_sample/i2c/sample_i2c_interrupt_stlm75/inc/sample_i2c_interrupt_stlm75.h new file mode 100644 index 000000000..e2138fc4a --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_interrupt_stlm75/inc/sample_i2c_interrupt_stlm75.h @@ -0,0 +1,29 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_i2c_interrupt_stlm75.h + * @author MCU Driver Team + * @brief I2C module sample. + * @details This file provides sample code for users to help use + * the functionalities of the I2C. + */ +#ifndef McuMagicTag_SAMPLE_I2C_INTERRUPT_STLM75_H +#define McuMagicTag_SAMPLE_I2C_INTERRUPT_STLM75_H + +void I2cStlm75InterruptSampleProcessing(void); + +#endif \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_interrupt_stlm75/init/main.c b/drivers_sample/i2c/sample_i2c_interrupt_stlm75/init/main.c new file mode 100644 index 000000000..0c1901996 --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_interrupt_stlm75/init/main.c @@ -0,0 +1,35 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ +#include "feature.h" +#include "main.h" +#include "sample_i2c_interrupt_stlm75.h" + +I2C_Handle g_i2cSampleHandle; +UART_Handle g_uart0; + +int main(void) +{ + I2cStlm75InterruptSampleProcessing(); + while (1) { + } + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_interrupt_stlm75/init/main.h b/drivers_sample/i2c/sample_i2c_interrupt_stlm75/init/main.h new file mode 100644 index 000000000..752da1c91 --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_interrupt_stlm75/init/main.h @@ -0,0 +1,50 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "i2c.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +extern I2C_Handle g_i2cSampleHandle; + +extern UART_Handle g_uart0; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +void Stlm75TxCallbackHandle(I2C_Handle *handle); +void Stlm75RxCallbackHandle(I2C_Handle *handle); +void Stlm75ErrCallbackHandle(I2C_Handle *handle); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_interrupt_stlm75/init/system_init.c b/drivers_sample/i2c/sample_i2c_interrupt_stlm75/init/system_init.c new file mode 100644 index 000000000..0ac4197c1 --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_interrupt_stlm75/init/system_init.c @@ -0,0 +1,157 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" + +#define UART0_BAND_RATE 115200 + +#define I2C_FREQ_SCR 100000 +#define I2C_HOLD_DURATION 10 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +__weak void Stlm75TxCallbackHandle(I2C_Handle *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN Stlm75TxCallbackHandle */ + /* USER CODE END Stlm75TxCallbackHandle */ +} + +__weak void Stlm75RxCallbackHandle(I2C_Handle *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN Stlm75RxCallbackHandle */ + /* USER CODE END Stlm75RxCallbackHandle */ +} + +__weak void Stlm75ErrCallbackHandle(I2C_Handle *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN Stlm75ErrCallbackHandle */ + /* USER CODE END Stlm75ErrCallbackHandle */ +} + +static void I2C_Init(void) +{ + HAL_CRG_IpEnableSet(I2C_BASE, IP_CLK_ENABLE); + + g_i2cSampleHandle.baseAddress = I2C; + g_i2cSampleHandle.irqNum = IRQ_I2C; + + g_i2cSampleHandle.addrMode = I2C_7_BITS; + g_i2cSampleHandle.sdaHoldTime = I2C_HOLD_DURATION; + g_i2cSampleHandle.freq = I2C_FREQ_SCR; + g_i2cSampleHandle.rxBuff = NULL; + g_i2cSampleHandle.txBuff = NULL; + g_i2cSampleHandle.ignoreAckFlag = BASE_CFG_DISABLE; + g_i2cSampleHandle.msgStopFlag = BASE_CFG_ENABLE; + g_i2cSampleHandle.state = I2C_STATE_RESET; + g_i2cSampleHandle.rxWaterMark = 32; /* Rx water mark is 32 */ + g_i2cSampleHandle.txWaterMark = 32; /* Tx water mark is 32 */ + HAL_I2C_Init(&g_i2cSampleHandle); + + HAL_I2C_RegisterCallback(&g_i2cSampleHandle, I2C_MASTER_TX_COMPLETE_CB_ID, Stlm75TxCallbackHandle); + HAL_I2C_RegisterCallback(&g_i2cSampleHandle, I2C_MASTER_RX_COMPLETE_CB_ID, Stlm75RxCallbackHandle); + HAL_I2C_RegisterCallback(&g_i2cSampleHandle, I2C_ERROR_CB_ID, Stlm75ErrCallbackHandle); + HAL_I2C_IRQService(&g_i2cSampleHandle); + IRQ_SetPriority(g_i2cSampleHandle.irqNum, 1); + IRQ_EnableN(IRQ_I2C); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); + + g_uart0.baseAddress = UART0; + g_uart0.irqNum = IRQ_UART0; + + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + IOConfig_RegStruct *iconfig = IOCONFIG; + + iconfig->iocmg_14.BIT.func = 0x5; /* 0x5 is I2C0_SCL */ + iconfig->iocmg_14.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_14.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_14.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_14.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_14.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_15.BIT.func = 0x5; /* 0x5 is I2C0_SDA */ + iconfig->iocmg_15.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_15.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_15.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_15.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_15.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ + iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ + iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + I2C_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_interrupt_stlm75/readme.md b/drivers_sample/i2c/sample_i2c_interrupt_stlm75/readme.md new file mode 100644 index 000000000..2e396faeb --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_interrupt_stlm75/readme.md @@ -0,0 +1,18 @@ +# 配置I2C作为主机以中断方式进行数据的接收、发送,通过Debug串口打印读取的数据 +## 关键字: I2C, 主机,数据读取,数据发送,中断方式 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、I2C控制器初始化和功能配置。通过中断方式与STLM75温度传感器进行数据的接收和数据的发送,通过Debug串口打印读取的温度数值。 + +**【示例配置】** + ++ I2C初始化:调用接口"HAL_I2C_Init()”完成对示例代码中I2C的基地址、寻址模式(7bit寻址或10bit寻址)、通讯速率等参数进行配置。调用"HAL_I2C_RegisterCallback()"接口注册中断回调函数,并使能相关中断配置。 + ++ 操作I2C读取温度传感器的数值操作:通过调用 "HAL_I2C_MasterWriteIT()"接口以中断方式实现温度传感器的目标内存地址写入数据;通过调用"HAL_I2C_MasterReadIT()"接口以中断方式实现接收温度传感器发送的数据。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码中会通过I2C以中断方式读取温度传感器的数值,Debug串口打印发送或接收数据完成的信息与读取的温度数值信息。功能异常时会打印错误提示信息。 + +**【注意事项】** ++ 示例代码使用UART0进行结果打印输出,需要对UART0配置。 ++ I2C必须必须对接stlm75温度传感器,否则程序无法正常运行。 \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_interrupt_stlm75/src/sample_i2c_interrupt_stlm75.c b/drivers_sample/i2c/sample_i2c_interrupt_stlm75/src/sample_i2c_interrupt_stlm75.c new file mode 100644 index 000000000..a39820ccc --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_interrupt_stlm75/src/sample_i2c_interrupt_stlm75.c @@ -0,0 +1,110 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_i2c_interrupt_stlm75.c + * @author MCU Driver Team + * @brief Sample for I2C Module Interrupt. + * @details This sample is connected to the temperature sensor stlm75 to demonstrate how to use the HAL interface that + * operates in interrupt mode in the I2C driver. + * This sample must be connected to the stlm75 temperature sensor. + * Run the sample and print the temperature value through the serial port. + */ +#include "main.h" +#include "i2c.h" +#include "interrupt.h" +#include "debug.h" +#include "sample_i2c_interrupt_stlm75.h" + +#define DEV_ADDR_WRITE 0x90 +#define DEV_ADDR_READ 0x91 + +static volatile unsigned char g_txFlang = 0; +static volatile unsigned char g_rxFlang = 0; + +static unsigned char g_rxBuff[3]; +static unsigned char g_txBuff[3]; + +/** + * @brief I2c interrupt sample stlm75 Error callback handle. + * @param handle I2c handle. + * @retval None. + */ +void Stlm75ErrCallbackHandle(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("Stlm75ErrCallbackHandle\r\n"); +} + +/** + * @brief I2c interrupt sample stlm75 tx callback handle. + * @param handle I2c handle. + * @retval None. + */ +void Stlm75TxCallbackHandle(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("Stlm75TxCallbackHandle\r\n"); + g_txFlang = 1; +} + +/** + * @brief I2c interrupt sample stlm75 rx callback handle. + * @param handle I2c handle. + * @retval None. + */ +void Stlm75RxCallbackHandle(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("Stlm75RxCallbackHandle\r\n"); + g_rxFlang = 1; +} + +/** + * @brief I2c interrupt sample stlm75 processing. + * @param None. + * @retval None. + */ +void I2cStlm75InterruptSampleProcessing(void) +{ + unsigned short temp = 0; + float ftemp = 0; + g_txBuff[0] = 0; + + SystemInit(); + HAL_I2C_MasterWriteIT(&g_i2cSampleHandle, DEV_ADDR_WRITE, g_txBuff, 1); + while (1) { + if (g_rxFlang > 0) { + g_rxFlang = 0; + temp = g_rxBuff[0]; + temp <<= 8; /* Shift left by 8 bits */ + temp = temp | g_rxBuff[1]; + temp >>= 5; /* Move right by 5 digits */ + if ((temp & 0x0400) == 0x0400) { /* Determine the 10th digit. temp & 0x0400 */ + ftemp = -temp * 0.125; /* The formula is temp x 0.125. */ + } else { + ftemp = temp * 0.125; /* The formula is temp x 0.125. */ + } + DBG_PRINTF("ftemp = %f\r\n", ftemp); + HAL_I2C_MasterWriteIT(&g_i2cSampleHandle, DEV_ADDR_WRITE, g_txBuff, 1); + } + if (g_txFlang > 0) { + g_txFlang = 0; + HAL_I2C_MasterReadIT(&g_i2cSampleHandle, DEV_ADDR_READ, g_rxBuff, 2); /* Read 2 data */ + } + BASE_FUNC_DELAY_MS(1000); /* Delay 1000ms */ + } +} diff --git a/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/inc/sample_i2c_master_blocking_at24c64.h b/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/inc/sample_i2c_master_blocking_at24c64.h new file mode 100644 index 000000000..68042bda9 --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/inc/sample_i2c_master_blocking_at24c64.h @@ -0,0 +1,29 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_i2c_master_blocking_at24c64.c + * @author MCU Driver Team + * @brief Sample for I2C module blocking as master. + * @details This sample demonstrates how to use the I2C master blocking interface to read and write the EEPROM. + * To use this sample, the I2C interface must be connected to the AT24C64 EEPROM chip. + */ +#ifndef McuMagicTag_SAMPLE_I2C_MASTER_BLOCKING_AT24C64_H +#define McuMagicTag_SAMPLE_I2C_MASTER_BLOCKING_AT24C64_H + +void I2cBlocking24c64Processing(void); + +#endif /* #ifndef McuMagicTag_SAMPLE_I2C_MASTER_BLOCKING_AT24C64_H */ \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/init/main.c b/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/init/main.c new file mode 100644 index 000000000..c2cbf8fa6 --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/init/main.c @@ -0,0 +1,52 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ + +#include "typedefs.h" +#include "feature.h" +#include "sample_i2c_master_blocking_at24c64.h" +#include "main.h" + +/* USER CODE BEGIN 0 */ +/* USER CODE END 0 */ +UART_Handle g_uart0; +I2C_Handle g_i2c0; +/* USER CODE BEGIN 1 */ +/* USER CODE END 1 */ + +int main(void) +{ + /* USER CODE BEGIN 2 */ + /* USER CODE END 2 */ + I2cBlocking24c64Processing(); + /* USER CODE BEGIN 3 */ + /* USER CODE END 3 */ + while (1) { + /* USER CODE BEGIN 4 */ + /* USER CODE END 4 */ + } + /* USER CODE BEGIN 5 */ + /* USER CODE END 5 */ + return BASE_STATUS_OK; +} + +/* USER CODE BEGIN 6 */ +/* USER CODE END 6 */ \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/init/main.h b/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/init/main.h new file mode 100644 index 000000000..bd646c19c --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/init/main.h @@ -0,0 +1,51 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "i2c.h" +#include "i2c_ex.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define XTAL_DRV_LEVEL4 0x03U +#define XTAL_DRV_LEVEL3 0x02U +#define XTAL_DRV_LEVEL2 0x01U +#define XTAL_DRV_LEVEL1 0x00U + +extern UART_Handle g_uart0; +extern I2C_Handle g_i2c0; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/init/system_init.c b/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/init/system_init.c new file mode 100644 index 000000000..2b879fce2 --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/init/system_init.c @@ -0,0 +1,125 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" +#include "iocmg_ip.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + /* Clock-related parameter configuration. */ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_1; + /* Initialize the clock configuration. */ + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void I2C0_Init(void) +{ + HAL_CRG_IpEnableSet(I2C0_BASE, IP_CLK_ENABLE); + g_i2c0.baseAddress = I2C0; + + g_i2c0.functionMode = I2C_MODE_SELECT_MASTER_ONLY; + g_i2c0.addrMode = I2C_7_BITS; + g_i2c0.sdaHoldTime = 10; /* I2C SDA hold time 10. */ + g_i2c0.freq = 400000; /* I2C SCL rate 400000 bit/s. */ + g_i2c0.transferBuff = NULL; + g_i2c0.ignoreAckFlag = BASE_CFG_DISABLE; + g_i2c0.handleEx.spikeFilterTime = 0; + g_i2c0.handleEx.sdaDelayTime = 0; + g_i2c0.timeout = 10000; /* The value of timeout is 10000ms; */ + g_i2c0.state = I2C_STATE_RESET; + HAL_I2C_Init(&g_i2c0); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); + /* UART-related parameter configuration. */ + g_uart0.baseAddress = UART0; + + g_uart0.baudRate = UART0_BAND_RATE; /* Setting the UART Baud Rate. */ + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; /* Disable uart fifo mode. */ + g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; + g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; + /* Initializing the UART0. */ + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO4_5_AS_I2C0_SCL); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO4_5_AS_I2C0_SCL, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO4_5_AS_I2C0_SCL, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO4_5_AS_I2C0_SCL, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO4_5_AS_I2C0_SCL, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO4_6_AS_I2C0_SDA); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO4_6_AS_I2C0_SDA, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO4_6_AS_I2C0_SDA, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO4_6_AS_I2C0_SDA, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO4_6_AS_I2C0_SDA, DRIVER_RATE_2); /* Output signal edge fast/slow */ +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + I2C0_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/readme.md b/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/readme.md new file mode 100644 index 000000000..37c0631df --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/readme.md @@ -0,0 +1,19 @@ +# 配置I2C作为主机以阻塞方式进行数据的接收、发送,通过Debug串口打印数据收发的结果 +## 关键字: I2C, 主机,数据读取,数据发送,阻塞方式 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、I2C控制器初始化和功能配置。通过阻塞方式与EEPROM(AT24C64)进行数据的接收和数据的发送,通过Debug串口打印数据收发成功或失败的信息。 + +**【示例配置】** ++ I2C控制器选择:可选择I2C0或I2C1实现与EEPROM的数据接收和发送。 + ++ I2C初始化:调用接口"HAL_I2C_Init()”完成对示例代码中I2C的基地址、主从模式、寻址模式(7bit寻址或10bit寻址)、通讯速率等参数进行配置。 + ++ 操作I2C写入和读取EEPROM的内容:通过调用 "HAL_I2C_MasterWriteBlocking()"接口以阻塞方式向EEPROM目标内存地址写入数据;通过调用"HAL_I2C_MasterReadBlocking()"接口以阻塞方式实现从EEPROM的目标地址中接收数据。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码中会通过I2C以阻塞方式向EEPROM写入和读取写入的内容,Debug串口打印I2C与EEPROM进行通信交互的结果信息,当写入和读取的数据一致时Debug串口打印"I2C Data Success";当写入和读取的数据不一致时Debug串口打印错误信息。 + +**【注意事项】** ++ 示例代码使用UART0进行结果打印输出,需要对UART0配置。 ++ 示例代码中I2C必须必须对接EEPROM(AT24C64),且保证EEPROM的7bit地址为50,否则示例代码无法正常运行。 \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/src/sample_i2c_master_blocking_at24c64.c b/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/src/sample_i2c_master_blocking_at24c64.c new file mode 100644 index 000000000..5ffe39d07 --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/src/sample_i2c_master_blocking_at24c64.c @@ -0,0 +1,202 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_i2c_master_blocking_at24c64.c + * @author MCU Driver Team + * @brief Sample for I2C module blocking as master. + * @details This sample demonstrates how to use the I2C master blocking interface to read and write the EEPROM. + * To use this sample, the I2C interface must be connected to the AT24C64 EEPROM chip. + */ +#include "i2c.h" +#include "main.h" +#include "debug.h" +#include "sample_i2c_master_blocking_at24c64.h" + +#define DEV_24C64_ADDRESS_WRITE 0xA0 +#define DEV_24C64_ADDRESS_READ 0xA1 +#define I2C_SAMPLE_24C64_OPT_LEN 8 +#define I2C_SAMPLE_24C64_OPT_START_ADDR 0x0 +#define I2C_SAMPLE_24C64_DATA_OFFSET 2 +#define I2C_SAMPLE_24C64_PAGE_SIZE 32 +#define I2C_SAMPLE_24C64_ADDR_SIZE 2 +#define I2C_SAMPLE_24C64_OPT_ONCE_LEN 255 +#define I2C_SAMPLE_24C64_ADDRESS_POS 8 +#define I2C_SAMPLE_24C64_ADDRESS_MASK 0xFF + +#define I2C_SAMPLE_24C64_TEST_NUM 200 +#define I2C_SAMPLE_MAX_TIMEOUT 10000 + +/** + * @brief Copy data. + * @param destBuffer dest buffer. + * @param srcBuffer source buffer. + * @param len Number of the data to be copy. + * @retval None. + */ +static void CopyData(unsigned char *destBuffer, unsigned char *srcBuffer, unsigned int len) +{ + for (unsigned int i = 0; i < len; i++) { + destBuffer[i] = srcBuffer[i]; /* Copy the srcBuffer data to the destBuffer. */ + } +} + +/** + * @brief Read data from eeprom. + * @param addr The memory address of eeprom. + * @param buffer Address of buff to be receive data. + * @param len Number of the data to be read. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. + */ +static BASE_StatusType Sample24c64ReadData(unsigned int addr, unsigned char *buffer, unsigned int len) +{ + BASE_StatusType ret = BASE_STATUS_OK; + /* Define variables for internal use. */ + unsigned char tempAddr[I2C_SAMPLE_24C64_ADDR_SIZE]; + unsigned int currentLen = len; + unsigned int currentAddr = addr; + unsigned int tempReadLen; + unsigned char *tempBuffer = buffer; + + /* Start read data from the 24c64 eeprom. */ + while (1) { + if (currentLen == 0) { + break; + } + /* Set the memory address of eeprom. */ + tempAddr[0] = (currentAddr >> I2C_SAMPLE_24C64_ADDRESS_POS) & I2C_SAMPLE_24C64_ADDRESS_MASK; + tempAddr[1] = currentAddr & I2C_SAMPLE_24C64_ADDRESS_MASK; + + tempReadLen = currentLen; + if (currentLen > I2C_SAMPLE_24C64_OPT_ONCE_LEN) { + tempReadLen = I2C_SAMPLE_24C64_OPT_ONCE_LEN; + } + /* Send the memory address of eeprom. */ + ret = HAL_I2C_MasterWriteBlocking(&g_i2c0, DEV_24C64_ADDRESS_WRITE, tempAddr, + I2C_SAMPLE_24C64_ADDR_SIZE, I2C_SAMPLE_MAX_TIMEOUT); + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("LINE:%d,Read Data Fail,ret:%d\r\n", __LINE__, ret); + return ret; + } + /* Read data from eeprom. */ + ret = HAL_I2C_MasterReadBlocking(&g_i2c0, DEV_24C64_ADDRESS_READ, tempBuffer, + tempReadLen, I2C_SAMPLE_MAX_TIMEOUT); + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("LINE:%d,Read Data Fail,ret:%d\r\n", __LINE__, ret); + return ret; + } + /* Updata the destAddress, srcAddress and len. */ + currentAddr += tempReadLen; + currentLen -= tempReadLen; + tempBuffer += tempReadLen; + } + return ret; +} + +/** + * @brief Read data from eeprom. + * @param addr The memory address of eeprom. + * @param buffer Address of buff to be send. + * @param len Number of the data to be send. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. + */ +static BASE_StatusType Sample24c64WriteData(unsigned int addr, unsigned char *buffer, unsigned int len) +{ + unsigned char tempWrite[I2C_SAMPLE_24C64_PAGE_SIZE + I2C_SAMPLE_24C64_ADDR_SIZE]; + unsigned int currentLen = len; + unsigned int currentAddr = addr; + unsigned int tempWriteLen; + unsigned char *tempBuffer = buffer; + BASE_StatusType ret = BASE_STATUS_OK; + + /* Start send data to eeprom. */ + while (1) { + if (currentLen == 0) { + break; + } + tempWriteLen = I2C_SAMPLE_24C64_PAGE_SIZE - (currentAddr % I2C_SAMPLE_24C64_PAGE_SIZE); + if (tempWriteLen > currentLen) { + tempWriteLen = currentLen; + } + /* Set the memory address of eeprom. */ + tempWrite[0] = (currentAddr >> I2C_SAMPLE_24C64_ADDRESS_POS) & I2C_SAMPLE_24C64_ADDRESS_MASK; + tempWrite[1] = currentAddr & I2C_SAMPLE_24C64_ADDRESS_MASK; + CopyData(&tempWrite[I2C_SAMPLE_24C64_ADDR_SIZE], tempBuffer, tempWriteLen); + /* Send data to eeprom. */ + ret = HAL_I2C_MasterWriteBlocking(&g_i2c0, DEV_24C64_ADDRESS_WRITE, tempWrite, + tempWriteLen + I2C_SAMPLE_24C64_ADDR_SIZE, I2C_SAMPLE_MAX_TIMEOUT); + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("LINE:%d,Write Data Fail!,ret:%d\r\n", __LINE__, ret); + break; + } + /* Updata the destAddress, srcAddress and len. */ + currentAddr += tempWriteLen; + currentLen -= tempWriteLen; + tempBuffer += tempWriteLen; + } + return ret; +} + +/** + * @brief Send and receive data with the 24c64 eeprom in interrupt mode as master. + * @retval None. + */ +void I2cBlocking24c64Processing(void) +{ + BASE_StatusType ret; + unsigned int i; + unsigned int dataFlag; + unsigned char tempWriteBuff[I2C_SAMPLE_24C64_OPT_LEN] = {0}; + unsigned int successCnt = 0; + + SystemInit(); + DBG_PRINTF("I2C Blocking 24C64 Start\r\n"); + for (i = 0; i < I2C_SAMPLE_24C64_OPT_LEN; i++) { + tempWriteBuff[i] = 0x5A; /* The written data. */ + } + BASE_FUNC_DELAY_MS(20); /* Delay 20 ms. */ + for (int j = 0; j < I2C_SAMPLE_24C64_TEST_NUM; j++) { + unsigned char tempReadBuff[I2C_SAMPLE_24C64_OPT_LEN] = {0}; + /* Write 24c64 data */ + ret = Sample24c64WriteData(I2C_SAMPLE_24C64_OPT_START_ADDR, tempWriteBuff, I2C_SAMPLE_24C64_OPT_LEN); + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("LINE:%d,Write Data Fail,ret:%d\r\n", __LINE__, ret); + } + BASE_FUNC_DELAY_MS(20); /* Delay 20 ms. */ + /* Read 24c64 data */ + ret = Sample24c64ReadData(I2C_SAMPLE_24C64_OPT_START_ADDR, tempReadBuff, I2C_SAMPLE_24C64_OPT_LEN); + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("LINE:%d,Write Data Fail,ret:%d\r\n", __LINE__, ret); + } + BASE_FUNC_DELAY_MS(20); /* Delay 20 ms. */ + /* Compare read and write data */ + dataFlag = 0; + for (i = 0; i < I2C_SAMPLE_24C64_OPT_LEN; i++) { + if (tempReadBuff[i] != tempWriteBuff[i]) { + DBG_PRINTF("I2C Data error! offset[%d]\r\nReadData:0x%x\r\nWriteData:0x%x\r\n", i, + tempReadBuff[i], tempWriteBuff[i]); + dataFlag = 1; + break; + } + } + /* The read data is exactly the same as the written data. */ + if (dataFlag == 0) { + successCnt++; + DBG_PRINTF("I2C Data Success\r\n"); + } + } + DBG_PRINTF("I2C sample End!\r\nsuccessCnt:%d\r\n", successCnt); +} \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_master_dma_at24c64/inc/sample_i2c_master_dma_at24c64.h b/drivers_sample/i2c/sample_i2c_master_dma_at24c64/inc/sample_i2c_master_dma_at24c64.h new file mode 100644 index 000000000..5666e536e --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_master_dma_at24c64/inc/sample_i2c_master_dma_at24c64.h @@ -0,0 +1,29 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_i2c_master_dma_at24c64.c + * @author MCU Driver Team + * @brief Sample for I2C module dma as master. + * @details This sample demonstrates how to use the I2C master DMA interface to read and write the EEPROM. + * To use this sample, the I2C interface must be connected to the AT24C64 EEPROM chip. + */ +#ifndef McuMagicTag_SAMPLE_I2C_MASTER_DAM_AT24C64_H +#define McuMagicTag_SAMPLE_I2C_MASTER_DAM_AT24C64_H + +void I2cDma24c64Processing(void); + +#endif /* #ifndef McuMagicTag_SAMPLE_I2C_MASTER_DAM_AT24C64_H */ \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_master_dma_at24c64/init/main.c b/drivers_sample/i2c/sample_i2c_master_dma_at24c64/init/main.c new file mode 100644 index 000000000..2ac1fa57f --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_master_dma_at24c64/init/main.c @@ -0,0 +1,53 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ + +#include "typedefs.h" +#include "feature.h" +#include "sample_i2c_master_dma_at24c64.h" +#include "main.h" + +/* USER CODE BEGIN 0 */ +/* USER CODE END 0 */ +UART_Handle g_uart0; +I2C_Handle g_i2c0; +DMA_Handle g_dmac; +/* USER CODE BEGIN 1 */ +/* USER CODE END 1 */ + +int main(void) +{ + /* USER CODE BEGIN 2 */ + /* USER CODE END 2 */ + I2cDma24c64Processing(); + /* USER CODE BEGIN 3 */ + /* USER CODE END 3 */ + while (1) { + /* USER CODE BEGIN 4 */ + /* USER CODE END 4 */ + } + /* USER CODE BEGIN 5 */ + /* USER CODE END 5 */ + return BASE_STATUS_OK; +} + +/* USER CODE BEGIN 6 */ +/* USER CODE END 6 */ \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_master_dma_at24c64/init/main.h b/drivers_sample/i2c/sample_i2c_master_dma_at24c64/init/main.h new file mode 100644 index 000000000..9e0d9fccb --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_master_dma_at24c64/init/main.h @@ -0,0 +1,54 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "i2c.h" +#include "i2c_ex.h" +#include "crg.h" +#include "dma.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define XTAL_DRV_LEVEL4 0x03U +#define XTAL_DRV_LEVEL3 0x02U +#define XTAL_DRV_LEVEL2 0x01U +#define XTAL_DRV_LEVEL1 0x00U + +extern UART_Handle g_uart0; +extern I2C_Handle g_i2c0; + +extern DMA_Handle g_dmac; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_master_dma_at24c64/init/system_init.c b/drivers_sample/i2c/sample_i2c_master_dma_at24c64/init/system_init.c new file mode 100644 index 000000000..dd44a7127 --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_master_dma_at24c64/init/system_init.c @@ -0,0 +1,212 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" +#include "iocmg_ip.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + /* Clock-related parameter configuration. */ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_1; + /* Initialize the clock configuration. */ + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void DMA_Channel0Init(void *handle) +{ + /* Setting DMA-related parameters. */ + DMA_ChannelParam dma_param; + dma_param.direction = DMA_PERIPH_TO_MEMORY_BY_DMAC; + dma_param.srcAddrInc = DMA_ADDR_UNALTERED; + dma_param.destAddrInc = DMA_ADDR_INCREASE; + dma_param.srcPeriph = DMA_REQUEST_I2C0_RX; + dma_param.destPeriph = DMA_REQUEST_MEM; + /* Set the moving position width. */ + dma_param.srcWidth = DMA_TRANSWIDTH_BYTE; + dma_param.destWidth = DMA_TRANSWIDTH_BYTE; + dma_param.srcBurst = DMA_BURST_LENGTH_1; + dma_param.destBurst = DMA_BURST_LENGTH_1; + dma_param.pHandle = handle; + /* DMA Channel initialization. */ + HAL_DMA_InitChannel(&g_dmac, &dma_param, DMA_CHANNEL_ZERO); +} + +static void DMA_Channel1Init(void *handle) +{ + /* Setting DMA-related parameters. */ + DMA_ChannelParam dma_param; + dma_param.direction = DMA_MEMORY_TO_PERIPH_BY_DMAC; + dma_param.srcAddrInc = DMA_ADDR_INCREASE; + dma_param.destAddrInc = DMA_ADDR_UNALTERED; + dma_param.srcPeriph = DMA_REQUEST_MEM; + dma_param.destPeriph = DMA_REQUEST_I2C0_TX; + /* Set the moving position width. */ + dma_param.srcWidth = DMA_TRANSWIDTH_WORD; + dma_param.destWidth = DMA_TRANSWIDTH_WORD; + dma_param.srcBurst = DMA_BURST_LENGTH_1; + dma_param.destBurst = DMA_BURST_LENGTH_1; + dma_param.pHandle = handle; + /* DMA Channel initialization. */ + HAL_DMA_InitChannel(&g_dmac, &dma_param, DMA_CHANNEL_ONE); +} + +static void DMA_Init(void) +{ + /* DMA initialization. */ + HAL_CRG_IpEnableSet(DMA_BASE, IP_CLK_ENABLE); + g_dmac.baseAddress = DMA; + /* Configuring DMA Interrupt Parameters. */ + IRQ_Register(IRQ_DMA_TC, HAL_DMA_IrqHandlerTc, &g_dmac); + IRQ_Register(IRQ_DMA_ERR, HAL_DMA_IrqHandlerError, &g_dmac); + IRQ_EnableN(IRQ_DMA_TC); + IRQ_EnableN(IRQ_DMA_ERR); + HAL_DMA_Init(&g_dmac); + /* Setting the Channel Priority and Initializing the Channel. */ + DMA_Channel0Init((void *)(&g_i2c0)); + HAL_DMA_SetChannelPriorityEx(&g_dmac, DMA_CHANNEL_ZERO, DMA_PRIORITY_HIGHEST); + DMA_Channel1Init((void *)(&g_i2c0)); + HAL_DMA_SetChannelPriorityEx(&g_dmac, DMA_CHANNEL_ONE, DMA_PRIORITY_HIGHEST); +} + +__weak void I2C0TxCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN I2C0TxCallback */ + /* USER CODE END I2C0TxCallback */ +} + +__weak void I2C0RxCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN I2C0RxCallback */ + /* USER CODE END I2C0RxCallback */ +} + +__weak void I2C0ErrorCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN I2C0ErrorCallback */ + /* USER CODE END I2C0ErrorCallback */ +} + +static void I2C0_Init(void) +{ + HAL_CRG_IpEnableSet(I2C0_BASE, IP_CLK_ENABLE); + g_i2c0.baseAddress = I2C0; + + g_i2c0.functionMode = I2C_MODE_SELECT_MASTER_ONLY; + g_i2c0.addrMode = I2C_7_BITS; + g_i2c0.sdaHoldTime = 10; /* I2C SDA hold time 10. */ + g_i2c0.freq = 400000; /* I2C SCL rate 400000 bit/s. */ + g_i2c0.transferBuff = NULL; + g_i2c0.ignoreAckFlag = BASE_CFG_DISABLE; + g_i2c0.handleEx.spikeFilterTime = 0; + g_i2c0.handleEx.sdaDelayTime = 0; + g_i2c0.timeout = 10000; /* The value of timeout is 10000ms; */ + g_i2c0.state = I2C_STATE_RESET; + g_i2c0.rxWaterMark = 1; /* The value of rx Water mark is 1. */ + g_i2c0.txWaterMark = 12; /* The value of tx Water mark is 12. */ + g_i2c0.dmaHandle = &g_dmac; + g_i2c0.txDmaCh = DMA_CHANNEL_ONE; + g_i2c0.rxDmaCh = DMA_CHANNEL_ZERO; + HAL_I2C_Init(&g_i2c0); + + HAL_I2C_RegisterCallback(&g_i2c0, I2C_MASTER_TX_COMPLETE_CB_ID, I2C0TxCallback); + HAL_I2C_RegisterCallback(&g_i2c0, I2C_MASTER_RX_COMPLETE_CB_ID, I2C0RxCallback); + HAL_I2C_RegisterCallback(&g_i2c0, I2C_ERROR_CB_ID, I2C0ErrorCallback); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); + /* UART-related parameter configuration. */ + g_uart0.baseAddress = UART0; + + g_uart0.baudRate = UART0_BAND_RATE; /* Setting the UART Baud Rate. */ + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; /* Disable uart fifo mode. */ + g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; + g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; + /* Initializing the UART0. */ + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO4_5_AS_I2C0_SCL); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO4_5_AS_I2C0_SCL, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO4_5_AS_I2C0_SCL, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO4_5_AS_I2C0_SCL, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO4_5_AS_I2C0_SCL, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO4_6_AS_I2C0_SDA); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO4_6_AS_I2C0_SDA, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO4_6_AS_I2C0_SDA, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO4_6_AS_I2C0_SDA, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO4_6_AS_I2C0_SDA, DRIVER_RATE_2); /* Output signal edge fast/slow */ +} + +void SystemInit(void) +{ + IOConfig(); + DMA_Init(); + UART0_Init(); + I2C0_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_master_dma_at24c64/readme.md b/drivers_sample/i2c/sample_i2c_master_dma_at24c64/readme.md new file mode 100644 index 000000000..3e011c26d --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_master_dma_at24c64/readme.md @@ -0,0 +1,19 @@ +# 配置I2C作为主机以DMA方式进行数据的接收、发送,通过Debug串口打印数据收发的结果 +## 关键字: I2C, 主机,数据读取,数据发送,DMA方式 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、I2C控制器初始化和功能配置。通过中断方式与EEPROM(AT24C64)进行数据的接收和数据的发送,通过Debug串口打印数据收发成功或失败的信息。 + +**【示例配置】** ++ I2C控制器选择:可选择I2C0或I2C1实现与EEPROM的数据接收和发送。 + ++ I2C初始化:调用接口"HAL_I2C_Init()”完成对示例代码中I2C的基地址、主从模式、寻址模式(7bit寻址或10bit寻址)、通讯速率、DMA通道等参数进行配置。调用"HAL_I2C_RegisterCallback()"接口注册收发完成、传输错误时的回调函数。 + ++ 操作I2C写入和读取EEPROM的内容:通过调用 "HAL_I2C_MasterWriteDMA()"接口以DMA方式向EEPROM目标内存地址写入数据;通过调用"HAL_I2C_MasterReadDMA()"接口以DMA方式实现从EEPROM的目标地址中接收数据。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码中会通过I2C以DMA方式向EEPROM写入和读取写入的内容,Debug串口打印I2C与EEPROM进行通信交互的结果信息,当写入和读取的数据一致时Debug串口打印"I2C Data Success";当写入和读取的数据不一致时Debug串口打印错误信息。 + +**【注意事项】** ++ 示例代码使用UART0进行结果打印输出,需要对UART0配置。 ++ 示例代码中I2C必须必须对接EEPROM(AT24C64),且保证EEPROM的7bit地址为50,否则示例代码无法正常运行。 \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_master_dma_at24c64/src/sample_i2c_master_dma_at24c64.c b/drivers_sample/i2c/sample_i2c_master_dma_at24c64/src/sample_i2c_master_dma_at24c64.c new file mode 100644 index 000000000..d51275749 --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_master_dma_at24c64/src/sample_i2c_master_dma_at24c64.c @@ -0,0 +1,286 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_i2c_master_dma_at24c64.c + * @author MCU Driver Team + * @brief Sample for I2C module dma as master. + * @details This sample demonstrates how to use the I2C master DMA interface to read and write the EEPROM. + * To use this sample, the I2C interface must be connected to the AT24C64 EEPROM chip. + */ +#include "i2c.h" +#include "dma.h" +#include "main.h" +#include "debug.h" +#include "sample_i2c_master_dma_at24c64.h" + +#define DEV_24C64_ADDRESS_WRITE 0xA0 +#define DEV_24C64_ADDRESS_READ 0xA1 +#define I2C_SAMPLE_24C64_OPT_LEN 8 +#define I2C_SAMPLE_24C64_OPT_START_ADDR 0x0 +#define I2C_SAMPLE_24C64_DATA_OFFSET 2 +#define I2C_SAMPLE_24C64_PAGE_SIZE 32 +#define I2C_SAMPLE_24C64_ADDR_SIZE 2 +#define I2C_SAMPLE_24C64_OPT_ONCE_LEN 255 + +#define I2C_SAMPLE_24C64_ADDRESS_POS 8 +#define I2C_SAMPLE_24C64_ADDRESS_MASK 0xFF + +#define I2C_SAMPLE_24C64_TEST_NUM 100 + +static volatile int g_txDoneFlag = BASE_CFG_UNSET; +static volatile int g_rxDoneFlag = BASE_CFG_UNSET; +static volatile int g_errorFlag = BASE_CFG_UNSET; + +/** + * @brief I2c dma sample tx callback handle. + * @param handle I2c handle. + * @retval None. + */ +void I2C0TxCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + g_txDoneFlag = BASE_CFG_SET; +} + +/** + * @brief I2c dma sample rx callback handle. + * @param handle I2c handle. + * @retval None. + */ +void I2C0RxCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + g_rxDoneFlag = BASE_CFG_SET; +} + +/** + * @brief I2c dma sample Error callback handle. + * @param handle I2c handle. + * @retval None. + */ +void I2C0ErrorCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + g_errorFlag = BASE_CFG_SET; +} + +/** + * @brief Copy data. + * @param destBuffer dest buffer. + * @param srcBuffer source buffer. + * @param len Number of the data to be copy. + * @retval None. + */ +static void CopyData(unsigned char *destBuffer, unsigned char *srcBuffer, unsigned int len) +{ + for (unsigned int i = 0; i < len; i++) { + destBuffer[i] = srcBuffer[i]; + } +} + +/** + * @brief Write the memory address of 24c64 eeprom. + * @param addrBuffer The memory address of eeprom. + * @param length The length of data buffer. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. + */ +static BASE_StatusType Write24c64MemoryAddress(unsigned char *addrBuffer, unsigned int length) +{ + BASE_StatusType ret = BASE_STATUS_OK; + unsigned char *tempAddr = addrBuffer; + + /* Write the memory address to AT24c64 eeprom. */ + ret = HAL_I2C_MasterWriteDMA(&g_i2c0, DEV_24C64_ADDRESS_WRITE, tempAddr, length); + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("LINE:%d,Write Data Fail,ret:%d\r\n", __LINE__, ret); + return ret; + } + /* Waiting for write completion or failure */ + while (!(g_txDoneFlag || g_errorFlag)) { + ; + } + g_txDoneFlag = BASE_CFG_UNSET; + if (g_errorFlag == BASE_CFG_SET) { + g_errorFlag = BASE_CFG_UNSET; /* Reset g_errorFlag. */ + DBG_PRINTF("LINE:%d,Read Data Fail\r\n", __LINE__); + return BASE_STATUS_ERROR; + } + return ret; +} + +/** + * @brief Read data from the 24c64 eeprom. + * @param addr The memory address of eeprom. + * @param buffer Address of buff to be receive data. + * @param len Number of the data to be read. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. + */ +static BASE_StatusType Sample24c64ReadData(unsigned int addr, unsigned char *buffer, unsigned int len) +{ + BASE_StatusType ret = BASE_STATUS_OK; /* Transfer success and failure status. */ + unsigned char tempAddr[I2C_SAMPLE_24C64_ADDR_SIZE]; + unsigned int currentLen = len; + unsigned int currentAddr = addr; + unsigned int tempReadLen; + unsigned char *tempBuffer = buffer; + + /* Start read data to eeprom. */ + while (1) { + if (currentLen == 0) { + break; + } + /* Set the memory address of eeprom. */ + tempAddr[0] = (currentAddr >> I2C_SAMPLE_24C64_ADDRESS_POS) & I2C_SAMPLE_24C64_ADDRESS_MASK; + tempAddr[1] = currentAddr & I2C_SAMPLE_24C64_ADDRESS_MASK; + tempReadLen = currentLen; + if (currentLen > I2C_SAMPLE_24C64_OPT_ONCE_LEN) { + tempReadLen = I2C_SAMPLE_24C64_OPT_ONCE_LEN; + } + BASE_FUNC_DELAY_MS(5); /* Delay 5 ms. */ + ret = Write24c64MemoryAddress(tempAddr, I2C_SAMPLE_24C64_ADDR_SIZE); + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("LINE:%d,Read Data Fail,ret:%d\r\n", __LINE__, ret); + return ret; + } + BASE_FUNC_DELAY_MS(5); /* Delay 5 ms. */ + ret = HAL_I2C_MasterReadDMA(&g_i2c0, DEV_24C64_ADDRESS_READ, tempBuffer, tempReadLen); + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("LINE:%d,Read Data Fail,ret:%d\r\n", __LINE__, ret); + return ret; + } + /* Waiting for read completion or failure */ + while (!(g_rxDoneFlag || g_errorFlag)) { + ; + } + g_rxDoneFlag = BASE_CFG_UNSET; + if (g_errorFlag == BASE_CFG_SET) { + DBG_PRINTF("LINE:%d,Read Data Fail\r\n", __LINE__); + g_errorFlag = BASE_CFG_UNSET; + return BASE_STATUS_ERROR; + } + /* Updata the destAddress, srcAddress and len. */ + currentAddr += tempReadLen; + currentLen -= tempReadLen; + tempBuffer += tempReadLen; + } + + return ret; +} + +/** + * @brief Send data to the 24c64 eeprom. + * @param addr The memory address of eeprom. + * @param buffer Address of buff to be send. + * @param len Number of the data to be send. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. + */ +static BASE_StatusType Sample24c64WriteData(unsigned int addr, unsigned char *buffer, unsigned int len) +{ + unsigned char tempWrite[I2C_SAMPLE_24C64_PAGE_SIZE + I2C_SAMPLE_24C64_ADDR_SIZE]; + unsigned int currentLen = len; + unsigned int currentAddr = addr; + unsigned int tempWriteLen; + unsigned char *tempBuffer = buffer; + BASE_StatusType ret = BASE_STATUS_OK; + + /* Start send data to eeprom. */ + while (1) { + if (currentLen == 0) { + break; + } + tempWriteLen = I2C_SAMPLE_24C64_PAGE_SIZE - (currentAddr % I2C_SAMPLE_24C64_PAGE_SIZE); + if (tempWriteLen > currentLen) { + tempWriteLen = currentLen; + } + /* Set the memory address of eeprom. */ + tempWrite[0] = (currentAddr >> I2C_SAMPLE_24C64_ADDRESS_POS) & I2C_SAMPLE_24C64_ADDRESS_MASK; + tempWrite[1] = currentAddr & I2C_SAMPLE_24C64_ADDRESS_MASK; + CopyData(&tempWrite[I2C_SAMPLE_24C64_ADDR_SIZE], tempBuffer, tempWriteLen); + BASE_FUNC_DELAY_MS(5); /* Delay 5 ms. */ + /* Send data to eeprom. */ + ret = HAL_I2C_MasterWriteDMA(&g_i2c0, DEV_24C64_ADDRESS_WRITE, tempWrite, + tempWriteLen + I2C_SAMPLE_24C64_ADDR_SIZE); + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("LINE:%d,Write Data Fail!,ret:%d\r\n", __LINE__, ret); + break; + } + /* Waiting for read completion or failure */ + while (!(g_txDoneFlag || g_errorFlag)) { + ; + } + g_txDoneFlag = BASE_CFG_UNSET; + if (g_errorFlag == BASE_CFG_SET) { + DBG_PRINTF("LINE:%d,Read Data Fail\r\n", __LINE__); + g_errorFlag = BASE_CFG_UNSET; + return BASE_STATUS_ERROR; + } + /* Updata the destAddress, srcAddress and len. */ + currentAddr += tempWriteLen; + tempBuffer += tempWriteLen; + currentLen -= tempWriteLen; + } + return ret; +} + +/** + * @brief Send and receive data with the 24c64 eeprom in dma mode as master. + * @retval None. + */ +void I2cDma24c64Processing(void) +{ + BASE_StatusType ret; + unsigned int dataFlag; + unsigned char tempWriteBuff[I2C_SAMPLE_24C64_OPT_LEN] = {0}; + unsigned int successCnt = 0; + + SystemInit(); + DBG_PRINTF("I2C Dma 24C64 Start\r\n"); + for (unsigned int i = 0; i < I2C_SAMPLE_24C64_OPT_LEN; i++) { + tempWriteBuff[i] = 0x5A; /* The written data. */ + } + + for (int j = 0; j < I2C_SAMPLE_24C64_TEST_NUM; j++) { + unsigned char tempReadBuff[I2C_SAMPLE_24C64_OPT_LEN] = {0}; + /* Write 24c64 data */ + ret = Sample24c64WriteData(I2C_SAMPLE_24C64_OPT_START_ADDR, tempWriteBuff, I2C_SAMPLE_24C64_OPT_LEN); + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("LINE:%d,Write Data Fail!,ret:%d\r\n", __LINE__, ret); + } + /* Read 24c64 data */ + ret = Sample24c64ReadData(I2C_SAMPLE_24C64_OPT_START_ADDR, tempReadBuff, I2C_SAMPLE_24C64_OPT_LEN); + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("LINE:%d,Read Data Fail,ret:%d\r\n", __LINE__, ret); + } + /* Compare read and write data */ + dataFlag = 0; + for (unsigned int i = 0; i < I2C_SAMPLE_24C64_OPT_LEN - 1; i++) { + if (tempReadBuff[i] != tempWriteBuff[i]) { + DBG_PRINTF("I2C Data error! offset[%d]\r\nReadData:0x%x\r\nWriteData:0x%x\r\n", i, tempReadBuff[i], + tempWriteBuff[i]); + dataFlag = 1; + break; + } + } + + /* The read data is exactly the same as the written data. */ + if (dataFlag == 0) { + successCnt++; + DBG_PRINTF("I2C Data Success\r\n"); + } + } + DBG_PRINTF("I2C sample End!\r\nsuccessCnt:%d\r\n", successCnt); +} \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/inc/sample_i2c_master_interrupt_at24c64.h b/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/inc/sample_i2c_master_interrupt_at24c64.h new file mode 100644 index 000000000..0177aeb00 --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/inc/sample_i2c_master_interrupt_at24c64.h @@ -0,0 +1,29 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_i2c_master_interrupt_at24c64.c + * @author MCU Driver Team + * @brief Sample for I2C module interrupt as master. + * @details This sample demonstrates how to use the I2C master interrupt interface to read and write the EEPROM. + * To use this sample, the I2C interface must be connected to the AT24C64 EEPROM chip. + */ +#ifndef McuMagicTag_SAMPLE_I2C_MASTER_INTERRUPT_AT24C64_H +#define McuMagicTag_SAMPLE_I2C_MASTER_INTERRUPT_AT24C64_H + +void I2cInterrupt24c64Processing(void); + +#endif /* #ifndef McuMagicTag_SAMPLE_I2C_MASTER_INTERRUPT_AT24C64_H */ \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/init/main.c b/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/init/main.c new file mode 100644 index 000000000..cf5190300 --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/init/main.c @@ -0,0 +1,51 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ + +#include "typedefs.h" +#include "feature.h" +#include "sample_i2c_master_interrupt_at24c64.h" +#include "main.h" +/* USER CODE BEGIN 0 */ +/* USER CODE END 0 */ +UART_Handle g_uart0; +I2C_Handle g_i2c0; +/* USER CODE BEGIN 1 */ +/* USER CODE END 1 */ + +int main(void) +{ + /* USER CODE BEGIN 2 */ + /* USER CODE END 2 */ + I2cInterrupt24c64Processing(); + /* USER CODE BEGIN 3 */ + /* USER CODE END 3 */ + while (1) { + /* USER CODE BEGIN 4 */ + /* USER CODE END 4 */ + } + /* USER CODE BEGIN 5 */ + /* USER CODE END 5 */ + return BASE_STATUS_OK; +} + +/* USER CODE BEGIN 6 */ +/* USER CODE END 6 */ \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/init/main.h b/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/init/main.h new file mode 100644 index 000000000..340f824bd --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/init/main.h @@ -0,0 +1,55 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "i2c.h" +#include "i2c_ex.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define XTAL_DRV_LEVEL4 0x03U +#define XTAL_DRV_LEVEL3 0x02U +#define XTAL_DRV_LEVEL2 0x01U +#define XTAL_DRV_LEVEL1 0x00U + +extern UART_Handle g_uart0; +extern I2C_Handle g_i2c0; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +void I2C0TxCallback(void *handle); +void I2C0RxCallback(void *handle); +void I2C0ErrorCallback(void *handle); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/init/system_init.c b/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/init/system_init.c new file mode 100644 index 000000000..bc14db3a2 --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/init/system_init.c @@ -0,0 +1,156 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" +#include "iocmg_ip.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + /* Clock-related parameter configuration. */ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_1; + /* Initialize the clock configuration. */ + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +__weak void I2C0TxCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN I2C0TxCallback */ + /* USER CODE END I2C0TxCallback */ +} + +__weak void I2C0RxCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN I2C0RxCallback */ + /* USER CODE END I2C0RxCallback */ +} + +__weak void I2C0ErrorCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN I2C0ErrorCallback */ + /* USER CODE END I2C0ErrorCallback */ +} + +static void I2C0_Init(void) +{ + HAL_CRG_IpEnableSet(I2C0_BASE, IP_CLK_ENABLE); + g_i2c0.baseAddress = I2C0; + + g_i2c0.functionMode = I2C_MODE_SELECT_MASTER_ONLY; + g_i2c0.addrMode = I2C_7_BITS; + g_i2c0.sdaHoldTime = 10; /* I2C SDA hold time 10. */ + g_i2c0.freq = 400000; /* I2C SCL rate 400000 bit/s. */ + g_i2c0.transferBuff = NULL; + g_i2c0.ignoreAckFlag = BASE_CFG_DISABLE; + g_i2c0.handleEx.spikeFilterTime = 0; + g_i2c0.handleEx.sdaDelayTime = 0; + g_i2c0.timeout = 10000; /* The value of timeout is 10000ms; */ + g_i2c0.state = I2C_STATE_RESET; + g_i2c0.rxWaterMark = 1; + g_i2c0.txWaterMark = 12; /* The value of tx Water mark is 12. */ + HAL_I2C_Init(&g_i2c0); + + HAL_I2C_RegisterCallback(&g_i2c0, I2C_MASTER_TX_COMPLETE_CB_ID, I2C0TxCallback); + HAL_I2C_RegisterCallback(&g_i2c0, I2C_MASTER_RX_COMPLETE_CB_ID, I2C0RxCallback); + HAL_I2C_RegisterCallback(&g_i2c0, I2C_ERROR_CB_ID, I2C0ErrorCallback); + /* Configuring I2C Interrupt Parameters. */ + IRQ_Register(IRQ_I2C0, HAL_I2C_IrqHandler, &g_i2c0); + IRQ_SetPriority(IRQ_I2C0, 1); + IRQ_EnableN(IRQ_I2C0); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); + /* UART-related parameter configuration. */ + g_uart0.baseAddress = UART0; + + g_uart0.baudRate = UART0_BAND_RATE; /* Setting the UART Baud Rate. */ + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; /* Disable uart fifo mode. */ + g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; + g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; + /* Initializing the UART0. */ + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + HAL_IOCMG_SetPinAltFuncMode(GPIO4_5_AS_I2C0_SCL); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO4_5_AS_I2C0_SCL, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO4_5_AS_I2C0_SCL, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO4_5_AS_I2C0_SCL, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO4_5_AS_I2C0_SCL, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO4_6_AS_I2C0_SDA); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO4_6_AS_I2C0_SDA, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO4_6_AS_I2C0_SDA, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO4_6_AS_I2C0_SDA, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO4_6_AS_I2C0_SDA, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + I2C0_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/readme.md b/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/readme.md new file mode 100644 index 000000000..ce8964bcb --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/readme.md @@ -0,0 +1,19 @@ +# 配置I2C作为主机以中断方式进行数据的接收、发送,通过Debug串口打印数据收发的结果 +## 关键字: I2C, 主机,数据读取,数据发送,中断方式 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、I2C控制器初始化和功能配置。通过中断方式与EEPROM(AT24C64)进行数据的接收和数据的发送,通过Debug串口打印数据收发成功或失败的信息。 + +**【示例配置】** ++ I2C控制器选择:可选择I2C0或I2C1实现与EEPROM的数据接收和发送。 + ++ I2C初始化:调用接口"HAL_I2C_Init()”完成对示例代码中I2C的基地址、主从模式、寻址模式(7bit寻址或10bit寻址)、通讯速率等参数进行配置。调用"HAL_I2C_RegisterCallback()"接口注册中断回调函数,并使能相关中断配置。 + ++ 操作I2C写入和读取EEPROM的内容:通过调用 "HAL_I2C_MasterWriteIT()"接口以中断方式向EEPROM目标内存地址写入数据;通过调用"HAL_I2C_MasterReadIT()"接口以中断方式实现从EEPROM的目标地址中接收数据。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码中会通过I2C以中断方式向EEPROM写入和读取写入的内容,Debug串口打印I2C与EEPROM进行通信交互的结果信息,当写入和读取的数据一致时Debug串口打印"I2C Data Success";当写入和读取的数据不一致时Debug串口打印错误信息。 + +**【注意事项】** ++ 示例代码使用UART0进行结果打印输出,需要对UART0配置。 ++ 示例代码中I2C必须必须对接EEPROM(AT24C64),且保证EEPROM的7bit地址为50,否则示例代码无法正常运行。 \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/src/sample_i2c_master_interrupt_at24c64.c b/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/src/sample_i2c_master_interrupt_at24c64.c new file mode 100644 index 000000000..69d39d68d --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/src/sample_i2c_master_interrupt_at24c64.c @@ -0,0 +1,293 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_i2c_master_interrupt_at24c64.c + * @author MCU Driver Team + * @brief Sample for I2C module interrupt as master. + * @details This sample demonstrates how to use the I2C master interrupt interface to read and write the EEPROM. + * To use this sample, the I2C interface must be connected to the AT24C64 EEPROM chip. + */ +#include "i2c.h" +#include "main.h" +#include "debug.h" +#include "sample_i2c_master_interrupt_at24c64.h" + +#define DEV_24C64_ADDRESS_WRITE 0xA0 +#define DEV_24C64_ADDRESS_READ 0xA1 +#define I2C_SAMPLE_24C64_OPT_LEN 8 +#define I2C_SAMPLE_24C64_OPT_START_ADDR 0x0 +#define I2C_SAMPLE_24C64_DATA_OFFSET 2 +#define I2C_SAMPLE_24C64_PAGE_SIZE 32 +#define I2C_SAMPLE_24C64_ADDR_SIZE 2 +#define I2C_SAMPLE_24C64_OPT_ONCE_LEN 255 +#define I2C_SAMPLE_24C64_ADDRESS_POS 8 +#define I2C_SAMPLE_24C64_ADDRESS_MASK 0xFF + +#define I2C_SAMPLE_24C64_TEST_NUM 100 + +static volatile int g_txDoneFlag = BASE_CFG_UNSET; +static volatile int g_rxDoneFlag = BASE_CFG_UNSET; +static volatile int g_errorFlag = BASE_CFG_UNSET; + +/** + * @brief I2c interrupt sample tx callback handle. + * @param handle I2c handle. + * @retval None. + */ +void I2C0TxCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + g_txDoneFlag = BASE_CFG_SET; +} + +/** + * @brief I2c interrupt sample rx callback handle. + * @param handle I2c handle. + * @retval None. + */ +void I2C0RxCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + g_rxDoneFlag = BASE_CFG_SET; +} + +/** + * @brief I2c interrupt sample Error callback handle. + * @param handle I2c handle. + * @retval None. + */ +void I2C0ErrorCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + g_errorFlag = BASE_CFG_SET; +} + +/** + * @brief Copy data. + * @param destBuffer dest buffer. + * @param srcBuffer source buffer. + * @param len Number of the data to be copy. + * @retval None. + */ +static void CopyData(unsigned char *destBuffer, unsigned char *srcBuffer, unsigned int len) +{ + for (unsigned int i = 0; i < len; i++) { + destBuffer[i] = srcBuffer[i]; + } +} + +/** + * @brief Write the memory address of 24c64 eeprom. + * @param addrBuffer The memory address of eeprom. + * @param length The length of data buffer. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. + */ +static BASE_StatusType Write24c64MemoryAddress(unsigned char *addrBuffer, unsigned int length) +{ + BASE_StatusType ret = BASE_STATUS_OK; + unsigned char *tempAddr = addrBuffer; + + /* Write the memory address to 24c64 eeprom. */ + HAL_I2C_MasterWriteIT(&g_i2c0, DEV_24C64_ADDRESS_WRITE, tempAddr, length); + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("LINE:%d,Write Data Fail,ret:%d\r\n", __LINE__, ret); + return ret; + } + + /* Waiting for write completion or failure */ + while (!(g_txDoneFlag || g_errorFlag)) { + ; + } + g_txDoneFlag = BASE_CFG_UNSET; + if (g_errorFlag == BASE_CFG_SET) { + g_errorFlag = BASE_CFG_UNSET; /* Reset g_errorFlag. */ + DBG_PRINTF("LINE:%d,Read Data Fail\r\n", __LINE__); + return BASE_STATUS_ERROR; + } + return ret; +} + +/** + * @brief Read data from the 24c64 eeprom. + * @param addr The memory address of eeprom. + * @param buffer Address of buff to be receive data. + * @param len Number of the data to be read. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. + */ +static BASE_StatusType Sample24c64ReadData(unsigned int addr, unsigned char *buffer, unsigned int len) +{ + BASE_StatusType ret = BASE_STATUS_OK; /* Transfer success and failure status. */ + unsigned char tempAddr[I2C_SAMPLE_24C64_ADDR_SIZE]; + unsigned int currentLen = len; + unsigned int currentAddr = addr; + unsigned int tempReadLen; + unsigned char *tempBuffer = buffer; + + /* Start read data from the 24c64 eeprom. */ + while (1) { + if (currentLen == 0) { + break; + } + + /* Set the memory address of eeprom. */ + tempAddr[0] = (currentAddr >> I2C_SAMPLE_24C64_ADDRESS_POS) & I2C_SAMPLE_24C64_ADDRESS_MASK; + tempAddr[1] = currentAddr & I2C_SAMPLE_24C64_ADDRESS_MASK; + + tempReadLen = currentLen; + if (currentLen > I2C_SAMPLE_24C64_OPT_ONCE_LEN) { + tempReadLen = I2C_SAMPLE_24C64_OPT_ONCE_LEN; + } + + ret = Write24c64MemoryAddress(tempAddr, I2C_SAMPLE_24C64_ADDR_SIZE); + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("LINE:%d,Read Data Fail,ret:%d\r\n", __LINE__, ret); + return ret; + } + + ret = HAL_I2C_MasterReadIT(&g_i2c0, DEV_24C64_ADDRESS_READ, + tempBuffer, tempReadLen); + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("LINE:%d,Read Data Fail,ret:%d\r\n", __LINE__, ret); + return ret; + } + + /* Waiting for read completion or failure */ + while (!(g_rxDoneFlag || g_errorFlag)) { + ; + } + g_rxDoneFlag = BASE_CFG_UNSET; + if (g_errorFlag == BASE_CFG_SET) { + g_errorFlag = BASE_CFG_UNSET; /* Reset g_errorFlag. */ + DBG_PRINTF("LINE:%d,Read Data Fail\r\n", __LINE__); + return BASE_STATUS_ERROR; + } + /* Updata the destAddress, srcAddress and len. */ + currentAddr += tempReadLen; + currentLen -= tempReadLen; + tempBuffer += tempReadLen; + } + return ret; +} + +/** + * @brief Send data to the 24c64 eeprom. + * @param addr The memory address of eeprom. + * @param buffer Address of buff to be send. + * @param len Number of the data to be send. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. + */ +static BASE_StatusType Sample24c64WriteData(unsigned int addr, unsigned char *buffer, unsigned int len) +{ + unsigned char tempWrite[I2C_SAMPLE_24C64_PAGE_SIZE + I2C_SAMPLE_24C64_ADDR_SIZE]; + unsigned int currentLen = len; + unsigned int currentAddr = addr; + unsigned int tempWriteLen; + unsigned char *tempBuffer = buffer; + BASE_StatusType ret = BASE_STATUS_OK; + + /* Start send data to eeprom. */ + while (1) { + if (currentLen == 0) { + break; + } + tempWriteLen = I2C_SAMPLE_24C64_PAGE_SIZE - (currentAddr % I2C_SAMPLE_24C64_PAGE_SIZE); + if (tempWriteLen > currentLen) { + tempWriteLen = currentLen; + } + /* Set the memory address of eeprom. */ + tempWrite[0] = (currentAddr >> I2C_SAMPLE_24C64_ADDRESS_POS) & I2C_SAMPLE_24C64_ADDRESS_MASK; + tempWrite[1] = currentAddr & I2C_SAMPLE_24C64_ADDRESS_MASK; + CopyData(&tempWrite[I2C_SAMPLE_24C64_ADDR_SIZE], tempBuffer, tempWriteLen); + /* Send data to eeprom. */ + ret = HAL_I2C_MasterWriteIT(&g_i2c0, DEV_24C64_ADDRESS_WRITE, tempWrite, + tempWriteLen + I2C_SAMPLE_24C64_ADDR_SIZE); + BASE_FUNC_DELAY_MS(20); /* Delay 20 ms. */ + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("LINE:%d,Write Data Fail!,ret:%d\r\n", __LINE__, ret); + break; + } + + /* Waiting for write completion or failure */ + while (!(g_txDoneFlag || g_errorFlag)) { + ; + } + g_txDoneFlag = BASE_CFG_UNSET; + if (g_errorFlag == BASE_CFG_SET) { + g_errorFlag = BASE_CFG_UNSET; /* Reset g_errorFlag. */ + DBG_PRINTF("LINE:%d,Write Data Fail\r\n", __LINE__); + return BASE_STATUS_ERROR; + } + /* Updata the destAddress, srcAddress and len. */ + currentAddr += tempWriteLen; + currentLen -= tempWriteLen; + tempBuffer += tempWriteLen; + } + return ret; +} + +/** + * @brief Send and receive data with the 24c64 eeprom in interrupt mode as master. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. + */ +void I2cInterrupt24c64Processing(void) +{ + BASE_StatusType ret; + unsigned int i; + unsigned int dataFlag; + unsigned char tempWriteBuff[I2C_SAMPLE_24C64_OPT_LEN] = {0}; + unsigned int successCnt = 0; + + SystemInit(); + DBG_PRINTF("I2C Interrupt AT24C64 Start\r\n"); + for (i = 0; i < I2C_SAMPLE_24C64_OPT_LEN; i++) { + tempWriteBuff[i] = 0x5A; /* The written data. */ + } + + for (int j = 0; j < I2C_SAMPLE_24C64_TEST_NUM; j++) { + unsigned char tempReadBuff[I2C_SAMPLE_24C64_OPT_LEN] = {0}; + + /* Write 24c64 data */ + ret = Sample24c64WriteData(I2C_SAMPLE_24C64_OPT_START_ADDR, tempWriteBuff, I2C_SAMPLE_24C64_OPT_LEN); + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("LINE:%d,Write Data Fail,ret:%d\r\n", __LINE__, ret); + } + + /* Read 24c64 data */ + ret = Sample24c64ReadData(I2C_SAMPLE_24C64_OPT_START_ADDR, tempReadBuff, I2C_SAMPLE_24C64_OPT_LEN); + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("LINE:%d,Write Data Fail,ret:%d\r\n", __LINE__, ret); + } + + /* Compare read and write data */ + dataFlag = 0; + for (i = 0; i < I2C_SAMPLE_24C64_OPT_LEN; i++) { + if (tempReadBuff[i] != tempWriteBuff[i]) { + DBG_PRINTF("I2C Data error! offset[%d]\r\nReadData:0x%x\r\nWriteData:0x%x\r\n", i, + tempReadBuff[i], tempWriteBuff[i]); + dataFlag = 1; + break; + } + } + + /* The read data is exactly the same as the written data. */ + if (dataFlag == 0) { + successCnt++; + DBG_PRINTF("I2C Data Success\r\n"); + } + } + DBG_PRINTF("I2C sample End!\r\nsuccessCnt:%d\r\n", successCnt); +} \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_slave_blocking/inc/sample_i2c_slave_blocking.h b/drivers_sample/i2c/sample_i2c_slave_blocking/inc/sample_i2c_slave_blocking.h new file mode 100644 index 000000000..82e72c767 --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_slave_blocking/inc/sample_i2c_slave_blocking.h @@ -0,0 +1,29 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_i2c_slave_blocking.h + * @author MCU Driver Team + * @brief Sample for I2C module blocking as slave. + * @details This sample demonstrates how to use the I2C slave blocking interface to read and write with I2C master. + * To use this sample, the I2C interface must be connected to the I2C master. + */ +#ifndef McuMagicTag_SAMPLE_I2C_SLAVE_BLOCKING_H +#define McuMagicTag_SAMPLE_I2C_SLAVE_BLOCKING_H + +void I2cSlaveBlockingProcessing(void); + +#endif /* #ifndef McuMagicTag_SAMPLE_I2C_SLAVE_BLOCKING_H */ \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_slave_blocking/init/main.c b/drivers_sample/i2c/sample_i2c_slave_blocking/init/main.c new file mode 100644 index 000000000..5742fadab --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_slave_blocking/init/main.c @@ -0,0 +1,51 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ + +#include "typedefs.h" +#include "feature.h" +#include "sample_i2c_slave_blocking.h" +#include "main.h" +/* USER CODE BEGIN 0 */ +/* USER CODE END 0 */ +UART_Handle g_uart0; +I2C_Handle g_i2c0; +/* USER CODE BEGIN 1 */ +/* USER CODE END 1 */ + +int main(void) +{ + /* USER CODE BEGIN 2 */ + /* USER CODE END 2 */ + I2cSlaveBlockingProcessing(); + /* USER CODE BEGIN 3 */ + /* USER CODE END 3 */ + while (1) { + /* USER CODE BEGIN 4 */ + /* USER CODE END 4 */ + } + /* USER CODE BEGIN 5 */ + /* USER CODE END 5 */ + return BASE_STATUS_OK; +} + +/* USER CODE BEGIN 6 */ +/* USER CODE END 6 */ \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_slave_blocking/init/main.h b/drivers_sample/i2c/sample_i2c_slave_blocking/init/main.h new file mode 100644 index 000000000..bd646c19c --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_slave_blocking/init/main.h @@ -0,0 +1,51 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "i2c.h" +#include "i2c_ex.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define XTAL_DRV_LEVEL4 0x03U +#define XTAL_DRV_LEVEL3 0x02U +#define XTAL_DRV_LEVEL2 0x01U +#define XTAL_DRV_LEVEL1 0x00U + +extern UART_Handle g_uart0; +extern I2C_Handle g_i2c0; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_slave_blocking/init/system_init.c b/drivers_sample/i2c/sample_i2c_slave_blocking/init/system_init.c new file mode 100644 index 000000000..f8b0519b0 --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_slave_blocking/init/system_init.c @@ -0,0 +1,129 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" +#include "iocmg_ip.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + /* Clock-related parameter configuration. */ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_1; + /* Initialize the clock configuration. */ + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void I2C0_Init(void) +{ + HAL_CRG_IpEnableSet(I2C0_BASE, IP_CLK_ENABLE); + g_i2c0.baseAddress = I2C0; + + g_i2c0.functionMode = I2C_MODE_SELECT_SLAVE_ONLY; + g_i2c0.addrMode = I2C_7_BITS; + g_i2c0.sdaHoldTime = 10; /* I2C SDA hold time 10. */ + g_i2c0.freq = 400000; /* I2C SCL rate 400000 bit/s. */ + g_i2c0.transferBuff = NULL; + g_i2c0.ignoreAckFlag = BASE_CFG_DISABLE; + g_i2c0.handleEx.spikeFilterTime = 0; + g_i2c0.handleEx.sdaDelayTime = 0; + g_i2c0.timeout = 10000; /* The value of timeout is 10000ms; */ + g_i2c0.slaveOwnAddress = 82; /* The own address of I2C is 82. */ + g_i2c0.handleEx.slaveOwnXmbAddressEnable = BASE_CFG_DISABLE; + g_i2c0.handleEx.slaveOwnXmbAddress = 0; + g_i2c0.generalCallMode = BASE_CFG_DISABLE; + g_i2c0.state = I2C_STATE_RESET; + HAL_I2C_Init(&g_i2c0); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); + /* UART-related parameter configuration. */ + g_uart0.baseAddress = UART0; + + g_uart0.baudRate = UART0_BAND_RATE; /* Setting the UART Baud Rate. */ + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; /* Disable uart fifo mode. */ + g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; + g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; + /* Initializing the UART0. */ + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + HAL_IOCMG_SetPinAltFuncMode(GPIO4_5_AS_I2C0_SCL); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO4_5_AS_I2C0_SCL, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO4_5_AS_I2C0_SCL, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO4_5_AS_I2C0_SCL, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO4_5_AS_I2C0_SCL, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO4_6_AS_I2C0_SDA); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO4_6_AS_I2C0_SDA, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO4_6_AS_I2C0_SDA, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO4_6_AS_I2C0_SDA, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO4_6_AS_I2C0_SDA, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + I2C0_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_slave_blocking/readme.md b/drivers_sample/i2c/sample_i2c_slave_blocking/readme.md new file mode 100644 index 000000000..02f77b964 --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_slave_blocking/readme.md @@ -0,0 +1,23 @@ +# 配置I2C作为从机以阻塞方式进行数据的接收、发送,通过Debug串口打印数据收发的结果 +## 关键字: I2C, 从机,数据读取,数据发送,阻塞方式 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、I2C控制器初始化和功能配置。通过阻塞方式与I2C主机进行数据的接收和数据的发送,通过Debug串口打印数据收发成功或失败的信息。 + +**【示例配置】** ++ I2C控制器选择:可选择I2C0或I2C1作为从机实现与I2C主机的数据接收和发送。 + ++ I2C初始化:调用接口"HAL_I2C_Init()”完成对示例代码中I2C的基地址、主从模式、寻址模式(7bit寻址或10bit寻址)、自身地址、通讯速率等参数进行配置。 + ++ 操作I2C与主机进行数据的发送和接收:
+ 1. 示例代码中首先循环等待I2C主机发送一个"0x3A"的开始标志帧,当接收到此帧后进入与I2C主机的数据发送和接收的交互;
+ 2. 调用"HAL_I2C_SlaveWriteBlocking()"接口以阻塞方式向I2C主机发送数据;
+ 3. 调用"HAL_I2C_SlaveReadBlocking()"接口以阻塞方式实现从I2C主机接收数据;
+ 4. 比较步骤2和步骤3发送和接收的数据是否一致,如果接收和发送的数据一致,则Debug串口打印"I2C Data Success"信息,不一致时打印错误信息。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码中会通过I2C以阻塞方式与主机进行数据的接收和发送,Debug串口打印I2C与主机进行通信交互的结果信息,当发送和接收的数据一致时Debug串口打印"I2C Data Success";当接收和发送的数据不一致时Debug串口打印错误信息。 + +**【注意事项】** ++ 示例代码使用UART0进行结果打印输出,需要对UART0配置。 ++ 示例代码中I2C必须必须对接主机,且保证主机寻址的地址为82(7bit地址),否则示例代码无法正常运行。 \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_slave_blocking/src/sample_i2c_slave_blocking.c b/drivers_sample/i2c/sample_i2c_slave_blocking/src/sample_i2c_slave_blocking.c new file mode 100644 index 000000000..e24287cc7 --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_slave_blocking/src/sample_i2c_slave_blocking.c @@ -0,0 +1,148 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_i2c_slave_blocking.c + * @author MCU Driver Team + * @brief Sample for I2C module blocking as slave. + * @details This sample demonstrates how to use the I2C slave blocking interface to read and write with I2C master. + * To use this sample, the I2C interface must be connected to the I2C master. + */ +#include "i2c.h" +#include "main.h" +#include "debug.h" +#include "sample_i2c_slave_blocking.h" + +#define I2C_SAMPLE_SLAVE_OPT_LEN 8 +#define I2C_TEST_START_FLAG 0x3A + +#define I2C_SAMPLE_SLAVE_TEST_NUM 500 +#define I2C_SAMPLE_MAX_TIMEOUT 10000 + +/** + * @brief Read data from master. + * @param buffer Address of buff to be receive data. + * @param len Number of the data to be read. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. + */ +static BASE_StatusType SampleSlaveBlockingReadData(unsigned char *buffer, unsigned int len) +{ + BASE_StatusType ret = BASE_STATUS_OK; + unsigned int currentLen = len; + unsigned char *tempBuffer = buffer; + + if (currentLen == 0) { /* Number of illegal transmissions. */ + return ret; + } + /* Read data from the master. */ + ret = HAL_I2C_SlaveReadBlocking(&g_i2c0, tempBuffer, currentLen, I2C_SAMPLE_MAX_TIMEOUT); + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("LINE:%d,Read Data Fail,ret:%d\r\n", __LINE__, ret); + return ret; + } + + return ret; +} + +/** + * @brief Send data to the master in blocking mode. + * @param buffer Address of buff to be send. + * @param len Number of the data to be send. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. + */ +static BASE_StatusType SampleSlaveBlockingWriteData(unsigned char *buffer, unsigned int len) +{ + BASE_StatusType ret = BASE_STATUS_OK; + unsigned int currentLen = len; + unsigned char *tempBuffer = buffer; + + if (currentLen == 0) { /* Number of illegal transmissions. */ + return ret; + } + /* Send data to the master. */ + ret = HAL_I2C_SlaveWriteBlocking(&g_i2c0, tempBuffer, currentLen, I2C_SAMPLE_MAX_TIMEOUT); + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("LINE:%d,Write Data Fail!,ret:%d\r\n", __LINE__, ret); + return ret; + } + + return ret; +} + +/** + * @brief Send and receive data in blocking mode as slave. + * @retval None. + */ +void I2cSlaveBlockingProcessing(void) +{ + BASE_StatusType ret; + unsigned int i; + unsigned int dataFlag; + unsigned char tempWriteBuff[I2C_SAMPLE_SLAVE_OPT_LEN] = {0}; + unsigned int successCnt = 0; + unsigned char testStart = 0; + + SystemInit(); + DBG_PRINTF("I2C Slave Blocking Sample Start\r\n"); + for (i = 0; i < I2C_SAMPLE_SLAVE_OPT_LEN; i++) { + tempWriteBuff[i] = 0x4A; /* The written data. */ + } + + /* Waiting for the start signal from the master */ + DBG_PRINTF("Waiting Master Start......\r\n"); + while (true) { + SampleSlaveBlockingReadData(&testStart, 1); + if (testStart == I2C_TEST_START_FLAG) { + DBG_PRINTF("Master wait done\r\n"); + break; + } + } + + /* Start to send and receive test data. */ + for (int j = 0; j < I2C_SAMPLE_SLAVE_TEST_NUM; j++) { + unsigned char tempReadBuff[I2C_SAMPLE_SLAVE_OPT_LEN] = {0}; + + /* Write data to master */ + ret = SampleSlaveBlockingWriteData(tempWriteBuff, I2C_SAMPLE_SLAVE_OPT_LEN); + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("LINE:%d,Write Data Fail,ret:%d\r\n", __LINE__, ret); + } + + /* Read data from master */ + ret = SampleSlaveBlockingReadData(tempReadBuff, I2C_SAMPLE_SLAVE_OPT_LEN); + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("LINE:%d,Read Data Fail,ret:%d\r\n", __LINE__, ret); + } + + /* Compare read and write data */ + dataFlag = 0; + for (i = 0; i < I2C_SAMPLE_SLAVE_OPT_LEN; i++) { + if (tempReadBuff[i] != tempWriteBuff[i]) { + DBG_PRINTF("I2C Data error! offset[%d]\r\nReadData:0x%x\r\nWriteData:0x%x\r\n", i, + tempReadBuff[i], tempWriteBuff[i]); + dataFlag = 1; + break; + } + } + + /* The read data is exactly the same as the written data. */ + if (dataFlag == 0) { + successCnt++; + DBG_PRINTF("I2C Data Success\r\n"); + } + } + DBG_PRINTF("I2C sample End!\r\nsuccessCnt:%d\r\n", successCnt); +} \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_slave_dma/inc/sample_i2c_slave_dma.h b/drivers_sample/i2c/sample_i2c_slave_dma/inc/sample_i2c_slave_dma.h new file mode 100644 index 000000000..860a34ac3 --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_slave_dma/inc/sample_i2c_slave_dma.h @@ -0,0 +1,29 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_i2c_slave_dma.c + * @author MCU Driver Team + * @brief Sample for I2C module dma as slave. + * @details This sample demonstrates how to use the I2C slave DMA interface to read and write with I2C master. + * To use this sample, the I2C interface must be connected to the I2C master. + */ +#ifndef McuMagicTag_SAMPLE_I2C_SLAVE_DMA_H +#define McuMagicTag_SAMPLE_I2C_SLAVE_DMA_H + +void I2cSlaveDmaProcessing(void); + +#endif /* #ifndef McuMagicTag_SAMPLE_I2C_SLAVE_DMA_H */ \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_slave_dma/init/main.c b/drivers_sample/i2c/sample_i2c_slave_dma/init/main.c new file mode 100644 index 000000000..0ff74a0aa --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_slave_dma/init/main.c @@ -0,0 +1,53 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ + +#include "typedefs.h" +#include "feature.h" +#include "sample_i2c_slave_dma.h" +#include "main.h" + +/* USER CODE BEGIN 0 */ +/* USER CODE END 0 */ +UART_Handle g_uart0; +I2C_Handle g_i2c0; +DMA_Handle g_dmac; +/* USER CODE BEGIN 1 */ +/* USER CODE END 1 */ + +int main(void) +{ + /* USER CODE BEGIN 2 */ + /* USER CODE END 2 */ + I2cSlaveDmaProcessing(); + /* USER CODE BEGIN 3 */ + /* USER CODE END 3 */ + while (1) { + /* USER CODE BEGIN 4 */ + /* USER CODE END 4 */ + } + /* USER CODE BEGIN 5 */ + /* USER CODE END 5 */ + return BASE_STATUS_OK; +} + +/* USER CODE BEGIN 6 */ +/* USER CODE END 6 */ \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_slave_dma/init/main.h b/drivers_sample/i2c/sample_i2c_slave_dma/init/main.h new file mode 100644 index 000000000..9e0d9fccb --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_slave_dma/init/main.h @@ -0,0 +1,54 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "i2c.h" +#include "i2c_ex.h" +#include "crg.h" +#include "dma.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define XTAL_DRV_LEVEL4 0x03U +#define XTAL_DRV_LEVEL3 0x02U +#define XTAL_DRV_LEVEL2 0x01U +#define XTAL_DRV_LEVEL1 0x00U + +extern UART_Handle g_uart0; +extern I2C_Handle g_i2c0; + +extern DMA_Handle g_dmac; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_slave_dma/init/system_init.c b/drivers_sample/i2c/sample_i2c_slave_dma/init/system_init.c new file mode 100644 index 000000000..da15b6fa3 --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_slave_dma/init/system_init.c @@ -0,0 +1,216 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" +#include "iocmg_ip.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + /* Clock-related parameter configuration. */ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_1; + /* Initialize the clock configuration. */ + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void DMA_Channel0Init(void *handle) +{ + /* Setting DMA-related parameters. */ + DMA_ChannelParam dma_param; + dma_param.direction = DMA_PERIPH_TO_MEMORY_BY_DMAC; + dma_param.srcAddrInc = DMA_ADDR_UNALTERED; + dma_param.destAddrInc = DMA_ADDR_INCREASE; + dma_param.srcPeriph = DMA_REQUEST_I2C0_RX; + dma_param.destPeriph = DMA_REQUEST_MEM; + /* Set the moving position width. */ + dma_param.srcWidth = DMA_TRANSWIDTH_BYTE; + dma_param.destWidth = DMA_TRANSWIDTH_BYTE; + dma_param.srcBurst = DMA_BURST_LENGTH_1; + dma_param.destBurst = DMA_BURST_LENGTH_1; + dma_param.pHandle = handle; + /* DMA Channel initialization. */ + HAL_DMA_InitChannel(&g_dmac, &dma_param, DMA_CHANNEL_ZERO); +} + +static void DMA_Channel1Init(void *handle) +{ + /* Setting DMA-related parameters. */ + DMA_ChannelParam dma_param; + dma_param.direction = DMA_MEMORY_TO_PERIPH_BY_DMAC; + dma_param.srcAddrInc = DMA_ADDR_INCREASE; + dma_param.destAddrInc = DMA_ADDR_UNALTERED; + dma_param.srcPeriph = DMA_REQUEST_MEM; + dma_param.destPeriph = DMA_REQUEST_I2C0_TX; + /* Set the moving position width. */ + dma_param.srcWidth = DMA_TRANSWIDTH_WORD; + dma_param.destWidth = DMA_TRANSWIDTH_WORD; + dma_param.srcBurst = DMA_BURST_LENGTH_1; + dma_param.destBurst = DMA_BURST_LENGTH_1; + dma_param.pHandle = handle; + /* DMA Channel initialization. */ + HAL_DMA_InitChannel(&g_dmac, &dma_param, DMA_CHANNEL_ONE); +} + +static void DMA_Init(void) +{ + /* DMA initialization. */ + HAL_CRG_IpEnableSet(DMA_BASE, IP_CLK_ENABLE); + g_dmac.baseAddress = DMA; + /* Configuring DMA Interrupt Parameters. */ + IRQ_Register(IRQ_DMA_TC, HAL_DMA_IrqHandlerTc, &g_dmac); + IRQ_Register(IRQ_DMA_ERR, HAL_DMA_IrqHandlerError, &g_dmac); + IRQ_EnableN(IRQ_DMA_TC); + IRQ_EnableN(IRQ_DMA_ERR); + HAL_DMA_Init(&g_dmac); + /* Setting the Channel Priority and Initializing the Channel. */ + DMA_Channel0Init((void *)(&g_i2c0)); + HAL_DMA_SetChannelPriorityEx(&g_dmac, DMA_CHANNEL_ZERO, DMA_PRIORITY_HIGHEST); + DMA_Channel1Init((void *)(&g_i2c0)); + HAL_DMA_SetChannelPriorityEx(&g_dmac, DMA_CHANNEL_ONE, DMA_PRIORITY_HIGHEST); +} + +__weak void I2C0TxCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN I2C0TxCallback */ + /* USER CODE END I2C0TxCallback */ +} + +__weak void I2C0RxCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN I2C0RxCallback */ + /* USER CODE END I2C0RxCallback */ +} + +__weak void I2C0ErrorCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN I2C0ErrorCallback */ + /* USER CODE END I2C0ErrorCallback */ +} + +static void I2C0_Init(void) +{ + HAL_CRG_IpEnableSet(I2C0_BASE, IP_CLK_ENABLE); + g_i2c0.baseAddress = I2C0; + + g_i2c0.functionMode = I2C_MODE_SELECT_SLAVE_ONLY; + g_i2c0.addrMode = I2C_7_BITS; + g_i2c0.sdaHoldTime = 10; /* I2C SDA hold time 10. */ + g_i2c0.freq = 400000; /* I2C SCL rate 400000 bit/s. */ + g_i2c0.transferBuff = NULL; + g_i2c0.ignoreAckFlag = BASE_CFG_DISABLE; + g_i2c0.handleEx.spikeFilterTime = 0; + g_i2c0.handleEx.sdaDelayTime = 0; + g_i2c0.timeout = 10000; /* The value of timeout is 10000ms; */ + g_i2c0.slaveOwnAddress = 82; /* The own address of I2C is 82. */ + g_i2c0.handleEx.slaveOwnXmbAddressEnable = BASE_CFG_DISABLE; + g_i2c0.handleEx.slaveOwnXmbAddress = 0; + g_i2c0.generalCallMode = BASE_CFG_DISABLE; + g_i2c0.state = I2C_STATE_RESET; + g_i2c0.rxWaterMark = 1; /* The value of rx Water mark is 1. */ + g_i2c0.txWaterMark = 12; /* The value of tx Water mark is 12. */ + g_i2c0.dmaHandle = &g_dmac; + g_i2c0.txDmaCh = DMA_CHANNEL_ONE; + g_i2c0.rxDmaCh = DMA_CHANNEL_ZERO; + HAL_I2C_Init(&g_i2c0); + + HAL_I2C_RegisterCallback(&g_i2c0, I2C_SLAVE_TX_COMPLETE_CB_ID, I2C0TxCallback); + HAL_I2C_RegisterCallback(&g_i2c0, I2C_SLAVE_RX_COMPLETE_CB_ID, I2C0RxCallback); + HAL_I2C_RegisterCallback(&g_i2c0, I2C_ERROR_CB_ID, I2C0ErrorCallback); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); + /* UART-related parameter configuration. */ + g_uart0.baseAddress = UART0; + + g_uart0.baudRate = UART0_BAND_RATE; /* Setting the UART Baud Rate. */ + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; /* Disable uart fifo mode. */ + g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; + g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; + /* Initializing the UART0. */ + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO4_5_AS_I2C0_SCL); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO4_5_AS_I2C0_SCL, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO4_5_AS_I2C0_SCL, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO4_5_AS_I2C0_SCL, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO4_5_AS_I2C0_SCL, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO4_6_AS_I2C0_SDA); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO4_6_AS_I2C0_SDA, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO4_6_AS_I2C0_SDA, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO4_6_AS_I2C0_SDA, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO4_6_AS_I2C0_SDA, DRIVER_RATE_2); /* Output signal edge fast/slow */ +} + +void SystemInit(void) +{ + IOConfig(); + DMA_Init(); + UART0_Init(); + I2C0_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_slave_dma/readme.md b/drivers_sample/i2c/sample_i2c_slave_dma/readme.md new file mode 100644 index 000000000..883d89fcb --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_slave_dma/readme.md @@ -0,0 +1,23 @@ +# 配置I2C作为从机以DMA方式进行数据的接收、发送,通过Debug串口打印数据收发的结果 +## 关键字: I2C, 从机,数据读取,数据发送,DMA方式 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、I2C控制器初始化和功能配置。通过DMA方式与I2C主机进行数据的接收和数据的发送,通过Debug串口打印数据收发成功或失败的信息。 + +**【示例配置】** ++ I2C控制器选择:可选择I2C0或I2C1作为从机实现与I2C主机的数据接收和发送。 + ++ I2C初始化:调用接口"HAL_I2C_Init()”完成对示例代码中I2C的基地址、主从模式、寻址模式(7bit寻址或10bit寻址)、自身地址、接收水线和发送水线、通讯速率等参数进行配置。调用"HAL_I2C_RegisterCallback()"接口注册收发完成、传输错误时的回调函数。 + ++ 操作I2C与主机进行数据的发送和接收:
+ 1. 示例代码中首先循环等待I2C主机发送一个"0x3A"的开始标志帧,当接收到此帧后进入与I2C主机的数据发送和接收的交互;
+ 2. 调用"HAL_I2C_SlaveWriteDMA()"接口以DMA方式向I2C主机发送数据;
+ 3. 调用"HAL_I2C_SlaveReadDMA()"接口以DMA方式实现从I2C主机接收数据;
+ 4. 比较步骤2和步骤3发送和接收的数据是否一致,如果接收和发送的数据一致,则Debug串口打印"I2C Data Success"信息,不一致时打印错误信息。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码中会通过I2C以DMA方式与主机进行数据的接收和发送,Debug串口打印I2C与主机进行通信交互的结果信息,当发送和接收的数据一致时Debug串口打印"I2C Data Success";当接收和发送的数据不一致时Debug串口打印错误信息。 + +**【注意事项】** ++ 示例代码使用UART0进行结果打印输出,需要对UART0配置。 ++ 示例代码中I2C必须必须对接主机,且保证主机寻址的地址为82(7bit地址),否则示例代码无法正常运行。 \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_slave_dma/src/sample_i2c_slave_dma.c b/drivers_sample/i2c/sample_i2c_slave_dma/src/sample_i2c_slave_dma.c new file mode 100644 index 000000000..4adb63d62 --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_slave_dma/src/sample_i2c_slave_dma.c @@ -0,0 +1,208 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_i2c_slave_dma.c + * @author MCU Driver Team + * @brief Sample for I2C module dma as slave. + * @details This sample demonstrates how to use the I2C slave DMA interface to read and write with I2C master. + * To use this sample, the I2C interface must be connected to the I2C master. + */ +#include "main.h" +#include "debug.h" +#include "sample_i2c_slave_dma.h" + +#define I2C_SAMPLE_SLAVE_OPT_LEN 8 +#define I2C_TEST_START_FLAG 0x3A + +#define I2C_SAMPLE_SLAVE_TEST_NUM 500 + +static volatile int g_txDoneFlag = BASE_CFG_UNSET; +static volatile int g_rxDoneFlag = BASE_CFG_UNSET; +static volatile int g_errorFlag = BASE_CFG_UNSET; + +/** + * @brief I2c interrupt sample tx callback handle. + * @param handle I2c handle. + * @retval None. + */ +void I2C0TxCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("Tx callback\r\n"); + g_txDoneFlag = BASE_CFG_SET; +} + +/** + * @brief I2c interrupt sample rx callback handle. + * @param handle I2c handle. + * @retval None. + */ +void I2C0RxCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("Rx callback\r\n"); + g_rxDoneFlag = BASE_CFG_SET; +} + +/** + * @brief I2c interrupt sample Error callback handle. + * @param handle I2c handle. + * @retval None. + */ +void I2C0ErrorCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("Error callback\r\n"); + g_errorFlag = BASE_CFG_SET; +} + +/** + * @brief Read data from master in dma. + * @param buffer Address of buff to be receive data. + * @param len Number of the data to be read. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. + */ +static BASE_StatusType SampleSlaveDmaReadData(unsigned char *buffer, unsigned int len) +{ + BASE_StatusType ret = BASE_STATUS_OK; + unsigned int currentLen = len; + unsigned char *tempBuffer = buffer; + + if (currentLen == 0) { /* Number of illegal transmissions. */ + return ret; + } + + /* Read data from the master. */ + ret = HAL_I2C_SlaveReadDMA(&g_i2c0, tempBuffer, currentLen); + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("LINE:%d,Read Data Fail,ret:%d\r\n", __LINE__, ret); + return ret; + } + /* Waiting for read completion or failure */ + while (!(g_rxDoneFlag || g_errorFlag)) { + ; + } + g_rxDoneFlag = BASE_CFG_UNSET; + if (g_errorFlag == BASE_CFG_SET) { + DBG_PRINTF("LINE:%d,Read Data Fail\r\n", __LINE__); + g_errorFlag = BASE_CFG_UNSET; + return BASE_STATUS_ERROR; + } + + return ret; +} + +/** + * @brief Send data to the master in dma. + * @param buffer Address of buff to be send. + * @param len Number of the data to be send. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. + */ +static BASE_StatusType SampleSlaveDmaWriteData(unsigned char *buffer, unsigned int len) +{ + BASE_StatusType ret = BASE_STATUS_OK; + unsigned int currentLen = len; + unsigned char *tempBuffer = buffer; + + if (currentLen == 0) { /* Number of illegal transmissions. */ + return ret; + } + + /* Send data to the master. */ + ret = HAL_I2C_SlaveWriteDMA(&g_i2c0, tempBuffer, currentLen); + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("LINE:%d,Write Data Fail!,ret:%d\r\n", __LINE__, ret); + return ret; + } + /* Waiting for read completion or failure */ + while (!(g_txDoneFlag || g_errorFlag)) { + ; + } + g_txDoneFlag = BASE_CFG_UNSET; + if (g_errorFlag == BASE_CFG_SET) { + g_errorFlag = BASE_CFG_UNSET; + DBG_PRINTF("LINE:%d,Read Data Fail\r\n", __LINE__); + return BASE_STATUS_ERROR; + } + + return ret; +} + +/** + * @brief Send and receive data in dma mode as slave. + * @retval None. + */ +void I2cSlaveDmaProcessing(void) +{ + BASE_StatusType ret; + unsigned int i; + unsigned int dataFlag; + unsigned char tempWriteBuff[I2C_SAMPLE_SLAVE_OPT_LEN] = {0}; + unsigned int successCnt = 0; + unsigned char testStart = 0; + + SystemInit(); + DBG_PRINTF("I2C Slave Dma Sample Start\r\n"); + for (i = 0; i < I2C_SAMPLE_SLAVE_OPT_LEN; i++) { + tempWriteBuff[i] = 0x4A; /* The written data. */ + } + /* Waiting for the start signal from the master */ + DBG_PRINTF("Waiting Master Start......\r\n"); + while (true) { + SampleSlaveDmaReadData(&testStart, 1); + if (testStart == I2C_TEST_START_FLAG) { + DBG_PRINTF("Master wait done\r\n"); + break; + } + } + + /* Start to send and receive test data. */ + for (int j = 0; j < I2C_SAMPLE_SLAVE_TEST_NUM; j++) { + unsigned char tempReadBuff[I2C_SAMPLE_SLAVE_OPT_LEN] = {0}; + + /* Write data to master */ + ret = SampleSlaveDmaWriteData(tempWriteBuff, I2C_SAMPLE_SLAVE_OPT_LEN); + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("LINE:%d,Write Data Fail,ret:%d\r\n", __LINE__, ret); + } + + /* Read data from master */ + ret = SampleSlaveDmaReadData(tempReadBuff, I2C_SAMPLE_SLAVE_OPT_LEN); + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("LINE:%d,Read Data Fail,ret:%d\r\n", __LINE__, ret); + } + + BASE_FUNC_DELAY_MS(10); /* Delay 10 ms. */ + /* Compare read and write data */ + dataFlag = 0; + for (i = 0; i < I2C_SAMPLE_SLAVE_OPT_LEN; i++) { + if (tempReadBuff[i] != tempWriteBuff[i]) { + DBG_PRINTF("I2C Data error! offset[%d]\r\nReadData:0x%x\r\nWriteData:0x%x\r\n", i, + tempReadBuff[i], tempWriteBuff[i]); + dataFlag = 1; + break; + } + } + + /* The read data is exactly the same as the written data. */ + if (dataFlag == 0) { + successCnt++; + DBG_PRINTF("I2C Data Success\r\n"); + } + } + DBG_PRINTF("I2C sample End!\r\nsuccessCnt:%d\r\n", successCnt); +} \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_slave_interrupt/inc/sample_i2c_slave_interrupt.h b/drivers_sample/i2c/sample_i2c_slave_interrupt/inc/sample_i2c_slave_interrupt.h new file mode 100644 index 000000000..6490acab6 --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_slave_interrupt/inc/sample_i2c_slave_interrupt.h @@ -0,0 +1,29 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_i2c_slave_interrupt.c + * @author MCU Driver Team + * @brief Sample for I2C module interrupt as slave. + * @details This sample demonstrates how to use the I2C slave interrupt interface to read and write with I2C master. + * To use this sample, the I2C interface must be connected to the I2C master. + */ +#ifndef McuMagicTag_SAMPLE_I2C_SLAVE_INTERRUPT_H +#define McuMagicTag_SAMPLE_I2C_SLAVE_INTERRUPT_H + +void I2cSlaveInterruptProcessing(void); + +#endif /* #ifndef McuMagicTag_SAMPLE_I2C_SLAVE_INTERRUPT_H */ \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_slave_interrupt/init/main.c b/drivers_sample/i2c/sample_i2c_slave_interrupt/init/main.c new file mode 100644 index 000000000..0a65c2f2a --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_slave_interrupt/init/main.c @@ -0,0 +1,52 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ + +#include "typedefs.h" +#include "feature.h" +#include "sample_i2c_slave_interrupt.h" +#include "main.h" + +/* USER CODE BEGIN 0 */ +/* USER CODE END 0 */ +UART_Handle g_uart0; +I2C_Handle g_i2c0; +/* USER CODE BEGIN 1 */ +/* USER CODE END 1 */ + +int main(void) +{ + /* USER CODE BEGIN 2 */ + /* USER CODE END 2 */ + I2cSlaveInterruptProcessing(); + /* USER CODE BEGIN 3 */ + /* USER CODE END 3 */ + while (1) { + /* USER CODE BEGIN 4 */ + /* USER CODE END 4 */ + } + /* USER CODE BEGIN 5 */ + /* USER CODE END 5 */ + return BASE_STATUS_OK; +} + +/* USER CODE BEGIN 6 */ +/* USER CODE END 6 */ \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_slave_interrupt/init/main.h b/drivers_sample/i2c/sample_i2c_slave_interrupt/init/main.h new file mode 100644 index 000000000..340f824bd --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_slave_interrupt/init/main.h @@ -0,0 +1,55 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "i2c.h" +#include "i2c_ex.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define XTAL_DRV_LEVEL4 0x03U +#define XTAL_DRV_LEVEL3 0x02U +#define XTAL_DRV_LEVEL2 0x01U +#define XTAL_DRV_LEVEL1 0x00U + +extern UART_Handle g_uart0; +extern I2C_Handle g_i2c0; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +void I2C0TxCallback(void *handle); +void I2C0RxCallback(void *handle); +void I2C0ErrorCallback(void *handle); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_slave_interrupt/init/system_init.c b/drivers_sample/i2c/sample_i2c_slave_interrupt/init/system_init.c new file mode 100644 index 000000000..db5c8a2cf --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_slave_interrupt/init/system_init.c @@ -0,0 +1,159 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" +#include "iocmg_ip.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + /* Clock-related parameter configuration. */ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_1; + /* Initialize the clock configuration. */ + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +__weak void I2C0TxCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN I2C0TxCallback */ + /* USER CODE END I2C0TxCallback */ +} + +__weak void I2C0RxCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN I2C0RxCallback */ + /* USER CODE END I2C0RxCallback */ +} + +__weak void I2C0ErrorCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN I2C0ErrorCallback */ + /* USER CODE END I2C0ErrorCallback */ +} + +static void I2C0_Init(void) +{ + HAL_CRG_IpEnableSet(I2C0_BASE, IP_CLK_ENABLE); + g_i2c0.baseAddress = I2C0; + + g_i2c0.functionMode = I2C_MODE_SELECT_SLAVE_ONLY; + g_i2c0.addrMode = I2C_7_BITS; + g_i2c0.sdaHoldTime = 10; /* I2C SDA hold time 10. */ + g_i2c0.freq = 400000; /* I2C SCL rate 400000 bit/s. */ + g_i2c0.transferBuff = NULL; + g_i2c0.ignoreAckFlag = BASE_CFG_DISABLE; + g_i2c0.handleEx.spikeFilterTime = 0; + g_i2c0.handleEx.sdaDelayTime = 0; + g_i2c0.timeout = 10000; /* The value of timeout is 10000ms; */ + g_i2c0.slaveOwnAddress = 82; /* The own address of I2C is 82. */ + g_i2c0.handleEx.slaveOwnXmbAddressEnable = BASE_CFG_DISABLE; + g_i2c0.handleEx.slaveOwnXmbAddress = 0; + g_i2c0.generalCallMode = BASE_CFG_DISABLE; + g_i2c0.state = I2C_STATE_RESET; + g_i2c0.rxWaterMark = 1; /* The value of rx Water mark is 1. */ + g_i2c0.txWaterMark = 12; /* The value of tx Water mark is 12. */ + HAL_I2C_Init(&g_i2c0); + + HAL_I2C_RegisterCallback(&g_i2c0, I2C_SLAVE_TX_COMPLETE_CB_ID, I2C0TxCallback); + HAL_I2C_RegisterCallback(&g_i2c0, I2C_SLAVE_RX_COMPLETE_CB_ID, I2C0RxCallback); + HAL_I2C_RegisterCallback(&g_i2c0, I2C_ERROR_CB_ID, I2C0ErrorCallback); + IRQ_Register(IRQ_I2C0, HAL_I2C_IrqHandler, &g_i2c0); + IRQ_SetPriority(IRQ_I2C0, 1); + IRQ_EnableN(IRQ_I2C0); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); + /* UART-related parameter configuration. */ + g_uart0.baseAddress = UART0; + + g_uart0.baudRate = UART0_BAND_RATE; /* Setting the UART Baud Rate. */ + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; /* Disable uart fifo mode. */ + g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; + g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; + /* Initializing the UART0. */ + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO4_5_AS_I2C0_SCL); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO4_5_AS_I2C0_SCL, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO4_5_AS_I2C0_SCL, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO4_5_AS_I2C0_SCL, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO4_5_AS_I2C0_SCL, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO4_6_AS_I2C0_SDA); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO4_6_AS_I2C0_SDA, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO4_6_AS_I2C0_SDA, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO4_6_AS_I2C0_SDA, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO4_6_AS_I2C0_SDA, DRIVER_RATE_2); /* Output signal edge fast/slow */ +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + I2C0_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_slave_interrupt/readme.md b/drivers_sample/i2c/sample_i2c_slave_interrupt/readme.md new file mode 100644 index 000000000..5ad208553 --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_slave_interrupt/readme.md @@ -0,0 +1,23 @@ +# 配置I2C作为从机以中断方式进行数据的接收、发送,通过Debug串口打印数据收发的结果 +## 关键字: I2C, 从机,数据读取,数据发送,中断方式 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、I2C控制器初始化和功能配置。通过中断方式与I2C主机进行数据的接收和数据的发送,通过Debug串口打印数据收发成功或失败的信息。 + +**【示例配置】** ++ I2C控制器选择:可选择I2C0或I2C1作为从机实现与I2C主机的数据接收和发送。 + ++ I2C初始化:调用接口"HAL_I2C_Init()”完成对示例代码中I2C的基地址、主从模式、寻址模式(7bit寻址或10bit寻址)、自身地址、接收水线和发送水线、通讯速率等参数进行配置。调用"HAL_I2C_RegisterCallback()"接口注册中断回调函数,并使能相关中断配置。 + ++ 操作I2C与主机进行数据的发送和接收:
+ 1. 示例代码中首先循环等待I2C主机发送一个"0x3A"的开始标志帧,当接收到此帧后进入与I2C主机的数据发送和接收的交互;
+ 2. 调用"HAL_I2C_SlaveWriteIT()"接口以中断方式向I2C主机发送数据;
+ 3. 调用"HAL_I2C_SlaveReadIT()"接口以中断方式实现从I2C主机接收数据;
+ 4. 比较步骤2和步骤3发送和接收的数据是否一致,如果接收和发送的数据一致,则Debug串口打印"I2C Data Success"信息,不一致时打印错误信息。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码中会通过I2C以中断方式与主机进行数据的接收和发送,Debug串口打印I2C与主机进行通信交互的结果信息,当发送和接收的数据一致时Debug串口打印"I2C Data Success";当接收和发送的数据不一致时Debug串口打印错误信息。 + +**【注意事项】** ++ 示例代码使用UART0进行结果打印输出,需要对UART0配置。 ++ 示例代码中I2C必须必须对接主机,且保证主机寻址的地址为82(7bit地址),否则示例代码无法正常运行。 \ No newline at end of file diff --git a/drivers_sample/i2c/sample_i2c_slave_interrupt/src/sample_i2c_slave_interrupt.c b/drivers_sample/i2c/sample_i2c_slave_interrupt/src/sample_i2c_slave_interrupt.c new file mode 100644 index 000000000..99554d7d2 --- /dev/null +++ b/drivers_sample/i2c/sample_i2c_slave_interrupt/src/sample_i2c_slave_interrupt.c @@ -0,0 +1,206 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_i2c_slave_interrupt.c + * @author MCU Driver Team + * @brief Sample for I2C module interrupt as slave. + * @details This sample demonstrates how to use the I2C slave interrupt interface to read and write with I2C master. + * To use this sample, the I2C interface must be connected to the I2C master. + */ +#include "i2c.h" +#include "main.h" +#include "debug.h" +#include "sample_i2c_slave_interrupt.h" + +#define I2C_SAMPLE_SLAVE_OPT_LEN 8 +#define I2C_TEST_START_FLAG 0x3A + +#define I2C_SAMPLE_SLAVE_TEST_NUM 500 + +static volatile int g_txDoneFlag = BASE_CFG_UNSET; +static volatile int g_rxDoneFlag = BASE_CFG_UNSET; +static volatile int g_errorFlag = BASE_CFG_UNSET; + +/** + * @brief I2c interrupt sample tx callback handle. + * @param handle I2c handle. + * @retval None. + */ +void I2C0TxCallback(void *handle) +{ + DBG_PRINTF("SampleI2CTxDone\r\n"); + BASE_FUNC_UNUSED(handle); + g_txDoneFlag = BASE_CFG_SET; +} + +/** + * @brief I2c interrupt sample rx callback handle. + * @param handle I2c handle. + * @retval None. + */ +void I2C0RxCallback(void *handle) +{ + DBG_PRINTF("SampleI2CRxDone\r\n"); + BASE_FUNC_UNUSED(handle); + g_rxDoneFlag = BASE_CFG_SET; +} + +/** + * @brief I2c interrupt sample Error callback handle. + * @param handle I2c handle. + * @retval None. + */ +void I2C0ErrorCallback(void *handle) +{ + DBG_PRINTF("SampleI2CError\r\n"); + BASE_FUNC_UNUSED(handle); + g_errorFlag = BASE_CFG_SET; +} + +/** + * @brief Read data from master in interrupt. + * @param buffer Address of buff to be receive data. + * @param len Number of the data to be read. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. + */ +static BASE_StatusType SampleSlaveInterruptReadData(unsigned char *buffer, unsigned int len) +{ + BASE_StatusType ret = BASE_STATUS_OK; /* Transfer success and failure status. */ + unsigned int currentLen = len; + unsigned char *tempBuffer = buffer; + + if (currentLen == 0) { /* Number of illegal transmissions. */ + return ret; + } + /* Read data from the master. */ + ret = HAL_I2C_SlaveReadIT(&g_i2c0, tempBuffer, currentLen); + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("LINE:%d,Read Data Fail,ret:%d\r\n", __LINE__, ret); + return ret; + } + /* Waiting for read completion or failure */ + while (!(g_rxDoneFlag || g_errorFlag)) { + ; + } + g_rxDoneFlag = BASE_CFG_UNSET; + if (g_errorFlag == BASE_CFG_SET) { + g_errorFlag = BASE_CFG_UNSET; + DBG_PRINTF("LINE:%d,Read Data Fail\r\n", __LINE__); + return BASE_STATUS_ERROR; + } + + return ret; +} + +/** + * @brief Send data to the master in interrupt. + * @param buffer Address of buff to be send. + * @param len Number of the data to be send. + * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. + */ +static BASE_StatusType SampleSlaveInterruptWriteData(unsigned char *buffer, unsigned int len) +{ + BASE_StatusType ret = BASE_STATUS_OK; /* Transfer success and failure status. */ + unsigned int currentLen = len; + unsigned char *tempBuffer = buffer; + + if (currentLen == 0) { + return ret; + } + /* Send data to the master. */ + ret = HAL_I2C_SlaveWriteIT(&g_i2c0, tempBuffer, currentLen); + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("LINE:%d,Write Data Fail!,ret:%d\r\n", __LINE__, ret); + return ret; + } + /* Waiting for write completion or failure */ + while (!(g_txDoneFlag || g_errorFlag)) { + ; + } + g_txDoneFlag = BASE_CFG_UNSET; + if (g_errorFlag == BASE_CFG_SET) { + g_errorFlag = BASE_CFG_UNSET; + DBG_PRINTF("LINE:%d,Write Data Fail\r\n", __LINE__); + return BASE_STATUS_ERROR; + } + + return ret; +} + +/** + * @brief Send and receive data in interrupt mode as slave. + * @retval None. + */ +void I2cSlaveInterruptProcessing(void) +{ + BASE_StatusType ret; + unsigned int i; + unsigned int dataFlag; + unsigned char tempWriteBuff[I2C_SAMPLE_SLAVE_OPT_LEN] = {0}; + unsigned int successCnt = 0; + unsigned char testStart = 0; + + SystemInit(); + DBG_PRINTF("I2C Slave Interrupt Sample Start\r\n"); + for (i = 0; i < I2C_SAMPLE_SLAVE_OPT_LEN; i++) { + tempWriteBuff[i] = 0x4A; /* The written data. */ + } + /* Waiting for the start signal from the master */ + DBG_PRINTF("Waiting Master Start......\r\n"); + while (true) { + SampleSlaveInterruptReadData(&testStart, 1); + if (testStart == I2C_TEST_START_FLAG) { + DBG_PRINTF("Master wait done\r\n"); + break; + } + } + /* Start to send and receive test data. */ + for (int j = 0; j < I2C_SAMPLE_SLAVE_TEST_NUM; j++) { + unsigned char tempReadBuff[I2C_SAMPLE_SLAVE_OPT_LEN] = {0}; + + /* Write data to master */ + ret = SampleSlaveInterruptWriteData(tempWriteBuff, I2C_SAMPLE_SLAVE_OPT_LEN); + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("LINE:%d,Write Data Fail,ret:%d\r\n", __LINE__, ret); + } + + /* Read data from master */ + ret = SampleSlaveInterruptReadData(tempReadBuff, I2C_SAMPLE_SLAVE_OPT_LEN); + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("LINE:%d,Read Data Fail,ret:%d\r\n", __LINE__, ret); + } + + BASE_FUNC_DELAY_MS(5); /* Delay 5 ms. */ + /* Compare read and write data */ + dataFlag = 0; + for (i = 0; i < I2C_SAMPLE_SLAVE_OPT_LEN; i++) { + if (tempReadBuff[i] != tempWriteBuff[i]) { + DBG_PRINTF("I2C Data error! offset[%d]\r\nReadData:0x%x\r\nWriteData:0x%x\r\n", i, + tempReadBuff[i], tempWriteBuff[i]); + dataFlag = 1; + break; + } + } + + /* The read data is exactly the same as the written data. */ + if (dataFlag == 0) { + successCnt++; + DBG_PRINTF("I2C Data Success\r\n"); + } + } + DBG_PRINTF("I2C sample End!\r\nsuccessCnt:%d\r\n", successCnt); +} \ No newline at end of file diff --git a/drivers_sample/iocmg/iolist_sample/inc/iolist_sample.h b/drivers_sample/iocmg/iolist_sample/inc/iolist_sample.h new file mode 100644 index 000000000..bb338cd22 --- /dev/null +++ b/drivers_sample/iocmg/iolist_sample/inc/iolist_sample.h @@ -0,0 +1,30 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file iolist_sample.h + * @author MCU Driver Team + * @brief IOCMG module sample + * @details The header file contains the following declaration: + * This file provides sample code for users to init iolist. + */ + +#ifndef IOLIST_SAMPLE_H +#define IOLIST_SAMPLE_H + +void IOCMG_IOListInitSample(void); + +#endif /* IOLIST_SAMPLE_H */ \ No newline at end of file diff --git a/drivers_sample/iocmg/iolist_sample/init/main.c b/drivers_sample/iocmg/iolist_sample/init/main.c new file mode 100644 index 000000000..56b83161b --- /dev/null +++ b/drivers_sample/iocmg/iolist_sample/init/main.c @@ -0,0 +1,34 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ +#include "feature.h" +#include "main.h" +#include "iolist_sample.h" + +UART_Handle g_uart0; + +int main(void) +{ + IOCMG_IOListInitSample(); + while (1) { + } + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/iocmg/iolist_sample/init/main.h b/drivers_sample/iocmg/iolist_sample/init/main.h new file mode 100644 index 000000000..0dbdd0fd3 --- /dev/null +++ b/drivers_sample/iocmg/iolist_sample/init/main.h @@ -0,0 +1,47 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "iocmg.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define UART0_TXD_PIN IOCMG_PIN_MUX(iocmg_6, FUNC_MODE_4, 0x0000) +#define UART0_RXD_PIN IOCMG_PIN_MUX(iocmg_7, FUNC_MODE_4, 0x0000) + +extern UART_Handle g_uart0; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/iocmg/iolist_sample/init/system_init.c b/drivers_sample/iocmg/iolist_sample/init/system_init.c new file mode 100644 index 000000000..bc9691eec --- /dev/null +++ b/drivers_sample/iocmg/iolist_sample/init/system_init.c @@ -0,0 +1,86 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); + + g_uart0.baseAddress = UART0; + g_uart0.irqNum = IRQ_UART0; + + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +static void IOCMG_Init(void) +{ + IOCMG_Handle handle = {0}; + handle.pinTypedef = UART0_RXD_PIN; /* UART0_RX pin */ + handle.pullMode = PULL_NONE; + handle.schmidtMode = SCHMIDT_ENABLE; + handle.levelShiftRate = LEVEL_SHIFT_RATE_FAST; + handle.driveRate = DRIVER_RATE_2; + HAL_IOCMG_Init(&handle); /* iocmg handle uart0_rxd init */ + + handle.pinTypedef = UART0_TXD_PIN; /* UART0_TX pin */ + handle.pullMode = PULL_NONE; + handle.schmidtMode = SCHMIDT_ENABLE; + handle.levelShiftRate = LEVEL_SHIFT_RATE_FAST; + handle.driveRate = DRIVER_RATE_2; + HAL_IOCMG_Init(&handle); /* iocmg handle uart0_txd init */ +} + +void SystemInit(void) +{ + IOCMG_Init(); + UART0_Init(); + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/iocmg/iolist_sample/readme.md b/drivers_sample/iocmg/iolist_sample/readme.md new file mode 100644 index 000000000..1793dd8bb --- /dev/null +++ b/drivers_sample/iocmg/iolist_sample/readme.md @@ -0,0 +1,14 @@ +# 使用HAL_IOCMG_Init API完成IO端口的相关功能配置 +## 关键字: IOCMG,iomap映射 + +**【功能描述】** ++ 通过HAL_IOCMG_Init API初始化iolist配置表格。 + +**【示例配置】** ++ g_ioListTable数组的初始化:该数组中的每个元素值表示一个IO端口的结构体IOCMG_Handle,而每个结构体表示某一个IO端口的所有配置信息(包括端口映射地址值pinTypedef,上下拉pullMode,施密特状态schmidtMode、管脚驱动能力levelShiftRate、电平转换速率driveRate) + +**【示例效果】** ++ Debug串口打印配置前的iolist数据,然后打印初始化后的寄存器中的数据,判断配置的数据和预期的是否相同,同时调用HAL_IOCMG_SetXXX API接口和HAL_IOCMG_GetXXX API分别配置和获取IOCMG寄存器的数据是否符合预期。 + +**【注意事项】** ++ PIN NUMBER和function mode均已编码定义,在iomap中,若配置数据与定义的数据不符则配置失败返回对应的错误,已定义的pin number和function mode可在iomap.h中直接调用。 \ No newline at end of file diff --git a/drivers_sample/iocmg/iolist_sample/src/iolist_sample.c b/drivers_sample/iocmg/iolist_sample/src/iolist_sample.c new file mode 100644 index 000000000..79aaac038 --- /dev/null +++ b/drivers_sample/iocmg/iolist_sample/src/iolist_sample.c @@ -0,0 +1,103 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file iolist_sample.c + * @author MCU Driver Team + * @brief Calculate and verify the CRC value of the data. + * @details IOCMG Config in IOListTable, init the iolist g_resultTable, printf the config of the g_resultTable \ + * and Get config after init ,verify the value has been configed success or not, and \ + * set config by HAL_IOCMG_SetConfig API, and get congfig by HAL_IOCMG_GetConfig API, \ + * Compare the config value is match or not. + */ + +/* Includes ------------------------------------------------------------------*/ +#include "debug.h" +#include "iocmg.h" +#include "iolist_sample.h" + +/* for sample normalize in different chip, \ + when user use it, needn't define this macro, just need find the io pin in the iomap.h */ +#define UART0_TXD_PIN IOCMG_PIN_MUX(iocmg_6, FUNC_MODE_4, 0x0000) +#define UART0_RXD_PIN IOCMG_PIN_MUX(iocmg_7, FUNC_MODE_4, 0x0000) +#define I2C0_SCL_PIN IOCMG_PIN_MUX(iocmg_14, FUNC_MODE_5, 0x0211) +#define I2C0_SDA_PIN IOCMG_PIN_MUX(iocmg_15, FUNC_MODE_5, 0x0001) + +static IOCMG_Handle g_ioListTable[] = { + {UART0_TXD_PIN, PULL_BOTH, SCHMIDT_ENABLE, LEVEL_SHIFT_RATE_SLOW, DRIVER_RATE_2}, + {UART0_RXD_PIN, PULL_BOTH, SCHMIDT_ENABLE, LEVEL_SHIFT_RATE_SLOW, DRIVER_RATE_2}, + {I2C0_SCL_PIN, PULL_UP, SCHMIDT_ENABLE, LEVEL_SHIFT_RATE_FAST, DRIVER_RATE_1}, + {I2C0_SDA_PIN, PULL_UP, SCHMIDT_ENABLE, LEVEL_SHIFT_RATE_FAST, DRIVER_RATE_1}, +}; + +const unsigned int IOLIST_SIZE = sizeof(g_ioListTable) / sizeof(g_ioListTable[0]); + +/** + * @brief Init IOLIST by HAL_IOCMG_Init API. + * @param None + * @retval None. + */ +void IOCMG_IOListInitSample(void) +{ + /* init method 1 */ + for (unsigned int index = 0; index < IOLIST_SIZE; ++index) { + HAL_IOCMG_Init(&g_ioListTable[index]); /* Use the HAL_IOCMG_Init function to init uart. */ + } + DBG_UartPrintInit(115200); /* 115200 : baud rate */ + BASE_FUNC_DELAY_MS(10); /* 10 : delay 10ms */ + while (1) { + DBG_PRINTF("**************************************************************\r\n"); + /* test API */ + for (unsigned int index = 0; index < IOLIST_SIZE; ++index) { + DBG_PRINTF("\r\nindex = %d Func Num = %d \r\n", index, \ + HAL_IOCMG_GetPinAltFuncMode(g_ioListTable[index].pinTypedef)); + DBG_PRINTF("Pull Mode = %d \r\n", HAL_IOCMG_GetPinPullMode(g_ioListTable[index].pinTypedef)); + DBG_PRINTF("Level Shift Rate = %d \r\n", HAL_IOCMG_GetPinLevelShiftRate(g_ioListTable[index].pinTypedef)); + DBG_PRINTF("Schmidt Mode = %d \r\n", HAL_IOCMG_GetPinSchmidtMode(g_ioListTable[index].pinTypedef)); + DBG_PRINTF("Drive Rate = %d \r\n", HAL_IOCMG_GetPinDriveRate(g_ioListTable[index].pinTypedef)); + BASE_FUNC_DELAY_MS(10); /* 10: Prevents the printing rate of the serial port from being too high. */ + } + + /* init method 2 */ + for (unsigned int index = 2; index < IOLIST_SIZE; ++index) { + HAL_IOCMG_SetPinAltFuncMode(g_ioListTable[index].pinTypedef); + HAL_IOCMG_SetPinPullMode(g_ioListTable[index].pinTypedef, PULL_BOTH); + HAL_IOCMG_SetPinLevelShiftRate(g_ioListTable[index].pinTypedef, LEVEL_SHIFT_RATE_SLOW); + HAL_IOCMG_SetPinSchmidtMode(g_ioListTable[index].pinTypedef, SCHMIDT_ENABLE); + HAL_IOCMG_SetPinDriveRate(g_ioListTable[index].pinTypedef, DRIVER_RATE_2); + } + /* test API */ + for (unsigned int index = 2; index < IOLIST_SIZE; ++index) { + DBG_PRINTF("\r\nindex = %d Func Num = %d \r\n", index, \ + HAL_IOCMG_GetPinAltFuncMode(g_ioListTable[index].pinTypedef)); + DBG_PRINTF("Pull Mode = %d \r\n", HAL_IOCMG_GetPinPullMode(g_ioListTable[index].pinTypedef)); + DBG_PRINTF("Level Shift Rate = %d \r\n", HAL_IOCMG_GetPinLevelShiftRate(g_ioListTable[index].pinTypedef)); + DBG_PRINTF("Schmidt Mode = %d \r\n", HAL_IOCMG_GetPinSchmidtMode(g_ioListTable[index].pinTypedef)); + DBG_PRINTF("Drive Rate = %d \r\n", HAL_IOCMG_GetPinDriveRate(g_ioListTable[index].pinTypedef)); + BASE_FUNC_DELAY_MS(10); /* 10 : Prevents the printing rate of the serial port from being too high. */ + } + + /* test osc pin function */ + HAL_IOCMG_SetOscClkFuncMode(BASE_CFG_ENABLE); + HAL_IOCMG_SetOscClkOutputMode(BASE_CFG_ENABLE); + HAL_IOCMG_SetOscClkDriveRate(DRIVER_RATE_2); + /* test API */ + DBG_PRINTF("\r\nOsc func mode = %d \r\n", HAL_IOCMG_GetOscClkFuncMode()); + DBG_PRINTF("Osc clk output mode = %d \r\n", HAL_IOCMG_GetOscClkOutputMode()); + DBG_PRINTF("Osc drive rate = %d \r\n", HAL_IOCMG_GetOscClkDriveRate()); + BASE_FUNC_DELAY_MS(1000U); /* delay 1s */ + } +} diff --git a/drivers_sample/iocmg/sample_iocfg_list/inc/sample_iocfg_list.h b/drivers_sample/iocmg/sample_iocfg_list/inc/sample_iocfg_list.h new file mode 100644 index 000000000..de3c67fcc --- /dev/null +++ b/drivers_sample/iocmg/sample_iocfg_list/inc/sample_iocfg_list.h @@ -0,0 +1,30 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_iocfg_list.h + * @author MCU Driver Team + * @brief IOCMG module sample + * @details The header file contains the following declaration: + * This file provides sample code for users to init iolist. + */ + +#ifndef SAMPLE_IOCFG_LIST_H +#define SAMPLE_IOCFG_LIST_H + +void IOCMG_IOListInitSample(void); + +#endif /* SAMPLE_IOCFG_LIST_H */ \ No newline at end of file diff --git a/drivers_sample/iocmg/sample_iocfg_list/init/main.c b/drivers_sample/iocmg/sample_iocfg_list/init/main.c new file mode 100644 index 000000000..f6b262251 --- /dev/null +++ b/drivers_sample/iocmg/sample_iocfg_list/init/main.c @@ -0,0 +1,50 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ + +#include "typedefs.h" +#include "feature.h" +#include "sample_iocfg_list.h" +#include "main.h" +/* USER CODE BEGIN 0 */ +/* USER CODE END 0 */ +UART_Handle g_uart0; +/* USER CODE BEGIN 1 */ +/* USER CODE END 1 */ + +int main(void) +{ + /* USER CODE BEGIN 2 */ + /* USER CODE END 2 */ + /* USER CODE BEGIN 3 */ + /* USER CODE END 3 */ + IOCMG_IOListInitSample(); + while (1) { + /* USER CODE BEGIN 4 */ + /* USER CODE END 4 */ + } + /* USER CODE BEGIN 5 */ + /* USER CODE END 5 */ + return BASE_STATUS_OK; +} + +/* USER CODE BEGIN 6 */ +/* USER CODE END 6 */ \ No newline at end of file diff --git a/drivers_sample/iocmg/sample_iocfg_list/init/main.h b/drivers_sample/iocmg/sample_iocfg_list/init/main.h new file mode 100644 index 000000000..834192874 --- /dev/null +++ b/drivers_sample/iocmg/sample_iocfg_list/init/main.h @@ -0,0 +1,49 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "uart_ex.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define XTAL_DRV_LEVEL4 0x03U +#define XTAL_DRV_LEVEL3 0x02U +#define XTAL_DRV_LEVEL2 0x01U +#define XTAL_DRV_LEVEL1 0x00U + +extern UART_Handle g_uart0; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/iocmg/sample_iocfg_list/init/system_init.c b/drivers_sample/iocmg/sample_iocfg_list/init/system_init.c new file mode 100644 index 000000000..1a1c721e6 --- /dev/null +++ b/drivers_sample/iocmg/sample_iocfg_list/init/system_init.c @@ -0,0 +1,92 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" +#include "iocmg_ip.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_1; + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); + + g_uart0.baseAddress = UART0; + + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; + g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/iocmg/sample_iocfg_list/readme.rd b/drivers_sample/iocmg/sample_iocfg_list/readme.rd new file mode 100644 index 000000000..1793dd8bb --- /dev/null +++ b/drivers_sample/iocmg/sample_iocfg_list/readme.rd @@ -0,0 +1,14 @@ +# 使用HAL_IOCMG_Init API完成IO端口的相关功能配置 +## 关键字: IOCMG,iomap映射 + +**【功能描述】** ++ 通过HAL_IOCMG_Init API初始化iolist配置表格。 + +**【示例配置】** ++ g_ioListTable数组的初始化:该数组中的每个元素值表示一个IO端口的结构体IOCMG_Handle,而每个结构体表示某一个IO端口的所有配置信息(包括端口映射地址值pinTypedef,上下拉pullMode,施密特状态schmidtMode、管脚驱动能力levelShiftRate、电平转换速率driveRate) + +**【示例效果】** ++ Debug串口打印配置前的iolist数据,然后打印初始化后的寄存器中的数据,判断配置的数据和预期的是否相同,同时调用HAL_IOCMG_SetXXX API接口和HAL_IOCMG_GetXXX API分别配置和获取IOCMG寄存器的数据是否符合预期。 + +**【注意事项】** ++ PIN NUMBER和function mode均已编码定义,在iomap中,若配置数据与定义的数据不符则配置失败返回对应的错误,已定义的pin number和function mode可在iomap.h中直接调用。 \ No newline at end of file diff --git a/drivers_sample/iocmg/sample_iocfg_list/src/sample_iocfg_list.c b/drivers_sample/iocmg/sample_iocfg_list/src/sample_iocfg_list.c new file mode 100644 index 000000000..ce9a625f4 --- /dev/null +++ b/drivers_sample/iocmg/sample_iocfg_list/src/sample_iocfg_list.c @@ -0,0 +1,106 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_iocfg_list.c + * @author MCU Driver Team + * @brief Calculate and verify the CRC value of the data. + * @details IOCMG Config in IOListTable, init the iolist g_resultTable, printf the config of the g_resultTable \ + * and Get config after init ,verify the value has been configed success or not, and \ + * set config by HAL_IOCMG_SetConfig API, and get congfig by HAL_IOCMG_GetConfig API, \ + * Compare the config value is match or not. + */ + +/* Includes ------------------------------------------------------------------*/ +#include "debug.h" +#include "iocmg.h" +#include "main.h" +#include "sample_iocfg_list.h" + +/* for sample normalize in different chip, \ + when user use it, needn't define this macro, just need find the io pin in the iomap.h */ +#define UART0_TXD_PIN IOCMG_PIN_MUX(IOCFG_GPIO0_3, FUNC_MODE_3, 0x0230) +#define UART0_RXD_PIN IOCMG_PIN_MUX(IOCFG_GPIO0_4, FUNC_MODE_3, 0x0230) +#define I2C0_SCL_PIN IOCMG_PIN_MUX(IOCFG_GPIO4_2, FUNC_MODE_2, 0x0230) +#define I2C0_SDA_PIN IOCMG_PIN_MUX(IOCFG_GPIO2_1, FUNC_MODE_1, 0x0220) + +static IOCMG_Handle g_ioListTable[] = { + {UART0_TXD_PIN, PULL_NONE, SCHMIDT_DISABLE, LEVEL_SHIFT_RATE_SLOW, DRIVER_RATE_2}, + {UART0_RXD_PIN, PULL_NONE, SCHMIDT_DISABLE, LEVEL_SHIFT_RATE_SLOW, DRIVER_RATE_2}, + {I2C0_SCL_PIN, PULL_UP, SCHMIDT_ENABLE, LEVEL_SHIFT_RATE_FAST, DRIVER_RATE_1}, + {I2C0_SDA_PIN, PULL_UP, SCHMIDT_ENABLE, LEVEL_SHIFT_RATE_FAST, DRIVER_RATE_1}, +}; + +const unsigned int IOLIST_SIZE = sizeof(g_ioListTable) / sizeof(g_ioListTable[0]); + +/** + * @brief Init IOLIST by HAL_IOCMG_Init API. + * @param None + * @retval None. + */ +void IOCMG_IOListInitSample(void) +{ + /* init method 1 */ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + + for (unsigned int index = 0; index < IOLIST_SIZE; ++index) { + HAL_IOCMG_Init(&g_ioListTable[index]); /* Use the HAL_IOCMG_Init function to init uart. */ + } + DBG_UartPrintInit(115200); /* 115200 : baud rate */ + BASE_FUNC_DELAY_MS(10); /* 10 : delay 10ms */ + while (1) { + DBG_PRINTF("**************************************************************\r\n"); + /* test API */ + for (unsigned int index = 0; index < IOLIST_SIZE; ++index) { + DBG_PRINTF("\r\nindex = %d Func Num = %d \r\n", index, \ + HAL_IOCMG_GetPinAltFuncMode(g_ioListTable[index].pinTypedef)); + DBG_PRINTF("Pull Mode = %d \r\n", HAL_IOCMG_GetPinPullMode(g_ioListTable[index].pinTypedef)); + DBG_PRINTF("Level Shift Rate = %d \r\n", HAL_IOCMG_GetPinLevelShiftRate(g_ioListTable[index].pinTypedef)); + DBG_PRINTF("Schmidt Mode = %d \r\n", HAL_IOCMG_GetPinSchmidtMode(g_ioListTable[index].pinTypedef)); + DBG_PRINTF("Drive Rate = %d \r\n", HAL_IOCMG_GetPinDriveRate(g_ioListTable[index].pinTypedef)); + BASE_FUNC_DELAY_MS(10); /* 10: Prevents the printing rate of the serial port from being too high. */ + } + + /* init method 2 */ + for (unsigned int index = 2; index < IOLIST_SIZE; ++index) { + HAL_IOCMG_SetPinAltFuncMode(g_ioListTable[index].pinTypedef); + HAL_IOCMG_SetPinPullMode(g_ioListTable[index].pinTypedef, PULL_BOTH); + HAL_IOCMG_SetPinLevelShiftRate(g_ioListTable[index].pinTypedef, LEVEL_SHIFT_RATE_SLOW); + HAL_IOCMG_SetPinSchmidtMode(g_ioListTable[index].pinTypedef, SCHMIDT_ENABLE); + HAL_IOCMG_SetPinDriveRate(g_ioListTable[index].pinTypedef, DRIVER_RATE_2); + } + /* test API */ + for (unsigned int index = 2; index < IOLIST_SIZE; ++index) { + DBG_PRINTF("\r\nindex = %d Func Num = %d \r\n", index, \ + HAL_IOCMG_GetPinAltFuncMode(g_ioListTable[index].pinTypedef)); + DBG_PRINTF("Pull Mode = %d \r\n", HAL_IOCMG_GetPinPullMode(g_ioListTable[index].pinTypedef)); + DBG_PRINTF("Level Shift Rate = %d \r\n", HAL_IOCMG_GetPinLevelShiftRate(g_ioListTable[index].pinTypedef)); + DBG_PRINTF("Schmidt Mode = %d \r\n", HAL_IOCMG_GetPinSchmidtMode(g_ioListTable[index].pinTypedef)); + DBG_PRINTF("Drive Rate = %d \r\n", HAL_IOCMG_GetPinDriveRate(g_ioListTable[index].pinTypedef)); + BASE_FUNC_DELAY_MS(10); /* 10 : Prevents the printing rate of the serial port from being too high. */ + } + + /* test osc pin function */ + HAL_IOCMG_SetOscClkFuncMode(BASE_CFG_ENABLE); + HAL_IOCMG_SetOscClkOutputMode(BASE_CFG_ENABLE); + HAL_IOCMG_SetOscClkDriveRate(DRIVER_RATE_2); + /* test API */ + DBG_PRINTF("\r\nOsc func mode = %d \r\n", HAL_IOCMG_GetOscClkFuncMode()); + DBG_PRINTF("Osc clk output mode = %d \r\n", HAL_IOCMG_GetOscClkOutputMode()); + DBG_PRINTF("Osc drive rate = %d \r\n", HAL_IOCMG_GetOscClkDriveRate()); + BASE_FUNC_DELAY_MS(1000U); /* delay 1s */ + } +} diff --git a/drivers_sample/open_mcu b/drivers_sample/open_mcu new file mode 160000 index 000000000..1bc802495 --- /dev/null +++ b/drivers_sample/open_mcu @@ -0,0 +1 @@ +Subproject commit 1bc8024950597ae9fc794ba3982564d12314e0d5 diff --git a/drivers_sample/open_mcu_1 b/drivers_sample/open_mcu_1 new file mode 160000 index 000000000..1bc802495 --- /dev/null +++ b/drivers_sample/open_mcu_1 @@ -0,0 +1 @@ +Subproject commit 1bc8024950597ae9fc794ba3982564d12314e0d5 diff --git a/drivers_sample/pga/sample_pga/init/main.c b/drivers_sample/pga/sample_pga/init/main.c new file mode 100644 index 000000000..cd2fe885d --- /dev/null +++ b/drivers_sample/pga/sample_pga/init/main.c @@ -0,0 +1,33 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ +#include "feature.h" +#include "main.h" + +PGA_Handle g_pga; + +int main(void) +{ + SystemInit(); + while (1) { + } + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/pga/sample_pga/init/main.h b/drivers_sample/pga/sample_pga/init/main.h new file mode 100644 index 000000000..7dd948b29 --- /dev/null +++ b/drivers_sample/pga/sample_pga/init/main.h @@ -0,0 +1,43 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "pga.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +extern PGA_Handle g_pga; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/pga/sample_pga/init/system_init.c b/drivers_sample/pga/sample_pga/init/system_init.c new file mode 100644 index 000000000..6afdfc728 --- /dev/null +++ b/drivers_sample/pga/sample_pga/init/system_init.c @@ -0,0 +1,88 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void PGA0_Init(void) +{ + HAL_CRG_IpEnableSet(PGA0_BASE, IP_CLK_ENABLE); + + g_pga.baseAddress = PGA0_BASE; + g_pga.enable = BASE_CFG_ENABLE; + g_pga.extLoopbackEn = BASE_CFG_DISABLE; + g_pga.pgaMux = PGA_INTER_RES_VI0; /* use Internal resistance */ + g_pga.gain = PGA_GAIN_2X; /* Gain value: 2 */ + + HAL_PGA_Init(&g_pga); +} + +static void IOConfig(void) +{ + IOConfig_RegStruct *iconfig = IOCONFIG; + + iconfig->iocmg_40.BIT.func = 0x8; /* 0x8 is PGA0_ANA_EXT */ + iconfig->iocmg_40.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_40.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_40.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_40.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_40.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_39.BIT.func = 0x9; /* 0x9 is PGA0_ANA_N */ + iconfig->iocmg_39.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_39.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_39.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_39.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_39.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_38.BIT.func = 0x9; /* 0x9 is PGA0_ANA_P */ + iconfig->iocmg_38.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_38.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_38.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_38.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_38.BIT.se = BASE_CFG_DISABLE; +} + +void SystemInit(void) +{ + IOConfig(); + PGA0_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/pga/sample_pga/readme.md b/drivers_sample/pga/sample_pga/readme.md new file mode 100644 index 000000000..dc1f94ada --- /dev/null +++ b/drivers_sample/pga/sample_pga/readme.md @@ -0,0 +1,14 @@ +# 可编译增益放大器-内部电阻模式的增益放大 +## 关键字: PGA, 内部电阻模式 + +**【功能描述】** ++ 内部电阻模式下,对输入信号进行放大。 + +**【示例配置】** ++ 本示例中采用内部电阻模式, 增益放大值为X2倍,增益值可在PGA模块的配置界面中进行更改,其对应的设置选项为“g_pga.gain”。 + +**【示例效果】** ++ 在IOCMG_38输入正端信号,在IOCMG_39输入负端信号,在IOCMG_40输出放大后的信号。 + +**【注意事项】** ++ 增益可编程为x2, x4, x8, x16。 \ No newline at end of file diff --git a/drivers_sample/pga/sample_pga_extra_resistor/init/main.c b/drivers_sample/pga/sample_pga_extra_resistor/init/main.c new file mode 100644 index 000000000..3e64c9229 --- /dev/null +++ b/drivers_sample/pga/sample_pga_extra_resistor/init/main.c @@ -0,0 +1,34 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ +#include "typedefs.h" +#include "feature.h" +#include "main.h" + +PGA_Handle g_pgaExt; + +int main(void) +{ + SystemInit(); + while (1) { + } + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/pga/sample_pga_extra_resistor/init/main.h b/drivers_sample/pga/sample_pga_extra_resistor/init/main.h new file mode 100644 index 000000000..103838e0d --- /dev/null +++ b/drivers_sample/pga/sample_pga_extra_resistor/init/main.h @@ -0,0 +1,43 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "pga.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +extern PGA_Handle g_pgaExt; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/pga/sample_pga_extra_resistor/init/system_init.c b/drivers_sample/pga/sample_pga_extra_resistor/init/system_init.c new file mode 100644 index 000000000..ab82f453a --- /dev/null +++ b/drivers_sample/pga/sample_pga_extra_resistor/init/system_init.c @@ -0,0 +1,88 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void PGA1_Init(void) +{ + HAL_CRG_IpEnableSet(PGA1_BASE, IP_CLK_ENABLE); + + g_pgaExt.baseAddress = PGA1_BASE; /* pga1 */ + g_pgaExt.enable = BASE_CFG_ENABLE; + g_pgaExt.extLoopbackEn = BASE_CFG_DISABLE; + g_pgaExt.pgaMux = PGA_EXT_RES_VI0; /* use external resistor */ + g_pgaExt.gain = PGA_GAIN_1X; + + HAL_PGA_Init(&g_pgaExt); +} + +static void IOConfig(void) +{ + IOConfig_RegStruct *iconfig = IOCONFIG; + + iconfig->iocmg_22.BIT.func = 0x9; /* 0x9 is PGA1_ANA_P */ + iconfig->iocmg_22.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_22.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_22.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_22.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_22.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_23.BIT.func = 0x9; /* 0x9 is PGA1_ANA_N */ + iconfig->iocmg_23.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_23.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_23.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_23.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_23.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_24.BIT.func = 0x8; /* 0x8 is PGA1_ANA_EXT */ + iconfig->iocmg_24.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_24.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_24.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_24.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_24.BIT.se = BASE_CFG_DISABLE; +} + +void SystemInit(void) +{ + IOConfig(); + PGA1_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/pga/sample_pga_extra_resistor/readme.md b/drivers_sample/pga/sample_pga_extra_resistor/readme.md new file mode 100644 index 000000000..faffe87d6 --- /dev/null +++ b/drivers_sample/pga/sample_pga_extra_resistor/readme.md @@ -0,0 +1,14 @@ +# 可编译增益放大器-外部电阻模式的增益放大 +## 关键字: PGA, 外部电阻模式 + +**【功能描述】** ++ 外部电阻模式下,对输入信号进行放大。 + +**【示例配置】** ++ 本示例中采用外部电阻模式, 放大倍数需通过外部电阻配置。 + +**【示例效果】** ++ 在IOCMG_22输入正端信号,在IOCMG_23输入负端信号,在IOCMG_24输出放大后的信号。 + +**【注意事项】** ++ 外部电阻模式,依赖外部电阻,灵活可调增益。 \ No newline at end of file diff --git a/drivers_sample/pga/sample_pga_result_sampling/inc/sample_pga_result_sampling.h b/drivers_sample/pga/sample_pga_result_sampling/inc/sample_pga_result_sampling.h new file mode 100644 index 000000000..ea4867a41 --- /dev/null +++ b/drivers_sample/pga/sample_pga_result_sampling/inc/sample_pga_result_sampling.h @@ -0,0 +1,31 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_pga_result_sampling.h + * @author MCU Driver Team + * @brief pga sample module. + * @details This file provides users with sample code to help use pga function. + */ +#ifndef SAMPLE_PGA_RESULT_SAMPLING_H +#define SAMPLE_PGA_RESULT_SAMPLING_H + +#include "debug.h" +#include "adc.h" +#include "main.h" + +void PGA_ReultSampling(void); +#endif \ No newline at end of file diff --git a/drivers_sample/pga/sample_pga_result_sampling/init/main.c b/drivers_sample/pga/sample_pga_result_sampling/init/main.c new file mode 100644 index 000000000..baca48b07 --- /dev/null +++ b/drivers_sample/pga/sample_pga_result_sampling/init/main.c @@ -0,0 +1,52 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ + +#include "typedefs.h" +#include "feature.h" +#include "sample_pga_result_sampling.h" +#include "main.h" +/* USER CODE BEGIN 0 */ +/* USER CODE END 0 */ +PGA_Handle g_pga0; +UART_Handle g_uart0; +ADC_Handle g_adc; +/* USER CODE BEGIN 1 */ +/* USER CODE END 1 */ + +int main(void) +{ + /* USER CODE BEGIN 2 */ + /* USER CODE END 2 */ + PGA_ReultSampling(); + /* USER CODE BEGIN 3 */ + /* USER CODE END 3 */ + while (1) { + /* USER CODE BEGIN 4 */ + /* USER CODE END 4 */ + } + /* USER CODE BEGIN 5 */ + /* USER CODE END 5 */ + return BASE_STATUS_OK; +} + +/* USER CODE BEGIN 6 */ +/* USER CODE END 6 */ \ No newline at end of file diff --git a/drivers_sample/pga/sample_pga_result_sampling/init/main.h b/drivers_sample/pga/sample_pga_result_sampling/init/main.h new file mode 100644 index 000000000..c97081771 --- /dev/null +++ b/drivers_sample/pga/sample_pga_result_sampling/init/main.h @@ -0,0 +1,54 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "uart_ex.h" +#include "dac.h" +#include "pga.h" +#include "crg.h" +#include "iocmg.h" +#include "adc.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define XTAL_DRV_LEVEL4 0x03U +#define XTAL_DRV_LEVEL3 0x02U +#define XTAL_DRV_LEVEL2 0x01U +#define XTAL_DRV_LEVEL1 0x00U + +extern UART_Handle g_uart0; +extern ADC_Handle g_adc; +extern PGA_Handle g_pga0; +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/pga/sample_pga_result_sampling/init/system_init.c b/drivers_sample/pga/sample_pga_result_sampling/init/system_init.c new file mode 100644 index 000000000..7060c137b --- /dev/null +++ b/drivers_sample/pga/sample_pga_result_sampling/init/system_init.c @@ -0,0 +1,143 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" +#include "iocmg_ip.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + BASE_FUNC_ASSERT_PARAM(coreClkSelect != NULL); + + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllFbDiv = 0x30; /* PLL loop divider ratio = 0x30 */ + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + crg.coreClkSelect = 0; /* Inner clock HOSC select. */ + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; /* Set the 1MHz clock select. */ + crg.handleEx.clk1MDiv = 0x29; /* Default frequency divider of the 1 MHz clock = 0x29 */ + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; /* CRG init error. */ + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void PGA0_Init(void) +{ + HAL_CRG_IpEnableSet(PGA0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(PGA0_BASE, 0); + + g_pga0.baseAddress = PGA0_BASE; + g_pga0.gain = PGA_GAIN_2X; /* PGA gain value. */ + g_pga0.externalResistorMode = BASE_CFG_DISABLE; /* Inner resistor mode. */ + HAL_PGA_Init(&g_pga0); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + + g_uart0.baseAddress = UART0; + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; /* Word length 8 bit. */ + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; /* UART blocking mode. */ + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; /* UART FIFO depth. */ + g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; /* Oversamping 16x. */ + g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_7_AS_PGA0_OUT); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_7_AS_PGA0_OUT, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_7_AS_PGA0_OUT, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_7_AS_PGA0_OUT, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_7_AS_PGA0_OUT, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO2_6_AS_PGA0_N0); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_6_AS_PGA0_N0, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_6_AS_PGA0_N0, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_6_AS_PGA0_N0, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_6_AS_PGA0_N0, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO2_5_AS_PGA0_P0); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_5_AS_PGA0_P0, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_5_AS_PGA0_P0, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_5_AS_PGA0_P0, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_5_AS_PGA0_P0, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO0_3_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_3_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_3_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_3_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_3_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO0_4_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_4_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_4_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_4_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_4_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ +} + + +static void ADC0_Init(void) +{ + HAL_CRG_IpEnableSet(ADC0_BASE, IP_CLK_ENABLE); /* ADC clock configure. */ + HAL_CRG_IpClkSelectSet(ADC0_BASE, CRG_ADC_CLK_ASYN_PLL_DIV); + HAL_CRG_IpClkDivSet(ADC0_BASE, CRG_ADC_DIV_2); + + g_adc.baseAddress = ADC0; + g_adc.socPriority = ADC_PRIMODE_ALL_ROUND; + + HAL_ADC_Init(&g_adc); /* ADC init configure. */ + + SOC_Param socParam = {0}; + socParam.adcInput = ADC_CH_ADCINA0; /* PIN47(ADC AIN2) */ + socParam.sampleTotalTime = ADC_SOCSAMPLE_5CLK; /* adc sample total time 5 adc_clk */ + socParam.trigSource = ADC_TRIGSOC_SOFT; + socParam.continueMode = BASE_CFG_DISABLE; + socParam.finishMode = ADC_SOCFINISH_NONE; + HAL_ADC_ConfigureSoc(&g_adc, ADC_SOC_NUM1, &socParam); /* SOC configure. */ +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + ADC0_Init(); + PGA0_Init(); + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/pga/sample_pga_result_sampling/readme.md b/drivers_sample/pga/sample_pga_result_sampling/readme.md new file mode 100644 index 000000000..916ae67da --- /dev/null +++ b/drivers_sample/pga/sample_pga_result_sampling/readme.md @@ -0,0 +1,16 @@ +# 运放的基本使用 - ADC采样PGA的输出电压 +## 关键字: PGA放大电压 + +**【功能描述】** ++ 内部电阻模式下,PGA对输入电压放大,并使用ADC采样PGA的输出电压。 + +**【示例配置】** ++ 本示例中使用了PGA的内部电阻模式,电压输出到PGA端,通过PGA进行2倍的放大,并通过ADC将最后采样结果输出。 + ++ 本示例中采用内部电阻模式, 增益放大值为X2倍,增益值可在PGA模块的配置界面中进行更改,其对应的设置选项为“g_pga.gain”。 + +**【示例效果】** ++ PGA的运放结果会通过ADC的采样进行输出,并通过串口0将结果输出。 + +**【注意事项】** ++ 增益可编程为x2, x4, x8, x16。 \ No newline at end of file diff --git a/drivers_sample/pga/sample_pga_result_sampling/src/sample_pga_result_sampling.c b/drivers_sample/pga/sample_pga_result_sampling/src/sample_pga_result_sampling.c new file mode 100644 index 000000000..1ead4584e --- /dev/null +++ b/drivers_sample/pga/sample_pga_result_sampling/src/sample_pga_result_sampling.c @@ -0,0 +1,51 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_pga_result_sampling.c + * @author MCU Driver Team + * @brief pga sample module. + * @details (1) In this example, the internal resistor mode of the PGA is used. The voltage is output to PGA through + * the DAC, the PGA is amplified by 2 times, and the last sampled result is output through the ADC. + * (2) the internal resistor mode is used, and the gain magnification value is X2. + * The gain value can be changed on the PGA module configuration interface. + */ + +#include "sample_pga_result_sampling.h" + +/** + * @brief The PGA amplifies the DAC voltage and uses the ADC to sample the output of the PGA. + * @param None. + * @retval None. + */ +void PGA_ReultSampling(void) +{ + SystemInit(); + DBG_PRINTF("The PGA amplifies the output of the DAC and uses the ADC to sample the result.\r\n"); + /* Configure ADC software triggering. */ + HAL_ADC_SoftTrigSample(&g_adc, ADC_SOC_NUM1); + BASE_FUNC_DELAY_MS(10); /* delay 10 ms */ + if (HAL_ADC_CheckSocFinish(&g_adc, ADC_SOC_NUM1) == BASE_STATUS_ERROR) { + DBG_PRINTF("ADC sampling error output.\r\n"); + return; + } + /* Software trigger ADC sampling */ + unsigned int ret = HAL_ADC_GetConvResult(&g_adc, ADC_SOC_NUM1); + DBG_PRINTF("Sampling completed, result: %x\r\n", ret); + float voltage = (float)ret / (float)4096 * 3.3; /* 4096 and 3.3 are for Sample Value Conversion */ + DBG_PRINTF("Output voltage of the PGA: %f\r\n", voltage); + return; +} \ No newline at end of file diff --git a/drivers_sample/pic/1726194739756.jpg b/drivers_sample/pic/1726194739756.jpg new file mode 100644 index 0000000000000000000000000000000000000000..87c9fbfdea4dc6247aeb31b6a98b34c87fa4529c GIT binary patch literal 5782 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 literal 0 HcmV?d00001 diff --git a/drivers_sample/pic/1726194794028.jpg b/drivers_sample/pic/1726194794028.jpg new file mode 100644 index 0000000000000000000000000000000000000000..49a62d44b2f9a1fe31f5e2a58b719b7f515e9615 GIT binary patch literal 62232 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 literal 0 HcmV?d00001 diff --git a/drivers_sample/pic/1726194869607.jpg b/drivers_sample/pic/1726194869607.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c978f4388baf02d13b40ab41b536751acf75ac03 GIT binary patch literal 166495 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
icY4>&=#fIdZs`H>Ixz(c9V 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%0A1er9x#@&j3D?3k76;v7*b|!CvjM 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%0D*lB4yOw4>P0RGToZocCX`?TXTn0Lpgx;qE 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 Q2XqDO58TJw`-k`b1zcgcy8r+H literal 0 HcmV?d00001 diff --git a/drivers_sample/pic/1726194906962.jpg b/drivers_sample/pic/1726194906962.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bf758c8f9cc35e8a42926f8951b587d87d028817 GIT binary patch literal 4937 zcmeHLeNl{ln+f%1K&RVv1$5?%FjyWXQxp9=CEcWEFW3&WL z2BZAar}?zaPHtp|s(9j>IG&rnThnj#6ht@TYubmu5nPOWT)s4sLY|3%c&$y)!XaZ8Z?zQMBqO_e!6Vg8ijn8 z7KFqmb2)kXYU}p&*Lm@s9nqIB9Fg#u?Md2*WkByldy@#<3`t%NBipHtt=;{k8AR#m z)KgchR`+I)2V>rl7>y!vCuXny3hs_Ftt2UG{V4^3qZWh|mbsFf(soHI?XNPq)13lg zsDu$$ukqw#YIANrsOzp|0I#JRXk%^$A2P}}eS{)*2fgE1q^~mnRD-TX(0D(C z04JTv*l!HHob2RxDHVSLQ9Rn(#w8}(p=0t;q$=H+e3b2KmLflc^`zdEapR{469`WlfMH* zJCG-A>H9 z@RqECU5U9g*ulW(#Ou^y73-T{Yo#|1EQi~NkmJuelbPt)00mF!a^m*yWP9BeeYL!U zw2bqt;}oHMTT5U3Do8wt_TDis8>4vGOQ#Bl4Sm?P^(F(`ZoNisdRY=yuQrvj4SR*A zw7F@wPm$cGg^|#G-U7sU9BVi$haP+1VBM6Lj|E|dK#J`As8n&ACrM%O$B-ygCv7zd zkDj2#d>uZUrq3GqpCHZk>Cq@1Fx~TpQ&R2tI{8a5BQ_x<)}-gDxw7yIKb|1UU>oYk4yz%_5 zF&~cFVh`g}NWkz_s}F;GU|0VF|RVcu1#ZAgUPtJ#co>E(0y%dGqaXp#!ykGL6_K&PO6& zkj59J@h2pW&l^s~XOUtaQwSmzJ}LGfTGgv!b>p<^uEkPl)t|9`Sr!aLe~(1+dP&e* zisa3cnuT#7ds+wK^)p5ck+gv5aG*TjB^ zV!4gve)$lMgQCq*RlC-sNwv1j#Wt=KG3>LcUk;vFZRM};;Ds9x%XIdQf6pLt`j4Q4 z$0L2EInz<3>0vqR&=mS!phQB>xy{cA=$xBfL6y+vuElqv zIe76W4BBE<=sFuE?F<_F=Xm9tNjo3mGtkt+43wW5*Xacu1!Gpd*7{&?Jaf^Fym3CE zZR6CgR1<%kv+|YAgT?>L&>Meoa!Rc*MtVhrqw%pjVvAqL;d_3!cH)kyst#_yzRjv- zcg*Y^FRbf+QW({5t{@9NzB)QrJby|5_v0TM&Ytp#+kZ9tEvhg^n61}s?YDNUTpP%8 Q2XqDO58TJw`-k`b1zcgcy8r+H literal 0 HcmV?d00001 diff --git a/drivers_sample/pic/1726194945180.jpg b/drivers_sample/pic/1726194945180.jpg new file mode 100644 index 0000000000000000000000000000000000000000..809eae5969a3599451a2a92cbafc6f8b0d13806b GIT binary patch literal 171355 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

pQFQeQOQD;xwY(*&td^_&aOSD9hhj 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

jc_0bDj>Ph|^Gu+UIYJ|dB`moo_?Xw=& zN_~�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 Y0~r(>Y>08i4FCWD07*qoM6N<$g3C8vf&c&j literal 0 HcmV?d00001 diff --git a/drivers_sample/pic/1726194962547-1726195476280-9.jpg b/drivers_sample/pic/1726194962547-1726195476280-9.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9468da025f2bccc563aa4faf201c2aceefe0af51 GIT binary patch literal 7234 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 J?=K&n{5O4($y)#b literal 0 HcmV?d00001 diff --git a/drivers_sample/pic/1726195007716.jpg b/drivers_sample/pic/1726195007716.jpg new file mode 100644 index 0000000000000000000000000000000000000000..800d00c0999bcc27b0becd6a908faecdb8536392 GIT binary patch literal 5702 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 aLNvIk9=9G#JrBU2Js&3Q;_v+A^M3%=K>tSo literal 0 HcmV?d00001 diff --git a/drivers_sample/pic/1726195033006.jpg b/drivers_sample/pic/1726195033006.jpg new file mode 100644 index 0000000000000000000000000000000000000000..af33c5de91e2d83e733a2c4f81247a692b441802 GIT binary patch literal 2418 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 XKhzoUKfe#2iU2-d{+`V5PhI&Zv~3yr literal 0 HcmV?d00001 diff --git a/drivers_sample/pic/1726195173004.jpg b/drivers_sample/pic/1726195173004.jpg new file mode 100644 index 0000000000000000000000000000000000000000..42f1f757263a5a4ee1d41c6f8436a67c27ea09be GIT binary patch literal 538 zcmeAS@N?(olHy`uVBq!ia0vp^YCtT55GnkJgG`2@+T%DlNFSrnla5bIOG`Hzg#+mv8v-K<3}%lkP@7 zpPm-&T%at!G5w;~nfKq7MYt4&I$x-!d1b1ndDR}7^C@U!hDq1qhYhd4YFW(n>o}V9 z=8bZkR@mCGi+S5q?Pd4^HALQ}fs{q9UDh74H*Wg+vr8^!oY-^y_1)Czr&(|2e9P}M}QxJEMSej;W=@ic)W+<{ zK%vtqMmKWIEadtl^rmmSa1m(5k%@=arn-9eXiPsX!NZnQcDlmGZDT}=F<6yxBoP;g#1?r7Gjbs^3* z*RyBZI(hcYV|y#R{kCqEwc#ww`R6}W?KRr&?5Q)?FWGMX>3e=X5jtWXYLhns#d^#> zzdiYm<=4C-kOP1F+a;ZMa@vy4x%NoY!3Fb@?B@HQ%2Z5~IHrG3@0h1xzUbqYI)e|q Yd-tE8bJJ!iD9#x?UHx3vIVCg!0BL;V>Hq)$ literal 0 HcmV?d00001 diff --git a/drivers_sample/pic/1726195185553.jpg b/drivers_sample/pic/1726195185553.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d5e854c9146b31d5214ba175f4803576c49474b0 GIT binary patch literal 538 zcmV+#0_FXQP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0k26!K~zXf?Uhff z0Z|x-eI~aVWrgx5N-+zOQp#3M%3>B$cEpDurQ{1JDJztcNTX!M*ZAo@HFC#0ccwe{ zvYEwGr}>>T&pGdzbH?ZQf8i7OBuT<2@WgM!6Tb~lY)K#xKrWXufg5W`rv-NlDIS zuEkub>Bz)lF(K}BI*7;PFUN=`OJkp(J@YGZu~@`*yG6g>7tn`PC=|Z+p)sz+R;6w< z8sgHpUaz8U&i|#<2DMrZs;aV?>rzLfQRupEd23m5JRT7ahuMs<6%&ia0_}F2&CJjQ zTdkHj%Uo{YNKC7y`+Bq4JT3?;=(-$_$4Dd+?7Ivci3wT>eJtkRp_ybd$&NSUSp3&` c;x{4T4sjkeL0y^dS^xk507*qoM6N<$g5@{#oB#j- literal 0 HcmV?d00001 diff --git a/drivers_sample/pmc/sample_pmc_pvd/inc/sample_pmc_pvd.h b/drivers_sample/pmc/sample_pmc_pvd/inc/sample_pmc_pvd.h new file mode 100644 index 000000000..6c2c5b27c --- /dev/null +++ b/drivers_sample/pmc/sample_pmc_pvd/inc/sample_pmc_pvd.h @@ -0,0 +1,27 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_pmc_pvd.h + * @author MCU Driver Team + * @brief Header file containing functions prototypes of PMC module's PVD function sample. + */ +#ifndef McuMagicTag_SAMPLE_PMC_PVD_H +#define McuMagicTag_SAMPLE_PMC_PVD_H + +void PmcPvdSample(void); + +#endif /* McuMagic_SAMPLE_PMC_PVD_H */ \ No newline at end of file diff --git a/drivers_sample/pmc/sample_pmc_pvd/init/main.c b/drivers_sample/pmc/sample_pmc_pvd/init/main.c new file mode 100644 index 000000000..302b05dde --- /dev/null +++ b/drivers_sample/pmc/sample_pmc_pvd/init/main.c @@ -0,0 +1,42 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ +/* Header file generated by the IDE BEGIN */ +#include "typedefs.h" +#include "feature.h" +#include "sample_pmc_pvd.h" +#include "main.h" +/* Header file generated by the IDE END */ + +/* Module handle generated by the IDE BEGIN */ +PMC_Handle g_pmc; +UART_Handle g_uart0; +/* Module handle generated by the IDE END */ + +int main(void) +{ + /* Auto-generated by the IDE BEGIN */ + PmcPvdSample(); + /* Auto-generated by the IDE END */ + while (1) { + } + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/pmc/sample_pmc_pvd/init/main.h b/drivers_sample/pmc/sample_pmc_pvd/init/main.h new file mode 100644 index 000000000..98ce0dceb --- /dev/null +++ b/drivers_sample/pmc/sample_pmc_pvd/init/main.h @@ -0,0 +1,48 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "pmc.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +extern PMC_Handle g_pmc; + +extern UART_Handle g_uart0; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +void PMC_PvdCallback(void *handle); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/pmc/sample_pmc_pvd/init/system_init.c b/drivers_sample/pmc/sample_pmc_pvd/init/system_init.c new file mode 100644 index 000000000..052a15af5 --- /dev/null +++ b/drivers_sample/pmc/sample_pmc_pvd/init/system_init.c @@ -0,0 +1,120 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +__weak void PMC_PvdCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN PmcPvdCallback */ + /* USER CODE END PmcPvdCallback */ +} + +static void PMC_Init(void) +{ + HAL_CRG_IpEnableSet(PMC_BASE, IP_CLK_ENABLE); + + g_pmc.baseAddress = PMC_BASE; + g_pmc.irqNumPvd = IRQ_PVD; + + g_pmc.wakeupSrc = PMC_WAKEUP_CNT; /* wakeup from timer */ + g_pmc.wakeupActMode = PMC_WAKEUP_ACT_UP_EDGE; /* wake up at up edge */ + g_pmc.wakeupTime = 0; + g_pmc.pvdEnable = BASE_CFG_ENABLE; /* enable pvd function */ + g_pmc.pvdThrehold = PMC_PVD_THRED_LEVEL5; /* falling edge 2.58V. */ + g_pmc.pvdInterruptCallback = PMC_PvdCallback; + HAL_PMC_Init(&g_pmc); + + HAL_PMC_IRQService(&g_pmc); + + IRQ_SetPriority(g_pmc.irqNumPvd, 1); + IRQ_EnableN(g_pmc.irqNumPvd); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); + + g_uart0.baseAddress = UART0; + g_uart0.irqNum = IRQ_UART0; + + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + IOConfig_RegStruct *iconfig = IOCONFIG; + + iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ + iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ + iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + PMC_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/pmc/sample_pmc_pvd/readme.md b/drivers_sample/pmc/sample_pmc_pvd/readme.md new file mode 100644 index 000000000..51afde02c --- /dev/null +++ b/drivers_sample/pmc/sample_pmc_pvd/readme.md @@ -0,0 +1,17 @@ +# 配置PMC模块的PVD功能,实现对VDD电压的监测 +## 关键字: PMC, PVD,中断, 电压监测 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、PMC控制器初始化和功能配置。通过PVD实现对VDD电压的监测,PVD中断发生时Debug串口打印相关提示信息。 + +**【示例配置】** + ++ PMC初始化:调用接口"HAL_PMC_Init()”完成对示例代码中PMC的基地址、唤醒模式、唤醒时间或唤醒触发类型、PVD阈值进行配置,其中PVD阈值可以选择的范围是PMC_PVD_THRED_LEVEL2 - PMC_PVD_THRED_LEVEL7。 + ++ 调用"HAL_PMC_RegisterCallback()"注册PVD中断回调函数,并使能相关中断配置。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码中在监测到VDD电压高于或低于设定的PVD阈值时,会产生PVD中断并通过Debug串口打印"PVD happen!"提示信息。 + +**【注意事项】** ++ 示例代码使用UART0进行结果打印输出,需要对UART0配置。 \ No newline at end of file diff --git a/drivers_sample/pmc/sample_pmc_pvd/src/sample_pmc_pvd.c b/drivers_sample/pmc/sample_pmc_pvd/src/sample_pmc_pvd.c new file mode 100644 index 000000000..8fc2e5e0b --- /dev/null +++ b/drivers_sample/pmc/sample_pmc_pvd/src/sample_pmc_pvd.c @@ -0,0 +1,53 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_pmc_pvd.c + * @author MCU Driver Team + * @brief APT module sample of HAL API. + * This file provides some configuration example of PMC module's PVD function. + * + Debug printf information in interrupt callback function if PVD happen. + */ +#include "debug.h" +#include "pmc.h" +#include "crg.h" +#include "sample_pmc_pvd.h" +#include "main.h" + + +/** + * @brief PVD event interrupt callback. + * @retval None. + */ +void PMC_PvdCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("PVD happen!\r\n"); + BASE_FUNC_DELAY_MS(10); /* delay 10 ms, wait for uart printf finish */ + HAL_CRG_PvdResetEnable(BASE_CFG_ENABLE); /* enable pvd reset function */ +} + +/** + * @brief PVD sample. + * @retval None. + */ +void PmcPvdSample(void) +{ + SystemInit(); + DBG_PRINTF("enter main!\r\n"); /* enter main */ + while (1) { + } +} \ No newline at end of file diff --git a/drivers_sample/pmc/sample_pmc_wakeup/inc/sample_pmc_wakeup.h b/drivers_sample/pmc/sample_pmc_wakeup/inc/sample_pmc_wakeup.h new file mode 100644 index 000000000..df2050f7f --- /dev/null +++ b/drivers_sample/pmc/sample_pmc_wakeup/inc/sample_pmc_wakeup.h @@ -0,0 +1,31 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file pmc_hal_sample.h + * @author MCU Driver Team + * @brief This file shows a sample of PMC. + */ +#ifndef McuMagicTag_PMC_HAL_SAMPLE_H +#define McuMagicTag_PMC_HAL_SAMPLE_H +#include "pmc.h" +#include "uart.h" + +extern PMC_Handle g_pmc; +extern UART_Handle g_uart0;; +void PmcWakeupSample(void); + +#endif \ No newline at end of file diff --git a/drivers_sample/pmc/sample_pmc_wakeup/init/main.c b/drivers_sample/pmc/sample_pmc_wakeup/init/main.c new file mode 100644 index 000000000..f31c38b4b --- /dev/null +++ b/drivers_sample/pmc/sample_pmc_wakeup/init/main.c @@ -0,0 +1,42 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ +/* Header file generated by the IDE BEGIN */ +#include "typedefs.h" +#include "feature.h" +#include "sample_pmc_wakeup.h" +#include "main.h" +/* Header file generated by the IDE END */ + +/* Module handle generated by the IDE BEGIN */ +PMC_Handle g_pmc; +UART_Handle g_uart0; +/* Module handle generated by the IDE END */ + +int main(void) +{ + /* Auto-generated by the IDE BEGIN */ + PmcWakeupSample(); + /* Auto-generated by the IDE END */ + while (1) { + } + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/pmc/sample_pmc_wakeup/init/main.h b/drivers_sample/pmc/sample_pmc_wakeup/init/main.h new file mode 100644 index 000000000..5ee36c60c --- /dev/null +++ b/drivers_sample/pmc/sample_pmc_wakeup/init/main.h @@ -0,0 +1,46 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "pmc.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +extern PMC_Handle g_pmc; + +extern UART_Handle g_uart0; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/pmc/sample_pmc_wakeup/init/system_init.c b/drivers_sample/pmc/sample_pmc_wakeup/init/system_init.c new file mode 100644 index 000000000..f33aa44ef --- /dev/null +++ b/drivers_sample/pmc/sample_pmc_wakeup/init/system_init.c @@ -0,0 +1,107 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void PMC_Init(void) +{ + HAL_CRG_IpEnableSet(PMC_BASE, IP_CLK_ENABLE); + + g_pmc.baseAddress = PMC_BASE; + g_pmc.irqNumPvd = IRQ_PVD; + + g_pmc.wakeupSrc = PMC_WAKEUP_CNT; /* wakeup from timer */ + g_pmc.wakeupActMode = PMC_WAKEUP_ACT_UP_EDGE; /* wakeup at up edge */ + g_pmc.wakeupTime = 9600; /* 9600: wakeup after about 3s */ + g_pmc.pvdEnable = BASE_CFG_DISABLE; /* disable PVD */ + g_pmc.pvdThreshold = PMC_PVD_THRED_LEVEL2; + HAL_PMC_Init(&g_pmc); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); + + g_uart0.baseAddress = UART0; + g_uart0.irqNum = IRQ_UART0; + + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + IOConfig_RegStruct *iconfig = IOCONFIG; + + iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ + iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ + iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + PMC_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/pmc/sample_pmc_wakeup/readme.md b/drivers_sample/pmc/sample_pmc_wakeup/readme.md new file mode 100644 index 000000000..5a0aad898 --- /dev/null +++ b/drivers_sample/pmc/sample_pmc_wakeup/readme.md @@ -0,0 +1,17 @@ +# 配置PMC模块的定时唤醒功能,实现对深度睡眠芯片的唤醒 +## 关键字: PMC, 定时唤醒 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、PMC控制器初始化和功能配置。通过定时唤醒方式实现对深度睡眠芯片唤醒,唤醒后Debug串口打印相关提示信息。 + +**【示例配置】** + ++ PMC初始化:调用接口"HAL_PMC_Init()”完成对示例代码中PMC的基地址、唤醒模式(包括定时唤醒、管脚唤醒)、唤醒时间配置。 + ++ 操作PMC模块进行定时唤醒:在完成PMC初始化操作以后,调用"HAL_PMC_EnterDeepSleepMode()"实现芯片进入深入睡眠模式;在经过设定的唤醒时间后,芯片会唤醒程序复位重新运行,调用"HAL_PMC_GetWakeupType()"获取芯片是从何种模式唤醒,当从深度睡眠中定时唤醒时Debug串口会打印"wakeup from deepsleep."提示信息。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码中在芯片进入深度睡眠后一段时间定时唤醒,通过Debug串口打印"wakeup from deepsleep."提示信息。 + +**【注意事项】** ++ 示例代码使用UART0进行结果打印输出,需要对UART0配置。 \ No newline at end of file diff --git a/drivers_sample/pmc/sample_pmc_wakeup/src/sample_pmc_wakeup.c b/drivers_sample/pmc/sample_pmc_wakeup/src/sample_pmc_wakeup.c new file mode 100644 index 000000000..dc7bcfd92 --- /dev/null +++ b/drivers_sample/pmc/sample_pmc_wakeup/src/sample_pmc_wakeup.c @@ -0,0 +1,68 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file acmp_hal_sample.c + * @author MCU Driver Team + * @brief This file shows a sample of PMC. + */ +#include "pmc_ip.h" +#include "sample_pmc_wakeup.h" +#include "debug.h" +#include "crg.h" +#include "main.h" + +#define PMC_UART_BAUDRATE 115200 + +/** + * @brief User callbaclk after wakeup from deepsleep. + * @param handle pmc handle. + * @retval None + */ +static void UserFuncAfterWakeup(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); /* Open uart's clock */ + HAL_UART_Init(&g_uart0); /* initialize uart */ + DBG_PRINTF("wakeup from deepsleep.\r\n"); +} + +/** + * @brief A sample of PMC's HAL layer. + * @param None. + * @retval None + */ +void PmcWakeupSample(void) +{ + int count = 0; + PMC_LowpowerType wakeupType; + SystemInit(); + wakeupType = HAL_PMC_GetWakeupType(&g_pmc); + if (wakeupType == PMC_LP_DEEPSLEEP) { + UserFuncAfterWakeup(); + } + while (1) { + if (count == 1000) { /* 1000: Enter lowpower mode every 1 second */ + count = 0; + DBG_PRINTF("Enter deep sleep mode.\r\n"); + BASE_FUNC_DELAY_MS(100); /* Delay 100ms to wait for uart output all data */ + HAL_UART_DeInit(&g_uart0); /* deinitialize uart */ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_DISABLE); /* Close uart's clock */ + HAL_PMC_EnterDeepSleepMode(&g_pmc); /* Enter deep sleep mode */ + } + BASE_FUNC_DELAY_MS(1); /* Delay 1ms */ + count++; + } +} \ No newline at end of file diff --git a/drivers_sample/qdm/sample_qdm_m/inc/sample_qdm_m.h b/drivers_sample/qdm/sample_qdm_m/inc/sample_qdm_m.h new file mode 100644 index 000000000..90e35ede3 --- /dev/null +++ b/drivers_sample/qdm/sample_qdm_m/inc/sample_qdm_m.h @@ -0,0 +1,26 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_qdm_m.h + * @author MCU Driver Team + * @brief this file shows use M method and MT method to get speed information for QDM. + */ +#ifndef McuMagicTag_SAMPLE_QDM_M_H +#define McuMagicTag_SAMPLE_QDM_M_H + +void QDM_SampleM(void); +#endif \ No newline at end of file diff --git a/drivers_sample/qdm/sample_qdm_m/init/main.c b/drivers_sample/qdm/sample_qdm_m/init/main.c new file mode 100644 index 000000000..de0185bac --- /dev/null +++ b/drivers_sample/qdm/sample_qdm_m/init/main.c @@ -0,0 +1,37 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ +#include "feature.h" +#include "main.h" +#include "debug.h" +#include "sample_qdm_m.h" + +QDM_Handle g_qdmHandle; +UART_Handle g_uart0; + +int main(void) +{ + DBG_PRINTF("enter main\r\n"); + QDM_SampleM(); + while (1) { + } + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/qdm/sample_qdm_m/init/main.h b/drivers_sample/qdm/sample_qdm_m/init/main.h new file mode 100644 index 000000000..c4cddf992 --- /dev/null +++ b/drivers_sample/qdm/sample_qdm_m/init/main.h @@ -0,0 +1,49 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "qdm.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +extern QDM_Handle g_qdmHandle; + +extern UART_Handle g_uart0; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +void QDM_SpeedLoseCallback(QDM_Handle *handle); +void QDM_PTUCycleCallback(QDM_Handle *handle); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/qdm/sample_qdm_m/init/system_init.c b/drivers_sample/qdm/sample_qdm_m/init/system_init.c new file mode 100644 index 000000000..ceea34489 --- /dev/null +++ b/drivers_sample/qdm/sample_qdm_m/init/system_init.c @@ -0,0 +1,175 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "debug.h" +#include "main.h" +#include "ioconfig.h" + +#define UART0_BAND_RATE 115200 + +#define QDM_MOTOR_LINE_NUMBER 1000 +#define QDM_INPUT_FILTER_VALUE 0 +#define QDM_INPUT_PALORITY 0x0 /**< bit0~2: A B Z phase, bit value: 0--direct input, 1--invert input */ +#define INTERUPT_ENABLE_BITS 0x304 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +__weak void QDM_PTUCycleCallback(QDM_Handle *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN QDMPTUCycleCallback */ + /* USER CODE END QDMPTUCycleCallback */ +} + +__weak void QDM_SpeedLoseCallback(QDM_Handle *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN QDM_SpeedLose */ + /* USER CODE END QDM_SpeedLose */ +} + +static void QDM_Init(void) +{ + HAL_CRG_IpEnableSet(QDM0_BASE, IP_CLK_ENABLE); + + g_qdmHandle.baseAddress = QDM0_BASE; + g_qdmHandle.irqNum = IRQ_QDM0; + /* emulation config */ + g_qdmHandle.emuMode = QDM_EMULATION_MODE_STOP_IMMEDIATELY; + /* input config */ + g_qdmHandle.ctrlConfig.decoderMode = QDM_QUADRATURE_COUNT; + g_qdmHandle.ctrlConfig.polarity = 0; + g_qdmHandle.ctrlConfig.resolution = QDM_1X_RESOLUTION; + g_qdmHandle.ctrlConfig.trgLockMode = QDM_TRG_BY_CYCLE; + g_qdmHandle.ctrlConfig.swap = QDM_SWAP_DISABLE; + g_qdmHandle.ctrlConfig.ptuMode = QDM_PTU_MODE_CYCLE; + /* filter config */ + g_qdmHandle.inputFilter.qdmAFilterLevel = 0; /* filter level */ + g_qdmHandle.inputFilter.qdmBFilterLevel = 0; /* filter level */ + g_qdmHandle.inputFilter.qdmZFilterLevel = 0; /* filter level */ + /* other config */ + g_qdmHandle.pcntMode = QDM_PCNT_MODE_BY_DIR; + g_qdmHandle.pcntRstMode = QDM_PCNT_RST_BY_PTU; + g_qdmHandle.pcntIdxInitMode = QDM_IDX_INIT_DISABLE; + g_qdmHandle.qcMax = 0xffffffff; /* 0xffffffff: QDM TSU Counter Maximum Value */ + g_qdmHandle.subModeEn = true; + g_qdmHandle.tsuPrescaler = 0; /* 0: TSU prescaler */ + g_qdmHandle.cevtPrescaler = 0; /* 0: cevt prescaler */ + g_qdmHandle.posMax = 0xffffffff; /* 0xffffffff: QDM PPU Position Counter Maximum Value */ + g_qdmHandle.posInit = 0; + g_qdmHandle.period = 200000000; /* 200000000: QDM PTU Period Value */ + g_qdmHandle.motorLineNum = 1000; /* 1000: line number */ + g_qdmHandle.interruptEn = INTERUPT_ENABLE_BITS; + + HAL_QDM_Init(&g_qdmHandle); + HAL_QDM_RegisterCallback(&g_qdmHandle, QDM_TSU_CYCLE, QDM_PTUCycleCallback); + HAL_QDM_RegisterCallback(&g_qdmHandle, QDM_SPEED_LOSE, QDM_SpeedLoseCallback); + + HAL_QDM_IRQService(&g_qdmHandle); + IRQ_SetPriority(g_qdmHandle.irqNum, 1); + IRQ_EnableN(g_qdmHandle.irqNum); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); + + g_uart0.baseAddress = UART0; + g_uart0.irqNum = IRQ_UART0; + + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + IOConfig_RegStruct *iconfig = IOCONFIG; + + iconfig->iocmg_11.BIT.func = 0x1; /* 0x1 is QDM_A */ + iconfig->iocmg_11.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_11.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_11.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_11.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_11.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_12.BIT.func = 0x1; /* 0x1 is QDM_B */ + iconfig->iocmg_12.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_12.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_12.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_12.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_12.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_17.BIT.func = 0x1; /* 0x1 is QDM_INDEX */ + iconfig->iocmg_17.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_17.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_17.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_17.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_17.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ + iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ + iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + QDM_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/qdm/sample_qdm_m/readme.md b/drivers_sample/qdm/sample_qdm_m/readme.md new file mode 100644 index 000000000..4ef61a3c7 --- /dev/null +++ b/drivers_sample/qdm/sample_qdm_m/readme.md @@ -0,0 +1,24 @@ +# M法测量电机实时转速 +## 关键字: QDM, 电机,M法 + +**【功能描述】** ++ 通过获取电机编码器QDM的相关信息,使用M法进行计算电机实时转速 + +**【示例配置】** ++ QDM控制配置:解码模式decoderMode,极性选择polarity,正交分解resolution、触发锁存模式trgLockMode,A/B相互换swap,PTU单元周期模式ptuMode + ++ 输入滤波配置:可通过“g_qdmHandle.inputFilter”对A/B/Z相滤波等级进行配置,默认均为0 + ++ PPU电机位置处理单元配置:位置计数模式pcntMode,位置计数复位模式pcntRstMode,位置计数初始化模式pcntIdxInitMode,位置计数器最大值posMax,位置计数初始化值posInit + ++ TSU时间戳单元配置:TSU计数器最大值qcMax,TSU预分频tsuPrescaler + ++ PTU周期触发单元配置:PTU周期大小period + ++ 其他配置:捕获事件预分频cevtPrescaler,编码器线数motorLineNum,中断使能interruptEn,子模块使能subModeEn + +**【示例效果】** ++ 串口打印出电机实时的转速值大小 + +**【注意事项】** ++ 需要转动电机才能进行测量实时转速 diff --git a/drivers_sample/qdm/sample_qdm_m/src/sample_qdm_m.c b/drivers_sample/qdm/sample_qdm_m/src/sample_qdm_m.c new file mode 100644 index 000000000..c335f2387 --- /dev/null +++ b/drivers_sample/qdm/sample_qdm_m/src/sample_qdm_m.c @@ -0,0 +1,41 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file qdm_hal_sample.c + * @author MCU Driver Team + * @brief this file shows use M method to get speed information for QDM. + */ + +#include "qdm.h" +#include "debug.h" +#include "sample_qdm_m.h" +#include "main.h" + +/** + * @brief QDM sample use M method + * @param none. + * @retval none. + */ +void QDM_SampleM(void) +{ + SystemInit(); + while (1) { + int speed; + speed = HAL_QDM_GetSpeedRpmM(&g_qdmHandle); /* get speed */ + DBG_PRINTF("speed: %d.\r\n", speed); + } +} \ No newline at end of file diff --git a/drivers_sample/qdm/sample_qdm_mt/inc/sample_qdm_mt.h b/drivers_sample/qdm/sample_qdm_mt/inc/sample_qdm_mt.h new file mode 100644 index 000000000..7106d390a --- /dev/null +++ b/drivers_sample/qdm/sample_qdm_mt/inc/sample_qdm_mt.h @@ -0,0 +1,26 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_qdm_mt.h + * @author MCU Driver Team + * @brief this file shows use M method and MT method to get speed information for QDM. + */ +#ifndef McuMagicTag_SAMPLE_QDM_MT +#define McuMagicTag_SAMPLE_QDM_MT + +void QDM_SampleMT(void); +#endif \ No newline at end of file diff --git a/drivers_sample/qdm/sample_qdm_mt/init/main.c b/drivers_sample/qdm/sample_qdm_mt/init/main.c new file mode 100644 index 000000000..c082789ce --- /dev/null +++ b/drivers_sample/qdm/sample_qdm_mt/init/main.c @@ -0,0 +1,37 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ +#include "feature.h" +#include "debug.h" +#include "main.h" +#include "sample_qdm_mt.h" + +QDM_Handle g_qdmHandle; +UART_Handle g_uart0; + +int main(void) +{ + DBG_PRINTF("enter main.\r\n"); + QDM_SampleMT(); + while (1) { + } + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/qdm/sample_qdm_mt/init/main.h b/drivers_sample/qdm/sample_qdm_mt/init/main.h new file mode 100644 index 000000000..0469f61bf --- /dev/null +++ b/drivers_sample/qdm/sample_qdm_mt/init/main.h @@ -0,0 +1,46 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "qdm.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +extern QDM_Handle g_qdmHandle; + +extern UART_Handle g_uart0; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/qdm/sample_qdm_mt/init/system_init.c b/drivers_sample/qdm/sample_qdm_mt/init/system_init.c new file mode 100644 index 000000000..b74d4febd --- /dev/null +++ b/drivers_sample/qdm/sample_qdm_mt/init/system_init.c @@ -0,0 +1,154 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" + +#define UART0_BAND_RATE 115200 + +#define QDM_MOTOR_LINE_NUMBER 1000 +#define QDM_INPUT_FILTER_VALUE 0 +#define QDM_INPUT_PALORITY 0x0 /**< bit0~2: A B Z phase, bit value: 0--direct input, 1--invert input */ +#define INTERUPT_ENABLE_BITS 0x304 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void QDM_Init(void) +{ + HAL_CRG_IpEnableSet(QDM0_BASE, IP_CLK_ENABLE); + + g_qdmHandle.baseAddress = QDM0_BASE; + g_qdmHandle.irqNum = IRQ_QDM0; + + /* emulation config */ + g_qdmHandle.emuMode = QDM_EMULATION_MODE_STOP_IMMEDIATELY; + /* input config */ + g_qdmHandle.ctrlConfig.decoderMode = QDM_QUADRATURE_COUNT; + g_qdmHandle.ctrlConfig.polarity = 0; + g_qdmHandle.ctrlConfig.resolution = QDM_4X_RESOLUTION; + g_qdmHandle.ctrlConfig.trgLockMode = QDM_TRG_BY_CYCLE; + g_qdmHandle.ctrlConfig.swap = QDM_SWAP_DISABLE; + g_qdmHandle.ctrlConfig.ptuMode = QDM_PTU_MODE_CYCLE; + /* filter config */ + g_qdmHandle.inputFilter.qdmAFilterLevel = 0; /* filter level */ + g_qdmHandle.inputFilter.qdmBFilterLevel = 0; /* filter level */ + g_qdmHandle.inputFilter.qdmZFilterLevel = 0; /* filter level */ + /* other config */ + g_qdmHandle.pcntMode = QDM_PCNT_MODE_BY_DIR; + g_qdmHandle.pcntRstMode = QDM_PCNT_RST_AUTO; + g_qdmHandle.pcntIdxInitMode = QDM_IDX_INIT_DISABLE; + g_qdmHandle.qcMax = 0xffffffff; /* 0xffffffff: QDM TSU Counter Maximum Value */ + g_qdmHandle.subModeEn = true; + g_qdmHandle.tsuPrescaler = 8; /* 8: TSU prescaler */ + g_qdmHandle.cevtPrescaler = 11; /* 11: cevt prescaler */ + g_qdmHandle.posMax = 0xffffffff; /* 0xffffffff: QDM PPU Position Counter Maximum Value */ + g_qdmHandle.posInit = 0; + + g_qdmHandle.period = 200000000; /* 200000000: QDM PTU Period Value */ + g_qdmHandle.motorLineNum = 1000; /* 1000: line number */ + HAL_QDM_Init(&g_qdmHandle); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); + + g_uart0.baseAddress = UART0; + g_uart0.irqNum = IRQ_UART0; + + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + IOConfig_RegStruct *iconfig = IOCONFIG; + + iconfig->iocmg_11.BIT.func = 0x1; /* 0x1 is QDM_A */ + iconfig->iocmg_11.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_11.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_11.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_11.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_11.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_12.BIT.func = 0x1; /* 0x1 is QDM_B */ + iconfig->iocmg_12.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_12.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_12.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_12.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_12.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_17.BIT.func = 0x1; /* 0x1 is QDM_INDEX */ + iconfig->iocmg_17.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_17.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_17.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_17.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_17.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ + iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ + iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + QDM_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/qdm/sample_qdm_mt/readme.md b/drivers_sample/qdm/sample_qdm_mt/readme.md new file mode 100644 index 000000000..df64b9079 --- /dev/null +++ b/drivers_sample/qdm/sample_qdm_mt/readme.md @@ -0,0 +1,13 @@ +# mcs_65demo + +**【功能描述】** ++ 基于AD105HDMA VER.A单板的双FOC应用 + +**【环境要求】** ++ 所用单板电源改制为演示用的24V低压,双电机均选用深圳杰美康机电的42JSF630AS-1000 + +**【IDE配置方法】** ++ chipConfig中的sample栏目里面选中Motorcontrolsystem示例,然后点击生成代码即可 + +**【注意事项】** ++ AD105HDMA VER.A单板本身为高压板,需要将供电改成24V低压 diff --git a/drivers_sample/qdm/sample_qdm_mt/src/sample_qdm_mt.c b/drivers_sample/qdm/sample_qdm_mt/src/sample_qdm_mt.c new file mode 100644 index 000000000..8ddef4b9e --- /dev/null +++ b/drivers_sample/qdm/sample_qdm_mt/src/sample_qdm_mt.c @@ -0,0 +1,42 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file qdm_hal_sample.c + * @author MCU Driver Team + * @brief this file shows use M method and MT method to get speed information for QDM. + */ + +#include "qdm.h" +#include "debug.h" +#include "sample_qdm_mt.h" +#include "main.h" + + +/** + * @brief QDM sample use MT method. + * @param none. + * @retval none. + */ +void QDM_SampleMT(void) +{ + SystemInit(); + while (1) { + int speed; + speed = HAL_QDM_GetSpeedRpmMT(&g_qdmHandle); /* get speed value */ + DBG_PRINTF("speed: %d\r\n", speed); + } +} diff --git a/drivers_sample/spi/sample_spi_blocking_kta7953/inc/sample_spi_blocking_kta7953.h b/drivers_sample/spi/sample_spi_blocking_kta7953/inc/sample_spi_blocking_kta7953.h new file mode 100644 index 000000000..6f4aaf426 --- /dev/null +++ b/drivers_sample/spi/sample_spi_blocking_kta7953/inc/sample_spi_blocking_kta7953.h @@ -0,0 +1,28 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_spi_blocking_kta7953.h + * @author MCU Driver Team + * @brief SPI module sample. + * @details This file provides sample code for users to help use + * the functionalities of the SPI. + */ +#ifndef McuMagicTag_SAMPLE_SPI_BLOCKING_KTA7953_H +#define McuMagicTag_SAMPLE_SPI_BLOCKING_KTA7953_H + +void Kta7953SampleProcessing(void); +#endif \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_blocking_kta7953/init/main.c b/drivers_sample/spi/sample_spi_blocking_kta7953/init/main.c new file mode 100644 index 000000000..71e1ba809 --- /dev/null +++ b/drivers_sample/spi/sample_spi_blocking_kta7953/init/main.c @@ -0,0 +1,35 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ +#include "feature.h" +#include "main.h" +#include "sample_spi_blocking_kta7953.h" + +SPI_Handle g_spiSampleHandle; +UART_Handle g_uart0; + +int main(void) +{ + Kta7953SampleProcessing(); + while (1) { + } + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_blocking_kta7953/init/main.h b/drivers_sample/spi/sample_spi_blocking_kta7953/init/main.h new file mode 100644 index 000000000..8467e01ce --- /dev/null +++ b/drivers_sample/spi/sample_spi_blocking_kta7953/init/main.h @@ -0,0 +1,46 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "spi.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +extern SPI_Handle g_spiSampleHandle; + +extern UART_Handle g_uart0; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_blocking_kta7953/init/system_init.c b/drivers_sample/spi/sample_spi_blocking_kta7953/init/system_init.c new file mode 100644 index 000000000..4050da8e3 --- /dev/null +++ b/drivers_sample/spi/sample_spi_blocking_kta7953/init/system_init.c @@ -0,0 +1,163 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" + +#define UART0_BAND_RATE 115200 + +#define SPI_FREQ_SCR 2 +#define SPI_FREQ_CPSDVSR 10 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void SPI_Init(void) +{ + HAL_CRG_IpEnableSet(SPI_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(SPI_BASE, CRG_PLL_NO_PREDV); + + g_spiSampleHandle.baseAddress = SPI; + g_spiSampleHandle.irqNum = IRQ_SPI; + + g_spiSampleHandle.mode = HAL_SPI_MASTER; + g_spiSampleHandle.csMode = SPI_CHIP_SELECT_MODE_INTERNAL; + g_spiSampleHandle.xFerMode = HAL_XFER_MODE_BLOCKING; + g_spiSampleHandle.clkPolarity = 0; + g_spiSampleHandle.clkPhase = 0; + g_spiSampleHandle.endian = HAL_SPI_BIG_ENDIAN; + g_spiSampleHandle.frameFormat = HAL_SPI_MODE_MOTOROLA; + g_spiSampleHandle.dataWidth = SPI_DATA_WIDTH_16BIT; + g_spiSampleHandle.freqScr = SPI_FREQ_SCR; + g_spiSampleHandle.freqCpsdvsr = SPI_FREQ_CPSDVSR; + g_spiSampleHandle.waitVal = 127; /* Wait time is 127 clock */ + g_spiSampleHandle.rxBuff = NULL; + g_spiSampleHandle.txBuff = NULL; + g_spiSampleHandle.transferSize = 0; + g_spiSampleHandle.txCount = 0; + g_spiSampleHandle.rxCount = 0; + g_spiSampleHandle.state = HAL_SPI_STATE_RESET; + g_spiSampleHandle.rxIntSize = SPI_RX_INTERRUPT_SIZE_1; + g_spiSampleHandle.txIntSize = SPI_TX_INTERRUPT_SIZE_1; + g_spiSampleHandle.rxDMABurstSize = SPI_RX_DMA_BURST_SIZE_1; + g_spiSampleHandle.txDMABurstSize = SPI_TX_DMA_BURST_SIZE_1; + + HAL_SPI_Init(&g_spiSampleHandle); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); + + g_uart0.baseAddress = UART0; + g_uart0.irqNum = IRQ_UART0; + + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + IOConfig_RegStruct *iconfig = IOCONFIG; + + iconfig->iocmg_22.BIT.func = 0x5; /* 0x5 is SPI_CLK */ + iconfig->iocmg_22.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_22.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_22.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_22.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_22.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_18.BIT.func = 0x5; /* 0x5 is SPI_CSN0 */ + iconfig->iocmg_18.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_18.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_18.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_18.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_18.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_21.BIT.func = 0x5; /* 0x5 is SPI_CSN1 */ + iconfig->iocmg_21.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_21.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_21.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_21.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_21.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_20.BIT.func = 0x5; /* 0x5 is SPI_RXD */ + iconfig->iocmg_20.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_20.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_20.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_20.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_20.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_19.BIT.func = 0x5; /* 0x5 is SPI_TXD */ + iconfig->iocmg_19.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_19.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_19.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_19.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_19.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ + iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ + iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + SPI_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_blocking_kta7953/readme.md b/drivers_sample/spi/sample_spi_blocking_kta7953/readme.md new file mode 100644 index 000000000..15d63306d --- /dev/null +++ b/drivers_sample/spi/sample_spi_blocking_kta7953/readme.md @@ -0,0 +1,18 @@ +# 对接ADC芯片kta7953,通过SPI阻塞方式读取ADC各个通道采样值 +## 关键字: SPI, 阻塞, kta7953 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、SPI控制器初始化和功能配置。SPI对接ADC芯片kta7953,通过阻塞查询方式不断读取ADC芯片kta7953各通道(ch0-ch6)的采样值,以手动模式操作ADC芯片kta7953各个通道。 + +**【示例配置】** ++ 在"SystemInit()”接口中配置SPI时钟极性、时钟相位、帧格式等参数,需根据对接的芯片进行相关参数配置。 + ++ 定义数组,数组中存放以手动操作模式读取各个通道采样值的命令。 + ++ 每次执行测试10次,进行遍历数组,前七次采用“HAL_SPI_WriteReadBlocking()”进行ch0-ch6通道采样,后三次采用“HAL_SPI_WriteBlocking()”和“HAL_SPI_ReadBlocking()”进行ch2-ch4通道采样。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码通过串口打印的方式输出ADC芯片kta7953各通道的采样值。 + +**【注意事项】** ++ 使用此示例代码必须外接ADC芯片kta7953。 diff --git a/drivers_sample/spi/sample_spi_blocking_kta7953/src/sample_spi_blocking_kta7953.c b/drivers_sample/spi/sample_spi_blocking_kta7953/src/sample_spi_blocking_kta7953.c new file mode 100644 index 000000000..04e3eaac8 --- /dev/null +++ b/drivers_sample/spi/sample_spi_blocking_kta7953/src/sample_spi_blocking_kta7953.c @@ -0,0 +1,95 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_spi_blocking_kta7953.c + * @author MCU Driver Team + * @brief Sample for SPI Module Blocking. + * @details This sample is connected to the ADC chip kta7953 to demonstrate how to operate the HAL interface + * in blocking mode in the SPI driver. + * This sample operates channels 0 to 6 of ADC chip kta7953 in manual mode. + * This sample outputs the sampling values of each channel of the ADC chip kta7953 through the serial port. + * To use this sample, connect the external ADC chip kta7953. + */ +#include "main.h" +#include "spi.h" +#include "debug.h" +#include "sample_spi_blocking_kta7953.h" + +#define USER_TIMEOUT 0x400 + +#define MANUAL_MODE_SET_CH0 0x1040 +#define MANUAL_MODE_SET_CH1 0x10C0 +#define MANUAL_MODE_SET_CH2 0x1140 +#define MANUAL_MODE_SET_CH3 0x11C0 +#define MANUAL_MODE_SET_CH4 0x1240 +#define MANUAL_MODE_SET_CH5 0x12C0 +#define MANUAL_MODE_SET_CH6 0x1340 + +#define MAX_TIMEOUT_VAL 5000 + +/** + * @brief Spi blocking sample kta7953 processing. + * @param None. + * @retval None. + */ +void Kta7953SampleProcessing(void) +{ + unsigned short temp = MANUAL_MODE_SET_CH0; + unsigned short tempWdata[] = { + MANUAL_MODE_SET_CH0, + MANUAL_MODE_SET_CH1, + MANUAL_MODE_SET_CH2, + MANUAL_MODE_SET_CH3, + MANUAL_MODE_SET_CH4, + MANUAL_MODE_SET_CH5, + MANUAL_MODE_SET_CH6, + MANUAL_MODE_SET_CH2, + MANUAL_MODE_SET_CH3, + MANUAL_MODE_SET_CH4 + }; + unsigned short tempRdata[10]; + unsigned short outCh = 0; + unsigned short outData = 0; + + SystemInit(); + HAL_SPI_WriteBlocking(&g_spiSampleHandle, (unsigned char *)&temp, sizeof(temp), MAX_TIMEOUT_VAL); + while (1) { + for (int i = 0; i < 10; i++) { /* Test 10 times */ + if (i < 7) { /* First 7 */ + HAL_SPI_WriteReadBlocking(&g_spiSampleHandle, + (unsigned char *)&tempRdata[i], + (unsigned char *)&tempWdata[i], + sizeof(tempWdata[i]), + MAX_TIMEOUT_VAL); + } else { + HAL_SPI_WriteBlocking(&g_spiSampleHandle, + (unsigned char *)&tempWdata[i], + sizeof(tempWdata[i]), + MAX_TIMEOUT_VAL); + HAL_SPI_ReadBlocking(&g_spiSampleHandle, + (unsigned char *)&tempRdata[i], + sizeof(tempRdata[i]), + MAX_TIMEOUT_VAL); + } + outCh = tempRdata[i] >> 12; /* Shift right by 12 bits to obtain the lower four bits. */ + outData = tempRdata[i] & 0x0FFF; /* Mask 0x0FFF */ + DBG_PRINTF("[%d], CH:%d = %d\r\n", i, outCh, outData); + } + + BASE_FUNC_DELAY_MS(2000); /* Delay 2000ms */ + } +} diff --git a/drivers_sample/spi/sample_spi_blocking_w25q32/inc/sample_spi_blocking_w25q32.h b/drivers_sample/spi/sample_spi_blocking_w25q32/inc/sample_spi_blocking_w25q32.h new file mode 100644 index 000000000..5870361fb --- /dev/null +++ b/drivers_sample/spi/sample_spi_blocking_w25q32/inc/sample_spi_blocking_w25q32.h @@ -0,0 +1,28 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_spi_blocking_w25q32.h + * @author MCU Driver Team + * @brief SPI module sample. + * @details This file provides sample code for users to help use + * the functionalities of the SPI. + */ +#ifndef SAMPLE_SPI_BLOCKING_W25Q32_H +#define SAMPLE_SPI_BLOCKING_W25Q32_H + +void W25Q32BlockingSampleProcessing(void); +#endif \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_blocking_w25q32/init/main.c b/drivers_sample/spi/sample_spi_blocking_w25q32/init/main.c new file mode 100644 index 000000000..9a8240a8a --- /dev/null +++ b/drivers_sample/spi/sample_spi_blocking_w25q32/init/main.c @@ -0,0 +1,50 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ + +#include "typedefs.h" +#include "feature.h" +#include "main.h" +/* USER CODE BEGIN 0 */ +/* USER CODE END 0 */ +UART_Handle g_uart0; +SPI_Handle g_spiSampleHandle; +/* USER CODE BEGIN 1 */ +/* USER CODE END 1 */ + +int main(void) +{ + /* USER CODE BEGIN 2 */ + /* USER CODE END 2 */ + W25Q32BlockingSampleProcessing(); + /* USER CODE BEGIN 3 */ + /* USER CODE END 3 */ + while (1) { + /* USER CODE BEGIN 4 */ + /* USER CODE END 4 */ + } + /* USER CODE BEGIN 5 */ + /* USER CODE END 5 */ + return BASE_STATUS_OK; +} + +/* USER CODE BEGIN 6 */ +/* USER CODE END 6 */ \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_blocking_w25q32/init/main.h b/drivers_sample/spi/sample_spi_blocking_w25q32/init/main.h new file mode 100644 index 000000000..f2ff5b487 --- /dev/null +++ b/drivers_sample/spi/sample_spi_blocking_w25q32/init/main.h @@ -0,0 +1,50 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "spi.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define XTAL_DRV_LEVEL4 0x03U +#define XTAL_DRV_LEVEL3 0x02U +#define XTAL_DRV_LEVEL2 0x01U +#define XTAL_DRV_LEVEL1 0x00U + +extern UART_Handle g_uart0; +extern SPI_Handle g_spiSampleHandle; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_blocking_w25q32/init/system_init.c b/drivers_sample/spi/sample_spi_blocking_w25q32/init/system_init.c new file mode 100644 index 000000000..ad52532ca --- /dev/null +++ b/drivers_sample/spi/sample_spi_blocking_w25q32/init/system_init.c @@ -0,0 +1,157 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" +#include "iocmg_ip.h" + +#define UART0_BAND_RATE 115200 + +#define SPI1_FREQ_SCR 2 +#define SPI1_FREQ_CPSDVSR 10 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; /* crg baseaddress */ + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_1; + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { /* CRG init */ + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void SPI1_Init(void) +{ + HAL_CRG_IpEnableSet(SPI1_BASE, IP_CLK_ENABLE); + + g_spiSampleHandle.baseAddress = SPI1; + + g_spiSampleHandle.mode = HAL_SPI_MASTER; /* spi master */ + g_spiSampleHandle.csMode = SPI_CHIP_SELECT_MODE_CALLBACK; + g_spiSampleHandle.xFerMode = HAL_XFER_MODE_BLOCKING; + g_spiSampleHandle.clkPolarity = HAL_SPI_CLKPOL_0; /* spi ploarity is 0 */ + g_spiSampleHandle.clkPhase = HAL_SPI_CLKPHA_1; + g_spiSampleHandle.endian = HAL_SPI_BIG_ENDIAN; + g_spiSampleHandle.frameFormat = HAL_SPI_MODE_MOTOROLA; /* motorola frame format */ + g_spiSampleHandle.dataWidth = SPI_DATA_WIDTH_8BIT; + g_spiSampleHandle.freqScr = SPI1_FREQ_SCR; + g_spiSampleHandle.freqCpsdvsr = SPI1_FREQ_CPSDVSR; + g_spiSampleHandle.waitEn = BASE_CFG_DISABLE; + g_spiSampleHandle.waitVal = 127; /* microwire wait time 127 */ + g_spiSampleHandle.rxBuff = NULL; + g_spiSampleHandle.txBuff = NULL; + g_spiSampleHandle.transferSize = 0; + g_spiSampleHandle.txCount = 0; /* transfer count */ + g_spiSampleHandle.rxCount = 0; + g_spiSampleHandle.state = HAL_SPI_STATE_RESET; + g_spiSampleHandle.rxIntSize = SPI_RX_INTERRUPT_SIZE_1; + g_spiSampleHandle.txIntSize = SPI_TX_INTERRUPT_SIZE_1; /* tx interrupt size */ + g_spiSampleHandle.rxDMABurstSize = SPI_RX_DMA_BURST_SIZE_1; + g_spiSampleHandle.txDMABurstSize = SPI_TX_DMA_BURST_SIZE_1; + HAL_SPI_Init(&g_spiSampleHandle); + HAL_SPI_ChipSelectChannelSet(&g_spiSampleHandle, SPI_CHIP_SELECT_CHANNEL_1); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + + g_uart0.baseAddress = UART0; /* uart0 baseaaddress */ + + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; /* data length 8 */ + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; /* blocking mode */ + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; /* fifo size 8 */ + g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO4_6_AS_SPI1_CLK); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO4_6_AS_SPI1_CLK, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO4_6_AS_SPI1_CLK, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO4_6_AS_SPI1_CLK, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO4_6_AS_SPI1_CLK, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO1_4_AS_SPI1_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO1_4_AS_SPI1_RXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO1_4_AS_SPI1_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO1_4_AS_SPI1_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO1_4_AS_SPI1_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO3_0_AS_SPI1_CSN1); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO3_0_AS_SPI1_CSN1, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO3_0_AS_SPI1_CSN1, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO3_0_AS_SPI1_CSN1, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO3_0_AS_SPI1_CSN1, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO1_3_AS_SPI1_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO1_3_AS_SPI1_TXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO1_3_AS_SPI1_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO1_3_AS_SPI1_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO1_3_AS_SPI1_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO4_5_AS_SPI1_CSN0); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO4_5_AS_SPI1_CSN0, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO4_5_AS_SPI1_CSN0, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO4_5_AS_SPI1_CSN0, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO4_5_AS_SPI1_CSN0, DRIVER_RATE_2); /* Output signal edge fast/slow */ +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + SPI1_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_blocking_w25q32/readme.md b/drivers_sample/spi/sample_spi_blocking_w25q32/readme.md new file mode 100644 index 000000000..76b7715d5 --- /dev/null +++ b/drivers_sample/spi/sample_spi_blocking_w25q32/readme.md @@ -0,0 +1,20 @@ +# 对接flash芯片w25q32,通过SPI阻塞方式写入和读取w25q32芯片中的数据 +## 关键字: SPI, 阻塞, w25q32芯片 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、SPI控制器初始化和功能配置。SPI对接flash芯片w25q32,通过阻塞方式对w25q32芯片进行写入120个数据,之后从芯片中再读出120字节数据。 + +**【示例配置】** ++ 在"SystemInit()”接口中配置SPI时钟极性、时钟相位、帧格式等参数,需根据对接的芯片进行相关参数配置。 + ++ w25q32芯片扇区擦除:调用“SectorErase()”接口先对w25q32芯片进行擦写操作,内部调用接口“SPI_W25Q32_WriteEnable()”向w25q32发送写使能命令,之后发送擦写扇区命令。命令的发送都是调用“HAL_SPI_WriteBlocking()”接口。 + ++ 向w25q32芯片写数据:调用“WritePage()”接口进行数据写入,发送页写入命令和需要写入120个数据,调用“HAL_SPI_WriteBlocking()”接口。 + ++ 从w25q32芯片读数据:调用“ReadData()”接口进行读数据,发送读命令,调用“HAL_SPI_WriteReadBlocking()”接口从芯片读取120个数据。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后,串口打印写入的120个数据和读取的120个数据,如果写入和读取的数据是相同则打印data correct,否则打印data err。 + +**【注意事项】** ++ 使用此示例代码必须外接flash芯片w25q32。 diff --git a/drivers_sample/spi/sample_spi_blocking_w25q32/src/sample_spi_blocking_w25q32.c b/drivers_sample/spi/sample_spi_blocking_w25q32/src/sample_spi_blocking_w25q32.c new file mode 100644 index 000000000..b9649fb42 --- /dev/null +++ b/drivers_sample/spi/sample_spi_blocking_w25q32/src/sample_spi_blocking_w25q32.c @@ -0,0 +1,244 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_spi_blocking_w25q32.c + * @author MCU Driver Team + * @brief Sample for SPI Module Blocking. + * @details This sample is used to operate the HAL interface on the W25Q32 chip of the flash. + * Write data and read data to address 0 of W25Q32 + */ +#include "main.h" +#include "spi.h" +#include "debug.h" +#include "sample_spi_blocking_w25q32.h" + +#define SPI_W25X_WRITE_ENABLE 0x06 +#define SPI_W25X_SECTOR_ERASE 0x20 +#define SPI_W25X_PAGE_PROGRAM 0x02 +#define SPI_W25X_READ_DATA 0x03 + +#define MAX_TIMEOUT_VAL 5000 + +static unsigned int g_flashAddr = 0; +static unsigned char g_writeBuf[120] = {0}; +static unsigned char g_recvBuf[120] = {0}; + +void SPICsCallback(void *handle); +/** + * @brief spi chip select callback function. + * @param handle SPI handle. + * @retval None + */ +void SPICsCallback(void *handle) +{ + SPI_Handle *spiHandle = (SPI_Handle *)handle; + /* USER CODE BEGIN SPICsCallback */ + if (g_spiSampleHandle.csCtrl == SPI_CHIP_SELECT) { + HAL_SPI_SetChipConfigSelectEx(spiHandle, HAL_SPI_CHIP_CONFIG_SOFR_UNSET); + } else { + HAL_SPI_SetChipConfigSelectEx(spiHandle, HAL_SPI_CHIP_CONFIG_SOFR_SET); + } + /* USER CODE END SPICsCallback */ +} + +/** + * @brief w25q32 enable the write function. + * @param None. + * @retval BASE_StatusType:OK, ERROR. + */ +static BASE_StatusType SPI_W25Q32_WriteEnable(void) +{ + unsigned char temp = SPI_W25X_WRITE_ENABLE; /* Write enable command */ + BASE_StatusType ret; + ret = HAL_SPI_WriteBlocking(&g_spiSampleHandle, (unsigned char *)&temp, sizeof(temp), MAX_TIMEOUT_VAL); + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("enable error!\r\n"); + return BASE_STATUS_ERROR; + } + return BASE_STATUS_OK; +} + +/** + * @brief w25q32 sector erase function. + * @param sectorEraseAddr sector erase address. + * @retval BASE_StatusType:OK, ERROR. + */ +static BASE_StatusType SectorErase(unsigned int sectorEraseAddr) +{ + BASE_StatusType ret; + ret = SPI_W25Q32_WriteEnable(); + if (ret != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + BASE_FUNC_DELAY_MS(20); /* delay 20 ms */ + + unsigned char buffer[4] = {0}; + buffer[0] = SPI_W25X_SECTOR_ERASE; /* Sector erase command */ + buffer[1] = (sectorEraseAddr & 0xFF0000) >> 16; /* Shift right by 16 bits */ + buffer[2] = (sectorEraseAddr & 0xFF00) >> 8; /* Shift right by 8 bits, 2 array subscript */ + buffer[3] = (sectorEraseAddr & 0xFF); /* Lower 8 bits of the sector erase address, 3 array subscript */ + ret = HAL_SPI_WriteBlocking(&g_spiSampleHandle, buffer, sizeof(buffer), MAX_TIMEOUT_VAL); + if (ret != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + return BASE_STATUS_OK; +} + +/** + * @brief w25q32 single page write, maximum 256 bytes. + * @param writeBuf write data buffer. + * @param writeAddr write address. + * @param len data length. + * @retval BASE_StatusType:OK, ERROR. + */ +static BASE_StatusType WritePage(unsigned char *writeBuf, unsigned int writeAddr, unsigned int len) +{ + BASE_StatusType ret; + ret = SPI_W25Q32_WriteEnable(); /* enable the write */ + if (ret != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + BASE_FUNC_DELAY_MS(20); /* Delay 20ms */ + + unsigned char buffer[124] = {0}; /* transmit 124 bytes: 4-byte command and 120-byte data */ + + buffer[0] = SPI_W25X_PAGE_PROGRAM; /* Page Program command */ + buffer[1] = (writeAddr & 0xFF0000) >> 16; /* Shift right by 16 bits */ + buffer[2] = (writeAddr & 0xFF00) >> 8; /* Shift right by 8 bits, 2 array subscript */ + buffer[3] = (writeAddr & 0xFF); /* Lower 8 bits of the sector erase address, 3 array subscript */ + for (unsigned int count = 0; count < len; count++) { + buffer[count + 4] = writeBuf[count]; /* data is stored from array subscript 4 */ + } + ret = HAL_SPI_WriteBlocking(&g_spiSampleHandle, buffer, (len + 4), MAX_TIMEOUT_VAL); /* len + 4 is total size */ + if (ret != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + return BASE_STATUS_OK; +} + +/** + * @brief Read data in the address. + * @param recvBuf write data buffer. + * @param recvAddr write address. + * @param len data length. + * @retval BASE_StatusType:OK, ERROR. + */ +static BASE_StatusType ReadData(unsigned char *recvBuf, unsigned int recvAddr, unsigned int len) +{ + unsigned char buffer[124] = {0}; /* The array size is 124 bytes */ + BASE_StatusType ret; + buffer[0] = SPI_W25X_READ_DATA; /* Read data command */ + buffer[1] = (recvAddr & 0xFF0000) >> 16; /* Shift right by 16 bits */ + buffer[2] = (recvAddr & 0xFF00) >> 8; /* Shift right by 8 bits, 2 array subscript */ + buffer[3] = (recvAddr & 0xFF); /* Lower 8 bits of the sector erase address, 3 array subscript */ + + unsigned char readBuf[124] = {0}; + /* len + 4 is total size */ + ret = HAL_SPI_WriteReadBlocking(&g_spiSampleHandle, readBuf, (unsigned char *)buffer, (len + 4), MAX_TIMEOUT_VAL); + if (ret != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + for (unsigned int i = 0; i < len; i++) { + recvBuf[i] = readBuf[i + 4]; /* read valid data from array subscript 4 */ + } + return BASE_STATUS_OK; +} + +/** + * @brief Performs read data and write page on w25q32. + * @param None. + * @retval None. + */ +static void SPI_WritePageAndReadData(void) +{ + BASE_StatusType ret; + DBG_PRINTF("write data is : \r\n"); + unsigned int writeLen = 120; /* transfer 120 bytes of data */ + for (unsigned int i = 0; i < writeLen; i++) { + g_writeBuf[i] = i; + DBG_PRINTF("%d ", g_writeBuf[i]); + } + DBG_PRINTF("\r\n"); + ret = WritePage(g_writeBuf, g_flashAddr, writeLen); /* w25q32 single page write */ + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("write page failed!\r\n"); + } + + BASE_FUNC_DELAY_MS(5); /* Delay 5ms */ + + unsigned int recvLen = 120; /* 120 bytes of data needs to be received */ + for (unsigned int index = 0; index < recvLen; index++) { + g_recvBuf[index] = 0; + } + ret = ReadData(g_recvBuf, g_flashAddr, recvLen); /* Read data in the g_flashAddr address */ + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("read page failed!\r\n"); + } else { + DBG_PRINTF("read data is : \r\n"); + for (unsigned int i = 0; i < recvLen; i++) { + DBG_PRINTF("%d ", g_recvBuf[i]); /* print received Data */ + } + DBG_PRINTF("\r\n"); + } +} + +/** + * @brief Performs read and write operations on w25q32. + * @param None. + * @retval None. + */ +static void SPI_W25Q32_TEST(void) +{ + BASE_StatusType ret; + ret = SectorErase(g_flashAddr); /* w25q32 sector erase function */ + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("sector erase failed!\r\n"); + } + BASE_FUNC_DELAY_MS(500); /* Delay 500 ms */ + + SPI_WritePageAndReadData(); + + bool flag = true; + unsigned int recvLen = 120; + for (unsigned int i = 0; i < recvLen; i++) { + if (g_recvBuf[i] != g_writeBuf[i]) { /* compare the transmitted data with the received data */ + DBG_PRINTF("data err! \r\n"); + flag = false; + break; + } + } + if (flag) { + DBG_PRINTF("data correct \r\n"); + } + DBG_PRINTF("\r\n"); +} + +/** + * @brief Spi blocking sample w25q32 processing. + * @param None. + * @retval None. + */ +void W25Q32BlockingSampleProcessing(void) +{ + SystemInit(); + HAL_SPI_SetChipConfigSelectEx(&g_spiSampleHandle, HAL_SPI_CHIP_CONFIG_SOFR_SET); + HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_CS_CB_ID, SPICsCallback); + while (1) { + SPI_W25Q32_TEST(); + BASE_FUNC_DELAY_MS(1000); /* Delay 1000 ms */ + } +} diff --git a/drivers_sample/spi/sample_spi_blocking_w25q32_internal/inc/sample_spi_blocking_w25q32_internal.h b/drivers_sample/spi/sample_spi_blocking_w25q32_internal/inc/sample_spi_blocking_w25q32_internal.h new file mode 100644 index 000000000..3ea2d959e --- /dev/null +++ b/drivers_sample/spi/sample_spi_blocking_w25q32_internal/inc/sample_spi_blocking_w25q32_internal.h @@ -0,0 +1,28 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_spi_blocking_w25q32_internal.h + * @author MCU Driver Team + * @brief SPI module sample. + * @details This file provides sample code for users to help use + * the functionalities of the SPI. + */ +#ifndef SAMPLE_SPI_BLOCKING_W25Q32_INTERNAL_H +#define SAMPLE_SPI_BLOCKING_W25Q32_INTERNAL_H + +void W25Q32BlockingSampleProcessing(void); +#endif \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_blocking_w25q32_internal/init/main.c b/drivers_sample/spi/sample_spi_blocking_w25q32_internal/init/main.c new file mode 100644 index 000000000..b1190ef85 --- /dev/null +++ b/drivers_sample/spi/sample_spi_blocking_w25q32_internal/init/main.c @@ -0,0 +1,51 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ + +#include "typedefs.h" +#include "feature.h" +#include "sample_spi_blocking_w25q32_internal.h" +#include "main.h" +/* USER CODE BEGIN 0 */ +/* USER CODE END 0 */ +SPI_Handle g_spiSampleHandle; +UART_Handle g_uart0; +/* USER CODE BEGIN 1 */ +/* USER CODE END 1 */ + +int main(void) +{ + /* USER CODE BEGIN 2 */ + /* USER CODE END 2 */ + W25Q32BlockingSampleProcessing(); + /* USER CODE BEGIN 3 */ + /* USER CODE END 3 */ + while (1) { + /* USER CODE BEGIN 4 */ + /* USER CODE END 4 */ + } + /* USER CODE BEGIN 5 */ + /* USER CODE END 5 */ + return BASE_STATUS_OK; +} + +/* USER CODE BEGIN 6 */ +/* USER CODE END 6 */ \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_blocking_w25q32_internal/init/main.h b/drivers_sample/spi/sample_spi_blocking_w25q32_internal/init/main.h new file mode 100644 index 000000000..4b520d365 --- /dev/null +++ b/drivers_sample/spi/sample_spi_blocking_w25q32_internal/init/main.h @@ -0,0 +1,50 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "spi.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define XTAL_DRV_LEVEL4 0x03U +#define XTAL_DRV_LEVEL3 0x02U +#define XTAL_DRV_LEVEL2 0x01U +#define XTAL_DRV_LEVEL1 0x00U + +extern SPI_Handle g_spiSampleHandle; +extern UART_Handle g_uart0; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_blocking_w25q32_internal/init/system_init.c b/drivers_sample/spi/sample_spi_blocking_w25q32_internal/init/system_init.c new file mode 100644 index 000000000..53603017f --- /dev/null +++ b/drivers_sample/spi/sample_spi_blocking_w25q32_internal/init/system_init.c @@ -0,0 +1,157 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" +#include "iocmg.h" + +#define UART0_BAND_RATE 115200 + +#define SPI_FREQ_SCR 2 +#define SPI_FREQ_CPSDVSR 10 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { /* CRG init */ + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void SPI_Init(void) +{ + HAL_CRG_IpEnableSet(SPI_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(SPI_BASE, CRG_PLL_NO_PREDV); + + g_spiSampleHandle.baseAddress = SPI; + + g_spiSampleHandle.mode = HAL_SPI_MASTER; /* spi master */ + g_spiSampleHandle.csMode = SPI_CHIP_SELECT_MODE_INTERNAL; + g_spiSampleHandle.xFerMode = HAL_XFER_MODE_BLOCKING; + g_spiSampleHandle.clkPolarity = HAL_SPI_CLKPOL_0; /* spi ploarity is 0 */ + g_spiSampleHandle.clkPhase = HAL_SPI_CLKPHA_1; + g_spiSampleHandle.endian = HAL_SPI_BIG_ENDIAN; + g_spiSampleHandle.frameFormat = HAL_SPI_MODE_MOTOROLA; /* motorola frame format */ + g_spiSampleHandle.dataWidth = SPI_DATA_WIDTH_8BIT; + g_spiSampleHandle.freqScr = SPI_FREQ_SCR; + g_spiSampleHandle.freqCpsdvsr = SPI_FREQ_CPSDVSR; + g_spiSampleHandle.waitEn = BASE_CFG_DISABLE; + g_spiSampleHandle.waitVal = 127; /* microwire wait time 127 */ + g_spiSampleHandle.rxBuff = NULL; + g_spiSampleHandle.txBuff = NULL; + g_spiSampleHandle.transferSize = 0; + g_spiSampleHandle.txCount = 0; /* transfer count */ + g_spiSampleHandle.rxCount = 0; + g_spiSampleHandle.state = HAL_SPI_STATE_RESET; + g_spiSampleHandle.rxIntSize = SPI_RX_INTERRUPT_SIZE_1; + g_spiSampleHandle.txIntSize = SPI_TX_INTERRUPT_SIZE_1; /* tx interrupt size */ + g_spiSampleHandle.rxDMABurstSize = SPI_RX_DMA_BURST_SIZE_1; + g_spiSampleHandle.txDMABurstSize = SPI_TX_DMA_BURST_SIZE_1; + HAL_SPI_Init(&g_spiSampleHandle); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); + + g_uart0.baseAddress = UART0; /* uart0 baseaaddress */ + + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; /* data length 8 */ + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; /* blocking mode */ + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + SYSCTRL0->SC_SYS_STAT.BIT.update_mode = 0; + SYSCTRL0->SC_SYS_STAT.BIT.update_mode_clear = 1; + HAL_IOCMG_SetPinAltFuncMode(IO6_AS_SSP0_CLK); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(IO6_AS_SSP0_CLK, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(IO6_AS_SSP0_CLK, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(IO6_AS_SSP0_CLK, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(IO6_AS_SSP0_CLK, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(IO3_AS_SSP0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(IO3_AS_SSP0_TXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(IO3_AS_SSP0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(IO3_AS_SSP0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(IO3_AS_SSP0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(IO4_AS_SSP0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(IO4_AS_SSP0_RXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(IO4_AS_SSP0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(IO4_AS_SSP0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(IO4_AS_SSP0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(IO2_AS_SSP0_CSN0); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(IO2_AS_SSP0_CSN0, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(IO2_AS_SSP0_CSN0, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(IO2_AS_SSP0_CSN0, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(IO2_AS_SSP0_CSN0, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(IO5_AS_SSP0_CSN1); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(IO5_AS_SSP0_CSN1, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(IO5_AS_SSP0_CSN1, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(IO5_AS_SSP0_CSN1, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(IO5_AS_SSP0_CSN1, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(IO52_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(IO52_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(IO52_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(IO52_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(IO52_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + /* UART RX recommend PULL_UP */ + HAL_IOCMG_SetPinAltFuncMode(IO53_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(IO53_AS_UART0_RXD, PULL_UP); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(IO53_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(IO53_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(IO53_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + SPI_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_blocking_w25q32_internal/readme.md b/drivers_sample/spi/sample_spi_blocking_w25q32_internal/readme.md new file mode 100644 index 000000000..76b7715d5 --- /dev/null +++ b/drivers_sample/spi/sample_spi_blocking_w25q32_internal/readme.md @@ -0,0 +1,20 @@ +# 对接flash芯片w25q32,通过SPI阻塞方式写入和读取w25q32芯片中的数据 +## 关键字: SPI, 阻塞, w25q32芯片 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、SPI控制器初始化和功能配置。SPI对接flash芯片w25q32,通过阻塞方式对w25q32芯片进行写入120个数据,之后从芯片中再读出120字节数据。 + +**【示例配置】** ++ 在"SystemInit()”接口中配置SPI时钟极性、时钟相位、帧格式等参数,需根据对接的芯片进行相关参数配置。 + ++ w25q32芯片扇区擦除:调用“SectorErase()”接口先对w25q32芯片进行擦写操作,内部调用接口“SPI_W25Q32_WriteEnable()”向w25q32发送写使能命令,之后发送擦写扇区命令。命令的发送都是调用“HAL_SPI_WriteBlocking()”接口。 + ++ 向w25q32芯片写数据:调用“WritePage()”接口进行数据写入,发送页写入命令和需要写入120个数据,调用“HAL_SPI_WriteBlocking()”接口。 + ++ 从w25q32芯片读数据:调用“ReadData()”接口进行读数据,发送读命令,调用“HAL_SPI_WriteReadBlocking()”接口从芯片读取120个数据。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后,串口打印写入的120个数据和读取的120个数据,如果写入和读取的数据是相同则打印data correct,否则打印data err。 + +**【注意事项】** ++ 使用此示例代码必须外接flash芯片w25q32。 diff --git a/drivers_sample/spi/sample_spi_blocking_w25q32_internal/src/sample_spi_blocking_w25q32_internal.c b/drivers_sample/spi/sample_spi_blocking_w25q32_internal/src/sample_spi_blocking_w25q32_internal.c new file mode 100644 index 000000000..1f682f268 --- /dev/null +++ b/drivers_sample/spi/sample_spi_blocking_w25q32_internal/src/sample_spi_blocking_w25q32_internal.c @@ -0,0 +1,224 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_spi_blocking_w25q32_internal.c + * @author MCU Driver Team + * @brief Sample for SPI Module Blocking. + * @details This sample is used to operate the HAL interface on the W25Q32 chip of the flash. + * Write data and read data to address 0 of W25Q32 + */ +#include "main.h" +#include "spi.h" +#include "debug.h" +#include "sample_spi_blocking_w25q32_internal.h" + +#define SPI_W25X_WRITE_ENABLE 0x06 +#define SPI_W25X_SECTOR_ERASE 0x20 +#define SPI_W25X_PAGE_PROGRAM 0x02 +#define SPI_W25X_READ_DATA 0x03 + +#define MAX_TIMEOUT_VAL 5000 + +static unsigned int g_flashAddr = 0; +static unsigned char g_writeBuf[120] = {0}; +static unsigned char g_recvBuf[120] = {0}; + +/** + * @brief w25q32 enable the write function. + * @param None. + * @retval BASE_StatusType:OK, ERROR. + */ +static BASE_StatusType SPI_W25Q32_WriteEnable(void) +{ + unsigned char temp = SPI_W25X_WRITE_ENABLE; /* Write enable command */ + BASE_StatusType ret; + ret = HAL_SPI_WriteBlocking(&g_spiSampleHandle, (unsigned char *)&temp, sizeof(temp), MAX_TIMEOUT_VAL); + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("enable error!\r\n"); + return BASE_STATUS_ERROR; + } + return BASE_STATUS_OK; +} + +/** + * @brief w25q32 sector erase function. + * @param sectorEraseAddr sector erase address. + * @retval BASE_StatusType:OK, ERROR. + */ +static BASE_StatusType SectorErase(unsigned int sectorEraseAddr) +{ + BASE_StatusType ret; + ret = SPI_W25Q32_WriteEnable(); + if (ret != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + BASE_FUNC_DELAY_MS(20); /* delay 20 ms */ + + unsigned char buffer[4] = {0}; + buffer[0] = SPI_W25X_SECTOR_ERASE; /* Sector erase command */ + buffer[1] = (sectorEraseAddr & 0xFF0000) >> 16; /* Shift right by 16 bits */ + buffer[2] = (sectorEraseAddr & 0xFF00) >> 8; /* Shift right by 8 bits, 2 array subscript */ + buffer[3] = (sectorEraseAddr & 0xFF); /* Lower 8 bits of the sector erase address, 3 array subscript */ + ret = HAL_SPI_WriteBlocking(&g_spiSampleHandle, buffer, sizeof(buffer), MAX_TIMEOUT_VAL); + if (ret != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + return BASE_STATUS_OK; +} + +/** + * @brief w25q32 single page write, maximum 256 bytes. + * @param writeBuf write data buffer. + * @param writeAddr write address. + * @param len data length. + * @retval BASE_StatusType:OK, ERROR. + */ +static BASE_StatusType WritePage(unsigned char *writeBuf, unsigned int writeAddr, unsigned int len) +{ + BASE_StatusType ret; + ret = SPI_W25Q32_WriteEnable(); /* enable the write */ + if (ret != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + BASE_FUNC_DELAY_MS(20); /* Delay 20ms */ + + unsigned char buffer[124] = {0}; /* transmit 124 bytes: 4-byte command and 120-byte data */ + + buffer[0] = SPI_W25X_PAGE_PROGRAM; /* Page Program command */ + buffer[1] = (writeAddr & 0xFF0000) >> 16; /* Shift right by 16 bits */ + buffer[2] = (writeAddr & 0xFF00) >> 8; /* Shift right by 8 bits, 2 array subscript */ + buffer[3] = (writeAddr & 0xFF); /* Lower 8 bits of the sector erase address, 3 array subscript */ + for (unsigned int count = 0; count < len; count++) { + buffer[count + 4] = writeBuf[count]; /* data is stored from array subscript 4 */ + } + ret = HAL_SPI_WriteBlocking(&g_spiSampleHandle, buffer, (len + 4), MAX_TIMEOUT_VAL); /* len + 4 is total size */ + if (ret != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + return BASE_STATUS_OK; +} + +/** + * @brief Read data in the address. + * @param recvBuf write data buffer. + * @param recvAddr write address. + * @param len data length. + * @retval BASE_StatusType:OK, ERROR. + */ +static BASE_StatusType ReadData(unsigned char *recvBuf, unsigned int recvAddr, unsigned int len) +{ + unsigned char buffer[124] = {0}; /* The array size is 124 bytes */ + BASE_StatusType ret; + buffer[0] = SPI_W25X_READ_DATA; /* Read data command */ + buffer[1] = (recvAddr & 0xFF0000) >> 16; /* Shift right by 16 bits */ + buffer[2] = (recvAddr & 0xFF00) >> 8; /* Shift right by 8 bits, 2 array subscript */ + buffer[3] = (recvAddr & 0xFF); /* Lower 8 bits of the sector erase address, 3 array subscript */ + + unsigned char readBuf[124] = {0}; + /* len + 4 is total size */ + ret = HAL_SPI_WriteReadBlocking(&g_spiSampleHandle, readBuf, (unsigned char *)buffer, (len + 4), MAX_TIMEOUT_VAL); + if (ret != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + for (unsigned int i = 0; i < len; i++) { + recvBuf[i] = readBuf[i + 4]; /* read valid data from array subscript 4 */ + } + return BASE_STATUS_OK; +} + +/** + * @brief Performs read data and write page on w25q32. + * @param None. + * @retval None. + */ +static void SPI_WritePageAndReadData(void) +{ + BASE_StatusType ret; + DBG_PRINTF("write data is : \r\n"); + unsigned int writeLen = 120; /* transfer 120 bytes of data */ + for (unsigned int i = 0; i < writeLen; i++) { + g_writeBuf[i] = i; + DBG_PRINTF("%d ", g_writeBuf[i]); + } + DBG_PRINTF("\r\n"); + ret = WritePage(g_writeBuf, g_flashAddr, writeLen); /* w25q32 single page write */ + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("write page failed!\r\n"); + } + + BASE_FUNC_DELAY_MS(5); /* Delay 5ms */ + + unsigned int recvLen = 120; /* 120 bytes of data needs to be received */ + for (unsigned int index = 0; index < recvLen; index++) { + g_recvBuf[index] = 0; + } + ret = ReadData(g_recvBuf, g_flashAddr, recvLen); /* Read data in the g_flashAddr address */ + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("read page failed!\r\n"); + } else { + DBG_PRINTF("read data is : \r\n"); + for (unsigned int i = 0; i < recvLen; i++) { + DBG_PRINTF("%d ", g_recvBuf[i]); /* print received Data */ + } + DBG_PRINTF("\r\n"); + } +} + +/** + * @brief Performs read and write operations on w25q32. + * @param None. + * @retval None. + */ +static void SPI_W25Q32_TEST(void) +{ + BASE_StatusType ret; + ret = SectorErase(g_flashAddr); /* w25q32 sector erase function */ + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("sector erase failed!\r\n"); + } + BASE_FUNC_DELAY_MS(500); /* Delay 500 ms */ + + SPI_WritePageAndReadData(); + + bool flag = true; + unsigned int recvLen = 120; + for (unsigned int i = 0; i < recvLen; i++) { + if (g_recvBuf[i] != g_writeBuf[i]) { /* compare the transmitted data with the received data */ + DBG_PRINTF("data err! \r\n"); + flag = false; + break; + } + } + if (flag) { + DBG_PRINTF("data correct \r\n"); + } + DBG_PRINTF("\r\n"); +} + +/** + * @brief Spi blocking sample w25q32 processing. + * @param None. + * @retval None. + */ +void W25Q32BlockingSampleProcessing(void) +{ + SystemInit(); + while (1) { + SPI_W25Q32_TEST(); + BASE_FUNC_DELAY_MS(1000); /* Delay 1000 ms */ + } +} diff --git a/drivers_sample/spi/sample_spi_dma_kta7953/inc/sample_spi_dma_kta7953.h b/drivers_sample/spi/sample_spi_dma_kta7953/inc/sample_spi_dma_kta7953.h new file mode 100644 index 000000000..073d0c1aa --- /dev/null +++ b/drivers_sample/spi/sample_spi_dma_kta7953/inc/sample_spi_dma_kta7953.h @@ -0,0 +1,28 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_spi_dma_kta7953.h + * @author MCU Driver Team + * @brief SPI module SPI module sample.. + * @details This file provides sample code for users to help use + * the functionalities of the SPI. + */ +#ifndef McuMagicTag_SAMPLE_SPI_DMA_KTA7953_H +#define McuMagicTag_SAMPLE_SPI_DMA_KTA7953_H + +void Kta7953DmaSampleProcessing(void); +#endif \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_dma_kta7953/init/main.c b/drivers_sample/spi/sample_spi_dma_kta7953/init/main.c new file mode 100644 index 000000000..7978172f9 --- /dev/null +++ b/drivers_sample/spi/sample_spi_dma_kta7953/init/main.c @@ -0,0 +1,37 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ +#include "feature.h" +#include "main.h" +#include "sample_spi_dma_kta7953.h" + +SPI_Handle g_spiSampleHandle; +UART_Handle g_uart0; + +DMA_Handle g_dmac; + +int main(void) +{ + Kta7953DmaSampleProcessing(); + while (1) { + } + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_dma_kta7953/init/main.h b/drivers_sample/spi/sample_spi_dma_kta7953/init/main.h new file mode 100644 index 000000000..e93d494b4 --- /dev/null +++ b/drivers_sample/spi/sample_spi_dma_kta7953/init/main.h @@ -0,0 +1,55 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "spi.h" +#include "crg.h" +#include "dma.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +extern SPI_Handle g_spiSampleHandle; + +extern UART_Handle g_uart0; + +extern DMA_Handle g_dmac; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +void TxSampleCallbackHandle(SPI_Handle *handle); +void RxSampleCallbackHandle(SPI_Handle *handle); +void TxRxSampleCallbackHandle(SPI_Handle *handle); +void ErrorSampleCallbackHandle(SPI_Handle *handle); +void SPICsCallback(SPI_Handle *handle); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_dma_kta7953/init/system_init.c b/drivers_sample/spi/sample_spi_dma_kta7953/init/system_init.c new file mode 100644 index 000000000..1e3c7ad30 --- /dev/null +++ b/drivers_sample/spi/sample_spi_dma_kta7953/init/system_init.c @@ -0,0 +1,256 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" + +#define UART0_BAND_RATE 115200 + +#define SPI_FREQ_SCR 2 +#define SPI_FREQ_CPSDVSR 10 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void DMA_Channel3Init(void *handle) +{ + DMA_ChannelParam dma_param; + dma_param.direction = DMA_PERIPH_TO_MEMORY_BY_DMAC; + dma_param.srcAddrInc = DMA_ADDR_UNALTERED; + dma_param.destAddrInc = DMA_ADDR_UNALTERED; + dma_param.srcPeriph = DMA_REQUEST_SPI_RX; + dma_param.destPeriph = DMA_REQUEST_MEM; + dma_param.srcWidth = DMA_TRANSWIDTH_BYTE; + dma_param.destWidth = DMA_TRANSWIDTH_BYTE; + dma_param.srcBurst = DMA_BURST_LENGTH_1; + dma_param.destBurst = DMA_BURST_LENGTH_1; + dma_param.pHandle = handle; + HAL_DMA_InitChannel(&g_dmac, &dma_param, 3); /* Channel is 3 */ +} + +static void DMA_Channel2Init(void *handle) +{ + DMA_ChannelParam dma_param; + dma_param.direction = DMA_MEMORY_TO_PERIPH_BY_DMAC; + dma_param.srcAddrInc = DMA_ADDR_UNALTERED; + dma_param.destAddrInc = DMA_ADDR_UNALTERED; + dma_param.srcPeriph = DMA_REQUEST_MEM; + dma_param.destPeriph = DMA_REQUEST_SPI_TX; + dma_param.srcWidth = DMA_TRANSWIDTH_BYTE; + dma_param.destWidth = DMA_TRANSWIDTH_BYTE; + dma_param.srcBurst = DMA_BURST_LENGTH_1; + dma_param.destBurst = DMA_BURST_LENGTH_1; + dma_param.pHandle = handle; + HAL_DMA_InitChannel(&g_dmac, &dma_param, 2); /* Channel is 2 */ +} + +static void DMA_Init(void) +{ + g_dmac.baseAddress = DMA; + g_dmac.srcByteOrder = DMA_BYTEORDER_SMALLENDIAN; + g_dmac.destByteOrder = DMA_BYTEORDER_SMALLENDIAN; + g_dmac.irqNumTc = IRQ_DMA_TC; + g_dmac.irqNumError = IRQ_DMA_ERR; + HAL_DMA_IRQService(&g_dmac); + IRQ_EnableN(IRQ_DMA_TC); + IRQ_EnableN(IRQ_DMA_ERR); + HAL_DMA_Init(&g_dmac); + + DMA_Channel3Init((void *)(&g_spiSampleHandle)); + DMA_Channel2Init((void *)(&g_spiSampleHandle)); +} + +__weak void TxSampleCallbackHandle(SPI_Handle *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN TxSampleCallbackHandle */ + /* USER CODE END TxSampleCallbackHandle */ +} + +__weak void RxSampleCallbackHandle(SPI_Handle *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN RxSampleCallbackHandle */ + /* USER CODE END RxSampleCallbackHandle */ +} + +__weak void TxRxSampleCallbackHandle(SPI_Handle *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN TxRxSampleCallbackHandle */ + /* USER CODE END TxRxSampleCallbackHandle */ +} + +__weak void ErrorSampleCallbackHandle(SPI_Handle *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN ErrorSampleCallbackHandle */ + /* USER CODE END ErrorSampleCallbackHandle */ +} + +__weak void SPICsCallback(SPI_Handle *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN SPICsCallback */ + /* USER CODE END SPICsCallback */ +} + +static void SPI_Init(void) +{ + HAL_CRG_IpEnableSet(SPI_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(SPI_BASE, CRG_PLL_NO_PREDV); + + g_spiSampleHandle.baseAddress = SPI; + g_spiSampleHandle.irqNum = IRQ_SPI; + + g_spiSampleHandle.mode = HAL_SPI_MASTER; + g_spiSampleHandle.csMode = SPI_CHIP_SELECT_MODE_INTERNAL; + g_spiSampleHandle.xFerMode = HAL_XFER_MODE_DMA; + g_spiSampleHandle.clkPolarity = 0; + g_spiSampleHandle.clkPhase = 0; + g_spiSampleHandle.endian = HAL_SPI_BIG_ENDIAN; + g_spiSampleHandle.frameFormat = HAL_SPI_MODE_MOTOROLA; + g_spiSampleHandle.dataWidth = SPI_DATA_WIDTH_16BIT; + g_spiSampleHandle.freqScr = SPI_FREQ_SCR; + g_spiSampleHandle.freqCpsdvsr = SPI_FREQ_CPSDVSR; + g_spiSampleHandle.waitVal = 127; /* Wait time is 127 clock */ + g_spiSampleHandle.rxBuff = NULL; + g_spiSampleHandle.txBuff = NULL; + g_spiSampleHandle.transferSize = 0; + g_spiSampleHandle.txCount = 0; + g_spiSampleHandle.rxCount = 0; + g_spiSampleHandle.state = HAL_SPI_STATE_RESET; + g_spiSampleHandle.rxIntSize = SPI_RX_INTERRUPT_SIZE_1; + g_spiSampleHandle.txIntSize = SPI_TX_INTERRUPT_SIZE_1; + g_spiSampleHandle.rxDMABurstSize = SPI_RX_DMA_BURST_SIZE_1; + g_spiSampleHandle.txDMABurstSize = SPI_TX_DMA_BURST_SIZE_1; + g_spiSampleHandle.dmaHandle = &g_dmac; + g_spiSampleHandle.txDmaCh = 2; /* Channel 2 */ + g_spiSampleHandle.rxDmaCh = 3; /* Channel 3 */ + + HAL_SPI_Init(&g_spiSampleHandle); + + HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_TX_COMPLETE_CB_ID, TxSampleCallbackHandle); + HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_RX_COMPLETE_CB_ID, RxSampleCallbackHandle); + HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_TX_RX_COMPLETE_CB_ID, TxRxSampleCallbackHandle); + HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_ERROR_CB_ID, ErrorSampleCallbackHandle); + HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_CS_CB_ID, SPICsCallback); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); + + g_uart0.baseAddress = UART0; + g_uart0.irqNum = IRQ_UART0; + + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + IOConfig_RegStruct *iconfig = IOCONFIG; + + iconfig->iocmg_22.BIT.func = 0x5; /* 0x5 is SPI_CLK */ + iconfig->iocmg_22.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_22.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_22.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_22.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_22.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_18.BIT.func = 0x5; /* 0x5 is SPI_CSN0 */ + iconfig->iocmg_18.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_18.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_18.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_18.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_18.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_21.BIT.func = 0x5; /* 0x5 is SPI_CSN1 */ + iconfig->iocmg_21.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_21.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_21.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_21.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_21.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_20.BIT.func = 0x5; /* 0x5 is SPI_RXD */ + iconfig->iocmg_20.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_20.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_20.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_20.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_20.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_19.BIT.func = 0x5; /* 0x5 is SPI_TXD */ + iconfig->iocmg_19.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_19.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_19.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_19.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_19.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ + iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ + iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + DMA_Init(); + SPI_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_dma_kta7953/readme.md b/drivers_sample/spi/sample_spi_dma_kta7953/readme.md new file mode 100644 index 000000000..18b334bd1 --- /dev/null +++ b/drivers_sample/spi/sample_spi_dma_kta7953/readme.md @@ -0,0 +1,20 @@ +# 对接ADC芯片kta7953,通过SPI中的DMA方式读取ADC各个通道采样值 +## 关键字: SPI, DMA, kta7953 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、SPI控制器初始化和功能配置。SPI对接ADC芯片kta7953,不断读取ADC芯片kta7953各通道(ch0-ch6)的采样值,以手动模式操作ADC芯片kta7953各个通道,通过DMA方式进行数据搬运。 + +**【示例配置】** ++ 在"SystemInit()”接口中配置SPI时钟极性、时钟相位、帧格式等参数和DMA通道相关参数,其中SPI参数配置需根据对接的芯片进行相关参数配置。 + ++ 定义数组,数组中存放以手动操作模式读取各个通道采样值的命令。 + ++ 采用“HAL_SPI_WriteReadDMA()”进行ch0-ch6通道采样。执行十次后调用“Kta7953BuffPrintf()”打印结果值。 + ++ 编写回调函数代码,使用SPI的DMA方式搬运完成会调用回调函数。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码通过串口打印的方式输出ADC芯片kta7953各通道的采样值,当每次DMA每次搬运完结果进入回调函数。 + +**【注意事项】** ++ 使用此示例代码必须外接ADC芯片kta7953。 \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_dma_kta7953/src/sample_spi_dma_kta7953.c b/drivers_sample/spi/sample_spi_dma_kta7953/src/sample_spi_dma_kta7953.c new file mode 100644 index 000000000..02e495806 --- /dev/null +++ b/drivers_sample/spi/sample_spi_dma_kta7953/src/sample_spi_dma_kta7953.c @@ -0,0 +1,164 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_spi_dma_kta7953.c + * @author MCU Driver Team + * @brief Sample for SPI Module DMA. + * @details This sample is connected to the ADC chip kta7953 to demonstrate how to operate the HAL interface + * in DMA mode in the SPI driver. + * This sample operates channels 0 to 6 of ADC chip kta7953 in manual mode. + * This sample outputs the sampling values of each channel of the ADC chip kta7953 through the serial port. + * To use this sample, connect the external ADC chip kta7953. + */ +#include "main.h" +#include "spi.h" +#include "debug.h" +#include "interrupt.h" +#include "sample_spi_dma_kta7953.h" + +#define USER_TIMEOUT 0x400 + +#define MANUAL_MODE_SET_CH0 0x1040 +#define MANUAL_MODE_SET_CH1 0x10C0 +#define MANUAL_MODE_SET_CH2 0x1140 +#define MANUAL_MODE_SET_CH3 0x11C0 +#define MANUAL_MODE_SET_CH4 0x1240 +#define MANUAL_MODE_SET_CH5 0x12C0 +#define MANUAL_MODE_SET_CH6 0x1340 + +static unsigned int g_txrxFlag = 0; + +static unsigned short g_tempRdata[10]; +static volatile unsigned short g_outCh = 0; +static volatile unsigned short g_outData = 0; + +/** + * @brief Spi dma sample kta7953 TxRx callback handle. + * @param handle Spi handle. + * @retval None. + */ +void TxRxSampleCallbackHandle(void *handle) +{ + BASE_FUNC_UNUSED(handle); + g_txrxFlag = 1; + DBG_PRINTF("TxRxCpltCallbackHandle\r\n"); +} + +/** + * @brief Spi dma sample kta7953 Tx callback handle. + * @param handle Spi handle. + * @retval None. + */ +void TxSampleCallbackHandle(void *handle) +{ + BASE_FUNC_UNUSED(handle); + g_txrxFlag = 1; + DBG_PRINTF("txCpltCallbackHandle\r\n"); +} + +/** + * @brief Spi dma sample kta7953 Rx callback handle. + * @param handle Spi handle. + * @retval None. + */ +void RxSampleCallbackHandle(void *handle) +{ + BASE_FUNC_UNUSED(handle); + g_txrxFlag = 1; + DBG_PRINTF("RxCpltCallbackHandle\r\n"); +} + +/** + * @brief Spi dma sample kta7953 error callback handle. + * @param handle Spi handle. + * @retval None. + */ +void ErrorSampleCallbackHandle(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("ErrorCallbackHandle\r\n"); +} + +/** + * @brief Spi dma sample kta7953 buffer printf. + * @param None. + * @retval None. + */ +static void Kta7953BuffPrintf(void) +{ + for (int i = 0; i < 10; i++) { /* Print 10 groups of test data. */ + g_outCh = g_tempRdata[i] >> 12; /* Shift right by 12 bits to obtain the lower four bits. */ + g_outData = g_tempRdata[i] & 0x0FFF; /* Mask 0x0FFF */ + DBG_PRINTF("[%d] = CH:%d = %d\r\n", i, g_outCh, g_outData); + } +} + +/** + * @brief Spi dma sample kta7953 processing. + * @param None. + * @retval None. + */ +void Kta7953DmaSampleProcessing(void) +{ + static unsigned short cnt = 0; + unsigned short tempWdata[] = { + MANUAL_MODE_SET_CH0, + MANUAL_MODE_SET_CH1, + MANUAL_MODE_SET_CH2, + MANUAL_MODE_SET_CH3, + MANUAL_MODE_SET_CH4, + MANUAL_MODE_SET_CH5, + MANUAL_MODE_SET_CH6, + 3, + 0, + 0 + }; + unsigned short temp = MANUAL_MODE_SET_CH0; + + SystemInit(); + HAL_SPI_WriteDMA(&g_spiSampleHandle, (unsigned char *)&temp, sizeof(temp)); + while (1) { + if (g_txrxFlag > 0) { + g_txrxFlag = 0; + if (cnt >= 10) { /* Test 10 times in total */ + cnt = 0; + g_txrxFlag = 1; + Kta7953BuffPrintf(); + } + + if (cnt > 7 && cnt < 10) { /* 7 to 10 */ + HAL_SPI_ReadDMA(&g_spiSampleHandle, (unsigned char *)&g_tempRdata[cnt], sizeof(g_tempRdata[cnt])); + cnt++; + } + + if (cnt == 7) { /* 7th */ + HAL_SPI_WriteDMA(&g_spiSampleHandle, (unsigned char *)&tempWdata[cnt], sizeof(tempWdata[cnt])); + g_tempRdata[cnt] = cnt; + cnt++; + } + + if (cnt < 7) { /* First 7 */ + HAL_SPI_WriteReadDMA(&g_spiSampleHandle, + (unsigned char *)&g_tempRdata[cnt], + (unsigned char *)&tempWdata[cnt], + sizeof(tempWdata[cnt])); + cnt++; + } + } + BASE_FUNC_DELAY_MS(300); /* Delay 300ms */ + } +} diff --git a/drivers_sample/spi/sample_spi_dma_w25q32/inc/sample_spi_dma_w25q32.h b/drivers_sample/spi/sample_spi_dma_w25q32/inc/sample_spi_dma_w25q32.h new file mode 100644 index 000000000..2bbf3e483 --- /dev/null +++ b/drivers_sample/spi/sample_spi_dma_w25q32/inc/sample_spi_dma_w25q32.h @@ -0,0 +1,28 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_spi_dma_w25q32.h + * @author MCU Driver Team + * @brief SPI module sample. + * @details This file provides sample code for users to help use + * the functionalities of the SPI. + */ +#ifndef SAMPLE_SPI_DMA_W25Q32_H +#define SAMPLE_SPI_DMA_W25Q32_H + +void W25Q32DmaSampleProcessing(void); +#endif \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_dma_w25q32/init/main.c b/drivers_sample/spi/sample_spi_dma_w25q32/init/main.c new file mode 100644 index 000000000..60492effb --- /dev/null +++ b/drivers_sample/spi/sample_spi_dma_w25q32/init/main.c @@ -0,0 +1,51 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ + +#include "typedefs.h" +#include "feature.h" +#include "main.h" +/* USER CODE BEGIN 0 */ +/* USER CODE END 0 */ +UART_Handle g_uart0; +SPI_Handle g_spiSampleHandle; +DMA_Handle g_dmac; +/* USER CODE BEGIN 1 */ +/* USER CODE END 1 */ + +int main(void) +{ + /* USER CODE BEGIN 2 */ + /* USER CODE END 2 */ + W25Q32DmaSampleProcessing(); + /* USER CODE BEGIN 3 */ + /* USER CODE END 3 */ + while (1) { + /* USER CODE BEGIN 4 */ + /* USER CODE END 4 */ + } + /* USER CODE BEGIN 5 */ + /* USER CODE END 5 */ + return BASE_STATUS_OK; +} + +/* USER CODE BEGIN 6 */ +/* USER CODE END 6 */ \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_dma_w25q32/init/main.h b/drivers_sample/spi/sample_spi_dma_w25q32/init/main.h new file mode 100644 index 000000000..0159263ea --- /dev/null +++ b/drivers_sample/spi/sample_spi_dma_w25q32/init/main.h @@ -0,0 +1,59 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "spi.h" +#include "crg.h" +#include "dma.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define XTAL_DRV_LEVEL4 0x03U +#define XTAL_DRV_LEVEL3 0x02U +#define XTAL_DRV_LEVEL2 0x01U +#define XTAL_DRV_LEVEL1 0x00U + +extern UART_Handle g_uart0; +extern SPI_Handle g_spiSampleHandle; + +extern DMA_Handle g_dmac; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +void TxSampleCallbackHandle(void *handle); +void RxSampleCallbackHandle(void *handle); +void TxRxSampleCallbackHandle(void *handle); +void ErrorSampleCallbackHandle(void *handle); +void SPICsCallback(void *handle); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_dma_w25q32/init/system_init.c b/drivers_sample/spi/sample_spi_dma_w25q32/init/system_init.c new file mode 100644 index 000000000..da38c36f0 --- /dev/null +++ b/drivers_sample/spi/sample_spi_dma_w25q32/init/system_init.c @@ -0,0 +1,250 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" +#include "iocmg_ip.h" + +#define UART0_BAND_RATE 115200 + +#define SPI1_FREQ_SCR 2 +#define SPI1_FREQ_CPSDVSR 10 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; /* crg baseaddress */ + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_1; + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { /* CRG init */ + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void DMA_Channel0Init(void *handle) +{ + DMA_ChannelParam dma_param; + dma_param.direction = DMA_PERIPH_TO_MEMORY_BY_DMAC; /* periph to memory */ + dma_param.srcAddrInc = DMA_ADDR_UNALTERED; + dma_param.destAddrInc = DMA_ADDR_INCREASE; + dma_param.srcPeriph = DMA_REQUEST_SPI1_RX; /* srcperiph is spi1_rx */ + dma_param.destPeriph = DMA_REQUEST_MEM; + dma_param.srcWidth = DMA_TRANSWIDTH_BYTE; + dma_param.destWidth = DMA_TRANSWIDTH_BYTE; + dma_param.srcBurst = DMA_BURST_LENGTH_1; + dma_param.destBurst = DMA_BURST_LENGTH_1; /* destperiph burst size */ + dma_param.pHandle = handle; + HAL_DMA_InitChannel(&g_dmac, &dma_param, DMA_CHANNEL_ZERO); +} + +static void DMA_Channel1Init(void *handle) +{ + DMA_ChannelParam dma_param; + dma_param.direction = DMA_MEMORY_TO_PERIPH_BY_DMAC; /* memory to periph */ + dma_param.srcAddrInc = DMA_ADDR_INCREASE; + dma_param.destAddrInc = DMA_ADDR_UNALTERED; + dma_param.srcPeriph = DMA_REQUEST_MEM; + dma_param.destPeriph = DMA_REQUEST_SPI1_TX; /* srcperiph is spi1_tx */ + dma_param.srcWidth = DMA_TRANSWIDTH_BYTE; + dma_param.destWidth = DMA_TRANSWIDTH_BYTE; + dma_param.srcBurst = DMA_BURST_LENGTH_1; + dma_param.destBurst = DMA_BURST_LENGTH_1; /* destperiph burst size */ + dma_param.pHandle = handle; + HAL_DMA_InitChannel(&g_dmac, &dma_param, DMA_CHANNEL_ONE); +} + +static void DMA_Init(void) +{ + HAL_CRG_IpEnableSet(DMA_BASE, IP_CLK_ENABLE); + g_dmac.baseAddress = DMA; /* dma baseaddress */ + IRQ_Register(IRQ_DMA_TC, HAL_DMA_IrqHandlerTc, &g_dmac); + IRQ_Register(IRQ_DMA_ERR, HAL_DMA_IrqHandlerError, &g_dmac); + IRQ_EnableN(IRQ_DMA_TC); + IRQ_EnableN(IRQ_DMA_ERR); + HAL_DMA_Init(&g_dmac); /* dma init */ + DMA_Channel0Init((void *)(&g_spiSampleHandle)); + HAL_DMA_SetChannelPriorityEx(&g_dmac, DMA_CHANNEL_ZERO, DMA_PRIORITY_HIGHEST); + DMA_Channel1Init((void *)(&g_spiSampleHandle)); /* dma channel 1 init */ + HAL_DMA_SetChannelPriorityEx(&g_dmac, DMA_CHANNEL_ONE, DMA_PRIORITY_HIGHEST); +} + +__weak void TxSampleCallbackHandle(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN TxSampleCallbackHandle */ + /* USER CODE END TxSampleCallbackHandle */ +} + +__weak void RxSampleCallbackHandle(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN RxSampleCallbackHandle */ + /* USER CODE END RxSampleCallbackHandle */ +} + +__weak void TxRxSampleCallbackHandle(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN TxRxSampleCallbackHandle */ + /* USER CODE END TxRxSampleCallbackHandle */ +} + +__weak void ErrorSampleCallbackHandle(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN ErrorSampleCallbackHandle */ + /* USER CODE END ErrorSampleCallbackHandle */ +} + +__weak void SPICsCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN SPICsCallback */ + /* USER CODE END SPICsCallback */ +} + +static void SPI1_Init(void) +{ + HAL_CRG_IpEnableSet(SPI1_BASE, IP_CLK_ENABLE); + + g_spiSampleHandle.baseAddress = SPI1; + + g_spiSampleHandle.mode = HAL_SPI_MASTER; /* spi master */ + g_spiSampleHandle.csMode = SPI_CHIP_SELECT_MODE_CALLBACK; + g_spiSampleHandle.xFerMode = HAL_XFER_MODE_DMA; + g_spiSampleHandle.clkPolarity = HAL_SPI_CLKPOL_0; /* spi ploarity is 0 */ + g_spiSampleHandle.clkPhase = HAL_SPI_CLKPHA_1; + g_spiSampleHandle.endian = HAL_SPI_BIG_ENDIAN; + g_spiSampleHandle.frameFormat = HAL_SPI_MODE_MOTOROLA; /* motorola frame format */ + g_spiSampleHandle.dataWidth = SPI_DATA_WIDTH_8BIT; + g_spiSampleHandle.freqScr = SPI1_FREQ_SCR; + g_spiSampleHandle.freqCpsdvsr = SPI1_FREQ_CPSDVSR; + g_spiSampleHandle.waitEn = BASE_CFG_DISABLE; + g_spiSampleHandle.waitVal = 127; /* mircowire wait time 127 */ + g_spiSampleHandle.rxBuff = NULL; + g_spiSampleHandle.txBuff = NULL; + g_spiSampleHandle.transferSize = 0; + g_spiSampleHandle.txCount = 0; /* transfer count */ + g_spiSampleHandle.rxCount = 0; + g_spiSampleHandle.state = HAL_SPI_STATE_RESET; + g_spiSampleHandle.rxIntSize = SPI_RX_INTERRUPT_SIZE_1; + g_spiSampleHandle.txIntSize = SPI_TX_INTERRUPT_SIZE_1; /* tx interrupt size */ + g_spiSampleHandle.rxDMABurstSize = SPI_RX_DMA_BURST_SIZE_1; + g_spiSampleHandle.txDMABurstSize = SPI_TX_DMA_BURST_SIZE_1; + g_spiSampleHandle.dmaHandle = &g_dmac; + g_spiSampleHandle.txDmaCh = DMA_CHANNEL_ONE; + g_spiSampleHandle.rxDmaCh = DMA_CHANNEL_ZERO; /* dma rx channel is 0 */ + HAL_SPI_Init(&g_spiSampleHandle); + + /* spi register callback */ + HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_TX_COMPLETE_CB_ID, TxSampleCallbackHandle); + HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_RX_COMPLETE_CB_ID, RxSampleCallbackHandle); + HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_TX_RX_COMPLETE_CB_ID, TxRxSampleCallbackHandle); + HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_ERROR_CB_ID, ErrorSampleCallbackHandle); + HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_CS_CB_ID, SPICsCallback); + HAL_SPI_ChipSelectChannelSet(&g_spiSampleHandle, SPI_CHIP_SELECT_CHANNEL_1); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + + g_uart0.baseAddress = UART0; /* uart0 baseaaddress */ + + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; /* data length 8 */ + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; /* blocking mode */ + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; /* fifo size 8 */ + g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO4_6_AS_SPI1_CLK); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO4_6_AS_SPI1_CLK, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO4_6_AS_SPI1_CLK, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO4_6_AS_SPI1_CLK, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO4_6_AS_SPI1_CLK, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO1_4_AS_SPI1_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO1_4_AS_SPI1_RXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO1_4_AS_SPI1_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO1_4_AS_SPI1_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO1_4_AS_SPI1_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO3_0_AS_SPI1_CSN1); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO3_0_AS_SPI1_CSN1, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO3_0_AS_SPI1_CSN1, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO3_0_AS_SPI1_CSN1, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO3_0_AS_SPI1_CSN1, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO1_3_AS_SPI1_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO1_3_AS_SPI1_TXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO1_3_AS_SPI1_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO1_3_AS_SPI1_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO1_3_AS_SPI1_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO4_5_AS_SPI1_CSN0); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO4_5_AS_SPI1_CSN0, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO4_5_AS_SPI1_CSN0, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO4_5_AS_SPI1_CSN0, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO4_5_AS_SPI1_CSN0, DRIVER_RATE_2); /* Output signal edge fast/slow */ +} + +void SystemInit(void) +{ + IOConfig(); + DMA_Init(); + UART0_Init(); + SPI1_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_dma_w25q32/readme.md b/drivers_sample/spi/sample_spi_dma_w25q32/readme.md new file mode 100644 index 000000000..058bb69dd --- /dev/null +++ b/drivers_sample/spi/sample_spi_dma_w25q32/readme.md @@ -0,0 +1,20 @@ +# 对接flash芯片w25q32,通过SPI的DMA方式写入和读取w25q32芯片中的数据 +## 关键字: SPI, DMA, w25q32芯片 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、SPI控制器初始化和功能配置。SPI对接flash芯片w25q32,对w25q32芯片进行写入120个数据,之后从芯片中再读出120字节数据,数据的搬运由DMA方式完成。 + +**【示例配置】** ++ 在"SystemInit()”接口中配置SPI时钟极性、时钟相位、帧格式等参数和DMA通道相关参数,需根据对接的芯片进行相关参数配置。 + ++ w25q32芯片扇区擦除:调用“SectorErase()”接口先对w25q32芯片进行擦写操作,内部调用接口“SPI_W25Q32_WriteEnable()”向w25q32发送写使能命令,之后发送擦写扇区命令。命令的发送都是调用“HAL_SPI_WriteDMA()”接口。 + ++ 向w25q32芯片写数据:调用“WritePage()”接口进行数据写入,发送页写入命令和需要写入120个数据,调用“HAL_SPI_WriteDMA()”接口。 + ++ 从w25q32芯片读数据:调用“ReadData()”接口进行读数据,发送读命令,调用“HAL_SPI_WriteReadDMA()”接口从芯片读取120个数据。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后。当每次DMA搬运完成会进入回调函数打印log,串口打印写入的120个数据和读取的120个数据,如果写入和读取的数据是相同则打印data correct,否则打印data err。 + +**【注意事项】** ++ 使用此示例代码必须外接flash芯片w25q32。 \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_dma_w25q32/src/sample_spi_dma_w25q32.c b/drivers_sample/spi/sample_spi_dma_w25q32/src/sample_spi_dma_w25q32.c new file mode 100644 index 000000000..fbf2c1e16 --- /dev/null +++ b/drivers_sample/spi/sample_spi_dma_w25q32/src/sample_spi_dma_w25q32.c @@ -0,0 +1,288 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_spi_dma_w25q32.c + * @author MCU Driver Team + * @brief Sample for SPI Module DMA. + * @details This sample is used to operate the HAL interface on the W25Q32 chip of the flash. + * Write data and read data to address 0 of W25Q32 + */ + +#include "main.h" +#include "spi.h" +#include "debug.h" +#include "sample_spi_dma_w25q32.h" + +#define SPI_W25X_WRITE_ENABLE 0x06 +#define SPI_W25X_SECTOR_ERASE 0x20 +#define SPI_W25X_PAGE_PROGRAM 0x02 +#define SPI_W25X_READ_DATA 0x03 + +static unsigned int g_flashAddr = 0; +static unsigned char g_writeBuf[120] = {0}; +static unsigned char g_recvBuf[120] = {0}; + +/** + * @brief spi chip select callback function. + * @param handle SPI handle. + * @retval None + */ +void SPICsCallback(void *handle) +{ + SPI_Handle *spiHandle = (SPI_Handle *)handle; + /* USER CODE BEGIN SPICsCallback */ + if (g_spiSampleHandle.csCtrl == SPI_CHIP_SELECT) { + HAL_SPI_SetChipConfigSelectEx(spiHandle, HAL_SPI_CHIP_CONFIG_SOFR_UNSET); + } else { + HAL_SPI_SetChipConfigSelectEx(spiHandle, HAL_SPI_CHIP_CONFIG_SOFR_SET); + } + /* USER CODE END SPICsCallback */ +} + + +/** + * @brief Spi dma sample w25q32 TxRx callback handle. + * @param handle SPI handle. + * @retval None. + */ +void TxRxSampleCallbackHandle(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("TxRxCpltCallbackHandle\r\n"); +} + +/** + * @brief Spi dma sample w25q32 Tx callback handle. + * @param handle SPI handle. + * @retval None. + */ +void TxSampleCallbackHandle(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("txCpltCallbackHandle\r\n"); +} + +/** + * @brief Spi dma sample w25q32 Rx callback handle. + * @param handle SPI handle. + * @retval None. + */ +void RxSampleCallbackHandle(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("RxCpltCallbackHandle\r\n"); +} + +/** + * @brief Spi dma sample w25q32 Error callback handle. + * @param handle SPI handle. + * @retval None. + */ +void ErrorSampleCallbackHandle(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("ErrorCallbackHandle\r\n"); +} + +/** + * @brief w25q32 enable the write function. + * @param None. + * @retval BASE_StatusType:OK, ERROR. + */ +static BASE_StatusType SPI_W25Q32_WriteEnable(void) +{ + unsigned char temp = SPI_W25X_WRITE_ENABLE; /* Write enable command */ + BASE_StatusType ret; + ret = HAL_SPI_WriteDMA(&g_spiSampleHandle, (unsigned char *)&temp, sizeof(temp)); + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("enable error!\r\n"); + return BASE_STATUS_ERROR; + } + return BASE_STATUS_OK; +} + +/** + * @brief w25q32 sector erase function. + * @param sectorEraseAddr sector erase address. + * @retval BASE_StatusType:OK, ERROR. + */ +static BASE_StatusType SectorErase(unsigned int sectorEraseAddr) +{ + BASE_StatusType ret; + ret = SPI_W25Q32_WriteEnable(); + if (ret != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + BASE_FUNC_DELAY_MS(20); /* delay 20 ms */ + + unsigned char buffer[4] = {0}; + buffer[0] = SPI_W25X_SECTOR_ERASE; /* Sector erase command */ + buffer[1] = (sectorEraseAddr & 0xFF0000) >> 16; /* Shift right by 16 bits */ + buffer[2] = (sectorEraseAddr & 0xFF00) >> 8; /* Shift right by 8 bits, 2 array subscript */ + buffer[3] = (sectorEraseAddr & 0xFF); /* Lower 8 bits of the sector erase address, 3 array subscript */ + ret = HAL_SPI_WriteDMA(&g_spiSampleHandle, buffer, sizeof(buffer)); + if (ret != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + return BASE_STATUS_OK; +} + +/** + * @brief w25q32 single page write, maximum 256 bytes. + * @param writeBuf write data buffer. + * @param writeAddr write address. + * @param len data length. + * @retval BASE_StatusType:OK, ERROR. + */ +static BASE_StatusType WritePage(unsigned char *writeBuf, unsigned int writeAddr, unsigned int len) +{ + BASE_StatusType ret; + ret = SPI_W25Q32_WriteEnable(); /* enable the write */ + if (ret != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + BASE_FUNC_DELAY_MS(20); /* Delay 20 ms */ + + unsigned char buffer[124] = {0}; /* transmit 124 bytes: 4-byte command and 120-byte data */ + + buffer[0] = SPI_W25X_PAGE_PROGRAM; /* Page Program command */ + buffer[1] = (writeAddr & 0xFF0000) >> 16; /* Shift right by 16 bits */ + buffer[2] = (writeAddr & 0xFF00) >> 8; /* Shift right by 8 bits, 2 array subscript */ + buffer[3] = (writeAddr & 0xFF); /* Lower 8 bits of the sector erase address, 3 array subscript */ + for (unsigned int count = 0; count < len; count++) { + buffer[count + 4] = writeBuf[count]; /* data is stored from array subscript 4 */ + } + ret = HAL_SPI_WriteDMA(&g_spiSampleHandle, buffer, (len + 4)); /* len + 4 is total size */ + BASE_FUNC_DELAY_MS(2000); /* delay 2000 ms, wait until the DMA complete the data transfer. */ + if (ret != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + return BASE_STATUS_OK; +} + +/** + * @brief Read data in the address. + * @param recvBuf write data buffer. + * @param recvAddr write address. + * @param len data length. + * @retval BASE_StatusType:OK, ERROR. + */ +static BASE_StatusType ReadData(unsigned char *recvBuf, unsigned int recvAddr, unsigned int len) +{ + unsigned char buffer[124] = {0}; /* The array size is 124 bytes */ + BASE_StatusType ret; + buffer[0] = SPI_W25X_READ_DATA; /* Read data command */ + buffer[1] = (recvAddr & 0xFF0000) >> 16; /* Shift right by 16 bits */ + buffer[2] = (recvAddr & 0xFF00) >> 8; /* Shift right by 8 bits, 2 array subscript */ + buffer[3] = (recvAddr & 0xFF); /* Lower 8 bits of the sector erase address, 3 array subscript */ + + unsigned char readBuf[124] = {0}; + /* len + 4 is total size */ + ret = HAL_SPI_WriteReadDMA(&g_spiSampleHandle, readBuf, (unsigned char *)buffer, (len + 4)); + if (ret != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + BASE_FUNC_DELAY_MS(2000); /* delay 2000 ms, wait until the DMA complete the data transfer. */ + for (unsigned int i = 0; i < len; i++) { + recvBuf[i] = readBuf[i + 4]; /* read valid data from array subscript 4 */ + } + return BASE_STATUS_OK; +} + +/** + * @brief Performs read data and write page on w25q32. + * @param None. + * @retval None. + */ +static void SPI_WritePageAndReadData(void) +{ + BASE_StatusType ret; + DBG_PRINTF("write data is : \r\n"); + unsigned int writeLen = 120; /* transfer 120 bytes of data */ + for (unsigned int i = 0; i < writeLen; i++) { + g_writeBuf[i] = i; + DBG_PRINTF("%d ", g_writeBuf[i]); + } + DBG_PRINTF("\r\n"); + ret = WritePage(g_writeBuf, g_flashAddr, writeLen); /* w25q32 single page write */ + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("write page failed!\r\n"); + } + + BASE_FUNC_DELAY_MS(5); /* Delay 5ms */ + + unsigned int recvLen = 120; /* 120 bytes of data needs to be received */ + for (unsigned int index = 0; index < recvLen; index++) { + g_recvBuf[index] = 0; + } + ret = ReadData(g_recvBuf, g_flashAddr, recvLen); /* Read data in the g_flashAddr address */ + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("read page failed!\r\n"); + } else { + DBG_PRINTF("read data is : \r\n"); + for (unsigned int i = 0; i < recvLen; i++) { + DBG_PRINTF("%d ", g_recvBuf[i]); /* print received Data */ + } + DBG_PRINTF("\r\n"); + } +} + +/** + * @brief Performs read and write operations on w25q32. + * @param None. + * @retval None. + */ +static void SPI_W25Q32_TEST(void) +{ + BASE_StatusType ret; + ret = SectorErase(g_flashAddr); /* w25q32 sector erase function */ + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("sector erase failed!\r\n"); + } + BASE_FUNC_DELAY_MS(500); /* Delay 500 ms */ + + SPI_WritePageAndReadData(); + + bool flag = true; + unsigned int recvLen = 120; + for (unsigned int i = 0; i < recvLen; i++) { + if (g_recvBuf[i] != g_writeBuf[i]) { /* compare the transmitted data with the received data */ + DBG_PRINTF("data err! \r\n"); + flag = false; + break; + } + } + if (flag) { + DBG_PRINTF("data correct \r\n"); + } + DBG_PRINTF("\r\n"); +} + +/** + * @brief Spi dma sample w25q32 processing. + * @param None. + * @retval None. + */ +void W25Q32DmaSampleProcessing(void) +{ + SystemInit(); + HAL_SPI_SetChipConfigSelectEx(&g_spiSampleHandle, HAL_SPI_CHIP_CONFIG_SOFR_SET); + while (1) { + SPI_W25Q32_TEST(); + BASE_FUNC_DELAY_MS(2000); /* Delay 2000 ms */ + } +} diff --git a/drivers_sample/spi/sample_spi_dma_w25q32_internal/inc/sample_spi_dma_w25q32_internal.h b/drivers_sample/spi/sample_spi_dma_w25q32_internal/inc/sample_spi_dma_w25q32_internal.h new file mode 100644 index 000000000..3f37aadf6 --- /dev/null +++ b/drivers_sample/spi/sample_spi_dma_w25q32_internal/inc/sample_spi_dma_w25q32_internal.h @@ -0,0 +1,28 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_spi_dma_w25q32_internal.h + * @author MCU Driver Team + * @brief SPI module sample. + * @details This file provides sample code for users to help use + * the functionalities of the SPI. + */ +#ifndef SAMPLE_SPI_DMA_W25Q32_INTERNAL_H +#define SAMPLE_SPI_DMA_W25Q32_INTERNAL_H + +void W25Q32DmaSampleProcessing(void); +#endif \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_dma_w25q32_internal/init/main.c b/drivers_sample/spi/sample_spi_dma_w25q32_internal/init/main.c new file mode 100644 index 000000000..65d342632 --- /dev/null +++ b/drivers_sample/spi/sample_spi_dma_w25q32_internal/init/main.c @@ -0,0 +1,52 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ + +#include "typedefs.h" +#include "feature.h" +#include "sample_spi_dma_w25q32_internal.h" +#include "main.h" +/* USER CODE BEGIN 0 */ +/* USER CODE END 0 */ +SPI_Handle g_spiSampleHandle; +UART_Handle g_uart0; +DMA_Handle g_dmac; +/* USER CODE BEGIN 1 */ +/* USER CODE END 1 */ + +int main(void) +{ + /* USER CODE BEGIN 2 */ + /* USER CODE END 2 */ + W25Q32DmaSampleProcessing(); + /* USER CODE BEGIN 3 */ + /* USER CODE END 3 */ + while (1) { + /* USER CODE BEGIN 4 */ + /* USER CODE END 4 */ + } + /* USER CODE BEGIN 5 */ + /* USER CODE END 5 */ + return BASE_STATUS_OK; +} + +/* USER CODE BEGIN 6 */ +/* USER CODE END 6 */ \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_dma_w25q32_internal/init/main.h b/drivers_sample/spi/sample_spi_dma_w25q32_internal/init/main.h new file mode 100644 index 000000000..ad884564e --- /dev/null +++ b/drivers_sample/spi/sample_spi_dma_w25q32_internal/init/main.h @@ -0,0 +1,59 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "spi.h" +#include "crg.h" +#include "dma.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define XTAL_DRV_LEVEL4 0x03U +#define XTAL_DRV_LEVEL3 0x02U +#define XTAL_DRV_LEVEL2 0x01U +#define XTAL_DRV_LEVEL1 0x00U + +extern SPI_Handle g_spiSampleHandle; +extern UART_Handle g_uart0; + +extern DMA_Handle g_dmac; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +void TxSampleCallbackHandle(void *handle); +void RxSampleCallbackHandle(void *handle); +void TxRxSampleCallbackHandle(void *handle); +void ErrorSampleCallbackHandle(void *handle); +void SPICsCallback(void *handle); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_dma_w25q32_internal/init/system_init.c b/drivers_sample/spi/sample_spi_dma_w25q32_internal/init/system_init.c new file mode 100644 index 000000000..dde023764 --- /dev/null +++ b/drivers_sample/spi/sample_spi_dma_w25q32_internal/init/system_init.c @@ -0,0 +1,250 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" +#include "iocmg.h" + +#define UART0_BAND_RATE 115200 + +#define SPI_FREQ_SCR 2 +#define SPI_FREQ_CPSDVSR 10 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { /* CRG init */ + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void DMA_Channel1Init(void *handle) +{ + DMA_ChannelParam dma_param; + dma_param.direction = DMA_PERIPH_TO_MEMORY_BY_DMAC; /* periph to memory */ + dma_param.srcAddrInc = DMA_ADDR_UNALTERED; + dma_param.destAddrInc = DMA_ADDR_INCREASE; + dma_param.srcPeriph = DMA_REQUEST_SPI_RX; /* srcperiph is spi1_rx */ + dma_param.destPeriph = DMA_REQUEST_MEM; + dma_param.srcWidth = DMA_TRANSWIDTH_BYTE; + dma_param.destWidth = DMA_TRANSWIDTH_BYTE; + dma_param.srcBurst = DMA_BURST_LENGTH_1; + dma_param.destBurst = DMA_BURST_LENGTH_1; /* destperiph burst size */ + dma_param.pHandle = handle; + HAL_DMA_InitChannel(&g_dmac, &dma_param, DMA_CHANNEL_ONE); +} + +static void DMA_Channel0Init(void *handle) +{ + DMA_ChannelParam dma_param; + dma_param.direction = DMA_MEMORY_TO_PERIPH_BY_DMAC; /* memory to periph */ + dma_param.srcAddrInc = DMA_ADDR_INCREASE; + dma_param.destAddrInc = DMA_ADDR_UNALTERED; + dma_param.srcPeriph = DMA_REQUEST_MEM; + dma_param.destPeriph = DMA_REQUEST_SPI_TX; /* srcperiph is spi1_tx */ + dma_param.srcWidth = DMA_TRANSWIDTH_BYTE; + dma_param.destWidth = DMA_TRANSWIDTH_BYTE; + dma_param.srcBurst = DMA_BURST_LENGTH_1; + dma_param.destBurst = DMA_BURST_LENGTH_1; /* destperiph burst size */ + dma_param.pHandle = handle; + HAL_DMA_InitChannel(&g_dmac, &dma_param, DMA_CHANNEL_ZERO); +} + +static void DMA_Init(void) +{ + HAL_CRG_IpEnableSet(DMA_BASE, IP_CLK_ENABLE); + g_dmac.baseAddress = DMA; /* dma baseaddress */ + g_dmac.handleEx.srcByteOrder = DMA_BYTEORDER_SMALLENDIAN; + g_dmac.handleEx.destByteOrder = DMA_BYTEORDER_SMALLENDIAN; + IRQ_Register(IRQ_DMA_TC, HAL_DMA_IrqHandlerTc, &g_dmac); + IRQ_Register(IRQ_DMA_ERR, HAL_DMA_IrqHandlerError, &g_dmac); + IRQ_EnableN(IRQ_DMA_TC); + IRQ_EnableN(IRQ_DMA_ERR); + HAL_DMA_Init(&g_dmac); /* dma init */ + + DMA_Channel1Init((void *)(&g_spiSampleHandle)); /* dma channel 1 init */ + DMA_Channel0Init((void *)(&g_spiSampleHandle)); +} + +__weak void TxSampleCallbackHandle(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN SPI_TX_COMPLETE_CB_ID */ + /* USER CODE END SPI_TX_COMPLETE_CB_ID */ +} + +__weak void RxSampleCallbackHandle(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN SPI_RX_COMPLETE_CB_ID */ + /* USER CODE END SPI_RX_COMPLETE_CB_ID */ +} + +__weak void TxRxSampleCallbackHandle(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN SPI_TX_RX_COMPLETE_CB_ID */ + /* USER CODE END SPI_TX_RX_COMPLETE_CB_ID */ +} + +__weak void ErrorSampleCallbackHandle(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN SPI_ERROR_CB_ID */ + /* USER CODE END SPI_ERROR_CB_ID */ +} + +__weak void SPICsCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN SPI_CS_CB_ID */ + /* USER CODE END SPI_CS_CB_ID */ +} + +static void SPI_Init(void) +{ + HAL_CRG_IpEnableSet(SPI_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(SPI_BASE, CRG_PLL_NO_PREDV); + + g_spiSampleHandle.baseAddress = SPI; + + g_spiSampleHandle.mode = HAL_SPI_MASTER; /* spi master */ + g_spiSampleHandle.csMode = SPI_CHIP_SELECT_MODE_INTERNAL; + g_spiSampleHandle.xFerMode = HAL_XFER_MODE_DMA; + g_spiSampleHandle.clkPolarity = HAL_SPI_CLKPOL_0; /* spi ploarity is 0 */ + g_spiSampleHandle.clkPhase = HAL_SPI_CLKPHA_1; + g_spiSampleHandle.endian = HAL_SPI_BIG_ENDIAN; + g_spiSampleHandle.frameFormat = HAL_SPI_MODE_MOTOROLA; /* motorola frame format */ + g_spiSampleHandle.dataWidth = SPI_DATA_WIDTH_8BIT; + g_spiSampleHandle.freqScr = SPI_FREQ_SCR; + g_spiSampleHandle.freqCpsdvsr = SPI_FREQ_CPSDVSR; + g_spiSampleHandle.waitEn = BASE_CFG_DISABLE; + g_spiSampleHandle.waitVal = 127; /* mircowire wait time 127 */ + g_spiSampleHandle.rxBuff = NULL; + g_spiSampleHandle.txBuff = NULL; + g_spiSampleHandle.transferSize = 0; + g_spiSampleHandle.txCount = 0; /* transfer count */ + g_spiSampleHandle.rxCount = 0; + g_spiSampleHandle.state = HAL_SPI_STATE_RESET; + g_spiSampleHandle.rxIntSize = SPI_RX_INTERRUPT_SIZE_1; + g_spiSampleHandle.txIntSize = SPI_TX_INTERRUPT_SIZE_1; /* tx interrupt size */ + g_spiSampleHandle.rxDMABurstSize = SPI_RX_DMA_BURST_SIZE_1; + g_spiSampleHandle.txDMABurstSize = SPI_TX_DMA_BURST_SIZE_1; + g_spiSampleHandle.dmaHandle = &g_dmac; + g_spiSampleHandle.txDmaCh = 0; /* DMA Channel 0 */ + g_spiSampleHandle.rxDmaCh = 1; /* DMA Channel 1 */ + HAL_SPI_Init(&g_spiSampleHandle); + /* spi register callback */ + HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_TX_COMPLETE_CB_ID, TxSampleCallbackHandle); + HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_RX_COMPLETE_CB_ID, RxSampleCallbackHandle); + HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_TX_RX_COMPLETE_CB_ID, TxRxSampleCallbackHandle); + HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_ERROR_CB_ID, ErrorSampleCallbackHandle); + HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_CS_CB_ID, SPICsCallback); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); + + g_uart0.baseAddress = UART0; /* uart0 baseaaddress */ + + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; /* data length 8 */ + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; /* blocking mode */ + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + SYSCTRL0->SC_SYS_STAT.BIT.update_mode = 0; + SYSCTRL0->SC_SYS_STAT.BIT.update_mode_clear = 1; + HAL_IOCMG_SetPinAltFuncMode(IO6_AS_SSP0_CLK); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(IO6_AS_SSP0_CLK, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(IO6_AS_SSP0_CLK, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(IO6_AS_SSP0_CLK, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(IO6_AS_SSP0_CLK, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(IO3_AS_SSP0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(IO3_AS_SSP0_TXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(IO3_AS_SSP0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(IO3_AS_SSP0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(IO3_AS_SSP0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(IO4_AS_SSP0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(IO4_AS_SSP0_RXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(IO4_AS_SSP0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(IO4_AS_SSP0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(IO4_AS_SSP0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(IO2_AS_SSP0_CSN0); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(IO2_AS_SSP0_CSN0, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(IO2_AS_SSP0_CSN0, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(IO2_AS_SSP0_CSN0, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(IO2_AS_SSP0_CSN0, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(IO5_AS_SSP0_CSN1); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(IO5_AS_SSP0_CSN1, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(IO5_AS_SSP0_CSN1, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(IO5_AS_SSP0_CSN1, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(IO5_AS_SSP0_CSN1, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(IO52_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(IO52_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(IO52_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(IO52_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(IO52_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + /* UART RX recommend PULL_UP */ + HAL_IOCMG_SetPinAltFuncMode(IO53_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(IO53_AS_UART0_RXD, PULL_UP); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(IO53_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(IO53_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(IO53_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ +} + +void SystemInit(void) +{ + IOConfig(); + DMA_Init(); + UART0_Init(); + SPI_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_dma_w25q32_internal/readme.md b/drivers_sample/spi/sample_spi_dma_w25q32_internal/readme.md new file mode 100644 index 000000000..058bb69dd --- /dev/null +++ b/drivers_sample/spi/sample_spi_dma_w25q32_internal/readme.md @@ -0,0 +1,20 @@ +# 对接flash芯片w25q32,通过SPI的DMA方式写入和读取w25q32芯片中的数据 +## 关键字: SPI, DMA, w25q32芯片 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、SPI控制器初始化和功能配置。SPI对接flash芯片w25q32,对w25q32芯片进行写入120个数据,之后从芯片中再读出120字节数据,数据的搬运由DMA方式完成。 + +**【示例配置】** ++ 在"SystemInit()”接口中配置SPI时钟极性、时钟相位、帧格式等参数和DMA通道相关参数,需根据对接的芯片进行相关参数配置。 + ++ w25q32芯片扇区擦除:调用“SectorErase()”接口先对w25q32芯片进行擦写操作,内部调用接口“SPI_W25Q32_WriteEnable()”向w25q32发送写使能命令,之后发送擦写扇区命令。命令的发送都是调用“HAL_SPI_WriteDMA()”接口。 + ++ 向w25q32芯片写数据:调用“WritePage()”接口进行数据写入,发送页写入命令和需要写入120个数据,调用“HAL_SPI_WriteDMA()”接口。 + ++ 从w25q32芯片读数据:调用“ReadData()”接口进行读数据,发送读命令,调用“HAL_SPI_WriteReadDMA()”接口从芯片读取120个数据。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后。当每次DMA搬运完成会进入回调函数打印log,串口打印写入的120个数据和读取的120个数据,如果写入和读取的数据是相同则打印data correct,否则打印data err。 + +**【注意事项】** ++ 使用此示例代码必须外接flash芯片w25q32。 \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_dma_w25q32_internal/src/sample_spi_dma_w25q32_internal.c b/drivers_sample/spi/sample_spi_dma_w25q32_internal/src/sample_spi_dma_w25q32_internal.c new file mode 100644 index 000000000..002cbb012 --- /dev/null +++ b/drivers_sample/spi/sample_spi_dma_w25q32_internal/src/sample_spi_dma_w25q32_internal.c @@ -0,0 +1,269 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_spi_dma_w25q32_internal.c + * @author MCU Driver Team + * @brief Sample for SPI Module DMA. + * @details This sample is used to operate the HAL interface on the W25Q32 chip of the flash. + * Write data and read data to address 0 of W25Q32 + */ + +#include "main.h" +#include "spi.h" +#include "debug.h" +#include "sample_spi_dma_w25q32_internal.h" + +#define SPI_W25X_WRITE_ENABLE 0x06 +#define SPI_W25X_SECTOR_ERASE 0x20 +#define SPI_W25X_PAGE_PROGRAM 0x02 +#define SPI_W25X_READ_DATA 0x03 + +static unsigned int g_flashAddr = 0; +static unsigned char g_writeBuf[120] = {0}; +static unsigned char g_recvBuf[120] = {0}; + +/** + * @brief Spi dma sample w25q32 TxRx callback handle. + * @param handle SPI handle. + * @retval None. + */ +void TxRxSampleCallbackHandle(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("TxRxCpltCallbackHandle\r\n"); +} + +/** + * @brief Spi dma sample w25q32 Tx callback handle. + * @param handle SPI handle. + * @retval None. + */ +void TxSampleCallbackHandle(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("txCpltCallbackHandle\r\n"); +} + +/** + * @brief Spi dma sample w25q32 Rx callback handle. + * @param handle SPI handle. + * @retval None. + */ +void RxSampleCallbackHandle(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("RxCpltCallbackHandle\r\n"); +} + +/** + * @brief Spi dma sample w25q32 Error callback handle. + * @param handle SPI handle. + * @retval None. + */ +void ErrorSampleCallbackHandle(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("ErrorCallbackHandle\r\n"); +} + +/** + * @brief w25q32 enable the write function. + * @param None. + * @retval BASE_StatusType:OK, ERROR. + */ +static BASE_StatusType SPI_W25Q32_WriteEnable(void) +{ + unsigned char temp = SPI_W25X_WRITE_ENABLE; /* Write enable command */ + BASE_StatusType ret; + ret = HAL_SPI_WriteDMA(&g_spiSampleHandle, (unsigned char *)&temp, sizeof(temp)); + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("enable error!\r\n"); + return BASE_STATUS_ERROR; + } + return BASE_STATUS_OK; +} + +/** + * @brief w25q32 sector erase function. + * @param sectorEraseAddr sector erase address. + * @retval BASE_StatusType:OK, ERROR. + */ +static BASE_StatusType SectorErase(unsigned int sectorEraseAddr) +{ + BASE_StatusType ret; + ret = SPI_W25Q32_WriteEnable(); + if (ret != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + BASE_FUNC_DELAY_MS(20); /* delay 20 ms */ + + unsigned char buffer[4] = {0}; + buffer[0] = SPI_W25X_SECTOR_ERASE; /* Sector erase command */ + buffer[1] = (sectorEraseAddr & 0xFF0000) >> 16; /* Shift right by 16 bits */ + buffer[2] = (sectorEraseAddr & 0xFF00) >> 8; /* Shift right by 8 bits, 2 array subscript */ + buffer[3] = (sectorEraseAddr & 0xFF); /* Lower 8 bits of the sector erase address, 3 array subscript */ + ret = HAL_SPI_WriteDMA(&g_spiSampleHandle, buffer, sizeof(buffer)); + if (ret != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + return BASE_STATUS_OK; +} + +/** + * @brief w25q32 single page write, maximum 256 bytes. + * @param writeBuf write data buffer. + * @param writeAddr write address. + * @param len data length. + * @retval BASE_StatusType:OK, ERROR. + */ +static BASE_StatusType WritePage(unsigned char *writeBuf, unsigned int writeAddr, unsigned int len) +{ + BASE_StatusType ret; + ret = SPI_W25Q32_WriteEnable(); /* enable the write */ + if (ret != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + BASE_FUNC_DELAY_MS(20); /* Delay 20 ms */ + + unsigned char buffer[124] = {0}; /* transmit 124 bytes: 4-byte command and 120-byte data */ + + buffer[0] = SPI_W25X_PAGE_PROGRAM; /* Page Program command */ + buffer[1] = (writeAddr & 0xFF0000) >> 16; /* Shift right by 16 bits */ + buffer[2] = (writeAddr & 0xFF00) >> 8; /* Shift right by 8 bits, 2 array subscript */ + buffer[3] = (writeAddr & 0xFF); /* Lower 8 bits of the sector erase address, 3 array subscript */ + for (unsigned int count = 0; count < len; count++) { + buffer[count + 4] = writeBuf[count]; /* data is stored from array subscript 4 */ + } + ret = HAL_SPI_WriteDMA(&g_spiSampleHandle, buffer, (len + 4)); /* len + 4 is total size */ + BASE_FUNC_DELAY_MS(2000); /* delay 2000 ms, wait until the DMA complete the data transfer. */ + if (ret != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + return BASE_STATUS_OK; +} + +/** + * @brief Read data in the address. + * @param recvBuf write data buffer. + * @param recvAddr write address. + * @param len data length. + * @retval BASE_StatusType:OK, ERROR. + */ +static BASE_StatusType ReadData(unsigned char *recvBuf, unsigned int recvAddr, unsigned int len) +{ + unsigned char buffer[124] = {0}; /* The array size is 124 bytes */ + BASE_StatusType ret; + buffer[0] = SPI_W25X_READ_DATA; /* Read data command */ + buffer[1] = (recvAddr & 0xFF0000) >> 16; /* Shift right by 16 bits */ + buffer[2] = (recvAddr & 0xFF00) >> 8; /* Shift right by 8 bits, 2 array subscript */ + buffer[3] = (recvAddr & 0xFF); /* Lower 8 bits of the sector erase address, 3 array subscript */ + + unsigned char readBuf[124] = {0}; + /* len + 4 is total size */ + ret = HAL_SPI_WriteReadDMA(&g_spiSampleHandle, readBuf, (unsigned char *)buffer, (len + 4)); + if (ret != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + BASE_FUNC_DELAY_MS(2000); /* delay 2000 ms, wait until the DMA complete the data transfer. */ + for (unsigned int i = 0; i < len; i++) { + recvBuf[i] = readBuf[i + 4]; /* read valid data from array subscript 4 */ + } + return BASE_STATUS_OK; +} + +/** + * @brief Performs read data and write page on w25q32. + * @param None. + * @retval None. + */ +static void SPI_WritePageAndReadData(void) +{ + BASE_StatusType ret; + DBG_PRINTF("write data is : \r\n"); + unsigned int writeLen = 120; /* transfer 120 bytes of data */ + for (unsigned int i = 0; i < writeLen; i++) { + g_writeBuf[i] = i; + DBG_PRINTF("%d ", g_writeBuf[i]); + } + DBG_PRINTF("\r\n"); + ret = WritePage(g_writeBuf, g_flashAddr, writeLen); /* w25q32 single page write */ + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("write page failed!\r\n"); + } + + BASE_FUNC_DELAY_MS(5); /* Delay 5ms */ + + unsigned int recvLen = 120; /* 120 bytes of data needs to be received */ + for (unsigned int index = 0; index < recvLen; index++) { + g_recvBuf[index] = 0; + } + ret = ReadData(g_recvBuf, g_flashAddr, recvLen); /* Read data in the g_flashAddr address */ + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("read page failed!\r\n"); + } else { + DBG_PRINTF("read data is : \r\n"); + for (unsigned int i = 0; i < recvLen; i++) { + DBG_PRINTF("%d ", g_recvBuf[i]); /* print received Data */ + } + DBG_PRINTF("\r\n"); + } +} + +/** + * @brief Performs read and write operations on w25q32. + * @param None. + * @retval None. + */ +static void SPI_W25Q32_TEST(void) +{ + BASE_StatusType ret; + ret = SectorErase(g_flashAddr); /* w25q32 sector erase function */ + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("sector erase failed!\r\n"); + } + BASE_FUNC_DELAY_MS(500); /* Delay 500 ms */ + + SPI_WritePageAndReadData(); + + bool flag = true; + unsigned int recvLen = 120; + for (unsigned int i = 0; i < recvLen; i++) { + if (g_recvBuf[i] != g_writeBuf[i]) { /* compare the transmitted data with the received data */ + DBG_PRINTF("data err! \r\n"); + flag = false; + break; + } + } + if (flag) { + DBG_PRINTF("data correct \r\n"); + } + DBG_PRINTF("\r\n"); +} + +/** + * @brief Spi dma sample w25q32 processing. + * @param None. + * @retval None. + */ +void W25Q32DmaSampleProcessing(void) +{ + SystemInit(); + while (1) { + SPI_W25Q32_TEST(); + BASE_FUNC_DELAY_MS(2000); /* Delay 2000 ms */ + } +} diff --git a/drivers_sample/spi/sample_spi_interrupt_kta7953/inc/sample_spi_interrupt_kta7953.h b/drivers_sample/spi/sample_spi_interrupt_kta7953/inc/sample_spi_interrupt_kta7953.h new file mode 100644 index 000000000..38a53dcaf --- /dev/null +++ b/drivers_sample/spi/sample_spi_interrupt_kta7953/inc/sample_spi_interrupt_kta7953.h @@ -0,0 +1,28 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_spi_interrupt_kta7953.h + * @author MCU Driver Team + * @brief SPI module SPI module sample.. + * @details This file provides sample code for users to help use + * the functionalities of the SPI. + */ +#ifndef McuMagicTag_SAMPLE_SPI_INTERRUPT_KTA7953_H +#define McuMagicTag_SAMPLE_SPI_INTERRUPT_KTA7953_H + +void Kta7953InterruptSampleProcessing(void); +#endif \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_interrupt_kta7953/init/main.c b/drivers_sample/spi/sample_spi_interrupt_kta7953/init/main.c new file mode 100644 index 000000000..3cd3d19de --- /dev/null +++ b/drivers_sample/spi/sample_spi_interrupt_kta7953/init/main.c @@ -0,0 +1,35 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ +#include "feature.h" +#include "main.h" +#include "sample_spi_interrupt_kta7953.h" + +SPI_Handle g_spiSampleHandle; +UART_Handle g_uart0; + +int main(void) +{ + Kta7953InterruptSampleProcessing(); + while (1) { + } + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_interrupt_kta7953/init/main.h b/drivers_sample/spi/sample_spi_interrupt_kta7953/init/main.h new file mode 100644 index 000000000..93fabf199 --- /dev/null +++ b/drivers_sample/spi/sample_spi_interrupt_kta7953/init/main.h @@ -0,0 +1,52 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "spi.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +extern SPI_Handle g_spiSampleHandle; + +extern UART_Handle g_uart0; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +void TxSampleCallbackHandle(SPI_Handle *handle); +void RxSampleCallbackHandle(SPI_Handle *handle); +void TxRxSampleCallbackHandle(SPI_Handle *handle); +void ErrorSampleCallbackHandle(SPI_Handle *handle); +void SPICsCallback(SPI_Handle *handle); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_interrupt_kta7953/init/system_init.c b/drivers_sample/spi/sample_spi_interrupt_kta7953/init/system_init.c new file mode 100644 index 000000000..8fab41759 --- /dev/null +++ b/drivers_sample/spi/sample_spi_interrupt_kta7953/init/system_init.c @@ -0,0 +1,207 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" + +#define UART0_BAND_RATE 115200 + +#define SPI_FREQ_SCR 2 +#define SPI_FREQ_CPSDVSR 10 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +__weak void TxSampleCallbackHandle(SPI_Handle *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN TxSampleCallbackHandle */ + /* USER CODE END TxSampleCallbackHandle */ +} + +__weak void RxSampleCallbackHandle(SPI_Handle *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN RxSampleCallbackHandle */ + /* USER CODE END RxSampleCallbackHandle */ +} + +__weak void TxRxSampleCallbackHandle(SPI_Handle *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN TxRxSampleCallbackHandle */ + /* USER CODE END TxRxSampleCallbackHandle */ +} + +__weak void ErrorSampleCallbackHandle(SPI_Handle *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN ErrorSampleCallbackHandle */ + /* USER CODE END ErrorSampleCallbackHandle */ +} + +__weak void SPICsCallback(SPI_Handle *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN SPICsCallback */ + /* USER CODE END SPICsCallback */ +} + +static void SPI_Init(void) +{ + HAL_CRG_IpEnableSet(SPI_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(SPI_BASE, CRG_PLL_NO_PREDV); + + g_spiSampleHandle.baseAddress = SPI; + g_spiSampleHandle.irqNum = IRQ_SPI; + + g_spiSampleHandle.mode = HAL_SPI_MASTER; + g_spiSampleHandle.csMode = SPI_CHIP_SELECT_MODE_INTERNAL; + g_spiSampleHandle.xFerMode = HAL_XFER_MODE_INTERRUPTS; + g_spiSampleHandle.clkPolarity = 0; + g_spiSampleHandle.clkPhase = 0; + g_spiSampleHandle.endian = HAL_SPI_BIG_ENDIAN; + g_spiSampleHandle.frameFormat = HAL_SPI_MODE_MOTOROLA; + g_spiSampleHandle.dataWidth = SPI_DATA_WIDTH_16BIT; + g_spiSampleHandle.freqScr = SPI_FREQ_SCR; + g_spiSampleHandle.freqCpsdvsr = SPI_FREQ_CPSDVSR; + g_spiSampleHandle.waitVal = 127; /* Wait time is 127 clock */ + g_spiSampleHandle.rxBuff = NULL; + g_spiSampleHandle.txBuff = NULL; + g_spiSampleHandle.transferSize = 0; + g_spiSampleHandle.txCount = 0; + g_spiSampleHandle.rxCount = 0; + g_spiSampleHandle.state = HAL_SPI_STATE_RESET; + g_spiSampleHandle.rxIntSize = SPI_RX_INTERRUPT_SIZE_1; + g_spiSampleHandle.txIntSize = SPI_TX_INTERRUPT_SIZE_32; + g_spiSampleHandle.rxDMABurstSize = SPI_RX_DMA_BURST_SIZE_1; + g_spiSampleHandle.txDMABurstSize = SPI_TX_DMA_BURST_SIZE_1; + + HAL_SPI_Init(&g_spiSampleHandle); + + HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_TX_COMPLETE_CB_ID, TxSampleCallbackHandle); + HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_RX_COMPLETE_CB_ID, RxSampleCallbackHandle); + HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_TX_RX_COMPLETE_CB_ID, TxRxSampleCallbackHandle); + HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_ERROR_CB_ID, ErrorSampleCallbackHandle); + HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_CS_CB_ID, SPICsCallback); + HAL_SPI_IRQService(&g_spiSampleHandle); + IRQ_SetPriority(g_spiSampleHandle.irqNum, 1); + IRQ_EnableN(g_spiSampleHandle.irqNum); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); + + g_uart0.baseAddress = UART0; + g_uart0.irqNum = IRQ_UART0; + + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + IOConfig_RegStruct *iconfig = IOCONFIG; + + iconfig->iocmg_22.BIT.func = 0x5; /* 0x5 is SPI_CLK */ + iconfig->iocmg_22.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_22.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_22.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_22.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_22.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_18.BIT.func = 0x5; /* 0x5 is SPI_CSN0 */ + iconfig->iocmg_18.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_18.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_18.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_18.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_18.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_21.BIT.func = 0x5; /* 0x5 is SPI_CSN1 */ + iconfig->iocmg_21.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_21.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_21.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_21.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_21.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_20.BIT.func = 0x5; /* 0x5 is SPI_RXD */ + iconfig->iocmg_20.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_20.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_20.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_20.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_20.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_19.BIT.func = 0x5; /* 0x5 is SPI_TXD */ + iconfig->iocmg_19.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_19.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_19.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_19.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_19.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ + iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ + iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + SPI_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_interrupt_kta7953/readme.md b/drivers_sample/spi/sample_spi_interrupt_kta7953/readme.md new file mode 100644 index 000000000..6c781e6ba --- /dev/null +++ b/drivers_sample/spi/sample_spi_interrupt_kta7953/readme.md @@ -0,0 +1,20 @@ +# 对接ADC芯片kta7953,通过SPI中的中断方式读取ADC各个通道采样值 +## 关键字: SPI, 中断, kta7953 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、SPI控制器初始化和功能配置。SPI对接ADC芯片kta7953,通过中断方式不断读取ADC芯片kta7953各通道(ch0-ch6)的采样值,以手动模式操作ADC芯片kta7953各个通道。 + +**【示例配置】** ++ 在"SystemInit()”接口中配置SPI时钟极性、时钟相位、帧格式、中断等参数。 + ++ 定义数组,数组中存放以手动操作模式读取各个通道采样值的命令。 + ++ 采用“HAL_SPI_WriteReadIT()”进行ch0-ch6通道采样。执行十次后调用“Kta7953BuffPrintf()”打印结果值。 + ++ 编写回调函数代码,当产生中断会调用回调函数。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码通过串口打印的方式输出ADC芯片kta7953各通道的采样值,并且执行中断回调代码进行串口打印。 + +**【注意事项】** ++ 使用此示例代码必须外接ADC芯片kta7953。 \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_interrupt_kta7953/src/sample_spi_interrupt_kta7953.c b/drivers_sample/spi/sample_spi_interrupt_kta7953/src/sample_spi_interrupt_kta7953.c new file mode 100644 index 000000000..c6c97ad13 --- /dev/null +++ b/drivers_sample/spi/sample_spi_interrupt_kta7953/src/sample_spi_interrupt_kta7953.c @@ -0,0 +1,163 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_spi_interrupt_kta7953.c + * @author MCU Driver Team + * @brief Sample for SPI Module Interrupt. + * @details This sample is connected to the ADC chip kta7953 to demonstrate how to operate the HAL interface + * in interrupt mode in the SPI driver. + * This sample operates channels 0 to 6 of ADC chip kta7953 in manual mode. + * This sample outputs the sampling values of each channel of the ADC chip kta7953 through the serial port. + * To use this sample, connect the external ADC chip kta7953. + */ +#include "main.h" +#include "spi.h" +#include "debug.h" +#include "interrupt.h" +#include "sample_spi_interrupt_kta7953.h" + +#define USER_TIMEOUT 0x400 + +#define MANUAL_MODE_SET_CH0 0x1040 +#define MANUAL_MODE_SET_CH1 0x10C0 +#define MANUAL_MODE_SET_CH2 0x1140 +#define MANUAL_MODE_SET_CH3 0x11C0 +#define MANUAL_MODE_SET_CH4 0x1240 +#define MANUAL_MODE_SET_CH5 0x12C0 +#define MANUAL_MODE_SET_CH6 0x1340 + + +static volatile unsigned int g_txrxFlag = 0; +static unsigned short g_tempRdata[10]; +static volatile unsigned short g_outCh = 0; +static volatile unsigned short g_outData = 0; + +/** + * @brief Spi interrupt sample kta7953 buffer printf. + * @param None. + * @retval None. + */ +static void Kta7953BuffPrintf(void) +{ + for (int i = 0; i < 10; i++) { /* Print 10 groups of test data. */ + g_outCh = g_tempRdata[i] >> 12; /* Shift right by 12 bits to obtain the lower four bits. */ + g_outData = g_tempRdata[i] & 0x0FFF; /* Mask 0x0FFF */ + DBG_PRINTF("[%d] = CH:%d = %d\r\n", i, g_outCh, g_outData); + } +} + +/** + * @brief Spi interrupt sample kta7953 TxRx callback handle. + * @param handle SPI handle. + * @retval None. + */ +void TxRxSampleCallbackHandle(void *handle) +{ + BASE_FUNC_UNUSED(handle); + g_txrxFlag = 1; + DBG_PRINTF("TxRxCpltCallbackHandle\r\n"); +} + +/** + * @brief Spi interrupt sample kta7953 Tx callback handle. + * @param handle SPI handle. + * @retval None. + */ +void TxSampleCallbackHandle(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("txCpltCallbackHandle\r\n"); +} + +/** + * @brief Spi interrupt sample kta7953 Rx callback handle. + * @param handle SPI handle. + * @retval None. + */ +void RxSampleCallbackHandle(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("RxCpltCallbackHandle\r\n"); +} + +/** + * @brief Spi interrupt sample kta7953 Error callback handle. + * @param handle SPI handle. + * @retval None. + */ +void ErrorSampleCallbackHandle(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("ErrorCallbackHandle\r\n"); +} + +/** + * @brief Spi interrupt sample kta7953 processing. + * @param None. + * @retval None. + */ +void Kta7953InterruptSampleProcessing(void) +{ + static unsigned short cnt = 0; + unsigned short temp = MANUAL_MODE_SET_CH0; + unsigned short tempWdata[] = { + MANUAL_MODE_SET_CH0, + MANUAL_MODE_SET_CH1, + MANUAL_MODE_SET_CH2, + MANUAL_MODE_SET_CH3, + MANUAL_MODE_SET_CH4, + MANUAL_MODE_SET_CH5, + MANUAL_MODE_SET_CH6, + 3, + 0, + 0 + }; + + SystemInit(); + HAL_SPI_WriteIT(&g_spiSampleHandle, (unsigned char *)&temp, sizeof(temp)); + while (1) { + if (g_txrxFlag > 0) { + g_txrxFlag = 0; + + if (cnt >= 10) { /* Test 10 times in total */ + cnt = 0; + g_txrxFlag = 1; + Kta7953BuffPrintf(); + } + + if (cnt > 7 && cnt < 10) { /* 7 to 10 */ + HAL_SPI_ReadIT(&g_spiSampleHandle, (unsigned char *)&g_tempRdata[cnt], sizeof(g_tempRdata[cnt])); + cnt++; + } + + if (cnt == 7) { /* 7th */ + HAL_SPI_WriteIT(&g_spiSampleHandle, (unsigned char *)&tempWdata[cnt], sizeof(tempWdata[cnt])); + g_tempRdata[cnt] = cnt; + cnt++; + } + + if (cnt < 7) { /* First 7 */ + HAL_SPI_WriteReadIT(&g_spiSampleHandle, + (unsigned char *)&g_tempRdata[cnt], + (unsigned char *)&tempWdata[cnt], + sizeof(tempWdata[cnt])); + cnt++; + } + } + BASE_FUNC_DELAY_MS(300); /* Delay 300ms */ + } +} diff --git a/drivers_sample/spi/sample_spi_interrupt_w25q32/inc/sample_spi_interrupt_w25q32.h b/drivers_sample/spi/sample_spi_interrupt_w25q32/inc/sample_spi_interrupt_w25q32.h new file mode 100644 index 000000000..ea145626c --- /dev/null +++ b/drivers_sample/spi/sample_spi_interrupt_w25q32/inc/sample_spi_interrupt_w25q32.h @@ -0,0 +1,28 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_spi_interrupt_w25q32.h + * @author MCU Driver Team + * @brief SPI module sample. + * @details This file provides sample code for users to help use + * the functionalities of the SPI. + */ +#ifndef SAMPLE_SPI_INTERRUPT_W25Q32_H +#define SAMPLE_SPI_INTERRUPT_W25Q32_H + +void W25Q32InterruptSampleProcessing(void); +#endif \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_interrupt_w25q32/init/main.c b/drivers_sample/spi/sample_spi_interrupt_w25q32/init/main.c new file mode 100644 index 000000000..0c5f30bcf --- /dev/null +++ b/drivers_sample/spi/sample_spi_interrupt_w25q32/init/main.c @@ -0,0 +1,50 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ + +#include "typedefs.h" +#include "feature.h" +#include "main.h" +/* USER CODE BEGIN 0 */ +/* USER CODE END 0 */ +UART_Handle g_uart0; +SPI_Handle g_spiSampleHandle; +/* USER CODE BEGIN 1 */ +/* USER CODE END 1 */ + +int main(void) +{ + /* USER CODE BEGIN 2 */ + /* USER CODE END 2 */ + W25Q32InterruptSampleProcessing(); + /* USER CODE BEGIN 3 */ + /* USER CODE END 3 */ + while (1) { + /* USER CODE BEGIN 4 */ + /* USER CODE END 4 */ + } + /* USER CODE BEGIN 5 */ + /* USER CODE END 5 */ + return BASE_STATUS_OK; +} + +/* USER CODE BEGIN 6 */ +/* USER CODE END 6 */ \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_interrupt_w25q32/init/main.h b/drivers_sample/spi/sample_spi_interrupt_w25q32/init/main.h new file mode 100644 index 000000000..5d6cae904 --- /dev/null +++ b/drivers_sample/spi/sample_spi_interrupt_w25q32/init/main.h @@ -0,0 +1,56 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "spi.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define XTAL_DRV_LEVEL4 0x03U +#define XTAL_DRV_LEVEL3 0x02U +#define XTAL_DRV_LEVEL2 0x01U +#define XTAL_DRV_LEVEL1 0x00U + +extern UART_Handle g_uart0; +extern SPI_Handle g_spiSampleHandle; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +void TxSampleCallbackHandle(void *handle); +void RxSampleCallbackHandle(void *handle); +void TxRxSampleCallbackHandle(void *handle); +void ErrorSampleCallbackHandle(void *handle); +void SPICsCallback(void *handle); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_interrupt_w25q32/init/system_init.c b/drivers_sample/spi/sample_spi_interrupt_w25q32/init/system_init.c new file mode 100644 index 000000000..7d18f1ec0 --- /dev/null +++ b/drivers_sample/spi/sample_spi_interrupt_w25q32/init/system_init.c @@ -0,0 +1,203 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" +#include "iocmg_ip.h" + +#define UART0_BAND_RATE 115200 + +#define SPI1_FREQ_SCR 2 +#define SPI1_FREQ_CPSDVSR 10 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; /* crg baseaddress */ + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_1; + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { /* CRG init */ + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +__weak void TxSampleCallbackHandle(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN TxSampleCallbackHandle */ + /* USER CODE END TxSampleCallbackHandle */ +} + +__weak void RxSampleCallbackHandle(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN RxSampleCallbackHandle */ + /* USER CODE END RxSampleCallbackHandle */ +} + +__weak void TxRxSampleCallbackHandle(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN TxRxSampleCallbackHandle */ + /* USER CODE END TxRxSampleCallbackHandle */ +} + +__weak void ErrorSampleCallbackHandle(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN ErrorSampleCallbackHandle */ + /* USER CODE END ErrorSampleCallbackHandle */ +} + +__weak void SPICsCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN SPICsCallback */ + /* USER CODE END SPICsCallback */ +} + +static void SPI1_Init(void) +{ + HAL_CRG_IpEnableSet(SPI1_BASE, IP_CLK_ENABLE); + + g_spiSampleHandle.baseAddress = SPI1; + + g_spiSampleHandle.mode = HAL_SPI_MASTER; /* spi master */ + g_spiSampleHandle.csMode = SPI_CHIP_SELECT_MODE_CALLBACK; + g_spiSampleHandle.xFerMode = HAL_XFER_MODE_INTERRUPTS; + g_spiSampleHandle.clkPolarity = HAL_SPI_CLKPOL_0; /* spi ploarity is 0 */ + g_spiSampleHandle.clkPhase = HAL_SPI_CLKPHA_1; + g_spiSampleHandle.endian = HAL_SPI_BIG_ENDIAN; + g_spiSampleHandle.frameFormat = HAL_SPI_MODE_MOTOROLA; /* motorola frame format */ + g_spiSampleHandle.dataWidth = SPI_DATA_WIDTH_8BIT; + g_spiSampleHandle.freqScr = SPI1_FREQ_SCR; + g_spiSampleHandle.freqCpsdvsr = SPI1_FREQ_CPSDVSR; + g_spiSampleHandle.waitEn = BASE_CFG_DISABLE; + g_spiSampleHandle.waitVal = 127; /* mircowire wait time 127 */ + g_spiSampleHandle.rxBuff = NULL; + g_spiSampleHandle.txBuff = NULL; + g_spiSampleHandle.transferSize = 0; + g_spiSampleHandle.txCount = 0; /* transfer count */ + g_spiSampleHandle.rxCount = 0; + g_spiSampleHandle.state = HAL_SPI_STATE_RESET; + g_spiSampleHandle.rxIntSize = SPI_RX_INTERRUPT_SIZE_1; + g_spiSampleHandle.txIntSize = SPI_TX_INTERRUPT_SIZE_1; /* tx interrupt size */ + g_spiSampleHandle.rxDMABurstSize = SPI_RX_DMA_BURST_SIZE_1; + g_spiSampleHandle.txDMABurstSize = SPI_TX_DMA_BURST_SIZE_1; + HAL_SPI_Init(&g_spiSampleHandle); + + /* spi register callback */ + HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_TX_COMPLETE_CB_ID, TxSampleCallbackHandle); + HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_RX_COMPLETE_CB_ID, RxSampleCallbackHandle); + HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_TX_RX_COMPLETE_CB_ID, TxRxSampleCallbackHandle); + HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_ERROR_CB_ID, ErrorSampleCallbackHandle); + HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_CS_CB_ID, SPICsCallback); + /* spi interrupt setting */ + IRQ_Register(IRQ_SPI1, HAL_SPI_IrqHandler, &g_spiSampleHandle); + IRQ_SetPriority(IRQ_SPI1, 1); + IRQ_EnableN(IRQ_SPI1); + HAL_SPI_ChipSelectChannelSet(&g_spiSampleHandle, SPI_CHIP_SELECT_CHANNEL_1); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + + g_uart0.baseAddress = UART0; /* uart0 baseaaddress */ + + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; /* data length 8 */ + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; /* blocking mode */ + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; /* fifo size 8 */ + g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO4_6_AS_SPI1_CLK); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO4_6_AS_SPI1_CLK, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO4_6_AS_SPI1_CLK, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO4_6_AS_SPI1_CLK, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO4_6_AS_SPI1_CLK, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO1_4_AS_SPI1_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO1_4_AS_SPI1_RXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO1_4_AS_SPI1_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO1_4_AS_SPI1_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO1_4_AS_SPI1_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO3_0_AS_SPI1_CSN1); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO3_0_AS_SPI1_CSN1, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO3_0_AS_SPI1_CSN1, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO3_0_AS_SPI1_CSN1, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO3_0_AS_SPI1_CSN1, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO1_3_AS_SPI1_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO1_3_AS_SPI1_TXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO1_3_AS_SPI1_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO1_3_AS_SPI1_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO1_3_AS_SPI1_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO4_5_AS_SPI1_CSN0); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO4_5_AS_SPI1_CSN0, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO4_5_AS_SPI1_CSN0, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO4_5_AS_SPI1_CSN0, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO4_5_AS_SPI1_CSN0, DRIVER_RATE_2); /* Output signal edge fast/slow */ +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + SPI1_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_interrupt_w25q32/readme.md b/drivers_sample/spi/sample_spi_interrupt_w25q32/readme.md new file mode 100644 index 000000000..9206fbbb1 --- /dev/null +++ b/drivers_sample/spi/sample_spi_interrupt_w25q32/readme.md @@ -0,0 +1,20 @@ +# 对接flash芯片w25q32,通过SPI的中断方式写入和读取w25q32芯片中的数据 +## 关键字: SPI, 中断, w25q32芯片 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、SPI控制器初始化和功能配置。SPI对接flash芯片w25q32,通过中断方式对w25q32芯片进行写入120个数据,之后从芯片中再读出120字节数据。 + +**【示例配置】** ++ 在"SystemInit()”接口中配置SPI时钟极性、时钟相位、帧格式等参数和DMA通道相关参数,需根据对接的芯片进行相关参数配置。 + ++ w25q32芯片扇区擦除:调用“SectorErase()”接口先对w25q32芯片进行擦写操作,内部调用接口“SPI_W25Q32_WriteEnable()”向w25q32发送写使能命令,之后发送擦写扇区命令。命令的发送都是调用“HAL_SPI_WriteIT()”接口。 + ++ 向w25q32芯片写数据:调用“WritePage()”接口进行数据写入,发送页写入命令和需要写入120个数据,调用“HAL_SPI_WriteIT()”接口。 + ++ 从w25q32芯片读数据:调用“ReadData()”接口进行读数据,发送读命令,调用“HAL_SPI_WriteReadIT()”接口从芯片读取120个数据。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后。当每次产生中断会进入回调函数打印log,串口打印写入的120个数据和读取的120个数据,如果写入和读取的数据是相同则打印data correct,否则打印data err。 + +**【注意事项】** ++ 使用此示例代码必须外接flash芯片w25q32。 \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_interrupt_w25q32/src/sample_spi_interrupt_w25q32.c b/drivers_sample/spi/sample_spi_interrupt_w25q32/src/sample_spi_interrupt_w25q32.c new file mode 100644 index 000000000..41bf6eda9 --- /dev/null +++ b/drivers_sample/spi/sample_spi_interrupt_w25q32/src/sample_spi_interrupt_w25q32.c @@ -0,0 +1,286 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_spi_interrupt_w25q32.c + * @author MCU Driver Team + * @brief Sample for SPI Module Interrupt. + * @details This sample is used to operate the HAL interface on the W25Q32 chip of the flash. + * Write data and read data to address 0 of W25Q32 + */ + +#include "main.h" +#include "spi.h" +#include "debug.h" +#include "sample_spi_interrupt_w25q32.h" + +#define SPI_W25X_WRITE_ENABLE 0x06 +#define SPI_W25X_SECTOR_ERASE 0x20 +#define SPI_W25X_PAGE_PROGRAM 0x02 +#define SPI_W25X_READ_DATA 0x03 + +static unsigned char g_wirteEnableBuf; +static unsigned int g_flashAddr = 0; +static unsigned char g_writeBuf[120] = {0}; +static unsigned char g_recvBuf[120] = {0}; +static unsigned char g_writeCmdBuf[124] = {0}; +static unsigned char g_readCmdBuf[124] = {0}; +static unsigned char g_earseBuf[4] = {0}; + +/** + * @brief spi chip select callback function. + * @param handle SPI handle. + * @retval None + */ +void SPICsCallback(void *handle) +{ + SPI_Handle *spiHandle = (SPI_Handle *)handle; + /* USER CODE BEGIN SPICsCallback */ + if (g_spiSampleHandle.csCtrl == SPI_CHIP_SELECT) { + HAL_SPI_SetChipConfigSelectEx(spiHandle, HAL_SPI_CHIP_CONFIG_SOFR_UNSET); + } else { + HAL_SPI_SetChipConfigSelectEx(spiHandle, HAL_SPI_CHIP_CONFIG_SOFR_SET); + } + /* USER CODE END SPICsCallback */ +} + +/** + * @brief Spi interrupt sample w25q32 TxRx callback handle. + * @param handle SPI handle. + * @retval None. + */ +void TxRxSampleCallbackHandle(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("TxRxCpltCallbackHandle\r\n"); +} + +/** + * @brief Spi interrupt sample w25q32 Tx callback handle. + * @param handle SPI handle. + * @retval None. + */ +void TxSampleCallbackHandle(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("txCpltCallbackHandle\r\n"); +} + +/** + * @brief Spi interrupt sample w25q32 Rx callback handle. + * @param handle SPI handle. + * @retval None. + */ +void RxSampleCallbackHandle(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("RxCpltCallbackHandle\r\n"); +} + +/** + * @brief Spi interrupt sample w25q32 Error callback handle. + * @param handle SPI handle. + * @retval None. + */ +void ErrorSampleCallbackHandle(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("ErrorCallbackHandle\r\n"); +} + +/** + * @brief w25q32 enable the write function. + * @param None. + * @retval BASE_StatusType:OK, ERROR. + */ +static BASE_StatusType SPI_W25Q32_WriteEnable(void) +{ + g_wirteEnableBuf = SPI_W25X_WRITE_ENABLE; /* Write enable command */ + BASE_StatusType ret; + ret = HAL_SPI_WriteIT(&g_spiSampleHandle, (unsigned char *)&g_wirteEnableBuf, sizeof(g_wirteEnableBuf)); + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("enable error!\r\n"); + return BASE_STATUS_ERROR; + } + return BASE_STATUS_OK; +} + +/** + * @brief w25q32 sector erase function. + * @param sectorEraseAddr sector erase address. + * @retval BASE_StatusType:OK, ERROR. + */ +static BASE_StatusType SectorErase(unsigned int sectorEraseAddr) +{ + BASE_StatusType ret; + ret = SPI_W25Q32_WriteEnable(); + if (ret != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + BASE_FUNC_DELAY_MS(20); /* delay 20 ms */ + + g_earseBuf[0] = SPI_W25X_SECTOR_ERASE; /* Sector erase command */ + g_earseBuf[1] = (sectorEraseAddr & 0xFF0000) >> 16; /* Shift right by 16 bits */ + g_earseBuf[2] = (sectorEraseAddr & 0xFF00) >> 8; /* Shift right by 8 bits, 2 array subscript */ + g_earseBuf[3] = (sectorEraseAddr & 0xFF); /* Lower 8 bits of the sector erase address, 3 array subscript */ + ret = HAL_SPI_WriteIT(&g_spiSampleHandle, g_earseBuf, sizeof(g_earseBuf)); + if (ret != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + return BASE_STATUS_OK; +} + +/** + * @brief w25q32 single page write, maximum 256 bytes. + * @param writeBuf write data buffer. + * @param writeAddr write address. + * @param len data length. + * @retval BASE_StatusType:OK, ERROR. + */ +static BASE_StatusType WritePage(unsigned char *writeBuf, unsigned int writeAddr, unsigned int len) +{ + BASE_StatusType ret; + ret = SPI_W25Q32_WriteEnable(); /* enable the write */ + if (ret != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + BASE_FUNC_DELAY_MS(20); /* Delay 20 ms */ + + g_writeCmdBuf[0] = SPI_W25X_PAGE_PROGRAM; /* Page Program command */ + g_writeCmdBuf[1] = (writeAddr & 0xFF0000) >> 16; /* Shift right by 16 bits */ + g_writeCmdBuf[2] = (writeAddr & 0xFF00) >> 8; /* Shift right by 8 bits, 2 array subscript */ + g_writeCmdBuf[3] = (writeAddr & 0xFF); /* Lower 8 bits of the sector erase address, 3 array subscript */ + for (unsigned int count = 0; count < len; count++) { + g_writeCmdBuf[count + 4] = writeBuf[count]; /* data is stored from array subscript 4 */ + } + ret = HAL_SPI_WriteIT(&g_spiSampleHandle, g_writeCmdBuf, (len + 4)); /* len + 4 is total size */ + if (ret != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + return BASE_STATUS_OK; +} + +/** + * @brief Read data in the address. + * @param recvBuf write data buffer. + * @param recvAddr write address. + * @param len data length. + * @retval BASE_StatusType:OK, ERROR. + */ +static BASE_StatusType ReadData(unsigned char *recvBuf, unsigned int recvAddr, unsigned int len) +{ + BASE_StatusType ret; + g_readCmdBuf[0] = SPI_W25X_READ_DATA; /* Read data command */ + g_readCmdBuf[1] = (recvAddr & 0xFF0000) >> 16; /* Shift right by 16 bits */ + g_readCmdBuf[2] = (recvAddr & 0xFF00) >> 8; /* Shift right by 8 bits, 2 array subscript */ + g_readCmdBuf[3] = (recvAddr & 0xFF); /* Lower 8 bits of the sector erase address, 3 array subscript */ + + unsigned char readDataBuf[124] = {0}; + /* len + 4 is total size */ + ret = HAL_SPI_WriteReadIT(&g_spiSampleHandle, readDataBuf, g_readCmdBuf, (len + 4)); + if (ret != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + BASE_FUNC_DELAY_MS(200); /* Delay 200ms */ + for (unsigned int i = 0; i < len; i++) { + recvBuf[i] = readDataBuf[i + 4]; /* read valid data from array subscript 4 */ + } + return BASE_STATUS_OK; +} + +/** + * @brief Performs read data and write page on w25q32. + * @param None. + * @retval None. + */ +static void SPI_WritePageAndReadData(void) +{ + BASE_StatusType ret; + DBG_PRINTF("write data is : \r\n"); + unsigned int writeLen = 120; /* transfer 120 bytes of data */ + for (unsigned int i = 0; i < writeLen; i++) { + g_writeBuf[i] = i; + DBG_PRINTF("%d ", g_writeBuf[i]); + } + DBG_PRINTF("\r\n"); + ret = WritePage(g_writeBuf, g_flashAddr, writeLen); /* w25q32 single page write */ + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("write page failed!\r\n"); + } + + BASE_FUNC_DELAY_MS(5); /* Delay 5ms */ + + unsigned int recvLen = 120; /* 120 bytes of data needs to be received */ + for (unsigned int index = 0; index < recvLen; index++) { + g_recvBuf[index] = 0; + } + ret = ReadData(g_recvBuf, g_flashAddr, recvLen); /* Read data in the g_flashAddr address */ + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("read page failed!\r\n"); + } else { + DBG_PRINTF("read data is : \r\n"); + for (unsigned int i = 0; i < recvLen; i++) { + DBG_PRINTF("%d ", g_recvBuf[i]); /* print received Data */ + } + DBG_PRINTF("\r\n"); + } +} + +/** + * @brief Performs read and write operations on w25q32. + * @param None. + * @retval None. + */ +static void SPI_W25Q32_TEST(void) +{ + BASE_StatusType ret; + ret = SectorErase(g_flashAddr); /* w25q32 sector erase function */ + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("sector erase failed!\r\n"); + } + BASE_FUNC_DELAY_MS(500); /* Delay 500 ms */ + + SPI_WritePageAndReadData(); + + bool flag = true; + unsigned int recvLen = 120; + for (unsigned int i = 0; i < recvLen; i++) { + if (g_recvBuf[i] != g_writeBuf[i]) { /* compare the transmitted data with the received data */ + DBG_PRINTF("data err! \r\n"); + flag = false; + break; + } + } + if (flag) { + DBG_PRINTF("data correct \r\n"); + } + DBG_PRINTF("\r\n"); +} + +/** + * @brief Spi interrupt sample w25q32 processing. + * @param None. + * @retval None. + */ +void W25Q32InterruptSampleProcessing(void) +{ + SystemInit(); + HAL_SPI_SetChipConfigSelectEx(&g_spiSampleHandle, HAL_SPI_CHIP_CONFIG_SOFR_SET); + while (1) { + SPI_W25Q32_TEST(); + BASE_FUNC_DELAY_MS(2000); /* Delay 2000 ms */ + } +} diff --git a/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/inc/sample_spi_interrupt_w25q32_internal.h b/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/inc/sample_spi_interrupt_w25q32_internal.h new file mode 100644 index 000000000..1238e2bee --- /dev/null +++ b/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/inc/sample_spi_interrupt_w25q32_internal.h @@ -0,0 +1,28 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_spi_interrupt_w25q32_internal.h + * @author MCU Driver Team + * @brief SPI module sample. + * @details This file provides sample code for users to help use + * the functionalities of the SPI. + */ +#ifndef SAMPLE_SPI_INTERRUPT_W25Q32_INTERNAL_H +#define SAMPLE_SPI_INTERRUPT_W25Q32_INTERNAL_H + +void W25Q32InterruptSampleProcessing(void); +#endif \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/init/main.c b/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/init/main.c new file mode 100644 index 000000000..f03009588 --- /dev/null +++ b/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/init/main.c @@ -0,0 +1,51 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ + +#include "typedefs.h" +#include "feature.h" +#include "sample_spi_interrupt_w25q32_internal.h" +#include "main.h" +/* USER CODE BEGIN 0 */ +/* USER CODE END 0 */ +SPI_Handle g_spiSampleHandle; +UART_Handle g_uart0; +/* USER CODE BEGIN 1 */ +/* USER CODE END 1 */ + +int main(void) +{ + /* USER CODE BEGIN 2 */ + /* USER CODE END 2 */ + W25Q32InterruptSampleProcessing(); + /* USER CODE BEGIN 3 */ + /* USER CODE END 3 */ + while (1) { + /* USER CODE BEGIN 4 */ + /* USER CODE END 4 */ + } + /* USER CODE BEGIN 5 */ + /* USER CODE END 5 */ + return BASE_STATUS_OK; +} + +/* USER CODE BEGIN 6 */ +/* USER CODE END 6 */ \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/init/main.h b/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/init/main.h new file mode 100644 index 000000000..45a93ed2d --- /dev/null +++ b/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/init/main.h @@ -0,0 +1,56 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "spi.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define XTAL_DRV_LEVEL4 0x03U +#define XTAL_DRV_LEVEL3 0x02U +#define XTAL_DRV_LEVEL2 0x01U +#define XTAL_DRV_LEVEL1 0x00U + +extern SPI_Handle g_spiSampleHandle; +extern UART_Handle g_uart0; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +void TxSampleCallbackHandle(void *handle); +void RxSampleCallbackHandle(void *handle); +void TxRxSampleCallbackHandle(void *handle); +void ErrorSampleCallbackHandle(void *handle); +void SPICsCallback(void *handle); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/init/system_init.c b/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/init/system_init.c new file mode 100644 index 000000000..21a60100a --- /dev/null +++ b/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/init/system_init.c @@ -0,0 +1,203 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" +#include "iocmg.h" + +#define UART0_BAND_RATE 115200 + +#define SPI_FREQ_SCR 2 +#define SPI_FREQ_CPSDVSR 10 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { /* CRG init */ + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +__weak void TxSampleCallbackHandle(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN SPI_TX_COMPLETE_CB_ID */ + /* USER CODE END SPI_TX_COMPLETE_CB_ID */ +} + +__weak void RxSampleCallbackHandle(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN SPI_RX_COMPLETE_CB_ID */ + /* USER CODE END SPI_RX_COMPLETE_CB_ID */ +} + +__weak void TxRxSampleCallbackHandle(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN SPI_TX_RX_COMPLETE_CB_ID */ + /* USER CODE END SPI_TX_RX_COMPLETE_CB_ID */ +} + +__weak void ErrorSampleCallbackHandle(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN SPI_ERROR_CB_ID */ + /* USER CODE END SPI_ERROR_CB_ID */ +} + +__weak void SPICsCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN SPI_CS_CB_ID */ + /* USER CODE END SPI_CS_CB_ID */ +} + +static void SPI_Init(void) +{ + HAL_CRG_IpEnableSet(SPI_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(SPI_BASE, CRG_PLL_NO_PREDV); + + g_spiSampleHandle.baseAddress = SPI; + + g_spiSampleHandle.mode = HAL_SPI_MASTER; /* spi master */ + g_spiSampleHandle.csMode = SPI_CHIP_SELECT_MODE_INTERNAL; + g_spiSampleHandle.xFerMode = HAL_XFER_MODE_INTERRUPTS; + g_spiSampleHandle.clkPolarity = HAL_SPI_CLKPOL_0; /* spi ploarity is 0 */ + g_spiSampleHandle.clkPhase = HAL_SPI_CLKPHA_1; + g_spiSampleHandle.endian = HAL_SPI_BIG_ENDIAN; + g_spiSampleHandle.frameFormat = HAL_SPI_MODE_MOTOROLA; /* motorola frame format */ + g_spiSampleHandle.dataWidth = SPI_DATA_WIDTH_8BIT; + g_spiSampleHandle.freqScr = SPI_FREQ_SCR; + g_spiSampleHandle.freqCpsdvsr = SPI_FREQ_CPSDVSR; + g_spiSampleHandle.waitEn = BASE_CFG_DISABLE; + g_spiSampleHandle.waitVal = 127; /* mircowire wait time 127 */ + g_spiSampleHandle.rxBuff = NULL; + g_spiSampleHandle.txBuff = NULL; + g_spiSampleHandle.transferSize = 0; + g_spiSampleHandle.txCount = 0; /* transfer count */ + g_spiSampleHandle.rxCount = 0; + g_spiSampleHandle.state = HAL_SPI_STATE_RESET; + g_spiSampleHandle.rxIntSize = SPI_RX_INTERRUPT_SIZE_1; + g_spiSampleHandle.txIntSize = SPI_TX_INTERRUPT_SIZE_1; /* tx interrupt size */ + g_spiSampleHandle.rxDMABurstSize = SPI_RX_DMA_BURST_SIZE_1; + g_spiSampleHandle.txDMABurstSize = SPI_TX_DMA_BURST_SIZE_1; + HAL_SPI_Init(&g_spiSampleHandle); + + /* spi register callback */ + HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_TX_COMPLETE_CB_ID, TxSampleCallbackHandle); + HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_RX_COMPLETE_CB_ID, RxSampleCallbackHandle); + HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_TX_RX_COMPLETE_CB_ID, TxRxSampleCallbackHandle); + HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_ERROR_CB_ID, ErrorSampleCallbackHandle); + HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_CS_CB_ID, SPICsCallback); + /* spi interrupt setting */ + IRQ_Register(IRQ_SPI, HAL_SPI_IrqHandler, &g_spiSampleHandle); + IRQ_SetPriority(IRQ_SPI, 1); + IRQ_EnableN(IRQ_SPI); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); + + g_uart0.baseAddress = UART0; /* uart0 baseaaddress */ + + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; /* data length 8 */ + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; /* blocking mode */ + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + SYSCTRL0->SC_SYS_STAT.BIT.update_mode = 0; + SYSCTRL0->SC_SYS_STAT.BIT.update_mode_clear = 1; + HAL_IOCMG_SetPinAltFuncMode(IO6_AS_SSP0_CLK); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(IO6_AS_SSP0_CLK, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(IO6_AS_SSP0_CLK, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(IO6_AS_SSP0_CLK, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(IO6_AS_SSP0_CLK, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(IO2_AS_SSP0_CSN0); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(IO2_AS_SSP0_CSN0, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(IO2_AS_SSP0_CSN0, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(IO2_AS_SSP0_CSN0, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(IO2_AS_SSP0_CSN0, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(IO5_AS_SSP0_CSN1); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(IO5_AS_SSP0_CSN1, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(IO5_AS_SSP0_CSN1, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(IO5_AS_SSP0_CSN1, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(IO5_AS_SSP0_CSN1, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(IO4_AS_SSP0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(IO4_AS_SSP0_RXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(IO4_AS_SSP0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(IO4_AS_SSP0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(IO4_AS_SSP0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(IO3_AS_SSP0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(IO3_AS_SSP0_TXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(IO3_AS_SSP0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(IO3_AS_SSP0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(IO3_AS_SSP0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + /* UART RX recommend PULL_UP */ + HAL_IOCMG_SetPinAltFuncMode(IO53_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(IO53_AS_UART0_RXD, PULL_UP); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(IO53_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(IO53_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(IO53_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(IO52_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(IO52_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(IO52_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(IO52_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(IO52_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + SPI_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/readme.md b/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/readme.md new file mode 100644 index 000000000..9206fbbb1 --- /dev/null +++ b/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/readme.md @@ -0,0 +1,20 @@ +# 对接flash芯片w25q32,通过SPI的中断方式写入和读取w25q32芯片中的数据 +## 关键字: SPI, 中断, w25q32芯片 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、SPI控制器初始化和功能配置。SPI对接flash芯片w25q32,通过中断方式对w25q32芯片进行写入120个数据,之后从芯片中再读出120字节数据。 + +**【示例配置】** ++ 在"SystemInit()”接口中配置SPI时钟极性、时钟相位、帧格式等参数和DMA通道相关参数,需根据对接的芯片进行相关参数配置。 + ++ w25q32芯片扇区擦除:调用“SectorErase()”接口先对w25q32芯片进行擦写操作,内部调用接口“SPI_W25Q32_WriteEnable()”向w25q32发送写使能命令,之后发送擦写扇区命令。命令的发送都是调用“HAL_SPI_WriteIT()”接口。 + ++ 向w25q32芯片写数据:调用“WritePage()”接口进行数据写入,发送页写入命令和需要写入120个数据,调用“HAL_SPI_WriteIT()”接口。 + ++ 从w25q32芯片读数据:调用“ReadData()”接口进行读数据,发送读命令,调用“HAL_SPI_WriteReadIT()”接口从芯片读取120个数据。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后。当每次产生中断会进入回调函数打印log,串口打印写入的120个数据和读取的120个数据,如果写入和读取的数据是相同则打印data correct,否则打印data err。 + +**【注意事项】** ++ 使用此示例代码必须外接flash芯片w25q32。 \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/src/sample_spi_interrupt_w25q32_internal.c b/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/src/sample_spi_interrupt_w25q32_internal.c new file mode 100644 index 000000000..0c656b1d3 --- /dev/null +++ b/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/src/sample_spi_interrupt_w25q32_internal.c @@ -0,0 +1,268 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_spi_interrupt_w25q32_internal.c + * @author MCU Driver Team + * @brief Sample for SPI Module Interrupt. + * @details This sample is used to operate the HAL interface on the W25Q32 chip of the flash. + * Write data and read data to address 0 of W25Q32 + */ + +#include "main.h" +#include "spi.h" +#include "debug.h" +#include "sample_spi_interrupt_w25q32_internal.h" + +#define SPI_W25X_WRITE_ENABLE 0x06 +#define SPI_W25X_SECTOR_ERASE 0x20 +#define SPI_W25X_PAGE_PROGRAM 0x02 +#define SPI_W25X_READ_DATA 0x03 + +static unsigned char g_wirteEnableBuf; +static unsigned int g_flashAddr = 0; +static unsigned char g_writeBuf[120] = {0}; +static unsigned char g_recvBuf[120] = {0}; +static unsigned char g_writeCmdBuf[124] = {0}; +static unsigned char g_readCmdBuf[124] = {0}; +static unsigned char g_earseBuf[4] = {0}; + +/** + * @brief Spi interrupt sample w25q32 TxRx callback handle. + * @param handle SPI handle. + * @retval None. + */ +void TxRxSampleCallbackHandle(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("TxRxCpltCallbackHandle\r\n"); +} + +/** + * @brief Spi interrupt sample w25q32 Tx callback handle. + * @param handle SPI handle. + * @retval None. + */ +void TxSampleCallbackHandle(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("txCpltCallbackHandle\r\n"); +} + +/** + * @brief Spi interrupt sample w25q32 Rx callback handle. + * @param handle SPI handle. + * @retval None. + */ +void RxSampleCallbackHandle(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("RxCpltCallbackHandle\r\n"); +} + +/** + * @brief Spi interrupt sample w25q32 Error callback handle. + * @param handle SPI handle. + * @retval None. + */ +void ErrorSampleCallbackHandle(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("ErrorCallbackHandle\r\n"); +} + +/** + * @brief w25q32 enable the write function. + * @param None. + * @retval BASE_StatusType:OK, ERROR. + */ +static BASE_StatusType SPI_W25Q32_WriteEnable(void) +{ + g_wirteEnableBuf = SPI_W25X_WRITE_ENABLE; /* Write enable command */ + BASE_StatusType ret; + ret = HAL_SPI_WriteIT(&g_spiSampleHandle, (unsigned char *)&g_wirteEnableBuf, sizeof(g_wirteEnableBuf)); + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("enable error!\r\n"); + return BASE_STATUS_ERROR; + } + return BASE_STATUS_OK; +} + +/** + * @brief w25q32 sector erase function. + * @param sectorEraseAddr sector erase address. + * @retval BASE_StatusType:OK, ERROR. + */ +static BASE_StatusType SectorErase(unsigned int sectorEraseAddr) +{ + BASE_StatusType ret; + ret = SPI_W25Q32_WriteEnable(); + if (ret != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + BASE_FUNC_DELAY_MS(20); /* delay 20 ms */ + + g_earseBuf[0] = SPI_W25X_SECTOR_ERASE; /* Sector erase command */ + g_earseBuf[1] = (sectorEraseAddr & 0xFF0000) >> 16; /* Shift right by 16 bits */ + g_earseBuf[2] = (sectorEraseAddr & 0xFF00) >> 8; /* Shift right by 8 bits, 2 array subscript */ + g_earseBuf[3] = (sectorEraseAddr & 0xFF); /* Lower 8 bits of the sector erase address, 3 array subscript */ + ret = HAL_SPI_WriteIT(&g_spiSampleHandle, g_earseBuf, sizeof(g_earseBuf)); + if (ret != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + return BASE_STATUS_OK; +} + +/** + * @brief w25q32 single page write, maximum 256 bytes. + * @param writeBuf write data buffer. + * @param writeAddr write address. + * @param len data length. + * @retval BASE_StatusType:OK, ERROR. + */ +static BASE_StatusType WritePage(unsigned char *writeBuf, unsigned int writeAddr, unsigned int len) +{ + BASE_StatusType ret; + ret = SPI_W25Q32_WriteEnable(); /* enable the write */ + if (ret != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + BASE_FUNC_DELAY_MS(20); /* Delay 20 ms */ + + g_writeCmdBuf[0] = SPI_W25X_PAGE_PROGRAM; /* Page Program command */ + g_writeCmdBuf[1] = (writeAddr & 0xFF0000) >> 16; /* Shift right by 16 bits */ + g_writeCmdBuf[2] = (writeAddr & 0xFF00) >> 8; /* Shift right by 8 bits, 2 array subscript */ + g_writeCmdBuf[3] = (writeAddr & 0xFF); /* Lower 8 bits of the sector erase address, 3 array subscript */ + for (unsigned int count = 0; count < len; count++) { + g_writeCmdBuf[count + 4] = writeBuf[count]; /* data is stored from array subscript 4 */ + } + ret = HAL_SPI_WriteIT(&g_spiSampleHandle, g_writeCmdBuf, (len + 4)); /* len + 4 is total size */ + if (ret != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + return BASE_STATUS_OK; +} + +/** + * @brief Read data in the address. + * @param recvBuf write data buffer. + * @param recvAddr write address. + * @param len data length. + * @retval BASE_StatusType:OK, ERROR. + */ +static BASE_StatusType ReadData(unsigned char *recvBuf, unsigned int recvAddr, unsigned int len) +{ + BASE_StatusType ret; + g_readCmdBuf[0] = SPI_W25X_READ_DATA; /* Read data command */ + g_readCmdBuf[1] = (recvAddr & 0xFF0000) >> 16; /* Shift right by 16 bits */ + g_readCmdBuf[2] = (recvAddr & 0xFF00) >> 8; /* Shift right by 8 bits, 2 array subscript */ + g_readCmdBuf[3] = (recvAddr & 0xFF); /* Lower 8 bits of the sector erase address, 3 array subscript */ + + unsigned char readDataBuf[124] = {0}; + /* len + 4 is total size */ + ret = HAL_SPI_WriteReadIT(&g_spiSampleHandle, readDataBuf, g_readCmdBuf, (len + 4)); + if (ret != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + BASE_FUNC_DELAY_MS(200); /* Delay 200ms */ + for (unsigned int i = 0; i < len; i++) { + recvBuf[i] = readDataBuf[i + 4]; /* read valid data from array subscript 4 */ + } + return BASE_STATUS_OK; +} + +/** + * @brief Performs read data and write page on w25q32. + * @param None. + * @retval None. + */ +static void SPI_WritePageAndReadData(void) +{ + BASE_StatusType ret; + DBG_PRINTF("write data is : \r\n"); + unsigned int writeLen = 120; /* transfer 120 bytes of data */ + for (unsigned int i = 0; i < writeLen; i++) { + g_writeBuf[i] = i; + DBG_PRINTF("%d ", g_writeBuf[i]); + } + DBG_PRINTF("\r\n"); + ret = WritePage(g_writeBuf, g_flashAddr, writeLen); /* w25q32 single page write */ + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("write page failed!\r\n"); + } + + BASE_FUNC_DELAY_MS(5); /* Delay 5ms */ + + unsigned int recvLen = 120; /* 120 bytes of data needs to be received */ + for (unsigned int index = 0; index < recvLen; index++) { + g_recvBuf[index] = 0; + } + ret = ReadData(g_recvBuf, g_flashAddr, recvLen); /* Read data in the g_flashAddr address */ + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("read page failed!\r\n"); + } else { + DBG_PRINTF("read data is : \r\n"); + for (unsigned int i = 0; i < recvLen; i++) { + DBG_PRINTF("%d ", g_recvBuf[i]); /* print received Data */ + } + DBG_PRINTF("\r\n"); + } +} + +/** + * @brief Performs read and write operations on w25q32. + * @param None. + * @retval None. + */ +static void SPI_W25Q32_TEST(void) +{ + BASE_StatusType ret; + ret = SectorErase(g_flashAddr); /* w25q32 sector erase function */ + if (ret != BASE_STATUS_OK) { + DBG_PRINTF("sector erase failed!\r\n"); + } + BASE_FUNC_DELAY_MS(500); /* Delay 500 ms */ + + SPI_WritePageAndReadData(); + + bool flag = true; + unsigned int recvLen = 120; + for (unsigned int i = 0; i < recvLen; i++) { + if (g_recvBuf[i] != g_writeBuf[i]) { /* compare the transmitted data with the received data */ + DBG_PRINTF("data err! \r\n"); + flag = false; + break; + } + } + if (flag) { + DBG_PRINTF("data correct \r\n"); + } + DBG_PRINTF("\r\n"); +} + +/** + * @brief Spi interrupt sample w25q32 processing. + * @param None. + * @retval None. + */ +void W25Q32InterruptSampleProcessing(void) +{ + SystemInit(); + while (1) { + SPI_W25Q32_TEST(); + BASE_FUNC_DELAY_MS(2000); /* Delay 2000 ms */ + } +} diff --git a/drivers_sample/spi/sample_spi_master/inc/sample_spi_master.h b/drivers_sample/spi/sample_spi_master/inc/sample_spi_master.h new file mode 100644 index 000000000..c35468912 --- /dev/null +++ b/drivers_sample/spi/sample_spi_master/inc/sample_spi_master.h @@ -0,0 +1,28 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_spi_master.h + * @author MCU Driver Team + * @brief SPI module driver. + * @details This file provides sample code for users to help use + * the functionalities of the SPI. + */ +#ifndef McuMagicTag_SAMPLE_SPI_MASTER_H +#define McuMagicTag_SAMPLE_SPI_MASTER_H + +void MasterTestSampleProcessing(void); +#endif \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_master/init/main.c b/drivers_sample/spi/sample_spi_master/init/main.c new file mode 100644 index 000000000..f35db2277 --- /dev/null +++ b/drivers_sample/spi/sample_spi_master/init/main.c @@ -0,0 +1,50 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ + +#include "typedefs.h" +#include "feature.h" +#include "main.h" +/* USER CODE BEGIN 0 */ +/* USER CODE END 0 */ +UART_Handle g_uart0; +SPI_Handle g_spiSampleHandle; +/* USER CODE BEGIN 1 */ +/* USER CODE END 1 */ + +int main(void) +{ + /* USER CODE BEGIN 2 */ + /* USER CODE END 2 */ + MasterTestSampleProcessing(); + /* USER CODE BEGIN 3 */ + /* USER CODE END 3 */ + while (1) { + /* USER CODE BEGIN 4 */ + /* USER CODE END 4 */ + } + /* USER CODE BEGIN 5 */ + /* USER CODE END 5 */ + return BASE_STATUS_OK; +} + +/* USER CODE BEGIN 6 */ +/* USER CODE END 6 */ \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_master/init/main.h b/drivers_sample/spi/sample_spi_master/init/main.h new file mode 100644 index 000000000..f2ff5b487 --- /dev/null +++ b/drivers_sample/spi/sample_spi_master/init/main.h @@ -0,0 +1,50 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "spi.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define XTAL_DRV_LEVEL4 0x03U +#define XTAL_DRV_LEVEL3 0x02U +#define XTAL_DRV_LEVEL2 0x01U +#define XTAL_DRV_LEVEL1 0x00U + +extern UART_Handle g_uart0; +extern SPI_Handle g_spiSampleHandle; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_master/init/system_init.c b/drivers_sample/spi/sample_spi_master/init/system_init.c new file mode 100644 index 000000000..009044a72 --- /dev/null +++ b/drivers_sample/spi/sample_spi_master/init/system_init.c @@ -0,0 +1,157 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" +#include "iocmg_ip.h" + +#define UART0_BAND_RATE 115200 + +#define SPI1_FREQ_SCR 2 +#define SPI1_FREQ_CPSDVSR 10 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; /* crg baseaddress */ + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_1; + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { /* CRG init */ + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void SPI1_Init(void) +{ + HAL_CRG_IpEnableSet(SPI1_BASE, IP_CLK_ENABLE); + + g_spiSampleHandle.baseAddress = SPI1; + + g_spiSampleHandle.mode = HAL_SPI_MASTER; /* spi master */ + g_spiSampleHandle.csMode = SPI_CHIP_SELECT_MODE_INTERNAL; + g_spiSampleHandle.xFerMode = HAL_XFER_MODE_BLOCKING; + g_spiSampleHandle.clkPolarity = HAL_SPI_CLKPOL_0; /* spi ploarity is 0 */ + g_spiSampleHandle.clkPhase = HAL_SPI_CLKPHA_0; + g_spiSampleHandle.endian = HAL_SPI_BIG_ENDIAN; + g_spiSampleHandle.frameFormat = HAL_SPI_MODE_MOTOROLA; /* motorola frame format */ + g_spiSampleHandle.dataWidth = SPI_DATA_WIDTH_16BIT; + g_spiSampleHandle.freqScr = SPI1_FREQ_SCR; + g_spiSampleHandle.freqCpsdvsr = SPI1_FREQ_CPSDVSR; + g_spiSampleHandle.waitEn = BASE_CFG_DISABLE; + g_spiSampleHandle.waitVal = 127; /* mircowire wait time 127 */ + g_spiSampleHandle.rxBuff = NULL; + g_spiSampleHandle.txBuff = NULL; + g_spiSampleHandle.transferSize = 0; + g_spiSampleHandle.txCount = 0; /* transfer count */ + g_spiSampleHandle.rxCount = 0; + g_spiSampleHandle.state = HAL_SPI_STATE_RESET; + g_spiSampleHandle.rxIntSize = SPI_RX_INTERRUPT_SIZE_1; + g_spiSampleHandle.txIntSize = SPI_TX_INTERRUPT_SIZE_1; /* tx interrupt size */ + g_spiSampleHandle.rxDMABurstSize = SPI_RX_DMA_BURST_SIZE_1; + g_spiSampleHandle.txDMABurstSize = SPI_TX_DMA_BURST_SIZE_1; + HAL_SPI_Init(&g_spiSampleHandle); + HAL_SPI_ChipSelectChannelSet(&g_spiSampleHandle, SPI_CHIP_SELECT_CHANNEL_1); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + + g_uart0.baseAddress = UART0; /* uart0 baseaaddress */ + + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; /* data length 8 */ + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; /* blocking mode */ + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; /* fifo size 8 */ + g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO4_6_AS_SPI1_CLK); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO4_6_AS_SPI1_CLK, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO4_6_AS_SPI1_CLK, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO4_6_AS_SPI1_CLK, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO4_6_AS_SPI1_CLK, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO1_3_AS_SPI1_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO1_3_AS_SPI1_TXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO1_3_AS_SPI1_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO1_3_AS_SPI1_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO1_3_AS_SPI1_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO1_4_AS_SPI1_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO1_4_AS_SPI1_RXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO1_4_AS_SPI1_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO1_4_AS_SPI1_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO1_4_AS_SPI1_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO4_5_AS_SPI1_CSN0); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO4_5_AS_SPI1_CSN0, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO4_5_AS_SPI1_CSN0, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO4_5_AS_SPI1_CSN0, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO4_5_AS_SPI1_CSN0, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO3_0_AS_SPI1_CSN1); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO3_0_AS_SPI1_CSN1, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO3_0_AS_SPI1_CSN1, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO3_0_AS_SPI1_CSN1, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO3_0_AS_SPI1_CSN1, DRIVER_RATE_2); /* Output signal edge fast/slow */ +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + SPI1_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_master/readme.md b/drivers_sample/spi/sample_spi_master/readme.md new file mode 100644 index 000000000..7cbffc8ed --- /dev/null +++ b/drivers_sample/spi/sample_spi_master/readme.md @@ -0,0 +1,18 @@ +# SPI使用阻塞方式进行主从通信,此示例代码作为主机使用 +## 关键字: SPI, 阻塞, 主机 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、SPI控制器初始化和功能配置。主机读从机数据或者向从机发送数据。 + +**【示例配置】** ++ 在"SystemInit()”接口中配置SPI时钟极性、时钟相位、帧格式等参数。 + ++ 定义数组,数组中存放主机需要发送的数据。 + ++ 首先主机调用“HAL_SPI_WriteBlocking()”向从机发送10个数据,之后调用“HAL_SPI_ReadBlocking()”读10个数据,最后调用“HAL_SPI_WriteReadBlocking()”边写边读10个数据,不断循环。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码通过串口不断打印主机接收到的数据、发送的数据。 + +**【注意事项】** ++ 使用此示例代码必须对接spi_slave一起使用,使用两个设备一个做master一个做slave。 \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_master/src/sample_spi_master.c b/drivers_sample/spi/sample_spi_master/src/sample_spi_master.c new file mode 100644 index 000000000..8929dd5c1 --- /dev/null +++ b/drivers_sample/spi/sample_spi_master/src/sample_spi_master.c @@ -0,0 +1,97 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_spi_master.c + * @author MCU Driver Team + * @brief Sample for SPI Module master. + * @details This sample demonstrates the use of HAL interfaces in the master mode. This sample uses the blocking mode. + * This sample must be connected to the slave device. + * This sample code corresponds to sample_spi_slave.c code. + * This sample sends 0x1001, 0x1002, 0x1003, 0x1004, 0x1005, 0x1006, and 0x1007 in polling mode. + * Print the received and sent data through the serial port. + */ +#include "main.h" +#include "spi.h" +#include "debug.h" +#include "sample_spi_master.h" + +#define MASTER_READ_TESE +#define MASTER_READ_WRITE_TESE +#define MASTER_WRITE_TESE + +#define USER_TIMEOUT 0x400 + +#define MANUAL_MODE_SET_CH0 0x1001 +#define MANUAL_MODE_SET_CH1 0x1002 +#define MANUAL_MODE_SET_CH2 0x1003 +#define MANUAL_MODE_SET_CH3 0x1004 +#define MANUAL_MODE_SET_CH4 0x1005 +#define MANUAL_MODE_SET_CH5 0x1006 +#define MANUAL_MODE_SET_CH6 0x1007 + +#define MAX_TIMEOUT_VAL 5000 + + +/** + * @brief Spi master sample processing. + * @param None. + * @retval None. + */ +void MasterTestSampleProcessing(void) +{ + unsigned short tempWdata[] = { + MANUAL_MODE_SET_CH0, + MANUAL_MODE_SET_CH1, + MANUAL_MODE_SET_CH2, + MANUAL_MODE_SET_CH3, + MANUAL_MODE_SET_CH4, + MANUAL_MODE_SET_CH5, + MANUAL_MODE_SET_CH6, + MANUAL_MODE_SET_CH2, + MANUAL_MODE_SET_CH3, + MANUAL_MODE_SET_CH4 + }; + unsigned short tempRdata[10] = {0}; + + SystemInit(); + while (1) { +#ifdef MASTER_WRITE_TESE + for (int i = 0; i < 10; i++) { /* Print the test data for 10 times. */ + DBG_PRINTF("tempWdata[%d] = 0x%x \r\n", i, tempWdata[i]); + } + HAL_SPI_WriteBlocking(&g_spiSampleHandle, (unsigned char *)tempWdata, sizeof(tempWdata), MAX_TIMEOUT_VAL); +#endif + BASE_FUNC_DELAY_MS(300); /* Delay 300ms */ +#ifdef MASTER_READ_TESE + HAL_SPI_ReadBlocking(&g_spiSampleHandle, (unsigned char *)tempRdata, sizeof(tempRdata), MAX_TIMEOUT_VAL); + for (int i = 0; i < 10; i++) { /* Print the test data for 10 times. */ + DBG_PRINTF("tempRdata[%d] = 0x%x \r\n", i, tempRdata[i]); + } +#endif + BASE_FUNC_DELAY_MS(20); /* Delay 20ms */ +#ifdef MASTER_READ_WRITE_TESE + HAL_SPI_WriteReadBlocking(&g_spiSampleHandle, (unsigned char *)tempRdata, + (unsigned char *)tempWdata, + sizeof(tempWdata), MAX_TIMEOUT_VAL); + for (int i = 0; i < 10; i++) { /* Print the test data for 10 times. */ + DBG_PRINTF("tempRdata[%d] = 0x%x tempWdata[%d] = 0x%x \r\n", i, tempRdata[i], i, tempWdata[i]); + BASE_FUNC_DELAY_MS(10); /* Delay 10ms */ + } +#endif + BASE_FUNC_DELAY_MS(20); /* Delay 20ms */ + } +} diff --git a/drivers_sample/spi/sample_spi_microwire_master/inc/sample_spi_microwire_master.h b/drivers_sample/spi/sample_spi_microwire_master/inc/sample_spi_microwire_master.h new file mode 100644 index 000000000..775047b8b --- /dev/null +++ b/drivers_sample/spi/sample_spi_microwire_master/inc/sample_spi_microwire_master.h @@ -0,0 +1,28 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_spi_microwire_master.h + * @author MCU Driver Team + * @brief SPI module driver. + * @details This file provides sample code for users to help use + * the functionalities of the SPI. + */ +#ifndef McuMagicTag_SAMPLE_SPI_MICROWRITE_MASTER_H +#define McuMagicTag_SAMPLE_SPI_MICROWRITE_MASTER_H + +void MicroWireMasterTestSampleProcessing(void); +#endif \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_microwire_master/init/main.c b/drivers_sample/spi/sample_spi_microwire_master/init/main.c new file mode 100644 index 000000000..aaeaa52e0 --- /dev/null +++ b/drivers_sample/spi/sample_spi_microwire_master/init/main.c @@ -0,0 +1,34 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ +#include "feature.h" +#include "main.h" +#include "sample_spi_microwire_master.h" + +SPI_Handle g_spiSampleHandle; + +int main(void) +{ + MicroWireMasterTestSampleProcessing(); + while (1) { + } + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_microwire_master/init/main.h b/drivers_sample/spi/sample_spi_microwire_master/init/main.h new file mode 100644 index 000000000..9a1c68192 --- /dev/null +++ b/drivers_sample/spi/sample_spi_microwire_master/init/main.h @@ -0,0 +1,43 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "spi.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +extern SPI_Handle g_spiSampleHandle; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_microwire_master/init/system_init.c b/drivers_sample/spi/sample_spi_microwire_master/init/system_init.c new file mode 100644 index 000000000..70b9fbd99 --- /dev/null +++ b/drivers_sample/spi/sample_spi_microwire_master/init/system_init.c @@ -0,0 +1,125 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" + +#define SPI_FREQ_SCR 2 +#define SPI_FREQ_CPSDVSR 10 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void SPI_Init(void) +{ + HAL_CRG_IpEnableSet(SPI_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(SPI_BASE, CRG_PLL_NO_PREDV); + + g_spiSampleHandle.baseAddress = SPI; + g_spiSampleHandle.irqNum = IRQ_SPI; + + g_spiSampleHandle.mode = HAL_SPI_MASTER; + g_spiSampleHandle.csMode = SPI_CHIP_SELECT_MODE_INTERNAL; + g_spiSampleHandle.xFerMode = HAL_XFER_MODE_BLOCKING; + g_spiSampleHandle.clkPolarity = 0; + g_spiSampleHandle.clkPhase = 0; + g_spiSampleHandle.endian = HAL_SPI_BIG_ENDIAN; + g_spiSampleHandle.frameFormat = HAL_SPI_MODE_MICROWIRE; + g_spiSampleHandle.dataWidth = SPI_DATA_WIDTH_8BIT; + g_spiSampleHandle.freqScr = SPI_FREQ_SCR; + g_spiSampleHandle.freqCpsdvsr = SPI_FREQ_CPSDVSR; + g_spiSampleHandle.waitVal = 127; /* Wait time is 127 clock */ + g_spiSampleHandle.rxBuff = NULL; + g_spiSampleHandle.txBuff = NULL; + g_spiSampleHandle.transferSize = 0; + g_spiSampleHandle.txCount = 0; + g_spiSampleHandle.rxCount = 0; + g_spiSampleHandle.state = HAL_SPI_STATE_RESET; + g_spiSampleHandle.rxIntSize = SPI_RX_INTERRUPT_SIZE_1; + g_spiSampleHandle.txIntSize = SPI_TX_INTERRUPT_SIZE_1; + g_spiSampleHandle.rxDMABurstSize = SPI_RX_DMA_BURST_SIZE_1; + g_spiSampleHandle.txDMABurstSize = SPI_TX_DMA_BURST_SIZE_1; + + HAL_SPI_Init(&g_spiSampleHandle); +} + +static void IOConfig(void) +{ + IOConfig_RegStruct *iconfig = IOCONFIG; + + iconfig->iocmg_22.BIT.func = 0x5; /* 0x5 is SPI_CLK */ + iconfig->iocmg_22.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_22.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_22.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_22.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_22.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_18.BIT.func = 0x5; /* 0x5 is SPI_CSN0 */ + iconfig->iocmg_18.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_18.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_18.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_18.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_18.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_21.BIT.func = 0x5; /* 0x5 is SPI_CSN1 */ + iconfig->iocmg_21.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_21.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_21.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_21.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_21.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_20.BIT.func = 0x5; /* 0x5 is SPI_RXD */ + iconfig->iocmg_20.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_20.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_20.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_20.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_20.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_19.BIT.func = 0x5; /* 0x5 is SPI_TXD */ + iconfig->iocmg_19.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_19.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_19.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_19.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_19.BIT.se = BASE_CFG_DISABLE; +} + +void SystemInit(void) +{ + IOConfig(); + SPI_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_microwire_master/readme.md b/drivers_sample/spi/sample_spi_microwire_master/readme.md new file mode 100644 index 000000000..77708a895 --- /dev/null +++ b/drivers_sample/spi/sample_spi_microwire_master/readme.md @@ -0,0 +1,26 @@ +# SPI使用Mircowire帧格式进行主从通信,此示例代码作为主机使用 +## 关键字: SPI, Mircowire, 主机 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、SPI控制器初始化和功能配置。Mircowire主机发送不同的数据给从机,从机发送数据给主机,主机进行读取。 ++ 发送 <-> 接收 +0xFF -> 0xFFFF +0x1C -> 0x1C20 +0x83 -> 0x1183 +0x85 -> 0x1285 +0x40 -> 0x1240 +0xc0 -> 0x12C0 +0x13 -> 0x1340 + +**【示例配置】** ++ 在"SystemInit()”接口中配置SPI时钟极性、时钟相位、帧格式等参数。 + ++ 定义数组,数组中存放主机需要发送的数据。 + ++ 每次采用“HAL_SPI_WriteBlocking()”发送数据,“HAL_SPI_ReadBlocking()”读取数据,不断循环进行。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码通过串口打印主机发送的数据和接收到的数据。 + +**【注意事项】** ++ 此示例必须配合sample_spi_microwire_slave一起使用,使用两个设备一个做master一个做slave。 \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_microwire_master/src/sample_spi_microwire_master.c b/drivers_sample/spi/sample_spi_microwire_master/src/sample_spi_microwire_master.c new file mode 100644 index 000000000..04585dacd --- /dev/null +++ b/drivers_sample/spi/sample_spi_microwire_master/src/sample_spi_microwire_master.c @@ -0,0 +1,84 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_spi_microwire_master.c + * @author MCU Driver Team + * @brief Sample for SPI Module microwire master. + * @details This sample demonstrates how to use the HAL interface to perform operations on the microwire master. + * The microwire master sends different commands to the microwire slave to obtain different data: + * 0xFF->0xFFFF + * 0x1C->0x1C20 + * 0x83->0x1183 + * 0x85->0x1285 + * 0x40->0x1240 + * 0xc0->0x12C0 + * 0x13->0x1340 + * This sample must be used together with sample_spi_microwire_slave. One device functions as the + * master device and the other as the slave device. + */ +#include "main.h" +#include "spi.h" +#include "debug.h" +#include "sample_spi_microwire_master.h" + +#define USER_TIMEOUT 0x400 + +#define MANUAL_MODE_SET_CH0 0xFF +#define MANUAL_MODE_SET_CH1 0x1c +#define MANUAL_MODE_SET_CH2 0x83 +#define MANUAL_MODE_SET_CH3 0x85 +#define MANUAL_MODE_SET_CH4 0x40 +#define MANUAL_MODE_SET_CH5 0xC0 +#define MANUAL_MODE_SET_CH6 0x13 + +#define MAX_TIMEOUT_VAL 5000 + +/** + * @brief Spi microwire master sample processing. + * @param None. + * @retval None. + */ +void MicroWireMasterTestSampleProcessing(void) +{ + unsigned short tempWdata[] = { + MANUAL_MODE_SET_CH0, + MANUAL_MODE_SET_CH1, + MANUAL_MODE_SET_CH2, + MANUAL_MODE_SET_CH3, + MANUAL_MODE_SET_CH4, + MANUAL_MODE_SET_CH5, + MANUAL_MODE_SET_CH6, + MANUAL_MODE_SET_CH2, + MANUAL_MODE_SET_CH3, + MANUAL_MODE_SET_CH4 + }; + unsigned short tempRdata[10] = {0}; + + SystemInit(); + while (1) { + for (int i = 0; i < 7; i++) { /* Test 7 times */ + HAL_SPI_WriteBlocking(&g_spiSampleHandle, (unsigned char *)&tempWdata[i], + sizeof(tempWdata[i]), MAX_TIMEOUT_VAL); + HAL_SPI_ReadBlocking(&g_spiSampleHandle, (unsigned char *)&tempRdata[i], + sizeof(tempRdata[i]), MAX_TIMEOUT_VAL); + BASE_FUNC_DELAY_MS(100); /* Delay 100ms */ + DBG_PRINTF("tempWdata[%d] = 0x%x \r\n", i, tempWdata[i]); + DBG_PRINTF("tempRdata[%d] = 0x%x \r\n", i, tempRdata[i]); + } + BASE_FUNC_DELAY_MS(1000); /* Delay 1000ms */ + } +} \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_microwire_slave/inc/sample_spi_microwire_slave.h b/drivers_sample/spi/sample_spi_microwire_slave/inc/sample_spi_microwire_slave.h new file mode 100644 index 000000000..4e2f8b390 --- /dev/null +++ b/drivers_sample/spi/sample_spi_microwire_slave/inc/sample_spi_microwire_slave.h @@ -0,0 +1,28 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_spi_microwire_slave.h + * @author MCU Driver Team + * @brief SPI module driver. + * @details This file provides sample code for users to help use + * the functionalities of the SPI. + */ +#ifndef McuMagicTag_SAMPLE_SPI_MICROWRITE_SLAVE_H +#define McuMagicTag_SAMPLE_SPI_MICROWRITE_SLAVE_H + +void MicroWireSlaveTestSampleProcessing(void); +#endif \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_microwire_slave/init/main.c b/drivers_sample/spi/sample_spi_microwire_slave/init/main.c new file mode 100644 index 000000000..45d94ea93 --- /dev/null +++ b/drivers_sample/spi/sample_spi_microwire_slave/init/main.c @@ -0,0 +1,35 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ +#include "feature.h" +#include "main.h" +#include "sample_spi_microwire_slave.h" + +SPI_Handle g_spiSampleHandle; +UART_Handle g_uart0; + +int main(void) +{ + MicroWireSlaveTestSampleProcessing(); + while (1) { + } + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_microwire_slave/init/main.h b/drivers_sample/spi/sample_spi_microwire_slave/init/main.h new file mode 100644 index 000000000..8467e01ce --- /dev/null +++ b/drivers_sample/spi/sample_spi_microwire_slave/init/main.h @@ -0,0 +1,46 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "spi.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +extern SPI_Handle g_spiSampleHandle; + +extern UART_Handle g_uart0; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_microwire_slave/init/system_init.c b/drivers_sample/spi/sample_spi_microwire_slave/init/system_init.c new file mode 100644 index 000000000..773a34d97 --- /dev/null +++ b/drivers_sample/spi/sample_spi_microwire_slave/init/system_init.c @@ -0,0 +1,163 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" + +#define UART0_BAND_RATE 115200 + +#define SPI_FREQ_SCR 2 +#define SPI_FREQ_CPSDVSR 10 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void SPI_Init(void) +{ + HAL_CRG_IpEnableSet(SPI_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(SPI_BASE, CRG_PLL_NO_PREDV); + + g_spiSampleHandle.baseAddress = SPI; + g_spiSampleHandle.irqNum = IRQ_SPI; + + g_spiSampleHandle.mode = HAL_SPI_SLAVE; + g_spiSampleHandle.csMode = SPI_CHIP_SELECT_MODE_INTERNAL; + g_spiSampleHandle.xFerMode = HAL_XFER_MODE_BLOCKING; + g_spiSampleHandle.clkPolarity = 0; + g_spiSampleHandle.clkPhase = 0; + g_spiSampleHandle.endian = HAL_SPI_BIG_ENDIAN; + g_spiSampleHandle.frameFormat = HAL_SPI_MODE_MICROWIRE; + g_spiSampleHandle.dataWidth = SPI_DATA_WIDTH_8BIT; + g_spiSampleHandle.freqScr = SPI_FREQ_SCR; + g_spiSampleHandle.freqCpsdvsr = SPI_FREQ_CPSDVSR; + g_spiSampleHandle.waitVal = 127; /* Wait time is 127 clock */ + g_spiSampleHandle.rxBuff = NULL; + g_spiSampleHandle.txBuff = NULL; + g_spiSampleHandle.transferSize = 0; + g_spiSampleHandle.txCount = 0; + g_spiSampleHandle.rxCount = 0; + g_spiSampleHandle.state = HAL_SPI_STATE_RESET; + g_spiSampleHandle.rxIntSize = SPI_RX_INTERRUPT_SIZE_1; + g_spiSampleHandle.txIntSize = SPI_TX_INTERRUPT_SIZE_1; + g_spiSampleHandle.rxDMABurstSize = SPI_RX_DMA_BURST_SIZE_1; + g_spiSampleHandle.txDMABurstSize = SPI_TX_DMA_BURST_SIZE_1; + + HAL_SPI_Init(&g_spiSampleHandle); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); + + g_uart0.baseAddress = UART0; + g_uart0.irqNum = IRQ_UART0; + + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + IOConfig_RegStruct *iconfig = IOCONFIG; + + iconfig->iocmg_22.BIT.func = 0x5; /* 0x5 is SPI_CLK */ + iconfig->iocmg_22.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_22.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_22.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_22.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_22.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_18.BIT.func = 0x5; /* 0x5 is SPI_CSN0 */ + iconfig->iocmg_18.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_18.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_18.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_18.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_18.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_21.BIT.func = 0x5; /* 0x5 is SPI_CSN1 */ + iconfig->iocmg_21.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_21.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_21.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_21.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_21.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_20.BIT.func = 0x5; /* 0x5 is SPI_RXD */ + iconfig->iocmg_20.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_20.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_20.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_20.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_20.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_19.BIT.func = 0x5; /* 0x5 is SPI_TXD */ + iconfig->iocmg_19.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_19.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_19.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_19.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_19.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ + iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ + iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + SPI_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_microwire_slave/readme.md b/drivers_sample/spi/sample_spi_microwire_slave/readme.md new file mode 100644 index 000000000..4d4a8a006 --- /dev/null +++ b/drivers_sample/spi/sample_spi_microwire_slave/readme.md @@ -0,0 +1,26 @@ +# SPI使用Mircowire帧格式进行主从通信,此示例代码作为从机使用 +## 关键字: SPI, Mircowire, 从机 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、SPI控制器初始化和功能配置。Mircowire从机接收到主机发送的不同数据,来回应给主机不同的数据。 ++ 接收 <-> 发送 +0xFF -> 0xFFFF +0x1C -> 0x1C20 +0x83 -> 0x1183 +0x85 -> 0x1285 +0x40 -> 0x1240 +0xc0 -> 0x12C0 +0x13 -> 0x1340 + +**【示例配置】** ++ 在"SystemInit()”接口中配置SPI时钟极性、时钟相位、帧格式等参数。 + ++ 定义数组,数组中存放从机需要发送的数据。 + ++ 首先从机调用“HAL_SPI_ReadBlocking()”读取主机发过来的数据,根据不同的数据调用“HAL_SPI_WriteBlocking()”发送对应的数据,不断循环进行。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码通过串口不断打印从机接收到的数据。 + +**【注意事项】** ++ 此示例必须配合sample_spi_microwire_master一起使用,使用两个设备一个做master一个做slave。 \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_microwire_slave/src/sample_spi_microwire_slave.c b/drivers_sample/spi/sample_spi_microwire_slave/src/sample_spi_microwire_slave.c new file mode 100644 index 000000000..cb80590c6 --- /dev/null +++ b/drivers_sample/spi/sample_spi_microwire_slave/src/sample_spi_microwire_slave.c @@ -0,0 +1,118 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_spi_microwire_slave.c + * @author MCU Driver Team + * @brief Sample for SPI Module microwire slave. + * @details This sample demonstrates how to use the HAL interface to perform operations on the microwire master. + * The microwire slave receives different commands sent by the master and responds with different data.: + * 0xFF->0xFFFF + * 0x1C->0x1C20 + * 0x83->0x1183 + * 0x85->0x1285 + * 0x40->0x1240 + * 0xc0->0x12C0 + * 0x13->0x1340 + * This sample must be used together with sample_spi_microwire_master. One device functions as the + * master device and the other as the slave device. + */ +#include "main.h" +#include "spi.h" +#include "debug.h" +#include "sample_spi_microwire_slave.h" + +#define USER_TIMEOUT 0x400 + +#define MANUAL_MODE_SET_CH0 0xFFFF +#define MANUAL_MODE_SET_CH1 0x1c20 +#define MANUAL_MODE_SET_CH2 0x1183 +#define MANUAL_MODE_SET_CH3 0x1285 +#define MANUAL_MODE_SET_CH4 0x1240 +#define MANUAL_MODE_SET_CH5 0x12C0 +#define MANUAL_MODE_SET_CH6 0x1340 + +#define MANUAL_MODE_SET_CH0_RX 0xFF +#define MANUAL_MODE_SET_CH1_RX 0x1c +#define MANUAL_MODE_SET_CH2_RX 0x83 +#define MANUAL_MODE_SET_CH3_RX 0x85 +#define MANUAL_MODE_SET_CH4_RX 0x40 +#define MANUAL_MODE_SET_CH5_RX 0xC0 +#define MANUAL_MODE_SET_CH6_RX 0x13 + +#define MAX_TIMEOUT_VAL 5000 + +/** + * @brief Spi microwire slave sample processing. + * @param None. + * @retval None. + */ +void MicroWireSlaveTestSampleProcessing(void) +{ + unsigned short tempWdata[] = { + MANUAL_MODE_SET_CH0, MANUAL_MODE_SET_CH1, + MANUAL_MODE_SET_CH2, MANUAL_MODE_SET_CH3, + MANUAL_MODE_SET_CH4, MANUAL_MODE_SET_CH5, + MANUAL_MODE_SET_CH6, MANUAL_MODE_SET_CH2, + MANUAL_MODE_SET_CH3, MANUAL_MODE_SET_CH4 + }; + unsigned short tempRxData = 0; + + SystemInit(); + while (1) { + HAL_SPI_ReadBlocking(&g_spiSampleHandle, (unsigned char *)&tempRxData, sizeof(tempRxData), MAX_TIMEOUT_VAL); + switch (tempRxData) { + case MANUAL_MODE_SET_CH0_RX : + /* Send the 0 piece of data. */ + HAL_SPI_WriteBlocking(&g_spiSampleHandle, (unsigned char *)&tempWdata[0], + sizeof(tempWdata[0]), MAX_TIMEOUT_VAL); /* Send the 0 piece of data. */ + break; + case MANUAL_MODE_SET_CH1_RX : + /* Send the 1 piece of data. */ + HAL_SPI_WriteBlocking(&g_spiSampleHandle, (unsigned char *)&tempWdata[1], + sizeof(tempWdata[1]), MAX_TIMEOUT_VAL); /* Send the 1 piece of data. */ + break; + case MANUAL_MODE_SET_CH2_RX : + /* Send the 2 piece of data. */ + HAL_SPI_WriteBlocking(&g_spiSampleHandle, (unsigned char *)&tempWdata[2], + sizeof(tempWdata[2]), MAX_TIMEOUT_VAL); /* Send the 2 piece of data. */ + break; + case MANUAL_MODE_SET_CH3_RX : + /* Send the 3 piece of data. */ + HAL_SPI_WriteBlocking(&g_spiSampleHandle, (unsigned char *)&tempWdata[3], + sizeof(tempWdata[3]), MAX_TIMEOUT_VAL); /* Send the 3 piece of data. */ + break; + case MANUAL_MODE_SET_CH4_RX : + /* Send the 4 piece of data. */ + HAL_SPI_WriteBlocking(&g_spiSampleHandle, (unsigned char *)&tempWdata[4], + sizeof(tempWdata[4]), MAX_TIMEOUT_VAL); /* Send the 4 piece of data. */ + break; + case MANUAL_MODE_SET_CH5_RX : + /* Send the 5 piece of data. */ + HAL_SPI_WriteBlocking(&g_spiSampleHandle, (unsigned char *)&tempWdata[5], + sizeof(tempWdata[5]), MAX_TIMEOUT_VAL); /* Send the 5 piece of data. */ + break; + case MANUAL_MODE_SET_CH6_RX : + /* Send the 6 piece of data. */ + HAL_SPI_WriteBlocking(&g_spiSampleHandle, (unsigned char *)&tempWdata[6], + sizeof(tempWdata[6]), MAX_TIMEOUT_VAL); /* Send the 6 piece of data. */ + break; + default : + break; + } + DBG_PRINTF("tempRxData = 0x%x \r\n", tempRxData); + } +} \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_slave/inc/sample_spi_slave.h b/drivers_sample/spi/sample_spi_slave/inc/sample_spi_slave.h new file mode 100644 index 000000000..d8995810a --- /dev/null +++ b/drivers_sample/spi/sample_spi_slave/inc/sample_spi_slave.h @@ -0,0 +1,28 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_spi_slave.h + * @author MCU Driver Team + * @brief SPI module driver. + * @details This file provides sample code for users to help use + * the functionalities of the SPI. + */ +#ifndef McuMagicTag_SAMPLE_SPI_SLAVE_H +#define McuMagicTag_SAMPLE_SPI_SLAVE_H + +void SlaveTestSampleProcessing(void); +#endif \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_slave/init/main.c b/drivers_sample/spi/sample_spi_slave/init/main.c new file mode 100644 index 000000000..7ca5712ac --- /dev/null +++ b/drivers_sample/spi/sample_spi_slave/init/main.c @@ -0,0 +1,35 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ +#include "feature.h" +#include "main.h" +#include "sample_spi_slave.h" + +SPI_Handle g_spiSampleHandle; +UART_Handle g_uart0; + +int main(void) +{ + SlaveTestSampleProcessing(); + while (1) { + } + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_slave/init/main.h b/drivers_sample/spi/sample_spi_slave/init/main.h new file mode 100644 index 000000000..8467e01ce --- /dev/null +++ b/drivers_sample/spi/sample_spi_slave/init/main.h @@ -0,0 +1,46 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "spi.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +extern SPI_Handle g_spiSampleHandle; + +extern UART_Handle g_uart0; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_slave/init/system_init.c b/drivers_sample/spi/sample_spi_slave/init/system_init.c new file mode 100644 index 000000000..7b573b09c --- /dev/null +++ b/drivers_sample/spi/sample_spi_slave/init/system_init.c @@ -0,0 +1,163 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" + +#define UART0_BAND_RATE 115200 + +#define SPI_FREQ_SCR 2 +#define SPI_FREQ_CPSDVSR 10 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void SPI_Init(void) +{ + HAL_CRG_IpEnableSet(SPI_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(SPI_BASE, CRG_PLL_NO_PREDV); + + g_spiSampleHandle.baseAddress = SPI; + g_spiSampleHandle.irqNum = IRQ_SPI; + + g_spiSampleHandle.mode = HAL_SPI_SLAVE; + g_spiSampleHandle.csMode = SPI_CHIP_SELECT_MODE_INTERNAL; + g_spiSampleHandle.xFerMode = HAL_XFER_MODE_BLOCKING; + g_spiSampleHandle.clkPolarity = 0; + g_spiSampleHandle.clkPhase = 0; + g_spiSampleHandle.endian = HAL_SPI_BIG_ENDIAN; + g_spiSampleHandle.frameFormat = HAL_SPI_MODE_MOTOROLA; + g_spiSampleHandle.dataWidth = SPI_DATA_WIDTH_16BIT; + g_spiSampleHandle.freqScr = SPI_FREQ_SCR; + g_spiSampleHandle.freqCpsdvsr = SPI_FREQ_CPSDVSR; + g_spiSampleHandle.waitVal = 127; /* Wait time is 127 clock */ + g_spiSampleHandle.rxBuff = NULL; + g_spiSampleHandle.txBuff = NULL; + g_spiSampleHandle.transferSize = 0; + g_spiSampleHandle.txCount = 0; + g_spiSampleHandle.rxCount = 0; + g_spiSampleHandle.state = HAL_SPI_STATE_RESET; + g_spiSampleHandle.rxIntSize = SPI_RX_INTERRUPT_SIZE_1; + g_spiSampleHandle.txIntSize = SPI_TX_INTERRUPT_SIZE_1; + g_spiSampleHandle.rxDMABurstSize = SPI_RX_DMA_BURST_SIZE_1; + g_spiSampleHandle.txDMABurstSize = SPI_TX_DMA_BURST_SIZE_1; + + HAL_SPI_Init(&g_spiSampleHandle); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); + + g_uart0.baseAddress = UART0; + g_uart0.irqNum = IRQ_UART0; + + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +static void IOConfig(void) +{ + IOConfig_RegStruct *iconfig = IOCONFIG; + + iconfig->iocmg_22.BIT.func = 0x5; /* 0x5 is SPI_CLK */ + iconfig->iocmg_22.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_22.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_22.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_22.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_22.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_18.BIT.func = 0x5; /* 0x5 is SPI_CSN0 */ + iconfig->iocmg_18.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_18.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_18.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_18.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_18.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_21.BIT.func = 0x5; /* 0x5 is SPI_CSN1 */ + iconfig->iocmg_21.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_21.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_21.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_21.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_21.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_20.BIT.func = 0x5; /* 0x5 is SPI_RXD */ + iconfig->iocmg_20.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_20.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_20.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_20.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_20.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_19.BIT.func = 0x5; /* 0x5 is SPI_TXD */ + iconfig->iocmg_19.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_19.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_19.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_19.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_19.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ + iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ + iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + SPI_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_slave/readme.md b/drivers_sample/spi/sample_spi_slave/readme.md new file mode 100644 index 000000000..1fdf39cdf --- /dev/null +++ b/drivers_sample/spi/sample_spi_slave/readme.md @@ -0,0 +1,18 @@ +# SPI使用阻塞方式进行主从通信,此示例代码作为从机使用 +## 关键字: SPI, 阻塞, 从机 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、SPI控制器初始化和功能配置。从机读主机数据或者向主机发送数据。 + +**【示例配置】** ++ 在"SystemInit()”接口中配置SPI时钟极性、时钟相位、帧格式等参数。 + ++ 定义数组,数组中存放从机需要发送的数据。 + ++ 首先从机调用“HAL_SPI_ReadBlocking()”读取主机发过来的10个数据,之后调用“HAL_SPI_WriteBlocking()”写10个数据,最后调用“HAL_SPI_WriteReadBlocking()”边写边读10个数据,不断循环。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码通过串口不断打印从机接收到的数据、发送的数据。 + +**【注意事项】** ++ 使用此示例代码必须对接master设备。 \ No newline at end of file diff --git a/drivers_sample/spi/sample_spi_slave/src/sample_spi_slave.c b/drivers_sample/spi/sample_spi_slave/src/sample_spi_slave.c new file mode 100644 index 000000000..e6957a578 --- /dev/null +++ b/drivers_sample/spi/sample_spi_slave/src/sample_spi_slave.c @@ -0,0 +1,97 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_spi_slave.c + * @author MCU Driver Team + * @brief Sample for SPI Module slave. + * @details This sample demonstrates the use of HAL interfaces in the salve mode. This sample uses the blocking mode. + * This sample must be connected to the master device. + * This sample sends 0x1105, 0x1c20, 0x1183, 0x1285, 0x1240, 0x12c0, and 0x1340 in polling mode. + * Print the received and sent data through the serial port. + */ +#include "main.h" +#include "spi.h" +#include "debug.h" +#include "sample_spi_slave.h" + +#define SLAVE_READ_TESE +#define SLAVE_READ_WRITE_TESE +#define SLAVE_WRITE_TESE + +#define USER_TIMEOUT 0x400 + +#define MANUAL_MODE_SET_CH0 0x1105 +#define MANUAL_MODE_SET_CH1 0x1c20 +#define MANUAL_MODE_SET_CH2 0x1183 +#define MANUAL_MODE_SET_CH3 0x1285 +#define MANUAL_MODE_SET_CH4 0x1240 +#define MANUAL_MODE_SET_CH5 0x12C0 +#define MANUAL_MODE_SET_CH6 0x1340 + +#define MAX_TIMEOUT_VAL 5000 + + +/** + * @brief Spi slave sample processing. + * @param None. + * @retval None. + */ +void SlaveTestSampleProcessing(void) +{ + unsigned short tempWdata[] = { + MANUAL_MODE_SET_CH0, + MANUAL_MODE_SET_CH1, + MANUAL_MODE_SET_CH2, + MANUAL_MODE_SET_CH3, + MANUAL_MODE_SET_CH4, + MANUAL_MODE_SET_CH5, + MANUAL_MODE_SET_CH6, + MANUAL_MODE_SET_CH2, + MANUAL_MODE_SET_CH3, + MANUAL_MODE_SET_CH4 + }; + unsigned short tempRdata[10] = {0}; + + SystemInit(); + while (1) { +#ifdef SLAVE_READ_TESE + HAL_SPI_ReadBlocking(&g_spiSampleHandle, (unsigned char *)tempRdata, sizeof(tempRdata), MAX_TIMEOUT_VAL); + for (int i = 0; i < 10; i++) { /* Print the test data for 10 times. */ + DBG_PRINTF("tempRdata[%d] = 0x%x \r\n", i, tempRdata[i]); + BASE_FUNC_DELAY_MS(10); /* Delay 10ms */ + } +#endif + +#ifdef SLAVE_WRITE_TESE + for (int i = 0; i < 10; i++) { /* Print the test data for 10 times. */ + DBG_PRINTF("tempWdata[%d] = 0x%x \r\n", i, tempWdata[i]); + BASE_FUNC_DELAY_MS(10); /* Delay 10ms */ + } + HAL_SPI_WriteBlocking(&g_spiSampleHandle, (unsigned char *)tempWdata, sizeof(tempWdata), MAX_TIMEOUT_VAL); +#endif + +#ifdef SLAVE_READ_WRITE_TESE + HAL_SPI_WriteReadBlocking(&g_spiSampleHandle, (unsigned char *)tempRdata, + (unsigned char *)tempWdata, + sizeof(tempWdata), MAX_TIMEOUT_VAL); + for (int i = 0; i < 10; i++) { /* Print the test data for 10 times. */ + DBG_PRINTF("tempRdata[%d] = 0x%x tempWdata[%d] = 0x%x \r\n", i, tempRdata[i], i, tempWdata[i]); + BASE_FUNC_DELAY_MS(10); /* Delay 10ms */ + } +#endif + } +} diff --git a/drivers_sample/timer/sample_timer_interrupt/inc/sample_timer_interrupt.h b/drivers_sample/timer/sample_timer_interrupt/inc/sample_timer_interrupt.h new file mode 100644 index 000000000..d7beb574a --- /dev/null +++ b/drivers_sample/timer/sample_timer_interrupt/inc/sample_timer_interrupt.h @@ -0,0 +1,32 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_timer_interrupt.h + * @author MCU Driver Team + * @brief timer sample module. + * @details This file provides users with sample code to help use TIMER function: + * TIMER runs and triggers an interrupt. + */ +#ifndef SAMPLE_TIMER_INTERRUPT_H +#define SAMPLE_TIMER_INTERRUPT_H + +#include "debug.h" +#include "timer.h" +#include "main.h" + +void TIMER_SampleMain(void); +#endif \ No newline at end of file diff --git a/drivers_sample/timer/sample_timer_interrupt/init/main.c b/drivers_sample/timer/sample_timer_interrupt/init/main.c new file mode 100644 index 000000000..b647662a0 --- /dev/null +++ b/drivers_sample/timer/sample_timer_interrupt/init/main.c @@ -0,0 +1,48 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ + +#include "typedefs.h" +#include "feature.h" +#include "sample_timer_interrupt.h" +#include "main.h" +/* USER CODE BEGIN 0 */ +/* USER CODE END 0 */ +TIMER_Handle g_timerHandle; +UART_Handle g_uart0Handle; +/* USER CODE BEGIN 1 */ +/* USER CODE END 1 */ + +int main(void) +{ + /* USER CODE BEGIN 2 */ + /* USER CODE END 2 */ + TIMER_SampleMain(); + /* USER CODE BEGIN 3 */ + /* USER CODE END 3 */ + while (1) { + /* USER CODE BEGIN 4 */ + /* USER CODE END 4 */ + } + /* USER CODE BEGIN 5 */ + /* USER CODE END 5 */ + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/timer/sample_timer_interrupt/init/main.h b/drivers_sample/timer/sample_timer_interrupt/init/main.h new file mode 100644 index 000000000..8a102586d --- /dev/null +++ b/drivers_sample/timer/sample_timer_interrupt/init/main.h @@ -0,0 +1,52 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "uart_ex.h" +#include "timer.h" +#include "timer_ex.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define XTAL_DRV_LEVEL4 0x03U +#define XTAL_DRV_LEVEL3 0x02U +#define XTAL_DRV_LEVEL2 0x01U +#define XTAL_DRV_LEVEL1 0x00U + +extern TIMER_Handle g_timerHandle; +extern UART_Handle g_uart0Handle; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); +void TIMER0_InterruptProcess(void *handle); +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/timer/sample_timer_interrupt/init/system_init.c b/drivers_sample/timer/sample_timer_interrupt/init/system_init.c new file mode 100644 index 000000000..6dc29e612 --- /dev/null +++ b/drivers_sample/timer/sample_timer_interrupt/init/system_init.c @@ -0,0 +1,123 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" +#include "iocmg.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 48; /* PLL Multiplier 48 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +__weak void TIMER0_InterruptProcess(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN TIMER0_InterruptProcess */ + /* USER CODE END TIMER0_InterruptProcess */ +} + +static void TIMER0_Init(void) +{ + HAL_CRG_IpEnableSet(TIMER0_BASE, IP_CLK_ENABLE); + + unsigned int load = HAL_CRG_GetIpFreq((void *)TIMER0) / 1000000u * 1000000; + + g_timerHandle.baseAddress = TIMER0; + g_timerHandle.load = load - 1; /* Set timer value immediately */ + g_timerHandle.bgLoad = load - 1; /* Set timer value */ + g_timerHandle.mode = TIMER_MODE_RUN_PERIODIC; /* Run in period mode */ + g_timerHandle.prescaler = TIMERPRESCALER_NO_DIV; /* Don't frequency division */ + g_timerHandle.size = TIMER_SIZE_32BIT; /* 1 for 32bit, 0 for 16bit */ + g_timerHandle.interruptEn = BASE_CFG_ENABLE; + g_timerHandle.adcSocReqEnable = BASE_CFG_DISABLE; + g_timerHandle.dmaReqEnable = BASE_CFG_DISABLE; + HAL_TIMER_Init(&g_timerHandle); + IRQ_Register(IRQ_TIMER0, HAL_TIMER_IrqHandler, &g_timerHandle); + + HAL_TIMER_RegisterCallback(&g_timerHandle, TIMER_PERIOD_FIN, TIMER0_InterruptProcess); + IRQ_SetPriority(IRQ_TIMER0, 1); + IRQ_EnableN(IRQ_TIMER0); +} + + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + + g_uart0Handle.baseAddress = UART0; + + g_uart0Handle.baudRate = UART0_BAND_RATE; + g_uart0Handle.dataLength = UART_DATALENGTH_8BIT; + g_uart0Handle.stopBits = UART_STOPBITS_ONE; + g_uart0Handle.parity = UART_PARITY_NONE; + g_uart0Handle.txMode = UART_MODE_BLOCKING; + g_uart0Handle.rxMode = UART_MODE_BLOCKING; + g_uart0Handle.fifoMode = BASE_CFG_ENABLE; + g_uart0Handle.fifoTxThr = UART_FIFODEPTH_SIZE8; + g_uart0Handle.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart0Handle.hwFlowCtr = BASE_CFG_DISABLE; + g_uart0Handle.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart0Handle.handleEx.msbFirst = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0Handle); +} + +static void IOConfig(void) +{ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + TIMER0_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/timer/sample_timer_interrupt/readme.md b/drivers_sample/timer/sample_timer_interrupt/readme.md new file mode 100644 index 000000000..613a6bda8 --- /dev/null +++ b/drivers_sample/timer/sample_timer_interrupt/readme.md @@ -0,0 +1,18 @@ +# 周期为1秒的定时器 +## 关键字: TIMER, 定时器周期 + +**【功能描述】** ++ 该示例中TIMER每秒产生一个中断,同时定义了一个中断处理函数,该中断处理函数完成串口输出。 + ++ 在TIMER运行过程中,修改TIMER的load影子寄存器,将其定时周期修改为0.5秒。 + +**【示例配置】** ++ 示例默认配置定时周期为1秒,对应的IDE配置参数为“Period(us)”,用户可通过更改此参数,设定定时器的周期。 + ++ 定时器计时10s之后,通过“HAL_TIMER_Config”函数,将定时器的周期减半。 + +**【示例效果】** ++ 中断处理函数按照Timer设置周期执行, 在串口上每秒或者0.5秒打印字符串"In Interrupt"。 + +**【注意事项】** ++ 串口0输出提示信息。 \ No newline at end of file diff --git a/drivers_sample/timer/sample_timer_interrupt/src/sample_timer_interrupt.c b/drivers_sample/timer/sample_timer_interrupt/src/sample_timer_interrupt.c new file mode 100644 index 000000000..fb3756896 --- /dev/null +++ b/drivers_sample/timer/sample_timer_interrupt/src/sample_timer_interrupt.c @@ -0,0 +1,65 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_timer_interrupt.c + * @author MCU Driver Team + * @brief timer sample module. + * @details This file provides users with sample code to help use TIMER function: + * 1) TIMER runs period and triggers an interrupt every second. + * 2) Change the period during TIMER running + * Phenomenon: + * The interrupt handler is executed every 1 second, after 10 second, the interrupt handler execute + * every 0.5 second and print "In interrupt" on the serial port. + */ +#include "sample_timer_interrupt.h" + +void TIMER0_InterruptProcess(void *handle); + +/** + * @brief Timer run and triggers an interrupt. + * @param None. + * @retval None. + */ +void TIMER_SampleMain(void) +{ + TIMER_Handle timerHandle; + + SystemInit(); + DBG_PRINTF("TIMER_SampleMain begin\r\n"); + HAL_TIMER_Start(&g_timerHandle); + + BASE_FUNC_DelaySeconds(10); /* Delay 10 seconds */ + DBG_PRINTF("Change period of timer\r\n"); + timerHandle.baseAddress = g_timerHandle.baseAddress; + HAL_TIMER_GetConfig(&timerHandle); + timerHandle.bgLoad = HAL_CRG_GetIpFreq((void *)TIMER0) >> 1; + HAL_TIMER_Config(&timerHandle, TIMER_CFG_BGLOAD); +} + +/** + * @brief Timer Interrupt callback function + * @param handle Handle of Timer + * @retval None. + */ +void TIMER0_InterruptProcess(void *handle) +{ + /* USER CODE BEGIN TIMER0_InterruptProcess */ + TIMER_Handle *timerHandle = (TIMER_Handle *)handle; + BASE_FUNC_UNUSED(timerHandle); + DBG_PRINTF("In interrupt\r\n"); + /* USER CODE END TIMER0_InterruptProcess */ +} diff --git a/drivers_sample/tsensor/sample_tsensor/inc/sample_tsensor.h b/drivers_sample/tsensor/sample_tsensor/inc/sample_tsensor.h new file mode 100644 index 000000000..48f59c161 --- /dev/null +++ b/drivers_sample/tsensor/sample_tsensor/inc/sample_tsensor.h @@ -0,0 +1,32 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_tsensor.h + * @author MCU Driver Team + * @brief tsensor sample module. + * @details This file provides sample to get temperature of mcu by using tsensor. + */ + +/* Includes ------------------------------------------------------------------*/ +#ifndef SAMPLE_TSENSOR_SAMPLE_H +#define SAMPLE_TSENSOR_SAMPLE_H + +#include "debug.h" +#include "tsensor.h" + +void TSENSOR_GetAveTemp(void); +#endif \ No newline at end of file diff --git a/drivers_sample/tsensor/sample_tsensor/readme.txt b/drivers_sample/tsensor/sample_tsensor/readme.txt new file mode 100644 index 000000000..9e2972782 --- /dev/null +++ b/drivers_sample/tsensor/sample_tsensor/readme.txt @@ -0,0 +1,6 @@ +“sample_tsensor”示例代码提供示例功能: +利用ADC内置的TSENEOR模块,对器件结温进行采集,示例返回为摄氏度。 + +示例代码中配置如下: +(1)示例中连续采样16次后,算出平均温度 +(2)示例中TSENSOR,使用ADC1_SOC15进行配置和采样 \ No newline at end of file diff --git a/drivers_sample/tsensor/sample_tsensor/src/sample_tsensor.c b/drivers_sample/tsensor/sample_tsensor/src/sample_tsensor.c new file mode 100644 index 000000000..82ec4c011 --- /dev/null +++ b/drivers_sample/tsensor/sample_tsensor/src/sample_tsensor.c @@ -0,0 +1,48 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_tsensor.c + * @author MCU Driver Team + * @brief tsensor sample module. + * @details This file provides sample to get temperature of mcu by using tsensor. + */ +#include "sample_tsensor.h" + +#define SAMPLE_COUNT 16 + +/** + * @brief Tsensor samples 16 times, takes the average value, and converts the average value to degrees Celsius. + * @param None. + * @retval None. + */ +void TSENSOR_GetAveTemp(void) +{ + DBG_UartPrintInit(BAUDRATE); + float total = 0; + float ret; + float aveTemp; + HAL_TSENSOR_Init(); + /* Tsensor cyclic sampling */ + for (int i = 0; i < SAMPLE_COUNT; ++i) { + ret = HAL_TSENSOR_GetTemperature(); + total += ret; + } + /* Converting the sampled average value of the test sensor to temperature */ + aveTemp = total / SAMPLE_COUNT; + DBG_PRINTF("Tsensor Average temperature: %f\r\n", aveTemp); + return; +} \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_baud_detect/inc/sample_uart_baud_detect.h b/drivers_sample/uart/sample_uart_baud_detect/inc/sample_uart_baud_detect.h new file mode 100644 index 000000000..31e67eb8f --- /dev/null +++ b/drivers_sample/uart/sample_uart_baud_detect/inc/sample_uart_baud_detect.h @@ -0,0 +1,33 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_uart_baud_detect.h + * @author MCU Driver Team + * @brief uart baud detection sample module. + * @details This file provides sample code for users to help use + * the baud detection of the UART. Send char 'Z' to the UART to complete the baud rate detection. + */ +#ifndef SAMPLE_UART_INTERRUPT_TRANSMIT_H +#define SAMPLE_UART_INTERRUPT_TRANSMIT_H + +#include "debug.h" +#include "uart.h" +#include "interrupt.h" +#include "main.h" + +void UART_BaudDetection(void); +#endif \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_baud_detect/init/main.c b/drivers_sample/uart/sample_uart_baud_detect/init/main.c new file mode 100644 index 000000000..055dc2638 --- /dev/null +++ b/drivers_sample/uart/sample_uart_baud_detect/init/main.c @@ -0,0 +1,50 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ + +#include "typedefs.h" +#include "feature.h" +#include "sample_uart_baud_detect.h" +#include "main.h" +/* USER CODE BEGIN 0 */ +/* USER CODE END 0 */ +UART_Handle g_uart; +/* USER CODE BEGIN 1 */ +/* USER CODE END 1 */ + +int main(void) +{ + /* USER CODE BEGIN 2 */ + /* USER CODE END 2 */ + UART_BaudDetection(); + /* USER CODE BEGIN 3 */ + /* USER CODE END 3 */ + while (1) { + /* USER CODE BEGIN 4 */ + /* USER CODE END 4 */ + } + /* USER CODE BEGIN 5 */ + /* USER CODE END 5 */ + return BASE_STATUS_OK; +} + +/* USER CODE BEGIN 6 */ +/* USER CODE END 6 */ \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_baud_detect/init/main.h b/drivers_sample/uart/sample_uart_baud_detect/init/main.h new file mode 100644 index 000000000..88aaeab8a --- /dev/null +++ b/drivers_sample/uart/sample_uart_baud_detect/init/main.h @@ -0,0 +1,55 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "uart_ex.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define XTAL_DRV_LEVEL4 0x03U +#define XTAL_DRV_LEVEL3 0x02U +#define XTAL_DRV_LEVEL2 0x01U +#define XTAL_DRV_LEVEL1 0x00U + +extern UART_Handle g_uart; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +void UART0InterruptErrorCallback(void *handle); +void UART0WriteInterruptCallback(void *handle); +void UART0ReadInterruptCallback(void *handle); +void UART_BaudDetectCallBack_Ok(void *handle); +void UART_BaudDetectCallBack_Error(void *handle); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_baud_detect/init/system_init.c b/drivers_sample/uart/sample_uart_baud_detect/init/system_init.c new file mode 100644 index 000000000..f6ab9c7b6 --- /dev/null +++ b/drivers_sample/uart/sample_uart_baud_detect/init/system_init.c @@ -0,0 +1,136 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" +#include "iocmg.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 48; /* PLL Multiplier 48 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +__weak void UART0InterruptErrorCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN UART0_TRNS_IT_ERROR */ + /* USER CODE END UART0_TRNS_IT_ERROR */ +} + +__weak void UART0WriteInterruptCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN UART0_WRITE_IT_FINISH */ + /* USER CODE END UART0_WRITE_IT_FINISH */ +} + +__weak void UART0ReadInterruptCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN UART0_READ_IT_FINISH */ + /* USER CODE END UART0_READ_IT_FINISH */ +} + +__weak void UART_BaudDetectCallBack_Ok(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN UART_BaudDetectCallBack_Ok */ + /* USER CODE END UART_BaudDetectCallBack_Ok */ +} + +__weak void UART_BaudDetectCallBack_Error(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN UART_BaudDetectCallBack_Error */ + /* USER CODE END UART_BaudDetectCallBack_Error */ +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + + g_uart.baseAddress = UART0; + + g_uart.baudRate = UART0_BAND_RATE; + g_uart.dataLength = UART_DATALENGTH_8BIT; + g_uart.stopBits = UART_STOPBITS_ONE; + g_uart.parity = UART_PARITY_NONE; + g_uart.txMode = UART_MODE_INTERRUPT; + g_uart.rxMode = UART_MODE_INTERRUPT; + g_uart.fifoMode = BASE_CFG_ENABLE; + g_uart.fifoTxThr = UART_FIFODEPTH_SIZE8; + g_uart.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart.hwFlowCtr = BASE_CFG_DISABLE; + g_uart.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart.handleEx.msbFirst = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart); + HAL_UART_EnableBaudDetectionEx(&g_uart); + HAL_UART_RegisterCallBack(&g_uart, UART_BAUD_DETECT_FINISH, UART_BaudDetectCallBack_Ok); + HAL_UART_RegisterCallBack(&g_uart, UART_BAUD_DETECT_ERROR, UART_BaudDetectCallBack_Error); + HAL_UART_RegisterCallBack(&g_uart, UART_TRNS_IT_ERROR, UART0InterruptErrorCallback); + HAL_UART_RegisterCallBack(&g_uart, UART_WRITE_IT_FINISH, UART0WriteInterruptCallback); + HAL_UART_RegisterCallBack(&g_uart, UART_READ_IT_FINISH, UART0ReadInterruptCallback); + + IRQ_Register(IRQ_UART0, HAL_UART_IrqHandler, &g_uart); + IRQ_SetPriority(IRQ_UART0, 1); + IRQ_EnableN(IRQ_UART0); +} + +static void IOConfig(void) +{ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_baud_detect/readme.md b/drivers_sample/uart/sample_uart_baud_detect/readme.md new file mode 100644 index 000000000..65f48e6ab --- /dev/null +++ b/drivers_sample/uart/sample_uart_baud_detect/readme.md @@ -0,0 +1,19 @@ +# UART波特率自检 +## 关键字: UART, 波特率自检 + +**【功能描述】** ++ 能够识别总线上的波特率,并自动配置UART的波特率。 + +**【示例配置】** ++ 特定字符发送:若要检测波特率,需要向串口发送大写字符“Z”,代码中有成功检测标志"baudCheck", 可以依据检测成功标志,实现后续逻辑。 + ++ 波特率检测中断:波特率检测成功之后,会调用波特率检测成功函数"UART_BaudDetectCallBack_Ok", 用户可以使用"HAL_UART_RegisterCallBack"进行更改。 + + +**【示例效果】** ++ 向串口0发送大写字符"Z",如果串口输出“UART_BaudDetectCallBack_Ok”字符,则代表波特率检测成功。 + +**【注意事项】** ++ 串口波特率不一致时,需要先完成波特率的检测。 + ++ 需要向串口发送特定字符“Z”,才能触发波特率检测。 \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_baud_detect/src/sample_uart_baud_detect.c b/drivers_sample/uart/sample_uart_baud_detect/src/sample_uart_baud_detect.c new file mode 100644 index 000000000..e5ef4e17d --- /dev/null +++ b/drivers_sample/uart/sample_uart_baud_detect/src/sample_uart_baud_detect.c @@ -0,0 +1,67 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_uart_baud_detect.c + * @author MCU Driver Team + * @brief uart baud detection sample module. + * @details This file provides sample code for users to help use + * the baud detection of the UART. Send char 'Z' to the UART to complete the baud rate detection. + */ +#include "sample_uart_baud_detect.h" + +static bool baudCheck = BASE_CFG_DISABLE; /* Flag of baud detection. */ + +/** + * @brief UART baud detection success callback. + * @param None. + * @retval None. + */ +void UART_BaudDetectCallBack_Ok(void *handle) +{ + UART_Handle *uartHandle = (UART_Handle *)handle; + BASE_FUNC_UNUSED(uartHandle); + DBG_PRINTF("UART_BaudDetectCallBack_Ok\r\n"); + baudCheck = BASE_CFG_ENABLE; +} + +/** + * @brief UART baud detection error callback. + * @param None. + * @retval None. + */ +void UART_BaudDetectCallBack_Error(void *handle) +{ + UART_Handle *uartHandle = (UART_Handle *)handle; + BASE_FUNC_UNUSED(uartHandle); + /* Enable tx and rx. */ + uartHandle->baseAddress->UART_CR.BIT.txe = BASE_CFG_ENABLE; + uartHandle->baseAddress->UART_CR.BIT.rxe = BASE_CFG_ENABLE; + DBG_PRINTF("UART_BaudDetectCallBack_Error\r\n"); + baudCheck = BASE_CFG_DISABLE; +} + +/** + * @brief UART baud detection. + * @param None. + * @retval None. + */ +void UART_BaudDetection(void) +{ + SystemInit(); + /* Send char 'Z' to the UART to complete the baud rate detection. */ + return; +} \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_blocking_rx/inc/sample_uart_blocking_rx.h b/drivers_sample/uart/sample_uart_blocking_rx/inc/sample_uart_blocking_rx.h new file mode 100644 index 000000000..6fefb5099 --- /dev/null +++ b/drivers_sample/uart/sample_uart_blocking_rx/inc/sample_uart_blocking_rx.h @@ -0,0 +1,35 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_uart_blocking_rx.h + * @author MCU Driver Team + * @brief uart sample module. + * @details This file provides sample code for users to help use + * the transmission of the UART in blocking mode. + */ + +/* Includes ------------------------------------------------------------------*/ +#ifndef SAMPLE_UART_BLOCKING_RX_H +#define SAMPLE_UART_BLOCKING_RX_H + +#include "uart.h" +#include "debug.h" +#include "interrupt.h" +#include "main.h" + +void UART_BlcokingRX(void); +#endif \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_blocking_rx/init/main.c b/drivers_sample/uart/sample_uart_blocking_rx/init/main.c new file mode 100644 index 000000000..1ce0ab892 --- /dev/null +++ b/drivers_sample/uart/sample_uart_blocking_rx/init/main.c @@ -0,0 +1,34 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ +#include "feature.h" +#include "main.h" +#include "sample_uart_blocking_rx.h" + +UART_Handle g_uart; + +int main(void) +{ + UART_BlcokingRX(); + while (1) { + } + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_blocking_rx/init/main.h b/drivers_sample/uart/sample_uart_blocking_rx/init/main.h new file mode 100644 index 000000000..48319a4fd --- /dev/null +++ b/drivers_sample/uart/sample_uart_blocking_rx/init/main.h @@ -0,0 +1,43 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +extern UART_Handle g_uart; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_blocking_rx/init/system_init.c b/drivers_sample/uart/sample_uart_blocking_rx/init/system_init.c new file mode 100644 index 000000000..dbefea54e --- /dev/null +++ b/drivers_sample/uart/sample_uart_blocking_rx/init/system_init.c @@ -0,0 +1,90 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" +#include "iocmg.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_XTAL; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = 0; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_1; + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + + g_uart.baseAddress = UART0; + + g_uart.baudRate = UART0_BAND_RATE; + g_uart.dataLength = UART_DATALENGTH_8BIT; + g_uart.stopBits = UART_STOPBITS_ONE; + g_uart.parity = UART_PARITY_NONE; + g_uart.txMode = UART_MODE_BLOCKING; + g_uart.rxMode = UART_MODE_BLOCKING; + g_uart.fifoMode = BASE_CFG_ENABLE; + g_uart.fifoTxThr = UART_FIFODEPTH_SIZE8; + g_uart.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart.hwFlowCtr = BASE_CFG_DISABLE; + g_uart.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart.handleEx.msbFirst = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart); +} + +static void IOConfig(void) +{ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_blocking_rx/readme.md b/drivers_sample/uart/sample_uart_blocking_rx/readme.md new file mode 100644 index 000000000..8574d7929 --- /dev/null +++ b/drivers_sample/uart/sample_uart_blocking_rx/readme.md @@ -0,0 +1,23 @@ +# UART阻塞模式接收数据 +## 关键字: UART, 阻塞模式接收 + +**【功能描述】** ++ 在阻塞下模式下,阻塞一段时间等待UART接收数据,接收到的数据从预设置的缓存中读取。 + ++ 阻塞模式下的超时等待时间为2000ms。 + +**【示例配置】** ++ 预设置的缓存:需要使用者自行开辟内存空间,将内存首地址和需要接收的字符长度作为入参传入HAL_UART_ReadBlocking()。 + ++ 超时时间配置:通过“HAL_UART_ReadBlocking()”进行配置,单位为ms。 + ++ HAL_UART_ReadBlocking()返回值BASE_STATUS_OK,表示在给定时间内,接收完数据,可以在缓存中读取数据;返回值为 +BASE_STATUS_TIMEOUT,表示在规定时间内,未能完成数据接收;其他返回值,表示错误。 + ++ 串口0会打印出接收到的数据和超时提示。 + +**【示例效果】** ++ 向串口0发送数据,串口0会将接收的数据打印,若超过设定的超时时间未接收到数据会打印“Receive time out!”。 + +**【注意事项】** ++ 串口通信的波特率,校验位等配置需保持一致,可以通过UART配置界面进行更改。 \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_blocking_rx/src/sample_uart_blocking_rx.c b/drivers_sample/uart/sample_uart_blocking_rx/src/sample_uart_blocking_rx.c new file mode 100644 index 000000000..a33f20741 --- /dev/null +++ b/drivers_sample/uart/sample_uart_blocking_rx/src/sample_uart_blocking_rx.c @@ -0,0 +1,53 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_uart_blocking_rx.c + * @author MCU Driver Team + * @brief uart sample module. + * @details In blocking mode, the ADC blocks for a period of time and waits for the UART to receive data. + * The received data is read from the preset buffer. + * (1)Preset buffer: The user needs to create the memory space. + * (2)Blocking time: It is as HAL_UART_ReadBlocking() parameter and the unit is ms. + * (3)Result judgment: BASE_STATUS_OK, indicating that data receive successfully. The return value is + * BASE_STATUS_TIMEOUT, indicating that data reception fails within the specified time. + * Other return values, indicating an error. + */ +#include "sample_uart_blocking_rx.h" +#define BLOCKING_TIME 2000 + +/** + * @brief UART blocking receive sample code. + * @param None. + * @retval None. + */ +void UART_BlcokingRX(void) +{ + SystemInit(); + unsigned char rxStr[20] = {0}; /* rxStr[20], Receive memory address */ + DBG_PRINTF("RX: UART Init finish\r\n"); + unsigned int ret; + while (1) { + ret = HAL_UART_ReadBlocking(&g_uart, rxStr, 5, BLOCKING_TIME); /* 5 is data length, 2000 is timeout limit */ + if (ret == BASE_STATUS_OK) { + DBG_PRINTF("Receive success: %s \r\n", rxStr); + } else if (ret == BASE_STATUS_TIMEOUT) { + DBG_PRINTF("Receive time out!\r\n"); + } else { + DBG_PRINTF("Receive verification error!\r\n"); + } + } +} \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_blocking_tx/inc/sample_uart_blocking_tx.h b/drivers_sample/uart/sample_uart_blocking_tx/inc/sample_uart_blocking_tx.h new file mode 100644 index 000000000..ba885e50e --- /dev/null +++ b/drivers_sample/uart/sample_uart_blocking_tx/inc/sample_uart_blocking_tx.h @@ -0,0 +1,35 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_uart_blocking_tx.h + * @author MCU Driver Team + * @brief uart sample module. + * @details This file provides sample code for users to help use + * the transmission of the UART in blocking mode. + */ + +/* Includes ------------------------------------------------------------------*/ +#ifndef SAMPLE_UART_BLOCKING_TX_H +#define SAMPLE_UART_BLOCKING_TX_H + +#include "uart.h" +#include "debug.h" +#include "interrupt.h" +#include "main.h" + +void UART_BlcokingTX(void); +#endif \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_blocking_tx/init/main.c b/drivers_sample/uart/sample_uart_blocking_tx/init/main.c new file mode 100644 index 000000000..c97ce182c --- /dev/null +++ b/drivers_sample/uart/sample_uart_blocking_tx/init/main.c @@ -0,0 +1,34 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ +#include "feature.h" +#include "main.h" +#include "sample_uart_blocking_tx.h" + +UART_Handle g_uart; + +int main(void) +{ + UART_BlcokingTX(); + while (1) { + } + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_blocking_tx/init/main.h b/drivers_sample/uart/sample_uart_blocking_tx/init/main.h new file mode 100644 index 000000000..9042bc0c9 --- /dev/null +++ b/drivers_sample/uart/sample_uart_blocking_tx/init/main.h @@ -0,0 +1,48 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define XTAL_DRV_LEVEL4 0x03U +#define XTAL_DRV_LEVEL3 0x02U +#define XTAL_DRV_LEVEL2 0x01U +#define XTAL_DRV_LEVEL1 0x00U + +extern UART_Handle g_uart; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_blocking_tx/init/system_init.c b/drivers_sample/uart/sample_uart_blocking_tx/init/system_init.c new file mode 100644 index 000000000..231b06da9 --- /dev/null +++ b/drivers_sample/uart/sample_uart_blocking_tx/init/system_init.c @@ -0,0 +1,91 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" +#include "iocmg.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_XTAL; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = 0; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_1; + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + + g_uart.baseAddress = UART0; + + g_uart.baudRate = UART0_BAND_RATE; + g_uart.dataLength = UART_DATALENGTH_8BIT; + g_uart.stopBits = UART_STOPBITS_ONE; + g_uart.parity = UART_PARITY_NONE; + g_uart.txMode = UART_MODE_BLOCKING; + g_uart.rxMode = UART_MODE_BLOCKING; + g_uart.fifoMode = BASE_CFG_ENABLE; + g_uart.fifoTxThr = UART_FIFODEPTH_SIZE8; + g_uart.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart.hwFlowCtr = BASE_CFG_DISABLE; + g_uart.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart.handleEx.msbFirst = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart); +} + +static void IOConfig(void) +{ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_blocking_tx/readme.md b/drivers_sample/uart/sample_uart_blocking_tx/readme.md new file mode 100644 index 000000000..82676acd8 --- /dev/null +++ b/drivers_sample/uart/sample_uart_blocking_tx/readme.md @@ -0,0 +1,22 @@ +# UART阻塞模式发送数据 +## 关键字: UART, 阻塞模式发送 + +**【功能描述】** ++ 在阻塞下模式下,阻塞一段时间等待UART发送数据。 + ++ 阻塞模式下的发送数据的超时时间为2000ms。 + +**【示例配置】** ++ 待发送数据:将待发送首地址和字符长度作为入参传入HAL_UART_WriteBlocking()。 + ++ 发送超时时间配置:通过“HAL_UART_WriteBlocking()”进行配置,单位为ms。 + ++ HAL_UART_WriteBlocking()返回值BASE_STATUS_OK,表示在给定时间内,发送完成数据;返回值为BASE_STATUS_TIMEOUT,表示在规定时间内,未能完成数据发送;其他返回值,表示错误。 + ++ 串口0会打印发送成功或发送超时。 + +**【示例效果】** ++ 串口0发送数据,若在超时时长内发送数据,则打印“Send success!”,若发送超时则打印“Send time out!”, 发送错误,打印“Send verification error!”。 + +**【注意事项】** ++ 串口通信的波特率,校验位等配置需保持一致,可以通过UART配置界面进行更改。 \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_blocking_tx/src/sample_uart_blocking_tx.c b/drivers_sample/uart/sample_uart_blocking_tx/src/sample_uart_blocking_tx.c new file mode 100644 index 000000000..d42307c4e --- /dev/null +++ b/drivers_sample/uart/sample_uart_blocking_tx/src/sample_uart_blocking_tx.c @@ -0,0 +1,53 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_uart_blocking_tx.c + * @author MCU Driver Team + * @brief uart sample module. + * @details In block mode, the UART is blocked for a period of time and waits for the UART to transmit data. + * (1) Data to be sent: The start address and character length to be sent are used as input parameters + * and transferred to HAL_UART_WriteBlocking(). + * (2)Blocking time: It is as HAL_UART_WriteBlocking() parameter and the unit is ms. + * (3)Result judgment: BASE_STATUS_OK, indicating that send data successfully. The return value is + * BASE_STATUS_TIMEOUT, indicating that send data fails within the specified time. + * Other return values, indicating an error. + */ +#include "sample_uart_blocking_tx.h" + +#define BAND_RATE 115200 +#define BLOCKING_TIME 2000 + +/** + * @brief UART blocking send sample code. + * @param None. + * @retval None. + */ +void UART_BlcokingTX(void) +{ + SystemInit(); + DBG_PRINTF("TX: UART Init finish\r\n"); + unsigned char txStr[] = "UARTWrite"; + unsigned int ret; + ret = HAL_UART_WriteBlocking(&g_uart, txStr, 9, BLOCKING_TIME); /* 9 is transmission length */ + if (ret == BASE_STATUS_OK) { + DBG_PRINTF("Send success!\r\n"); /* Sending succeeded */ + } else if (ret == BASE_STATUS_TIMEOUT) { + DBG_PRINTF("Send time out!\r\n"); /* Sending failed */ + } else { + DBG_PRINTF("Send verification error!\r\n"); + } +} \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_character_match/inc/sample_uart_character_match.h b/drivers_sample/uart/sample_uart_character_match/inc/sample_uart_character_match.h new file mode 100644 index 000000000..9bb4c3b22 --- /dev/null +++ b/drivers_sample/uart/sample_uart_character_match/inc/sample_uart_character_match.h @@ -0,0 +1,35 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_uart_character_match.h + * @author MCU Driver Team + * @brief uart sample module. + * @details This file provides sample code for users to help use + * the character match of uart. + */ + +#ifndef SAMPLE_UART_CHARACTER_MATCH_H +#define SAMPLE_UART_CHARACTER_MATCH_H + +#include "debug.h" +#include "uart.h" +#include "uart_ex.h" +#include "interrupt.h" +#include "main.h" + +void UART_CharacterMatch(void); +#endif \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_character_match/init/main.c b/drivers_sample/uart/sample_uart_character_match/init/main.c new file mode 100644 index 000000000..202bfd8b2 --- /dev/null +++ b/drivers_sample/uart/sample_uart_character_match/init/main.c @@ -0,0 +1,50 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ + +#include "typedefs.h" +#include "feature.h" +#include "sample_uart_character_match.h" +#include "main.h" +/* USER CODE BEGIN 0 */ +/* USER CODE END 0 */ +UART_Handle g_uart; +/* USER CODE BEGIN 1 */ +/* USER CODE END 1 */ + +int main(void) +{ + /* USER CODE BEGIN 2 */ + /* USER CODE END 2 */ + UART_CharacterMatch(); + /* USER CODE BEGIN 3 */ + /* USER CODE END 3 */ + while (1) { + /* USER CODE BEGIN 4 */ + /* USER CODE END 4 */ + } + /* USER CODE BEGIN 5 */ + /* USER CODE END 5 */ + return BASE_STATUS_OK; +} + +/* USER CODE BEGIN 6 */ +/* USER CODE END 6 */ \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_character_match/init/main.h b/drivers_sample/uart/sample_uart_character_match/init/main.h new file mode 100644 index 000000000..3be06f42a --- /dev/null +++ b/drivers_sample/uart/sample_uart_character_match/init/main.h @@ -0,0 +1,53 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "uart_ex.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define XTAL_DRV_LEVEL4 0x03U +#define XTAL_DRV_LEVEL3 0x02U +#define XTAL_DRV_LEVEL2 0x01U +#define XTAL_DRV_LEVEL1 0x00U + +extern UART_Handle g_uart; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +void UART0InterruptErrorCallback(void *handle); +void UART0WriteInterruptCallback(void *handle); +void ReadFinish(void *handle); +void UART_CharacterMatchCallBack(void *handle); +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_character_match/init/system_init.c b/drivers_sample/uart/sample_uart_character_match/init/system_init.c new file mode 100644 index 000000000..8714c7614 --- /dev/null +++ b/drivers_sample/uart/sample_uart_character_match/init/system_init.c @@ -0,0 +1,129 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" +#include "iocmg.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 48; /* PLL Multiplier 48 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +__weak void UART0InterruptErrorCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN UART0_TRNS_IT_ERROR */ + /* USER CODE END UART0_TRNS_IT_ERROR */ +} + +__weak void UART0WriteInterruptCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN UART0_WRITE_IT_FINISH */ + /* USER CODE END UART0_WRITE_IT_FINISH */ +} + +__weak void ReadFinish(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN UART0_READ_IT_FINISH */ + /* USER CODE END UART0_READ_IT_FINISH */ +} + +__weak void UART_CharacterMatchCallBack(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN UART_CharacterMatchCallBack */ + /* USER CODE END UART_CharacterMatchCallBack */ +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + + g_uart.baseAddress = UART0; + + g_uart.baudRate = UART0_BAND_RATE; + g_uart.dataLength = UART_DATALENGTH_8BIT; + g_uart.stopBits = UART_STOPBITS_ONE; + g_uart.parity = UART_PARITY_NONE; + g_uart.txMode = UART_MODE_INTERRUPT; + g_uart.rxMode = UART_MODE_INTERRUPT; + g_uart.fifoMode = BASE_CFG_ENABLE; + g_uart.fifoTxThr = UART_FIFODEPTH_SIZE8; + g_uart.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart.hwFlowCtr = BASE_CFG_DISABLE; + g_uart.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart.handleEx.msbFirst = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart); + HAL_UART_RegisterCallBack(&g_uart, UART_TRNS_IT_ERROR, UART0InterruptErrorCallback); + HAL_UART_RegisterCallBack(&g_uart, UART_WRITE_IT_FINISH, UART0WriteInterruptCallback); + HAL_UART_RegisterCallBack(&g_uart, UART_READ_IT_FINISH, ReadFinish); + unsigned char ch = 'A'; /* Detect character of user input */ + HAL_UART_OpenCharacterMatchEx(&g_uart, ch); /* parameter check */ + HAL_UART_RegisterCallBack(&g_uart, UART_CHARACTER_MATCH, UART_CharacterMatchCallBack); + + IRQ_Register(IRQ_UART0, HAL_UART_IrqHandler, &g_uart); + IRQ_SetPriority(IRQ_UART0, 1); + IRQ_EnableN(IRQ_UART0); +} + +static void IOConfig(void) +{ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_character_match/readme.md b/drivers_sample/uart/sample_uart_character_match/readme.md new file mode 100644 index 000000000..493a30b0c --- /dev/null +++ b/drivers_sample/uart/sample_uart_character_match/readme.md @@ -0,0 +1,16 @@ +# UART检测特定字符 +## 关键字: UART, 特定字符检测 + +**【功能描述】** ++ UART检测特定字符,检测到特定字符,会触发检测成功回调函数。 + +**【示例配置】** ++ 特定字符检测:示例中设定的检测字符为“A”,当收到带有字符“A”的数据,UART就会触发字符检测回调函数。用户可以使用“HAL_UART_OpenCharacterMatchEx”函数来设定需要检测的字符。 + ++ 字符检测成功中断:字符检测成功之后,会以中断的形式调用字符检测成功函数“UART_CharacterMatchCallBack”,用户可以使用“HAL_UART_RegisterCallBack”进行更改。 + +**【示例效果】** ++ 向串口0发送大写字符"123Acharactermatch",如果串口输出“Match character success”字符,则代表检测到字符“A”。 + +**【注意事项】** ++ 串口通信的波特率,校验位等配置需保持一致,可以通过UART配置界面进行更改。 \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_character_match/src/sample_uart_character_match.c b/drivers_sample/uart/sample_uart_character_match/src/sample_uart_character_match.c new file mode 100644 index 000000000..568bdf31d --- /dev/null +++ b/drivers_sample/uart/sample_uart_character_match/src/sample_uart_character_match.c @@ -0,0 +1,67 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_uart_character_match.c + * @author MCU Driver Team + * @brief uart sample module. + * @details This file provides sample code for users to help use + * the character match of uart. + */ + +#include "sample_uart_character_match.h" + +#define MATCH_CHARACTER_LENGTH 10 +#define WAIT_TIMER 10 + +unsigned char save_data[MATCH_CHARACTER_LENGTH]; + +/** + * @brief UART read interrupt finish. + * @param None. + * @retval None. + */ +void ReadFinish(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("Receive Characters: %s", save_data); +} + +/** + * @brief UART charter match + * @param None. + * @retval None. + */ +void UART_CharacterMatchCallBack(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("Match character success\r\n"); +} + +/** + * @brief UART charter match. + * @param None. + * @retval None. + */ +void UART_CharacterMatch(void) +{ + SystemInit(); + /* Message */ + DBG_PRINTF("Match start! Send 10 characters containing the uppercase character A.\r\n"); + HAL_UART_ReadIT(&g_uart, save_data, MATCH_CHARACTER_LENGTH); /* Read interrupt callback. */ + BASE_FUNC_DELAY_MS(WAIT_TIMER); + return; +} \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_dma_rx/inc/sample_uart_dma_rx.h b/drivers_sample/uart/sample_uart_dma_rx/inc/sample_uart_dma_rx.h new file mode 100644 index 000000000..2b024c215 --- /dev/null +++ b/drivers_sample/uart/sample_uart_dma_rx/inc/sample_uart_dma_rx.h @@ -0,0 +1,33 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_uart_dma_rx.h + * @author MCU Driver Team + * @brief uart sample module. + * @details This file provides sample code for users to help use + * the transmission of the UART in DMA mode. + */ +#ifndef SAMPLE_UART_DMA_RX_H +#define SAMPLE_UART_DMA_RX_H + +#include "debug.h" +#include "uart.h" +#include "interrupt.h" +#include "main.h" + +int UART_DMA_RX(void); +#endif \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_dma_rx/init/main.c b/drivers_sample/uart/sample_uart_dma_rx/init/main.c new file mode 100644 index 000000000..ec347d05c --- /dev/null +++ b/drivers_sample/uart/sample_uart_dma_rx/init/main.c @@ -0,0 +1,48 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ + +#include "typedefs.h" +#include "feature.h" +#include "sample_uart_dma_rx.h" +#include "main.h" +/* USER CODE BEGIN 0 */ +/* USER CODE END 0 */ +UART_Handle g_uart; +DMA_Handle g_dmac; +/* USER CODE BEGIN 1 */ +/* USER CODE END 1 */ + +int main(void) +{ + /* USER CODE BEGIN 2 */ + /* USER CODE END 2 */ + UART_DMA_RX(); + /* USER CODE BEGIN 3 */ + /* USER CODE END 3 */ + while (1) { + /* USER CODE BEGIN 4 */ + /* USER CODE END 4 */ + } + /* USER CODE BEGIN 5 */ + /* USER CODE END 5 */ + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_dma_rx/init/main.h b/drivers_sample/uart/sample_uart_dma_rx/init/main.h new file mode 100644 index 000000000..acb8e43a2 --- /dev/null +++ b/drivers_sample/uart/sample_uart_dma_rx/init/main.h @@ -0,0 +1,58 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "uart_ex.h" +#include "crg.h" +#include "dma.h" +#include "dma_ex.h" +#include "iocmg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define XTAL_DRV_LEVEL4 0x03U +#define XTAL_DRV_LEVEL3 0x02U +#define XTAL_DRV_LEVEL2 0x01U +#define XTAL_DRV_LEVEL1 0x00U + +extern UART_Handle g_uart; + +extern DMA_Handle g_dmac; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +void UART0WriteInterruptCallback(UART_Handle *handle); +void UART0ReadInterruptCallback(UART_Handle *handle); +void UART0InterruptErrorCallback(void *handle); +void DMA_Channel2CallBack(void *handle); +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_dma_rx/init/system_init.c b/drivers_sample/uart/sample_uart_dma_rx/init/system_init.c new file mode 100644 index 000000000..3f7049d9d --- /dev/null +++ b/drivers_sample/uart/sample_uart_dma_rx/init/system_init.c @@ -0,0 +1,142 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" +#include "iocmg_ip.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 48; /* PLL Multiplier 48 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void DMA_Channel2Init(void *handle) +{ + DMA_ChannelParam dma_param; + dma_param.direction = DMA_PERIPH_TO_MEMORY_BY_DMAC; + dma_param.srcAddrInc = DMA_ADDR_UNALTERED; + dma_param.destAddrInc = DMA_ADDR_INCREASE; + dma_param.srcPeriph = DMA_REQUEST_UART0_RX; + dma_param.destPeriph = DMA_REQUEST_MEM; + dma_param.srcWidth = DMA_TRANSWIDTH_BYTE; + dma_param.destWidth = DMA_TRANSWIDTH_BYTE; + dma_param.srcBurst = DMA_BURST_LENGTH_1; + dma_param.destBurst = DMA_BURST_LENGTH_1; + dma_param.pHandle = handle; + HAL_DMA_InitChannel(&g_dmac, &dma_param, DMA_CHANNEL_TWO); +} + +static void DMA_Init(void) +{ + HAL_CRG_IpEnableSet(DMA_BASE, IP_CLK_ENABLE); + g_dmac.baseAddress = DMA; + IRQ_Register(IRQ_DMA_TC, HAL_DMA_IrqHandlerTc, &g_dmac); + IRQ_Register(IRQ_DMA_ERR, HAL_DMA_IrqHandlerError, &g_dmac); + IRQ_EnableN(IRQ_DMA_TC); + IRQ_EnableN(IRQ_DMA_ERR); + HAL_DMA_Init(&g_dmac); + DMA_Channel2Init((void *)(&g_uart)); + HAL_DMA_SetChannelPriorityEx(&g_dmac, DMA_CHANNEL_TWO, DMA_PRIORITY_MEDIUM); +} + +__weak void UART0InterruptErrorCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN UART0_TRNS_IT_ERROR */ + /* USER CODE END UART0_TRNS_IT_ERROR */ +} + +__weak void DMA_Channel2CallBack(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN UART0_READ_DMA_FINISH */ + /* USER CODE END UART0_READ_DMA_FINISH */ +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + + g_uart.baseAddress = UART0; + + g_uart.baudRate = UART0_BAND_RATE; + g_uart.dataLength = UART_DATALENGTH_8BIT; + g_uart.stopBits = UART_STOPBITS_ONE; + g_uart.parity = UART_PARITY_NONE; + g_uart.txMode = UART_MODE_BLOCKING; + g_uart.rxMode = UART_MODE_DMA; + g_uart.fifoMode = BASE_CFG_ENABLE; + g_uart.fifoTxThr = UART_FIFODEPTH_SIZE8; + g_uart.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart.hwFlowCtr = BASE_CFG_DISABLE; + g_uart.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart.handleEx.msbFirst = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart); + HAL_UART_RegisterCallBack(&g_uart, UART_TRNS_IT_ERROR, UART0InterruptErrorCallback); + + IRQ_Register(IRQ_UART0, HAL_UART_IrqHandler, &g_uart); + IRQ_SetPriority(IRQ_UART0, 1); + IRQ_EnableN(IRQ_UART0); + g_uart.dmaHandle = &g_dmac; + g_uart.uartDmaRxChn = 2; /* DMA channel is 2. */ + HAL_UART_RegisterCallBack(&g_uart, UART_READ_DMA_FINISH, DMA_Channel2CallBack); +} + +static void IOConfig(void) +{ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ +} + +void SystemInit(void) +{ + IOConfig(); + DMA_Init(); + UART0_Init(); + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_dma_rx/readme.md b/drivers_sample/uart/sample_uart_dma_rx/readme.md new file mode 100644 index 000000000..3c3cec867 --- /dev/null +++ b/drivers_sample/uart/sample_uart_dma_rx/readme.md @@ -0,0 +1,22 @@ +# UART-DMA模式接收数据 +## 关键字: UART, DMA模式接收 + +**【功能描述】** ++ 在UART DMA模式下,通过DMA将接收的数据搬运到指定的内存空间。 + +**【示例配置】** ++ 预设置的缓存:需要使用者自行开辟内存空间,将内存首地址和需要接收的字符长度作为入参传入HAL_UART_ReadDMA()。 + ++ 串口0的接收模式配置为DMA模式。 + ++ 初始化DMA接收通道,需配置源地址和目标地址增长方式以及中断等。可通过DMA配置界面进行更改。 + ++ DMA接收完成中断:DMA接收中断开启,接收完成之后,会调用接收完成回调函数“DMA_Channel2CallBack”, 回调函数的名称可通过“HAL_UART_RegisterCallBack”进行更改。 + ++ 串口0会打印出接收到的数据和提示信息。 + +**【示例效果】** ++ 向串口0发送数据,串口0会将接收的数据打印。 + +**【注意事项】** ++ 串口通信的波特率,校验位等配置需保持一致,可以通过UART配置界面进行更改。 \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_dma_rx/src/sample_uart_dma_rx.c b/drivers_sample/uart/sample_uart_dma_rx/src/sample_uart_dma_rx.c new file mode 100644 index 000000000..282a18707 --- /dev/null +++ b/drivers_sample/uart/sample_uart_dma_rx/src/sample_uart_dma_rx.c @@ -0,0 +1,59 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_uart_dma_rx.c + * @author MCU Driver Team + * @brief uart sample module, DMA transfer direction: peripheral to memory. + * @details In DMA mode, after receiving data from the UART, the DMA receives the transfer + * request from the UART and transfers the data to the preset memory. + * (1)Preset buffer: The user needs to create the memory space. Use the start address of the memory + * and the length of the character to be received as input parameters to HAL_UART_ReadDMA(). + * (2) Result reading: Read the result from the preset memory in the callback function of the DMA. + */ + +#include "sample_uart_dma_rx.h" + +static unsigned char g_rxStr[20] = {0}; +/** + * @brief User-defined read completion DMAC callback function. + * @param handle UART handle. + * @retval None. + */ +void DMA_Channel2CallBack(void *handle) +{ + UART_Handle *uartHandle = (UART_Handle *)handle; + DBG_PRINTF("read_finish: %s\r\n", g_rxStr); + BASE_FUNC_UNUSED(uartHandle); + return; +} + +/** + * @brief UART receive sample code in DMAC mode. + * @param None. + * @retval None. + */ +int UART_DMA_RX(void) +{ + SystemInit(); + DBG_PRINTF("UART and DMA Init Finish, please send characters to UART\r\n"); + unsigned int dataLength = 10; /* The receive length is 10 */ + HAL_UART_ReadDMA(&g_uart, g_rxStr, dataLength); + while (1) { + HAL_UART_ReadDMA(&g_uart, g_rxStr, dataLength); + } + return 0; +} \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/inc/sample_uart_dma_rx_cyclically_stored.h b/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/inc/sample_uart_dma_rx_cyclically_stored.h new file mode 100644 index 000000000..d0c10ea51 --- /dev/null +++ b/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/inc/sample_uart_dma_rx_cyclically_stored.h @@ -0,0 +1,34 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_uart_dma_rx_cyclically_stored.h + * @author MCU Driver Team + * @brief uart sample module. + * @details This file provides sample code for users to help use + * the repeat transmission of the UART in DMA mode. + */ + +#ifndef SAMPLE_UART_DMA_RX_CYCLICALLY_STORED_H +#define SAMPLE_UART_DMA_RX_CYCLICALLY_STORED_H + +#include "debug.h" +#include "uart.h" +#include "interrupt.h" +#include "main.h" + +int UART_DMA_RxCyclicallyStored(void); +#endif \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/init/main.c b/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/init/main.c new file mode 100644 index 000000000..90a64adb1 --- /dev/null +++ b/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/init/main.c @@ -0,0 +1,51 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ + +#include "typedefs.h" +#include "feature.h" +#include "sample_uart_dma_rx_cyclically_stored.h" +#include "main.h" +/* USER CODE BEGIN 0 */ +/* USER CODE END 0 */ +UART_Handle g_uart; +DMA_Handle g_dmac; +/* USER CODE BEGIN 1 */ +/* USER CODE END 1 */ + +int main(void) +{ + /* USER CODE BEGIN 2 */ + /* USER CODE END 2 */ + UART_DMA_RxCyclicallyStored(); + /* USER CODE BEGIN 3 */ + /* USER CODE END 3 */ + while (1) { + /* USER CODE BEGIN 4 */ + /* USER CODE END 4 */ + } + /* USER CODE BEGIN 5 */ + /* USER CODE END 5 */ + return BASE_STATUS_OK; +} + +/* USER CODE BEGIN 6 */ +/* USER CODE END 6 */ \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/init/main.h b/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/init/main.h new file mode 100644 index 000000000..7c8cbfe4c --- /dev/null +++ b/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/init/main.h @@ -0,0 +1,54 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "uart_ex.h" +#include "crg.h" +#include "dma.h" +#include "dma_ex.h" +#include "debug.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define XTAL_DRV_LEVEL4 0x03U +#define XTAL_DRV_LEVEL3 0x02U +#define XTAL_DRV_LEVEL2 0x01U +#define XTAL_DRV_LEVEL1 0x00U + +extern UART_Handle g_uart; + +extern DMA_Handle g_dmac; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); +void DMA_Channel2CallBack(void *handle); +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/init/system_init.c b/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/init/system_init.c new file mode 100644 index 000000000..56391d3f7 --- /dev/null +++ b/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/init/system_init.c @@ -0,0 +1,131 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" +#include "iocmg.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 48; /* PLL Multiplier 48 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void DMA_Channel2Init(void *handle) +{ + DMA_ChannelParam dma_param; + dma_param.direction = DMA_PERIPH_TO_MEMORY_BY_DMAC; + dma_param.srcAddrInc = DMA_ADDR_UNALTERED; + dma_param.destAddrInc = DMA_ADDR_INCREASE; + dma_param.srcPeriph = DMA_REQUEST_UART0_RX; + dma_param.destPeriph = DMA_REQUEST_MEM; + dma_param.srcWidth = DMA_TRANSWIDTH_BYTE; + dma_param.destWidth = DMA_TRANSWIDTH_BYTE; + dma_param.srcBurst = DMA_BURST_LENGTH_1; + dma_param.destBurst = DMA_BURST_LENGTH_1; + dma_param.pHandle = handle; + HAL_DMA_InitChannel(&g_dmac, &dma_param, DMA_CHANNEL_TWO); +} + +static void DMA_Init(void) +{ + HAL_CRG_IpEnableSet(DMA_BASE, IP_CLK_ENABLE); + g_dmac.baseAddress = DMA; + IRQ_Register(IRQ_DMA_TC, HAL_DMA_IrqHandlerTc, &g_dmac); + IRQ_Register(IRQ_DMA_ERR, HAL_DMA_IrqHandlerError, &g_dmac); + IRQ_EnableN(IRQ_DMA_TC); + IRQ_EnableN(IRQ_DMA_ERR); + HAL_DMA_Init(&g_dmac); + DMA_Channel2Init((void *)(&g_uart)); + HAL_DMA_SetChannelPriorityEx(&g_dmac, DMA_CHANNEL_TWO, DMA_PRIORITY_MEDIUM); +} + +__weak void DMA_Channel2CallBack(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN UART0_READ_DMA_FINISH */ + /* USER CODE END UART0_READ_DMA_FINISH */ +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + + g_uart.baseAddress = UART0; + + g_uart.baudRate = UART0_BAND_RATE; + g_uart.dataLength = UART_DATALENGTH_8BIT; + g_uart.stopBits = UART_STOPBITS_ONE; + g_uart.parity = UART_PARITY_NONE; + g_uart.txMode = UART_MODE_BLOCKING; + g_uart.rxMode = UART_MODE_DMA; + g_uart.fifoMode = BASE_CFG_ENABLE; + g_uart.fifoTxThr = UART_FIFODEPTH_SIZE8; + g_uart.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart.hwFlowCtr = BASE_CFG_DISABLE; + g_uart.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart.handleEx.msbFirst = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart); + + g_uart.dmaHandle = &g_dmac; + g_uart.uartDmaRxChn = 2; /* DMA channel is 2. */ + HAL_UART_RegisterCallBack(&g_uart, UART_READ_DMA_FINISH, DMA_Channel2CallBack); +} + +static void IOConfig(void) +{ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ +} + +void SystemInit(void) +{ + IOConfig(); + DMA_Init(); + UART0_Init(); + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/readme.md b/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/readme.md new file mode 100644 index 000000000..7391320f5 --- /dev/null +++ b/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/readme.md @@ -0,0 +1,21 @@ +# UART-DMA模式循环接收数据 +## 关键字: UART, DMA循环接收 + +**【功能描述】** ++ 在UART DMA模式下,当UART接收数据完成后,DMA接收到UART的搬运请求,将数据循环搬运到预设置的内存中, 当预设置的内存写满之后, +将会从内存的起始地址开始写, 循环此过程。 + +**【示例配置】** ++ 预设置的缓存:需要使用者自行开辟内存空间,将内存首地址和需要接收的字符长度作为入参传入HAL_UART_ReadDMAAndCyclicallyStored()中。 + ++ 串口0的接收模式配置为DMA模式。并初始化DMA接收通道,需配置源地址和目标地址增长方式以及中断等。可通过DMA配置界面进行更改。 + ++ DMA接收数据完成,会将接收的数据存储在预设置的缓存中,并通过串口打印。 + ++ 结果读取:通过读取预设置的内存,并通过函数“HAL_UART_ReadDMAGetPos”来判断相对于指定内存的偏移位置。 + +**【示例效果】** ++ 不断向串口0发送数据,串口0会打印出接收的数据,并将数据储存到预设的内存中,当预设置的内存写满之后,会从内存的起始地址开始写。 + +**【注意事项】** ++ 串口通信的波特率,校验位等配置需保持一致,可以通过UART配置界面进行更改。 \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/src/sample_uart_dma_rx_cyclically_stored.c b/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/src/sample_uart_dma_rx_cyclically_stored.c new file mode 100644 index 000000000..b18e889b1 --- /dev/null +++ b/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/src/sample_uart_dma_rx_cyclically_stored.c @@ -0,0 +1,65 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_uart_dma_rx_cyclically_stored.c + * @author MCU Driver Team + * @brief uart sample module, UART example module, DMA cyclic write data, transfer direction: peripheral to memory. + * @details In DMA cyclic write data mode, after receiving data from the UART, DMA transfers the data to + * preset memory. If the memory is full, the data will be stored again. + * request from the UART and transfers the data to the preset memory. + * (1)Preset buffer: The user needs to create the memory space. Use the start address of the memory + * and length of character to be received as input parameters to HAL_UART_ReadDMAAndCyclicallyStored(). + * (2) Result reading: Read the result from the preset memory. + */ + +#include "sample_uart_dma_rx_cyclically_stored.h" + +#define BUF_LEN 80 + +unsigned int g_pointRead = 0; /* Read position */ +unsigned int g_pointWrite = 0; /* Write position */ + +unsigned char g_buf[BUF_LEN]; /* Buf for saving data */ + +static DMA_LinkList g_Node; /* DMA linked list must be global */ + +int UART_DMA_RxCyclicallyStored(void) +{ + SystemInit(); + + DBG_PRINTF("UART and DMA Init Finish\r\n UART DMA read and cyclically stored: please send characters to UART\r\n"); + g_pointRead = 0; + + /* Start DMA cyclically stored, The DMA can cyclically transfer data to the g_buf buffer */ + HAL_UART_ReadDMAAndCyclicallyStored(&g_uart, g_buf, &g_Node, BUF_LEN); + + while (1) { + /* Obtains the destination address written by the DAM */ + g_pointWrite = HAL_UART_ReadDMAGetPos(&g_uart); + + /* Print data if read pointer is inconsistent with write pointer */ + while (g_pointRead != g_pointWrite) { + DBG_PRINTF( + "g_pointRead=0x%x, g_pointWrite=0x%x, receive:%c\r\n", g_pointRead, g_pointWrite, g_buf[g_pointRead]); + g_pointRead++; + if (g_pointRead >= BUF_LEN) { + g_pointRead = 0; + } + } + } + return 0; +} diff --git a/drivers_sample/uart/sample_uart_dma_tx/inc/sample_uart_dma_tx.h b/drivers_sample/uart/sample_uart_dma_tx/inc/sample_uart_dma_tx.h new file mode 100644 index 000000000..bb8f625ca --- /dev/null +++ b/drivers_sample/uart/sample_uart_dma_tx/inc/sample_uart_dma_tx.h @@ -0,0 +1,33 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_uart_dma_tx.h + * @author MCU Driver Team + * @brief uart sample module. + * @details This file provides sample code for users to help use + * the transmission of the UART in DMA mode. + */ +#ifndef SAMPLE_UART_DMA_TX_H +#define SAMPLE_UART_DMA_TX_H + +#include "debug.h" +#include "uart.h" +#include "interrupt.h" +#include "main.h" + +void UART_DMA_TX(void); +#endif \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_dma_tx/init/main.c b/drivers_sample/uart/sample_uart_dma_tx/init/main.c new file mode 100644 index 000000000..d3c9ff927 --- /dev/null +++ b/drivers_sample/uart/sample_uart_dma_tx/init/main.c @@ -0,0 +1,48 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ + +#include "typedefs.h" +#include "feature.h" +#include "sample_uart_dma_tx.h" +#include "main.h" +/* USER CODE BEGIN 0 */ +/* USER CODE END 0 */ +UART_Handle g_uart; +DMA_Handle g_dmac; +/* USER CODE BEGIN 1 */ +/* USER CODE END 1 */ + +int main(void) +{ + /* USER CODE BEGIN 2 */ + /* USER CODE END 2 */ + UART_DMA_TX(); + /* USER CODE BEGIN 3 */ + /* USER CODE END 3 */ + while (1) { + /* USER CODE BEGIN 4 */ + /* USER CODE END 4 */ + } + /* USER CODE BEGIN 5 */ + /* USER CODE END 5 */ + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_dma_tx/init/main.h b/drivers_sample/uart/sample_uart_dma_tx/init/main.h new file mode 100644 index 000000000..d2fdaec4e --- /dev/null +++ b/drivers_sample/uart/sample_uart_dma_tx/init/main.h @@ -0,0 +1,57 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "uart_ex.h" +#include "crg.h" +#include "dma.h" +#include "dma_ex.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define XTAL_DRV_LEVEL4 0x03U +#define XTAL_DRV_LEVEL3 0x02U +#define XTAL_DRV_LEVEL2 0x01U +#define XTAL_DRV_LEVEL1 0x00U + +extern UART_Handle g_uart; + +extern DMA_Handle g_dmac; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +void UART0WriteInterruptCallback(UART_Handle *handle); +void UART0ReadInterruptCallback(UART_Handle *handle); +void UART0InterruptErrorCallback(void *handle); +void DMA_Channel3CallBack(void *handle); +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_dma_tx/init/system_init.c b/drivers_sample/uart/sample_uart_dma_tx/init/system_init.c new file mode 100644 index 000000000..98ba5e617 --- /dev/null +++ b/drivers_sample/uart/sample_uart_dma_tx/init/system_init.c @@ -0,0 +1,144 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" +#include "iocmg_ip.h" +#include "iocmg.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 48; /* PLL Multiplier 48 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void DMA_Channel3Init(void *handle) +{ + DMA_ChannelParam dma_param; + dma_param.direction = DMA_MEMORY_TO_PERIPH_BY_DMAC; + dma_param.srcAddrInc = DMA_ADDR_INCREASE; + dma_param.destAddrInc = DMA_ADDR_UNALTERED; + dma_param.srcPeriph = DMA_REQUEST_MEM; + dma_param.destPeriph = DMA_REQUEST_UART0_TX; + dma_param.srcWidth = DMA_TRANSWIDTH_BYTE; + dma_param.destWidth = DMA_TRANSWIDTH_BYTE; + dma_param.srcBurst = DMA_BURST_LENGTH_1; + dma_param.destBurst = DMA_BURST_LENGTH_1; + dma_param.pHandle = handle; + HAL_DMA_InitChannel(&g_dmac, &dma_param, DMA_CHANNEL_THREE); +} + +static void DMA_Init(void) +{ + HAL_CRG_IpEnableSet(DMA_BASE, IP_CLK_ENABLE); + g_dmac.baseAddress = DMA; + IRQ_Register(IRQ_DMA_TC, HAL_DMA_IrqHandlerTc, &g_dmac); + IRQ_Register(IRQ_DMA_ERR, HAL_DMA_IrqHandlerError, &g_dmac); + IRQ_EnableN(IRQ_DMA_TC); + IRQ_EnableN(IRQ_DMA_ERR); + HAL_DMA_Init(&g_dmac); + DMA_Channel3Init((void *)(&g_uart)); + HAL_DMA_SetChannelPriorityEx(&g_dmac, DMA_CHANNEL_THREE, DMA_PRIORITY_LOW); +} + +__weak void UART0InterruptErrorCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN UART0_TRNS_IT_ERROR */ + /* USER CODE END UART0_TRNS_IT_ERROR */ +} + +__weak void DMA_Channel3CallBack(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN UART0_WRITE_DMA_FINISH */ + /* USER CODE END UART0_WRITE_DMA_FINISH */ +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + + g_uart.baseAddress = UART0; + + g_uart.baudRate = UART0_BAND_RATE; + g_uart.dataLength = UART_DATALENGTH_8BIT; + g_uart.stopBits = UART_STOPBITS_ONE; + g_uart.parity = UART_PARITY_NONE; + g_uart.txMode = UART_MODE_DMA; + g_uart.rxMode = UART_MODE_BLOCKING; + g_uart.fifoMode = BASE_CFG_ENABLE; + g_uart.fifoTxThr = UART_FIFODEPTH_SIZE8; + g_uart.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart.hwFlowCtr = BASE_CFG_DISABLE; + g_uart.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart.handleEx.msbFirst = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart); + HAL_UART_RegisterCallBack(&g_uart, UART_TRNS_IT_ERROR, UART0InterruptErrorCallback); + + IRQ_Register(IRQ_UART0, HAL_UART_IrqHandler, &g_uart); + IRQ_SetPriority(IRQ_UART0, 1); + IRQ_EnableN(IRQ_UART0); + g_uart.dmaHandle = &g_dmac; + g_uart.uartDmaTxChn = 3; /* Rx Dma Channel is 3. */ + HAL_UART_RegisterCallBack(&g_uart, UART_WRITE_DMA_FINISH, DMA_Channel3CallBack); +} + +static void IOConfig(void) +{ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ +} + +void SystemInit(void) +{ + IOConfig(); + DMA_Init(); + UART0_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_dma_tx/readme.md b/drivers_sample/uart/sample_uart_dma_tx/readme.md new file mode 100644 index 000000000..1b61cb366 --- /dev/null +++ b/drivers_sample/uart/sample_uart_dma_tx/readme.md @@ -0,0 +1,22 @@ +# UART-DMA模式发送数据 +## 关键字: UART, DMA模式发送 + +**【功能描述】** ++ 在UART DMA模式下,DMA接收到UART的搬运请求,将待发送的数据从内存中直接搬运到UART直接发送。 + +**【示例配置】** ++ 预发送数据:将待发送首地址和字符长度作为入参传入HAL_UART_WriteDMA()。 + ++ 串口0的发送模式配置为DMA模式。 + ++ 初始化DMA发送通道,需配置源地址和目标地址增长方式以及中断等。可通过DMA配置界面进行更改。 + ++ DMA发送完成中断:DMA发送中断开启,数据发送完成之后,会调用发送完成回调函数“DMA_Channel3CallBack”, 回调函数的名称可通过“HAL_UART_RegisterCallBack”进行更改。 + ++ 串口0会打印出发送成功等提示信息。 + +**【示例效果】** ++ DMA搬运结束后,会上报中断,可以在DMA中断回调函数中加上标志位进行判断是否完成。若发送完成,串口0会打印“write_finish”字符。 + +**【注意事项】** ++ 串口通信的波特率,校验位等配置需保持一致,可以通过UART配置界面进行更改。 \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_dma_tx/src/sample_uart_dma_tx.c b/drivers_sample/uart/sample_uart_dma_tx/src/sample_uart_dma_tx.c new file mode 100644 index 000000000..5111c11e8 --- /dev/null +++ b/drivers_sample/uart/sample_uart_dma_tx/src/sample_uart_dma_tx.c @@ -0,0 +1,58 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_uart_dma_tx.c + * @author MCU Driver Team + * @brief uart sample module, DMA transfer direction: memory to peripheral. + * @details In DMA mode, the DMA receives the transfer request from the UART and directly transfers the data + * to be transmitted from the memory to the UART for transmission. + * (1) Data to be sent: The start address and character length to be sent are used as input parameters + * and transferred to HAL_UART_WriteDMA(). + * (2) Result determination: After the DMA transfer is complete, an interrupt is reported. You can add + * a flag to the DMA interrupt callback function to determine whether the transfer is complete. + */ + +#include "sample_uart_dma_tx.h" + +static unsigned char g_txStr[] = "123456789A"; + + +/** + * @brief User-defined write completion DMAC callback function. + * @param handle UART handle. + * @retval None. + */ +void DMA_Channel3CallBack(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("\r\nwrite_finish\r\n"); + return; +} + +/** + * @brief UART send sample code in DMAC mode. + * @param None. + * @retval None. + */ +void UART_DMA_TX(void) +{ + SystemInit(); + unsigned int dataLength = 10; + DBG_PRINTF("UART and DMA Init finish\r\n"); + HAL_UART_WriteDMA(&g_uart, g_txStr, dataLength); /* Sending timeout */ + return; +} \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/inc/sample_uart_dma_tx_dma_rx_simultaneously.h b/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/inc/sample_uart_dma_tx_dma_rx_simultaneously.h new file mode 100644 index 000000000..22624e40a --- /dev/null +++ b/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/inc/sample_uart_dma_tx_dma_rx_simultaneously.h @@ -0,0 +1,33 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_uart_dma_tx_dma_rx_simultaneously.h + * @author MCU Driver Team + * @brief uart sample module. + * @details This file provides sample code for users to help use + * the transmission of the UART in DMA TX/RX simultaneously. + */ +#ifndef SAMPLE_UART_DMA_TX_DMA_RX_SIMULTANEOUSLY_H +#define SAMPLE_UART_DMA_TX_DMA_RX_SIMULTANEOUSLY_H + +#include "debug.h" +#include "uart.h" +#include "interrupt.h" +#include "main.h" + +void UART_DMATxAndRxSimultaneously(void); +#endif \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/init/main.c b/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/init/main.c new file mode 100644 index 000000000..bdd352ec3 --- /dev/null +++ b/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/init/main.c @@ -0,0 +1,48 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ + +#include "typedefs.h" +#include "feature.h" +#include "sample_uart_dma_tx_dma_rx_simultaneously.h" +#include "main.h" +/* USER CODE BEGIN 0 */ +/* USER CODE END 0 */ +UART_Handle g_uart; +DMA_Handle g_dmac; +/* USER CODE BEGIN 1 */ +/* USER CODE END 1 */ + +int main(void) +{ + /* USER CODE BEGIN 2 */ + /* USER CODE END 2 */ + UART_DMATxAndRxSimultaneously(); + /* USER CODE BEGIN 3 */ + /* USER CODE END 3 */ + while (1) { + /* USER CODE BEGIN 4 */ + /* USER CODE END 4 */ + } + /* USER CODE BEGIN 5 */ + /* USER CODE END 5 */ + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/init/main.h b/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/init/main.h new file mode 100644 index 000000000..ebfbea6cc --- /dev/null +++ b/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/init/main.h @@ -0,0 +1,54 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "uart_ex.h" +#include "crg.h" +#include "dma.h" +#include "dma_ex.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define XTAL_DRV_LEVEL4 0x03U +#define XTAL_DRV_LEVEL3 0x02U +#define XTAL_DRV_LEVEL2 0x01U +#define XTAL_DRV_LEVEL1 0x00U + +extern UART_Handle g_uart; + +extern DMA_Handle g_dmac; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); +void DMA_Channel3CallBack(void *handle); +void DMA_Channel2CallBack(void *handle); +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/init/system_init.c b/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/init/system_init.c new file mode 100644 index 000000000..a17817354 --- /dev/null +++ b/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/init/system_init.c @@ -0,0 +1,158 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" +#include "iocmg.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 48; /* PLL Multiplier 48 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void DMA_Channel3Init(void *handle) +{ + DMA_ChannelParam dma_param; + dma_param.direction = DMA_MEMORY_TO_PERIPH_BY_DMAC; + dma_param.srcAddrInc = DMA_ADDR_INCREASE; + dma_param.destAddrInc = DMA_ADDR_UNALTERED; + dma_param.srcPeriph = DMA_REQUEST_MEM; + dma_param.destPeriph = DMA_REQUEST_UART0_TX; + dma_param.srcWidth = DMA_TRANSWIDTH_BYTE; + dma_param.destWidth = DMA_TRANSWIDTH_BYTE; + dma_param.srcBurst = DMA_BURST_LENGTH_1; + dma_param.destBurst = DMA_BURST_LENGTH_1; + dma_param.pHandle = handle; + HAL_DMA_InitChannel(&g_dmac, &dma_param, DMA_CHANNEL_THREE); +} + +static void DMA_Channel2Init(void *handle) +{ + DMA_ChannelParam dma_param; + dma_param.direction = DMA_PERIPH_TO_MEMORY_BY_DMAC; + dma_param.srcAddrInc = DMA_ADDR_UNALTERED; + dma_param.destAddrInc = DMA_ADDR_INCREASE; + dma_param.srcPeriph = DMA_REQUEST_UART0_RX; + dma_param.destPeriph = DMA_REQUEST_MEM; + dma_param.srcWidth = DMA_TRANSWIDTH_BYTE; + dma_param.destWidth = DMA_TRANSWIDTH_BYTE; + dma_param.srcBurst = DMA_BURST_LENGTH_1; + dma_param.destBurst = DMA_BURST_LENGTH_1; + dma_param.pHandle = handle; + HAL_DMA_InitChannel(&g_dmac, &dma_param, DMA_CHANNEL_TWO); +} + +static void DMA_Init(void) +{ + HAL_CRG_IpEnableSet(DMA_BASE, IP_CLK_ENABLE); + g_dmac.baseAddress = DMA; + IRQ_Register(IRQ_DMA_TC, HAL_DMA_IrqHandlerTc, &g_dmac); + IRQ_Register(IRQ_DMA_ERR, HAL_DMA_IrqHandlerError, &g_dmac); + IRQ_EnableN(IRQ_DMA_TC); + IRQ_EnableN(IRQ_DMA_ERR); + HAL_DMA_Init(&g_dmac); + DMA_Channel3Init((void *)(&g_uart)); + HAL_DMA_SetChannelPriorityEx(&g_dmac, DMA_CHANNEL_THREE, DMA_PRIORITY_LOW); + DMA_Channel2Init((void *)(&g_uart)); + HAL_DMA_SetChannelPriorityEx(&g_dmac, DMA_CHANNEL_TWO, DMA_PRIORITY_MEDIUM); +} + +__weak void DMA_Channel3CallBack(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN UART0_WRITE_DMA_FINISH */ + /* USER CODE END UART0_WRITE_DMA_FINISH */ +} + +__weak void DMA_Channel2CallBack(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN UART0_READ_DMA_FINISH */ + /* USER CODE END UART0_READ_DMA_FINISH */ +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + + g_uart.baseAddress = UART0; + + g_uart.baudRate = UART0_BAND_RATE; + g_uart.dataLength = UART_DATALENGTH_8BIT; + g_uart.stopBits = UART_STOPBITS_ONE; + g_uart.parity = UART_PARITY_NONE; + g_uart.txMode = UART_MODE_DMA; + g_uart.rxMode = UART_MODE_DMA; + g_uart.fifoMode = BASE_CFG_ENABLE; + g_uart.fifoTxThr = UART_FIFODEPTH_SIZE8; + g_uart.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart.hwFlowCtr = BASE_CFG_DISABLE; + g_uart.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart.handleEx.msbFirst = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart); + + g_uart.dmaHandle = &g_dmac; + g_uart.uartDmaTxChn = 3; /* Rx Dma Channel is 3. */ + HAL_UART_RegisterCallBack(&g_uart, UART_WRITE_DMA_FINISH, DMA_Channel3CallBack); + g_uart.uartDmaRxChn = 2; /* DMA channel is 2. */ + HAL_UART_RegisterCallBack(&g_uart, UART_READ_DMA_FINISH, DMA_Channel2CallBack); +} + +static void IOConfig(void) +{ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ +} + +void SystemInit(void) +{ + IOConfig(); + DMA_Init(); + UART0_Init(); + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/readme.md b/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/readme.md new file mode 100644 index 000000000..edef7c1d1 --- /dev/null +++ b/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/readme.md @@ -0,0 +1,22 @@ +# UART-Tx和Rx在DMA模式下同时收发数据 +## 关键字: UART, Tx_DMA_Rx_INT收发数据 + +**【功能描述】** ++ UART_DMA全双工收发数据,UART_DMA写的过程中,可以进行UART_DMA读。 + +**【示例配置】** ++ 预设置的缓存:配置发送数据和接收数据缓存地址 + ++ UART的Tx和Rx都配置为DMA模式。 + ++ UART_DMA发送数据:将待发送首地址和字符长度作为入参传入HAL_UART_WriteDMA()。 + ++ UART_DMA接收数据:将存放接收的首地址,和接收长度作为入参传入到HAL_UART_ReadDMA()中。 + ++ 串口0会打印发送和接收的数据。 + +**【示例效果】** ++ 示例程序会不断的进行UART_DMA发送、接收,实现UART_DMA写的过程中,可以进行UART_DMA读。 + +**【注意事项】** ++ 串口通信的波特率,校验位等配置需保持一致,可以通过UART配置界面进行更改。 \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/src/sample_uart_dma_tx_dma_rx_simultaneously.c b/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/src/sample_uart_dma_tx_dma_rx_simultaneously.c new file mode 100644 index 000000000..39deeeb42 --- /dev/null +++ b/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/src/sample_uart_dma_tx_dma_rx_simultaneously.c @@ -0,0 +1,113 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_uart_dma_tx_dma_rx_simultaneously.c + * @author MCU Driver Team + * @brief uart sample module, DMA transfer simultaneously. + * @details Transmits and receives UART_DMA data simultaneously. During UART_DMA write, UART_DMA can be read. + * (1) UART_DMA transmit data: The to-be-sent start address and character length are used as input + * parameters and transferred to HAL_UART_WriteDMA(). + * (2) UART_DMA receive data: The start address and receive length are used as input parameters to + * HAL_UART_ReadDMA(). + * (3) The sample program continuously transmits and receives UART_DMA. During UART_DMA write, + * UART_DMA can be read. + */ + +#include "sample_uart_dma_tx_dma_rx_simultaneously.h" + +#define DMA_RX_DATA_LENGTH 10 +#define DMA_TX_DATA_LENGTH 15 +#define NEED_REQUIRE_TIME 30 + +static unsigned char g_txDMAStr[DMA_TX_DATA_LENGTH] = "123456789012345"; /* The transmit data length is 15 */ +static unsigned char g_rxDMAStr[DMA_RX_DATA_LENGTH] = {0}; /* The receive data length is 10 */ +volatile bool txDMAFlag = false; /* This parameter is frequently changed in + the main function and callback function, + indicating whether the transmission is complete */ + +volatile bool rxDMAFlag = false; /* This parameter is frequently changed in + the main function and callback function, + indicating whether the reception is complete */ + +/** + * @brief Clear string. + * @param str, String to be cleared. + * @retval None. + */ +static void ClearString(unsigned char *str) +{ + for (unsigned int i = 0; i < DMA_RX_DATA_LENGTH; ++i) { + str[i] = 0; + } +} + +/** + * @brief User-defined write completion DMA write finish callback function. + * @param handle UART handle. + * @retval None. + */ +void DMA_Channel3CallBack(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("\r\nwrite_finish\r\n"); + txDMAFlag = true; + return; +} + +/** + * @brief User-defined write completion DMA read finish callback function. + * @param handle UART handle. + * @retval None. + */ +void DMA_Channel2CallBack(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("\r\nread_finish: %s\r\n", g_rxDMAStr); + rxDMAFlag = true; + return; +} + +/** + * @brief UART send and receive sample code in DMA mode. + * @param None. + * @retval None. + */ +void UART_DMATxAndRxSimultaneously(void) +{ + SystemInit(); + DBG_PRINTF("UART and DMA Init finish, UART DMA Tx DMA Rx simultaneously mode:\r\n"); + DBG_PRINTF("Tx transmits data 123456789012345, and Rx receives data with the length of 10 \r\n"); + + txDMAFlag = true; /* Enable DMA transmission */ + rxDMAFlag = true; /* Enable DMA reception */ + while (1) { + if (txDMAFlag) { + txDMAFlag = false; + HAL_UART_WriteDMA(&g_uart, g_txDMAStr, DMA_TX_DATA_LENGTH); /* DMA transmit data */ + } + + if (rxDMAFlag) { + rxDMAFlag = false; + ClearString(g_rxDMAStr); /* Clear the received data */ + /* DMA read: Length of the received data must be equal to the DMA_RX_DATA_LENGTH */ + HAL_UART_ReadDMA(&g_uart, g_rxDMAStr, DMA_RX_DATA_LENGTH); + } + /* Add a deletion delay as required */ + BASE_FUNC_DELAY_MS(NEED_REQUIRE_TIME); + } + return; +} \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/inc/sample_uart_dma_tx_int_rx_simultaneously.h b/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/inc/sample_uart_dma_tx_int_rx_simultaneously.h new file mode 100644 index 000000000..b42b3ff96 --- /dev/null +++ b/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/inc/sample_uart_dma_tx_int_rx_simultaneously.h @@ -0,0 +1,33 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_uart_dma_tx_int_rx_simultaneously.h + * @author MCU Driver Team + * @brief uart sample module. + * @details This file provides sample code for users to help use + * the transmission of the UART in DMA tx and interrupt rx simultaneously. + */ +#ifndef SAMPLE_UART_DMA_TX_INT_RX_SIMULTANEOUSLY_H +#define SAMPLE_UART_DMA_TX_INT_RX_SIMULTANEOUSLY_H + +#include "debug.h" +#include "uart.h" +#include "interrupt.h" +#include "main.h" + +void UART_DMATxAndINTRxSimultaneously(void); +#endif \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/init/main.c b/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/init/main.c new file mode 100644 index 000000000..d9924296f --- /dev/null +++ b/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/init/main.c @@ -0,0 +1,48 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ + +#include "typedefs.h" +#include "feature.h" +#include "sample_uart_dma_tx_int_rx_simultaneously.h" +#include "main.h" +/* USER CODE BEGIN 0 */ +/* USER CODE END 0 */ +UART_Handle g_uart; +DMA_Handle g_dmac; +/* USER CODE BEGIN 1 */ +/* USER CODE END 1 */ + +int main(void) +{ + /* USER CODE BEGIN 2 */ + /* USER CODE END 2 */ + UART_DMATxAndINTRxSimultaneously(); + /* USER CODE BEGIN 3 */ + /* USER CODE END 3 */ + while (1) { + /* USER CODE BEGIN 4 */ + /* USER CODE END 4 */ + } + /* USER CODE BEGIN 5 */ + /* USER CODE END 5 */ + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/init/main.h b/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/init/main.h new file mode 100644 index 000000000..90f388676 --- /dev/null +++ b/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/init/main.h @@ -0,0 +1,57 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "uart_ex.h" +#include "crg.h" +#include "dma.h" +#include "dma_ex.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define XTAL_DRV_LEVEL4 0x03U +#define XTAL_DRV_LEVEL3 0x02U +#define XTAL_DRV_LEVEL2 0x01U +#define XTAL_DRV_LEVEL1 0x00U + +extern UART_Handle g_uart; + +extern DMA_Handle g_dmac; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +void WriteFinish(void *handle); +void ReadCallBack(void *handle); +void UART0InterruptErrorCallback(void *handle); +void DMA_Channel3CallBack(void *handle); +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/init/system_init.c b/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/init/system_init.c new file mode 100644 index 000000000..67df918fc --- /dev/null +++ b/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/init/system_init.c @@ -0,0 +1,150 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" +#include "iocmg.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 48; /* PLL Multiplier 48 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void DMA_Channel3Init(void *handle) +{ + DMA_ChannelParam dma_param; + dma_param.direction = DMA_MEMORY_TO_PERIPH_BY_DMAC; + dma_param.srcAddrInc = DMA_ADDR_INCREASE; + dma_param.destAddrInc = DMA_ADDR_UNALTERED; + dma_param.srcPeriph = DMA_REQUEST_MEM; + dma_param.destPeriph = DMA_REQUEST_UART0_TX; + dma_param.srcWidth = DMA_TRANSWIDTH_BYTE; + dma_param.destWidth = DMA_TRANSWIDTH_BYTE; + dma_param.srcBurst = DMA_BURST_LENGTH_1; + dma_param.destBurst = DMA_BURST_LENGTH_1; + dma_param.pHandle = handle; + HAL_DMA_InitChannel(&g_dmac, &dma_param, DMA_CHANNEL_THREE); +} + +static void DMA_Init(void) +{ + HAL_CRG_IpEnableSet(DMA_BASE, IP_CLK_ENABLE); + g_dmac.baseAddress = DMA; + IRQ_Register(IRQ_DMA_TC, HAL_DMA_IrqHandlerTc, &g_dmac); + IRQ_Register(IRQ_DMA_ERR, HAL_DMA_IrqHandlerError, &g_dmac); + IRQ_EnableN(IRQ_DMA_TC); + IRQ_EnableN(IRQ_DMA_ERR); + HAL_DMA_Init(&g_dmac); + DMA_Channel3Init((void *)(&g_uart)); + HAL_DMA_SetChannelPriorityEx(&g_dmac, DMA_CHANNEL_THREE, DMA_PRIORITY_LOW); +} + +__weak void UART0InterruptErrorCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN UART0_TRNS_IT_ERROR */ + /* USER CODE END UART0_TRNS_IT_ERROR */ +} + +__weak void ReadCallBack(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN UART0_READ_IT_FINISH */ + /* USER CODE END UART0_READ_IT_FINISH */ +} + +__weak void DMA_Channel3CallBack(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN UART0_WRITE_DMA_FINISH */ + /* USER CODE END UART0_WRITE_DMA_FINISH */ +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + + g_uart.baseAddress = UART0; + + g_uart.baudRate = UART0_BAND_RATE; + g_uart.dataLength = UART_DATALENGTH_8BIT; + g_uart.stopBits = UART_STOPBITS_ONE; + g_uart.parity = UART_PARITY_NONE; + g_uart.txMode = UART_MODE_DMA; + g_uart.rxMode = UART_MODE_INTERRUPT; + g_uart.fifoMode = BASE_CFG_ENABLE; + g_uart.fifoTxThr = UART_FIFODEPTH_SIZE8; + g_uart.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart.hwFlowCtr = BASE_CFG_DISABLE; + g_uart.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart.handleEx.msbFirst = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart); + HAL_UART_RegisterCallBack(&g_uart, UART_TRNS_IT_ERROR, UART0InterruptErrorCallback); + HAL_UART_RegisterCallBack(&g_uart, UART_READ_IT_FINISH, ReadCallBack); + + IRQ_Register(IRQ_UART0, HAL_UART_IrqHandler, &g_uart); + IRQ_SetPriority(IRQ_UART0, 1); + IRQ_EnableN(IRQ_UART0); + g_uart.dmaHandle = &g_dmac; + g_uart.uartDmaTxChn = 3; /* Rx Dma Channel is 3. */ + HAL_UART_RegisterCallBack(&g_uart, UART_WRITE_DMA_FINISH, DMA_Channel3CallBack); +} + +static void IOConfig(void) +{ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ +} + +void SystemInit(void) +{ + IOConfig(); + DMA_Init(); + UART0_Init(); + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/readme.md b/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/readme.md new file mode 100644 index 000000000..acb2b0f97 --- /dev/null +++ b/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/readme.md @@ -0,0 +1,22 @@ +# UART-Tx在DMA模式下发送数据Rx在中断模式下接收数据 +## 关键字: UART, Tx_DMA_Rx_INT收发数据 + +**【功能描述】** ++ UART全双工收发数据,实现中断和UART_DAM全双工收发数据,UART_DMA写的过程中,可以进行中断读。 + +**【示例配置】** ++ 预设置的缓存:配置发送数据和接收数据缓存地址 + ++ 配置UART接收中断以及中断回调函数,默认接收中断回调函数为“ReadCallBack”, 可通过函数“HAL_UART_RegisterCallBack”进行更改。 + ++ UART_DMA发送数据:将待发送首地址和字符长度作为入参传入HAL_UART_WriteDMA()。 + ++ 中断接收数据:将存放接收的首地址,和接收长度作为入参传入到HAL_UART_ReadIT()中。 + ++ 串口0会打印发送和接收的数据。 + +**【示例效果】** ++ 示例程序会不断的进行UART_DMA发送、中断接收数据,实现UART_DMA发送的过程中,可以进行中断接收数据。 + +**【注意事项】** ++ 串口通信的波特率,校验位等配置需保持一致,可以通过UART配置界面进行更改。 \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/src/sample_uart_dma_tx_int_rx_simultaneously.c b/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/src/sample_uart_dma_tx_int_rx_simultaneously.c new file mode 100644 index 000000000..890da75ca --- /dev/null +++ b/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/src/sample_uart_dma_tx_int_rx_simultaneously.c @@ -0,0 +1,115 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_uart_dma_tx_int_rx_simultaneously.c + * @author MCU Driver Team + * @brief uart sample module. + * @details Implements the interrupt and UART_DAM transmit and receive data simultaneously. + * During UART_DMA write, the interrupt can be read. + * (1) UART_DMA transmit data: The to-be-sent start address and character length are used as input + * parameters and transferred to HAL_UART_WriteDMA(). + * (2) Interrupt receive data: The start address and receive length are used as input parameters to + * HAL_UART_ReadIT(). + * (3) The example program continuously transmits UART_DMA and interrupts data reception. + * During the UART_DMA transmission process, interrupts can be received data. + */ + +#include "sample_uart_dma_tx_int_rx_simultaneously.h" + +#define RX_DATA_LENGTH 10 +#define TX_DATA_LENGTH 15 +#define REQUIRE_TIME 30 + +static unsigned char g_txStr[TX_DATA_LENGTH] = "123456789012345"; /* The transmit data length is 15 */ +static unsigned char g_rxStr[RX_DATA_LENGTH] = {0}; /* The receive data length is 10 */ +volatile bool txFlag = false; /* This parameter is frequently changed in + the main function and callback function, + indicating whether transmission is complete */ + +volatile bool rxFlag = false; /* This parameter is frequently changed in + the main function and callback function, + indicating whether reception is complete */ + +/** + * @brief Clear string. + * @param str, String to be cleared. + * @retval None. + */ +static void ClearString(unsigned char *str) +{ + for (unsigned int i = 0; i < RX_DATA_LENGTH; ++i) { + str[i] = 0; + } +} + +/** + * @brief User-defined write completion interrupt callback function. + * @param UART_Handle UART handle. + * @retval None. + */ +void ReadCallBack(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("\r\nRead Finish: %s\r\n", g_rxStr); + rxFlag = true; + return; +} + +/** + * @brief User-defined write completion DMA callback function. + * @param handle UART handle. + * @retval None. + */ +void DMA_Channel3CallBack(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("\r\nwrite_finish\r\n"); + txFlag = true; + return; +} + +/** + * @brief UART DMA Tx and interrupt Rx simultaneously. + * @param None. + * @retval None. + */ +void UART_DMATxAndINTRxSimultaneously(void) +{ + SystemInit(); + DBG_PRINTF("UART Init finish, UART DMA Tx interrupt Rx simultaneously mode:\r\n"); + DBG_PRINTF("Tx transmits data 123456789012345, and Rx receives data with the length of 10 \r\n"); + + txFlag = true; /* Enable DMA transmission */ + rxFlag = true; /* Enable IT reception */ + while (1) { + if (txFlag) { + txFlag = false; + /* DMA transmit data */ + HAL_UART_WriteDMA(&g_uart, g_txStr, TX_DATA_LENGTH); + } + + if (rxFlag) { + rxFlag = false; + /* Clear the received data */ + ClearString(g_rxStr); + /* UART IT read: Length of the received data must be equal to the RX_DATA_LENGTH */ + HAL_UART_ReadIT(&g_uart, g_rxStr, RX_DATA_LENGTH); + } + BASE_FUNC_DELAY_MS(REQUIRE_TIME); /* Add a deletion delay as required */ + } + return; +} \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/inc/sample_uart_int_tx_dma_rx_simultaneously.h b/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/inc/sample_uart_int_tx_dma_rx_simultaneously.h new file mode 100644 index 000000000..2a20ac8bf --- /dev/null +++ b/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/inc/sample_uart_int_tx_dma_rx_simultaneously.h @@ -0,0 +1,34 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_uart_int_tx_dma_rx_simultaneously.h + * @author MCU Driver Team + * @brief uart sample module. + * @details This file provides sample code for users to help use + * the transmission of the UART in interrupt tx and DMA rx simultaneously. + */ + +#ifndef SAMPLE_UART_INT_TX_DMA_RX_SIMULTANEOUSLY_H +#define SAMPLE_UART_INT_TX_DMA_RX_SIMULTANEOUSLY_H + +#include "debug.h" +#include "uart.h" +#include "interrupt.h" +#include "main.h" + +void UART_INTTxAndDMARxSimultaneously(void); +#endif \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/init/main.c b/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/init/main.c new file mode 100644 index 000000000..173ab8d88 --- /dev/null +++ b/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/init/main.c @@ -0,0 +1,48 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ + +#include "typedefs.h" +#include "feature.h" +#include "sample_uart_int_tx_dma_rx_simultaneously.h" +#include "main.h" +/* USER CODE BEGIN 0 */ +/* USER CODE END 0 */ +UART_Handle g_uart; +DMA_Handle g_dmac; +/* USER CODE BEGIN 1 */ +/* USER CODE END 1 */ + +int main(void) +{ + /* USER CODE BEGIN 2 */ + /* USER CODE END 2 */ + UART_INTTxAndDMARxSimultaneously(); + /* USER CODE BEGIN 3 */ + /* USER CODE END 3 */ + while (1) { + /* USER CODE BEGIN 4 */ + /* USER CODE END 4 */ + } + /* USER CODE BEGIN 5 */ + /* USER CODE END 5 */ + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/init/main.h b/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/init/main.h new file mode 100644 index 000000000..e67e803d3 --- /dev/null +++ b/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/init/main.h @@ -0,0 +1,57 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "uart_ex.h" +#include "crg.h" +#include "dma.h" +#include "dma_ex.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define XTAL_DRV_LEVEL4 0x03U +#define XTAL_DRV_LEVEL3 0x02U +#define XTAL_DRV_LEVEL2 0x01U +#define XTAL_DRV_LEVEL1 0x00U + +extern UART_Handle g_uart; + +extern DMA_Handle g_dmac; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +void WriteCallBack(void *handle); +void ReadCallBack(void *handle); +void UART0InterruptErrorCallback(void *handle); +void DMA_Channel2CallBack(void *handle); +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/init/system_init.c b/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/init/system_init.c new file mode 100644 index 000000000..20675e47c --- /dev/null +++ b/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/init/system_init.c @@ -0,0 +1,150 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" +#include "iocmg.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 48; /* PLL Multiplier 48 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void DMA_Channel2Init(void *handle) +{ + DMA_ChannelParam dma_param; + dma_param.direction = DMA_PERIPH_TO_MEMORY_BY_DMAC; + dma_param.srcAddrInc = DMA_ADDR_UNALTERED; + dma_param.destAddrInc = DMA_ADDR_INCREASE; + dma_param.srcPeriph = DMA_REQUEST_UART0_RX; + dma_param.destPeriph = DMA_REQUEST_MEM; + dma_param.srcWidth = DMA_TRANSWIDTH_BYTE; + dma_param.destWidth = DMA_TRANSWIDTH_BYTE; + dma_param.srcBurst = DMA_BURST_LENGTH_1; + dma_param.destBurst = DMA_BURST_LENGTH_1; + dma_param.pHandle = handle; + HAL_DMA_InitChannel(&g_dmac, &dma_param, DMA_CHANNEL_TWO); +} + +static void DMA_Init(void) +{ + HAL_CRG_IpEnableSet(DMA_BASE, IP_CLK_ENABLE); + g_dmac.baseAddress = DMA; + IRQ_Register(IRQ_DMA_TC, HAL_DMA_IrqHandlerTc, &g_dmac); + IRQ_Register(IRQ_DMA_ERR, HAL_DMA_IrqHandlerError, &g_dmac); + IRQ_EnableN(IRQ_DMA_TC); + IRQ_EnableN(IRQ_DMA_ERR); + HAL_DMA_Init(&g_dmac); + DMA_Channel2Init((void *)(&g_uart)); + HAL_DMA_SetChannelPriorityEx(&g_dmac, DMA_CHANNEL_TWO, DMA_PRIORITY_MEDIUM); +} + +__weak void UART0InterruptErrorCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN UART0_TRNS_IT_ERROR */ + /* USER CODE END UART0_TRNS_IT_ERROR */ +} + +__weak void WriteCallBack(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN UART0_WRITE_IT_FINISH */ + /* USER CODE END UART0_WRITE_IT_FINISH */ +} + +__weak void DMA_Channel2CallBack(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN UART0_READ_DMA_FINISH */ + /* USER CODE END UART0_READ_DMA_FINISH */ +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + + g_uart.baseAddress = UART0; + + g_uart.baudRate = UART0_BAND_RATE; + g_uart.dataLength = UART_DATALENGTH_8BIT; + g_uart.stopBits = UART_STOPBITS_ONE; + g_uart.parity = UART_PARITY_NONE; + g_uart.txMode = UART_MODE_INTERRUPT; + g_uart.rxMode = UART_MODE_DMA; + g_uart.fifoMode = BASE_CFG_ENABLE; + g_uart.fifoTxThr = UART_FIFODEPTH_SIZE8; + g_uart.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart.hwFlowCtr = BASE_CFG_DISABLE; + g_uart.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart.handleEx.msbFirst = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart); + HAL_UART_RegisterCallBack(&g_uart, UART_TRNS_IT_ERROR, UART0InterruptErrorCallback); + HAL_UART_RegisterCallBack(&g_uart, UART_WRITE_IT_FINISH, WriteCallBack); + + IRQ_Register(IRQ_UART0, HAL_UART_IrqHandler, &g_uart); + IRQ_SetPriority(IRQ_UART0, 1); + IRQ_EnableN(IRQ_UART0); + g_uart.dmaHandle = &g_dmac; + g_uart.uartDmaRxChn = 2; /* DMA channel is 2. */ + HAL_UART_RegisterCallBack(&g_uart, UART_READ_DMA_FINISH, DMA_Channel2CallBack); +} + +static void IOConfig(void) +{ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ +} + +void SystemInit(void) +{ + IOConfig(); + DMA_Init(); + UART0_Init(); + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/readme.md b/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/readme.md new file mode 100644 index 000000000..f682c1b56 --- /dev/null +++ b/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/readme.md @@ -0,0 +1,22 @@ +# UART-Tx在中断模式下发送数据Rx在DMA模式下接收数据 +## 关键字: UART, Tx_INT_Rx_DMA收发数据 + +**【功能描述】** ++ UART全双工收发数据,实现中断和UART_DAM全双工收发数据,中断写的过程中,可以进行UART_DMA读。 + +**【示例配置】** ++ 预设置的缓存:配置发送数据和接收数据缓存地址 + ++ 配置UART发送中断以及回调函数,默认发送中断回调函数为“WriteCallBack”, 可通过函数“HAL_UART_RegisterCallBack”进行更改。 + ++ 中断发送数据:将待发送首地址和字符长度作为入参传入HAL_UART_WriteIT()。 + ++ UART_DMA接收数据:将存放接收的首地址,和接收长度作为入参传入到HAL_UART_ReadDMA()中。 + ++ 串口0会打印发送和接收的数据。 + +**【示例效果】** ++ 示例程序会不断的进行中断发送、UART_DMA接收,实现中断写的过程中,可以进行UART_DMA读。 + +**【注意事项】** ++ 串口通信的波特率,校验位等配置需保持一致,可以通过UART配置界面进行更改。 \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/src/sample_uart_int_tx_dma_rx_simultaneously.c b/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/src/sample_uart_int_tx_dma_rx_simultaneously.c new file mode 100644 index 000000000..92ef41045 --- /dev/null +++ b/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/src/sample_uart_int_tx_dma_rx_simultaneously.c @@ -0,0 +1,115 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_uart_int_tx_dma_rx_simultaneously.c + * @author MCU Driver Team + * @brief uart sample module. + * @details Transmits and receive data simultaneously by interrupt tx and dma rx. During interrupt writing, + * UART_DMA can be read. + * (1) Interrupt sending data: The start address and character length to be sent are used as input parameters + * and transferred to HAL_UART_WriteIT(). + * (2) UART_DMA receive data: The start address and receive length are used as input parameters to + * HAL_UART_ReadDMA(). + * (3) The sample program continuously transmits interrupts and receives UART_DMA. During interrupt writing, + * UART_DMA can be read. + */ + +#include "sample_uart_int_tx_dma_rx_simultaneously.h" + +#define RX_IT_DMA_DATA_LENGTH 10 +#define TX_IT_DMA_DATA_LENGTH 15 +#define IT_DMA_REQUIRE_TIME 30 + +static unsigned char g_txITDMAStr[TX_IT_DMA_DATA_LENGTH] = "123456789012345"; /* The transmit data length is 15 */ +static unsigned char g_rxITDMAStr[RX_IT_DMA_DATA_LENGTH] = {0}; /* The receive data length is 10 */ +volatile bool txITDMAFlag = false; /* This parameter is frequently changed in + the main function and callback function, + indicating whether the transmission is complete */ + +volatile bool rxITDMAFlag = false; /* This parameter is frequently changed in + the main function and callback function, + indicating whether the reception is complete */ + +/** + * @brief Clear string. + * @param str, String to be cleared. + * @retval None. + */ +static void ClearString(unsigned char *str) +{ + for (unsigned int i = 0; i < RX_IT_DMA_DATA_LENGTH; ++i) { + str[i] = 0; + } +} + +/** + * @brief User-defined write completion interrupt callback function. + * @param UART_Handle UART handle. + * @retval None. + */ +void WriteCallBack(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("\r\nWrite Finish\r\n"); + txITDMAFlag = true; + return; +} + +/** + * @brief User-defined read completion DMA callback function. + * @param handle UART handle. + * @retval None. + */ +void DMA_Channel2CallBack(void *handle) +{ + UART_Handle *uartHandle = (UART_Handle *)handle; + DBG_PRINTF("read_finish: %s\r\n", g_rxITDMAStr); + BASE_FUNC_UNUSED(uartHandle); /* Use uart handle. */ + rxITDMAFlag = true; + return; +} + +/** + * @brief UART Interrupt Tx and DMA Rx simultaneously. + * @param None. + * @retval None. + */ +void UART_INTTxAndDMARxSimultaneously(void) +{ + SystemInit(); + DBG_PRINTF("UART Init finish, Interrupt Tx and DMA Rx simultaneously mode:\r\n"); + DBG_PRINTF("Tx transmits data 123456789012345, and Rx receives data with the length of 10 \r\n"); + + txITDMAFlag = true; /* Enable IT transmission */ + rxITDMAFlag = true; /* Enable DMA reception */ + while (1) { + if (txITDMAFlag) { + txITDMAFlag = false; + /* transmit data using UART_IT */ + HAL_UART_WriteIT(&g_uart, g_txITDMAStr, TX_IT_DMA_DATA_LENGTH); + } + + if (rxITDMAFlag) { + rxITDMAFlag = false; + ClearString(g_rxITDMAStr); /* Clear the array of g_rxITDMAStr */ + /* DMA read: Length of the received data must be equal to the RX_IT_DMA_DATA_LENGTH */ + HAL_UART_ReadDMA(&g_uart, g_rxITDMAStr, RX_IT_DMA_DATA_LENGTH); + } + BASE_FUNC_DELAY_MS(IT_DMA_REQUIRE_TIME); /* Add a deletion delay as required */ + } + return; +} \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/inc/sample_uart_int_tx_int_rx_simultaneously.h b/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/inc/sample_uart_int_tx_int_rx_simultaneously.h new file mode 100644 index 000000000..e7a48b78a --- /dev/null +++ b/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/inc/sample_uart_int_tx_int_rx_simultaneously.h @@ -0,0 +1,33 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_uart_int_tx_int_rx_simultaneously.h + * @author MCU Driver Team + * @brief uart sample module. + * @details This file provides sample code for users to help use + * the transmission of the UART in interrupt mode. + */ +#ifndef SAMPLE_UART_INT_TX_INT_RX_SIMULTANEOUSLY_H +#define SAMPLE_UART_INT_TX_INT_RX_SIMULTANEOUSLY_H + +#include "debug.h" +#include "uart.h" +#include "interrupt.h" +#include "main.h" + +void UART_INTTxAndINTRxSimultaneously(void); +#endif \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/init/main.c b/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/init/main.c new file mode 100644 index 000000000..6f1b17457 --- /dev/null +++ b/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/init/main.c @@ -0,0 +1,47 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ + +#include "typedefs.h" +#include "feature.h" +#include "sample_uart_int_tx_int_rx_simultaneously.h" +#include "main.h" +/* USER CODE BEGIN 0 */ +/* USER CODE END 0 */ +UART_Handle g_uart; +/* USER CODE BEGIN 1 */ +/* USER CODE END 1 */ + +int main(void) +{ + /* USER CODE BEGIN 2 */ + /* USER CODE END 2 */ + UART_INTTxAndINTRxSimultaneously(); + /* USER CODE BEGIN 3 */ + /* USER CODE END 3 */ + while (1) { + /* USER CODE BEGIN 4 */ + /* USER CODE END 4 */ + } + /* USER CODE BEGIN 5 */ + /* USER CODE END 5 */ + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/init/main.h b/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/init/main.h new file mode 100644 index 000000000..4b0c36d84 --- /dev/null +++ b/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/init/main.h @@ -0,0 +1,53 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "uart_ex.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define XTAL_DRV_LEVEL4 0x03U +#define XTAL_DRV_LEVEL3 0x02U +#define XTAL_DRV_LEVEL2 0x01U +#define XTAL_DRV_LEVEL1 0x00U + +extern UART_Handle g_uart; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +void WriteCallBack(void *handle); +void ReadCallBack(void *handle); +void UART0InterruptErrorCallback(void *handle); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/init/system_init.c b/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/init/system_init.c new file mode 100644 index 000000000..b5e8bb2c9 --- /dev/null +++ b/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/init/system_init.c @@ -0,0 +1,118 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" +#include "iocmg.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 48; /* PLL Multiplier 48 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +__weak void UART0InterruptErrorCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN UART0_TRNS_IT_ERROR */ + /* USER CODE END UART0_TRNS_IT_ERROR */ +} + +__weak void WriteCallBack(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN UART0_WRITE_IT_FINISH */ + /* USER CODE END UART0_WRITE_IT_FINISH */ +} + +__weak void ReadCallBack(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN UART0_READ_IT_FINISH */ + /* USER CODE END UART0_READ_IT_FINISH */ +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + + g_uart.baseAddress = UART0; + + g_uart.baudRate = UART0_BAND_RATE; + g_uart.dataLength = UART_DATALENGTH_8BIT; + g_uart.stopBits = UART_STOPBITS_ONE; + g_uart.parity = UART_PARITY_NONE; + g_uart.txMode = UART_MODE_INTERRUPT; + g_uart.rxMode = UART_MODE_INTERRUPT; + g_uart.fifoMode = BASE_CFG_ENABLE; + g_uart.fifoTxThr = UART_FIFODEPTH_SIZE8; + g_uart.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart.hwFlowCtr = BASE_CFG_DISABLE; + g_uart.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart.handleEx.msbFirst = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart); + HAL_UART_RegisterCallBack(&g_uart, UART_TRNS_IT_ERROR, UART0InterruptErrorCallback); + HAL_UART_RegisterCallBack(&g_uart, UART_WRITE_IT_FINISH, WriteCallBack); + HAL_UART_RegisterCallBack(&g_uart, UART_READ_IT_FINISH, ReadCallBack); + + IRQ_Register(IRQ_UART0, HAL_UART_IrqHandler, &g_uart); + IRQ_SetPriority(IRQ_UART0, 1); + IRQ_EnableN(IRQ_UART0); +} + +static void IOConfig(void) +{ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/readme.md b/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/readme.md new file mode 100644 index 000000000..3c0d4116e --- /dev/null +++ b/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/readme.md @@ -0,0 +1,22 @@ +# UART-Tx和Rx在中断模式下收发数据 +## 关键字: UART, Tx_INT_Rx_INT收发数据 + +**【功能描述】** ++ UART全双工收发数据,实现UART全双工中断收发数据,中断写的过程中,可以进行中断读。 + +**【示例配置】** ++ 预设置的缓存:配置发送数据和接收数据缓存地址 + ++ 配置UART发送和接收中断以及回调函数,默认发送中断回调函数为“WriteCallBack”, 默认的接收中断回调函数为“ReadCallBack” 可通过函数“HAL_UART_RegisterCallBack”进行更改。 + ++ 中断发送数据:将待发送首地址和字符长度作为入参传入HAL_UART_WriteIT()。 + ++ 中断接收数据:将存放接收的首地址,和接收长度作为入参传入到HAL_UART_ReadIT()中。 + ++ 串口0会打印发送和接收的数据。 + +**【示例效果】** ++ 示例程序会不断的进行中断发送、接收,实现中断写的过程中,可以进行中断读。 + +**【注意事项】** ++ 串口通信的波特率,校验位等配置需保持一致,可以通过UART配置界面进行更改。 \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/src/sample_uart_int_tx_int_rx_simultaneously.c b/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/src/sample_uart_int_tx_int_rx_simultaneously.c new file mode 100644 index 000000000..10d273033 --- /dev/null +++ b/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/src/sample_uart_int_tx_int_rx_simultaneously.c @@ -0,0 +1,114 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_uart_int_tx_int_rx_simultaneously.c + * @author MCU Driver Team + * @brief uart sample module. + * @details Transmits and receives data simultaneously by interrupt tx and rx. During interrupt writing, interrupts + * can be read. + * (1) Interrupt sending data: The start address and character length to be sent are used as input + * parameters and transferred to HAL_UART_WriteIT(). + * (2) Interrupt receive data: The start address and receive length are used as input parameters to + * HAL_UART_ReadIT(). + * (3) The example program continuously transmits and receives interrupts. During interrupt writing, + * interrupt reading can be performed. + */ +#include "sample_uart_int_tx_int_rx_simultaneously.h" + +#define RX_IT_DATA_LENGTH 10 +#define TX_IT_DATA_LENGTH 15 +#define REQUIRE_TIME_IT 30 + +static unsigned char g_txITStr[TX_IT_DATA_LENGTH] = "123456789012345"; /* The transmit data length is 15 */ +static unsigned char g_rxITStr[RX_IT_DATA_LENGTH] = {0}; /* The receive data length is 10 */ +volatile bool txITFlag = false; /* This parameter is frequently changed in + the main function and callback function, + indicating whether transmission is complete */ + +volatile bool rxITFlag = false; /* This parameter is frequently changed in + the main function and callback function, + indicating whether reception is complete */ + +/** + * @brief Clear string. + * @param str, String to be cleared. + * @retval None. + */ +static void ClearString(unsigned char *str) +{ + for (unsigned int i = 0; i < RX_IT_DATA_LENGTH; ++i) { + str[i] = 0; + } +} + +/** + * @brief User-defined read completion interrupt callback function. + * @param UART_Handle UART handle. + * @retval None. + */ +void ReadCallBack(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("Read Finish: %s\r\n", g_rxITStr); + rxITFlag = true; + return; +} + +/** + * @brief User-defined write completion interrupt callback function. + * @param UART_Handle UART handle. + * @retval None. + */ +void WriteCallBack(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("\r\nWrite Finish\r\n"); + txITFlag = true; + return; +} + +/** + * @brief UART Interrupt Tx and Rx simultaneously. + * @param None. + * @retval None. + */ +void UART_INTTxAndINTRxSimultaneously(void) +{ + SystemInit(); + DBG_PRINTF("UART Init finish, UART intrrupt tx and interrupt rx simultaneously mode:\r\n"); + DBG_PRINTF("Tx transmits data 123456789012345, and Rx receives data with the length of 10 \r\n"); + + txITFlag = true; /* Enable interrupt transmission */ + rxITFlag = true; /* Enable interrupt reception */ + while (1) { + if (txITFlag) { + txITFlag = false; + /* UART interrupt send data */ + HAL_UART_WriteIT(&g_uart, g_txITStr, TX_IT_DATA_LENGTH); + } + + if (rxITFlag) { + rxITFlag = false; + /* Clear received data */ + ClearString(g_rxITStr); + /* Length of the received data must be equal to the RX_IT_DATA_LENGTH */ + HAL_UART_ReadIT(&g_uart, g_rxITStr, RX_IT_DATA_LENGTH); + } + BASE_FUNC_DELAY_MS(REQUIRE_TIME_IT); /* Add a deletion delay as required */ + } + return; +} \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_interrupt_rx/inc/sample_uart_interrupt_rx.h b/drivers_sample/uart/sample_uart_interrupt_rx/inc/sample_uart_interrupt_rx.h new file mode 100644 index 000000000..33b5d7569 --- /dev/null +++ b/drivers_sample/uart/sample_uart_interrupt_rx/inc/sample_uart_interrupt_rx.h @@ -0,0 +1,33 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_uart_interrupt_rx.h + * @author MCU Driver Team + * @brief uart sample module. + * @details This file provides sample code for users to help use + * the transmission of the UART in interrupt mode. + */ +#ifndef SAMPLE_UART_INTERRUPT_TRANSMIT_H +#define SAMPLE_UART_INTERRUPT_TRANSMIT_H + +#include "debug.h" +#include "uart.h" +#include "interrupt.h" +#include "main.h" + +void UART_InterruptRX(void); +#endif \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_interrupt_rx/init/main.c b/drivers_sample/uart/sample_uart_interrupt_rx/init/main.c new file mode 100644 index 000000000..e4a3186b6 --- /dev/null +++ b/drivers_sample/uart/sample_uart_interrupt_rx/init/main.c @@ -0,0 +1,47 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ + +#include "typedefs.h" +#include "feature.h" +#include "sample_uart_interrupt_rx.h" +#include "main.h" +/* USER CODE BEGIN 0 */ +/* USER CODE END 0 */ +UART_Handle g_uart; +/* USER CODE BEGIN 1 */ +/* USER CODE END 1 */ + +int main(void) +{ + /* USER CODE BEGIN 2 */ + /* USER CODE END 2 */ + UART_InterruptRX(); + /* USER CODE BEGIN 3 */ + /* USER CODE END 3 */ + while (1) { + /* USER CODE BEGIN 4 */ + /* USER CODE END 4 */ + } + /* USER CODE BEGIN 5 */ + /* USER CODE END 5 */ + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_interrupt_rx/init/main.h b/drivers_sample/uart/sample_uart_interrupt_rx/init/main.h new file mode 100644 index 000000000..d29065a23 --- /dev/null +++ b/drivers_sample/uart/sample_uart_interrupt_rx/init/main.h @@ -0,0 +1,53 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "uart_ex.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define XTAL_DRV_LEVEL4 0x03U +#define XTAL_DRV_LEVEL3 0x02U +#define XTAL_DRV_LEVEL2 0x01U +#define XTAL_DRV_LEVEL1 0x00U + +extern UART_Handle g_uart; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +void UART0WriteInterruptCallback(void *handle); +void ReadFinish(void *handle); +void UART0InterruptErrorCallback(void *handle); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_interrupt_rx/init/system_init.c b/drivers_sample/uart/sample_uart_interrupt_rx/init/system_init.c new file mode 100644 index 000000000..8654f721a --- /dev/null +++ b/drivers_sample/uart/sample_uart_interrupt_rx/init/system_init.c @@ -0,0 +1,119 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" +#include "iocmg.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 48; /* PLL Multiplier 48 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +__weak void UART0InterruptErrorCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN UART0_TRNS_IT_ERROR */ + /* USER CODE END UART0_TRNS_IT_ERROR */ +} + +__weak void UART0WriteInterruptCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN UART0_WRITE_IT_FINISH */ + /* USER CODE END UART0_WRITE_IT_FINISH */ +} + +__weak void ReadFinish(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN UART0_READ_IT_FINISH */ + /* USER CODE END UART0_READ_IT_FINISH */ +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + + g_uart.baseAddress = UART0; + + g_uart.baudRate = UART0_BAND_RATE; + g_uart.dataLength = UART_DATALENGTH_8BIT; + g_uart.stopBits = UART_STOPBITS_ONE; + g_uart.parity = UART_PARITY_NONE; + g_uart.txMode = UART_MODE_INTERRUPT; + g_uart.rxMode = UART_MODE_INTERRUPT; + g_uart.fifoMode = BASE_CFG_ENABLE; + g_uart.fifoTxThr = UART_FIFODEPTH_SIZE8; + g_uart.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart.hwFlowCtr = BASE_CFG_DISABLE; + g_uart.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart.handleEx.msbFirst = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart); + HAL_UART_RegisterCallBack(&g_uart, UART_TRNS_IT_ERROR, UART0InterruptErrorCallback); + HAL_UART_RegisterCallBack(&g_uart, UART_WRITE_IT_FINISH, UART0WriteInterruptCallback); + HAL_UART_RegisterCallBack(&g_uart, UART_READ_IT_FINISH, ReadFinish); + + IRQ_Register(IRQ_UART0, HAL_UART_IrqHandler, &g_uart); + IRQ_SetPriority(IRQ_UART0, 1); + IRQ_EnableN(IRQ_UART0); +} + +static void IOConfig(void) +{ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_interrupt_rx/readme.md b/drivers_sample/uart/sample_uart_interrupt_rx/readme.md new file mode 100644 index 000000000..f7b47e89d --- /dev/null +++ b/drivers_sample/uart/sample_uart_interrupt_rx/readme.md @@ -0,0 +1,22 @@ +# UART-中断模式接收数据 +## 关键字: UART, 中断模式接收 + +**【功能描述】** ++ UART以中断模式接收数据,数据接收完成将触发中断回调。 + +**【示例配置】** ++ 预设置的缓存:需要使用者自行开辟内存空间,将内存首地址和需要接收的字符长度作为入参传入HAL_UART_ReadIT()。 + ++ 串口0的接收模式配置为中断模式。 + ++ 发送数据完成之后,会调用发送完成中断回调函数,默认为“ReadFinish”, 可通过“HAL_UART_RegisterCallBack”函数进行更改。 + ++ 串口0会打印出接收到的数据和提示信息。 + +**【示例效果】** ++ 向串口0发送数据,串口0数据接收完成之后,会触发中断回调,打印接收的内容。 + ++ UART完成接收后,会上报中断,可以在UART中断回调函数中从预设值的缓存中读到接收的数据。 + +**【注意事项】** ++ 串口通信的波特率,校验位等配置需保持一致,可以通过UART配置界面进行更改。 \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_interrupt_rx/src/sample_uart_interrupt_rx.c b/drivers_sample/uart/sample_uart_interrupt_rx/src/sample_uart_interrupt_rx.c new file mode 100644 index 000000000..b3132e975 --- /dev/null +++ b/drivers_sample/uart/sample_uart_interrupt_rx/src/sample_uart_interrupt_rx.c @@ -0,0 +1,64 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_uart_interrupt_rx.c + * @author MCU Driver Team + * @brief uart sample module. + * @details In interrupt mode, when the UART completes receiving data, it indicates that the data + * has been transferred to the preset memory. In this case, an interrupt is triggered. + * (1) Preset buffer: The user needs to create the memory space. Use the start address of the memory + * and the length of the character to be received as input parameters to HAL_UART_ReadIT(). + * (2) Result reading: Read the result from the preset memory in the callback function of the UART. + */ +#include "sample_uart_interrupt_rx.h" + +static unsigned char g_rxStr[20] = {0}; +static volatile unsigned int g_flag; + +/** + * @brief User-defined read completion interrupt callback function. + * @param UART_Handle UART handle. + * @retval None. + */ +void ReadFinish(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("read_finish: %s\r\n", g_rxStr); + g_flag = 1; + return; +} + +/** + * @brief UART interrupt receive sample code. + * @param None. + * @retval None. + */ +void UART_InterruptRX(void) +{ + SystemInit(); + DBG_PRINTF("UART Init finish\r\n"); + unsigned int dataLength = 15; /* The receive length is 15 */ + g_flag = 0; + HAL_UART_ReadIT(&g_uart, g_rxStr, dataLength); + while (1) { + if (g_flag == 1) { + g_flag = 0; + HAL_UART_ReadIT(&g_uart, g_rxStr, dataLength); /* Start receiving again */ + } + } + return; +} \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_interrupt_tx/inc/sample_uart_interrupt_tx.h b/drivers_sample/uart/sample_uart_interrupt_tx/inc/sample_uart_interrupt_tx.h new file mode 100644 index 000000000..2ac7c4d70 --- /dev/null +++ b/drivers_sample/uart/sample_uart_interrupt_tx/inc/sample_uart_interrupt_tx.h @@ -0,0 +1,33 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_uart_interrupt_tx.h + * @author MCU Driver Team + * @brief uart sample module. + * @details This file provides sample code for users to help use + * the transmission of the UART in interrupt mode. + */ +#ifndef SAMPLE_UART_INTERRUPT_TX_H +#define SAMPLE_UART_INTERRUPT_TX_H + +#include "debug.h" +#include "uart.h" +#include "interrupt.h" +#include "main.h" + +void UART_InterruptTX(void); +#endif \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_interrupt_tx/init/main.c b/drivers_sample/uart/sample_uart_interrupt_tx/init/main.c new file mode 100644 index 000000000..18ead45fb --- /dev/null +++ b/drivers_sample/uart/sample_uart_interrupt_tx/init/main.c @@ -0,0 +1,47 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ + +#include "typedefs.h" +#include "feature.h" +#include "sample_uart_interrupt_tx.h" +#include "main.h" +/* USER CODE BEGIN 0 */ +/* USER CODE END 0 */ +UART_Handle g_uart; +/* USER CODE BEGIN 1 */ +/* USER CODE END 1 */ + +int main(void) +{ + /* USER CODE BEGIN 2 */ + /* USER CODE END 2 */ + UART_InterruptTX(); + /* USER CODE BEGIN 3 */ + /* USER CODE END 3 */ + while (1) { + /* USER CODE BEGIN 4 */ + /* USER CODE END 4 */ + } + /* USER CODE BEGIN 5 */ + /* USER CODE END 5 */ + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_interrupt_tx/init/main.h b/drivers_sample/uart/sample_uart_interrupt_tx/init/main.h new file mode 100644 index 000000000..88060880a --- /dev/null +++ b/drivers_sample/uart/sample_uart_interrupt_tx/init/main.h @@ -0,0 +1,53 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "uart_ex.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define XTAL_DRV_LEVEL4 0x03U +#define XTAL_DRV_LEVEL3 0x02U +#define XTAL_DRV_LEVEL2 0x01U +#define XTAL_DRV_LEVEL1 0x00U + +extern UART_Handle g_uart; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +void WriteFinish(void *handle); +void UART0ReadInterruptCallback(void *handle); +void UART0InterruptErrorCallback(void *handle); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_interrupt_tx/init/system_init.c b/drivers_sample/uart/sample_uart_interrupt_tx/init/system_init.c new file mode 100644 index 000000000..d5668746c --- /dev/null +++ b/drivers_sample/uart/sample_uart_interrupt_tx/init/system_init.c @@ -0,0 +1,118 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" +#include "iocmg.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 48; /* PLL Multiplier 48 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +__weak void UART0InterruptErrorCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN UART0_TRNS_IT_ERROR */ + /* USER CODE END UART0_TRNS_IT_ERROR */ +} + +__weak void WriteFinish(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN UART0_WRITE_IT_FINISH */ + /* USER CODE END UART0_WRITE_IT_FINISH */ +} + +__weak void UART0ReadInterruptCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN UART0_READ_IT_FINISH */ + /* USER CODE END UART0_READ_IT_FINISH */ +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + + g_uart.baseAddress = UART0; + + g_uart.baudRate = UART0_BAND_RATE; + g_uart.dataLength = UART_DATALENGTH_8BIT; + g_uart.stopBits = UART_STOPBITS_ONE; + g_uart.parity = UART_PARITY_NONE; + g_uart.txMode = UART_MODE_INTERRUPT; + g_uart.rxMode = UART_MODE_INTERRUPT; + g_uart.fifoMode = BASE_CFG_ENABLE; + g_uart.fifoTxThr = UART_FIFODEPTH_SIZE8; + g_uart.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart.hwFlowCtr = BASE_CFG_DISABLE; + g_uart.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart.handleEx.msbFirst = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart); + HAL_UART_RegisterCallBack(&g_uart, UART_TRNS_IT_ERROR, UART0InterruptErrorCallback); + HAL_UART_RegisterCallBack(&g_uart, UART_WRITE_IT_FINISH, WriteFinish); + HAL_UART_RegisterCallBack(&g_uart, UART_READ_IT_FINISH, UART0ReadInterruptCallback); + + IRQ_Register(IRQ_UART0, HAL_UART_IrqHandler, &g_uart); + IRQ_SetPriority(IRQ_UART0, 1); + IRQ_EnableN(IRQ_UART0); +} + +static void IOConfig(void) +{ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_interrupt_tx/readme.md b/drivers_sample/uart/sample_uart_interrupt_tx/readme.md new file mode 100644 index 000000000..935b41429 --- /dev/null +++ b/drivers_sample/uart/sample_uart_interrupt_tx/readme.md @@ -0,0 +1,20 @@ +# UART-中断模式发送数据 +## 关键字: UART, 中断模式发送 + +**【功能描述】** ++ UART以中断模式发送数据,数据发送完成将触发中断回调。 + +**【示例配置】** ++ 预设置的缓存:需要使用者自行开辟内存空间,将待发送首地址和字符长度作为入参传入HAL_UART_WriteIT()。 + ++ 串口0的发送模式配置为中断模式。 + ++ 发送数据完成之后,会调用发送完成中断回调函数,默认为“UART0ReadInterruptCallback”, 可通过“HAL_UART_RegisterCallBack”函数进行更改。 + ++ 串口0会打印出发送成功的提示信息。 + +**【示例效果】** ++ UART搬运结束后,会上报中断,可以在UART中断回调函数中加上标志位进行判断是否完成。 + +**【注意事项】** ++ 串口通信的波特率,校验位等配置需保持一致,可以通过UART配置界面进行更改。 \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_interrupt_tx/src/sample_uart_interrupt_tx.c b/drivers_sample/uart/sample_uart_interrupt_tx/src/sample_uart_interrupt_tx.c new file mode 100644 index 000000000..e053c2066 --- /dev/null +++ b/drivers_sample/uart/sample_uart_interrupt_tx/src/sample_uart_interrupt_tx.c @@ -0,0 +1,58 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_uart_interrupt_tx.c + * @author MCU Driver Team + * @brief uart sample module. + * @details In interrupt mode, an interrupt is triggered when the UART has finished transmitting data. + * (1) Data to be sent: The start address and character length to be sent are used as input parameters + * and transferred to HAL_UART_WriteIT(). + * (2) Result determination: After the transfer is complete, an UART interrupt is reported. You can add + * a flag to the DMA interrupt callback function to determine whether the transfer is complete. + */ +#include "sample_uart_interrupt_tx.h" + +static unsigned char g_txStr[] = "12345678987654321"; + +/** + * @brief User-defined write completion interrupt callback function. + * @param None. + * @retval None. + */ +void WriteFinish(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("\r\nwrite_finish\r\n"); + return; +} + +/** + * @brief UART interrupt send sample code. + * @param None. + * @retval None. + */ +void UART_InterruptTX(void) +{ + SystemInit(); + DBG_PRINTF("UART Init finish\r\n"); + unsigned int dataLength = 17; /* The receive length is 17 */ + HAL_UART_WriteIT(&g_uart, g_txStr, dataLength); + while (1) { + ; + } + return; +} \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/inc/sample_uart_interrupt_tx_after_rx.h b/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/inc/sample_uart_interrupt_tx_after_rx.h new file mode 100644 index 000000000..f8f23aae8 --- /dev/null +++ b/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/inc/sample_uart_interrupt_tx_after_rx.h @@ -0,0 +1,33 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_uart_interrupt_tx_after_rx.h + * @author MCU Driver Team + * @brief uart sample module. + * @details This file provides sample code for users to help use + * the transmission of the UART in interrupt mode. + */ +#ifndef SAMPLE_UART_INTERRUPT_TX_AFTER_RX_H +#define SAMPLE_UART_INTERRUPT_TX_AFTER_RX_H + +#include "debug.h" +#include "uart.h" +#include "interrupt.h" +#include "main.h" + +void UART_InterruptTxAfterRx(void); +#endif \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/init/main.c b/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/init/main.c new file mode 100644 index 000000000..8913c1b6b --- /dev/null +++ b/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/init/main.c @@ -0,0 +1,47 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ + +#include "typedefs.h" +#include "feature.h" +#include "sample_uart_interrupt_tx_after_rx.h" +#include "main.h" +/* USER CODE BEGIN 0 */ +/* USER CODE END 0 */ +UART_Handle g_uart; +/* USER CODE BEGIN 1 */ +/* USER CODE END 1 */ + +int main(void) +{ + /* USER CODE BEGIN 2 */ + /* USER CODE END 2 */ + UART_InterruptTxAfterRx(); + /* USER CODE BEGIN 3 */ + /* USER CODE END 3 */ + while (1) { + /* USER CODE BEGIN 4 */ + /* USER CODE END 4 */ + } + /* USER CODE BEGIN 5 */ + /* USER CODE END 5 */ + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/init/main.h b/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/init/main.h new file mode 100644 index 000000000..6bd6340f0 --- /dev/null +++ b/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/init/main.h @@ -0,0 +1,52 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "uart_ex.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define XTAL_DRV_LEVEL4 0x03U +#define XTAL_DRV_LEVEL3 0x02U +#define XTAL_DRV_LEVEL2 0x01U +#define XTAL_DRV_LEVEL1 0x00U + +extern UART_Handle g_uart; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +void WriteCallBack(void *handle); +void ReadCallBack(void *handle); +void UART0InterruptErrorCallback(void *handle); +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/init/system_init.c b/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/init/system_init.c new file mode 100644 index 000000000..b5e8bb2c9 --- /dev/null +++ b/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/init/system_init.c @@ -0,0 +1,118 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" +#include "iocmg.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 48; /* PLL Multiplier 48 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +__weak void UART0InterruptErrorCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN UART0_TRNS_IT_ERROR */ + /* USER CODE END UART0_TRNS_IT_ERROR */ +} + +__weak void WriteCallBack(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN UART0_WRITE_IT_FINISH */ + /* USER CODE END UART0_WRITE_IT_FINISH */ +} + +__weak void ReadCallBack(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN UART0_READ_IT_FINISH */ + /* USER CODE END UART0_READ_IT_FINISH */ +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + + g_uart.baseAddress = UART0; + + g_uart.baudRate = UART0_BAND_RATE; + g_uart.dataLength = UART_DATALENGTH_8BIT; + g_uart.stopBits = UART_STOPBITS_ONE; + g_uart.parity = UART_PARITY_NONE; + g_uart.txMode = UART_MODE_INTERRUPT; + g_uart.rxMode = UART_MODE_INTERRUPT; + g_uart.fifoMode = BASE_CFG_ENABLE; + g_uart.fifoTxThr = UART_FIFODEPTH_SIZE8; + g_uart.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart.hwFlowCtr = BASE_CFG_DISABLE; + g_uart.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart.handleEx.msbFirst = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart); + HAL_UART_RegisterCallBack(&g_uart, UART_TRNS_IT_ERROR, UART0InterruptErrorCallback); + HAL_UART_RegisterCallBack(&g_uart, UART_WRITE_IT_FINISH, WriteCallBack); + HAL_UART_RegisterCallBack(&g_uart, UART_READ_IT_FINISH, ReadCallBack); + + IRQ_Register(IRQ_UART0, HAL_UART_IrqHandler, &g_uart); + IRQ_SetPriority(IRQ_UART0, 1); + IRQ_EnableN(IRQ_UART0); +} + +static void IOConfig(void) +{ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/readme.md b/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/readme.md new file mode 100644 index 000000000..14690b450 --- /dev/null +++ b/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/readme.md @@ -0,0 +1,22 @@ +# UART-中断模式下环回发送数据 +## 关键字: UART, 中断模式环回发送 + +**【功能描述】** ++ 在中断模式下,当UART接收到对端发送数据时,又将刚接收到的数据发送到对端,整个过程接收和发送均会触发UART中断。 + +**【示例配置】** ++ 接收:需要使用者自行开辟内存空间,将内存首地址和需要接收的字符长度作为入参传入HAL_UART_ReadIT(),接收到的数据会存到缓存中。 + ++ 发送:在接收中断上报后,将缓存中的数据作为待发送数据,填入HAL_UART_WriteIT()。 + ++ 发送数据完成之后,会调用发送完成中断回调函数,默认为“UART0ReadInterruptCallback”, 可通过“HAL_UART_RegisterCallBack”函数进行更改。 + ++ 接收数据完成之后,会调用接收完成中断回调函数,默认为“ReadCallBack”, 用户可通过“HAL_UART_RegisterCallBack”函数进行更改。 + ++ 串口0会打印出发送成功的提示信息。 + +**【示例效果】** ++ 向串口0发送数据, 串口0会发送刚刚接收到的字符。 + +**【注意事项】** ++ 串口通信的波特率,校验位等配置需保持一致,可以通过UART配置界面进行更改。 \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/src/sample_uart_interrupt_tx_after_rx.c b/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/src/sample_uart_interrupt_tx_after_rx.c new file mode 100644 index 000000000..7f57451bd --- /dev/null +++ b/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/src/sample_uart_interrupt_tx_after_rx.c @@ -0,0 +1,114 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_uart_interrupt_tx_after_rx.c + * @author MCU Driver Team + * @brief uart sample module. + * @details In interrupt mode, when the UART receives data from the peer end, the UART sends the received data to the + * peer end. The UART interrupt is triggered during the entire process of receiving and transmitting data. + * (1) Receive: The user needs to open the memory space. The start address of the memory and the length of + * character to be received are used as input parameters and transferred to HAL_UART_ReadIT(). The received + * data is stored in the cache. + * (2) Transmit: After receiving an interrupt, the data in the buffer is used as the data to be transmitted + * and is filled in HAL_UART_WriteIT(). + */ +#include "sample_uart_interrupt_tx_after_rx.h" + +static unsigned char g_str[15] = {0}; +static volatile unsigned int g_flag; +static unsigned int CountString(unsigned char *str); +static void ClearString(unsigned char *str); + +/** + * @brief User-defined read completion interrupt callback function. + * @param UART_Handle UART handle. + * @retval None. + */ +void ReadCallBack(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("Read Finish: %s\r\n", g_str); + g_flag = true; + return; +} + +/** + * @brief User-defined write completion interrupt callback function. + * @param UART_Handle UART handle. + * @retval None. + */ +void WriteCallBack(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("\r\nWrite Finish\r\n"); + return; +} + +/** + * @brief Count length of string. + * @param str, String to be cleared. + * @retval unsigned int, Character length. + */ +static unsigned int CountString(unsigned char *str) +{ + unsigned int ret; + if (str == NULL) { + return 0; + } + unsigned char *tmpStr = str; /* Cycle Count */ + for (ret = 0; *tmpStr != 0; tmpStr++) { + ret++; + } + return ret; +} + +/** + * @brief Clear string. + * @param str, String to be cleared. + * @retval None. + */ +static void ClearString(unsigned char *str) +{ + unsigned int len = CountString(str); + for (unsigned int i = 0; i < len; ++i) { + str[i] = 0; + } +} + +/** + * @brief UART interrupt receive sample code. + * @param None. + * @retval None. + */ +void UART_InterruptTxAfterRx(void) +{ + SystemInit(); + DBG_PRINTF("UART Init finish, please enter characters(length no more than 10):\r\n"); + unsigned int rxDataLength = 10; /* The receive length is 10 */ + g_flag = false; + HAL_UART_ReadIT(&g_uart, g_str, rxDataLength); + while (1) { + if (g_flag == true) { + g_flag = false; + unsigned int txDataLength = CountString(g_str); /* string length of the data to be sent after receiving */ + HAL_UART_WriteIT(&g_uart, g_str, txDataLength); + ClearString(g_str); + HAL_UART_ReadIT(&g_uart, g_str, rxDataLength); + } + } + return; +} \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_single_wire_communication/inc/sample_uart_single_wire_communication.h b/drivers_sample/uart/sample_uart_single_wire_communication/inc/sample_uart_single_wire_communication.h new file mode 100644 index 000000000..3f2d1d78e --- /dev/null +++ b/drivers_sample/uart/sample_uart_single_wire_communication/inc/sample_uart_single_wire_communication.h @@ -0,0 +1,55 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_uart_single_wire_communication.h + * @author MCU Driver Team + * @brief uart sample module. + * @details This file provides sample code for users to help use + * the single wire transmission of the UART in interrupt mode. + */ + +#ifndef SAMPLE_UART_SINGLE_WIRE_COMMUNICATION +#define SAMPLE_UART_SINGLE_WIRE_COMMUNICATION + +#include "debug.h" +#include "uart.h" +#include "interrupt.h" +#include "main.h" +#include "ioconfig.h" +/* Indicates the bus status. */ +typedef enum { + UART_SINGLE_WIRE_READY = 0x00000000U, + UART_SINGLE_WIRE_TX_FIN = 0x00000001U, + UART_SINGLE_WIRE_RX_FIN = 0x00000002U, + UART_SINGLE_WIRE_BUSY = 0x00000004U, + UART_SINGLE_WIRE_SEND_SUCCESS = 0x00000008U +} UART_SINGLEWIRESTATUS; + +extern volatile unsigned int g_uartSingleWireStatus; /* A global variable that indicates the bus status. */ +extern volatile bool g_uartNotBusy; /* Global variable indicating whether the bus is busy. */ + +/* Function declaration */ +void UART_SingleWireCommunication(void); +void UART_EnableTx(UART_Handle *handle); +void UART_DisableTx(UART_Handle *handle); +void UART_EnableRx(UART_Handle *handle); +void UART_DisableRx(UART_Handle *handle); +void UART2TxIOEnable(void); /* IO config setting. */ +void UART1TxIOEnable(void); +void UART1TxToUART2Rx(UART_Handle *uart1Handle, UART_Handle *uart2Handle); /* Pin configure. */ +void UART2TxToUART1Rx(UART_Handle *uart1Handle, UART_Handle *uart2Handle); +#endif \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_single_wire_communication/init/main.c b/drivers_sample/uart/sample_uart_single_wire_communication/init/main.c new file mode 100644 index 000000000..c37a23031 --- /dev/null +++ b/drivers_sample/uart/sample_uart_single_wire_communication/init/main.c @@ -0,0 +1,51 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ + +#include "typedefs.h" +#include "feature.h" +#include "main.h" +/* USER CODE BEGIN 0 */ +/* USER CODE END 0 */ +TIMER_Handle g_timer2; +UART_Handle g_uart0; +UART_Handle g_uart1; +UART_Handle g_uart2; +/* USER CODE BEGIN 1 */ +/* USER CODE END 1 */ +int main(void) +{ + /* USER CODE BEGIN 2 */ + /* USER CODE END 2 */ + UART_SingleWireCommunication(); + /* USER CODE BEGIN 3 */ + /* USER CODE END 3 */ + while (1) { + /* USER CODE BEGIN 4 */ + /* USER CODE END 4 */ + } + /* USER CODE BEGIN 5 */ + /* USER CODE END 5 */ + return BASE_STATUS_OK; +} + +/* USER CODE BEGIN 6 */ +/* USER CODE END 6 */ \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_single_wire_communication/init/main.h b/drivers_sample/uart/sample_uart_single_wire_communication/init/main.h new file mode 100644 index 000000000..327587170 --- /dev/null +++ b/drivers_sample/uart/sample_uart_single_wire_communication/init/main.h @@ -0,0 +1,60 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "timer.h" +#include "crg.h" +#include "sample_uart_single_wire_communication.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define XTAL_DRV_LEVEL4 0x03U +#define XTAL_DRV_LEVEL3 0x02U +#define XTAL_DRV_LEVEL2 0x01U +#define XTAL_DRV_LEVEL1 0x00U + +extern TIMER_Handle g_timer2; +extern UART_Handle g_uart0; +extern UART_Handle g_uart1; +extern UART_Handle g_uart2; +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +void UART1WriteInterruptCallback(UART_Handle *handle); +void UART1ReadInterruptCallback(UART_Handle *handle); +void UART1InterruptErrorCallback(UART_Handle *handle); +void UART2WriteInterruptCallback(UART_Handle *handle); +void UART2ReadInterruptCallback(UART_Handle *handle); +void UART2InterruptErrorCallback(UART_Handle *handle); +void TIMER2CallbackFunction(void *handle); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_single_wire_communication/init/system_init.c b/drivers_sample/uart/sample_uart_single_wire_communication/init/system_init.c new file mode 100644 index 000000000..a844db244 --- /dev/null +++ b/drivers_sample/uart/sample_uart_single_wire_communication/init/system_init.c @@ -0,0 +1,268 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" + +#define UART0_BAND_RATE 115200 +#define UART1_BAND_RATE 800 +#define UART2_BAND_RATE 800 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + /* USER CODE BEGIN CRG ITCallBackFunc */ + /* USER CODE END CRG ITCallBackFunc */ + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + /* USER CODE BEGIN crg system_init */ + /* USER CODE END crg system_init */ + return BASE_STATUS_OK; +} + +__weak void TIMER2CallbackFunction(void *handle) +{ + HAL_TIMER_IrqClear((TIMER_Handle *)handle); + /* USER CODE BEGIN TIMER2 ITCallBackFunc */ + /* USER CODE END TIMER2 ITCallBackFunc */ +} +static void TIMER2_Init(void) +{ + unsigned int load = HAL_CRG_GetIpFreq((void *)TIMER2) / 1000000u * 500; /* 500us timer counting period. */ + + HAL_CRG_IpEnableSet(TIMER2_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(TIMER2_BASE, CRG_PLL_NO_PREDV); + + g_timer2.baseAddress = TIMER2; + g_timer2.irqNum = IRQ_TIMER2; + /* USER CODE BEGIN timer2 system_init */ + /* USER CODE END timer2 system_init */ + g_timer2.load = load - 1; /* Set timer value immediately */ + g_timer2.bgLoad = load - 1; /* Set timer value */ + g_timer2.mode = TIMER_MODE_RUN_PERIODIC; /* Run in period mode */ + g_timer2.prescaler = TIMERPRESCALER_NO_DIV; /* Don't frequency division */ + g_timer2.size = TIMER_SIZE_32BIT; /* 1 for 32bit, 0 for 16bit */ + g_timer2.dmaAdcSingleReqEnable = BASE_CFG_DISABLE; + g_timer2.dmaBurstReqEnable = BASE_CFG_DISABLE; + g_timer2.interruptEn = BASE_CFG_ENABLE; + HAL_TIMER_Init(&g_timer2); + /* USER CODE BEGIN timer2 system_init */ + /* USER CODE END timer2 system_init */ + HAL_TIMER_RegisterCallback(&g_timer2, TIMER2CallbackFunction); /* Timer callback funtion register. */ + IRQ_SetPriority(g_timer2.irqNum, 1); + IRQ_EnableN(g_timer2.irqNum); +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); + /* USER CODE BEGIN uart0 system_init */ + /* USER CODE END uart0 system_init */ + g_uart0.baseAddress = UART0; + g_uart0.irqNum = IRQ_UART0; + /* USER CODE BEGIN uart0 system_init */ + /* USER CODE END uart0 system_init */ + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; /* FIFO enable. */ + g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); + /* USER CODE BEGIN uart0 system_init */ + /* USER CODE END uart0 system_init */ +} + +__weak void UART1WriteInterruptCallback(UART_Handle *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN UART1_WRITE_IT_FINISH */ + /* USER CODE END UART1_WRITE_IT_FINISH */ +} + +__weak void UART1ReadInterruptCallback(UART_Handle *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN UART1_READ_IT_FINISH */ + /* USER CODE END UART1_READ_IT_FINISH */ +} + +__weak void UART1InterruptErrorCallback(UART_Handle *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN UART1_TRNS_IT_ERROR */ + /* USER CODE END UART1_TRNS_IT_ERROR */ +} + +static void UART1_Init(void) +{ + HAL_CRG_IpEnableSet(UART1_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(UART1_BASE, CRG_PLL_NO_PREDV); + /* USER CODE BEGIN uart1 system_init */ + /* USER CODE END uart1 system_init */ + g_uart1.baseAddress = UART1; + g_uart1.irqNum = IRQ_UART1; + + g_uart1.baudRate = UART1_BAND_RATE; /* Baud rate setting. */ + g_uart1.dataLength = UART_DATALENGTH_8BIT; + g_uart1.stopBits = UART_STOPBITS_ONE; + g_uart1.parity = UART_PARITY_NONE; + g_uart1.txMode = UART_MODE_INTERRUPT; + g_uart1.rxMode = UART_MODE_INTERRUPT; + g_uart1.fifoMode = BASE_CFG_DISABLE; /* FIFO disable. */ + g_uart1.fifoTxThr = UART_FIFOFULL_ONE_TWO; + g_uart1.fifoRxThr = UART_FIFOFULL_ONE_TWO; + g_uart1.hwFlowCtr = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart1); + /* UART1 user callback register. */ + HAL_UART_RegisterCallBack(&g_uart1, UART_WRITE_IT_FINISH, UART1WriteInterruptCallback); + HAL_UART_RegisterCallBack(&g_uart1, UART_READ_IT_FINISH, UART1ReadInterruptCallback); + HAL_UART_RegisterCallBack(&g_uart1, UART_TRNS_IT_ERROR, UART1InterruptErrorCallback); + HAL_UART_IRQService(&g_uart1); /* Interrupt Enable */ + IRQ_SetPriority(g_uart1.irqNum, 1); + IRQ_EnableN(g_uart1.irqNum); +} + +__weak void UART2WriteInterruptCallback(UART_Handle *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN UART2_WRITE_IT_FINISH */ + /* USER CODE END UART2_WRITE_IT_FINISH */ +} + +__weak void UART2ReadInterruptCallback(UART_Handle *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN UART2_READ_IT_FINISH */ + /* USER CODE END UART2_READ_IT_FINISH */ +} + +__weak void UART2InterruptErrorCallback(UART_Handle *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN UART2_TRNS_IT_ERROR */ + /* USER CODE END UART2_TRNS_IT_ERROR */ +} + +static void UART2_Init(void) +{ + HAL_CRG_IpEnableSet(UART2_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(UART2_BASE, CRG_PLL_NO_PREDV); + /* USER CODE BEGIN uart2 system_init */ + /* USER CODE END uart3 system_init */ + g_uart2.baseAddress = UART2; + g_uart2.irqNum = IRQ_UART2; + + g_uart2.baudRate = UART2_BAND_RATE; + g_uart2.dataLength = UART_DATALENGTH_8BIT; + g_uart2.stopBits = UART_STOPBITS_ONE; + g_uart2.parity = UART_PARITY_NONE; + g_uart2.txMode = UART_MODE_INTERRUPT; + g_uart2.rxMode = UART_MODE_INTERRUPT; + g_uart2.fifoMode = BASE_CFG_DISABLE; /* FIFO disable. */ + g_uart2.fifoTxThr = UART_FIFOFULL_ONE_TWO; + g_uart2.fifoRxThr = UART_FIFOFULL_ONE_TWO; + g_uart2.hwFlowCtr = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart2); + /* UART2 user callback register */ + HAL_UART_RegisterCallBack(&g_uart2, UART_WRITE_IT_FINISH, UART2WriteInterruptCallback); + HAL_UART_RegisterCallBack(&g_uart2, UART_READ_IT_FINISH, UART2ReadInterruptCallback); + HAL_UART_RegisterCallBack(&g_uart2, UART_TRNS_IT_ERROR, UART2InterruptErrorCallback); + /* USER CODE BEGIN uart2 system_init */ + /* USER CODE END uart2 system_init */ + HAL_UART_IRQService(&g_uart2); + IRQ_SetPriority(g_uart2.irqNum, 1); + IRQ_EnableN(g_uart2.irqNum); +} + +void IOConfig(void) +{ + IOConfig_RegStruct *iconfig = IOCONFIG; /* Handle of ioconfig. */ + SYSCTRL0->SC_SYS_STAT.BIT.update_mode = 0; + SYSCTRL0->SC_SYS_STAT.BIT.update_mode_clear = 1; + + iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ + iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ + iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_15.BIT.func = 0x4; /* 0x4 is UART1_TXD */ + iconfig->iocmg_15.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_15.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_15.BIT.pu = BASE_CFG_ENABLE; /* Pull-up resistor of UART1_Tx. */ + iconfig->iocmg_15.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_15.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_14.BIT.func = 0x4; /* 0x4 is UART1_RXD */ + iconfig->iocmg_14.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_14.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_14.BIT.pu = BASE_CFG_ENABLE; /* Pull-up resistor of UART1_Rx. */ + iconfig->iocmg_14.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_14.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_51.BIT.func = 0x3; /* 0x3 is UART2_TXD */ + iconfig->iocmg_51.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_51.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_51.BIT.pu = BASE_CFG_ENABLE; /* Pull-up resistor of UART1_Tx. */ + iconfig->iocmg_51.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_51.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_52.BIT.func = 0x3; /* 0x3 is UART2_RXD */ + iconfig->iocmg_52.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_52.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_52.BIT.pu = BASE_CFG_ENABLE; /* Pull-up resistor of UART2_Rx. */ + iconfig->iocmg_52.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_52.BIT.se = BASE_CFG_DISABLE; +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + UART1_Init(); + UART2_Init(); + TIMER2_Init(); + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_single_wire_communication/readme.md b/drivers_sample/uart/sample_uart_single_wire_communication/readme.md new file mode 100644 index 000000000..52ac5060c --- /dev/null +++ b/drivers_sample/uart/sample_uart_single_wire_communication/readme.md @@ -0,0 +1,28 @@ +# UART-单线通信 +## 关键字: UART, 单线通信 + +**【功能描述】** ++ UART单线通信,使用一根线连接UART1和UART2的TX和RX,UART通过不断的切换接收和发送功能,从而实现在单线上的数据接收和发送。 + +**【示例配置】** ++ TIMER定时器:TIMER用于监控UART发送是否完成,若发送完成,则可以进行数据的接收,UART切换为数据接收功能。默认0.5ms判断一次UART的发送状态,用户可在TIMER的配置界面中更改此配置周期。 + ++ 接线方式:此用例使用了UART1和UART2进行单线通信,其单线的连接方式如下: +```c + UART1_Tx---|_____|---UART2_Tx + UART1_Rx---| |---UART2_Rx +``` + ++ 发送数据和接收数据:发送数据和接收数据都是采用中断的模式,发送完成或接收完成之后,会调用发送完成中断和接收完成中断回调函数。 + ++ 状态机:由于UART采用单线通信,因此UART总线上同一时间只能存在一种状态,因此需要控制UART1和UART2的收发使能,此示例中采用状态机控制,使得总线上同一时刻只能处于下列一种状态:UART1发送UART2接收、空闲、UART2发送UART1接收。 + ++ 串口0(UART0)用于打印调试信息,串口2(UART2)和串口1(UART1)用于单线通信,用户可以查看串口0的调试信息,判断单线通信是否正常。 + +**【示例效果】** ++ 运行样例之后,查看串口0的信息,UART1和UART2会循环的发送和接收数据。 + +**【注意事项】** ++ 串口通信的波特率,校验位等配置需保持一致,可以通过UART配置界面进行更改。 + ++ 此sample适用于单线实现UART的通讯功能,此时UART为半双工工作模式。 \ No newline at end of file diff --git a/drivers_sample/uart/sample_uart_single_wire_communication/src/sample_uart_single_wire_communication.c b/drivers_sample/uart/sample_uart_single_wire_communication/src/sample_uart_single_wire_communication.c new file mode 100644 index 000000000..79c8438d6 --- /dev/null +++ b/drivers_sample/uart/sample_uart_single_wire_communication/src/sample_uart_single_wire_communication.c @@ -0,0 +1,354 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_uart_single_wire_communication.c + * @author MCU Driver Team + * @brief uart sample module. + * @details In single-line communication, one line is used to connect the TX and RX of the UART. + * The UART continuously switches the RX and RX functions to receive and transmit data on one data line. + * (1) This sample is applicable to the single-wire UART communication function. In this case, the UART works + * in half-duplex mode. + * (2) Serial port 0 (UART0) is used to print debugging information, aUART1 and UART2 are used for + * single-wire communication. The connection modes of UART1 and UART2 are as follows: + * UART1_Tx---|_____|---UART2_Tx + * UART1_Rx---| |---UART2_Rx + * (3) The TIMER is used to query the UART single-wire status in interrupt mode (or block mode). + */ +#include "sample_uart_single_wire_communication.h" + + +#define UART_SINGLE_WIRE_TX_COUNT 5 +#define UART_SINGLE_WIRE_RX_COUNT 5 +#define UART_SINGLE_DELAY_TIMER 1000 +#define UART2_ENABLE_TX 0x3 +#define UART1_ENABLE_TX 0x4 +#define UART_RESET_STATUS 0x1 + +static unsigned char g_singleWireTx[UART_SINGLE_WIRE_TX_COUNT] = "12345"; /* Single wire Tx data length is 5 */ +static unsigned char g_singleWireRx[UART_SINGLE_WIRE_RX_COUNT] = {0}; /* Single wire Rx data length is 5 */ + + +volatile bool g_uart2NotBusy = true; /* Flag of uart not busy. */ +volatile bool g_uart1NotBusy = true; +volatile unsigned int g_uartSingleWireStatus = UART_SINGLE_WIRE_READY; /* By default, the UART is ready. */ + +/** + * @brief Enables the UART Tx interrupt and transmit functions. + * @param handle UART handle. + * @retval None. + */ +void UART_EnableTx(UART_Handle *handle) +{ + UART_ASSERT_PARAM(handle != NULL); + UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); + /* Enable the TX and TX completion interrupts. */ + handle->baseAddress->UART_CR.BIT.uarten = BASE_CFG_DISABLE; + handle->baseAddress->UART_CR.BIT.txe = BASE_CFG_ENABLE; /* Enables UART transmit. */ + /* Clears the TX and RX FIFOs. */ + handle->baseAddress->UART_LCR_H.BIT.fen = BASE_CFG_DISABLE; + __asm__ volatile ("nop"); + handle->baseAddress->UART_LCR_H.BIT.fen = handle->fifoMode; + handle->baseAddress->UART_IMSC.BIT.txim = BASE_CFG_ENABLE; /* TX interrupt enable. */ + /* Make all configurations take effect. */ + handle->baseAddress->UART_CR.BIT.uarten = BASE_CFG_ENABLE; +} + +/** + * @brief Disable the UART Tx interrupt and transmit functions. + * @param handle UART handle. + * @retval None. + */ +void UART_DisableTx(UART_Handle *handle) +{ + UART_ASSERT_PARAM(handle != NULL); + UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); + /* Disable the TX and TX completion interrupts. */ + handle->baseAddress->UART_CR.BIT.uarten = BASE_CFG_DISABLE; + handle->baseAddress->UART_CR.BIT.txe = BASE_CFG_DISABLE; /* Disable UART transmit. */ + handle->baseAddress->UART_LCR_H.BIT.fen = BASE_CFG_DISABLE; /* Clears the FIFOs. */ + __asm__ volatile ("nop"); + handle->baseAddress->UART_LCR_H.BIT.fen = handle->fifoMode; /* Flesh the FIFOs */ + handle->baseAddress->UART_IMSC.BIT.txim = BASE_CFG_DISABLE; /* Mask TX interrupt enable. */ + handle->baseAddress->UART_CR.BIT.uarten = BASE_CFG_ENABLE; /* Enable UART. */ +} + +/** + * @brief Enable the UART Rx interrupt and transmit functions. + * @param handle UART handle. + * @retval None. + */ +void UART_EnableRx(UART_Handle *handle) +{ + UART_ASSERT_PARAM(handle != NULL); + UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); + /* Enable the RX and RX completion interrupts. */ + handle->baseAddress->UART_CR.BIT.uarten = BASE_CFG_DISABLE; + handle->baseAddress->UART_CR.BIT.rxe = BASE_CFG_ENABLE; /* Enables UART reception. */ + + handle->baseAddress->UART_LCR_H.BIT.fen = BASE_CFG_DISABLE; /* Flesh the FIFOs */ + __asm__ volatile ("nop"); + handle->baseAddress->UART_LCR_H.BIT.fen = handle->fifoMode; + handle->baseAddress->UART_IMSC.BIT.rxim = BASE_CFG_ENABLE; /* Mask RX interrupt enable. */ + + handle->baseAddress->UART_CR.BIT.uarten = BASE_CFG_ENABLE; /* The configuration takes effect. */ +} + +/** + * @brief Disable the UART Rx interrupt and transmit functions. + * @param handle UART handle. + * @retval None. + */ +void UART_DisableRx(UART_Handle *handle) +{ + UART_ASSERT_PARAM(handle != NULL); + UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); + /* disable the RX and RX completion interrupts. */ + handle->baseAddress->UART_CR.BIT.uarten = BASE_CFG_DISABLE; + /* Disable UART reception. */ + handle->baseAddress->UART_CR.BIT.rxe = BASE_CFG_DISABLE; + /* Flesh the FIFOs */ + handle->baseAddress->UART_LCR_H.BIT.fen = BASE_CFG_DISABLE; + __asm__ volatile ("nop"); + handle->baseAddress->UART_LCR_H.BIT.fen = handle->fifoMode; + handle->baseAddress->UART_IMSC.BIT.rxim = BASE_CFG_DISABLE; /* Mask RX interrupt disable. */ + /* Enable UART */ + handle->baseAddress->UART_CR.BIT.uarten = BASE_CFG_ENABLE; +} + +/** + * @brief Enable the transmit pin of the UART2 and disable the transmit pin of the UART1. + * @param None + * @retval None. + */ +void UART2TxIOEnable(void) +{ + IOConfig_RegStruct *iconfig = IOCONFIG; + iconfig->iocmg_15.BIT.func = UART_RESET_STATUS; /* Disable the Tx of UART1. */ + iconfig->iocmg_51.BIT.func = UART2_ENABLE_TX; /* Enable the Tx of UART2. */ +} + +/** + * @brief Enable the transmit pin of the UART1 and disable the transmit pin of the UART2. + * @param None + * @retval None. + */ +void UART1TxIOEnable(void) +{ + IOConfig_RegStruct *iconfig = IOCONFIG; + iconfig->iocmg_15.BIT.func = UART1_ENABLE_TX; /* Enable the Tx of UART1. */ + iconfig->iocmg_51.BIT.func = UART_RESET_STATUS; /* Disable the Tx of UART2. */ +} + +/** + * @brief Clear string. + * @param str, String to be cleared. + * @retval None. + */ +static void ClearString(unsigned char *str) +{ + for (unsigned int i = 0; i < UART_SINGLE_WIRE_RX_COUNT; ++i) { + str[i] = 0; + } +} + +/** + * @brief Periodic callback function of TIMER2. + * @param handle TIMER handle + * @retval None. + */ +void TIMER2CallbackFunction(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* Queries the bus status of UART2. */ + if (g_uart2.baseAddress->UART_FR.BIT.busy == BASE_CFG_DISABLE) { + g_uart2NotBusy = true; + } else { + g_uart2NotBusy = false; /* UART2 busy */ + } + /* Queries the bus status of UART1. */ + if (g_uart1.baseAddress->UART_FR.BIT.busy == BASE_CFG_DISABLE) { + g_uart1NotBusy = true; + } else { + g_uart1NotBusy = false; /* UART1 busy */ + } +} + +/** + * @brief User-defined read completion interrupt callback function of UART2. + * @param handle UART handle. + * @retval None. + */ +void UART2ReadInterruptCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("\r\nUART 2 Read Finish: %s\r\n", g_singleWireRx); + g_uartSingleWireStatus = UART_SINGLE_WIRE_RX_FIN; + return; +} + +/** + * @brief User-defined write completion interrupt callback function of UART2. + * @param handle UART handle. + * @retval None. + */ +void UART2WriteInterruptCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("\r\nUART 2 Write Finish\r\n"); + g_uartSingleWireStatus = UART_SINGLE_WIRE_TX_FIN; + return; +} + +/** + * @brief User-defined write completion interrupt callback function of UART 1. + * @param handle UART handle. + * @retval None. + */ +void UART1WriteInterruptCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("\r\nUART 1 Write Finish\r\n"); + /* USER CODE BEGIN UART1_WRITE_IT_FINISH */ + /* USER CODE END UART1_WRITE_IT_FINISH */ +} + +/** + * @brief User-defined read completion interrupt callback function of UART1. + * @param handle UART handle. + * @retval None. + */ +void UART1ReadInterruptCallback(void *handle) +{ + BASE_FUNC_UNUSED(handle); + DBG_PRINTF("\r\nUART 1 Read Finish: %s\r\n", g_singleWireRx); + /* USER CODE BEGIN UART1_READ_IT_FINISH */ + /* USER CODE END UART1_READ_IT_FINISH */ +} + +/** + * @brief Prompt message + * @param None. + * @retval None. + */ +static void SingleWirePromptMessage(void) +{ + /* Message Begin */ + DBG_PRINTF("UART Init finish, UART single wire commiuncation:\r\n"); + DBG_PRINTF("The sent data is 12345 and the received data length is 5. \r\n"); + DBG_PRINTF("By default, the message is sent before the message is received. \r\n"); + DBG_PRINTF("--- UART0 is used for printing and debugging. \r\n"); + DBG_PRINTF("UART1 and UART2 are used for single-wire communication."); + DBG_PRINTF("The connection modes of UART1 and UART2 are as follows:\r\n"); + DBG_PRINTF("\r\n UART1_Tx---|_____|---UART2_Tx \r\n"); + DBG_PRINTF("\r\n UART1_Rx---| |---UART2_Rx \r\n"); + DBG_PRINTF("You can view prompt information through serial port 0 and check whether single-wire communication"); + DBG_PRINTF("is normal. \r\n"); + /* Message End */ +} + +/** + * @brief UART1 TX, UART2 RX, pin configuration. + * @param uart1Handle UART Handle. + * @param uart2Handle UART Handle + * @retval None. + */ +void UART1TxToUART2Rx(UART_Handle *uart1Handle, UART_Handle *uart2Handle) +{ + UART_ASSERT_PARAM((uart1Handle != NULL) && (uart2Handle != NULL)); + UART_ASSERT_PARAM(IsUARTInstance(uart1Handle->baseAddress) && IsUARTInstance(uart2Handle->baseAddress)); + DBG_PRINTF("UART single wire communications: UART1 -> UART2 \r\n"); + UART1TxIOEnable(); /* Pin and Tx enable configuration. */ + UART_DisableRx(uart1Handle); /* UART1 Tx enable and UART2 Rx enable. */ + UART_EnableTx(uart1Handle); + UART_DisableTx(uart2Handle); + UART_EnableRx(uart2Handle); +} + +/** + * @brief UART2 TX, UART1 RX, pin configuration. + * @param uart1Handle UART Handle. + * @param uart2Handle UART Handle + * @retval None. + */ +void UART2TxToUART1Rx(UART_Handle *uart1Handle, UART_Handle *uart2Handle) +{ + UART_ASSERT_PARAM((uart1Handle != NULL) && (uart2Handle != NULL)); + UART_ASSERT_PARAM(IsUARTInstance(uart1Handle->baseAddress) && IsUARTInstance(uart2Handle->baseAddress)); + DBG_PRINTF("UART single wire communications: UART2 -> UART1 \r\n"); + UART2TxIOEnable(); /* Pin and Tx enable configuration. */ + UART_DisableRx(uart2Handle); /* UART2 Tx enable and UART1 Rx enable. */ + UART_EnableTx(uart2Handle); + UART_DisableTx(uart1Handle); + UART_EnableRx(uart1Handle); +} + +/** + * @brief UART Interrupt Tx and Rx simultaneously. + * @param None. + * @retval None. + */ +void UART_SingleWireCommunication(void) +{ + SystemInit(); + /* Prompt message. */ + SingleWirePromptMessage(); + while (1) { + /* By default, data is sent first and then received. */ + switch (g_uartSingleWireStatus) { + case UART_SINGLE_WIRE_READY: + /* Initially, it is sent by default. You can set whether to receive or send first. */ + UART2TxToUART1Rx(&g_uart1, &g_uart2); + ClearString(g_singleWireRx); + /* UART2 transmits data to UART1. */ + HAL_UART_WriteIT(&g_uart2, g_singleWireTx, UART_SINGLE_WIRE_TX_COUNT); + HAL_UART_ReadIT(&g_uart1, g_singleWireRx, UART_SINGLE_WIRE_RX_COUNT); + g_uartSingleWireStatus = UART_SINGLE_WIRE_BUSY; + break; + case UART_SINGLE_WIRE_TX_FIN: + /* UART1 transmits data to UART2. */ + /* You need to query the bus status before configuring the TX. */ + if (g_uart2NotBusy == BASE_CFG_ENABLE) { /* Check whether the UART2 bus is busy. */ + UART1TxToUART2Rx(&g_uart1, &g_uart2); /* Pin and Tx enable configuration. UART1 -> UART2 */ + HAL_UART_WriteIT(&g_uart1, g_singleWireTx, UART_SINGLE_WIRE_TX_COUNT); + } + /* UART2 RX data. */ + ClearString(g_singleWireRx); + HAL_UART_ReadIT(&g_uart2, g_singleWireRx, UART_SINGLE_WIRE_RX_COUNT); + g_uartSingleWireStatus = UART_SINGLE_WIRE_BUSY; + break; + case UART_SINGLE_WIRE_RX_FIN: + /* UART2 transmits data to UART1. */ + /* You need to query the bus status before configuring the TX. */ + if (g_uart1NotBusy == BASE_CFG_ENABLE) { /* Check whether the UART1 bus is busy. */ + UART2TxToUART1Rx(&g_uart1, &g_uart2); /* Pin and Tx enable configuration. UART2 -> UART1 */ + HAL_UART_WriteIT(&g_uart2, g_singleWireTx, UART_SINGLE_WIRE_TX_COUNT); + } + /* UART2 RX data. */ + ClearString(g_singleWireRx); + HAL_UART_ReadIT(&g_uart1, g_singleWireRx, UART_SINGLE_WIRE_RX_COUNT); + g_uartSingleWireStatus = UART_SINGLE_WIRE_BUSY; + break; + case UART_SINGLE_WIRE_BUSY: /* Bus busy, pause for a while. */ + __asm__ volatile ("nop"); + break; + default: + break; + } + BASE_FUNC_DELAY_MS(UART_SINGLE_DELAY_TIMER); /* Communication delay time (not mandatory). */ + } + return; +} \ No newline at end of file diff --git a/drivers_sample/wdg/sample_iwdg_refresh/inc/sample_iwdg_refresh.h b/drivers_sample/wdg/sample_iwdg_refresh/inc/sample_iwdg_refresh.h new file mode 100644 index 000000000..09f66fab7 --- /dev/null +++ b/drivers_sample/wdg/sample_iwdg_refresh/inc/sample_iwdg_refresh.h @@ -0,0 +1,30 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_iwdg_refresh.h + * @author MCU Driver Team + * @brief IWDG module sample + * @details This file provides sample code for users to help + * register iwdg interrupt and feed iwdg. + */ + +#ifndef IWDG_REFRESH_SAMPLE_H +#define IWDG_REFRESH_SAMPLE_H + +BASE_StatusType IWDG_RefreshSample(void); + +#endif /* IWDG_REFRESH_SAMPLE_H */ \ No newline at end of file diff --git a/drivers_sample/wdg/sample_iwdg_refresh/init/main.c b/drivers_sample/wdg/sample_iwdg_refresh/init/main.c new file mode 100644 index 000000000..c51434366 --- /dev/null +++ b/drivers_sample/wdg/sample_iwdg_refresh/init/main.c @@ -0,0 +1,52 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ + +#include "typedefs.h" +#include "feature.h" +#include "sample_iwdg_refresh.h" +#include "main.h" +/* USER CODE BEGIN 0 */ +/* USER CODE */ +/* USER CODE END 0 */ +UART_Handle g_uart0; +IWDG_Handle g_iwdg; +/* USER CODE BEGIN 1 */ +/* USER CODE END 1 */ + +int main(void) +{ + /* USER CODE BEGIN 2 */ + /* USER CODE END 2 */ + IWDG_RefreshSample(); + /* USER CODE BEGIN 3 */ + /* USER CODE END 3 */ + while (1) { + /* USER CODE BEGIN 4 */ + /* USER CODE END 4 */ + } + /* USER CODE BEGIN 5 */ + /* USER CODE END 5 */ + return BASE_STATUS_OK; +} + +/* USER CODE BEGIN 6 */ +/* USER CODE END 6 */ \ No newline at end of file diff --git a/drivers_sample/wdg/sample_iwdg_refresh/init/main.h b/drivers_sample/wdg/sample_iwdg_refresh/init/main.h new file mode 100644 index 000000000..e063f5a7c --- /dev/null +++ b/drivers_sample/wdg/sample_iwdg_refresh/init/main.h @@ -0,0 +1,59 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "uart_ex.h" +#include "crg.h" +#include "iwdg.h" +#include "iwdg_ex.h" +#include "iocmg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define XTAL_DRV_LEVEL4 0x03U +#define XTAL_DRV_LEVEL3 0x02U +#define XTAL_DRV_LEVEL2 0x01U +#define XTAL_DRV_LEVEL1 0x00U + +extern IWDG_Handle g_iwdg; +extern UART_Handle g_uart0; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +void IWDGCallbackFunction(void *handle); + +/* USER CODE BEGIN 0 */ +/* USER CODE */ +/* USER CODE END 0 */ + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/wdg/sample_iwdg_refresh/init/system_init.c b/drivers_sample/wdg/sample_iwdg_refresh/init/system_init.c new file mode 100644 index 000000000..8ab0bc96e --- /dev/null +++ b/drivers_sample/wdg/sample_iwdg_refresh/init/system_init.c @@ -0,0 +1,112 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" +#include "iocmg_ip.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 48; /* PLL Multiplier 48 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.clk1MDiv = (25 - 1); /* The 1 MHz freq is equal to the input clock frequency / (clk_1m_div + 1). 25 is + the div of the clk_1m in CLOCK. */ + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + + g_uart0.baseAddress = UART0; /* uart0 baseaaddress */ + + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; /* data length 8 */ + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; /* blocking mode */ + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; /* fifo size 8 */ + g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +__weak void IWDGCallbackFunction(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN IWDG Callback */ + /* USER CODE END IWDG Callback */ +} + +static void IWDG_Init(void) +{ + HAL_CRG_IpEnableSet(IWDG_BASE, IP_CLK_ENABLE); + g_iwdg.baseAddress = IWDG; + g_iwdg.timeValue = 1000; /* 1000 is time value */ + g_iwdg.timeType = IWDG_TIME_UNIT_MS; + g_iwdg.freqDivValue = IWDG_FREQ_DIV_128; + HAL_IWDG_Init(&g_iwdg); + HAL_IWDG_EnableWindowModeEx(&g_iwdg); + HAL_IWDG_SetWindowValueEx(&g_iwdg, 500, IWDG_TIME_UNIT_MS); /* 500 is window value */ +} + +static void IOConfig(void) +{ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_3_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_3_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_3_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_3_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_3_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_4_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_4_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_4_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_4_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_4_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + IWDG_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/wdg/sample_iwdg_refresh/readme.md b/drivers_sample/wdg/sample_iwdg_refresh/readme.md new file mode 100644 index 000000000..615c26644 --- /dev/null +++ b/drivers_sample/wdg/sample_iwdg_refresh/readme.md @@ -0,0 +1,18 @@ +# 配置IWDG参数,验证看门狗复位功能,软件进行喂狗操作 +## 关键字: IWDG,中断, 喂狗 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、IWDG初始化和功能配置。设置喂狗时间和窗口值,计时值递减到窗口值后喂狗则不复位,否则在计数递减到窗口值前喂狗或计数到0没喂狗则产生复位操作。 + +**【示例配置】** ++ 在"SystemInit()”接口中配置IWDG的初始值、窗口值和窗口使能、分频系数等参数。 + ++ 调用"HAL_IWDG_Start()"启动看门狗。 + ++ 设置调用"HAL_IWDG_Refresh()"进行喂狗操作,如果调用喂狗操作则不复位,否则计数为0没喂狗则系统复位,程序重新执行。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后。串口打印testlog,如果喂狗生效,则不产生复位。否则系统复位,程序重新运行,循环往复。 + +**【注意事项】** ++ 在计数递减到窗口值前喂狗或计数到0没喂狗,均会产生复位操作。 \ No newline at end of file diff --git a/drivers_sample/wdg/sample_iwdg_refresh/src/sample_iwdg_refresh.c b/drivers_sample/wdg/sample_iwdg_refresh/src/sample_iwdg_refresh.c new file mode 100644 index 000000000..d32dd6135 --- /dev/null +++ b/drivers_sample/wdg/sample_iwdg_refresh/src/sample_iwdg_refresh.c @@ -0,0 +1,58 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_iwdg_refresh.c + * @author MCU Driver Team + * @brief IWDG module realize reset function sample + * @details The watchdog timeout reset function is used to set the time when the watchdog feeds the watchdog. + * When the window mode is enabled and the corresponding window value is set, + * an interrupt is generated when the count value is equal to the window value. + * When the watchdog is fed beyond the window value, a reset signal is generated. + * When the count value is 0 and the interrupt is not cleared, a reset signal is also generated. + * When the window mode is disabled, an interrupt is generated when the count value is reduced to half. + * The reset signal is generated only when the count value is 0 and the interrupt is not cleared. + */ + +/* Includes ------------------------------------------------------------------*/ +#include "baseinc.h" +#include "debug.h" +#include "iwdg.h" +#include "main.h" +#include "sample_iwdg_refresh.h" + +#define CYCLE_INTERVAL_TIME 600 + +/* prototype functions -------------------------------------------------------*/ +/** + * @brief IWDG refresh sample function + * @param None + * @return BASE_StatusType + */ +BASE_StatusType IWDG_RefreshSample(void) +{ + SystemInit(); + HAL_IWDG_Start(&g_iwdg); /* iwdg start */ + DBG_PRINTF("\r\n START : test iwdg sample \r\n"); + while (1) { + DBG_PRINTF("test iwdg sample \r\n"); + BASE_FUNC_DELAY_MS(CYCLE_INTERVAL_TIME); + /* User can Add HAL_IWDG_Refresh() API here, iwdg not reset because refresh period, \ + if not refresh, next time reset. */ + HAL_IWDG_Refresh(&g_iwdg); /* The dog feeding time is determined by the user. */ + } + return BASE_STATUS_OK; +} diff --git a/drivers_sample/wdg/sample_iwdg_reset/inc/iwdg_reset_sample.h b/drivers_sample/wdg/sample_iwdg_reset/inc/iwdg_reset_sample.h new file mode 100644 index 000000000..5e59e4bee --- /dev/null +++ b/drivers_sample/wdg/sample_iwdg_reset/inc/iwdg_reset_sample.h @@ -0,0 +1,30 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file iwdg_reset_sample.h + * @author MCU Driver Team + * @brief WDG module sample + * @details This file provides sample code for users to help + * register iwdg interrupt and feed iwdg. + */ + +#ifndef IWDG_RESET_SAMPLE_H +#define IWDG_RESET_SAMPLE_H + +BASE_StatusType IWDG_ResetSample(void); + +#endif /* IWDG_RESET_SAMPLE_H */ \ No newline at end of file diff --git a/drivers_sample/wdg/sample_iwdg_reset/init/main.c b/drivers_sample/wdg/sample_iwdg_reset/init/main.c new file mode 100644 index 000000000..a4147b1a4 --- /dev/null +++ b/drivers_sample/wdg/sample_iwdg_reset/init/main.c @@ -0,0 +1,51 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ + +#include "typedefs.h" +#include "feature.h" +#include "iwdg_reset_sample.h" +#include "main.h" +/* USER CODE BEGIN 0 */ +/* USER CODE END 0 */ +WDG_Handle g_iwdg; +UART_Handle g_uart0; +/* USER CODE BEGIN 1 */ +/* USER CODE END 1 */ + +int main(void) +{ + /* USER CODE BEGIN 2 */ + /* USER CODE END 2 */ + IWDG_ResetSample(); + /* USER CODE BEGIN 3 */ + /* USER CODE END 3 */ + while (1) { + /* USER CODE BEGIN 4 */ + /* USER CODE END 4 */ + } + /* USER CODE BEGIN 5 */ + /* USER CODE END 5 */ + return BASE_STATUS_OK; +} + +/* USER CODE BEGIN 6 */ +/* USER CODE END 6 */ \ No newline at end of file diff --git a/drivers_sample/wdg/sample_iwdg_reset/init/main.h b/drivers_sample/wdg/sample_iwdg_reset/init/main.h new file mode 100644 index 000000000..ef63367b0 --- /dev/null +++ b/drivers_sample/wdg/sample_iwdg_reset/init/main.h @@ -0,0 +1,47 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "crg.h" +#include "wdg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +extern WDG_Handle g_iwdg; +extern UART_Handle g_uart0; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +void IwdgITCallBackFunc(void *handle); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/wdg/sample_iwdg_reset/init/system_init.c b/drivers_sample/wdg/sample_iwdg_reset/init/system_init.c new file mode 100644 index 000000000..bdeb90b4d --- /dev/null +++ b/drivers_sample/wdg/sample_iwdg_reset/init/system_init.c @@ -0,0 +1,118 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); + + g_uart0.baseAddress = UART0; + g_uart0.irqNum = IRQ_UART0; + + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +__weak void IwdgITCallBackFunc(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN IwdgITCallBackFunc */ + /* USER CODE END IwdgITCallBackFunc */ +} + +static void IWDG_Init(void) +{ + HAL_CRG_IpEnableSet(IWDG_BASE, IP_CLK_ENABLE); /* Enable the IWDG clock */ + HAL_CRG_IpClkSelectSet(IWDG_BASE, CRG_PLL_NO_PREDV); + + g_iwdg.baseAddress = IWDG; + g_iwdg.irqNum = IRQ_IWDG; + + g_iwdg.loadValue = 2000; /* 2000 is load value */ + g_iwdg.timeType = WDG_TIME_UNIT_MS; + g_iwdg.enableIT = BASE_CFG_DISABLE; + g_iwdg.enableRST = BASE_CFG_ENABLE; + HAL_WDG_Init(&g_iwdg); + + HAL_WDG_RegisterCallback(&g_iwdg, IwdgITCallBackFunc); /* Registering callback functions */ + HAL_WDG_IRQService(&g_iwdg); + IRQ_SetPriority(g_iwdg.irqNum, 1); + IRQ_EnableN(g_iwdg.irqNum); +} + +static void IOConfig(void) +{ + IOConfig_RegStruct *iconfig = IOCONFIG; + + iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ + iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ + iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; +} +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + IWDG_Init(); + + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/wdg/sample_iwdg_reset/readme.md b/drivers_sample/wdg/sample_iwdg_reset/readme.md new file mode 100644 index 000000000..18d2e51eb --- /dev/null +++ b/drivers_sample/wdg/sample_iwdg_reset/readme.md @@ -0,0 +1,18 @@ +# 配置IWDG参数,验证看门狗复位功能,中断回调中进行喂狗操作 +## 关键字: IWDG,中断, 喂狗 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、中断和IWDG初始化和功能配置。设置喂狗时间,计时值递减到0后触发中断,中断中喂狗则不复位,否则第二次计数到0没喂狗则产生复位操作。 + +**【示例配置】** ++ 在"SystemInit()”接口中配置IWDG的初始值、中断和复位使能等参数。 + ++ 调用"HAL_WDG_Start()"启动看门狗。 + ++ 设置中断回调函数"IwdgITCallBackFunc()",在中断回调函数中调用"HAL_WDG_Refresh()"进行喂狗操作,如果调用喂狗操作则不复位,否则第二次计数为0则系统复位,程序重新执行。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后。串口打印testlog,中断触发后打印中断log,如果在中断中调用喂狗操作,则不产生复位。否则第二次触发中断则系统复位,程序重新运行,循环往复。 + +**【注意事项】** ++ 若想不复位,可在第一次计数清零触发中断时喂狗,为喂狗窗口,该版IP实际超时复位时间为两倍计数值,第二次计数清零才复位。用户可在回调函数中清中断,清中断系统自动喂狗,导致复位功能失效,可降规作为timer使用。 \ No newline at end of file diff --git a/drivers_sample/wdg/sample_iwdg_reset/src/iwdg_reset_sample.c b/drivers_sample/wdg/sample_iwdg_reset/src/iwdg_reset_sample.c new file mode 100644 index 000000000..61f3b7a28 --- /dev/null +++ b/drivers_sample/wdg/sample_iwdg_reset/src/iwdg_reset_sample.c @@ -0,0 +1,78 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file iwdg_reset_sample.c + * @author MCU Driver Team + * @brief IWDG module realize reset function sample + * @details The watchdog timeout reset function is used to set the watchdog feeding time. When the timing \ + * value decreases to 0, an interrupt is triggered. The watchdog is not fed and the count value is \ + * overloaded. The reset operation is performed after the second count is cleared. If you do not \ + * want to reset, you can feed the watchdog when the first count is cleared to trigger an interrupt. \ + * The actual timeout reset time of the IP version is twice the count value. The reset is performed \ + * only after the second count is cleared. clear interrupt signal will auto load value, reset function \ + * invalid, not clear irq, second times will reset User can Add HAL_WDG_Refresh() API here, then, \ + * wdg can use as a timer because clear with reload. so reset function invalid. + */ + +/* Includes ------------------------------------------------------------------*/ +#include "baseinc.h" +#include "debug.h" +#include "iwdg.h" +#include "main.h" +#include "iwdg_reset_sample.h" + +#define DOG_FEED_INTRVAL_TIME 2000 +#define CYCLE_INTERVAL_TIME 1000 + +/* prototype functions -------------------------------------------------------*/ +void IwdgITCallBackFunc(void *param); + +/** + * @brief IWDG reset sample function + * @param None + * @return BASE_StatusType + */ +BASE_StatusType IWDG_ResetSample(void) +{ + SystemInit(); + HAL_IWDG_Start(&g_iwdg); + DBG_UartPrintInit(115200); /* 115200 : baud rate */ + DBG_PRINTF("\r\n START : test iwdg sample \r\n"); + while (1) { + DBG_PRINTF("test iwdg sample \r\n"); + BASE_FUNC_DELAY_MS(CYCLE_INTERVAL_TIME); + } + return BASE_STATUS_OK; +} + +/** + * @brief Handling IWDG interrupt callback + * @param handle IWDG handle for registers and initialnized values + * @return None + */ +void IwdgITCallBackFunc(void *param) +{ + IWDG_Handle *handle = (IWDG_Handle *)param; + IWDG_ASSERT_PARAM(handle != NULL); + /* clear interrupt signal will auto load value, reset function invalid, \ + not clear irq, second times will reset */ + /* User can Add HAL_IWDG_Refresh() API here, wdg not reset because refresh period, \ + if not refresh, next time reset */ + HAL_IWDG_Refresh(handle); + + DBG_PRINTF("IWDG Interrupt handle \r\n"); +} \ No newline at end of file diff --git a/drivers_sample/wdg/sample_wdg_reset/inc/wdg_reset_sample.h b/drivers_sample/wdg/sample_wdg_reset/inc/wdg_reset_sample.h new file mode 100644 index 000000000..6a41d36fb --- /dev/null +++ b/drivers_sample/wdg/sample_wdg_reset/inc/wdg_reset_sample.h @@ -0,0 +1,30 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file wdg_reset_sample.h + * @author MCU Driver Team + * @brief WDG module sample + * @details This file provides sample code for users to help + * register wdg interrupt and feed wdg. + */ + +#ifndef WDG_RESET_SAMPLE_H +#define WDG_RESET_SAMPLE_H + +BASE_StatusType WDG_ResetSample(void); + +#endif /* WDG_RESET_SAMPLE_H */ \ No newline at end of file diff --git a/drivers_sample/wdg/sample_wdg_reset/init/main.c b/drivers_sample/wdg/sample_wdg_reset/init/main.c new file mode 100644 index 000000000..8fa680482 --- /dev/null +++ b/drivers_sample/wdg/sample_wdg_reset/init/main.c @@ -0,0 +1,35 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ +#include "feature.h" +#include "main.h" +#include "wdg_reset_sample.h" + +WDG_Handle g_resetWdgHandler; +UART_Handle g_uart0; + +int main(void) +{ + WDG_ResetSample(); + while (1) { + } + return BASE_STATUS_OK; +} \ No newline at end of file diff --git a/drivers_sample/wdg/sample_wdg_reset/init/main.h b/drivers_sample/wdg/sample_wdg_reset/init/main.h new file mode 100644 index 000000000..c0bd46ff6 --- /dev/null +++ b/drivers_sample/wdg/sample_wdg_reset/init/main.h @@ -0,0 +1,48 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "wdg.h" +#include "crg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +extern WDG_Handle g_resetWdgHandler; + +extern UART_Handle g_uart0; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +void WDG_CallbackFunc(void *handle); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/wdg/sample_wdg_reset/init/system_init.c b/drivers_sample/wdg/sample_wdg_reset/init/system_init.c new file mode 100644 index 000000000..da647597d --- /dev/null +++ b/drivers_sample/wdg/sample_wdg_reset/init/system_init.c @@ -0,0 +1,116 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); + + g_uart0.baseAddress = UART0; + g_uart0.irqNum = IRQ_UART0; + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +__weak void WDG_CallbackFunc(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN WDG_CallbackFunc */ + /* USER CODE END WDG_CallbackFunc */ +} + +static void WDG_Init(void) +{ + HAL_CRG_IpEnableSet(WDG_BASE, IP_CLK_ENABLE); + HAL_CRG_IpClkSelectSet(WDG_BASE, CRG_PLL_NO_PREDV); + + g_resetWdgHandler.baseAddress = WDG; + g_resetWdgHandler.irqNum = IRQ_WDG; + g_resetWdgHandler.loadValue = 2000; /* 2000: Interrupt Trigger Time */ + g_resetWdgHandler.timeType = WDG_TIME_UNIT_MS; + g_resetWdgHandler.enableIT = BASE_CFG_ENABLE; + g_resetWdgHandler.enableRST = BASE_CFG_ENABLE; + HAL_WDG_Init(&g_resetWdgHandler); + /* Register callback functions to be defined by users. */ + HAL_WDG_RegisterCallback(&g_resetWdgHandler, WDG_CallbackFunc); + HAL_WDG_IRQService(&g_resetWdgHandler); + IRQ_SetPriority(g_resetWdgHandler.irqNum, 1); /* set gpio1 interrupt priority to 1, 1~7 */ + IRQ_EnableN(g_resetWdgHandler.irqNum); +} + +static void IOConfig(void) +{ + IOConfig_RegStruct *iconfig = IOCONFIG; + + iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ + iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; + + iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ + iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; + iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; + iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; + iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + WDG_Init(); + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/wdg/sample_wdg_reset/readme.md b/drivers_sample/wdg/sample_wdg_reset/readme.md new file mode 100644 index 000000000..e583c6c8e --- /dev/null +++ b/drivers_sample/wdg/sample_wdg_reset/readme.md @@ -0,0 +1,18 @@ +# 配置WDG参数,验证看门狗复位功能,中断回调中进行喂狗操作 +## 关键字: WDG,中断, 喂狗 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、中断和WDG初始化和功能配置。设置喂狗时间,计时值递减到0后触发中断,中断中喂狗则不复位,否则第二次计数到0没喂狗则产生复位操作。 + +**【示例配置】** ++ 在"SystemInit()”接口中配置WDG的初始值、中断和复位使能等参数。 + ++ 调用"HAL_WDG_Start()"启动看门狗。 + ++ 设置中断回调函数"WDG_CallbackFunc()",在中断回调函数中调用"HAL_WDG_Refresh()"进行喂狗操作,如果调用喂狗操作则不复位,否则第二次计数为0则系统复位,程序重新执行。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后。串口打印testlog,中断触发后打印中断log,如果在中断中调用喂狗操作,则不产生复位。否则第二次触发中断则系统复位,程序重新运行,循环往复。 + +**【注意事项】** ++ 若想不复位,可在第一次计数清零触发中断时喂狗,为喂狗窗口,该版IP实际超时复位时间为两倍计数值,第二次计数清零才复位。用户可在回调函数中清中断,清中断系统自动喂狗,导致复位功能失效,可降规作为timer使用。 \ No newline at end of file diff --git a/drivers_sample/wdg/sample_wdg_reset/src/wdg_reset_sample.c b/drivers_sample/wdg/sample_wdg_reset/src/wdg_reset_sample.c new file mode 100644 index 000000000..c097e4dd3 --- /dev/null +++ b/drivers_sample/wdg/sample_wdg_reset/src/wdg_reset_sample.c @@ -0,0 +1,77 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file wdg_reset_sample.c + * @author MCU Driver Team + * @brief WDG module realize reset function sample + * @details The watchdog timeout reset function is used to set the watchdog feeding time. When the timing \ + * value decreases to 0, an interrupt is triggered. The watchdog is not fed and the count value is \ + * overloaded. The reset operation is performed after the second count is cleared. If you do not \ + * want to reset, you can feed the watchdog when the first count is cleared to trigger an interrupt. \ + * The actual timeout reset time of the IP version is twice the count value. The reset is performed \ + * only after the second count is cleared. clear interrupt signal will auto load value, reset function \ + * invalid, not clear irq, second times will reset User can Add HAL_WDG_Refresh() API here, then, \ + * wdg can use as a timer because clear with reload. so reset function invalid. + */ + +/* Includes ------------------------------------------------------------------*/ +#include "debug.h" +#include "wdg.h" +#include "wdg_reset_sample.h" +#include "main.h" +#include "baseinc.h" + +#define DOG_FEED_INTRVAL_TIME 2000 +#define CYCLE_INTERVAL_TIME 1000 + +/* prototype functions -------------------------------------------------------*/ +void WDG_CallbackFunc(void *param); + +/** + * @brief WDG reset sample function + * @param None + * @return BASE_StatusType + */ +BASE_StatusType WDG_ResetSample(void) +{ + SystemInit(); + DBG_UartPrintInit(115200); /* 115200 : baud rate */ + DBG_PRINTF("\r\n START : test wdg sample \r\n"); + while (1) { + DBG_PRINTF("test wdg sample \r\n"); + BASE_FUNC_DELAY_MS(CYCLE_INTERVAL_TIME); + } + return BASE_STATUS_OK; +} + +/** + * @brief Handling WDG interrupt callback + * @param handle WDG handle for registers and initialnized values + * @return None + */ +void WDG_CallbackFunc(void *param) +{ + WDG_Handle *handle = (WDG_Handle *)param; + WDG_ASSERT_PARAM(handle != NULL); + /* clear interrupt signal will auto load value, reset function invalid, \ + not clear irq, second times will reset */ + /* User can Add HAL_WDG_Refresh() API here, wdg not reset because refresh period, \ + if not refresh, next time reset */ + HAL_WDG_Refresh(handle); + + DBG_PRINTF("WDG Interrupt handle \r\n"); +} \ No newline at end of file diff --git a/drivers_sample/wdg/sample_wwdg_refresh/inc/sample_wwdg_refresh.h b/drivers_sample/wdg/sample_wwdg_refresh/inc/sample_wwdg_refresh.h new file mode 100644 index 000000000..7f19f96c5 --- /dev/null +++ b/drivers_sample/wdg/sample_wwdg_refresh/inc/sample_wwdg_refresh.h @@ -0,0 +1,30 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_wwdg_refresh.h + * @author MCU Driver Team + * @brief WWDG module sample + * @details This file provides sample code for users to help + * register wwdg interrupt and feed wwdg. + */ + +#ifndef WWDG_REFRESH_SAMPLE_H +#define WWDG_REFRESH_SAMPLE_H + +BASE_StatusType WWDG_RefreshSample(void); + +#endif /* WWDG_REFRESH_SAMPLE_H */ \ No newline at end of file diff --git a/drivers_sample/wdg/sample_wwdg_refresh/init/main.c b/drivers_sample/wdg/sample_wwdg_refresh/init/main.c new file mode 100644 index 000000000..432f16cf5 --- /dev/null +++ b/drivers_sample/wdg/sample_wwdg_refresh/init/main.c @@ -0,0 +1,50 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.c + * @author MCU Driver Team + * @brief Main program body. + */ + +#include "typedefs.h" +#include "feature.h" +#include "main.h" +/* USER CODE BEGIN 0 */ +/* USER CODE END 0 */ +UART_Handle g_uart0; +WWDG_Handle g_wwdg; +/* USER CODE BEGIN 1 */ +/* USER CODE END 1 */ + +int main(void) +{ + /* USER CODE BEGIN 2 */ + /* USER CODE END 2 */ + WWDG_RefreshSample(); + /* USER CODE BEGIN 3 */ + /* USER CODE END 3 */ + while (1) { + /* USER CODE BEGIN 4 */ + /* USER CODE END 4 */ + } + /* USER CODE BEGIN 5 */ + /* USER CODE END 5 */ + return BASE_STATUS_OK; +} + +/* USER CODE BEGIN 6 */ +/* USER CODE END 6 */ \ No newline at end of file diff --git a/drivers_sample/wdg/sample_wwdg_refresh/init/main.h b/drivers_sample/wdg/sample_wwdg_refresh/init/main.h new file mode 100644 index 000000000..56ff9600a --- /dev/null +++ b/drivers_sample/wdg/sample_wwdg_refresh/init/main.h @@ -0,0 +1,52 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file main.h + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +/* Define to prevent recursive inclusion ------------------------------------- */ +#ifndef McuMagicTag_SYSTEM_INIT_H +#define McuMagicTag_SYSTEM_INIT_H + +#include "uart.h" +#include "crg.h" +#include "wwdg.h" + +#define IO_SPEED_FAST 0x00U +#define IO_SPEED_SLOW 0x01U + +#define IO_DRV_LEVEL4 0x00U +#define IO_DRV_LEVEL3 0x01U +#define IO_DRV_LEVEL2 0x02U +#define IO_DRV_LEVEL1 0x03U + +#define XTAL_DRV_LEVEL4 0x03U +#define XTAL_DRV_LEVEL3 0x02U +#define XTAL_DRV_LEVEL2 0x01U +#define XTAL_DRV_LEVEL1 0x00U + +extern WWDG_Handle g_wwdg; +extern UART_Handle g_uart0; + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); +void SystemInit(void); + +void WWDGCallbackFunction(void *handle); + +#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/drivers_sample/wdg/sample_wwdg_refresh/init/system_init.c b/drivers_sample/wdg/sample_wwdg_refresh/init/system_init.c new file mode 100644 index 000000000..a692bc4c8 --- /dev/null +++ b/drivers_sample/wdg/sample_wwdg_refresh/init/system_init.c @@ -0,0 +1,119 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + +#include "main.h" +#include "ioconfig.h" +#include "iocmg_ip.h" + +#define UART0_BAND_RATE 115200 + +BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) +{ + CRG_Handle crg; + crg.baseAddress = CRG; /* crg baseaddress */ + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 32; /* PLL Multiplier 32 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_1; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_1; + + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { /* CRG init */ + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; +} + +static void UART0_Init(void) +{ + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); + + g_uart0.baseAddress = UART0; /* uart0 baseaaddress */ + + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; /* data length 8 */ + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; /* blocking mode */ + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; /* fifo size 8 */ + g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); +} + +__weak void WWDGCallbackFunction(void *handle) +{ + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN WWDGCallbackFunction */ + /* USER CODE END WWDGCallbackFunction */ +} + +static void WWDG_Init(void) +{ + HAL_CRG_IpEnableSet(WWDG_BASE, IP_CLK_ENABLE); + + g_wwdg.baseAddress = WWDG; + + g_wwdg.timeValue = 2000; /* wwdg time value 2000 */ + g_wwdg.timeType = WWDG_TIME_UNIT_MS; + g_wwdg.enableIT = BASE_CFG_ENABLE; + g_wwdg.freqDivValue = WWDG_FREQ_DIV_1024; + g_wwdg.windowValue = 100; /* wwdg window value 100 */ + HAL_WWDG_EnableWindowModeEx(&g_wwdg); + HAL_WWDG_Init(&g_wwdg); + + /* wwdg interrput setting */ + HAL_WWDG_RegisterCallback(&g_wwdg, WWDGCallbackFunction); + IRQ_Register(IRQ_WWDG, HAL_WWDG_IrqHandler, &g_wwdg); + IRQ_SetPriority(IRQ_WWDG, 1); + IRQ_EnableN(IRQ_WWDG); +} + +static void IOConfig(void) +{ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + + HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ +} + +void SystemInit(void) +{ + IOConfig(); + UART0_Init(); + WWDG_Init(); + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ +} \ No newline at end of file diff --git a/drivers_sample/wdg/sample_wwdg_refresh/readme.md b/drivers_sample/wdg/sample_wwdg_refresh/readme.md new file mode 100644 index 000000000..3a3e7364d --- /dev/null +++ b/drivers_sample/wdg/sample_wwdg_refresh/readme.md @@ -0,0 +1,18 @@ +# 配置WWDG参数,验证看门狗复位功能,中断回调中进行喂狗操作 +## 关键字: WWDG,中断, 喂狗 + +**【功能描述】** ++ 示例代码基于HAL接口完成时钟、中断和WWDG初始化和功能配置。设置喂狗时间和窗口值,计时值递减到窗口值后触发中断,中断中喂狗则不复位,否则计数到0没喂狗则产生复位操作。 + +**【示例配置】** ++ 在"SystemInit()”接口中配置WWDG的初始值、窗口值和窗口使能、分频系数、中断等参数。 + ++ 调用"HAL_WWDG_Start()"启动看门狗。 + ++ 设置中断回调函数"WWDGCallbackFunction()",在中断回调函数中调用"HAL_WWDG_Refresh()"进行喂狗操作,如果调用喂狗操作则不复位,否则计数为0没喂狗则系统复位,程序重新执行。 + +**【示例效果】** ++ 当用户烧录编译后的示例代码后,初始化和配置完成后。串口打印testlog,中断触发后打印中断log,如果在中断中调用喂狗操作,则不产生复位。否则系统复位,程序重新运行,循环往复。 + +**【注意事项】** ++ 若想不复位,可在第一次计数到窗口值触发中断时喂狗,为喂狗窗口。用户可在回调函数中清中断,清中断系统自动喂狗,导致复位功能失效,可降规作为timer使用。 \ No newline at end of file diff --git a/drivers_sample/wdg/sample_wwdg_refresh/src/sample_wwdg_refresh.c b/drivers_sample/wdg/sample_wwdg_refresh/src/sample_wwdg_refresh.c new file mode 100644 index 000000000..9e0f2b629 --- /dev/null +++ b/drivers_sample/wdg/sample_wwdg_refresh/src/sample_wwdg_refresh.c @@ -0,0 +1,76 @@ +/** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file sample_wwdg_refresh.c + * @author MCU Driver Team + * @brief WWDG module realize refresh function sample + * @details The watchdog timeout reset function is used to set the time when the watchdog feeds the watchdog. + * When the window mode is enabled and the corresponding window value is set, + * an interrupt is generated when the count value is equal to the window value. + * When the watchdog is fed beyond the window value, a reset signal is generated. + * When the count value is 0 and the interrupt is not cleared, a reset signal is also generated. + * When the window mode is disabled, an interrupt is generated when the count value is reduced to half. + * The reset signal is generated only when the count value is 0 and the interrupt is not cleared. + */ + +/* Includes ------------------------------------------------------------------*/ +#include "debug.h" +#include "wwdg.h" +#include "main.h" +#include "baseinc.h" +#include "sample_wwdg_refresh.h" + +#define DOG_FEED_INTRVAL_TIME 2000 +#define CYCLE_INTERVAL_TIME 1000 + +/* prototype functions -------------------------------------------------------*/ +void WWDGCallbackFunction(void *param); + +/** + * @brief WWDG reset sample function + * @param None + * @return BASE_StatusType + */ +BASE_StatusType WWDG_RefreshSample(void) +{ + SystemInit(); + HAL_WWDG_Start(&g_wwdg); /* Turn on the watchdog timing */ + DBG_PRINTF("\r\n START : test wwdg sample \r\n"); + while (1) { + DBG_PRINTF("test wwdg sample \r\n"); + BASE_FUNC_DELAY_MS(CYCLE_INTERVAL_TIME); + } + return BASE_STATUS_OK; +} + +/** + * @brief Handling WWDG interrupt callback + * @param handle WWDG handle for registers and initialnized values + * @return None + */ +void WWDGCallbackFunction(void *param) +{ + WWDG_Handle *handle = (WWDG_Handle *)param; + WWDG_ASSERT_PARAM(handle != NULL); + /* clear interrupt signal will auto load value, reset function invalid, \ + not clear irq, second times will reset */ + /* User can Add HAL_WWDG_Refresh() API here, wwdg not reset because refresh period, \ + if not refresh, next time reset */ + HAL_WWDG_Refresh(handle); + + DBG_PRINTF("WWDG Interrupt handle \r\n"); +} \ No newline at end of file diff --git "a/drivers_sample/\345\233\276\347\211\207/1726194739756.jpg" "b/drivers_sample/\345\233\276\347\211\207/1726194739756.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..87c9fbfdea4dc6247aeb31b6a98b34c87fa4529c GIT binary patch literal 5782 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 literal 0 HcmV?d00001 diff --git "a/drivers_sample/\345\233\276\347\211\207/1726194794028.jpg" "b/drivers_sample/\345\233\276\347\211\207/1726194794028.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..49a62d44b2f9a1fe31f5e2a58b719b7f515e9615 GIT binary patch literal 62232 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 literal 0 HcmV?d00001 diff --git "a/drivers_sample/\345\233\276\347\211\207/1726194869607.jpg" "b/drivers_sample/\345\233\276\347\211\207/1726194869607.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..c978f4388baf02d13b40ab41b536751acf75ac03 GIT binary patch literal 166495 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

icY4>&=#fIdZs`H>Ixz(c9V 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%0A1er9x#@&j3D?3k76;v7*b|!CvjM zPnBLC+$ES_RrAJs_cB959amZBIFp!a;kvN7rT7!A`0yHZ-gIL-t{(>A}^1RXs_+nRSLdRaL>Bt0p!`j22CoW&H?>UBoY?z@uzR(`)8~gOq&ZxIT+!VpnKK zX2n<5w_{tig?P49AYxfX$-vA*_>7bzkBAstrK@9#pmj&t<}`Aq`ab7W#}x|w6#%7= z#6_t9Q-G-R#+S01NI(5~PBd$&-<>VpYfc^guOX8)-n-0TWOeM5Iu9=6Bd6)UgA5*3 zm${d$j*btArk$tK&i8B>KlqLxY#-wi{(nHf1xSQQ;++u?)i_VmKsJ=L+`wXX&#-Y( zNK}o1|DIXHA_kC%^REig6$`XCcJ8qzywR}o4K1;b6p{K^yqSAD^WUl)`$|dMeG4Za znUVU#RnE6}uf6|%;hEbRs023e()qkYTPL4q-s+o4fC{@937;o2tWW`w;)+LTe@5)# zco0bv^!GJlSj%x{F4sQ#8j-FSOYq%#$~{YPEyOF@Y^i@w`km9xt@(nPh_o=lz45C+ zT%#w(Y%_!CO!@3v$r3{>X>fZkrMk!O1J!Bipt&7nP_jN%8`#kS`oG*8e-+6lbT2#Q zF|!=UbGe$@$2q-CKW09)oR4lw@q7M5mEZSfQ=b=yfH&{jd!wj30IssopN5B+;g;1_dbXp>tB9G_}jRD`ziw?7{c8K z9jJI3&8If!me6zyhK}Dkv(1w}up&CAD5nUNo*5*{8O)5C&gOSL5U?<$+?aG%lU6Ga zbnY=E*(A}){WEU-|IBFB6={OpZH(;S7W_@0$LlfOSitF*K^#k1Ax09g<*f&zC;|Bj;`pJ+Vk0HQ7e2CIE!cUZo&n9vLyFqB4~LUqXb zLGVX$Yh_S78+afM_xL0UjbPb+wkrl#h4#^YcI8I+=S=~7!($hn!^R!+06|F( zJkZxVm4&+FA(qBn`83%u}$8nRsP#kh23UVww zr`7?9G6WSIAXXi%%D6<_Cza93(@8qaFMR2{FHk%mI=NB&on0EEZdV^D%eVIt%P4A$ z-%I3pr-k>FM!Zt2mLJ&OX?%P2xh>m14oIZqf+3+d&p_b2y_)&Jyl=jH-LTnZPOTS3 zD^Dxy(Stg4pK>i35g&Yta&=)wA@$EwaPAcEHr?6pU6~pS=RXU-W;PDmw55HWWD{~8 z7VEXMek|SkCjXm%vwi@Rt<>N!d(=Y*%3o7i&~Eiu$Q{v%MJKYVJm5peF=#O22X+j2 zo}k>oxTN+}@8WTw$tqc5aOj077X;_|#Bt|soFQIUBo!ZiPn*t@Eew0<`>tW3tbF~? zw*Hc2{*(qi)$RTRM`1M|>ENZ2;c;(UNTFN*gd~77r#l13S3EmwAn0v)HRWtQj_up@ zr(r+zmT&;x#F~34>I$_~536eZ7Lu zyGt3PZQpl(Ylxxjlx4FaRLOaE9@(Jle@HAzGG$s!OzPD?4M}%L7S9Y5&sb=lUH3I4 zus>1YTheL~`kDwP;1C(oBfC<%+H|&m%ivFC;XFa~*WNS=XbeD+pS4Rk#4ds%YB=&! z#?XCj9CsqcS)>V`I(`j?fW8MJR_G$qzsCdI7_ev3hF5i*c&Xwik-t>9`uvM$Q08>y zI)~rCda0v68tTqM&;wZYj^|%;frhhLL69Yf_r(oek1RRKe8mFkK+dsJhLoK-<5b@- z{o2EW0;JJvUTaOGPc@DD73ZhQa|H0!2fq7K@!vxgJ+!+gPjmpSZKW5WCt(`}rl>?| z2^?tHiiG^$lchZbIs?|1aV18kKG>{}g)ksEX#p&A;0z?%xgp8&fBESqFv+R|gCT|*wE82^)`@jau4*H)J6WihKE%cPTHN%y~jukfw@ z^s{kx4rd75_IAeeH9QIy&2;Y|s(?G4CC6jlEKF;&*FXVEB*-?u#7Vc^zm`dR@64L4^*1dO=7zeHlwx_^} zXHwu9DKK=rj(=4vR%9+@&$w-wOUkVx6cI`~->WApY@k-EOUxX}C6E%I}H*9+{yN z?ufh1fv}@Q27KmQ+KVL2i)~9r4=~UL$+$+JNFO8QibJNbYBOCJ0!D5cq0S^rV0l^_)5Wc-yI+h z08S6!c!hhEUMtKm)esQMkQEnsf`cj4Gm=0-qjV9(56IJ%(!D#C2+<_8H3#=*Chh5{ zls0_5&Oy=$-TYbmeh(Xt=xf@2tXsFlVimUqBEP_I(dj^r3Fsib9FwB5RN+g~;4#ui z4eJJ1PPI(=JHnd+Pd3N8}uFAzr%wb&NQ+4Y~L^(`*qbK3n zW(PFPkePv{9MDP(jHAS%cK)ljtZRB5E_EyY;f4`c#svHG`J{`7g-)8^ZFJxUXsBcE z1Ziw`^2pNt#$qXps3t=+rg0v3M*3X91049Www7-PJwNcu#XwQy4VG9IB5` zgA+9T()j>)zJ@@jcb^WH`S%Lhcei+oJEoUtM!r<@<>1hNRfClIFmlm7v+>iq=tae~ z8QEt{#PLB&o?}043r4buvx`}dH3Lppp1Z`ZTq0=xeeBu8wI6%o5~ZnikjlyLj#u1w zdG2no$VQix-?-1PT|!tx z66GBnRl{N>ph94D2$*m?%gBL8!`aaZ&!nT-nc3mo&;I7MOWU`lM$_l>2}Q!$E2W;^ zRJSF+BnZ0I2XEMSNu+1t6Mr3tzXGHEdkb%?#3Q;bCB8G*+KrXm3Fe-e*iZO~ElBvv zwa32g#tJPxzTAHrc7kBe5`20&vieNkBubh@7ZcJ2Ip!mv&_VD6U<^ESSwM5o!dWQM zVPMt^iIc|(fSSdE56pGGhrbl+L1ZbU3(WsplCij0BTjO-aU7lgl6mL<1dG|t{NnmK zIjmb-z=H3(>I(U4Nm;HnL=DowWY|Hy?C>e2x7f;i?r+7P0)Q1tsV0zb{emIV3*z#A zm;$GA0iCqaPm)KGhw!8FWt>F3Q;T_vQ;6Yx#r=j9l7Sx=CIuD)AXjG8z^itYY7|nD zU@8{a{t{j$`W}jm8#C|sW~zV5#bv~FR_tO{*B7PljvP$t`Oo|_cTM&toLL67!v~*m zd$e8?tM~lJk;M4@N6J7xGmhyZ^RX6pDIXfbnmKar>_1H6$L%j^^kaX;gWp!)_|jpV z0JL91M9FTmwn_BN z$V%~22PBhD>OC-5#9#r*f?PVi$FF}zKA9bi_m|Qsa1^m>R^!hCUrL}Dz})CUKLL(J zoJ(}84F);N_mB&pT^9_O@@fQqKSW5yKTFd8!10&U^Xl(_*N3XQ+?S5QLY?XFZSKv< z3M0ZMGwyVuv=Ezme2 z%_;j@I4wY*7exY57EqvgEsLvq4KMNY-M7x85|C-3sYt>BF!$v@^24_Mf$&e{;sTWMVDJI`9#Y@3Hb%BliB zvwQ%`6nGY79np=w{C9Azqw(&`U{_uFsbGd(DZFHu=1K7};EtD$gSQ6U61TMf?|EtC z(*a&So0070PtWuBxiHmu8+`xFMgAmU#fwpD!vCk*85UC50ci^YLO~Fi$LWF_%V!zC zt#CIx+@7uAqEfEY$bZU+w2#6=CARy9cpd?!w%rxW0(gDz|0^|jrO&?Ieq41~-I*=b7 z495{@rxFm0m7Twvyl4000Ca+caMuDaU76|rO`$8zR9S-myDb5eFQE;U-reF7|F+*B zXTe#e(VFZOIVKXhpn#fLc=O0BCY#nqB%S`@nU3{Xn!+Bkw_&Nm&Zy93u z8Eg0bstf@gdKiH&P~Vfk9>*ZE%Dc%T`aR+C_r|YCtJ{h6lF%GaMDNc=qmwq@d^RS^ zF@jTxu~`}X1$Fx0FZ%3&C>Tu#^t7!~4I=AkTR9}twyR&3^&kjg9D_COV+rs+;8*w|I+5w};M*CPyvMdZ zXvO15!ijJn)Y+)=f87cLIFBVcwK($R5F2P1F9& z&Om`&E@c|vBWa?ToR>ubR>A-$-r+1BI}V+y`t#C04JuNbT&1NCqJ}l($j#Ap%*TT{fUDh96`zTq50v77M0$^5iMKlCf8URzc)O3 z_V%>s;Sn275<)Q71hiGaEZ*R zi^iumc}sSZwC|n1f)x%xA%Rf?H4b`!Bwk1$R1!9I=i&>Gd`vM5$4cd1e;z5{kt*)9 zQ1-+l)#7}4{Y>kf-{&E69qT!NKsYqzdt8G&DVT|rd3|R??t{d1Niy%WQ!@8d&m+W2 z@b*T}HnT2NuQ8i?dhet}r%@M{pa)|<180G4m$2-MvBpYMPRnnB%mC?M(bJI;tdVxq z)?8e55f8Gk&sC(?N7Ete@7D*6cMSh~l4R69?`-G#Y{Sr~!QklCbXNl7RO{Pctv9|j zm-$xXU%l(d7;D+trF)WG{igZJFc%Lz@M@}^-482{vn^Z_au(-v@bZ8>2{wU9j@)|+ z5(?Oh)g|L8m*e2?+Au%b(=?O5E-6UC;^DV%{fPutwz4Eh0fnr(w(EX)3|fXzDN#Cr z5{d_RUl5xlVS)NHlUzm-IJGo&==3oMBsRV6cQM8y_tmmM=>VJ^3b7Dc*%-KojU4=J zEbv4t|EI+poIMm->WXfW5^uO*q$F|vrqs?`&{8Ht_&Lq_n?`@^LR%VSwC^?~bkHPy zhtrXSq2Fn~VE?f1Q{t~A-jY^JTAgAO<1F3YoWI_C(az!V6cIWZw<#Pu9UpjhpE!d| z*K71Hd3YoT#RC1lt&Y=hJr^yGGb??QAVgs#1Pj*z&{+-NuD z^kB3Fo5|-DE97`P7M1OFDn(CmdQZ=M1`WNQF?OF8u&T2Ws&P1-oC;zhMXsl!FJa=u1E{h(+f~v2^T&mJUQWowVA#K)B-mS~ zN+i;vMZX0-sFe+Spw384|Ml(_2L6!n|K`X~fhaflnVSld%AW06oj@0CyD@p{Y4$Xm zq+xuXqdIThKqNj4?$GM*-}ukxZ)bD(MzzPaV%#r?J0V`w4t7|`37fei9(K58$y^Dz zgEz%&rqw>--rT-t4hYqy|G|U}FnJURy(CXf2gcA8V;$p*2#b$eaUi^%R9|ray%`4_|;2m|RxSg6CQ;S7HZyPuOB)mY9K9c_Kh^s|24; zB3vnqG3pS|2VM;P7bj#6pE@8c_};~VP<#l8Yo7X3C=AKe3@iEV&KhiP_EAD8?)o|> z99VlXNzTtJ?=fn1)F^knvie>Rczk+j3L{_Ni#h^P4crR{?f1#^gI<0Q&IqlXr-MYR zGa-271^+)b{PPQ#u9{JzQacl*9ow`zoQz0Utuos_fbyyfKQ zlW#LEkd33G$9~`5ZXQS#1)l=A0c{2>9t9SWa|bH9ig1w>P96;OT@qd<^XptgI$o51 z%kP~O{y`V^QsW{xe6w{mGzekiG>&SmV@5kjUe^ zAZ$h0oK5JyEN~n}$c#;QGj7a2*<}nnnSLErAb&=u$^qCAcAF=2&-LLnPPqsg3=FDa?}TR8w+Tb9HV( zGb>pFi^uF27?LC~fFUWls2q0X)pSQ=n@7My)_KI8&f3qfktaKXHXpoIw)o7u#g-K2mD?bK(U8TZe>%LY-21_BJZHB)I z5F}KIZvm4B3Wj(Xm$!3g_iLs_Zszp!lv_d9paeE7iivtHNz7qZ`$U948pZ848TyJn2*qa$!7H)Gh*fT!lvG;##9hT_s z2VjMT1;3dS>?#f75I@Yt*jE^LJs8l{2-tD|SE=ZT_j}0zA=850{u&>}# zOI|5EdRb)z2nu{SD#al zP+b8%(L1lHxxAY7oX=xD2J&N^$z#!zF_%s}j;!W+q~htRZAeacJt|prdjrKEP91-% zeiT3~buOp1rCa=3NcNnS5M%B5*W?sx)|AP`a9r)?bX3)cM}-mB2Gh5IW9kg7P|Nb%{6e)mX4jZtAf6$@SYpSHYzt|z!} zGG}XjwG5Ajbc8%~z5Xa{(!){A+TY|p8$S-%q-_z?#K>;++P~B*0mgUu(Rh(IV^2^s z_`LO>^t0sDv+{?>U#orDz9+34;jEAmyllZ3K2bR}1AIITO;?O{T|=MW{-#XM9Fh@B-Hvg3iKBNSKPA7X?W||djBMi zj>T)U^;Ls;E9A|0K22Tw+h0K*_ny7~%{qdN)C1OOO7CjUUf8j_px8u{k>pnw!#^k6 z$Fw6V=&xqV%ll$8X)ii4=a96wIyaiLn!}lUGQwcNJMl(hkdOk4cmV~QIF0CuEBiXE zkB&p+q~#Uz$<99x4&Z>#bvp1m2NaL)K^;4Sl7?fi&@a-ixsPlt&Lz;37v4f==EU4O zRku$pA=w-gM-!1N=T^;)DBy+iKwRuzYxwV`=y3V3abkc71Vk63Eg=ik8*y)LAaM08 zng^ux=Y&_wBewIjJ38vni~3Rsi$oqzWlR<}?s;}Oqtd$;GzaZP#N}sCG^65a z9`>~vO6#bC_tcW>Nz@X0J*tzQ=*B7WLi;Jogc6ySxJNRqB35&M=NYL5Jy1t9dGkd%D(9iVC$!lDb1RjHsSd zMb9a-lLOwQaYdS4Xy#_AxWTE${Jj*G^5Ny&BOj?VKQg~v)_sz_1f^`*O02T*1E!s7 zIQkX7haL6FC}(!HV}=AV`|y;{k1DOvFY*Av>+*d;Ah+Xbc7Yk2shn%4K2Z*gBhXh| zo~*s`Hyrxxas4fU^ZZ_BA7^=wDug8Cv%?FRIUBjpajEPxA>R-Ek$FoFH4`Qa?x$#e*}A%;29?Yds9OEIR8b~FXjTC*Z>J7v7K;Z? z!k}m*9E6jAxmZg^@BqrTqxbY=+xi~2p=er^Uk$o42YwB6d7%v;2vq@PVseZ*La-gA1aym zQ#q=>W^|Ybnch;7)a3grrSwkKf14h`HD#?o|BBP>zFnw~xHXV>bOUOfEDFVQfkl@| zRdj*uS5+G#k1Qns!Z>`wfdjHch>nx7fQ=v$J>HoLd9tqgB!%ll7is?LE&TG|pPLXd zfFDsT|B;Em{yfLH!KmhYhU$OtGx~o#;N{SuAAxP3w^umD_N3&Y-#9;Ug}-FsVSvPd z?dAV;96`=32-JXAR4N{=9bijCShIA4gl`syWarmY9h6PCoW(Rh8>>YMLGJgN% z+`o=5o2u>+pFwBoCV-9!4+?wJQ6?O(oJarCItxN-ePNd_}xy9#7?^D2i$Y39bk z_#uFQKo5l{;>(oB7%8A0l8j?6F#xpAlq%a^{?Wl)dY-Ib0G}3cF) zd_a=fRzBRV2cmG}45-h1NWkQgl=!FISyHypUAAR(CGz-&u)f=M?1ZPn zZ>y|Rnk9#hb%32^)9h+u2!W9UAZ|UvrgEFryDZ;G0@f~HoZjMO+^FqnJJ=ezo-1?S zq*}{`PK=~>IJBk)+0A`TK0jVE_4z?)&y2BUkH>IOkH_=Wo;#uA$L$*S)Ju`~sCFLt zQ_)Hnn*2Dsy#@87zvp?~^l$olp{>(@p%t>x<0Ew|piwORw0NC;Ds2^aBT>(J038oR zusUnQZ+cz%40&W1;Ic&sxKpABh@5o}!1CPM5_r1-cS!my`8W$tA;p>iXG60l$>2kL zGya%?JI=}NLzbD}+jn8j-)?2Mv>)h?gI0({s22S`v}`IJ9Dp6^JhNK?*LF zG%2A68`#)Goo!k;*?&hntXZV~>UN_xbvQPZ*piz|uFkvkNJkK2o_7tMTq*x@q8V60 zi>AP&pjGiM+lS1Mlj3X%dJ8m$*mi1V;e0B7L_S+&qHrwk_l|arxUj28$&E_0TL2`>dL!IVlV{$3A*l^=wQgMaq9rLaQ(_k zD-u+5R9hp4bR91D{IvZc1MbM11oapmS<;#C>IwSDJjwqj=3)wwf5ED5ihvZF|EB~E z$_ST1d^iqDV#6e^Y^Ct^b>Z_ToIhQ>5j$*>o5jhrQ8QT2)`xL1BdD zBp@{?*@$W&7&AdVpQUAgGHYQaRY&aZFYh67b618KuPJCdpPI#8)7dod$_5H0! z-Tx^!rK2R*>M#&H__ygo)AiMb`gF5}#(BRUFDa%CnTAlWwfU}u^8kSjXaMPz*{330 zhPf9(CfY--boIX1IMm*Lk0lUxV&@psI~&g#q6NLkB#u;j7u(*GoJTrUhZ5kBdbW0+ zAWlC$xKr0LN5`KT@-#l~PHTisLQiNr?4tzTq7C7|6Xpt|*p660>(YQF8dhBds^Z^6 zJ5V^<9~fA_j8$<*6@`D-oZ88uZP$9O53r!>ogVu(FL3{ul_=n*=Jy7#*J0v%Sou9- zd5EX#nAww@Y@gWSk(O9a%Bg4%F16I+SKKG{BCkKQ3k)99sGJ8=$r^`Om~af(%`9KC z&v9Hjh2(cD)@ss`SE0~WCD7P~FbMO8TW(0U&}q1R)ZIP*_?ix-n&_Na+clv!gj9c4 z?71g(@m=%^ZZ;>^<&AiWApJRYHSGRxwwRA36WHMmcX>4)J$*yc8wTFb{X1{p4yZ8T z!S~h`VEJrciUgB>`oKFgq!|&35a7zpRhJt+i11jmqjF5}6JOUZ}ICJsGoNffv^ zL)9mPaH?1id|}Vwe@)bpMfRDzQJ?iH3E^fskg;<@lbg+}@!@{X76c^{AK%Dg=BwS0 zB@#4qXmc_(vwOZ~pC&g7o(0Tik2m9B9E~38KV4pHSuRJqu;=M7M#7!L- zu{@g1s=~xIFtanSkADc>kP~ezhc|AJG4ZkP%hR!j$YZav$GB@{pD;(*_eoTC^qCZTeYsA`V-V0Iih0TGQ|aW}w$MGz zW4Pt+#omyPr1Mo_Nqzv@thA)^KKJB{haT0|6y9qR`nm6SG}y&Eoy_j!j>3jC&~8wl z4_x>XRz~}Cw+LH3Abjv5nnKK9_iB7()eHcsI!3x$*6dM(F=6B+>W>YlW;a2()?34J z%>zRh8f9PhxIdxmaSbn$Yg&5VeMe*FmKW0~4DEwFP0m6iv?|ZC>f*Iv{YPv@f@vAg^AF_(+ z;kl9Y@eSTWXiAYcPz#8GLr!)Dxp2Bbi6MQ|wuw|+NlATXY|uB&h|~IL3LUanEpo#y zV589q6+0axD@WPc*qbt!wwVm7g zL@jz`BbyvjyK3c0>3wllS2WAE-WifE2}P>y;GhCdNU4dZ?!4}38;W(%vy{@FIfZvU zext(vS5rL%m$sgX?bv-mPJIA8nQkjuUcissrw4bXqJ^`rA0#u|3vDj% z>7JL&0ALMDc!zCLAZjd?ELJ;BTsza$AGx=+``(LRQ$zgbs2s*38`T9j&AFK>4D#T*g!s2vjB&L!&M zWwWT_!x!t?N3^e3V)ZjukK4>|lBjC~7ZBH?KF1soc-NCdqd%Jk9KG1^JA9#`OxB*2 z-!!qkLg5hnylJ@>{k5&81OFG`UFnLf#|yL8nM)ED)3-?EYM&yt;u-{)2#gCRoXWw0 z1X!3X73OSC7(m4kwwshX|3e1t%RmYLG2xY6E;5v%rFXMRMI^;0%0{n7)G9mf;V=kp zoMPZ+VL@JT-cnIKa1J z!FRE1h7TLG>7?RNsfc-Q)z0tNU9?{7CNUUMJztAO>V#AT=M?2-pD(RkNzrDgW@cZB zLal+}>^ej7b)-mVR+j7du2EaE<f=@MRuLGTD%I|hxX|Q!SfIfcJbMZvd@*RF48GwRY3p}>@MBs|bXk+7pskb29 zVq=CO@=sNA&0W1mOSO-ozY=`+Ekan$nwKt2-q8CTx;}T*cpNR=ft;+St!F|z zXO+@DkxllhK-F^Gb zr<=aHxjnwLfRktUeWD)$vXpyw0yNsSV3rU?Z)n7Qas->mz07Pa`3lA=A=4 zdj4ZYiNqZMJCBCsL>tEPoRSXSXDlVgJl97Xz17-w7|@RhE>Vsx6G`Q{5rXxD~tBTlIU}z6JbxOJ5@bf z^q4p;Wmo%WzdhLlZ7eJc$u-?fNJ;rVD1Rw)9`n?C@kpc_$`nOgVzko%(5U1&ntrw3t&aZ?Oh|lfbkK4ErZXRyPg;Rp)c5FhU zwBr#xFg-;2PG6@l#P9ez6jAW*qc#i<1Y~@q>-l|Y8zOdshK+4e09q6b5dhL7-=Q1%S_8ZU(K#wF z*Cbw{qY`p27=_sXC6(&8s;P-_*PAESzcv9A4n=cWRx*FGrz1R@OaZjT|EkO<-B z!bJ*bVOLEBSak8y&H{HUUDwJItaMq!YvDv*@XByVJNjkfBR=>4VN)WIg+X%y@byVRw%*47o;vH2g{z?5O){NW}%ad@*iU6yzn&3dD?4CTuF168LbR`W=EX?WIEIQl)O&RoBUNm431_=p#l%(@=wv{}Gg^};gP-mi5L4T5iknI!JbyIg<|gyg(TxmD;?dzfl@HmwgFDRG=e ziewV7j=w%Evj6l*b`1ZVAvEPCM-J<={Vv;ZORZ#Ayyp6c-?Zd2&GBV)HGvjR!zN_U zS0Cz{oz!EVM9Yw38y8Ke$wfJ*YQGOcQ-P2d3}YPNAq0$yfp;8@lXr@YI@Q*Ng6L*u zY{af>HbIY?dnDJ~Mt(QpI2%}|as7WJeRnk5|NHhk1F>V(CN`~IqpcN1DO!q8t=hXN zsz$BEp0%ndYSykjt46eDQF~KSwQBDb^2_&ma!$_4N&d|Hyk6IR-PiC)5>Y3rzfR^e zyQ170Js=M5Xh1Lh_L;Eq2EZ^ZUK^}ig5fT|jy#>aG@UXnzPB$2N{nVqH>Cw`Rd!pD z;FejkIW2RjkBxMRgMn9VcJKYK4T*4V5@6rW3x_z7`922ss*XyH&7XIwss}o}Kb~w) zPV(z;?A1ZHDPc3FPswGf=-{MXFkla_BmfuyP&5rO63hw1akh0#E8<4)oGxEgogcUb z)ei?<{}#PEKVd)Zg(S@Has0MdvM}M|PPgTZXLIiOB~qVo*K_BL=QA-q6)wp-kBj-# zK`5kS3%AF7|Mct&+b|tYj!2Cs)|O{S=}?V$mOBK*v%T^gvK{*C&7J(Vx3w@3w?-<9 zMs1UHJ0Gp3kmPt&3iEqT7^QYX3_SiHF0l^{4}Q^kQ(4+*`VU*kA$01p_r_mRVv*w! zLlni-s;$ZR`LjmrDFf4*>cM|Rhqr0{Yc;#~|BG2>G}JSZpLYHi_#F8epb<8GxD;g1 zxVEKOL^r^;O@(73qy!LJUf5I!9#~xn)7FLYH%^nJ@zM1Eq6EXXR{=SJtuUlc#N>ixKF>=x)@?qxI{#WVyO*PKXuU;h}fz*hcRvSrTS9 za<0~+{OjF~_ooN?O><(Y|ILZb@V4V7%E!G5LS0 z9?!m1N3jJ{Nba*IdtFyQB-TKf1gATSoo?6+4|wzQ&K5l0^qxisH*$G~Nxu`WzjS)< z5{_2TkCQ?2uaK*%A!4V<4HiXj5tVD-y8zE*6s{-=7 z0m25`IwHzNLAvOi7)5#12aQ+WoAmS5dHuHwT^e0XT<2w~KKS+3J}hG1%(-U}^BGmk zKz&_#jhijsSz#2dSCaRsxi-e&2jZ({ETnGU_VS%F(qJrza7qI=m&a+_Vmf9nD1tWA z7`k69PzX~6&u|jP^(Y{S97H$;9)kk*_q$JRO3_WbEhF(RxDbU}?49TL_X#A`PWaSX zMwRjFgi5Mi4zvAZbo*AZaGo=x*2drjVljBut-9QGw)WR4`+^O%d_cmX98^Q z`B5#f973BbQXCy)NDW0g611p<6n`z9nb=_^YoFikozv0vZalQ^;O0>W2-#7s3!R+$ zlIJ&(%8JGpfxV;(-&(c>=t)UcF6jgC8GAzX=lNbq|Co(a9Da~cSF^e`SH7hiP31+C zo#)VC#B?5j>IWfE+9(%P9Kpw=Jj)e~uij1A_EEZT&51uw45YXp1yfYKO!>R$dTM3X z5O~k4?Am^tfLD2TRs89-eZk$RPR_V1G^euN-KoR{B z4oAqe*dD%qG~?z^S#9C-_)PPMg(e{pHE5wRfew64+S;t4iVUS~Vb00#D+z_=sg$u# zuSD9ESz0tHo@)AplPvnpSMIiL^RX+X5#r=Dv};JNC>wYD#O{zEetGpWS|sfYLHlx6 zoGD5uxPe0|8fK+Z-pPD_rJSWgECuqY5*vZMF;GT;DMmcm`7mC;4vrI%guq%b{Gl$m z{!S?L9=|q0e-=uxPK+1Dy#~XqzV|)s-e$i3Qev6@Zjf^q%c-B@q^1W)E18VR_nm2# zjQA@CzUf$9qikZA<7`^JTw2}w{b^XK)ZHfJ-SZLy@ese@;8X=$v|X{lOw0Z0IXCa1 z$sl|PP|=JZmJ_2p=Ryx~gMHTqPGt!IJrjnlf}^(sp!<=%gz|v>10KftDm%`fL5~RG z=GecdVl(7kX)`gn0paUQF{7=$$5aFQ-+cDE8s~ijreIlGfI_vX*_ZN^hmY1Q{WnIh zb|xX;cDfaY=UoE#6lh!Sof}7FW{u7JA9;mC|9U|-GJlY;qf&39fsD@EnUWq~6s{(& zdu~z&{!(!I;}rcjR~=OQx`%ktgS|k2-;yorx{}Q1!Sc1&r)iZ%q;MEZBA7L5L{^-y zFyYB<<~{vzLSoTA9Ek{qlLd%^aLa^EUoW*PSOkVJC(3FdB;c-GP+ux6#9lv#?qB7w ze_*F0b>FGJeqM&9cH65_YHQTzSmwBLf7@^!pc#GrdXVYL@~_~PS*PO_?>EfNJ?`mf zY(nVWonbP!4aXx12$9P*6VS(^Bv-L1p?^UDt^5}T2&?RDyZ?hmK37@HJD^wzk^`ACQGA7gz2Y*(UMAiK9O#xY<_p}gIIw~XL55Y6s;Y3F# zDm?1I`C}^L1Zu1b36knRIZ;q>6r~ra?m^GW_~(K?f;Ayy5qo{}t2Jn_M@O*sg3SMvb7oal|MT?W zOXYt2m(DX#J!@}}Xq zM_ByEa_lxEK^@q-_t0Pew&h-i*j#FItgFVBm`S-?;A~4nTPG;QhZ^hl7~Jk+1l1Ln zoX=jmj$?;+Djc8xknuc~(t5mQWA@GGO#&I|o4rv&id5c50`1Wiia&w@iNvfA1c#`0 zP@Ngig=;3-g=8!@5T?(Yy37L(oVGrV^pm3Z3(W{U+F-6OItW>?Zp1Xju#TYntletBSrb1{dYB9^XasBeYe44 z%5YwXuL33GofRncy8gP|GUZxGUsYUw`es8_{QD6Ubs`_Ef#mwpLCv^-w{AN}4~!S? zYeH!<;ON2=KRDxyIxcuWauAjN{<@(eKq#l0VEFuKwWrpH=;my$c+PZ(o_~Xbn(l!> zG%TO;Swa+ahH9r87Mu}cXe;*SnIqz%CEp(#C&n;P+Pr+z z=0EMW&1ZXm-g#s1x5n<&)cI&-cUKd})lA|;cu`A4DQkc`xuJy5;Kw7bJFnIirmuf5 zo#3APp6_6a6h8g>T6u=^ut>o1!kd-0ZYmqH8<^hdWIqUlkPL`By1UWeTICjT{g6@3 zn{(HmoS2Khi+txh>&kY z>+pT%+MlEu9=p;m@9Yq(t7l}a8CEC`If^BFzMmZ`8$RZC24KRr>3SSY<-$vq_WJhr zg|&Y*eiUWBfs**&DTqDDBs`~!U!T7hQ!EV)an-jOLSA3%k@fxStaXecAJ@_=zXdx! z>n_g0Jy#0?p|cUZ@M-|Vba@v*8W(}5m9Zqiei#5(XbXZ(O0_@VsVLAqynoRekdXQ! zwro}IBiT#Rct&XFbY$$o)eh@{ZKu?Wt;tW(xe$(~SCRjC`N63q!%pXnGzY##NO-KF zHpD``2M(4v=YK%l!2`P);RfMn$Bc$`QzfrdT2n|!efd5`ybAWkOkHz1qojAzd(xyS zs$|o;wTZxz$w=|OpK9K(A;mw-Mo|7eLDO@* zV~YWI_!UB`?I)>m;$=eh{X321d?HJLTA$RE` zrTzTBZU-&rX;6&VzTdo(U|aH5e$GmHe#eiraFlb@Dux=A%Wv@jVyB7~c-c}7#`NT1 zX$Q~+14`eEtWdFiYf3-df)41Uil23Lwb1DT*xl`88GvmY{%0>CkmNMq*MTPg54V+= z^I^?zA8V~W)$sxSh+2|h$dDLa-0{zMNv)ahvdbMR zY(-C*qbDZ1jauG_UY_k$(xU74t%F?OP=W$QtDO3MGEnB@{FF|+9i2+}OHMf3-^lZ3 z!BonjeNOyMRoNsX;0S9a0(eeie^UZZlS?GPU8o`yknG=>Wlv?%CT)Or-c6+&{`KJx zgYy3Bsj$3>I76DhPwx&@GHebjq`aT6CTXtWgoL*yj-kbUnVF*vN1vT*-ntzf%?C3v znv&4|&iQwlhep41TAQfqBjRN`8OPWlI3!XV@Ua_)Xg(Kh;pYZy{~Zuz;Muf5(kJQ3 zL{D^XGcoBW*ommTg_jP7Bis*EqhlG#76X&^IK%3zb%mp2J1Ib*C-NU8P`DChrlF~z zFWOZ9rr#kpqDMphtm%i8;*dLYur@u%b?h7=d zih_d2{y4)l?h}4dMQFZaD31q&?W|)j3QyenXTfgEP8}tp1aH!v3V} z^sYCyc*SIieqm>UG-2MStM0G2?`$olc@OU&E$JWPELBFa9b^gL)1HlLLp(G)Vrk&w zq;LRb$$cKLdmc#s*5Ko6@SrM1%)<|vN*v?c|3NzgnV;H%n{BpYO(&#(Gs0hZ!Nhd@wJ(Gb^0`Nhs<-f=aM(_JjV#*y=>g+gV}zwUqnvj5E@MZDfY&Kp zDuE)jNDcM8`WrB4@p7wxI5^!xD{d*o!+cPzuz%BrL_DXWqh3$oX&v<5i}-ifL z0Hs4j;M-hA|4?;Oz!$!?l*wQ_dDLlK^h}M2g=Qph`{9BBw41U<|?P5TSPgoGvgy z0^%ERZWz;X&$R2Tu<`ZQza*h5h)^oNd?=L7IUhf5_qN3N8_*O%iP?GeX+H|#o4o+C z;NxG>Vlhb-@@MWJLvU*bWACKG#?*6Fnfe|?=-m>efi88kI1HPW?ANP;5sc!5TmLtY`X{KWb$}VM1}Q?M<1^s7C8o~&r`+-{ zr-D7~=_iE{N@M55)UU*a41A6s=*t1b5?3H8>1gex4*buL>(RUY><-g`KcScn3*m#M zGN_;w$Z{(Zl>2DV?Ka5vId;c|2b5)WLT5{H>EDc-PuS<|zzMZ3I=UP4Ak|Pbbm(%P zsVcMR$vceYCy+_~&@iO0JN%YtR>Cq*#P^{eAFGa5s~%!>CnbPy9lKVfE*MN!cYJoN1I>IJ`8F7@bbDF z2PSo18FDkgFm$QLpvz$!qzS zw14*HBMOyO*|b89LJ(9IdbI(w(}z;lw!-bJTh>8BG=I<8x%NqnFXd%G9q)^8UGqHK zVhJmjy0igf^F*|u|M&;O%Y{Lr5~MG%U*!`&XRBeKRlFYbcT2tdo;gyRNHVL>bM{0d zTXkW3g-~v36KDia?di4lo9B(w*$jyey|Uuw5)VKh-;5taY{!3bFd=|yUJwZV_F6&*BnbwVT2?YG zg>R7F<}D9&T7vAVq}%7PlnE*IVZ3i$OK41rGS?+F|om`p81yu z-Mxl>93k8@`*zTh&CP;<;puY!SG@@~vCgBh7ZbLky%qgGJSrU2`s9sQ>P2Z%;I$-@YUH&s?j~0oQ5=*-eBL&Ther>psn^vG(HaS9Fq7_iC zB!VXszuBJFO)N;a_;rE<{yQ@@d6gv7ri%J_OvlLlCH0s^zMlG)@TX8UgN|UKnXkn# zb)D_rK8euL7yypeNY>q=3cEDrU^-MQhsoMLIcFMB!*CSd z8$5F;1DKEPPXXfDTY{6ERHyKD7$exoJEb`YWE`xMh{K@t}Tak@r=&Sm*lFELjuh|Tb#vsa|?zO-9Pd!-{MV~-p-H>i;QK*Q~ufV zrXRbeJaqZNNU8MSr;r@kbEcpm^Zk>PkS9k)FC9mqK!!eZ_MXi5P>hn@@O*OY+nnGf(>lc`20_=xr_SnXMQtcE1znyl&ouL@Jf3(Yper&B8BPqI0o7~~8C~IC;{gHzcf(KSR z_?7eY;G6e1lKh#w0P8iRMn;fnfQLt-$&OsxF)gmfh3nCX%S%^~5UCMI)a;2Z!VDa> z$w#E2Rh5UZpFXho#dkB%;6<8it;E;!-$11CpjgjzOrgnLW3PX6#E)J7NF=WQysZC_ z-r>lfJYSEb)dDVBpVHOfs09DfVCZpTpld^K?+$YvKzYzE1ezd0-@XILGZc_P zKgU;*047U!+mAs}+G~tag1Ikbk0)M#$(tB%t>x4aHORf35S`eb|A`mh(v|a(zqVQuTv4d-AH8(RbrxO)8kEwU5>o;Ff*0+zK-16M8 zq$Fj>;k~UPC3Q&=HS8X5&Vv=_qm(qrE#Rz+m38$0sp`s&} zN8adYfU3>wkHV~c*Wx&Xt6Y8OzvIag1oSi|&63U3-XX*2^PdiF+WgLj18Lar5Okpq zGRIT}Ng=52)SwmP$(0b1zk#H2ZWnju^1@L6qWI;fH34X`k{Ch;IU$ z>cNH7n20@(YFF**FE+J(Dx13^Gj+~)y?6R-N~<4sY83(?I4a@|+08#gCBuY!tVec$0*JmA+hy^4dK8;o%GD_g zFKJUwG}3l^F8v-eUJe~$NJXUGIWV|{#k=;F$B5vlQzJ4y)Ony(IpsHgXP4$uX7dW< z%jEG*#P`vVzI^h%N*cz?9M)5<8l`v1&;2MEsR@<9qk5Y1llOCKD)u8cQqS4*4hnU6 zv%f-@Nr$eZ)=&to?0KdHp(O;oQfr-y%j2UY($eLfck+W@wSNS;+zI8R;ZFv#TC2w= zW1}%7U)yhHkZ@s2(w@O6@i?ou;#n2v;w-3<-0Y3T;=3&edlPj6ra?u(V=$rjM)1d0 zo>JYx>fFZhdn;u0jmOJwOXGX>g)Rz=zM|e*8f{PrtD^@Vp0e61>(@LQt zrl`^@1xH_MCo>@llu<5c2ouUq&C*AQvH6)qg|&odzsvSa6Su@S^u_j zOpy!(xfKYAYf*@jb`C5)9?FY~r3!9}gb*m>s_bnoi;hRGbVYIpZ$!kB!&M7c)6T`d z3HG09B*OtI>#Q_VWl4uz-!1->9U)ynaGvKjCf@Ze855Xvz9@BBrdg-S4A01)N zxeio7F#(fMd-_!00s+l;9+n=jk^3I>DFm4s_K>cVb&X#?gmlxndC>igMQ;{|BsCfWV? z)m-A<5EcGKl_&XV-?DK-o|^nH^7ph3Ixp`)28fG{_zrHH^usTAazs(Q!Jv5^QU-6J zlk+#s!?x_eTX+=Q*Z5dARRBy0!@+@7}5 z>qFvkguH>NH557Ud`ynUSOsbApV%RwjKv&@rFam{45SUJyzz~aECG;OHzKcP3vK>= zuKDL9vKkkE%>pEYU$AAC&RCeYOaho)aLUf@uEy^#c=@}kRmCyfkC8tqA1ig-oG6v7 z6aBp(Ne#i6{rK{;HEsn(MnI!q?4E-6?&7IINM&Sv7&;`FkJ7+QxcB|tTFp_Jh2Loj z-@?m1tWE`ASW*U7`7_FI&XG#H&gJq;kcv628A|3L7J$yQU?>u91?PrG*%JsW)vgsE zVb1p0)YoW)CGCi~?)qrhLnf;~j6(+SkY1NnPD#oIMz~;&cH$vY4>UZf@;EG5KIL-} zI~|8QJJ@4F2p*Y*n|$tQN0mLZvk}g1=w?etyww^|eGdWX&$1-MB=o>DzMBiUgF_p7P@OH;c#IR9h5AlC+&rgH1-UUU*Py-&le4KkJETXsDA z)jU~nhr|0-z5$5i0t~4S#1=+DvEFn-pe;)sir^Y z={(3uVIzW~qMml`5daCqdVh?Eev<0Ow~yXE;gMk=(NKVUY(JKNxN7`-I-R&um(lgw zJ@tVdE1IrVQ4`H(|FL>07*TzOd8$tB;`LfRK9)qr*VjtON?cA5Zo~aUqBfA0xTu7yN1TvxVmS;)0}4WP zP#}pb2-hmiycU~_q~`5ywi;JFtaBtXHb zAvJil-w)tqb_TiNNGly~plbT4;9ZcC`uK1VDWmBoWmD6evagul#mOkV0XM##N1d|! zUeBhGzJTRiTz~olPsyTjThG+N&ioIt)h;J`U!IzUrzkE?>gHw^s_15#KO&y^y87D` zsP3CPFN0#A`SkQ#XZsl-dC%TeVBY1)fl^&=w*>SDqynx6o0c4h1woB|>K zc-DxlC(cPvhBB4t*jwr&V<1)Njo{=Jn~j3!9lV$2LAuZCX}8wnG3oIh=_CBN z?mTGhl4;BmI8O+StXQ{UDQYxhmDhRN<4M?c(9!NoKDs30KDd34)}luEJO*)oI|Y## z|D*bzv;$TSyduJ+!Gb-Yex0-0+0^ObyTcItvKNrIFUKb$nso}68V(FwhK^V#82-^} zMUuDr#P^QNbF5z_9A2x#LLtI*KiOJI!8-K!{kangA4aGHsaHhSej0!>Jf`#U!G=~H z^~P_G#d*FwPOT97@44gy5se}?BS|71#ON-S$3U%9)XTP66AfoE`)TJ{r=wU~5{ubJ zQwVZU%-*mN!iOk@082d5<-Ej6+sCXusw0iz)Li=#R23Ht9Jj6&UK*3hi(Lw3m#Qf{ z`Drod0*P(_(&WaZ;TA@{#J&wLc;?XDv?C#8vMc{8M3Azqzvtc3vgL?QFH|;m&-B>Rfd31bA$VF zDE3KiieJLgwtE=<05eVEw>gSGVWGnOV_1U0aue{?3^i>!H@VDim|fzd1UUn(c0sXS z$0y7dS`aMhJ27}k3qK&(JESk?ZtW)XdVJk-qWYKPq9p9ooT`n>(o-WjCnoP-*-=|} z)|UHQH+`j=#gs=lbmp46$4_1Ng&#-ItW26fEy5qIWabJ6Fmxp&qTsooUz|VUgQUW= zDLWEMsG%YUX13rUF&;|LsPFErhfL7?pQ-(5;*NnggxPcYZAIg=v@!H17QFYV_?L_T zMF}0W%gWy(gb)h;G)U0qqwe>up{MPA?nm7$Iw;|NDok@CoFba47b{aCo{DB2v>ge> z3q7b$D(yJzbCXArcxdDwbmPXj1g}9XfVJP`vif7!viE3!Z~!BbgB3%f>PbjsE@J(# zrM2knnz8?_V-)oqzpqsfX1FGBSD<8M#lnmkc4@E%;s`48tN%{ z+O-|StBmj{5mF=)&J|b;%8VB+g)-FB!1;`SOkzC73@%UmM)JV;gRxR0yGJFR_%I8CvmH=PUv% z{hjmY84>|v1Hlr~!r&FB<6xIr0+a9*x$+p}-A`J!@{|_MMg-<&K7Bu@&$~w0Qlvq- zgVAxy&X4biMKF5CF0U@I0EZl(nEsj@Ra0w0Q1x*Koz=gFk`$LMYJB>YR{r%^{5eR? zDX`yK(nE!s@CTcuLK=vaevFIYAqld0rnA?064Bbpr3X6>>2nuuBV%Vd*ex9Ed9#fD zgb!NDG>DU0J!1(#--ZZRbSS<&`WDmmH|35pBH44DTD-O4Mh{4racZ5@46s}>FIz}H zdyGQ27R3$R`qs~wL-Vtf=|PE@?TR5YZOU}l_7hfGDl#%~m~789t%gQ#o}wWF>oY}- zzA_P@02VG30b63rPn%V36=hpeEsrIG)jwKP5&^B15VU05*Ao;3{n9Rg9O(MX4-3#q z2L1sUrKQ!tIQ%z{8_aW;Vbf?Kx=Wt>Lg0$`HV7>rk<7cG%rQnw{I2%G{pWF40-Eky z8eFgT=EClLE%ykV)m~th0M0JGx_Q3mmeFa2$@Ke~F;7G-0>D0h3O?bswwdIG%Xxq)NFr zewBSX+yCX^EZcwH+NXx>;Uut->sG_ZD`|6Ytq5&IF`ojeXS*4lDuayHn9-$*K}5LCMYemX!na+Va(KTp4RuK?+#T5oEHnG-?+_m9Ot;d zT&(i2`k}Nu7JPNsr*C*~~Sn%p>mVOEr{)BEJY9hwGca}QN$t|8X*3+Go?b`1B zoxCtUwl}^Pm~(tJG2HCOlpwm>dqOAY-pb8s?CfCW-tiPS%n|bR)4b(jmz7b2%Y#N2 zL4!Bp_~w{_m5UCt3kdK#Uw9V8hVc! zD-I-+5K&rPY0rddjKBfx+CS>#&!5vOTME-Xj7!#LySyE?3bD%l2@M8uA&>-Y-szJ} zcK(}@BhUBeAvWn#$K0dqTSKT1YiVzxj4o}YV6m*)gYTpdvCsj)=7^4y4Z(KXwXItH zgvK{d^_G;^>7#f$y5IuY)aG-`mSWBxVyGqT$>LoZHihIrBf-*clKKw^W*oaz!?`ln z+-R6z0cd1Yk(1rIa8^WW?_-t1AbVy6nPG(-2-$zFkzr9xWTqJP_r+2y)+dZei+TBp zxbJ}+EW}-w_mNz_zm_S*)(n%rzf{j)c8-;DhfYoIoQ%j;o^HF2c9s9`Q1a4pYOBlfZf3~S#RryS69;{K(8j-RdIe-& zB8rq^p8^iqX^+%iFK&2dEWKX*%taS23L-2zJc9v{t_oln-fqPvd4qfBD^b_NZQnKh`P1+xK^# zv^j5$e3SsiOiM>m=Z9IROE<6@6xa%aKvQkuFH=Zah?9vw+a~5ck{0=x>$`JjJU(<^ z^%2~NyF`GN6g0<%NXGrwg+Yge+lwNYk!} z8GR~8hShLgPLi7!hR}-^u8}n2;@JOLVOG88=W55fWU#M<)Q!G0f6I5W)+?V zNQ?}6(Bu{=^7VeYd{CUG)uGwgVeG8efZJ2hVO^oNpzvIr1l^;&LW+aae=*7IYA?UZ zvhOu47xv=cEx+@BX+tX{00p4krli=9_d)3#zeYcyQICPBuIj0ts=dIy_cvJ=NB^Z! zFaMq;dvVVwjQwr7xR*tG~W+oYM5(28r z4<~;lGpX+yNWbMfbj$1sFIf;PF&RvlF@;y6T3Z*R`y;lssGZ6o27BPMEG%)}zFt;^ zfG3cKTs5{gyROHUyBvr~(DX%=I&8OkBv;@iSn%S(2*f=kU@-SKKjh5kpgD9+%=_^B zbN-Mg@f=25f1?X471Nj3-bo14ToRMyYiTphnPhLJo#68e9@6}LuK2>bRW&f<-gAnf zg8IKSdRIqY1r+=06qI86kzVChPsG%dZgZuxeGY)bq8@_VXtarlbZ@fhx!~Afgp%yQ zS4J>orp&amdpo}+HQPSTx$c4zX#SpA7>vXQ0waVkw*05~@me5c6K-_b%H=}V`d8d0 z0U4WLyGV4z-w?zC>z9IOe;xP)8ZoteZ2Je zUIfqu(;El;EpSM9TJSWilUx&lAVm&Zc&637XoNWoy>bl_an?5}|94x9 z+ur*NIn}8po&)^a!Q#DV*$E4jM-pG$h0f#U_LiX}p=% zdG*6?3cpT$3;RZmDt>RUD`}_no-ty5$% zU1^eog6wfLhiKaFu>E)Pned)N1aEdJB8Knbz3i4gMc9onb*slGAaQ5Z;4Nkh`7?Ay zs%<-r7crwFxXpt&)sqZsj(m(P1j|vo@bgN#C{#ySrmHh)AMba-c!J97rf6bJv_Uopdv=F!MLu#|h zkp=pBJ4hbZQXDbc%WCC!q?-e|(j_Q2TZal+05Kmbbg)1Hd;mT}&q2V1!`S8VIhm4M zQoBGzL(ui8U65Ge@X+40A0zO$A(HWQWp0%HUi}?b=TvRw1X0qLy_sC0m)1A+2Yp7e zj8~eH%y_38I+qJ-hSCjGB{#Lenag*s#v78R!WAS_B+qO5)d7S?qv+=GAl?q{d35@*5h~sgs8$0h1f%=Zcbpyi(t6JFW{JSWQmWQBmjGhDWwiTSd{b8yJmRQi_IK*blji;AW$32XM=q+U&%;PedZ2n%rX0hj_3+WXrhGVOGwvpZ1pwdmNMG|GXXI`e$H^ZR3)l$XR$GFi*16lKRHeipO2rXHgn zyq#yUc2-JQ~ejqS!(?eCO!EW$S^wnIbuL59Rj)MYCt)g%I;< zdEd!eY4cwGKmXavoBwxXGM~?gL^5=H~Py3RDklv~fW)|45GFq(M zJgHM?0Xdfi-7enhaLbvAK?o}>#tzy^;h+=eeuT7W6kdFIJ<27MvZ{QKR?wJNia!H^ zptm(X=o4r8q`pX!OGl6zY4tP^fnQ7I4BS2V_tkeGP$W>Nqw+saLU8+ZMF%sG{Ynqq zDg>#Q0{%Ki1gAFib*C3Wd*dB zL(g>qqs)1ewW~8RgFnA7+PspTDMNffn1#!M6Puu=o%eS4nmXX7b!pbe)s>F#yUv&D z?iT5AL^cfATai5R%SJc*xsd!~7ykb7=a4X?%yQo@1%K#?pxBF8O(HZU6iNJar>`^o zP^7t~DoO>KafuI{=y*phoJ>s zWgum?#VYMH`1c)NgbW>wl{AdOdpCUt8{<*=ifMZ#eD}+loGMX)Gy`Y1DqQVI{iiCY zO-N!27z}vg4C$hTC0XZ%?OZ}0eSTMIcike>@pbk8{f`6~B>#e)uxZ_8nn<$9w8*^Z zAO>E$M5rA(lonrIem=(T@gNt+BM3HYVmaMkr7ZfZr zX$^Qrsg7s!S|m9#?TVV^VrywF7L|O3AL!T1dm|_T`7u9Mpo|*(OF~{6gv@ML1U9A? zOzhupO)Uybw8-EWJsFxk8(*+X!~QBfAd0HLr~v79JD1|!*yf|(uVyB-`>|Y}xP&)8 z_F$4KkzE_k4m&jCMUzrW;@u-(iS@1)QO;ALDtcpEg zlm>Zl>3kRe7DzmEo;9Vw69al@v9oqV5z5#8hd$Qn7D4e17ix33WZ-Y0Bxiwh@#)5F z16``9F zF#GmGMD=oXpx5Cbd5v*pU{s#Mu?t_|`#O_Y_8p!;`^GsEqhB2iU2*~ce3Y4~=g$4Q}DMl?7C7g-E}XJQXGuz`dU(?%NZl>wF(2ihw2FK#PbTu1GJ51(LrO(UBly zGw-jr2`c)j06)vJRZyXRVKWfa-?KtVAQe|yeZs2Pb5HBKt851>Ivd|dlyg$f@?pqbze6VLh({$sQEO?>f?+oTY2h+Iz@(r?@6I4? zP~0{558NZysx8#l)L%*xEgDVdmnIO5iJnU4`pwp|QeFK)!$pG>Fi6lbtfHsR-r+@O zrwf77tL{EYE{z+PL!accsG8O6SF1}zXi%V^wM`E({o1;v^Qiro$7bOmh+l#8biCty zBLgly%63sHDFUev&Nb!%1?TZo@?Da{ZOzdsV2k~;&F~9tUczq8mV+3l45F*o&UBgs;XH+a z%BsL$K*I0+m!$LFq0Fztdf;WsT7@`J?Nt%-y?@LlYpF@C^Wi1Ms~jPHl>LQVe~wB} zrM9JHCcfKsK>uBn?-OzPj)(9Uvk7x`b|nh!?8Bs={Kl(`a+ndO1m^D+;J0XFq$pWGP{4$Pw+_8 zUEtXWwuW@AkW1bkX@Ov$ffl+E@o$R%Jd+6Oc4i>oE_Ti4;QLpmnJUJjUl}0*Q@a=8 zZ~x`-kvPaT>~_rJ2txP>bjkfC9@d7fB^Upz%tX`en1G@0q|Fn{hCB00y5lfZlY z6+GjmG_Xi>V4%uf)8u{M; zb`r4#OJ?_vh-OP3aRkgaFsnytFx4DUJ={rBC`{vBM=@iw5<&aWnl-`Hh{dJWOZmCJ zKoQts@b#M?MvT-H$H$Kt|F5I7aA>;y`tWySz`y~M?oOqo8GJI1@;3xC44`#$$MpX)kxu3Qh2Pl*n?(2@?N6p-n}t;#Tutlw+1 zPjnZd+0w&DeKtqd=urE@{Pk^{P^*$&!2eK%43LS?Lm)N)qhJXkHypGN;HusorWEvp zz8>^4Jw5*d{emNJcBj3Uu<4_+-7#GyN-1pl(~+;8kf}{ZCc|*5p<~X> z0P0{#p-F}2;`&-sS9-}}nrggWKdN-=5c>G@7n4>HhHHiheNwz`$2;C6Uh>1eSjS}} z8^xsh!V~k^TgA#+0!ur(&O-Q(b@VniAp`{p<{9R>&6{-+YOB3jnc36Ncxo7$8qS}{ntsYK%CA%U zv@1^uJ~dhb?-QHEJ`#)^b-kb7#rCw|JB*Y6emSn>NEBfzFm<19o{%nvjeTXYcE9#Z zWKcJ-iIWVQ{9%y%PUSbLsqa>&7(l&P_p;~F?Q6zO*22_is&u;=y%jo@#$gLkS70E5 z5t}dBSX69}RgJWcq=U)sY1$ezf@bdT0(~mUE9xxst%kviIlQoXU(b#Q&tE5%mQN(2 zBYO+R*qTtE)6`60=FfIE*F!GB;Adh;6)p-^dMJ!H{M^Dp?Cv@$ zHtbhmBZLzhD&iQccLmWr!5BP#WU$;YacyG^D%Iw=v)Ia1%!|pXCqbZ99ILo+`O9?M z{wJY~`SY`VJ7o~xrgzu8;K!X8;`|u$`a(<&4|;#4nQT`Jwu@8R%P;DIRSx~fAJQ0r zSt9yu#N)C0Ez}~^Eay-<`irGv;BND5T7eh`R)}gJ(rb-Q2pAb+P_lYhDK~!}O(_U} zvK=k!*(*W)b2ij10@vBfNh&tgA~(}&Wgw+p#9yk;l2ZeSca{0~xO-|~V4>L%P$u_a zaO2y*q8_4{VGLTm#F6;keSM)^;bWp5lb8U9VDVHu#Y(+e>zU(gk!r#)PI2fR%&hem z@gj62*o)E6T3B=ZnbJT;6?K=8;7v?j3~2l$j%5Rd|B!Df&&$5yqtR8qVA9y)d&wN{ z-7#ai(*5iTSoAvW;KKfJx=8gs!*|tQOE}YZFEVK=p?E}Oafsxuv~}3f-tJBALztM{B@wcj<(@_d(Wq(ObPdWjnrL7u&&Yp0Zm*6=v^oZ}GLF5w7#F{Z zz-BbX))ZXx!5y;2LD+duLtjFEfYFa15@kk{?$nfrba~hEi=haX5KO3<-;$Gw(k(8O zpzZto^Uwi$z)P2LvC@*S(xoqK>rmv)I$c5R*hWMN#*~!N&v(cP6SBe3|2#+7>pXh2 zeZ4H;gwL;lzQ2 zjJ3Eh4P{H=vB-y^hfy42wRTZLzX%g@l74M5`JErEm7-6)zDEK~MB1zK&zf89x?h^N zpGVK5R5{AWj?Ip%@9KZV)>q%*?tN{s;_^4{-QN_4fD<7b&BH~A`$c^=&+77($l>&; z4_EbyQP(E!>bucjh!jnB^Eqa}H7BopjY<-@TuW3Xc_{k3(&SkF8UO z#2Y_t{1t{K5Gf*)PhS}&T}in->GW4b$G5L~EwOnFD$hD8z-tf{3}uKSG2FlfVO7Bl z{quqLzDD=$rucv~v38ms zW0sdru4cfFY<#g5Eb$ z!YTKOYDm_Ug3Xpv`QdK?c>&ouscfuqbbZY6F~Kbc_CtS=-vob-HJW4lz4JXPNyz``yt4WSDuFhz~sh_Mnj2 z(TG5@gMM5q3zf6Q6)W}g;SQHQ$o}y274ca7Qan7?kI?}b=`HnIG2X}h3 zXUoG)BTWIYH@jbH!dLXPDqVYd^WoI(U1XzfP=pQ?K;c_xCUaWkYx6hRMW;*=0<{nX zL-ypk)nE3m_T49AR>I{sl=>*Wpg(Ugo;g`?@IyoP?66PHCyb^t=fdXA7fv>_{ru8v z360fgqf!l<@`Q?6vcr0Fg?I@^Az)DSDJn1YC3!X+OT9Jt?SB-}dOs8_KnPKiw4|VK z5i<1TGkl^04aWO4;eFXJ8}|3&_G2{}`V=M@8BYO z3iQd=GZe-M4Qxy>G83ziI)371Dpc|ec!t2l^-a5+Dr&YH2eO60LARApz0sCR(4QwzB+ZS-u8i`rh(Dt>7z0Gl;d~- z5zO#c6_>9>v$N*Eq^c^e5L>J^v$&n0S!nO2A2ddxJwFFt{b2e2(RSlm4*Z=D_WG_k zIy%Y^gVB@wW8>l`w-~JtA8mL^(!(6Z2NJhwMMeqNqKCNXiDMTU*5LXme{?A{U@lsr z;;>Yiw41AOK|;<1-JSaQk#y}v=K#i%q(s8beuz>aL4N@fCD7hp|J-lmL!f#AhDHz) zj8V|@y%ZC2ST5le6v40W|4lzV%XNMKBK^@9h~MnkOGsjhc?fbP1~l-&z;oNP!MA;Z zqTg7=?_NLQ*7qH}npJvLX;+M*_QZcPUe?$h*z4!u7X>>L*2poew!$e^rHtLx>NUCe zal_6%(D7UF$x})Sh>n-y?AfR$HlpdVKc%3?@&Dt}0`1J87rilOmI5fxOp&y>Ka#ey z+BL+Yjc%1v{*0s*l(C{JSf;&;ZE5^Y^xEagwWC|6SJQt*G!oHJ2D)BDU*qA((m#G* zAp!Uom`Prm)+z3yLe-=L3x1wMQ4nYVXL3!ok>dFVy;c4^Jv;CFS32Xp~ zKt=#Ev1n}VotBrH%@ddfmt5x+%V4q-fqmbR=hm7u|MVKcne|%6c-OH<+~M^z24zV{ zPS$cO!je-K7<0vgn3`6!cAjhIV{l4Vpv`z@X1a-~cub zkREJcx*w?-Y(l2hQMVO~u603kZ)mFOzA%vrc=bYjh0i@MWc1Yu!q-f*zd;crw<0#*wIu-}xF7pP?$J~(6!_xk70#)>$iGTyJi0SvLyw9s`DGfqEs zp#GdTI&;ka*+6*P$8C;gM-s4^?*@?bwJHg1rWBe@b@FCWyfCVHsvCX2F)tZm0ozMa zO2I_Tm+0Qh)y(P9;FFrl9JF%7IweBz}GnB;9KP9bZR_ZYYuPT-1d4XhPkp{R*xbd1YqXZ2B ze!?T~iAykLdgFG#^gBCs_k`uO116`?G9x~cW}9OSmJhS(t%Nsr+l+Q|0``oMQ>|_D zyIz)OC^}0YMrql;Ky($yd+L?a-t4jOgoX5FKu$k8K+`6H(Lew&yBFR{b$b=|V{N-o z!n^m~@#*Qy77^nwD>PhPUUw?TIpS`|?XELxk1P-E8N8Ino;!uvynY=bkJ0q;0YM+@ zR`uv`Lyl5$Q{JtP-f;?V_~v|qtR-YfAM%nIu)(+&eEuR5_&p?cf;Dlz|)_F1e@!;JwUdNJoe&^G|r_S#7k>Pk!0aO6`9hq)Odj2lT;g5ZD z*E8@+qi(pJwb$xm6_|Q4BWQ``XM7fa#<&^!aNG-Vsctg4o{A+`z)PRP59wty9}Ar( z=WD}LP(45l@P9HJ&tEH3vC1zrVYxi&N3KbJz(w;7dl(3*R4Gt;3sVu|5I*GwDW{$b zO0r)%<0mzfY4?QUJHOA+!Ka?Z&|-`0{L!ODey5XPW+E9mLCWCU1GC`F`T=Ofx0P_C zRB}QAg;mBA;~|~`s_9?tN>>>rrvqTLn_~zl5dz65?|qtncrD!B&DeH@C4I%64w!tF z9%R0Wo!{>}{&)JerNtY%l06?KO+EkR@x3n?v2v0hvWzFQ zJjCjL!Ec98W!S)9E(8q{JD$LN(1Q!su|Os(?+G;-{*<%e{X7MF|sNqICOvOaLwibfyQ;zYsj)LX{^ zw`BObmti!;!fw3bM3Rf+i2(G>Qx;%Ywce#pR(tvP%xU)_)y)YMi~}@zJ+?mqj`-Tq zYZFY&cj@4^(2`i0*X2dk)y{TOLfh8nYr%8mVr6vNzlGhLrI>r5`!ZLuL2DjMw^0r#F}?TR!!FDQpq zrW`Vj;k z7kvg(?^Uwkh$(YQy<1rJ4}3YJ!Er`V*kWp)LPA>ew0OJ%fm!-f)u&hzZ5vlDj0Q%U zJoo9i@A%?3WRTwBt3gjpS64&!IiHrpA!Hv&GcEZ<9M^-ph7EKXMG9IPC9-yc6N|ag z-KKskK3#P#X6jy1k-Yk9{`s+0E?vUVY60kZqP%QO09g3jN=#`-)KL`{0ydZa@_1$s zQX>@T-#c?l3$UYK5%3aqx9uSfc>j=+{7X|>+{ja2&rWBN=6Pgq`O`L=^Qw87jbCaq zH*s8#1MiPeUtce_zKf+IyIdVA{Wa^wi=pqu_3GoH+|Y;R2oHa|a|()>I>`t4eCN|; z(>G7y4iRad**mj5)Euhdhu+#=v{EOH`JC!&i9q~z0c%ZP*_?ls)h2{^i&MdJ01Ff3 z#*xbcjQK;vSTcVngBg`ECT#25dGY4#tj({-%0D*lB4yOw4>P0RGToZocCX`?TXTn0Lpgx;qE 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 Q2XqDO58TJw`-k`b1zcgcy8r+H literal 0 HcmV?d00001 diff --git "a/drivers_sample/\345\233\276\347\211\207/1726194945180.jpg" "b/drivers_sample/\345\233\276\347\211\207/1726194945180.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..809eae5969a3599451a2a92cbafc6f8b0d13806b GIT binary patch literal 171355 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

pQFQeQOQD;xwY(*&td^_&aOSD9hhj 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

    #FbWe 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

    d|2UHX(ucdXesiis5Y6W(abncn$S(q9U_jNU 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.BIT.func = 0x8; /* 0x8 is ADC1_ANA_A1 */ - iconfig->iocmg_21.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_21.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_21.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_21.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_21.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_32.BIT.func = 0x3; /* 0x3 is APT0_PWMA */ - iconfig->iocmg_32.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_32.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_32.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_32.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_32.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_35.BIT.func = 0x3; /* 0x3 is APT0_PWMB */ - iconfig->iocmg_35.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_35.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_35.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_35.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_35.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ - iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ - iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - APT0_Init(); - ADC1_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_associative_trigger_of_apt/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_associative_trigger_of_apt/readme.md deleted file mode 100644 index 5792eef52..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_associative_trigger_of_apt/readme.md +++ /dev/null @@ -1,18 +0,0 @@ -# 使用APT对ADC进行周期采样功能 -## 关键字: ADC, APT触发 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、中断和ADC控制器初始化和功能配置。示例中使用APT触发ADC采样,采样结束后触发ADC中断,并在中断回调函数中读取ADC转换结果。 - -**【示例配置】** -+ ADC触发源:APT。在"SystemInit()”中配置了APT的SOCA可以触发ADC采样。使用接口"HAL_APT_StartModule()”启动APT,在APT的每个周期中都会产生对ADC的触发请求。APT的触发配置请见"System_Init()”内APT初始化的部分。 - -+ ADC采样源:挂载到SOC0“adcInput”的外部采样源。SOC可以配置为“ADC_SOC_NUM0~ADC_SOC_NUM15”中任何一个。 - -+ ADC采样结果:ADC中断回调函数中读取结果。中断回调函数的配置请见"System_Init()”内ADC初始化的部分。在回调函数中调用“HAL_ADC_GetConvResult()”获取结果。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码中APT会周期性的对ADC进行触发采样。采样成功后,会通过串口打印中断服务函数内读取到的ADC采样结果。在串口打印输出中,会不断打印中断回调函数中读出的ADC采样结果。 - -**【注意事项】** -+ 示例代码使用UART0进行结果打印输出,需要对UART0进行初始化配置。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_associative_trigger_of_apt/src/sample_adc_associative_trigger_apt.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_associative_trigger_of_apt/src/sample_adc_associative_trigger_apt.c deleted file mode 100644 index 05180c45f..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_associative_trigger_of_apt/src/sample_adc_associative_trigger_apt.c +++ /dev/null @@ -1,59 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_adc_associative_trigger_apt.c - * @author MCU Driver Team - * @brief adc sample sampling by apt trigger. - * @details Use APT to trigger ADC sampling, trigger an ADC interrupt after sampling, and read the ADC conversion - * result in the interrupt callback function. - * (1) ADC strigger source is APT0_SOCA. Select the ADC trigger source in "socParam.periphTrigSource" - * from SystemInit() and modify the initialization interface of the APT. - * (2) ADC sample source is ADC1_SOC1. Select sample source in "g_adc.baseAddress" and "ADC_SOC_NUM1" - * from SystemInit(). External input source: GPIO2_2/GPIO2_3 - * (3) The ADC conversion result is read from the interrupt callback function ADC_Init2FromApt interface. - * If interrupt is not used, after the conversion is complete, use HAL_ADC_GetConvResult() to obtain result. - * Check whether the ADC conversion is complete through the HAL_ADC_CheckSocFinish() interface. - */ -#include "sample_adc_associative_trigger_apt.h" - -/** - * @brief ADC sampling interrupt callback triggered by APT. - * @param None. - * @retval None. - */ -void ADC_Init2FromApt(ADC_Handle *handle) -{ - BASE_FUNC_UNUSED(handle); - unsigned int ret = HAL_ADC_GetConvResult(&g_adc, ADC_SOC_NUM1); /* Read ADC sample result */ - DBG_PRINTF("APT trigger sampling completed, result: %x\r\n", ret); - float voltage = (float)ret / (float)4096 * 3.3; /* 4096 and 3.3 are for Sample Value Conversion */ - DBG_PRINTF("voltage: %f\r\n", voltage); -} - -/** - * @brief ADC single channel sample by trigger from apt. - * @param None. - * @retval None. - */ -void ADC_AptTrigger(void) -{ - SystemInit(); - DBG_PRINTF("ADC_AptTrigger begin\r\n"); - HAL_ADC_StartIt(&g_adc); - HAL_APT_StartModule(RUN_APT0); /* APT0 is enable and generates the APT0_SOCA trigger signal */ - return; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_continue_trigger/inc/sample_adc_continue_trigger.h b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_continue_trigger/inc/sample_adc_continue_trigger.h deleted file mode 100644 index 0227a13c8..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_continue_trigger/inc/sample_adc_continue_trigger.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_adc_continue_trigger.h - * @author MCU Driver Team - * @brief adc sample module. - * @details This file provides users with sample code to help use ADC function: - * ADC Continuous Sampling Function: The first time is triggered by software, - * and the subsequent consecutive sampling is triggered by interrupts. - */ -#ifndef SAMPLE_ADC_CONTINUESAMPLE_H -#define SAMPLE_ADC_CONTINUESAMPLE_H - -#include "debug.h" -#include "adc.h" -#include "main.h" - -void ADC_ContinueSample(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_continue_trigger/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_continue_trigger/init/main.c deleted file mode 100644 index 5e269fbde..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_continue_trigger/init/main.c +++ /dev/null @@ -1,36 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "feature.h" -#include "main.h" -#include "sample_adc_continue_trigger.h" - -UART_Handle g_uart0; -ADC_Handle g_adc; - -int main(void) -{ - ADC_ContinueSample(); - while (1) { - } - return BASE_STATUS_OK; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_continue_trigger/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_continue_trigger/init/main.h deleted file mode 100644 index 9df26b874..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_continue_trigger/init/main.h +++ /dev/null @@ -1,48 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "adc.h" -#include "uart.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -extern UART_Handle g_uart0; - -extern ADC_Handle g_adc; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -void ADC_ContinueInt(ADC_Handle *handle); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_continue_trigger/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_continue_trigger/init/system_init.c deleted file mode 100644 index d94418ac1..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_continue_trigger/init/system_init.c +++ /dev/null @@ -1,140 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -__weak void ADC_ContinueInt(ADC_Handle *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN ADC_ContinueInt */ - /* USER CODE END ADC_ContinueInt */ -} - -static void ADC1_Init(void) -{ - HAL_CRG_IpEnableSet(ADC1_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(ADC1_BASE, CRG_ADC_CLK_SELECT_PLL_DIV); - HAL_CRG_IpClkDivSet(ADC1_BASE, CRG_ADC_DIV_5); - - g_adc.baseAddress = ADC1; - g_adc.socPriority = ADC_PRIMODE_ALL_ROUND; - g_adc.vrefBuf = ADC_VREF_2P5V; - g_adc.irqNumOver = IRQ_ADC1_OVINT; - g_adc.ADC_IntxParam[0].irqNum = IRQ_ADC1_INT1; /* interrupt 0 */ - g_adc.ADC_IntxParam[1].irqNum = IRQ_ADC1_INT2; /* interrupt 1 */ - g_adc.ADC_IntxParam[2].irqNum = IRQ_ADC1_INT3; /* interrupt 2 */ - g_adc.ADC_IntxParam[3].irqNum = IRQ_ADC1_INT4; /* interrupt 3 */ - - HAL_ADC_Init(&g_adc); - - SOC_Param socParam = {0}; - socParam.adcInput = ADC_CH_ADCINA1; - - socParam.sampleHoldTime = 2; /* adc sample holed time 2 adc_clk */ - socParam.sampleTotalTime = 127; /* adc sample total time 127 adc_clk */ - socParam.softTrigSource = ADC_TRIGSOC_SOFT; - socParam.intTrigSource = ADC_TRIGSOC_INT2; - socParam.periphTrigSource = ADC_TRIGSOC_NONEPERIPH; - socParam.finishMode = ADC_SOCFINISH_INT2; - HAL_ADC_ConfigureSoc(&g_adc, ADC_SOC_NUM1, &socParam); - - HAL_ADC_RegisterCallBack(&g_adc, ADC_CALLBACK_INT2, ADC_ContinueInt); - IRQ_SetPriority(IRQ_ADC1_INT2, 4); /* Set the priority to level 4 */ - IRQ_EnableN(IRQ_ADC1_INT2); - HAL_ADC_IrqService(&g_adc); -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); - - g_uart0.baseAddress = UART0; - g_uart0.irqNum = IRQ_UART0; - - g_uart0.baudRate = UART0_BAND_RATE; - g_uart0.dataLength = UART_DATALENGTH_8BIT; - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; - g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart0); -} - -static void IOConfig(void) -{ - IOConfig_RegStruct *iconfig = IOCONFIG; - - iconfig->iocmg_21.BIT.func = 0x8; /* 0x8 is ADC1_ANA_A1 */ - iconfig->iocmg_21.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_21.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_21.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_21.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_21.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ - iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ - iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; -} - -void SystemInit(void) -{ - IOConfig(); - ADC1_Init(); - UART0_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_continue_trigger/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_continue_trigger/readme.md deleted file mode 100644 index 8de1d26e8..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_continue_trigger/readme.md +++ /dev/null @@ -1,18 +0,0 @@ -# 单次触发ADC,可以产生连续的采样效果 -## 关键字: ADC, 连续采样 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、中断和ADC控制器初始化和功能配置。示例中使用软件触发ADC开始采样,采样结束后触发ADC中断,并在中断回调函数中读取ADC转换结果。在每次完成采样结束后,内部会自动产生触发请求,实现连续采样功能。 - -**【示例配置】** -+ ADC触发源:软件触发。使用接口"HAL_ADC_SoftTrigSample()”启动软件触发。连续采样功能中,首次触发来自软件或者其他触发源,后面持续的请求来自ADC内部。 - -+ ADC采样源:挂载到SOC1 “adcInput”的外部采样源。SOC可以配置为“ADC_SOC_NUM0~ADC_SOC_NUM15”中任何一个 - -+ ADC采样结果:ADC中断回调函数中读取结果。中断回调函数的配置请见"System_Init()”内ADC初始化内容。在回调函数中调用“HAL_ADC_GetConvResult()”获取结果。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成后,软件触发后,ADC进行连续触发采样,持续产生中断。采样成功后,会通过串口打印中断服务函数内读取到的ADC采样结果。在串口打印输出中,会不断打印中断回调函数中读出的ADC采样结果。 - -**【注意事项】** -+ 示例代码使用UART0进行结果打印输出,需要对UART0进行初始化配置。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_continue_trigger/src/sample_adc_continue_trigger.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_continue_trigger/src/sample_adc_continue_trigger.c deleted file mode 100644 index 8ad708b05..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_continue_trigger/src/sample_adc_continue_trigger.c +++ /dev/null @@ -1,65 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_adc_continue_trigger.c - * @author MCU Driver Team - * @brief adc sample module. - * @details In continuous mode, the ADC uses its internal interrupts to continuously trigger ADC sampling. After - * sampling is complete, an ADC interrupt is triggered. The ADC conversion result can be read in the - * interrupt callback function. ADC Continuous Sampling Function: The first time is triggered by software, - * and the subsequent consecutive sampling is triggered by interrupts. - * (1) ADC strigger source is ADC1 interrupt2(IRQ_ADC1_INT2). Select the ADC trigger source in - * "socParam.intTrigSource" of SystemInit(). - * (2) ADC sample source is ADC1_SOC1. Select sample source in "g_adc.baseAddress" and "ADC_SOC_NUM1" - * of SystemInit(). External input source: GPIO2_2/GPIO2_3 - * (3) The ADC conversion result is read from the interrupt callback function ADC_ContinueInt interface. - * If interrupt is not used, after the conversion is complete, use HAL_ADC_GetConvResult() to obtain result. - * Check whether the ADC conversion is complete through the HAL_ADC_CheckSocFinish() interface. - */ -#include "sample_adc_continue_trigger.h" - -/** - * @brief User callback function of ADC interrupt one. - * @param adcHandle ADC handle. - * @retval None. - */ -void ADC_ContinueInt(ADC_Handle *adcHandle) -{ - DBG_PRINTF("ADC_Int1Finish\r\n"); - unsigned int ret = HAL_ADC_GetConvResult(adcHandle, ADC_SOC_NUM1); - float voltage = (float)ret / (float)4096 * 3.3; /* 4096 and 3.3 are for Sample Value Conversion */ - DBG_PRINTF("result: %d, voltage: %f\r\n", ret, voltage); -} - -/** - * @brief Continuous sample function by using internal interrupt. - * @param None. - * @retval None. - */ -void ADC_ContinueSample(void) -{ - SystemInit(); - DBG_PRINTF("ADC_ContinueSample begin\r\n"); - HAL_ADC_StartIt(&g_adc); /* Enable ADC interrupt */ - /* The first trigger, then internal interrupt triggered continuous sampling */ - HAL_ADC_SoftTrigSample(&g_adc, ADC_SOC_NUM1); - /* - To disable the continuous sampling function, perform the following sampling methods: - (1) Disable the ADC interrupt and use IRQ_DisableN(). - (2) Configure the SOC trigger source and remove interrupt triggering. - */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_over_sample/inc/sample_adc_over_sample.h b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_over_sample/inc/sample_adc_over_sample.h deleted file mode 100644 index 435baa6ca..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_over_sample/inc/sample_adc_over_sample.h +++ /dev/null @@ -1,31 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_adc_over_sample.h - * @author MCU Driver Team - * @brief adc sample module. - * @details This file provides users with sample code to help use ADC function. - */ -#ifndef SAMPLE_ADC_OVERSAMPLE_H -#define SAMPLE_ADC_OVERSAMPLE_H - -#include "debug.h" -#include "adc.h" -#include "main.h" - -void ADC_OverSample(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_over_sample/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_over_sample/init/main.c deleted file mode 100644 index b276dd494..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_over_sample/init/main.c +++ /dev/null @@ -1,36 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "feature.h" -#include "main.h" -#include "sample_adc_over_sample.h" - -UART_Handle g_uart0; -ADC_Handle g_adc; - -int main(void) -{ - ADC_OverSample(); - while (1) { - } - return BASE_STATUS_OK; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_over_sample/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_over_sample/init/main.h deleted file mode 100644 index 0289e7961..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_over_sample/init/main.h +++ /dev/null @@ -1,46 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "adc.h" -#include "uart.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -extern UART_Handle g_uart0; - -extern ADC_Handle g_adc; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_over_sample/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_over_sample/init/system_init.c deleted file mode 100644 index c379b76aa..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_over_sample/init/system_init.c +++ /dev/null @@ -1,138 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void ADC1_Init(void) -{ - HAL_CRG_IpEnableSet(ADC1_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(ADC1_BASE, CRG_ADC_CLK_SELECT_PLL_DIV); - HAL_CRG_IpClkDivSet(ADC1_BASE, CRG_ADC_DIV_5); - - g_adc.baseAddress = ADC1; - g_adc.socPriority = ADC_PRIMODE_ALL_ROUND; - g_adc.vrefBuf = ADC_VREF_2P5V; - g_adc.irqNumOver = IRQ_ADC1_OVINT; - g_adc.ADC_IntxParam[0].irqNum = IRQ_ADC1_INT1; /* interrupt 0 */ - g_adc.ADC_IntxParam[1].irqNum = IRQ_ADC1_INT2; /* interrupt 1 */ - g_adc.ADC_IntxParam[2].irqNum = IRQ_ADC1_INT3; /* interrupt 2 */ - g_adc.ADC_IntxParam[3].irqNum = IRQ_ADC1_INT4; /* interrupt 3 */ - - HAL_ADC_Init(&g_adc); - - SOC_Param socParam = {0}; - socParam.adcInput = ADC_CH_ADCINA1; - - socParam.sampleHoldTime = 2; /* adc sample holed time 2 adc_clk */ - socParam.sampleTotalTime = 127; /* adc sample total time 127 adc_clk */ - socParam.softTrigSource = ADC_TRIGSOC_SOFT; - socParam.intTrigSource = ADC_TRIGSOC_NONEINT; - socParam.periphTrigSource = ADC_TRIGSOC_NONEPERIPH; - socParam.finishMode = ADC_SOCFINISH_NONE; - HAL_ADC_ConfigureSoc(&g_adc, ADC_SOC_NUM3, &socParam); - - socParam.adcInput = ADC_CH_ADCINA1; - - socParam.sampleHoldTime = 2; /* adc sample holed time 2 adc_clk */ - socParam.sampleTotalTime = 127; /* adc sample total time 127 adc_clk */ - socParam.softTrigSource = ADC_TRIGSOC_SOFT; - socParam.intTrigSource = ADC_TRIGSOC_NONEINT; - socParam.periphTrigSource = ADC_TRIGSOC_NONEPERIPH; - socParam.finishMode = ADC_SOCFINISH_NONE; - HAL_ADC_ConfigureSoc(&g_adc, ADC_SOC_NUM5, &socParam); -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); - - g_uart0.baseAddress = UART0; - g_uart0.irqNum = IRQ_UART0; - - g_uart0.baudRate = UART0_BAND_RATE; - g_uart0.dataLength = UART_DATALENGTH_8BIT; - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; - g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart0); -} - -static void IOConfig(void) -{ - IOConfig_RegStruct *iconfig = IOCONFIG; - - iconfig->iocmg_21.BIT.func = 0x8; /* 0x8 is ADC1_ANA_A1 */ - iconfig->iocmg_21.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_21.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_21.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_21.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_21.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ - iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ - iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; -} - -void SystemInit(void) -{ - IOConfig(); - ADC1_Init(); - UART0_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_over_sample/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_over_sample/readme.md deleted file mode 100644 index 161013de9..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_over_sample/readme.md +++ /dev/null @@ -1,18 +0,0 @@ -# 同时对同一采样源采样,实现过采样功能 -## 关键字: ADC, 过采样 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、中断和ADC控制器初始化和功能配置。过采样示例中,ADC对同一条通道使用两个SOC来采样两次,使用软件触发ADC采样,触发采样后自行判断ADC转换完成后,再自行读取两个结果,此时结果为两倍过采样。 - -**【示例配置】** -+ ADC触发源:软件触发。使用接口"HAL_ADC_SoftTrigSample()”启动软件触发。连续采样功能中,首次触发来自软件或者其他触发源,后面持续的请求来自ADC内部。 - -+ ADC采样源:挂载到SOC3和SOC5外部采样源。SOC可以配置为“ADC_SOC_NUM0~ADC_SOC_NUM15”中任意两个。过采样中需要保证SOC3和SOC5采样源一致,要配置“SystemInit()”中“adcInput”参数一致。 - -+ ADC采样结果:自行判断转换完成后,再读取结果。使用接口“HAL_ADC_CheckSocFinish()”判断是否转换完成,返回值OK表示转换结束,再使用“HAL_ADC_GetConvResult()”接口,读取采样结果。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成,软件触发后,ADC进行同时对同一个采样源采样两次。等待5ms后检查ADC采样结是否转换完成,若转换完成串口打印出采样结果,若采样未完成打印未完成提示字符串。 - -**【注意事项】** -+ 示例代码使用UART0进行结果打印输出,需要对UART0进行初始化配置。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_over_sample/src/sample_adc_over_sample.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_over_sample/src/sample_adc_over_sample.c deleted file mode 100644 index b51705ae9..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_over_sample/src/sample_adc_over_sample.c +++ /dev/null @@ -1,61 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_adc_over_sample.c - * @author MCU Driver Team - * @brief adc over sample module. - * @details In the oversampling example, the ADC samples the same channel twice and uses software to trigger ADC - * sampling. After the sampling is triggered, determines the ADC conversion is complete and reads the result. - * (1) ADC strigger source is software. Use HAL_ADC_SoftTrigMultiSample() to configure software tirgger SOC3 - * and SOC5. - * (2) ADC sample source is ADC1_SOC3 and ADC1_SOC5. Select sample source in "g_adc.baseAddress" of - * SystemInit(), "ADC_SOC_NUM3" and "ADC_SOC_NUM5" can be Modified. External input source: GPIO2_2/GPIO2_3. - * (3) The ADC conversion result is read from HAL_ADC_GetConvResult interface. - * If interrupt is not used, after the conversion is complete, use HAL_ADC_GetConvResult() to obtain result. - * Check whether the ADC conversion is complete through the HAL_ADC_CheckSocFinish() interface. - */ - -#include "sample_adc_over_sample.h" -/** - * @brief ADC over sample. - * @param None. - * @retval None. - */ -void ADC_OverSample(void) -{ - SystemInit(); - DBG_PRINTF("ADC_overSample begin\r\n"); - - ADC_SoftMultiTrig softTrig = {0}; - softTrig.BIT.trigSoc3 = BASE_CFG_ENABLE; - softTrig.BIT.trigSoc5 = BASE_CFG_ENABLE; - HAL_ADC_SoftTrigMultiSample(&g_adc, softTrig); /* Trigger both SOC3 and SOC5 */ - - BASE_FUNC_DELAY_MS(5); /* delay 5 ms */ - if (HAL_ADC_CheckSocFinish(&g_adc, ADC_SOC_NUM3) == BASE_STATUS_ERROR) { - DBG_PRINTF("SOC3 did not complete sampling and conversion\r\n"); - return; - } - if (HAL_ADC_CheckSocFinish(&g_adc, ADC_SOC_NUM5) == BASE_STATUS_ERROR) { - DBG_PRINTF("SOC5 did not complete sampling and conversion\r\n"); - return; - } - /* Read sampling results */ - unsigned ret1 = HAL_ADC_GetConvResult(&g_adc, ADC_SOC_NUM3); - unsigned ret2 = HAL_ADC_GetConvResult(&g_adc, ADC_SOC_NUM5); - DBG_PRINTF("ret1: %x, ret2: %x\r\n", ret1, ret2); -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_oversampling_it/inc/sample_adc_oversampling_it.h b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_oversampling_it/inc/sample_adc_oversampling_it.h deleted file mode 100644 index f5bb2399c..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_oversampling_it/inc/sample_adc_oversampling_it.h +++ /dev/null @@ -1,31 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_adc_oversampling_it.h - * @author MCU Driver Team - * @brief adc sample module. - * @details This file provides users with sample code to help use ADC function. - */ -#ifndef SAMPLE_ADC_OVERSAMPLING_IT_H -#define SAMPLE_ADC_OVERSAMPLING_IT_H - -#include "debug.h" -#include "adc.h" -#include "main.h" - -void ADC_OverSamplingIt(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_oversampling_it/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_oversampling_it/init/main.c deleted file mode 100644 index c73cfd047..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_oversampling_it/init/main.c +++ /dev/null @@ -1,51 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ - -#include "typedefs.h" -#include "feature.h" -#include "sample_adc_oversampling_it.h" -#include "main.h" -/* USER CODE BEGIN 0 */ -/* USER CODE END 0 */ -UART_Handle g_uart0; -ADC_Handle g_adc; -/* USER CODE BEGIN 1 */ -/* USER CODE END 1 */ - -int main(void) -{ - /* USER CODE BEGIN 2 */ - /* USER CODE END 2 */ - ADC_OverSamplingIt(); - /* USER CODE BEGIN 3 */ - /* USER CODE END 3 */ - while (1) { - /* USER CODE BEGIN 4 */ - /* USER CODE END 4 */ - } - /* USER CODE BEGIN 5 */ - /* USER CODE END 5 */ - return BASE_STATUS_OK; -} - -/* USER CODE BEGIN 6 */ -/* USER CODE END 6 */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_oversampling_it/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_oversampling_it/init/main.h deleted file mode 100644 index 1e369a07d..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_oversampling_it/init/main.h +++ /dev/null @@ -1,55 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "adc.h" -#include "adc_ex.h" -#include "uart.h" -#include "uart_ex.h" -#include "crg.h" -#include "iocmg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -#define XTAL_DRV_LEVEL4 0x03U -#define XTAL_DRV_LEVEL3 0x02U -#define XTAL_DRV_LEVEL2 0x01U -#define XTAL_DRV_LEVEL1 0x00U - -extern UART_Handle g_uart0; -extern ADC_Handle g_adc; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -void ADC_OversamplingCalBack(ADC_Handle *handle); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_oversampling_it/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_oversampling_it/init/system_init.c deleted file mode 100644 index f99f4aeaf..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_oversampling_it/init/system_init.c +++ /dev/null @@ -1,138 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" -#include "iocmg_ip.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; /* crg address */ - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 48; /* PLL Multiplier 48 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_2; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; - crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; - crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; - - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { /* crg initialization */ - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -__weak void ADC_OversamplingCalBack(ADC_Handle *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN ADC_OversamplingCalBack */ - /* USER CODE END ADC_OversamplingCalBack */ -} - -static void ADC0_Init(void) -{ - HAL_CRG_IpEnableSet(ADC0_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(ADC0_BASE, CRG_ADC_CLK_ASYN_PLL_DIV); - HAL_CRG_IpClkDivSet(ADC0_BASE, CRG_ADC_DIV_2); - - g_adc.baseAddress = ADC0; - g_adc.socPriority = ADC_PRIMODE_ALL_ROUND; - - HAL_ADC_Init(&g_adc); /* adc initialization */ - ADC_OversamplingParam over = {0}; - over.multiple = ADC_OVERSAMPLING_64X; /* 64x oversampling */ - over.rightShift = ADC_RIGHTSHIFT_BIT3; /* The sampling result is shifted rightwards by 3 bits */ - over.oversamplingInt = BASE_CFG_ENABLE; - HAL_ADC_ConfigureOversamplingEx(&g_adc, ADC_SOC_NUM1, &over); - - SOC_Param socParam = {0}; - socParam.adcInput = ADC_CH_ADCINA2; /* PIN47(ADC AIN2) */ - socParam.sampleTotalTime = ADC_SOCSAMPLE_5CLK; /* adc sample total time 5 adc_clk */ - socParam.trigSource = ADC_TRIGSOC_SOFT; - socParam.continueMode = BASE_CFG_DISABLE; - socParam.finishMode = ADC_SOCFINISH_NONE; - HAL_ADC_ConfigureSoc(&g_adc, ADC_SOC_NUM1, &socParam); - - HAL_ADC_RegisterCallBack(&g_adc, ADC_CALLBACK_EVENT_OVERSAMPLING, (ADC_CallbackType)ADC_OversamplingCalBack); - - IRQ_Register(IRQ_ADC0_EVENT, HAL_ADC_IrqHandlerAllEvent, &g_adc); - IRQ_SetPriority(IRQ_ADC0_EVENT, 1); /* The priority is 1 */ - IRQ_EnableN(IRQ_ADC0_EVENT); -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - - g_uart0.baseAddress = UART0; /* uart address */ - /* UART parameter settings */ - g_uart0.baudRate = UART0_BAND_RATE; /* uart baud rate */ - g_uart0.dataLength = UART_DATALENGTH_8BIT; /* uart datalength */ - g_uart0.stopBits = UART_STOPBITS_ONE; /* uart stop bit */ - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; - g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; - g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; - g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart0); /* uart initialization */ -} - -static void IOConfig(void) -{ - SYSCTRL0->SC_SYS_STAT.BIT.update_mode = 0; - SYSCTRL0->SC_SYS_STAT.BIT.update_mode_clear = 1; - HAL_IOCMG_SetPinAltFuncMode(GPIO0_5_AS_ADC_AIN2); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO0_5_AS_ADC_AIN2, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO0_5_AS_ADC_AIN2, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO0_5_AS_ADC_AIN2, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO0_5_AS_ADC_AIN2, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - ADC0_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_oversampling_it/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_oversampling_it/readme.md deleted file mode 100644 index 45e4a1cf3..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_oversampling_it/readme.md +++ /dev/null @@ -1,18 +0,0 @@ -# 配置过采样精度,实现过采样功能,在中断中读取结果 -## 关键字: ADC, 过采样配置,中断 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、中断和ADC控制器初始化和功能配置。过采样示例中,ADC对同一条通道使用两个SOC来采样两次,使用软件触发ADC采样,触发采样后自行判断ADC转换完成后,再自行读取两个结果,此时结果为两倍过采样。 - -**【示例配置】** -+ ADC触发源:软件触发。使用接口"HAL_ADC_SoftTrigSample()”启动软件触发。 - -+ ADC采样源:挂载到SOC1部采样源。SOC可以配置为“ADC_SOC_NUM0~ADC_SOC_NUM15”中任意一个个。配置过采样的参数请见“HAL_ADC_ConfigureOversamplingEx()”接口。通过选择过采样倍数和结果右移比特数来共同决定过采样精度。 - -+ ADC采样结果:在过采样的中断中读出过采样的结果。过采样结果有单独的寄存器读取,需要使用“HAL_ADC_GetOversamplingResultEx()”进行读取。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成,软件触发。过采样全过程结束后,会在过采样的中断回调函数中打印出过采样的结果。 - -**【注意事项】** -+ 示例代码使用UART0进行结果打印输出,需要对UART0进行初始化配置。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_oversampling_it/src/sample_adc_oversampling_it.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_oversampling_it/src/sample_adc_oversampling_it.c deleted file mode 100644 index 22b635c30..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_oversampling_it/src/sample_adc_oversampling_it.c +++ /dev/null @@ -1,58 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_adc_oversampling_it.c - * @author MCU Driver Team - * @brief adc sample module. - * @details In oversampling mode, the ADC uses software triggers oversampling on the same channel. - * the ADC interrupt is triggered and conversion result is read in Oversampling event interrupt function. - * (1) ADC strigger source is software. Use HAL_ADC_SoftTrigSample() to configure software tirgger SOC1. - * (2) ADC sample source is SOC1. Select sample source in "g_adc.baseAddress" of SystemInit(), - * "ADC_SOC_NUM1" can be Modified. - * (3) The ADC conversion result is read from interrupt callback function ADC_OversamplingCalBack interface. - * If interrupt is not used, after the conversion is complete, use HAL_ADC_GetOversamplingResultEx() to obtain - * result. Check whether ADC conversion is complete through the HAL_ADC_CheckOversamplingFinishEx() interface. - */ -#include "adc_ex.h" -#include "sample_adc_oversampling_it.h" - -/** - * @brief ADC Oversampling callback function. - * @param handle. - * @retval None. - */ -void ADC_OversamplingCalBack(ADC_Handle *handle) -{ - BASE_FUNC_UNUSED(handle); - unsigned int ret = HAL_ADC_GetOversamplingResultEx(&g_adc); /* Software trigger ADC sampling */ - DBG_PRINTF("ADC_OversamplingCalBack, result: %x\r\n", ret); - float voltage = ((float)ret / (float)4096 * 3.3) / (float)(64 >> 3); /* 4096 , 3.3, 64 , 3 are for Conversion */ - DBG_PRINTF("voltage: %f\r\n", voltage); -} - -/** - * @brief ADC single channel sample without DMA and interrupt. - * @param None. - * @retval None. - */ -void ADC_OverSamplingIt(void) -{ - SystemInit(); - DBG_PRINTF("ADC_OverSamplingIt begin\r\n"); - HAL_ADC_SoftTrigSample(&g_adc, ADC_SOC_NUM1); /* Software trigger ADC sampling */ - return; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger/inc/sample_adc_single_trigger.h b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger/inc/sample_adc_single_trigger.h deleted file mode 100644 index 61f774166..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger/inc/sample_adc_single_trigger.h +++ /dev/null @@ -1,31 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_adc_single_trigger.h - * @author MCU Driver Team - * @brief adc sample module. - * @details This file provides users with sample code to help use ADC function. - */ -#ifndef SAMPLE_ADC_SINGLETRIGGER_H -#define SAMPLE_ADC_SINGLETRIGGER_H - -#include "debug.h" -#include "adc.h" -#include "main.h" - -void ADC_SingleTrigger(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger/init/main.c deleted file mode 100644 index 26fd70a25..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger/init/main.c +++ /dev/null @@ -1,35 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ -#include "feature.h" -#include "main.h" -#include "sample_adc_single_trigger.h" - -UART_Handle g_uart0; -ADC_Handle g_adc; - -int main(void) -{ - ADC_SingleTrigger(); - while (1) { - } - return BASE_STATUS_OK; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger/init/main.h deleted file mode 100644 index 0289e7961..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger/init/main.h +++ /dev/null @@ -1,46 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "adc.h" -#include "uart.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -extern UART_Handle g_uart0; - -extern ADC_Handle g_adc; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger/init/system_init.c deleted file mode 100644 index 09b25530d..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger/init/system_init.c +++ /dev/null @@ -1,128 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void ADC1_Init(void) -{ - HAL_CRG_IpEnableSet(ADC1_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(ADC1_BASE, CRG_ADC_CLK_SELECT_PLL_DIV); - HAL_CRG_IpClkDivSet(ADC1_BASE, CRG_ADC_DIV_5); - - g_adc.baseAddress = ADC1; - g_adc.socPriority = ADC_PRIMODE_ALL_ROUND; - g_adc.vrefBuf = ADC_VREF_2P5V; - g_adc.irqNumOver = IRQ_ADC1_OVINT; - g_adc.ADC_IntxParam[0].irqNum = IRQ_ADC1_INT1; /* interrupt 0 */ - g_adc.ADC_IntxParam[1].irqNum = IRQ_ADC1_INT2; /* interrupt 1 */ - g_adc.ADC_IntxParam[2].irqNum = IRQ_ADC1_INT3; /* interrupt 2 */ - g_adc.ADC_IntxParam[3].irqNum = IRQ_ADC1_INT4; /* interrupt 3 */ - - HAL_ADC_Init(&g_adc); - - SOC_Param socParam = {0}; - socParam.adcInput = ADC_CH_ADCINA1; - - socParam.sampleHoldTime = 2; /* adc sample holed time 2 adc_clk */ - socParam.sampleTotalTime = 127; /* adc sample total time 127 adc_clk */ - socParam.softTrigSource = ADC_TRIGSOC_SOFT; - socParam.intTrigSource = ADC_TRIGSOC_NONEINT; - socParam.periphTrigSource = ADC_TRIGSOC_NONEPERIPH; - socParam.finishMode = ADC_SOCFINISH_NONE; - HAL_ADC_ConfigureSoc(&g_adc, ADC_SOC_NUM1, &socParam); -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); - - g_uart0.baseAddress = UART0; - g_uart0.irqNum = IRQ_UART0; - - g_uart0.baudRate = UART0_BAND_RATE; - g_uart0.dataLength = UART_DATALENGTH_8BIT; - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; - g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart0); -} - -static void IOConfig(void) -{ - IOConfig_RegStruct *iconfig = IOCONFIG; - - iconfig->iocmg_21.BIT.func = 0x8; /* 0x8 is ADC1_ANA_A1 */ - iconfig->iocmg_21.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_21.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_21.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_21.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_21.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ - iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ - iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; -} - -void SystemInit(void) -{ - IOConfig(); - ADC1_Init(); - UART0_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger/readme.md deleted file mode 100644 index 9c1e6fa6f..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger/readme.md +++ /dev/null @@ -1,18 +0,0 @@ -# 单次触发ADC完成一次采样转换 -## 关键字: ADC, 判断采样完成 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、中断和ADC控制器初始化和功能配置。ADC在单次采样模式下,使用软件触发ADC采样,触发采样后自行判断ADC转换完成后,再自行读取结果。 - -**【示例配置】** -+ ADC触发源:软件触发。使用接口"HAL_ADC_SoftTrigSample()”启动软件触发。 - -+ ADC采样源:挂载到SOC1 外部采样源。SOC的在文件“system_init.c”中配置,SOC可以配置为“ADC_SOC_NUM0~ADC_SOC_NUM15”中任何一个。 - -+ ADC采样结果:自行判断转换完成后,再读取结果。使用接口“HAL_ADC_CheckSocFinish()”判断是否转换完成,返回值OK表示转换结束,再使用“HAL_ADC_GetConvResult()”接口,读取采样结果。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成,软件触发后,ADC进行单次采样转换。等待10ms后检查ADC采样结是否转换完成,若转换完成串口打印出采样结果,若采样未完成打印未完成提示字符串。 - -**【注意事项】** -+ 示例代码使用UART0进行结果打印输出,需要对UART0进行初始化配置。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger/src/sample_adc_single_trigger.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger/src/sample_adc_single_trigger.c deleted file mode 100644 index 090e9aca6..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger/src/sample_adc_single_trigger.c +++ /dev/null @@ -1,55 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_adc_single_trigger.c - * @author MCU Driver Team - * @brief adc sample module. - * @details In single sampling mode, the ADC is triggered by software. After the sampling is triggered, the ADC - * determines that the ADC conversion is complete and reads the result. - * (1) ADC strigger source is software. Use HAL_ADC_SoftTrigSample() to configure software tirgger SOC1. - * (2) ADC sample source is ADC1_SOC1. Select sample source in "g_adc.baseAddress" of SystemInit(), - * "ADC_SOC_NUM1" can be Modified. External input source: GPIO2_2/GPIO2_3. - * (3) If interrupt is not used, after the conversion is complete, use HAL_ADC_GetConvResult() to get result. - * Check whether the ADC conversion is complete through the HAL_ADC_CheckSocFinish() interface. - */ -#include "sample_adc_single_trigger.h" - -/** - * @brief ADC single channel sample without DMA and interrupt. - * @param None. - * @retval None. - */ -void ADC_SingleTrigger(void) -{ - SystemInit(); - DBG_PRINTF("ADC_SingleTrigger begin\r\n"); - - HAL_ADC_SoftTrigSample(&g_adc, ADC_SOC_NUM1); /* Software trigger ADC sampling */ - - BASE_FUNC_DELAY_MS(10); /* delay 10 ms */ - - if (HAL_ADC_CheckSocFinish(&g_adc, ADC_SOC_NUM1) == BASE_STATUS_ERROR) { - DBG_PRINTF("ADC did not complete sampling and conversion\r\n"); - return; - } - - unsigned int ret = HAL_ADC_GetConvResult(&g_adc, ADC_SOC_NUM1); /* Software trigger ADC sampling */ - DBG_PRINTF("Sampling completed, result: %x\r\n", ret); - float voltage = (float)ret / (float)4096 * 3.3; /* 4096 and 3.3 are for Sample Value Conversion */ - DBG_PRINTF("voltage: %f\r\n", voltage); - return; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_dma/inc/sample_adc_single_trigger_dma.h b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_dma/inc/sample_adc_single_trigger_dma.h deleted file mode 100644 index 0242aafc4..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_dma/inc/sample_adc_single_trigger_dma.h +++ /dev/null @@ -1,32 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_adc_single_trigger_dma.h - * @author MCU Driver Team - * @brief adc sample module. - * @details This file provides users with sample code to help use ADC function: - * ADC sampling by software trigger with dma - */ -#ifndef SAMPLE_ADC_SINGLETRIGGER_DMA_H -#define SAMPLE_ADC_SINGLETRIGGER_DMA_H - -#include "debug.h" -#include "adc.h" -#include "main.h" - -void ADC_SingleTriggerDma(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_dma/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_dma/init/main.c deleted file mode 100644 index 1f84553cb..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_dma/init/main.c +++ /dev/null @@ -1,37 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ -#include "feature.h" -#include "main.h" -#include "sample_adc_single_trigger_dma.h" - -UART_Handle g_uart0; -ADC_Handle g_adc; - -DMA_Handle g_dmac; - -int main(void) -{ - ADC_SingleTriggerDma(); - while (1) { - } - return BASE_STATUS_OK; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_dma/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_dma/init/main.h deleted file mode 100644 index 42c24eecd..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_dma/init/main.h +++ /dev/null @@ -1,51 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "adc.h" -#include "uart.h" -#include "crg.h" -#include "dma.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -extern UART_Handle g_uart0; - -extern ADC_Handle g_adc; - -extern DMA_Handle g_dmac; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -void ADC1DMACallback(ADC_Handle *handle); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_dma/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_dma/init/system_init.c deleted file mode 100644 index 9f1769b9e..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_dma/init/system_init.c +++ /dev/null @@ -1,170 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void DMA_Channel1Init(void *handle) -{ - DMA_ChannelParam dma_param; - dma_param.direction = DMA_PERIPH_TO_MEMORY_BY_DMAC; /* DMA transmission direction */ - dma_param.srcAddrInc = DMA_ADDR_UNALTERED; - dma_param.destAddrInc = DMA_ADDR_UNALTERED; - dma_param.srcPeriph = DMA_REQUEST_ADC1; /* ADC as DMA Request Source */ - dma_param.destPeriph = DMA_REQUEST_MEM; - dma_param.srcWidth = DMA_TRANSWIDTH_BYTE; - dma_param.destWidth = DMA_TRANSWIDTH_BYTE; - dma_param.srcBurst = DMA_BURST_LENGTH_1; - dma_param.destBurst = DMA_BURST_LENGTH_1; - dma_param.pHandle = handle; - HAL_DMA_InitChannel(&g_dmac, &dma_param, DMA_CHANNEL_ONE); /* Initializing the DMA Channel */ -} - -static void DMA_Init(void) -{ - g_dmac.baseAddress = DMA; - g_dmac.srcByteOrder = DMA_BYTEORDER_SMALLENDIAN; - g_dmac.destByteOrder = DMA_BYTEORDER_SMALLENDIAN; - g_dmac.irqNumTc = IRQ_DMA_TC; - g_dmac.irqNumError = IRQ_DMA_ERR; - HAL_DMA_IRQService(&g_dmac); - IRQ_EnableN(IRQ_DMA_TC); - IRQ_EnableN(IRQ_DMA_ERR); - HAL_DMA_Init(&g_dmac); /* Initializing the DMA controller */ - - DMA_Channel1Init((void *)(&g_adc)); -} - -__weak void ADC1DMACallback(ADC_Handle *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN ADC1DMACallback */ - /* USER CODE END ADC1DMACallback */ -} - -static void ADC1_Init(void) -{ - HAL_CRG_IpEnableSet(ADC1_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(ADC1_BASE, CRG_ADC_CLK_SELECT_PLL_DIV); - HAL_CRG_IpClkDivSet(ADC1_BASE, CRG_ADC_DIV_5); - - g_adc.baseAddress = ADC1; - g_adc.socPriority = ADC_PRIMODE_ALL_ROUND; - g_adc.vrefBuf = ADC_VREF_2P5V; - g_adc.irqNumOver = IRQ_ADC1_OVINT; - g_adc.ADC_IntxParam[0].irqNum = IRQ_ADC1_INT1; /* interrupt 0 */ - g_adc.ADC_IntxParam[1].irqNum = IRQ_ADC1_INT2; /* interrupt 1 */ - g_adc.ADC_IntxParam[2].irqNum = IRQ_ADC1_INT3; /* interrupt 2 */ - g_adc.ADC_IntxParam[3].irqNum = IRQ_ADC1_INT4; /* interrupt 3 */ - - g_adc.dmaHandle = &g_dmac; - g_adc.adcDmaChn = 1; /* DMA Channel 1 */ - HAL_ADC_RegisterCallBack(&g_adc, ADC_CALLBACK_DMA, ADC1DMACallback); - - HAL_ADC_Init(&g_adc); - - SOC_Param socParam = {0}; - socParam.adcInput = ADC_CH_ADCINA1; - - socParam.sampleHoldTime = 2; /* adc sample holed time 2 adc_clk */ - socParam.sampleTotalTime = 127; /* adc sample total time 127 adc_clk */ - socParam.softTrigSource = ADC_TRIGSOC_SOFT; - socParam.intTrigSource = ADC_TRIGSOC_NONEINT; - socParam.periphTrigSource = ADC_TRIGSOC_NONEPERIPH; - socParam.finishMode = ADC_SOCFINISH_DMA; - HAL_ADC_ConfigureSoc(&g_adc, ADC_SOC_NUM1, &socParam); -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); - - g_uart0.baseAddress = UART0; - g_uart0.irqNum = IRQ_UART0; - - g_uart0.baudRate = UART0_BAND_RATE; - g_uart0.dataLength = UART_DATALENGTH_8BIT; - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; - g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart0); -} - -static void IOConfig(void) -{ - IOConfig_RegStruct *iconfig = IOCONFIG; - - iconfig->iocmg_21.BIT.func = 0x8; /* 0x8 is ADC1_ANA_A1 */ - iconfig->iocmg_21.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_21.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_21.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_21.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_21.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ - iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ - iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; -} - -void SystemInit(void) -{ - IOConfig(); - DMA_Init(); - ADC1_Init(); - UART0_Init(); - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_dma/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_dma/readme.md deleted file mode 100644 index 0e5ceb911..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_dma/readme.md +++ /dev/null @@ -1,18 +0,0 @@ -# 配置ADC的单次采样功能,利用DMA搬运结果 -## 关键字: ADC, DMA搬运结果 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、中断和ADC控制器初始化和功能配置。ADC在单次采样模式下,使用软件触发ADC采样,采样结束后触发DMA搬运结果。搬运结束产生中断,在ADC的DMA完成回调函数中读出结果。 - -**【示例配置】** -+ ADC触发源:软件。使用接口"HAL_ADC_SoftTrigSample()”完成软件触发。“HAL_ADC_StartDma()”用于配置DMA搬运的源目地址。 - -+ ADC采样源: 挂载到SOC1 外部采样源。SOC的在文件“system_init.c”中配置,SOC可以配置为“ADC_SOC_NUM0~ADC_SOC_NUM15”中任何一个。 - -+ ADC采样结果:DMA完成的回调函数中读取结果。DMA配置请见"SystemInit()”。示例代码中,提前开辟了保存ADC采样结果的内存,DMA搬运结束后,直接从内存读取结果。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码中会对ADC进行软件触发采样,采样完成触发DMA搬运数据。在完成对ADC采样结果搬运后,会产生中断告知用户,在ADC的DMA完成搬运的中断回调函数中,从预设置的内存中读出DMA的搬运结果,利用串口输出对结果进行打印。 - -**【注意事项】** -+ 示例代码使用UART0进行结果打印输出,需要对UART0配置。 diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_dma/src/sample_adc_single_trigger_dma.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_dma/src/sample_adc_single_trigger_dma.c deleted file mode 100644 index 70d836102..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_dma/src/sample_adc_single_trigger_dma.c +++ /dev/null @@ -1,59 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_adc_single_trigger_dma.c - * @author MCU Driver Team - * @brief adc sample module. - * @details In single sampling mode, the ADC sampling is triggered by software. After the sampling is complete, - * the DMA is triggered to transfer the result. - * (1) ADC strigger source is software. Use HAL_ADC_SoftTrigSample() to configure software tirgger SOC1. - * (2) ADC sample source is ADC1_SOC1. Select sample source in "g_adc.baseAddress" of SystemInit(), - * "ADC_SOC_NUM3" can be Modified. External input source: GPIO2_2/GPIO2_3 - * (3) The ADC conversion result is read from DMA interrupt callback function ADC1DMACallback(). - */ - -#include "sample_adc_single_trigger_dma.h" - -static unsigned int g_adcRet[10] = {0}; -/** - * @brief User callback function of ADC interrupt one. - * @param adcHandle ADC handle. - * @retval None. - */ -void ADC_DMACallback(ADC_Handle *adcHandle) -{ - BASE_FUNC_UNUSED(adcHandle); - DBG_PRINTF("DMACallback\r\n"); - DBG_PRINTF("result: %d\r\n", g_adcRet[0]); - float voltage = (float)g_adcRet[0] / (float)4096 * 3.3; /* 4096 and 3.3 are for Sample Value Conversion */ - DBG_PRINTF("voltage: %f\r\n", voltage); -} - -/** - * @brief ADC channels sample with DMA. Transfers four SOC conversion results in one DMA request. - * @param None. - * @retval None. - */ -void ADC_SingleTriggerDma(void) -{ - SystemInit(); - DBG_PRINTF("ADC_SingleTriggerDma begin\r\n"); - - HAL_ADC_StartDma(&g_adc, ADC_SOC_NUM1, ADC_SOC_NUM1, g_adcRet); /* Transfer converted data of SOC1 */ - - HAL_ADC_SoftTrigSample(&g_adc, ADC_SOC_NUM1); /* Software triggers SOC1 */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_it/inc/sample_adc_single_trigger_it.h b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_it/inc/sample_adc_single_trigger_it.h deleted file mode 100644 index b35681567..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_it/inc/sample_adc_single_trigger_it.h +++ /dev/null @@ -1,32 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_adc_single_trigger_it.h - * @author MCU Driver Team - * @brief adc sample module. - * @details This file provides users with sample code to help use ADC function: - * ADC sampling by software trigger - */ -#ifndef SAMPLE_ADC_SINGLETRIGGER_IT_H -#define SAMPLE_ADC_SINGLETRIGGER_IT_H - -#include "debug.h" -#include "adc.h" -#include "main.h" - -void ADC_SingleTriggerIT(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_it/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_it/init/main.c deleted file mode 100644 index 1e9d6aea3..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_it/init/main.c +++ /dev/null @@ -1,35 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ -#include "feature.h" -#include "main.h" -#include "sample_adc_single_trigger_it.h" - -UART_Handle g_uart0; -ADC_Handle g_adc; - -int main(void) -{ - ADC_SingleTriggerIT(); - while (1) { - } - return BASE_STATUS_OK; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_it/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_it/init/main.h deleted file mode 100644 index 3386a5210..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_it/init/main.h +++ /dev/null @@ -1,48 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "adc.h" -#include "uart.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -extern UART_Handle g_uart0; - -extern ADC_Handle g_adc; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -void ADC_Int1Finish(ADC_Handle *handle); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_it/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_it/init/system_init.c deleted file mode 100644 index 447acce0c..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_it/init/system_init.c +++ /dev/null @@ -1,140 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -__weak void ADC_Int1Finish(ADC_Handle *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN ADC_Int1Finish */ - /* USER CODE END ADC_Int1Finish */ -} - -static void ADC1_Init(void) -{ - HAL_CRG_IpEnableSet(ADC1_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(ADC1_BASE, CRG_ADC_CLK_SELECT_PLL_DIV); - HAL_CRG_IpClkDivSet(ADC1_BASE, CRG_ADC_DIV_5); - - g_adc.baseAddress = ADC1; - g_adc.socPriority = ADC_PRIMODE_ALL_ROUND; - g_adc.vrefBuf = ADC_VREF_2P5V; - g_adc.irqNumOver = IRQ_ADC1_OVINT; - g_adc.ADC_IntxParam[0].irqNum = IRQ_ADC1_INT1; /* interrupt 0 */ - g_adc.ADC_IntxParam[1].irqNum = IRQ_ADC1_INT2; /* interrupt 1 */ - g_adc.ADC_IntxParam[2].irqNum = IRQ_ADC1_INT3; /* interrupt 2 */ - g_adc.ADC_IntxParam[3].irqNum = IRQ_ADC1_INT4; /* interrupt 3 */ - - HAL_ADC_Init(&g_adc); - - SOC_Param socParam = {0}; - socParam.adcInput = ADC_CH_ADCINA1; - - socParam.sampleHoldTime = 2; /* adc sample holed time 2 adc_clk */ - socParam.sampleTotalTime = 127; /* adc sample total time 127 adc_clk */ - socParam.softTrigSource = ADC_TRIGSOC_SOFT; - socParam.intTrigSource = ADC_TRIGSOC_NONEINT; - socParam.periphTrigSource = ADC_TRIGSOC_NONEPERIPH; - socParam.finishMode = ADC_SOCFINISH_INT1; - HAL_ADC_ConfigureSoc(&g_adc, ADC_SOC_NUM0, &socParam); - - HAL_ADC_RegisterCallBack(&g_adc, ADC_CALLBACK_INT1, ADC_Int1Finish); - IRQ_SetPriority(IRQ_ADC1_INT1, 7); /* Set the priority to level 7 */ - IRQ_EnableN(IRQ_ADC1_INT1); - HAL_ADC_IrqService(&g_adc); -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); - - g_uart0.baseAddress = UART0; - g_uart0.irqNum = IRQ_UART0; - - g_uart0.baudRate = UART0_BAND_RATE; - g_uart0.dataLength = UART_DATALENGTH_8BIT; - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; - g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart0); -} - -static void IOConfig(void) -{ - IOConfig_RegStruct *iconfig = IOCONFIG; - - iconfig->iocmg_21.BIT.func = 0x8; /* 0x8 is ADC1_ANA_A1 */ - iconfig->iocmg_21.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_21.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_21.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_21.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_21.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ - iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ - iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; -} - -void SystemInit(void) -{ - IOConfig(); - ADC1_Init(); - UART0_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_it/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_it/readme.md deleted file mode 100644 index fb280a9d8..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_it/readme.md +++ /dev/null @@ -1,18 +0,0 @@ -# 配置ADC的单次采样功能,中断回调中读取结果 -## 关键字: ADC, 单次采样, 中断 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、中断和ADC控制器初始化和功能配置。ADC在单次采样模式下,使用软件触发ADC采样,采样结束后触发ADC中断,并在中断回调函数中读取ADC转换结果。 - -**【示例配置】** -+ ADC触发源:软件。使用接口"HAL_ADC_SoftTrigSample()”完成软件触发。 - -+ ADC采样源: 挂载到SOC1 外部采样源。SOC的在文件“system_init.c”中配置,SOC可以配置为“ADC_SOC_NUM0~ADC_SOC_NUM15”中任何一个。 - -+ ADC采样结果:ADC中断回调函数中读取结果。ADC可以选择4个数据完成中断的任一个,配置请见"System_Init()”。在回调函数中调用“HAL_ADC_GetConvResult()”获取结果。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码中会对ADC进行软件触发采样。采样成功后,在中断回调函数中会通过串口打印读取到的ADC采样结果。 - -**【注意事项】** -+ 示例代码使用UART0进行结果打印输出,需要对UART0配置。 diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_it/src/sample_adc_single_trigger_it.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_it/src/sample_adc_single_trigger_it.c deleted file mode 100644 index 59eb3c1c6..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_it/src/sample_adc_single_trigger_it.c +++ /dev/null @@ -1,57 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_adc_single_trigger_it.c - * @author MCU Driver Team - * @brief adc sample module. - * @details In single sampling mode, the ADC sampling is triggered by software. After the sampling is complete, - * the ADC interrupt is triggered and the ADC conversion result is read in the interrupt callback function. - * (1) ADC strigger source is software. Use HAL_ADC_SoftTrigSample() to configure software tirgger SOC0. - * (2) ADC sample source is ADC1_SOC0. Select sample source in "g_adc.baseAddress" of SystemInit(), - * "ADC_SOC_NUM0" can be Modified. External input source: GPIO2_2/GPIO2_3 - * (3) The ADC conversion result is read from interrupt callback function ADC_Int1Finish interface. - * If interrupt is not used, after the conversion is complete, use HAL_ADC_GetConvResult() to obtain result. - * Check whether the ADC conversion is complete through the HAL_ADC_CheckSocFinish() interface. - */ -#include "sample_adc_single_trigger_it.h" - -/** - * @brief User callback function of ADC interrupt one. - * @param adcHandle ADC handle. - * @retval None. - */ -void ADC_Int1Finish(ADC_Handle *adcHandle) -{ - DBG_PRINTF("ADC_Int1Finish\r\n"); - unsigned int ret = HAL_ADC_GetConvResult(adcHandle, ADC_SOC_NUM0); - DBG_PRINTF("result: %d\r\n", ret); - float voltage = (float)ret / (float)4096 * 3.3; /* 4096 and 3.3 are for Sample Value Conversion */ - DBG_PRINTF("voltage: %f\r\n", voltage); -} - -/** - * @brief ADC single channel sample with interrupt. Each channel independently generate an interrupt. - * @param None. - * @retval None. - */ -void ADC_SingleTriggerIT(void) -{ - SystemInit(); - DBG_PRINTF("ADC_SingleTriggerIT begin\r\n"); - HAL_ADC_StartIt(&g_adc); - HAL_ADC_SoftTrigSample(&g_adc, ADC_SOC_NUM0); /* Software trigger ADC sampling */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_with_ppb/inc/sample_adc_single_with_ppb.h b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_with_ppb/inc/sample_adc_single_with_ppb.h deleted file mode 100644 index 7d2137584..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_with_ppb/inc/sample_adc_single_with_ppb.h +++ /dev/null @@ -1,30 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_adc_single_with_ppb.h - * @author MCU Driver Team - * @brief adc sample module. - * @details In the post-processing example of the ADC, there is the normal trigger sampling function and four - * post-processing functions: error calculation, upper threshold detection, lower threshold detection, - * and zero-crossing detection. - */ -#ifndef SAMPLE_ADC_SINGLE_WITH_PPB_H -#define SAMPLE_ADC_SINGLE_WITH_PPB_H -#include "debug.h" -#include "main.h" -void ADC_SingleTriggerItWithPPB(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_with_ppb/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_with_ppb/init/main.c deleted file mode 100644 index 18ad93d8e..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_with_ppb/init/main.c +++ /dev/null @@ -1,51 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ - -#include "typedefs.h" -#include "feature.h" -#include "sample_adc_single_with_ppb.h" -#include "main.h" -/* USER CODE BEGIN 0 */ -/* USER CODE END 0 */ -UART_Handle g_uart0; -ADC_Handle g_adc; -/* USER CODE BEGIN 1 */ -/* USER CODE END 1 */ - -int main(void) -{ - /* USER CODE BEGIN 2 */ - /* USER CODE END 2 */ - ADC_SingleTriggerItWithPPB(); - /* USER CODE BEGIN 3 */ - /* USER CODE END 3 */ - while (1) { - /* USER CODE BEGIN 4 */ - /* USER CODE END 4 */ - } - /* USER CODE BEGIN 5 */ - /* USER CODE END 5 */ - return BASE_STATUS_OK; -} - -/* USER CODE BEGIN 6 */ -/* USER CODE END 6 */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_with_ppb/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_with_ppb/init/main.h deleted file mode 100644 index c79ba4522..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_with_ppb/init/main.h +++ /dev/null @@ -1,56 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "adc.h" -#include "adc_ex.h" -#include "uart.h" -#include "uart_ex.h" -#include "crg.h" -#include "iocmg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -#define XTAL_DRV_LEVEL4 0x03U -#define XTAL_DRV_LEVEL3 0x02U -#define XTAL_DRV_LEVEL2 0x01U -#define XTAL_DRV_LEVEL1 0x00U - -extern UART_Handle g_uart0; -extern ADC_Handle g_adc; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -void ADCOversampingCallback(ADC_Handle *handle); -void ADC_Int1Finish(ADC_Handle *handle); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_with_ppb/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_with_ppb/init/system_init.c deleted file mode 100644 index 628749430..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_with_ppb/init/system_init.c +++ /dev/null @@ -1,144 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" -#include "iocmg_ip.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; /* crg address */ - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 48; /* PLL Multiplier 48 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_2; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; - crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; - crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; - - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { /* crg initialization */ - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -__weak void ADC_Int1Finish(ADC_Handle *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN ADC0_CALLBACK_INT1 */ - /* USER CODE END ADC0_CALLBACK_INT1 */ -} - -__weak void ADCOversampingCallback(ADC_Handle *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN ADCOversampingCallback */ - /* USER CODE END ADCOversampingCallback */ -} - -static void ADC0_Init(void) -{ - HAL_CRG_IpEnableSet(ADC0_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(ADC0_BASE, CRG_ADC_CLK_ASYN_PLL_DIV); - HAL_CRG_IpClkDivSet(ADC0_BASE, CRG_ADC_DIV_2); - - g_adc.baseAddress = ADC0; - g_adc.socPriority = ADC_PRIMODE_ALL_ROUND; - - HAL_ADC_Init(&g_adc); /* adc initialization */ - - SOC_Param socParam = {0}; - socParam.adcInput = ADC_CH_ADCINA2; /* PIN47(ADC AIN2) */ - socParam.sampleTotalTime = ADC_SOCSAMPLE_5CLK; /* adc sample total time 5 adc_clk */ - socParam.trigSource = ADC_TRIGSOC_SOFT; - socParam.continueMode = BASE_CFG_DISABLE; - socParam.finishMode = ADC_SOCFINISH_INT1; - HAL_ADC_ConfigureSoc(&g_adc, ADC_SOC_NUM1, &socParam); - - HAL_ADC_RegisterCallBack(&g_adc, ADC_CALLBACK_INT1, (ADC_CallbackType)ADC_Int1Finish); - HAL_ADC_RegisterCallBack(&g_adc, ADC_CALLBACK_EVENT_OVERSAMPLING, (ADC_CallbackType)ADCOversampingCallback); - - IRQ_Register(IRQ_ADC0_INT1, HAL_ADC_IrqHandlerDataB, &g_adc); - IRQ_SetPriority(IRQ_ADC0_INT1, 7); /* The priority is 7 */ - IRQ_EnableN(IRQ_ADC0_INT1); - IRQ_Register(IRQ_ADC0_EVENT, HAL_ADC_IrqHandlerAllEvent, &g_adc); - IRQ_SetPriority(IRQ_ADC0_EVENT, 6); /* The priority is 6 */ - IRQ_EnableN(IRQ_ADC0_EVENT); -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - - g_uart0.baseAddress = UART0; /* uart address */ - /* UART parameter settings */ - g_uart0.baudRate = UART0_BAND_RATE; /* uart baud rate */ - g_uart0.dataLength = UART_DATALENGTH_8BIT; /* uart datalength */ - g_uart0.stopBits = UART_STOPBITS_ONE; /* uart stop bit */ - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; - g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; - g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; - g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart0); /* uart initialization */ -} - -static void IOConfig(void) -{ - SYSCTRL0->SC_SYS_STAT.BIT.update_mode = 0; - SYSCTRL0->SC_SYS_STAT.BIT.update_mode_clear = 1; - HAL_IOCMG_SetPinAltFuncMode(GPIO0_5_AS_ADC_AIN2); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO0_5_AS_ADC_AIN2, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO0_5_AS_ADC_AIN2, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO0_5_AS_ADC_AIN2, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO0_5_AS_ADC_AIN2, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - ADC0_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_with_ppb/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_with_ppb/readme.md deleted file mode 100644 index a83d0ef52..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_with_ppb/readme.md +++ /dev/null @@ -1,20 +0,0 @@ -# ADC的后处理功能 -## 关键字: ADC, 误差计算,阈值检测 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、中断和ADC控制器初始化和功能配置。ADC的后处理功能,当ADC完成一次普通的采样完成后,对于采样结果进行处理操作。 -+ 误差计算功能:设置一个参考值,采样结束后,自动计算出参考值和采样结果的差值,并保存在寄存器中。 -+ 阈值检测功能:设置阈值的上下限,当参考值和采样结果的差值大于上阈值或者小于下阈值,会产生中断。 - -**【示例配置】** -+ ADC触发源:软件触发。使用接口"HAL_ADC_SoftTrigSample()”启动软件触发。示例中一个触发了三次,第一次触发读出普通的采样结果;设置后处理参数,第二次触发进行后处理功能;修改后处理参数,第三次触发再次进行后处理功能。 - -+ ADC采样源:挂载到SOC1部采样源。SOC可以配置为“ADC_SOC_NUM0~ADC_SOC_NUM15”中任意一个。 - -+ ADC采样结果:在过采样的中断中读出过采样的结果。每次触发产生的采样结果均产生一个数据完成中断,在中断回调函数中使用“HAL_ADC_GetConvResult()”进行读取。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成,软件触发。第一次触发采样结束后,只打印出ADC的采样结果。后两次触发,按照后处理参数的配置和当前采样结果,触发不同的后处理中断,然后在中断回调函数中打印相应的字符串。 - -**【注意事项】** -+ 示例代码使用UART0进行结果打印输出,需要对UART0进行初始化配置。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_with_ppb/src/sample_adc_single_with_ppb.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_with_ppb/src/sample_adc_single_with_ppb.c deleted file mode 100644 index da275761f..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_with_ppb/src/sample_adc_single_with_ppb.c +++ /dev/null @@ -1,131 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_adc_single_with_ppb.c - * @author MCU Driver Team - * @brief adc sample module. - * @details In the post-processing example of the ADC, there is the normal trigger sampling function and four - * post-processing functions: error calculation, upper threshold detection, lower threshold detection, - * and zero-crossing detection. - */ -#include "sample_adc_single_with_ppb.h" - -void ADC_PPB1Error(void *handle); -void ADC_PPB1Up(void *handle); -void ADC_PPB1Down(void *handle); -void ADC_PPB1Zero(void *handle); -/** - * @brief User callback function of ADC interrupt one. - * @param handle ADC handle. - * @retval None. - */ -void ADC_Int1Finish(ADC_Handle *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("ADC_Int1Finish\r\n"); - unsigned int ret = HAL_ADC_GetConvResult(&g_adc, ADC_SOC_NUM1); - DBG_PRINTF("result: %d\r\n", ret); - float voltage = (float)ret / (float)4096 * 3.3; /* 4096 and 3.3 are for Sample Value Conversion */ - DBG_PRINTF("voltage: %f\r\n", voltage); -} - -/** - * @brief User callback function of ADC interrupt one. - * @param handle ADC handle. - * @retval None. - */ -void ADC_PPB1Error(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("ADC_PPB1Error: Calculation error completed, errorRef - result\r\n"); - int ret = HAL_ADC_GetPPBxErrorResultEx(&g_adc, ADC_PPB_NUM1); /* Obtain the error value */ - DBG_PRINTF("ErrorResultEx: %d\r\n", ret); - unsigned int delay = HAL_ADC_GetPPBxDelayCntEx(&g_adc, ADC_PPB_NUM1); - DBG_PRINTF("delay: %d\r\n", delay); -} - -/** - * @brief User callback function of ADC interrupt one. - * @param handle ADC handle. - * @retval None. - */ -void ADC_PPB1Up(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("ADC_PPB1Up: The PPB upper threshold overflows\r\n"); -} - -/** - * @brief User callback function of ADC interrupt one. - * @param handle ADC handle. - * @retval None. - */ -void ADC_PPB1Down(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("ADC_PPB1Down: The PPB down threshold overflows\r\n"); -} - -/** - * @brief User callback function of ADC interrupt one. - * @param handle ADC handle. - * @retval None. - */ -void ADC_PPB1Zero(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("ADC_PPB1Zero\r\n"); -} - -/** - * @brief ADC single channel sample with interrupt. Each channel independently generate an interrupt. - * @param None. - * @retval None. - */ -void ADC_SingleTriggerItWithPPB(void) -{ - SystemInit(); - DBG_PRINTF("ADC_SingleTriggerItWithPPB begin\r\n"); - HAL_ADC_RegisterCallBack(&g_adc, ADC_CALLBACK_EVENT_PPB1_ERROR, ADC_PPB1Error); - HAL_ADC_RegisterCallBack(&g_adc, ADC_CALLBACK_EVENT_PPB1_UP, ADC_PPB1Up); - HAL_ADC_RegisterCallBack(&g_adc, ADC_CALLBACK_EVENT_PPB1_DOWN, ADC_PPB1Down); - HAL_ADC_RegisterCallBack(&g_adc, ADC_CALLBACK_EVENT_PPB1_ZERO, ADC_PPB1Zero); - HAL_ADC_StartIt(&g_adc); - HAL_ADC_SoftTrigSample(&g_adc, ADC_SOC_NUM1); /* Software trigger ADC sampling */ - - BASE_FUNC_DELAY_S(1); /* After the delay is 1s, the PPB is enabled for re-sampling */ - DBG_PRINTF("\r\nPPB1 Setting offset: -2000; errorRef: 100; threshold: < -10 or > 10\r\n"); - PPB_Function ppbfun = {0}; - ppbfun.offset = BASE_CFG_ENABLE; /* Using the Offset Calculation Function */ - ppbfun.detect = BASE_CFG_ENABLE; /* Use the threshold detection function for offset calculation results */ - ppbfun.delay = BASE_CFG_ENABLE; /* Enable the sampling delay recording function */ - HAL_ADC_ConfigurePPBxEx(&g_adc, ADC_SOC_NUM1, ADC_PPB_NUM1, &ppbfun); - - /* Sets -2000 as the offset value. The original result and offset result are summed up */ - HAL_ADC_SetPPBxOffsetEx(&g_adc, ADC_PPB_NUM1, -2000); - /* Set 100 as the error reference value. Error reference value minus offset calculation data */ - HAL_ADC_SetPPBxErrorRefEx(&g_adc, ADC_PPB_NUM1, 100); - /* Setting Comparison Thresholds 10 and -10. Check data that error reference value minus offset calculation data */ - HAL_ADC_SetPPBxThresholdEx(&g_adc, ADC_PPB_NUM1, 10, -10); - HAL_ADC_EnablePPBxEventIntEx(&g_adc); - HAL_ADC_SoftTrigSample(&g_adc, ADC_SOC_NUM1); /* Software trigger ADC sampling */ - - BASE_FUNC_DELAY_S(1); /* After the delay is 1s, the PPB is enabled for re-sampling */ - DBG_PRINTF("\r\nPPB1 Setting offset: -2000; errorRef: 40; threshold: < -10 or > 10\r\n"); - HAL_ADC_SetPPBxErrorRefEx(&g_adc, ADC_PPB_NUM1, 40); /* Set 40 as the error reference value */ - HAL_ADC_SoftTrigSample(&g_adc, ADC_SOC_NUM1); /* Software trigger ADC sampling */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample/inc/sample_adc_sync_sample.h b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample/inc/sample_adc_sync_sample.h deleted file mode 100644 index 3bb03221c..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample/inc/sample_adc_sync_sample.h +++ /dev/null @@ -1,32 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_adc_sync_sample.h - * @author MCU Driver Team - * @brief adc sample module. - * @details This file provides users with sample code to help use ADC function: - * ADC Dual-Channel synchronous sample. - */ -#ifndef SAMPLE_ADC_SYNCSAMPLE_H -#define SAMPLE_ADC_SYNCSAMPLE_H - -#include "debug.h" -#include "adc.h" -#include "main.h" - -void ADC_SyncSample(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample/init/main.c deleted file mode 100644 index 2e9d48af3..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample/init/main.c +++ /dev/null @@ -1,35 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ -#include "feature.h" -#include "main.h" -#include "sample_adc_sync_sample.h" - -UART_Handle g_uart0; -ADC_Handle g_adc; - -int main(void) -{ - ADC_SyncSample(); - while (1) { - } - return BASE_STATUS_OK; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample/init/main.h deleted file mode 100644 index 0289e7961..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample/init/main.h +++ /dev/null @@ -1,46 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "adc.h" -#include "uart.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -extern UART_Handle g_uart0; - -extern ADC_Handle g_adc; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample/init/system_init.c deleted file mode 100644 index 771dace70..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample/init/system_init.c +++ /dev/null @@ -1,137 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void ADC1_Init(void) -{ - HAL_CRG_IpEnableSet(ADC1_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(ADC1_BASE, CRG_ADC_CLK_SELECT_PLL_DIV); - HAL_CRG_IpClkDivSet(ADC1_BASE, CRG_ADC_DIV_5); - - g_adc.baseAddress = ADC1; - g_adc.socPriority = ADC_PRIMODE_ALL_ROUND; - g_adc.vrefBuf = ADC_VREF_2P5V; - g_adc.irqNumOver = IRQ_ADC1_OVINT; - g_adc.ADC_IntxParam[0].irqNum = IRQ_ADC1_INT1; /* interrupt 0 */ - g_adc.ADC_IntxParam[1].irqNum = IRQ_ADC1_INT2; /* interrupt 1 */ - g_adc.ADC_IntxParam[2].irqNum = IRQ_ADC1_INT3; /* interrupt 2 */ - g_adc.ADC_IntxParam[3].irqNum = IRQ_ADC1_INT4; /* interrupt 3 */ - - HAL_ADC_Init(&g_adc); - - SOC_SyncParam syncParam = {0}; - syncParam.ChannelA = ADC_CH_ADCINA1; - syncParam.ChannelB = ADC_CH_ADCINB2; - syncParam.group = ADC_SYNCSAMPLE_GROUP_1; - - syncParam.sampleHoldTime = 2; /* adc sample holed time 2 adc_clk */ - syncParam.sampleTotalTime = 127; /* adc sample total time 127 adc_clk */ - syncParam.softTrigSource = ADC_TRIGSOC_SOFT; - syncParam.intTrigSource = ADC_TRIGSOC_NONEINT; - syncParam.periphTrigSource = ADC_TRIGSOC_NONEPERIPH; - syncParam.finishMode = ADC_SOCFINISH_NONE; - HAL_ADC_StartSyncSample(&g_adc, &syncParam); -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); - - g_uart0.baseAddress = UART0; - g_uart0.irqNum = IRQ_UART0; - - g_uart0.baudRate = UART0_BAND_RATE; - g_uart0.dataLength = UART_DATALENGTH_8BIT; - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; - g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart0); -} - -static void IOConfig(void) -{ - IOConfig_RegStruct *iconfig = IOCONFIG; - - iconfig->iocmg_21.BIT.func = 0x8; /* 0x8 is ADC1_ANA_A1 */ - iconfig->iocmg_21.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_21.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_21.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_21.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_21.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_23.BIT.func = 0x8; /* 0x8 is ADC1_ANA_B2 */ - iconfig->iocmg_23.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_23.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_23.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_23.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_23.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ - iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ - iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; -} - -void SystemInit(void) -{ - IOConfig(); - ADC1_Init(); - UART0_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample/readme.md deleted file mode 100644 index 362f110d5..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample/readme.md +++ /dev/null @@ -1,18 +0,0 @@ -# 单次触发ADC的同步采样功能,主动查询转换完成标志位读取结果 -## 关键字: ADC,同步采样,查询转换完成 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、中断和ADC控制器初始化和功能配置。ADC在同步采样模式下,使用软件触发ADC两条通路同步同时采样,触发采样后软件判断ADC转换完成后,如果转换完成则读取结果。 - -**【示例配置】** -+ ADC触发源:软件。使用接口”HAL_ADC_SoftTrigMultiSample()”完成软件同时触发。同步采样,要求两条采样通路触发源一致。 - -+ ADC采样源: 挂载到SOC0和SOC1的外部采样源。SOC的在文件“system_init.c”中配置,同步采样模式选择的SOC0和SOC1,它们的配置由"SystemInit()”接口中的"ADC_SYNCSAMPLE_GROUP_1"决定,ADC_SYNCSAMPLE_GROUP_1对应的两个SOC为SOC0和SOC1,可以配置为(ADC_SYNCSAMPLE_GROUP_1~8)。 - -+ ADC采样结果:自行判断转换完成后,再读取结果。使用接口“HAL_ADC_CheckSocFinish()”判断是否转换完成,返回值OK表示转换结束,再使用“HAL_ADC_GetConvResult()”接口,分别读取两路采样结果。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成,软件触发后,ADC进行单次采样转换。等待5ms后检查ADC采样结是否转换完成,若转换完成串口依次打印出两条通路的采样结果,若采样未完成打印未完成提示字符串。 - -**【注意事项】** -+ 示例代码使用UART0进行结果打印输出,需要对UART0配置。 diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample/src/sample_adc_sync_sample.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample/src/sample_adc_sync_sample.c deleted file mode 100644 index 09c441120..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample/src/sample_adc_sync_sample.c +++ /dev/null @@ -1,63 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_adc_sync_sample.c - * @author MCU Driver Team - * @brief adc sample module. - * @details In synchronous sampling mode, the ADC uses software to trigger simultaneous sampling of the two ADC - * channels. After sampling is triggered, the ADC determines that the ADC conversion is complete and reads - * the result ADC Dual-Channel synchronous sample, the trigger sources of the two channels must be the same. - * (1) ADC strigger source is software. Use HAL_ADC_SoftTrigMultiSample() to configure software tirgger SOC0 - * and SOC1. - * (2) ADC sample source is ADC1_SOC0 and ADC1_SOC1. Select sample source in "g_adc.baseAddress" of - * SystemInit(), SOC0 and SOC1 are determined by the ADC_SYNCSAMPLE_GROUP_1 in SystemInit(). - * (3) The ADC conversion result is read from HAL_ADC_GetConvResult(). - * After the conversion is complete, use HAL_ADC_GetConvResult() to obtain result. - * Check whether the ADC conversion is complete through the HAL_ADC_CheckSocFinish() interface. - */ - -#include "sample_adc_sync_sample.h" - -/** - * @brief ADC Dual-Channel synchronous sample. - * @param None. - * @retval None. - */ -void ADC_SyncSample(void) -{ - SystemInit(); - DBG_PRINTF("ADC_SyncSample begin\r\n"); - - ADC_SoftMultiTrig softTrig = {0}; - softTrig.BIT.trigSoc0 = BASE_CFG_ENABLE; - softTrig.BIT.trigSoc1 = BASE_CFG_ENABLE; - HAL_ADC_SoftTrigMultiSample(&g_adc, softTrig); /* Trigger both SOC0 and SOC1 */ - - BASE_FUNC_DELAY_MS(5); /* delay 5 ms */ - if (HAL_ADC_CheckSocFinish(&g_adc, ADC_SOC_NUM0) == BASE_STATUS_ERROR) { - DBG_PRINTF("SOC0 did not complete sampling and conversion\r\n"); - return; - } - if (HAL_ADC_CheckSocFinish(&g_adc, ADC_SOC_NUM1) == BASE_STATUS_ERROR) { - DBG_PRINTF("SOC1 did not complete sampling and conversion\r\n"); - return; - } - /* Read sampling results */ - unsigned ret1 = HAL_ADC_GetConvResult(&g_adc, ADC_SOC_NUM0); - unsigned ret2 = HAL_ADC_GetConvResult(&g_adc, ADC_SOC_NUM1); - DBG_PRINTF("ret1: %x, ret2: %x\r\n", ret1, ret2); -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_dma/inc/sample_adc_sync_sample_dma.h b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_dma/inc/sample_adc_sync_sample_dma.h deleted file mode 100644 index 1de3c7ec6..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_dma/inc/sample_adc_sync_sample_dma.h +++ /dev/null @@ -1,32 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_adc_sync_sample_dma.h - * @author MCU Driver Team - * @brief adc sample module. - * @details This file provides users with sample code to help use ADC function: - * ADC Dual-Channel synchronous sample with dma. - */ -#ifndef SAMPLE_ADC_SYNCSAMPLE_DMA_H -#define SAMPLE_ADC_SYNCSAMPLE_DMA_H - -#include "debug.h" -#include "adc.h" -#include "main.h" - -void ADC_SyncSampleWithDma(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_dma/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_dma/init/main.c deleted file mode 100644 index ff3aa96f3..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_dma/init/main.c +++ /dev/null @@ -1,37 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ -#include "feature.h" -#include "main.h" -#include "sample_adc_sync_sample_dma.h" - -UART_Handle g_uart0; -ADC_Handle g_adc; - -DMA_Handle g_dmac; - -int main(void) -{ - ADC_SyncSampleWithDma(); - while (1) { - } - return BASE_STATUS_OK; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_dma/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_dma/init/main.h deleted file mode 100644 index afd1d3e69..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_dma/init/main.h +++ /dev/null @@ -1,51 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "adc.h" -#include "uart.h" -#include "crg.h" -#include "dma.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -extern UART_Handle g_uart0; - -extern ADC_Handle g_adc; - -extern DMA_Handle g_dmac; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -void ADC_SyncIntCallBack(ADC_Handle *handle); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_dma/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_dma/init/system_init.c deleted file mode 100644 index 21a1083a4..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_dma/init/system_init.c +++ /dev/null @@ -1,180 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void DMA_Channel1Init(void *handle) -{ - DMA_ChannelParam dma_param; - dma_param.direction = DMA_PERIPH_TO_MEMORY_BY_DMAC; /* DMA transmission direction */ - dma_param.srcAddrInc = DMA_ADDR_INCREASE; - dma_param.destAddrInc = DMA_ADDR_INCREASE; - dma_param.srcPeriph = DMA_REQUEST_ADC1; /* ADC as DMA Request Source */ - dma_param.destPeriph = DMA_REQUEST_MEM; - dma_param.srcWidth = DMA_TRANSWIDTH_WORD; - dma_param.destWidth = DMA_TRANSWIDTH_WORD; - dma_param.srcBurst = DMA_BURST_LENGTH_16; - dma_param.destBurst = DMA_BURST_LENGTH_16; - dma_param.pHandle = handle; - HAL_DMA_InitChannel(&g_dmac, &dma_param, DMA_CHANNEL_ONE); /* Initializing the DMA Channel */ -} - -static void DMA_Init(void) -{ - g_dmac.baseAddress = DMA; - g_dmac.srcByteOrder = DMA_BYTEORDER_SMALLENDIAN; - g_dmac.destByteOrder = DMA_BYTEORDER_SMALLENDIAN; - g_dmac.irqNumTc = IRQ_DMA_TC; - g_dmac.irqNumError = IRQ_DMA_ERR; - HAL_DMA_IRQService(&g_dmac); - IRQ_EnableN(IRQ_DMA_TC); - IRQ_EnableN(IRQ_DMA_ERR); - HAL_DMA_Init(&g_dmac); /* Initializing the DMA controller */ - - DMA_Channel1Init((void *)(&g_adc)); -} - -__weak void ADC_SyncIntCallBack(ADC_Handle *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN ADC_SyncIntCallBack */ - /* USER CODE END ADC_SyncIntCallBack */ -} - -static void ADC1_Init(void) -{ - HAL_CRG_IpEnableSet(ADC1_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(ADC1_BASE, CRG_ADC_CLK_SELECT_PLL_DIV); - HAL_CRG_IpClkDivSet(ADC1_BASE, CRG_ADC_DIV_5); - - g_adc.baseAddress = ADC1; - g_adc.socPriority = ADC_PRIMODE_ALL_ROUND; - g_adc.vrefBuf = ADC_VREF_2P5V; - g_adc.irqNumOver = IRQ_ADC1_OVINT; - g_adc.ADC_IntxParam[0].irqNum = IRQ_ADC1_INT1; /* interrupt 0 */ - g_adc.ADC_IntxParam[1].irqNum = IRQ_ADC1_INT2; /* interrupt 1 */ - g_adc.ADC_IntxParam[2].irqNum = IRQ_ADC1_INT3; /* interrupt 2 */ - g_adc.ADC_IntxParam[3].irqNum = IRQ_ADC1_INT4; /* interrupt 3 */ - - g_adc.dmaHandle = &g_dmac; - g_adc.adcDmaChn = 1; /* DMA Channel 1 */ - HAL_ADC_RegisterCallBack(&g_adc, ADC_CALLBACK_DMA, ADC_SyncIntCallBack); - - HAL_ADC_Init(&g_adc); - - SOC_SyncParam syncParam = {0}; - syncParam.ChannelA = ADC_CH_ADCINA1; - syncParam.ChannelB = ADC_CH_ADCINB3; - syncParam.group = ADC_SYNCSAMPLE_GROUP_3; - - syncParam.sampleHoldTime = 2; /* adc sample holed time 2 adc_clk */ - syncParam.sampleTotalTime = 127; /* adc sample total time 127 adc_clk */ - syncParam.softTrigSource = ADC_TRIGSOC_SOFT; - syncParam.intTrigSource = ADC_TRIGSOC_NONEINT; - syncParam.periphTrigSource = ADC_TRIGSOC_NONEPERIPH; - syncParam.finishMode = ADC_SOCFINISH_DMA; - HAL_ADC_StartSyncSample(&g_adc, &syncParam); -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); - - g_uart0.baseAddress = UART0; - g_uart0.irqNum = IRQ_UART0; - - g_uart0.baudRate = UART0_BAND_RATE; - g_uart0.dataLength = UART_DATALENGTH_8BIT; - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; - g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart0); -} - -static void IOConfig(void) -{ - IOConfig_RegStruct *iconfig = IOCONFIG; - - iconfig->iocmg_21.BIT.func = 0x8; /* 0x8 is ADC1_ANA_A1 */ - iconfig->iocmg_21.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_21.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_21.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_21.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_21.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_18.BIT.func = 0x8; /* 0x8 is ADC1_ANA_B3 */ - iconfig->iocmg_18.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_18.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_18.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_18.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_18.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ - iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ - iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; -} - -void SystemInit(void) -{ - IOConfig(); - DMA_Init(); - ADC1_Init(); - UART0_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_dma/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_dma/readme.md deleted file mode 100644 index 302614278..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_dma/readme.md +++ /dev/null @@ -1,18 +0,0 @@ -# 单次触发ADC的同步采样功能,采样结束使用DMA搬运结果 -## 关键字: ADC,同步采样,DMA搬运 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、中断和ADC控制器初始化和功能配置。ADC在同步采样模式下,使用软件触发ADC两条通路同步同时采样,采样结束后触发DMA搬运结果。 - -**【示例配置】** -+ ADC触发源:软件。使用接口”HAL_ADC_SoftTrigMultiSample()”完成软件同时触发。同步采样,要求两条采样通路触发源一致。 - -+ ADC采样源: 挂载到SOC4和SOC5的外部采样源。SOC的在文件“system_init.c”中配置,同步采样模式选择的SOC4和SOC5,它们的配置由"SystemInit()”接口中的"ADC_SYNCSAMPLE_GROUP_3"决定,ADC_SYNCSAMPLE_GROUP_3对应的两个SOC为SOC4和SOC5,可以配置为(ADC_SYNCSAMPLE_GROUP_1~8)。 - -+ ADC采样结果:DMA完成的回调函数中读取结果。DMA配置请见"SystemInit()”。示例代码中,提前开辟了保存ADC采样结果的内存,DMA搬运结束后,直接从内存读取结果。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码中会对ADC进行软件触发采样,采样完成触发DMA搬运数据。在完成对ADC采样结果搬运后,会产生中断告知用户,在ADC的DMA完成搬运的中断回调函数中,从预设置的内存中读出DMA的搬运结果,利用串口输出对结果进行打印。 - -**【注意事项】** -+ 示例代码使用UART0进行结果打印输出,需要对UART0配置。 diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_dma/src/sample_adc_sync_sample_dma.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_dma/src/sample_adc_sync_sample_dma.c deleted file mode 100644 index 3c747efbb..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_dma/src/sample_adc_sync_sample_dma.c +++ /dev/null @@ -1,62 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_adc_sync_sample_dma.c - * @author MCU Driver Team - * @brief adc sample module. - * @details This file provides users with sample code to help use ADC function: - * ADC Dual-Channel synchronous sample, the trigger sources of the two channels must be the same. - * (1) ADC strigger source is software. Use HAL_ADC_SoftTrigMultiSample() to configure software tirgger SOC4 - * and SOC5. - * (2) ADC sample source is ADC1_SOC4 and ADC1_SOC5. Select sample source in "g_adc.baseAddress" of -* SystemInit(), SOC4 and SOC5 are determined by the ADC_SYNCSAMPLE_GROUP_3 in SystemInit(). - * (3) The ADC conversion result is read from DMA interrupt callback function ADC_SyncIntCallBack(). - */ -#include "sample_adc_sync_sample_dma.h" -static unsigned int g_ret[10] = {0}; - -/** - * @brief User callback function of interrupt. - * @param adcHandle ADC handle. - * @retval None. - */ -void ADC_SyncIntCallBack(ADC_Handle *adcHandle) -{ - BASE_FUNC_UNUSED(adcHandle); - DBG_PRINTF("ADC_SyncIntCallBack\r\n"); - unsigned ret1 = HAL_ADC_GetConvResult(&g_adc, ADC_SOC_NUM4); - unsigned ret2 = HAL_ADC_GetConvResult(&g_adc, ADC_SOC_NUM5); - /* Compare the DMA transfer result with the result in the register */ - DBG_PRINTF("ret1: %x, ret2: %x\r\n", ret1, ret2); - DBG_PRINTF("g_ret1: %x, g_ret2: %x\r\n", g_ret[0], g_ret[1]); -} - -/** - * @brief ADC Dual-Channel synchronous sample with dma. - * @param None. - * @retval None. - */ -void ADC_SyncSampleWithDma(void) -{ - SystemInit(); - DBG_PRINTF("ADC_SyncSampleWithDma begin\r\n"); - HAL_ADC_StartDma(&g_adc, ADC_SOC_NUM4, ADC_SOC_NUM5, g_ret); - ADC_SoftMultiTrig softTrig = {0}; - softTrig.BIT.trigSoc4 = BASE_CFG_ENABLE; /* Group3 -- Synchronous sample group: SOC4 and SOC5 */ - softTrig.BIT.trigSoc5 = BASE_CFG_ENABLE; - HAL_ADC_SoftTrigMultiSample(&g_adc, softTrig); /* Trigger both SOC4 and SOC5 */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_it/inc/sample_adc_sync_sample_it.h b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_it/inc/sample_adc_sync_sample_it.h deleted file mode 100644 index d80612d02..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_it/inc/sample_adc_sync_sample_it.h +++ /dev/null @@ -1,32 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_adc_sync_sample_it.h - * @author MCU Driver Team - * @brief adc sample module. - * @details This file provides users with sample code to help use ADC function: - * ADC Dual-Channel synchronous sample with dma. - */ -#ifndef SAMPLE_ADC_SYNCSAMPLE_IT_H -#define SAMPLE_ADC_SYNCSAMPLE_IT_H - -#include "debug.h" -#include "adc.h" -#include "main.h" - -void ADC_SyncSampleWithIt(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_it/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_it/init/main.c deleted file mode 100644 index 29a258f09..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_it/init/main.c +++ /dev/null @@ -1,35 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ -#include "feature.h" -#include "main.h" -#include "sample_adc_sync_sample_it.h" - -UART_Handle g_uart0; -ADC_Handle g_adc; - -int main(void) -{ - ADC_SyncSampleWithIt(); - while (1) { - } - return BASE_STATUS_OK; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_it/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_it/init/main.h deleted file mode 100644 index e9be60344..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_it/init/main.h +++ /dev/null @@ -1,48 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "adc.h" -#include "uart.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -extern UART_Handle g_uart0; - -extern ADC_Handle g_adc; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -void ADC1Interrupt4Callback(ADC_Handle *handle); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_it/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_it/init/system_init.c deleted file mode 100644 index e62df67d0..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_it/init/system_init.c +++ /dev/null @@ -1,142 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -__weak void ADC1Interrupt4Callback(ADC_Handle *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN ADC1Interrupt4Callback */ - /* USER CODE END ADC1Interrupt4Callback */ -} - -static void ADC1_Init(void) -{ - HAL_CRG_IpEnableSet(ADC1_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(ADC1_BASE, CRG_ADC_CLK_SELECT_PLL_DIV); - HAL_CRG_IpClkDivSet(ADC1_BASE, CRG_ADC_DIV_5); - - g_adc.baseAddress = ADC1; - g_adc.socPriority = ADC_PRIMODE_ALL_PRIORITY; - g_adc.vrefBuf = ADC_VREF_2P5V; - g_adc.irqNumOver = IRQ_ADC1_OVINT; - g_adc.ADC_IntxParam[0].irqNum = IRQ_ADC1_INT1; /* interrupt 0 */ - g_adc.ADC_IntxParam[1].irqNum = IRQ_ADC1_INT2; /* interrupt 1 */ - g_adc.ADC_IntxParam[2].irqNum = IRQ_ADC1_INT3; /* interrupt 2 */ - g_adc.ADC_IntxParam[3].irqNum = IRQ_ADC1_INT4; /* interrupt 3 */ - - HAL_ADC_Init(&g_adc); - - SOC_SyncParam syncParam = {0}; - syncParam.ChannelA = ADC_CH_ADCINA1; - syncParam.ChannelB = ADC_CH_ADCINB1; - syncParam.group = ADC_SYNCSAMPLE_GROUP_3; - - syncParam.sampleHoldTime = 2; /* adc sample holed time 2 adc_clk */ - syncParam.sampleTotalTime = 127; /* adc sample total time 127 adc_clk */ - syncParam.softTrigSource = ADC_TRIGSOC_SOFT; - syncParam.intTrigSource = ADC_TRIGSOC_NONEINT; - syncParam.periphTrigSource = ADC_TRIGSOC_NONEPERIPH; - syncParam.finishMode = ADC_SOCFINISH_INT4; - HAL_ADC_StartSyncSample(&g_adc, &syncParam); - - HAL_ADC_RegisterCallBack(&g_adc, ADC_CALLBACK_INT4, ADC1Interrupt4Callback); - IRQ_SetPriority(IRQ_ADC1_INT4, 1); - IRQ_EnableN(IRQ_ADC1_INT4); - HAL_ADC_IrqService(&g_adc); -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); - - g_uart0.baseAddress = UART0; - g_uart0.irqNum = IRQ_UART0; - - g_uart0.baudRate = UART0_BAND_RATE; - g_uart0.dataLength = UART_DATALENGTH_8BIT; - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; - g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart0); -} - -static void IOConfig(void) -{ - IOConfig_RegStruct *iconfig = IOCONFIG; - - iconfig->iocmg_21.BIT.func = 0x8; /* 0x8 is ADC1_ANA_A1 */ - iconfig->iocmg_21.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_21.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_21.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_21.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_21.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ - iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ - iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - ADC1_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_it/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_it/readme.md deleted file mode 100644 index 82b32cbbc..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_it/readme.md +++ /dev/null @@ -1,18 +0,0 @@ -# 单次触发ADC的同步采样功能,中断回调函数中读取结果 -## 关键字: ADC,同步采样,中断 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、中断和ADC控制器初始化和功能配置。ADC在同步采样模式下,使用软件触发ADC两条通路同步同时采样,采样结束后触发ADC中断,并在中断回调函数中读取ADC转换结果。 - -**【示例配置】** -+ ADC触发源:软件。使用接口”HAL_ADC_SoftTrigMultiSample()”完成软件同时触发。同步采样,要求两条采样通路触发源一致。 - -+ ADC采样源: 挂载到SOC4和SOC5的外部采样源。SOC的在文件“system_init.c”中配置,同步采样模式选择的SOC4和SOC5,它们的配置由"SystemInit()”接口中的"ADC_SYNCSAMPLE_GROUP_3"决定,ADC_SYNCSAMPLE_GROUP_3对应的两个SOC为SOC4和SOC5,可以配置为(ADC_SYNCSAMPLE_GROUP_1~8)。 - -+ ADC采样结果:ADC中断回调函数中读取结果。ADC可以选择4个数据完成中断的任一个,配置请见"System_Init()”。在回调函数中调用“HAL_ADC_GetConvResult()”获取结果。同步采样功能中,当两条通路采样完成时,触发中断。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成,软件触发后,ADC进行单次采样转换。两条通路都采样成功后,在中断回调函数中会通过串口打印读取到的ADC采样结果。 - -**【注意事项】** -+ 示例代码使用UART0进行结果打印输出,需要对UART0配置。 diff --git a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_it/src/sample_adc_sync_sample_it.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_it/src/sample_adc_sync_sample_it.c deleted file mode 100644 index 0a7320dba..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_it/src/sample_adc_sync_sample_it.c +++ /dev/null @@ -1,58 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_adc_sync_sample_it.c - * @author MCU Driver Team - * @brief adc sample module. - * @details In synchronous sampling mode, software triggers simultaneous sampling of the two ADC channels. After - * sampling, an ADC interrupt is triggered and conversion result is read in the interrupt callback function. - * (1) ADC strigger source is software. Use HAL_ADC_SoftTrigMultiSample() to configure software tirgger SOC4 - * and SOC5. - * (2) ADC sample source is ADC1_SOC4 and ADC1_SOC5. Select sample source in "g_adc.baseAddress" of - * SystemInit(), SOC4 and SOC5 are determined by the ADC_SYNCSAMPLE_GROUP_3 in SystemInit(). - * (3) The ADC conversion result is read from ADC interrupt callback function ADC1Interrupt4Callback(). - */ -#include "sample_adc_sync_sample_it.h" - -/** - * @brief User callback function of ADC interrupt one. - * @param adcHandle ADC handle. - * @retval None. - */ -void ADC1Interrupt4Callback(ADC_Handle *adcHandle) -{ - BASE_FUNC_UNUSED(adcHandle); - DBG_PRINTF("ADC1Interrupt4Callback\r\n"); /* ADC Synchronous Sampling Complete */ - unsigned ret1 = HAL_ADC_GetConvResult(&g_adc, ADC_SOC_NUM4); - unsigned ret2 = HAL_ADC_GetConvResult(&g_adc, ADC_SOC_NUM5); - DBG_PRINTF("ret1: %x, ret2: %x\r\n", ret1, ret2); -} - -/** - * @brief ADC Dual-Channel synchronous sample with interrupt. - * @param None. - * @retval None. - */ -void ADC_SyncSampleWithIt(void) -{ - SystemInit(); - DBG_PRINTF("ADC_SyncSampleWithIt begin\r\n"); - ADC_SoftMultiTrig softTrig = {0}; - softTrig.BIT.trigSoc4 = BASE_CFG_ENABLE; /* Group3 -- Synchronous sample group: SOC4 and SOC5 */ - softTrig.BIT.trigSoc5 = BASE_CFG_ENABLE; - HAL_ADC_SoftTrigMultiSample(&g_adc, softTrig); /* Trigger both SOC4 and SOC5 */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/dac/sample_dac/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/dac/sample_dac/init/main.c deleted file mode 100644 index 263921187..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/dac/sample_dac/init/main.c +++ /dev/null @@ -1,33 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ -#include "feature.h" -#include "main.h" - -DAC_Handle g_dac; - -int main(void) -{ - SystemInit(); - while (1) { - } - return BASE_STATUS_OK; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/dac/sample_dac/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/dac/sample_dac/init/main.h deleted file mode 100644 index fbb529b7a..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/dac/sample_dac/init/main.h +++ /dev/null @@ -1,43 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "dac.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -extern DAC_Handle g_dac; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/dac/sample_dac/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/dac/sample_dac/init/system_init.c deleted file mode 100644 index 8769cd02f..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/dac/sample_dac/init/system_init.c +++ /dev/null @@ -1,70 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void DAC0_Init(void) -{ - g_dac.baseAddress = DAC0_BASE; /* DAC0 base address */ - g_dac.dacEn = BASE_CFG_ENABLE; - g_dac.dacValue = 128; /* 128: output 1.65v at 3.3v power supply */ - g_dac.dacTstModeEn = BASE_CFG_DISABLE; - HAL_DAC_Init(&g_dac); -} - -static void IOConfig(void) -{ - IOConfig_RegStruct *iconfig = IOCONFIG; - - iconfig->iocmg_33.BIT.func = 0x8; /* 0x8 is DAC0_ANA_OUT */ - iconfig->iocmg_33.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_33.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_33.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_33.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_33.BIT.se = BASE_CFG_DISABLE; -} - -void SystemInit(void) -{ - IOConfig(); - DAC0_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/dac/sample_dac/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/dac/sample_dac/readme.md deleted file mode 100644 index 4c0942b31..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/dac/sample_dac/readme.md +++ /dev/null @@ -1,18 +0,0 @@ -# 数模转换-将数字信号转换成对应的模拟电压量 -## 关键字: DAC, 数模转换 - -**【功能描述】** -+ 将软件配置的8bit数字信号,转换成对应的模拟电压量,实现数字到模拟的转换,转换成的模拟信号可便于模拟运算。 - -**【示例配置】** -+ DAC输出的模拟电压期望值为: V = ( DAC.value * ( VDDA – VSSA )) / 256。 - -+ 本示例中DAC.value的值为128,其值可在DAC模块的配置界面中进行更改,可以在“system_init.c”文件中进行更改,以满足输出不同的电压值。 - -**【示例效果】** -+ 输出的电压值可配置,在IOCMG_33可测量到DAC的输出值,默认值为1.55V。 - -**【注意事项】** -+ DAC.value的配置范围为0-255,超出部分将溢出。 - -+ 转速速率为300kHz。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer/inc/sample_dma_list_transfer.h b/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer/inc/sample_dma_list_transfer.h deleted file mode 100644 index 409b72414..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer/inc/sample_dma_list_transfer.h +++ /dev/null @@ -1,32 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_dma_list_transfer.h - * @author MCU Driver Team - * @brief dma sample module. - * @details This file provides sample code for users to help use - * the data transfer function of the dma. - */ -#ifndef SAMPLE_DMA_LIST_TRANSFER_H -#define SAMPLE_DMA_LIST_TRANSFER_H - -#include "dma.h" -#include "debug.h" -#include "interrupt.h" - -int DMA_MemoryToMemoryList(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer/readme.md deleted file mode 100644 index 7a4adb3ea..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer/readme.md +++ /dev/null @@ -1,18 +0,0 @@ -# 配置DMA链式传输功能,中断回调中读取搬运结果 -## 关键字: DMA, 链式传输, 中断 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、中断和DMA控制器初始化和功能配置。DMA链式传输,从内存搬运到内存,链式传输中内存地址可以不连续,DMA搬运结束后触发DMA中断,在中断回调函数中读取搬运后的结果。 - -**【示例配置】** -+ 对于“HAL_DMA_InitNewNode()”创建链表节点,设置源地址和目标地址及搬运长度。 - -+ 使用“HAL_DMA_ListAddNode()”接口,将每一个不连续内存进行连接。 - -+ 将第一个内存块的地址和选择的DMA传输通道作为入参传递至“HAL_DMA_StartListTransfer()”,使能DMA传递。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成后。DMA搬运结束后,会上报中断,在中断回调函数中查看源目端数据是否一致。 - -**【注意事项】** -+ NA \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer/src/sample_dma_list_transfer.c b/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer/src/sample_dma_list_transfer.c deleted file mode 100644 index 861436e6a..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer/src/sample_dma_list_transfer.c +++ /dev/null @@ -1,117 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_dma_list_transfer.c - * @author MCU Driver Team - * @brief dma sample module, scatter gather DMA. - * @details This file provides sample code for users to help use - * the data transfer function of the dma in chain transmission mode. - */ -#include "sample_dma_list_transfer.h" - -#define NUM 100 -static unsigned char g_str1[NUM] = "1234567890123456789012345678901234567890123456789012345678901234567890"; -static unsigned char g_str2[NUM] = {0}; -static unsigned char g_str3[NUM] = {0}; -static DMA_Handle g_dmac; -static DMA_ChannelParam g_param; - -/** - * @brief DMA controller initialization. - * @param None. - * @retval None. - */ -static void DMA_ControllerInit(void) -{ - g_dmac.baseAddress = DMA; - g_dmac.srcByteOrder = DMA_BYTEORDER_SMALLENDIAN; - g_dmac.destByteOrder = DMA_BYTEORDER_SMALLENDIAN; - g_dmac.irqNumTc = IRQ_DMA_TC; - g_dmac.irqNumError = IRQ_DMA_ERR; - HAL_DMA_Init(&g_dmac); -} - -/** - * @brief DMA interrupt initialization. - * @param handle DMA handle. - * @retval None. - */ -static void DMA_InterruptInit(DMA_Handle *handle) -{ - IRQ_Enable(); - handle->irqNumTc = IRQ_DMA_TC; - handle->irqNumError = IRQ_DMA_ERR; - HAL_DMA_IRQService(handle); - IRQ_EnableN(IRQ_DMA_TC); - IRQ_EnableN(IRQ_DMA_ERR); -} - -/** - * @brief User-defined callback function for completing the transfer of memory to the memory. - * @param handle callback handle. - * @retval None. - */ -static void DMA_MemToMemFinishList(void *handle) -{ - DBG_PRINTF("g_str1->g_str2 Finish!\r\n"); - DBG_PRINTF("src_memory g_str1: %s\r\n", g_str1); - DBG_PRINTF("dest_memory g_str2: %s\r\n", g_str2); - DBG_PRINTF("dest_memory g_str3: %s\r\n", g_str3); - if (handle == NULL) { - DBG_PRINTF("handle is nullptr!\r\n"); - } - BASE_FUNC_UNUSED(handle); -} - -static DMA_LinkList g_firstNode; -static DMA_LinkList g_secondNode; -/** - * @brief DMA sample code for the transfer of DMA chain transmission. - * @param None. - * @retval None. - */ -int DMA_MemoryToMemoryList(void) -{ - DBG_UartPrintInit(BAUDRATE); /* baud rate is 115200 */ - DBG_PRINTF("MemoryToMemoryList Begin: \r\n"); - DBG_PRINTF("src_memory g_str1: %s\r\n", g_str1); - DBG_PRINTF("dest_memory g_str2: %s\r\n", g_str2); - DBG_PRINTF("dest_memory g_str3: %s\r\n", g_str3); - - unsigned int channel = 2; /* select transfer channel 2 */ - DMA_ControllerInit(); - DMA_InterruptInit(&g_dmac); - HAL_DMA_RegisterCallback(&g_dmac, DMA_CHANNEL_FINISH, channel, DMA_MemToMemFinishList); - - g_param.direction = DMA_MEMORY_TO_MEMORY_BY_DMAC; - g_param.srcAddrInc = DMA_ADDR_UNALTERED; - g_param.destAddrInc = DMA_ADDR_INCREASE; - g_param.srcWidth = DMA_TRANSWIDTH_BYTE; - g_param.destWidth = DMA_TRANSWIDTH_BYTE; - g_param.srcBurst = DMA_BURST_LENGTH_1; - g_param.destBurst = DMA_BURST_LENGTH_1; - g_param.pHandle = &g_dmac; - /* The transmission length is defined as 5 */ - HAL_DMA_InitNewNode(&g_firstNode, &g_param, (uintptr_t)(void *)g_str1, (uintptr_t)(void *)g_str2, 5); - /* The transmission length is defined as 50 */ - HAL_DMA_InitNewNode(&g_secondNode, &g_param, (uintptr_t)(void *)g_str1, (uintptr_t)(void *)g_str3, 50); - - HAL_DMA_ListAddNode(&g_firstNode, &g_secondNode); - HAL_DMA_StartListTransfer(&g_dmac, &g_firstNode, channel); - DBG_PRINTF("End!\r\n"); - return 0; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer_continue/inc/sample_dma_list_transfer_continue.h b/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer_continue/inc/sample_dma_list_transfer_continue.h deleted file mode 100644 index 1268c1c3b..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer_continue/inc/sample_dma_list_transfer_continue.h +++ /dev/null @@ -1,32 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_dma_list_transfer_continue.h - * @author MCU Driver Team - * @brief Single-node continuous transmission. - * @details The DMA is used to transfer data from the memory to the memory. - * Single-node continuous transmission. - */ -#ifndef SAMPLE_DMA_LISTTRANSFERCOUNTINUE_H -#define SAMPLE_DMA_LISTTRANSFERCOUNTINUE_H - -#include "debug.h" -#include "dma.h" -#include "main.h" - -void DMA_List_transfer_continue(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer_continue/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer_continue/readme.md deleted file mode 100644 index fc2202829..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer_continue/readme.md +++ /dev/null @@ -1,19 +0,0 @@ -# 配置DMA单节点连续链式传输功能 -## 关键字: DMA, 单节点,连续链式传输 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、中断和DMA控制器初始化和功能配置。DMA链式传输,从内存到内存,使用DMA搬运,链表单节点连续传输。 - -**【示例配置】** -+ “SystemInit()”中配置DMA源和目的大小端、开启中断等参数。 - -+ 链表连续处理:首先,将使用“HAL_DMA_InitNewNode()”接口配置目的内存需要接收的数据长度和内存地址,得到一个节点; -然后,使用“HAL_DMA_ListAddNode()”接口,将上一步的节点作为两个入参,使得链表循环。 - -+ 使能DMA搬运:将第一个内存块的地址和选择的DMA传输通道作为入参传递至“HAL_DMA_StartListTransfer()”,使能DMA传递 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成后。DMA搬运结束后,会上报中断,在中断回调函数中查看源目端数据是否一致。 - -**【注意事项】** -+ NA \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer_continue/src/sample_dma_list_transfer_continue.c b/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer_continue/src/sample_dma_list_transfer_continue.c deleted file mode 100644 index 83944652a..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer_continue/src/sample_dma_list_transfer_continue.c +++ /dev/null @@ -1,70 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_dma_list_transfer_continue.c - * @author MCU Driver Team - * @brief Single-node continuous transmission. - * @details The DMA is used to transfer data from the memory to the memory. - * Single-node continuous transmission. - */ -#include "sample_dma_list_transfer_continue.h" - -static unsigned char g_src[5] = "ABC"; -static unsigned char g_dest[5] = ""; -static DMA_LinkList g_node; -static DMA_ChannelParam g_param; -/** - * @brief DMA sample code for the transfer of list node continue transmission. - * @param None. - * @retval None. - */ -void DMA_List_transfer_continue(void) -{ - SystemInit(); - DBG_PRINTF("ListTransferContinue Begin: \r\n"); - DBG_PRINTF("Before transmission, src: %s\r\n", g_src); - DBG_PRINTF("Before transmission, dest: %s\r\n", g_dest); - unsigned int channel = 2; /* select transfer channel 2 */ - unsigned int dataLength = 3; /* The length of the transferred characters is 3 */ - unsigned int count = 0; - g_param.direction = DMA_MEMORY_TO_MEMORY_BY_DMAC; - g_param.srcAddrInc = DMA_ADDR_INCREASE; - g_param.destAddrInc = DMA_ADDR_INCREASE; - g_param.srcWidth = DMA_TRANSWIDTH_BYTE; - g_param.destWidth = DMA_TRANSWIDTH_BYTE; - g_param.srcBurst = DMA_BURST_LENGTH_1; - g_param.destBurst = DMA_BURST_LENGTH_1; - g_param.pHandle = &g_dmac; - HAL_DMA_InitNewNode(&g_node, &g_param, (uintptr_t)(void *)g_src, (uintptr_t)(void *)g_dest, dataLength); - HAL_DMA_ListAddNode(&g_node, &g_node); - HAL_DMA_StartListTransfer(&g_dmac, &g_node, channel); - DBG_PRINTF("DMA Start Transport!\r\n"); - while (1) { - BASE_FUNC_DelayUs(500); /* delay 500 us */ - if (count % 100 == 0 && count <= 2000) { /* 100 and 2000 are used for control printf */ - DBG_PRINTF("src: %s, dest: %s\r\n", g_src, g_dest); - if (count == 1500) { /* 1500 for turning off DMA transport */ - HAL_DMA_StopChannel(&g_dmac, channel); - DBG_PRINTF("DMA Stop Transport!\r\n"); - } - g_src[0] += 1; - g_src[1] += 1; - g_src[2] += 1; /* Change the character of the subscript is 2 */ - } - count++; - } -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer_continue/sysinit/main.c b/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer_continue/sysinit/main.c deleted file mode 100644 index fb60e4c70..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer_continue/sysinit/main.c +++ /dev/null @@ -1,37 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ -#include "typedefs.h" -#include "feature.h" -#include "main.h" -#include "sample_dma_list_transfer_continue.h" - -UART_Handle g_uart0; - -DMA_Handle g_dmac; - -int main(void) -{ - DMA_List_transfer_continue(); - while (1) { - } - return BASE_STATUS_OK; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer_continue/sysinit/main.h b/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer_continue/sysinit/main.h deleted file mode 100644 index ea243033c..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer_continue/sysinit/main.h +++ /dev/null @@ -1,48 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "crg.h" -#include "dma.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -extern UART_Handle g_uart0; - -extern DMA_Handle g_dmac; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -void MemoryDMACallback(void *handle); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer_continue/sysinit/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer_continue/sysinit/system_init.c deleted file mode 100644 index b1365052d..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer_continue/sysinit/system_init.c +++ /dev/null @@ -1,123 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void DMA_Channel2Init(void) -{ - DMA_ChannelParam dma_param; - dma_param.direction = DMA_MEMORY_TO_MEMORY_BY_DMAC; - dma_param.srcAddrInc = DMA_ADDR_INCREASE; - dma_param.destAddrInc = DMA_ADDR_INCREASE; - dma_param.srcPeriph = DMA_REQUEST_MEM; - dma_param.destPeriph = DMA_REQUEST_MEM; - dma_param.srcWidth = DMA_TRANSWIDTH_BYTE; - dma_param.destWidth = DMA_TRANSWIDTH_BYTE; - dma_param.srcBurst = DMA_BURST_LENGTH_1; - dma_param.destBurst = DMA_BURST_LENGTH_1; - dma_param.pHandle = NULL; - HAL_DMA_InitChannel(&g_dmac, &dma_param, DMA_CHANNEL_TWO); -} - -static void DMA_Init(void) -{ - g_dmac.baseAddress = DMA; - g_dmac.srcByteOrder = DMA_BYTEORDER_SMALLENDIAN; - g_dmac.destByteOrder = DMA_BYTEORDER_SMALLENDIAN; - g_dmac.irqNumTc = IRQ_DMA_TC; - g_dmac.irqNumError = IRQ_DMA_ERR; - HAL_DMA_IRQService(&g_dmac); - IRQ_EnableN(IRQ_DMA_TC); - IRQ_EnableN(IRQ_DMA_ERR); - HAL_DMA_Init(&g_dmac); - - DMA_Channel2Init(); -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); - - g_uart0.baseAddress = UART0; - g_uart0.irqNum = IRQ_UART0; - - g_uart0.baudRate = UART0_BAND_RATE; - g_uart0.dataLength = UART_DATALENGTH_8BIT; - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; - g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart0); -} - -static void IOConfig(void) -{ - IOConfig_RegStruct *iconfig = IOCONFIG; - - iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ - iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ - iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; -} - -void SystemInit(void) -{ - IOConfig(); - DMA_Init(); - UART0_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_mem/inc/sample_dma_mem_to_mem.h b/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_mem/inc/sample_dma_mem_to_mem.h deleted file mode 100644 index c83928d60..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_mem/inc/sample_dma_mem_to_mem.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_dma_mem_to_mem.h - * @author MCU Driver Team - * @brief adc sample module. - * @brief dma sample module, memory-to-memory transfer. - * @details This file provides sample code for users to help use - * the data transfer function of the dma. - */ -#ifndef SAMPLE_DMA_MEMTOPER_H -#define SAMPLE_DMA_MEMTOPER_H - -#include "debug.h" -#include "dma.h" -#include "main.h" - -void DMA_MemoryToMemory(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_mem/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_mem/init/main.c deleted file mode 100644 index 89ffdc1fc..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_mem/init/main.c +++ /dev/null @@ -1,36 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ -#include "feature.h" -#include "main.h" -#include "sample_dma_mem_to_mem.h" - -UART_Handle g_uart0; - -DMA_Handle g_dmac; - -int main(void) -{ - DMA_MemoryToMemory(); - while (1) { - } - return BASE_STATUS_OK; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_mem/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_mem/init/main.h deleted file mode 100644 index 30a7c0e10..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_mem/init/main.h +++ /dev/null @@ -1,48 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "crg.h" -#include "dma.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -extern UART_Handle g_uart0; - -extern DMA_Handle g_dmac; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -void UART0_TXDMACallback(UART_Handle *handle); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_mem/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_mem/init/system_init.c deleted file mode 100644 index 3dc6940d1..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_mem/init/system_init.c +++ /dev/null @@ -1,133 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void DMA_Channel2Init(void *handle) -{ - DMA_ChannelParam dma_param; - dma_param.direction = DMA_MEMORY_TO_MEMORY_BY_DMAC; - dma_param.srcAddrInc = DMA_ADDR_INCREASE; - dma_param.destAddrInc = DMA_ADDR_INCREASE; - dma_param.srcPeriph = DMA_REQUEST_MEM; - dma_param.destPeriph = DMA_REQUEST_MEM; - dma_param.srcWidth = DMA_TRANSWIDTH_BYTE; - dma_param.destWidth = DMA_TRANSWIDTH_BYTE; - dma_param.srcBurst = DMA_BURST_LENGTH_1; - dma_param.destBurst = DMA_BURST_LENGTH_1; - dma_param.pHandle = handle; - HAL_DMA_InitChannel(&g_dmac, &dma_param, DMA_CHANNEL_TWO); -} - -static void DMA_Init(void) -{ - g_dmac.baseAddress = DMA; - g_dmac.srcByteOrder = DMA_BYTEORDER_SMALLENDIAN; - g_dmac.destByteOrder = DMA_BYTEORDER_SMALLENDIAN; - g_dmac.irqNumTc = IRQ_DMA_TC; - g_dmac.irqNumError = IRQ_DMA_ERR; - HAL_DMA_IRQService(&g_dmac); - IRQ_EnableN(IRQ_DMA_TC); - IRQ_EnableN(IRQ_DMA_ERR); - HAL_DMA_Init(&g_dmac); - - DMA_Channel2Init((void *)(&g_uart0)); -} - -__weak void UART0_TXDMACallback(UART_Handle *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN UART0_TXDMACallback */ - /* USER CODE END UART0_TXDMACallback */ -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); - - g_uart0.baseAddress = UART0; - g_uart0.irqNum = IRQ_UART0; - - g_uart0.baudRate = UART0_BAND_RATE; - g_uart0.dataLength = UART_DATALENGTH_8BIT; - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; - g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart0); - g_uart0.dmaHandle = &g_dmac; - g_uart0.uartDmaTxChn = DMA_CHANNEL_TWO; - HAL_UART_RegisterCallBack(&g_uart0, UART_WRITE_DMA_FINISH, UART0_TXDMACallback); -} - -static void IOConfig(void) -{ - IOConfig_RegStruct *iconfig = IOCONFIG; - - iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ - iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ - iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; -} - -void SystemInit(void) -{ - IOConfig(); - DMA_Init(); - UART0_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_mem/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_mem/readme.md deleted file mode 100644 index 1b1aed5ab..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_mem/readme.md +++ /dev/null @@ -1,18 +0,0 @@ -# 配置DMA内存到内存传输功能,中断回调中读取搬运结果 -## 关键字: DMA, 中断,内存到内存 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、中断、DMA通道初始化和DMA控制器初始化配置。DMA传输,从内存搬运到内存,DMA搬运结束后触发DMA中断,在中断回调函数中读取搬运后的结果。 - -**【示例配置】** -+ 在“SystemInit()”中配置DMA源和目的大小端、中断、配置通道相关参数进行初始化。 - -+ 将搬运的源端地址和目的端地址传入“HAL_DMA_StartIT()”接口,搬运的数据长度和DMA的通道号也作为入参传递进去。。 - -+ 实现“DMA_MemToMemCallBack()”中断回调函数。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成后。DMA搬运结束后,会上报中断,在中断回调中查看源目端数据是否一致。 - -**【注意事项】** -+ NA \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_mem/src/sample_dma_mem_to_mem.c b/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_mem/src/sample_dma_mem_to_mem.c deleted file mode 100644 index bddb05d0f..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_mem/src/sample_dma_mem_to_mem.c +++ /dev/null @@ -1,61 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_dma_mem_to_mem.c - * @author MCU Driver Team - * @brief dma sample module, memory-to-memory transfer. - * @details The DMA is used to transfer data from the memory to the memory. - * After the transfer is complete, the DMA interrupt is triggered. - * (1) Transfer configuration: Transfer the source and destination addresses to the HAL_DMA_StartIT() API. - * Transfer the length of the transferred data and the DMA channel number as input parameters. - * (2) Result judgment: After the DMA transfer is complete, in the interrupt callback function, check whether - * the source and destination data are consistent. - */ -#include "sample_dma_mem_to_mem.h" - -static unsigned char g_str1[10] = "12345678"; -static unsigned char g_str2[10] = ""; -void DMA_MemToMemCallBack(void *handle); -/** - * @brief User-defined callback function for completing the transfer of memory to the memory. - * @param handle callback handle. - * @retval None. - */ -void DMA_MemToMemCallBack(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("DMA_MemToMemCallBack\r\n"); - DBG_PRINTF("After transmission, src: %s\r\n", g_str1); - DBG_PRINTF("After transmission, dest: %s\r\n", g_str2); -} - -/** - * @brief DMA sample code for the transfer of memory to the memory. - * @param None. - * @retval None. - */ -void DMA_MemoryToMemory(void) -{ - SystemInit(); - DBG_PRINTF("MemoryToMemory Begin: \r\n"); - DBG_PRINTF("Before transmission, src: %s\r\n", g_str1); - DBG_PRINTF("Before transmission, dest: %s\r\n", g_str2); - unsigned int channel = 2; /* select transfer channel 2 */ - HAL_DMA_RegisterCallback(&g_dmac, DMA_CHANNEL_FINISH, channel, DMA_MemToMemCallBack); - /* The transmission length is defined as 8 */ - HAL_DMA_StartIT(&g_dmac, (uintptr_t)(void *)g_str1, (uintptr_t)(void *)g_str2, 8, channel); -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_per/inc/sample_dma_mem_to_per.h b/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_per/inc/sample_dma_mem_to_per.h deleted file mode 100644 index 88883e315..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_per/inc/sample_dma_mem_to_per.h +++ /dev/null @@ -1,32 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_dma_mem_to_per.h - * @author MCU Driver Team - * @brief dma sample module. - * @details This file provides sample code for users to help use - * the data transfer function of the dma. - */ -#ifndef SAMPLE_DMA_MEM_TO_PER_H -#define SAMPLE_DMA_MEM_TO_PER_H - -#include "dma.h" -#include "debug.h" -#include "interrupt.h" - -int DMA_MemoryToPeriphIT(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_per/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_per/readme.md deleted file mode 100644 index f2d505621..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_per/readme.md +++ /dev/null @@ -1,18 +0,0 @@ -# 配置DMA内存到外设传输,传输完成进入中断回调函数 -## 关键字: DMA, 内存到外设, 中断 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、中断和DMA控制器初始化和功能配置。从内存到外设uart tx,使用DMA搬运,搬运结束后触发DMA中断。 - -**【示例配置】** -+ “HAL_DMA_Init()”接口配置DMA源和目的大小端、中断进行初始化,“HAL_DMA_InitChannel()”进行通道初始化配置。 - -+ 将搬运的源端地址和目的端地址传入“HAL_DMA_StartIT()”接口,搬运的数据长度和DMA的通道号也作为入参传递进去,调用完成之后要发送uart tx DMA请求。 - -+ 当DMA传输完成,“DMA_MemToPeriFinish()”中断回调函数中打印log。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成后。DMA搬运结束后,会上报中断,在中断函数中打印传输完成log,并且在串口助手上显示搬运完成的数据。 - -**【注意事项】** -+ 如果要在串口助手上显示搬运完成的数据,要设置外设为对应的uart串口。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_per/src/sample_dma_mem_to_per.c b/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_per/src/sample_dma_mem_to_per.c deleted file mode 100644 index 231a0cbfd..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_per/src/sample_dma_mem_to_per.c +++ /dev/null @@ -1,118 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_dma_mem_to_per.c - * @author MCU Driver Team - * @brief dma sample module, memory-to-peripheral transfer. - * @details This file provides sample code for users to help use - * the data transfer function of the dma. - */ -#include "sample_dma_mem_to_per.h" - -#define NUM 10 -static UART_Handle g_uartHandle; -static unsigned char g_str1[NUM] = "123456789"; -static DMA_Handle g_dmac; -static DMA_ChannelParam g_param; - -/** - * @brief DMA controller initialization. - * @param None. - * @retval None. - */ -static void DMA_ControllerInit(void) -{ - g_dmac.baseAddress = DMA; - g_dmac.srcByteOrder = DMA_BYTEORDER_SMALLENDIAN; - g_dmac.destByteOrder = DMA_BYTEORDER_SMALLENDIAN; - g_dmac.irqNumTc = IRQ_DMA_TC; - g_dmac.irqNumError = IRQ_DMA_ERR; - HAL_DMA_Init(&g_dmac); -} - -/** - * @brief DMA interrupt initialization. - * @param handle DMA handle. - * @retval None. - */ -static void DMA_InterruptInit(DMA_Handle *handle) -{ - IRQ_Enable(); - handle->irqNumTc = IRQ_DMA_TC; - handle->irqNumError = IRQ_DMA_ERR; - HAL_DMA_IRQService(handle); - IRQ_EnableN(IRQ_DMA_TC); - IRQ_EnableN(IRQ_DMA_ERR); -} - -/** - * @brief User-defined callback function for completing the transfer of memory to the peripheral. - * @param handle callback handle. - * @retval None. - */ -static void DMA_MemToPeriFinish(void *handle) -{ - DBG_PRINTF("Interrupt Finish!\r\n"); - BASE_FUNC_UNUSED(handle); -} - -/** - * @brief DMA sample code for the transfer of memory to the peripheral. - * @param None. - * @retval None. - */ -int DMA_MemoryToPeriphIT(void) -{ - g_uartHandle.baseAddress = UART0; - g_uartHandle.baudRate = 115200; /* baud rate is 115200 */ - g_uartHandle.dataLength = UART_DATALENGTH_8BIT; - g_uartHandle.stopBits = UART_STOPBITS_ONE; - g_uartHandle.parity = UART_PARITY_NONE; - g_uartHandle.fifoMode = true; - g_uartHandle.fifoTxThr = UART_FIFOFULL_ONE_TWO; - g_uartHandle.fifoRxThr = UART_FIFOFULL_ONE_TWO; - g_uartHandle.hwFlowCtr = UART_HW_FLOWCTR_DISABLE; - HAL_UART_Init(&g_uartHandle); - - DBG_PRINTF("MemoryToPeriph Begin: \r\n"); - DBG_PRINTF("src_memory g_str1: %s\r\n", g_str1); - unsigned int channel = 3; /* select transfer channel 3 */ - DMA_ControllerInit(); - DMA_InterruptInit(&g_dmac); - HAL_DMA_RegisterCallback(&g_dmac, DMA_CHANNEL_FINISH, channel, DMA_MemToPeriFinish); - g_param.direction = DMA_MEMORY_TO_PERIPH_BY_DMAC; - g_param.srcAddrInc = DMA_ADDR_INCREASE; - g_param.destAddrInc = DMA_ADDR_UNALTERED; - g_param.destPeriph = DMA_REQUEST_UART0_TX; - g_param.srcWidth = DMA_TRANSWIDTH_BYTE; - g_param.destWidth = DMA_TRANSWIDTH_BYTE; - g_param.srcBurst = DMA_BURST_LENGTH_4; - g_param.destBurst = DMA_BURST_LENGTH_4; - g_param.pHandle = &g_uartHandle; - HAL_DMA_InitChannel(&g_dmac, &g_param, channel); - unsigned int ret; - ret = HAL_DMA_StartIT(&g_dmac, (uintptr_t)(void *)g_str1, (uintptr_t)(void *)&(g_uartHandle.baseAddress->UART_DR), - 6, channel); /* The transmission length is defined as 6 */ - if (ret == BASE_STATUS_ERROR) { - DBG_PRINTF("HAL_DMA_StartIT: BASE_STATUS_ERROR\r\n"); - } else { - g_uartHandle.baseAddress->UART_DMACR.BIT.txdmae = BASE_CFG_ENABLE; - DBG_PRINTF("HAL_DMA_StartIT: BASE_STATUS_OK\r\n"); - } - DBG_PRINTF("End:\r\n"); - return 0; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_per_to_mem/inc/sample_dma_per_to_mem.h b/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_per_to_mem/inc/sample_dma_per_to_mem.h deleted file mode 100644 index 7265024ae..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_per_to_mem/inc/sample_dma_per_to_mem.h +++ /dev/null @@ -1,32 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_dma_per_to_mem.h - * @author MCU Driver Team - * @brief dma sample module. - * @details This file provides sample code for users to help use - * the data transfer function of the dma. - */ -#ifndef SAMPLE_DMA_PER_TO_MEM_H -#define SAMPLE_DMA_PER_TO_MEM_H - -#include "dma.h" -#include "debug.h" -#include "interrupt.h" - -int DMA_PeriphToMemoryIT(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_per_to_mem/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_per_to_mem/readme.md deleted file mode 100644 index 042f64d13..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_per_to_mem/readme.md +++ /dev/null @@ -1,18 +0,0 @@ -# 配置DMA外设到内存传输,传输完成进入中断回调函数 -## 关键字: DMA, 外设到内存, 中断 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、中断和DMA控制器初始化和功能配置。从外设uart rx到内存,使用DMA搬运,搬运结束后触发DMA中断。 - -**【示例配置】** -+ “HAL_DMA_Init()”接口配置DMA源和目的大小端、中断进行初始化,“HAL_DMA_InitChannel()”进行通道初始化配置。 - -+ 将搬运的源端地址和目的端地址传入“HAL_DMA_StartIT()”接口,搬运的数据长度和DMA的通道号也作为入参传递进去,调用完成之后要发送uart rx DMA请求。 - -+ 当DMA传输完成,“DMA_PeriphToMemFinish()”中断回调函数中打印log,并且再次调用“HAL_DMA_StartIT()”接口进行下一次搬运,调用完成后发送uart rx DMA请求。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成后。在串口助手上发送数据,DMA搬运结束后,会上报中断,在中断函数中打印传输完成log,查看数据是否正确。 - -**【注意事项】** -+ 如果要在串口助手上发送数据进行DMA搬运到内存,要设置外设为对应的uart串口。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_per_to_mem/src/sample_dma_per_to_mem.c b/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_per_to_mem/src/sample_dma_per_to_mem.c deleted file mode 100644 index 845fe8fdc..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_per_to_mem/src/sample_dma_per_to_mem.c +++ /dev/null @@ -1,128 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_dma_per_to_mem.c - * @author MCU Driver Team - * @brief dma sample module, peripheral-to-memory transfer. - * @details This file provides sample code for users to help use - * the data transfer function of the dma. - */ -#include "sample_dma_per_to_mem.h" - -#define NUM 10 -static UART_Handle g_uart; -static unsigned char g_str2[NUM] = {0}; -static DMA_Handle g_dmac; -static DMA_ChannelParam g_param; - -/** - * @brief DMA controller initialization. - * @param None. - * @retval None. - */ -static void DMA_ControllerInit(void) -{ - g_dmac.baseAddress = DMA; - g_dmac.srcByteOrder = DMA_BYTEORDER_SMALLENDIAN; - g_dmac.destByteOrder = DMA_BYTEORDER_SMALLENDIAN; - g_dmac.irqNumTc = IRQ_DMA_TC; - g_dmac.irqNumError = IRQ_DMA_ERR; - HAL_DMA_Init(&g_dmac); -} - -/** - * @brief DMA interrupt initialization. - * @param handle DMA handle. - * @retval None. - */ -static void DMA_InterruptInit(DMA_Handle *handle) -{ - IRQ_Enable(); - handle->irqNumTc = IRQ_DMA_TC; - handle->irqNumError = IRQ_DMA_ERR; - HAL_DMA_IRQService(handle); - IRQ_EnableN(IRQ_DMA_TC); - IRQ_EnableN(IRQ_DMA_ERR); -} - -/** - * @brief User-defined callback function for completing the transfer of peripheral to the memory. - * @param handle callback handle. - * @retval None. - */ -static void DMA_PeriphToMemFinish(void *handle) -{ - DMA_Handle *dmaHandle = (DMA_Handle *)handle; - DBG_PRINTF("Interrupt Finish!\r\n"); - DBG_PRINTF("g_str2:%s\r\n", g_str2); - DBG_PRINTF("Process channel: %d\r\n", dmaHandle->currentChannel); - unsigned int ret; - ret = HAL_DMA_StartIT(dmaHandle, (uintptr_t)(void *)&(g_uart.baseAddress->UART_DR), - (uintptr_t)(void *)g_str2, 8, dmaHandle->currentChannel); /* Transmission length is 8 */ - if (ret == BASE_STATUS_ERROR) { - DBG_PRINTF("HAL_DMA_StartIT: BASE_STATUS_ERROR\r\n"); - } else { - g_uart.baseAddress->UART_DMACR.BIT.rxdmae = BASE_CFG_ENABLE; - } -} - -/** - * @brief DMA sample code for the transfer of peripheral to the memory. - * @param None. - * @retval None. - */ -int DMA_PeriphToMemoryIT(void) -{ - g_uart.baseAddress = UART0; - g_uart.baudRate = 115200; /* baud rate is 115200 */ - g_uart.dataLength = UART_DATALENGTH_8BIT; - g_uart.stopBits = UART_STOPBITS_ONE; - g_uart.parity = UART_PARITY_NONE; - g_uart.fifoMode = true; - g_uart.fifoTxThr = UART_FIFOFULL_ONE_TWO; - g_uart.fifoRxThr = UART_FIFOFULL_ONE_TWO; - g_uart.hwFlowCtr = UART_HW_FLOWCTR_DISABLE; - g_uart.baseAddress = UART0; - HAL_UART_Init(&g_uart); - - DBG_PRINTF("PeriphToMemory Begin: \r\n"); - DBG_PRINTF("Please enter a string to the peripheral\r\n"); - unsigned int channel = 1; /* select transfer channel 1 */ - - DMA_ControllerInit(); - DMA_InterruptInit(&g_dmac); - HAL_DMA_RegisterCallback(&g_dmac, DMA_CHANNEL_FINISH, channel, DMA_PeriphToMemFinish); - g_param.direction = DMA_PERIPH_TO_MEMORY_BY_DMAC; - g_param.srcAddrInc = DMA_ADDR_UNALTERED; - g_param.destAddrInc = DMA_ADDR_INCREASE; - g_param.srcPeriph = DMA_REQUEST_UART0_RX; - g_param.srcWidth = DMA_TRANSWIDTH_BYTE; - g_param.destWidth = DMA_TRANSWIDTH_BYTE; - g_param.srcBurst = DMA_BURST_LENGTH_1; - g_param.destBurst = DMA_BURST_LENGTH_4; - g_param.pHandle = &g_dmac; - HAL_DMA_InitChannel(&g_dmac, &g_param, channel); - unsigned int ret; - ret = HAL_DMA_StartIT(&g_dmac, (uintptr_t)(void *)&(g_uart.baseAddress->UART_DR), - (uintptr_t)(void *)g_str2, 8, channel); /* The transmission length is defined as 8 */ - if (ret == BASE_STATUS_ERROR) { - DBG_PRINTF("HAL_DMA_StartIT: BASE_STATUS_ERROR\r\n"); - } else { - g_uart.baseAddress->UART_DMACR.BIT.rxdmae = BASE_CFG_ENABLE; - } - return 0; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_per_to_per/inc/sample_dma_per_to_per.h b/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_per_to_per/inc/sample_dma_per_to_per.h deleted file mode 100644 index 3c4702407..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_per_to_per/inc/sample_dma_per_to_per.h +++ /dev/null @@ -1,32 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_dma_per_to_per.h - * @author MCU Driver Team - * @brief dma sample module. - * @details This file provides sample code for users to help use - * the data transfer function of the dma. - */ -#ifndef SAMPLE_DMA_PER_TO_PER_H -#define SAMPLE_DMA_PER_TO_PER_H - -#include "dma.h" -#include "debug.h" -#include "interrupt.h" - -int DMA_PeriphToPeriphIT(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_per_to_per/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_per_to_per/readme.md deleted file mode 100644 index b5fd1d2f7..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_per_to_per/readme.md +++ /dev/null @@ -1,18 +0,0 @@ -# 配置DMA外设到外设传输,传输完成进入中断回调函数 -## 关键字: DMA, 外设到外设, 中断 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、中断和DMA控制器初始化和功能配置。从外设uart rx到uart tx ,使用DMA搬运,搬运结束后触发DMA中断。 - -**【示例配置】** -+ “HAL_DMA_Init()”接口配置DMA源和目的大小端、中断进行初始化,“HAL_DMA_InitChannel()”进行通道初始化配置。 - -+ 将搬运的源端地址和目的端地址传入“HAL_DMA_StartIT()”接口,搬运的数据长度和DMA的通道号也作为入参传递进去,调用完成之后要发送uart rx 和 uart tx DMA请求。 - -+ 当DMA传输完成,“DMA_PeriToPeriFinish()”中断回调函数中打印log。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成后。在串口助手上发送数据,DMA搬运结束后,会上报中断,在中断函数中打印传输完成log,此时在另一个串口助手上显示搬运完成的数据。 - -**【注意事项】** -+ 如果要在串口助手上发送数据到另一个串口助手上显示数据,要设置外设为对应的uart串口,比如其中一个串口助手连接uart tx,一个串口助手连接uart rx。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_per_to_per/src/sample_dma_per_to_per.c b/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_per_to_per/src/sample_dma_per_to_per.c deleted file mode 100644 index 523b36d4f..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_per_to_per/src/sample_dma_per_to_per.c +++ /dev/null @@ -1,127 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_dma_per_to_per.c - * @author MCU Driver Team - * @brief dma sample module, peripheral-to-peripheral transfer. - * @details This file provides sample code for users to help use - * the data transfer function of the dma. - */ -#include "sample_dma_per_to_per.h" - -static UART_Handle g_uart1; -static UART_Handle g_uart0; -static DMA_Handle g_dmac; -static DMA_ChannelParam g_param; - -/** - * @brief DMA controller initialization. - * @param None. - * @retval None. - */ -static void DMA_ControllerInit(void) -{ - g_dmac.baseAddress = DMA; - g_dmac.srcByteOrder = DMA_BYTEORDER_SMALLENDIAN; - g_dmac.destByteOrder = DMA_BYTEORDER_SMALLENDIAN; - g_dmac.irqNumTc = IRQ_DMA_TC; - g_dmac.irqNumError = IRQ_DMA_ERR; - HAL_DMA_Init(&g_dmac); -} - -/** - * @brief DMA interrupt initialization. - * @param handle DMA handle. - * @retval None. - */ -static void DMA_InterruptInit(DMA_Handle *handle) -{ - IRQ_Enable(); - handle->irqNumTc = IRQ_DMA_TC; - handle->irqNumError = IRQ_DMA_ERR; - HAL_DMA_IRQService(handle); - IRQ_EnableN(IRQ_DMA_TC); - IRQ_EnableN(IRQ_DMA_ERR); -} - -/** - * @brief User-defined callback function for completing the transfer of peripheral to the peripheral. - * @param handle callback handle. - * @retval None. - */ -static void DMA_PeriToPeriFinish(void *handle) -{ - DBG_PRINTF("Interrupt Finish!\r\n"); - BASE_FUNC_UNUSED(handle); -} - -/** - * @brief DMA sample code for the transfer of peripheral to the peripheral. - * @param None. - * @retval None. - */ -int DMA_PeriphToPeriphIT(void) -{ - g_uart0.baseAddress = UART0; - g_uart0.baudRate = 115200; /* baud rate is 115200 */ - g_uart0.dataLength = UART_DATALENGTH_8BIT; - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.fifoMode = true; - g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.hwFlowCtr = UART_HW_FLOWCTR_DISABLE; - HAL_UART_Init(&g_uart0); - - g_uart1.baseAddress = UART1; - g_uart1.baudRate = 115200; /* baud rate is 115200 */ - g_uart1.dataLength = UART_DATALENGTH_8BIT; - g_uart1.stopBits = UART_STOPBITS_ONE; - g_uart1.parity = UART_PARITY_NONE; - g_uart1.fifoMode = true; - g_uart1.fifoTxThr = UART_FIFOFULL_ONE_TWO; - g_uart1.fifoRxThr = UART_FIFOFULL_ONE_TWO; - g_uart1.hwFlowCtr = UART_HW_FLOWCTR_DISABLE; - HAL_UART_Init(&g_uart1); - - DBG_PRINTF("PeriphToPeriph Begin: \r\n"); - unsigned int channel = 0; /* select transfer channel 0 */ - DMA_ControllerInit(); - DMA_InterruptInit(&g_dmac); - HAL_DMA_RegisterCallback(&g_dmac, DMA_CHANNEL_FINISH, channel, DMA_PeriToPeriFinish); - g_param.direction = DMA_PERIPH_TO_PERIPH_BY_DMAC; - g_param.srcAddrInc = DMA_ADDR_UNALTERED; - g_param.destAddrInc = DMA_ADDR_UNALTERED; - g_param.destPeriph = DMA_REQUEST_UART0_TX; - g_param.srcPeriph = DMA_REQUEST_UART1_RX; - g_param.srcWidth = DMA_TRANSWIDTH_BYTE; - g_param.destWidth = DMA_TRANSWIDTH_BYTE; - g_param.srcBurst = DMA_BURST_LENGTH_1; - g_param.destBurst = DMA_BURST_LENGTH_1; - g_param.pHandle = &g_dmac; - HAL_DMA_InitChannel(&g_dmac, &g_param, channel); - unsigned int ret; - ret = HAL_DMA_StartIT(&g_dmac, (uintptr_t)(void *)&(g_uart1.baseAddress->UART_DR), - (uintptr_t)(void *)&(g_uart0.baseAddress->UART_DR), 8, channel); /* Tx length is 8 */ - if (ret == BASE_STATUS_ERROR) { - DBG_PRINTF("HAL_DMA_StartIT: BASE_STATUS_ERROR\r\n"); - } else { - g_uart1.baseAddress->UART_DMACR.BIT.rxdmae = BASE_CFG_ENABLE; - g_uart0.baseAddress->UART_DMACR.BIT.txdmae = BASE_CFG_ENABLE; - } - return 0; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking/inc/sample_flash_blocking.h b/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking/inc/sample_flash_blocking.h deleted file mode 100644 index 28a94c3af..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking/inc/sample_flash_blocking.h +++ /dev/null @@ -1,29 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_flash_blocking.h - * @author MCU Driver Team - * @brief FLASH module sample. - * @details This file provides sample code for users to help use - * the functionalities of the FLASH. - */ -#ifndef McuMagicTag_SAMPLE_EFLASH_BLOCKING_H -#define McuMagicTag_SAMPLE_EFLASH_BLOCKING_H - -void FlashBlockingProcessing(void); - -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking/init/main.c deleted file mode 100644 index 0fbfd61e9..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking/init/main.c +++ /dev/null @@ -1,34 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ -#include "feature.h" -#include "main.h" -#include "sample_flash_blocking.h" - -UART_Handle g_uart0; - -int main(void) -{ - FlashBlockingProcessing(); - while (1) { - } - return BASE_STATUS_OK; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking/init/main.h deleted file mode 100644 index e9b54f86f..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking/init/main.h +++ /dev/null @@ -1,43 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -extern UART_Handle g_uart0; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking/init/system_init.c deleted file mode 100644 index 12a1fff57..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking/init/system_init.c +++ /dev/null @@ -1,91 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); - - g_uart0.baseAddress = UART0; - g_uart0.irqNum = IRQ_UART0; - - g_uart0.baudRate = UART0_BAND_RATE; - g_uart0.dataLength = UART_DATALENGTH_8BIT; - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; - g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart0); -} - -static void IOConfig(void) -{ - IOConfig_RegStruct *iconfig = IOCONFIG; - - iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ - iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ - iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking/readme.md deleted file mode 100644 index be9fffa7a..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking/readme.md +++ /dev/null @@ -1,19 +0,0 @@ -# 配置FLASH以阻塞方式进行擦除、写入,通过Debug串口打印读取的操作数据 -## 关键字: FLASH, 擦除,写入,读取,阻塞方式 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、FLASH控制器初始化和功能配置。通过阻塞方式对FLASH的PAGE 15区域进行擦除、写入操作,通过Debug串口打印读取的操作数据。 - -**【示例配置】** -+ FLASH操作内存选择:示例代码中选择了FLASH的PAGE 15区域进行操作,也可以选择其他FLASH的其它PAGE X进行操作。 - -+ FLASH初始化:调用接口"HAL_FLASH_Init()”完成对示例代码中FLASH的基地址、PE(擦除、写入方式)方式进行配置。 - -+ 操作FLASH PAGE 15进行擦除、写入、读取操作:通过调用 "HAL_FLASH_EraseBlocking()"接口以阻塞方式实现对目标页的擦除;通过调用"HAL_FLASH_WriteBlocking()"接口以阻塞方式实现将数据写入到目标页中;通过调用"HAL_FLASH_Read()"接口实现对目标页内容的读取。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码中会依次对FLASH的目标页进行擦除、写入、读取测试。功能正常时Debug串口打印成功log信息及读取的数据内容;功能异常时Debug串口打印失败log信息。 - -**【注意事项】** -+ 示例代码使用UART0进行结果打印输出,需要对UART0配置。 -+ 对FLASH进行擦除和写操作时需谨慎操作,避免对存放运行程序代码的分区进行擦、写操作,否则会导致运行出错。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking/src/sample_flash_blocking.c b/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking/src/sample_flash_blocking.c deleted file mode 100644 index 19c18b036..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking/src/sample_flash_blocking.c +++ /dev/null @@ -1,95 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_flash_blocking.c - * @author MCU Driver Team - * @brief Sample for Flash Module Blocking. - * @details This file provides sample code for users to operate the flash memory in blocking mode. - * This example code operates on page15 of the flash memory. (Be careful when performing the flash erasing - * operation to avoid damaging the running program code). - * This sample code demonstrates how to use the module initialization, read, write, and erase interfaces by - * operating on page 15 of the flash memory. The operation data is printed and output through the serial port. - */ -#include "main.h" -#include "flash.h" -#include "debug.h" -#include "sample_flash_blocking.h" - -#define FLASH_TEMP_DATA_SIZE 4096 - -#define FLASH_SAMPLE_ERASE_NUM 1 /* Number of flash pages erased at a time */ -#define FLASH_SAMPLE_ERASE_START_ADDR FLASH_PAGE_9 /* The erase address must be 8k aligned. */ -#define FLASH_SAMPLE_READ_START_ADDR FLASH_PAGE_9 /* The read address must be byte-aligned. */ -#define FLASH_SAMPLE_WRITE_START_ADDR FLASH_PAGE_9 /* The write address must be 16-byte aligned. */ - -static FLASH_Handle g_flashBlockingHandle; -static unsigned char g_tempData[FLASH_TEMP_DATA_SIZE] = {0}; - -/** - * @brief Flash bloccking sample init. - * @param None - * @retval None - */ -static void FlashBlockingInit(void) -{ - g_flashBlockingHandle.baseAddress = EFC; - g_flashBlockingHandle.peMode = FLASH_PE_OP_BLOCK; - HAL_FLASH_Init(&g_flashBlockingHandle); -} - -/** - * @brief Flash bloccking sample processing. - * @param None - * @retval None - */ -void FlashBlockingProcessing(void) -{ - BASE_StatusType ret; - unsigned char dataBuff[FLASH_TEMP_DATA_SIZE + 1] = {0}; - - SystemInit(); - FlashBlockingInit(); - for (unsigned int i = 0 ; i < FLASH_TEMP_DATA_SIZE; i++) { - g_tempData[i] = 0xA5; - } - - ret = HAL_FLASH_EraseBlocking(&g_flashBlockingHandle, FLASH_ERASE_MODE_PAGE, - FLASH_SAMPLE_ERASE_START_ADDR, FLASH_SAMPLE_ERASE_NUM); - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("Erase:0x%x fail\r\n ", FLASH_SAMPLE_ERASE_START_ADDR); - } - - ret = HAL_FLASH_WriteBlocking(&g_flashBlockingHandle, (uintptr_t)g_tempData, - FLASH_SAMPLE_WRITE_START_ADDR, FLASH_TEMP_DATA_SIZE); - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("Write:0x%x fail\r\n ", FLASH_SAMPLE_WRITE_START_ADDR); - } - - ret = HAL_FLASH_Read(&g_flashBlockingHandle, FLASH_SAMPLE_READ_START_ADDR, FLASH_TEMP_DATA_SIZE, - dataBuff, FLASH_TEMP_DATA_SIZE); - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("Read:0x%x fail\r\n ", FLASH_TEMP_DATA_SIZE); - } - DBG_PRINTF("read addr :0x%x \r\n ", FLASH_SAMPLE_READ_START_ADDR); - for (unsigned int i = 0; i < FLASH_TEMP_DATA_SIZE; i++) { - DBG_PRINTF("%x ", dataBuff[i]); - } - DBG_PRINTF("\r\n"); - while (1) { - ; - } -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking_mode/inc/sample_flash_blocking_mode.h b/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking_mode/inc/sample_flash_blocking_mode.h deleted file mode 100644 index 34b203a44..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking_mode/inc/sample_flash_blocking_mode.h +++ /dev/null @@ -1,29 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_flash_blocking_mode.h - * @author MCU Driver Team - * @brief FLASH module sample. - * @details This file provides sample code for users to help use - * the functionalities of the FLASH. - */ -#ifndef McuMagicTag_SAMPLE_EFLASH_BLOCKING_MODE_H -#define McuMagicTag_SAMPLE_EFLASH_BLOCKING_MODE_H - -void FlashBlockingProcessing(void); - -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking_mode/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking_mode/init/main.c deleted file mode 100644 index f3372a5f2..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking_mode/init/main.c +++ /dev/null @@ -1,51 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ - -#include "typedefs.h" -#include "feature.h" -#include "sample_flash_blocking_mode.h" -#include "main.h" - -/* USER CODE BEGIN 0 */ -/* USER CODE END 0 */ -UART_Handle g_uart0; -/* USER CODE BEGIN 1 */ -/* USER CODE END 1 */ - -int main(void) -{ - /* USER CODE BEGIN 2 */ - /* USER CODE END 2 */ - FlashBlockingProcessing(); - /* USER CODE BEGIN 3 */ - /* USER CODE END 3 */ - while (1) { - /* USER CODE BEGIN 4 */ - /* USER CODE END 4 */ - } - /* USER CODE BEGIN 5 */ - /* USER CODE END 5 */ - return BASE_STATUS_OK; -} - -/* USER CODE BEGIN 6 */ -/* USER CODE END 6 */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking_mode/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking_mode/init/main.h deleted file mode 100644 index 4d9eb3456..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking_mode/init/main.h +++ /dev/null @@ -1,48 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -#define XTAL_DRV_LEVEL4 0x03U -#define XTAL_DRV_LEVEL3 0x02U -#define XTAL_DRV_LEVEL2 0x01U -#define XTAL_DRV_LEVEL1 0x00U - -extern UART_Handle g_uart0; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking_mode/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking_mode/init/system_init.c deleted file mode 100644 index 85672d703..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking_mode/init/system_init.c +++ /dev/null @@ -1,95 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" -#include "iocmg_ip.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - /* Clock-related parameter configuration. */ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; - crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; - crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_1; - - /* Initialize the clock configuration. */ - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); - /* UART-related parameter configuration. */ - g_uart0.baseAddress = UART0; - - g_uart0.baudRate = UART0_BAND_RATE; /* Setting the UART Baud Rate. */ - g_uart0.dataLength = UART_DATALENGTH_8BIT; - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; /* Disable uart fifo mode. */ - g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; - g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; - g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; - /* Initializing the UART0. */ - HAL_UART_Init(&g_uart0); -} - -static void IOConfig(void) -{ - HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking_mode/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking_mode/readme.md deleted file mode 100644 index 63ca3f06f..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking_mode/readme.md +++ /dev/null @@ -1,19 +0,0 @@ -# 配置FLASH以阻塞方式进行擦除、写入,通过Debug串口打印读取的操作数据 -## 关键字: FLASH, 擦除,写入,读取,阻塞方式 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、FLASH控制器初始化和功能配置。通过阻塞方式对FLASH的PAGE 58-61区域进行擦除、写入操作,通过Debug串口打印读取的操作数据。 - -**【示例配置】** -+ FLASH操作内存选择:示例代码中选择了FLASH的PAGE 58-61区域进行操作,也可以选择其他FLASH的其它PAGE X进行操作。 - -+ FLASH初始化:调用接口"HAL_GPIO_Init()”完成对示例代码中FLASH的基地址、PE(擦除、写入方式)方式进行配置。 - -+ 操作FLASH PAGE 58-61进行擦除、写入、读取操作:通过调用 "HAL_FLASH_EraseBlocking()"接口以阻塞方式实现对目标页的擦除;通过调用"HAL_FLASH_WriteBlocking()"接口以阻塞方式实现将数据写入到目标页中;通过调用"HAL_FLASH_Read()"接口实现对目标页内容的读取。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码中会依次对FLASH的目标页进行擦除、写入、读取测试。功能正常时Debug串口打印成功log信息及读取的数据内容;功能异常时Debug串口打印失败log信息。 - -**【注意事项】** -+ 示例代码使用UART0进行结果打印输出,需要对UART0配置。 -+ 对FLASH进行擦除和写操作时需谨慎操作,避免对存放运行程序代码的分区进行擦、写操作,否则会导致运行出错。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking_mode/src/sample_flash_blocking_mode.c b/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking_mode/src/sample_flash_blocking_mode.c deleted file mode 100644 index 57e1f2b19..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking_mode/src/sample_flash_blocking_mode.c +++ /dev/null @@ -1,95 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_flash_blocking_mode.c - * @author MCU Driver Team - * @brief Sample for Flash Module Blocking. - * @details This file provides sample code for users to operate the flash memory in blocking mode. - * This example code operates on page58-page61 of the flash memory. (Be careful when - * performing the flash erasing operation to avoid damaging the running program code). - * This sample code demonstrates how to use the module initialization, read, write, and erase interfaces by - * operating on page58-page61 of the flash memory. The operation data is printed - * and output through the serial port. - */ -#include "main.h" -#include "flash.h" -#include "debug.h" -#include "sample_flash_blocking_mode.h" - -#define FLASH_TEMP_DATA_SIZE 4096 - -#define FLASH_SAMPLE_ERASE_NUM 4 /* Number of flash pages erased at a time */ -#define FLASH_SAMPLE_ERASE_START_ADDR FLASH_PAGE_58 /* The erase address must be 1k aligned. */ -#define FLASH_SAMPLE_READ_START_ADDR FLASH_PAGE_58 /* The read address must be byte-aligned. */ -#define FLASH_SAMPLE_WRITE_START_ADDR FLASH_PAGE_58 /* The write address must be 16-byte aligned. */ - -static FLASH_Handle g_flashBlockingHandle; -static unsigned char g_tempData[FLASH_TEMP_DATA_SIZE] = {0}; - -/** - * @brief Flash bloccking sample init. - * @param None - * @retval None - */ -static void FlashBlockingInit(void) -{ - g_flashBlockingHandle.baseAddress = EFC; - g_flashBlockingHandle.peMode = FLASH_PE_OP_BLOCK; - HAL_FLASH_Init(&g_flashBlockingHandle); -} - -/** - * @brief Flash bloccking sample processing. - * @param None - * @retval None - */ -void FlashBlockingProcessing(void) -{ - BASE_StatusType ret; - unsigned char dataBuff[FLASH_TEMP_DATA_SIZE + 1] = {0}; - - SystemInit(); - FlashBlockingInit(); - /* Configure data to be written. */ - for (unsigned int i = 0 ; i < FLASH_TEMP_DATA_SIZE; i++) { - g_tempData[i] = 0xA5; - } - /* Perform the erase operation. */ - ret = HAL_FLASH_EraseBlocking(&g_flashBlockingHandle, FLASH_ERASE_MODE_PAGE, - FLASH_SAMPLE_ERASE_START_ADDR, FLASH_SAMPLE_ERASE_NUM); - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("Erase:0x%x fail\r\n ", FLASH_SAMPLE_ERASE_START_ADDR); - } - /* Perform the programe operation. */ - ret = HAL_FLASH_WriteBlocking(&g_flashBlockingHandle, (uintptr_t)g_tempData, - FLASH_SAMPLE_WRITE_START_ADDR, FLASH_TEMP_DATA_SIZE); - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("Write:0x%x fail\r\n ", FLASH_SAMPLE_WRITE_START_ADDR); - } - /* Perform the read operation. */ - ret = HAL_FLASH_Read(&g_flashBlockingHandle, FLASH_SAMPLE_READ_START_ADDR, FLASH_TEMP_DATA_SIZE, - dataBuff, FLASH_TEMP_DATA_SIZE); - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("Read:0x%x fail\r\n ", FLASH_TEMP_DATA_SIZE); - } - DBG_PRINTF("read addr :0x%x \r\n ", FLASH_SAMPLE_READ_START_ADDR); - for (unsigned int i = 0; i < FLASH_TEMP_DATA_SIZE; i++) { - DBG_PRINTF("%x ", dataBuff[i]); - } - DBG_PRINTF("\r\n"); - return; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt/inc/sample_flash_interrupt.h b/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt/inc/sample_flash_interrupt.h deleted file mode 100644 index 273426f7b..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt/inc/sample_flash_interrupt.h +++ /dev/null @@ -1,29 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_flash_interrupt.h - * @author MCU Driver Team - * @brief FLASH module sample. - * @details This file provides sample code for users to help use - * the functionalities of the FLASH. - */ -#ifndef McuMagicTag_SAMPLE_EFLASH_INTERRUPT_H -#define McuMagicTag_SAMPLE_EFLASH_INTERRUPT_H - -void FlashInterruptProcessing(void); - -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt/init/main.c deleted file mode 100644 index c81f9dae8..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt/init/main.c +++ /dev/null @@ -1,34 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ -#include "feature.h" -#include "main.h" -#include "sample_flash_interrupt.h" - -UART_Handle g_uart0; - -int main(void) -{ - FlashInterruptProcessing(); - while (1) { - } - return BASE_STATUS_OK; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt/init/main.h deleted file mode 100644 index e9b54f86f..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt/init/main.h +++ /dev/null @@ -1,43 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -extern UART_Handle g_uart0; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt/init/system_init.c deleted file mode 100644 index 12a1fff57..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt/init/system_init.c +++ /dev/null @@ -1,91 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); - - g_uart0.baseAddress = UART0; - g_uart0.irqNum = IRQ_UART0; - - g_uart0.baudRate = UART0_BAND_RATE; - g_uart0.dataLength = UART_DATALENGTH_8BIT; - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; - g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart0); -} - -static void IOConfig(void) -{ - IOConfig_RegStruct *iconfig = IOCONFIG; - - iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ - iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ - iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt/readme.md deleted file mode 100644 index 724032ac9..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt/readme.md +++ /dev/null @@ -1,19 +0,0 @@ -# 配置FLASH以中断方式进行擦除、写入,通过Debug串口打印读取操作数据 -## 关键字: FLASH, 擦除,写入,读取,中断方式 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、FLASH控制器初始化和功能配置。通过中断方式对FLASH的PAGE 15区域进行擦除、写入,通过Debug串口打印读取的操作数据。 - -**【示例配置】** -+ FLASH操作内存选择:示例代码中选择了FLASH的PAGE 15区域进行操作,也可以选择其他FLASH的其它PAGE X进行操作。 - -+ FLASH初始化:调用接口"HAL_FLASH_Init()”完成对示例代码中FLASH的基地址、PE(擦除、写入方式)方式、回调函数、中断号进行配置。 - -+ 操作FLASH PAGE 15进行擦除、写入、读取操作:通过调用 "HAL_FLASH_EraseIT()"接口以中断方式实现对目标页的擦除;通过调用"HAL_FLASH_WriteIT()"接口以中断方式实现将数据写入到目标页中;通过调用"HAL_FLASH_Read()"接口实现对目标页内容的读取。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码中会依次对FLASH的目标页进行擦除、写入、读取测试。功能正常时Debug串口打印成功log信息及读取的数据内容;功能异常时Debug串口打印失败log信息。 - -**【注意事项】** -+ 示例代码使用UART0进行结果打印输出,需要对UART0配置。 -+ 对FLASH进行擦除和写操作时需谨慎操作,避免对存放运行程序代码的分区进行擦、写操作,否则会导致运行出错。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt/src/sample_flash_interrupt.c b/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt/src/sample_flash_interrupt.c deleted file mode 100644 index 04afe1926..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt/src/sample_flash_interrupt.c +++ /dev/null @@ -1,149 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_flash_interrupt.c - * @author MCU Driver Team - * @brief Sample for Flash Module Interrupt. - * @details This file provides sample code for users to operate the flash memory in Interrupt mode. - * This example code operates on page15 of the flash memory. (Be careful when performing the flash erasing - * operation to avoid damaging the running program code). - * This sample code demonstrates how to use the module initialization, read, write, and erase interfaces by - * operating on page 15 of the flash memory. The operation data is printed and output through the serial port. - */ -#include "main.h" -#include "flash.h" -#include "debug.h" -#include "sample_flash_interrupt.h" - -#define FLASH_SAMPLE_FLAG_UNSET 0 -#define FLASH_SAMPLE_FLAG_SET 1 - -#define FLASH_TEMP_DATA_SIZE 4096 - -#define FLASH_SAMPLE_ERASE_NUM 1 /* Number of flash pages erased at a time */ -#define FLASH_SAMPLE_ERASE_START_ADDR FLASH_PAGE_9 /* The erase address must be 8k aligned. */ -#define FLASH_SAMPLE_READ_START_ADDR FLASH_PAGE_9 /* The read address must be byte-aligned. */ -#define FLASH_SAMPLE_WRITE_START_ADDR FLASH_PAGE_9 /* The write address must be 16-byte aligned. */ - -static FLASH_Handle g_flashInterruptHandle; -static unsigned char g_tempData[FLASH_TEMP_DATA_SIZE] = {0}; -static volatile unsigned int g_eraseDoneFlag = FLASH_SAMPLE_FLAG_UNSET; -static volatile unsigned int g_writeDoneFlag = FLASH_SAMPLE_FLAG_UNSET; - -/** - * @brief Flash interrupt sample handle. - * @param handle Flash handle. - * @param event Flash callback event. - * @param opAddr Current operation address. - * @retval None - */ -static void FlashInterruptHandle(void *handle, FLASH_CallBackEvent event, unsigned int opAddr) -{ - BASE_FUNC_UNUSED(handle); - switch (event) { - case FLASH_WRITE_EVENT_SUCCESS : /* One-time write success callback. */ - DBG_PRINTF("write success \r\n 0x%x \r\n", opAddr); - break; - case FLASH_WRITE_EVENT_DONE : /* All content is written. */ - g_writeDoneFlag = FLASH_SAMPLE_FLAG_SET; - DBG_PRINTF("write done \r\n"); - break; - case FLASH_WRITE_EVENT_FAIL : /* Write failed. */ - DBG_PRINTF("wtite failed\r\n 0x%x \r\n", opAddr); - break; - case FLASH_ERASE_EVENT_SUCCESS : /* One-time erase success callback. */ - DBG_PRINTF("erase success \r\n 0x%x \r\n", opAddr); - break; - case FLASH_ERASE_EVENT_DONE: /* All erase operations are complete. */ - g_eraseDoneFlag = FLASH_SAMPLE_FLAG_SET; - DBG_PRINTF("erase done \r\n"); - break; - case FLASH_ERASE_EVENT_FAIL : /* Erase failed. */ - DBG_PRINTF("erase failed\r\n 0x%x \r\n", opAddr); - break; - default : - break; - } -} - -/** - * @brief Flash interrupt sample init. - * @param None - * @retval None - */ -static void FlashInterruptInit(void) -{ - g_flashInterruptHandle.baseAddress = EFC; - g_flashInterruptHandle.peMode = FLASH_PE_OP_IT; - HAL_FLASH_Init(&g_flashInterruptHandle); - HAL_FLASH_RegisterCallback(&g_flashInterruptHandle, FlashInterruptHandle); - - IRQ_Register(IRQ_EFC, HAL_FLASH_IrqHandler, &g_flashInterruptHandle); - IRQ_Register(IRQ_EFC_ERR, HAL_FLASH_IrqHandlerError, &g_flashInterruptHandle); - IRQ_SetPriority(IRQ_EFC_ERR, 1); /* set flash interrupt priority to 1 */ - IRQ_SetPriority(IRQ_EFC, 1); /* set flash interrupt priority to 1 */ - IRQ_EnableN(IRQ_EFC); - IRQ_EnableN(IRQ_EFC_ERR); -} - -/** - * @brief Flash interrupt sample processing. - * @param None - * @retval None - */ -void FlashInterruptProcessing(void) -{ - BASE_StatusType ret; - unsigned char dataBuff[FLASH_TEMP_DATA_SIZE + 1] = {0}; - - SystemInit(); - FlashInterruptInit(); - for (unsigned int i = 0 ; i < FLASH_TEMP_DATA_SIZE; i++) { - g_tempData[i] = 0x5A; - } - - ret = HAL_FLASH_EraseIT(&g_flashInterruptHandle, FLASH_ERASE_MODE_PAGE, - FLASH_SAMPLE_ERASE_START_ADDR, FLASH_SAMPLE_ERASE_NUM); - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("Erase:0x%x fail\r\n ", FLASH_SAMPLE_ERASE_START_ADDR); - } - while (g_eraseDoneFlag == FLASH_SAMPLE_FLAG_UNSET) { - ; - } - - ret = HAL_FLASH_WriteIT(&g_flashInterruptHandle, (uintptr_t)g_tempData, - FLASH_SAMPLE_WRITE_START_ADDR, FLASH_TEMP_DATA_SIZE); - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("Write:0x%x fail\r\n ", FLASH_SAMPLE_WRITE_START_ADDR); - } - while (g_writeDoneFlag == FLASH_SAMPLE_FLAG_UNSET) { - ; - } - ret = HAL_FLASH_Read(&g_flashInterruptHandle, FLASH_SAMPLE_READ_START_ADDR, FLASH_TEMP_DATA_SIZE, - dataBuff, FLASH_TEMP_DATA_SIZE); - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("Read:0x%x fail\r\n ", FLASH_TEMP_DATA_SIZE); - } - DBG_PRINTF("read addr :0x%x \r\n ", FLASH_SAMPLE_READ_START_ADDR); - for (unsigned int i = 0; i < FLASH_TEMP_DATA_SIZE; i++) { - DBG_PRINTF("%x ", dataBuff[i]); - } - DBG_PRINTF("\r\n"); - while (1) { - ; - } -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt_mode/inc/sample_flash_interrupt_mode.h b/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt_mode/inc/sample_flash_interrupt_mode.h deleted file mode 100644 index 8ae6d5609..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt_mode/inc/sample_flash_interrupt_mode.h +++ /dev/null @@ -1,29 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_flash_interrupt_mode.h - * @author MCU Driver Team - * @brief FLASH module sample. - * @details This file provides sample code for users to help use - * the functionalities of the FLASH. - */ -#ifndef McuMagicTag_SAMPLE_EFLASH_INTERRUPT_MODE_H -#define McuMagicTag_SAMPLE_EFLASH_INTERRUPT_MODE_H - -void FlashInterruptProcessing(void); - -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt_mode/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt_mode/init/main.c deleted file mode 100644 index 4b521d02a..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt_mode/init/main.c +++ /dev/null @@ -1,51 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ - -#include "typedefs.h" -#include "feature.h" -#include "sample_flash_interrupt_mode.h" -#include "main.h" - -/* USER CODE BEGIN 0 */ -/* USER CODE END 0 */ -UART_Handle g_uart0; -/* USER CODE BEGIN 1 */ -/* USER CODE END 1 */ - -int main(void) -{ - /* USER CODE BEGIN 2 */ - /* USER CODE END 2 */ - FlashInterruptProcessing(); - /* USER CODE BEGIN 3 */ - /* USER CODE END 3 */ - while (1) { - /* USER CODE BEGIN 4 */ - /* USER CODE END 4 */ - } - /* USER CODE BEGIN 5 */ - /* USER CODE END 5 */ - return BASE_STATUS_OK; -} - -/* USER CODE BEGIN 6 */ -/* USER CODE END 6 */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt_mode/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt_mode/init/main.h deleted file mode 100644 index 4d9eb3456..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt_mode/init/main.h +++ /dev/null @@ -1,48 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -#define XTAL_DRV_LEVEL4 0x03U -#define XTAL_DRV_LEVEL3 0x02U -#define XTAL_DRV_LEVEL2 0x01U -#define XTAL_DRV_LEVEL1 0x00U - -extern UART_Handle g_uart0; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt_mode/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt_mode/init/system_init.c deleted file mode 100644 index 76d16b56d..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt_mode/init/system_init.c +++ /dev/null @@ -1,94 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" -#include "iocmg_ip.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - /* Clock-related parameter configuration. */ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; - crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; - crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_1; - /* Initialize the clock configuration. */ - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); - /* UART-related parameter configuration. */ - g_uart0.baseAddress = UART0; - - g_uart0.baudRate = UART0_BAND_RATE; /* Setting the UART Baud Rate. */ - g_uart0.dataLength = UART_DATALENGTH_8BIT; - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; /* Disable uart fifo mode. */ - g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; - g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; - g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; - /* Initializing the UART0. */ - HAL_UART_Init(&g_uart0); -} - -static void IOConfig(void) -{ - HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt_mode/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt_mode/readme.md deleted file mode 100644 index ab52ee138..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt_mode/readme.md +++ /dev/null @@ -1,19 +0,0 @@ -# 配置FLASH以中断方式进行擦除、写入,通过Debug串口打印读取操作数据 -## 关键字: FLASH, 擦除,写入,读取,中断方式 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、FLASH控制器初始化和功能配置。通过中断方式对FLASH的PAGE 58-61区域进行擦除、写入,通过Debug串口打印读取的操作数据。 - -**【示例配置】** -+ FLASH操作内存选择:示例代码中选择了FLASH的PAGE 58-61区域进行操作,也可以选择其他FLASH的其它PAGE X进行操作。 - -+ FLASH初始化:调用接口"HAL_GPIO_Init()”完成对示例代码中FLASH的基地址、PE(擦除、写入方式)方式、回调函数、中断号进行配置。 - -+ 操作FLASH PAGE 58-61进行擦除、写入、读取操作:通过调用 "HAL_FLASH_EraseIT()"接口以中断方式实现对目标页的擦除;通过调用"HAL_FLASH_WriteIT()"接口以中断方式实现将数据写入到目标页中;通过调用"HAL_FLASH_Read()"接口实现对目标页内容的读取。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码中会依次对FLASH的目标页进行擦除、写入、读取测试。功能正常时Debug串口打印成功log信息及读取的数据内容;功能异常时Debug串口打印失败log信息。 - -**【注意事项】** -+ 示例代码使用UART0进行结果打印输出,需要对UART0配置。 -+ 对FLASH进行擦除和写操作时需谨慎操作,避免对存放运行程序代码的分区进行擦、写操作,否则会导致运行出错。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt_mode/src/sample_flash_interrupt_mode.c b/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt_mode/src/sample_flash_interrupt_mode.c deleted file mode 100644 index e2656c49f..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt_mode/src/sample_flash_interrupt_mode.c +++ /dev/null @@ -1,151 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_flash_interrupt_mode.c - * @author MCU Driver Team - * @brief Sample for Flash Module Interrupt. - * @details This file provides sample code for users to operate the flash memory in Interrupt mode. - * This example code operates on page58-page61 of the flash memory. (Be careful when - * performing the flash erasing operation to avoid damaging the running program code). - * This sample code demonstrates how to use the module initialization, read, write, and erase interfaces by - * operating on page58-page61 of the flash memory. The operation data is printed - * and output through the serial port. - */ -#include "main.h" -#include "flash.h" -#include "debug.h" -#include "sample_flash_interrupt_mode.h" - -#define FLASH_SAMPLE_FLAG_UNSET 0 -#define FLASH_SAMPLE_FLAG_SET 1 - -#define FLASH_TEMP_DATA_SIZE 4096 - -#define FLASH_SAMPLE_ERASE_NUM 4 /* Number of flash pages erased at a time */ -#define FLASH_SAMPLE_ERASE_START_ADDR FLASH_PAGE_58 /* The erase address must be 1k aligned. */ -#define FLASH_SAMPLE_READ_START_ADDR FLASH_PAGE_58 /* The read address must be byte-aligned. */ -#define FLASH_SAMPLE_WRITE_START_ADDR FLASH_PAGE_58 /* The write address must be 16-byte aligned. */ - -static FLASH_Handle g_flashInterruptHandle; -static unsigned char g_tempData[FLASH_TEMP_DATA_SIZE] = {0}; -static volatile unsigned int g_eraseDoneFlag = FLASH_SAMPLE_FLAG_UNSET; -static volatile unsigned int g_writeDoneFlag = FLASH_SAMPLE_FLAG_UNSET; - -/** - * @brief Flash interrupt sample handle. - * @param handle Flash handle. - * @param event Flash callback event. - * @param opAddr Current operation address. - * @retval None - */ -static void FlashInterruptHandle(void *handle, FLASH_CallBackEvent event, unsigned int opAddr) -{ - BASE_FUNC_UNUSED(handle); - switch (event) { - case FLASH_WRITE_EVENT_SUCCESS : /* One-time write success callback. */ - DBG_PRINTF("write success \r\n 0x%x \r\n", opAddr); - break; - case FLASH_WRITE_EVENT_DONE : /* All content is written. */ - g_writeDoneFlag = FLASH_SAMPLE_FLAG_SET; - DBG_PRINTF("write done \r\n"); - break; - case FLASH_WRITE_EVENT_FAIL : /* Write failed. */ - DBG_PRINTF("wtite failed\r\n 0x%x \r\n", opAddr); - break; - case FLASH_ERASE_EVENT_SUCCESS : /* One-time erase success callback. */ - DBG_PRINTF("erase success \r\n 0x%x \r\n", opAddr); - break; - case FLASH_ERASE_EVENT_DONE: /* All erase operations are complete. */ - g_eraseDoneFlag = FLASH_SAMPLE_FLAG_SET; - DBG_PRINTF("erase done \r\n"); - break; - case FLASH_ERASE_EVENT_FAIL : /* Erase failed. */ - DBG_PRINTF("erase failed\r\n 0x%x \r\n", opAddr); - break; - default : - break; - } -} - -/** - * @brief Flash interrupt sample init. - * @param None - * @retval None - */ -static void FlashInterruptInit(void) -{ - g_flashInterruptHandle.baseAddress = EFC; - g_flashInterruptHandle.peMode = FLASH_PE_OP_IT; - HAL_FLASH_Init(&g_flashInterruptHandle); - HAL_FLASH_RegisterCallback(&g_flashInterruptHandle, FlashInterruptHandle); - - IRQ_Register(IRQ_EFC, HAL_FLASH_IrqHandler, &g_flashInterruptHandle); - IRQ_Register(IRQ_EFC_ERR, HAL_FLASH_IrqHandlerError, &g_flashInterruptHandle); - IRQ_SetPriority(IRQ_EFC_ERR, 1); /* set gpio1 interrupt priority to 1, 1~15 */ - IRQ_SetPriority(IRQ_EFC, 1); /* set gpio1 interrupt priority to 1, 1~15 */ - IRQ_EnableN(IRQ_EFC); - IRQ_EnableN(IRQ_EFC_ERR); -} - -/** - * @brief Flash interrupt sample processing. - * @param None - * @retval None - */ -void FlashInterruptProcessing(void) -{ - BASE_StatusType ret; - unsigned char dataBuff[FLASH_TEMP_DATA_SIZE + 1] = {0}; - - SystemInit(); - FlashInterruptInit(); - /* Configure data to be written. */ - for (unsigned int i = 0 ; i < FLASH_TEMP_DATA_SIZE; i++) { - g_tempData[i] = 0x5A; - } - /* Perform the erase operation. */ - ret = HAL_FLASH_EraseIT(&g_flashInterruptHandle, FLASH_ERASE_MODE_PAGE, - FLASH_SAMPLE_ERASE_START_ADDR, FLASH_SAMPLE_ERASE_NUM); - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("Erase:0x%x fail\r\n ", FLASH_SAMPLE_ERASE_START_ADDR); - } - while (g_eraseDoneFlag == FLASH_SAMPLE_FLAG_UNSET) { - ; - } - /* Perform the programe operation. */ - ret = HAL_FLASH_WriteIT(&g_flashInterruptHandle, (uintptr_t)g_tempData, - FLASH_SAMPLE_WRITE_START_ADDR, FLASH_TEMP_DATA_SIZE); - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("Write:0x%x fail\r\n ", FLASH_SAMPLE_WRITE_START_ADDR); - } - while (g_writeDoneFlag == FLASH_SAMPLE_FLAG_UNSET) { - ; - } - /* Perform the read operation. */ - ret = HAL_FLASH_Read(&g_flashInterruptHandle, FLASH_SAMPLE_READ_START_ADDR, FLASH_TEMP_DATA_SIZE, - dataBuff, FLASH_TEMP_DATA_SIZE); - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("Read:0x%x fail\r\n ", FLASH_TEMP_DATA_SIZE); - } - /* Printf the contents read from the flash memory. */ - DBG_PRINTF("read addr :0x%x \r\n ", FLASH_SAMPLE_READ_START_ADDR); - for (unsigned int i = 0; i < FLASH_TEMP_DATA_SIZE; i++) { - DBG_PRINTF("%x ", dataBuff[i]); - } - DBG_PRINTF("\r\n"); - return; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_circle/inc/gpio_circle_sample.h b/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_circle/inc/gpio_circle_sample.h deleted file mode 100644 index 144adb00b..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_circle/inc/gpio_circle_sample.h +++ /dev/null @@ -1,30 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file gpio_circle_sample.h - * @author MCU Driver Team - * @brief GPIO module sample - * @details This file provides sample code for users to help use - * the circle input/output level of two GPIO groups. - */ - -#ifndef GPIO_CIRCLE_SAMPLE_H -#define GPIO_CIRCLE_SAMPLE_H - -BASE_StatusType GPIO_CircleSample(void); - -#endif /* GPIO_CIRCLE_SAMPLE_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_circle/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_circle/init/main.c deleted file mode 100644 index ad37d3921..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_circle/init/main.c +++ /dev/null @@ -1,37 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ -#include "feature.h" -#include "main.h" -#include "gpio_circle_sample.h" - -UART_Handle g_uart0; - -GPIO_Handle g_targetHandle; -GPIO_Handle g_refHandle; - -int main(void) -{ - GPIO_CircleSample(); - while (1) { - } - return BASE_STATUS_OK; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_circle/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_circle/init/main.h deleted file mode 100644 index 98e52e3b2..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_circle/init/main.h +++ /dev/null @@ -1,47 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "gpio.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -extern UART_Handle g_uart0; - -extern GPIO_Handle g_targetHandle; -extern GPIO_Handle g_refHandle; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_circle/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_circle/init/system_init.c deleted file mode 100644 index a5edf0d67..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_circle/init/system_init.c +++ /dev/null @@ -1,123 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void GPIO_Init(void) -{ - HAL_CRG_IpEnableSet(GPIO0_BASE, IP_CLK_ENABLE); - g_targetHandle.baseAddress = GPIO2; /* GPIO group */ - g_targetHandle.dir = GPIO_INPUT_MODE; - g_targetHandle.value = GPIO_LOW_LEVEL; - g_targetHandle.interruptMode = GPIO_INT_TYPE_NONE; - g_targetHandle.pins = GPIO_PIN_0; /* PIN in group */ - HAL_GPIO_Init(&g_targetHandle); - - HAL_CRG_IpEnableSet(GPIO1_BASE, IP_CLK_ENABLE); - g_refHandle.baseAddress = GPIO1; /* GPIO group */ - g_refHandle.dir = GPIO_OUTPUT_MODE; - g_refHandle.value = GPIO_LOW_LEVEL; - g_refHandle.interruptMode = GPIO_INT_TYPE_NONE; - g_refHandle.pins = GPIO_PIN_0; /* PIN in group */ - HAL_GPIO_Init(&g_refHandle); -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); - - g_uart0.baseAddress = UART0; - g_uart0.irqNum = IRQ_UART0; - g_uart0.baudRate = UART0_BAND_RATE; - g_uart0.dataLength = UART_DATALENGTH_8BIT; - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; - g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart0); -} - -static void IOConfig(void) -{ - IOConfig_RegStruct *iconfig = IOCONFIG; - - iconfig->iocmg_0.BIT.func = 0x0; /* 0x0 is GPIO0_0 */ - iconfig->iocmg_0.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_0.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_0.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_0.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_0.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_11.BIT.func = 0x0; /* 0x0 is GPIO1_0 */ - iconfig->iocmg_11.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_11.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_11.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_11.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_11.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ - iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ - iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - GPIO_Init(); - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_circle/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_circle/readme.md deleted file mode 100644 index 796e8f3f2..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_circle/readme.md +++ /dev/null @@ -1,22 +0,0 @@ -# 配置GPIO的方向与电平功能,实现GPIO两个管脚的环回测试 -## 关键字: GPIO, 管脚方向,管脚电平,环回测试 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、GPIO控制器初始化和功能配置。在GPIO的回环测试中使用GPIO的两个管脚,一个用于输入信号,另一个用于输出信号,将两个GPIO管脚连接验证GPIO的电平和方向功能;然后将GPIO管脚的角色反转再进行方向和电平功能验证,实现环回测试。 - -**【示例配置】** -+ GPIO管脚选择:示例代码中选择了两个GPIO管脚用于环回测试。也可以选择其他GPIO管脚用于环回测试,在"GPIO_Init()"接口中的"g_gpiox.baseAddress"可以配置其它GPIOX,g_gpiox.pins可以配置“GPIO_PIN_0-GPIO_PIN_7”中的任意一个。 - -+ GPIO管脚初始化:调用接口"HAL_GPIO_Init()”完成对示例代码中GPIO两个管脚的方向、电平、中断模式配置。在进行GPIO管脚配置时,需将其中一个管脚配置成输入模式、低电平、不使用中断模式,将另一个管脚配置成输出模式、低电平、不使用中断模式。 - -+ GPIO环回实验过程: - 1. 对于输出管脚调用接口"HAL_GPIO_SetValue()"用于切换输出管脚的电平值,对于输入管脚调用接口"HAL_GPIO_GetPinValue()"实现对输入电平值的获取,比较输入管脚获取的电平与输出管脚输出的电平,测试管脚电平输出、电平输入功能; - 2. 调用接口"HAL_GPIO_SetDirection()"切换输入管脚与输出管脚的角色; - 3. 再执行步骤1,测试管脚的电平输出、电平输入功能。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码中会依次对两个GPIO管脚进行方向、电平功能测试。功能正常时Debug串口打印成功log信息;功能异常时Debug串口打印失败log信息。 - -**【注意事项】** -+ 示例代码使用UART0进行结果打印输出,需要对UART0配置。 -+ 示例代码中使用GPIO两个管脚需连接在一起。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_circle/src/gpio_circle_sample.c b/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_circle/src/gpio_circle_sample.c deleted file mode 100644 index e94e5c6e8..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_circle/src/gpio_circle_sample.c +++ /dev/null @@ -1,99 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file gpio_circle_sample.c - * @author MCU Driver Team - * @brief GPIO module circle sample - * @details Two groups of GPIOs are configured. One group is used to transmit signals and \ - * the other group is used to receive signals. Then, a loopback is formed. The pin numbers of the \ - * two groups correspond to the level and direction functions of the GPIOs. If the hardware environment \ - * does not support this function, you need to set up an environment for verification. - */ - -/* ---------------------------------- Includes -------------------------------- */ -#include "debug.h" -#include "gpio.h" -#include "main.h" -#include "gpio_circle_sample.h" - -/* ---------------------------------- Sample Parameters -------------------------------- */ -static BASE_StatusType GpioLoopBackTest(void); -/** - * @brief Handle GPIO circle loopBack sample. - * @param None - * @retval Value of @ref BASE_StatusType. - */ -BASE_StatusType GPIO_CircleSample(void) -{ - SystemInit(); - - if (GpioLoopBackTest() == BASE_STATUS_ERROR) { - return BASE_STATUS_ERROR; - } - return BASE_STATUS_OK; -} -/** - * @brief Handle GPIO loopBack test. - * @retval Value of @ref BASE_StatusType. - */ -static BASE_StatusType GpioLoopBackTest(void) -{ - GPIO_Value ret; - /* Configure refHandle output and targetHandle input, Test Circle: refHandle -> targetHandle */ - HAL_GPIO_SetDirection(&TARGET_HANDLE, TARGET_PIN, GPIO_INPUT_MODE); - HAL_GPIO_SetDirection(&REF_HANDLE, REF_PIN, GPIO_OUTPUT_MODE); - HAL_GPIO_SetValue(&REF_HANDLE, REF_PIN, GPIO_HIGH_LEVEL); /* set refHandle high level */ - BASE_FUNC_DELAY_MS(1); /* 1: Wait 1ms for the level signal to stabilize. */ - ret = HAL_GPIO_GetPinValue(&TARGET_HANDLE, TARGET_PIN); /* get targetHandle's level */ - if (ret != GPIO_HIGH_LEVEL) { - DBG_PRINTF("ref GPIO output to target GPIO high level error!\r\n"); - return BASE_STATUS_ERROR; - } else { - DBG_PRINTF("ref GPIO output to target GPIO high level success!\r\n"); - } - HAL_GPIO_SetValue(&REF_HANDLE, REF_PIN, GPIO_LOW_LEVEL); /* set refHandle low level */ - BASE_FUNC_DELAY_MS(1); /* 1: Wait 1ms for the level signal to stabilize. */ - ret = HAL_GPIO_GetPinValue(&TARGET_HANDLE, TARGET_PIN); /* get targetHandle's level */ - if (ret != GPIO_LOW_LEVEL) { - DBG_PRINTF("ref GPIO output to target GPIO low level error!\r\n"); - return BASE_STATUS_ERROR; - } else { - DBG_PRINTF("ref GPIO output to target GPIO low level success!\r\n"); - } - /* Configure targetHandle output and refHandle input, Test Circle: targetHandle -> refHandle */ - HAL_GPIO_SetDirection(&TARGET_HANDLE, TARGET_PIN, GPIO_OUTPUT_MODE); - HAL_GPIO_SetDirection(&REF_HANDLE, REF_PIN, GPIO_INPUT_MODE); - HAL_GPIO_SetValue(&TARGET_HANDLE, TARGET_PIN, GPIO_HIGH_LEVEL); /* set targetHandle high level */ - BASE_FUNC_DELAY_MS(1); /* 1: Wait 1ms for the level signal to stabilize. */ - ret = HAL_GPIO_GetPinValue(&REF_HANDLE, REF_PIN); /* get refHandle's level */ - if (ret != GPIO_HIGH_LEVEL) { - DBG_PRINTF("target GPIO output to ref GPIO high level error! \r\n"); - return BASE_STATUS_ERROR; - } else { - DBG_PRINTF("target GPIO output to ref GPIO high level success!\r\n"); - } - HAL_GPIO_SetValue(&TARGET_HANDLE, TARGET_PIN, GPIO_LOW_LEVEL); /* set targetHandle high level */ - BASE_FUNC_DELAY_MS(1); /* 1: Wait 1ms for the level signal to stabilize. */ - ret = HAL_GPIO_GetPinValue(&REF_HANDLE, REF_PIN); /* get refHandle's level */ - if (ret != GPIO_LOW_LEVEL) { - DBG_PRINTF("target GPIO output to ref GPIO low level error! \r\n"); - return BASE_STATUS_ERROR; - } else { - DBG_PRINTF("target GPIO output to ref GPIO low level success!\r\n"); - } - return BASE_STATUS_OK; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_interrupt/inc/gpio_interrupt_sample.h b/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_interrupt/inc/gpio_interrupt_sample.h deleted file mode 100644 index b3b2eca26..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_interrupt/inc/gpio_interrupt_sample.h +++ /dev/null @@ -1,30 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file gpio_interrupt_sample.h - * @author MCU Driver Team - * @brief GPIO module sample - * @details This file provides sample code for users to help use - * the register and trigger gpio interrupt. - */ - -#ifndef GPIO_INT_SAMPLE_H -#define GPIO_INT_SAMPLE_H - -void GPIO_InterruptSample(void); - -#endif /* GPIO_INT_SAMPLE_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_interrupt/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_interrupt/init/main.c deleted file mode 100644 index cafa0bdc1..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_interrupt/init/main.c +++ /dev/null @@ -1,37 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ -#include "feature.h" -#include "main.h" -#include "gpio_interrupt_sample.h" - -UART_Handle g_uart0; - -GPIO_Handle g_intHandle; -GPIO_Handle g_trigHandle; - -int main(void) -{ - GPIO_InterruptSample(); - while (1) { - } - return BASE_STATUS_OK; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_interrupt/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_interrupt/init/main.h deleted file mode 100644 index e95bdb34e..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_interrupt/init/main.h +++ /dev/null @@ -1,49 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "gpio.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -extern UART_Handle g_uart0; - -extern GPIO_Handle g_intHandle; -extern GPIO_Handle g_trigHandle; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -void GPIO_CallBackFunc(void *param); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_interrupt/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_interrupt/init/system_init.c deleted file mode 100644 index e8fd3a6f7..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_interrupt/init/system_init.c +++ /dev/null @@ -1,137 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -__weak void GPIO_CallBackFunc(void *param) -{ - GPIO_Handle *handle = (GPIO_Handle *)param; - /* USER CODE BEGIN GPIO_CallBackFunc */ - /* USER CODE END GPIO_CallBackFunc */ - BASE_FUNC_UNUSED(handle); -} - -static void GPIO_Init(void) -{ - HAL_CRG_IpEnableSet(GPIO2_BASE, IP_CLK_ENABLE); - g_trigHandle.baseAddress = GPIO2; - g_trigHandle.dir = GPIO_OUTPUT_MODE; - g_trigHandle.value = GPIO_LOW_LEVEL; - g_trigHandle.interruptMode = GPIO_INT_TYPE_NONE; - g_trigHandle.pins = GPIO_PIN_0; - HAL_GPIO_Init(&g_trigHandle); - - HAL_CRG_IpEnableSet(GPIO1_BASE, IP_CLK_ENABLE); - g_intHandle.baseAddress = GPIO1; - g_intHandle.dir = GPIO_INPUT_MODE; - g_intHandle.value = GPIO_LOW_LEVEL; - g_intHandle.interruptMode = GPIO_INT_TYPE_HIGH_LEVEL; - g_intHandle.pins = GPIO_PIN_0; - HAL_GPIO_Init(&g_intHandle); - /* Register callback functions to be defined by users. */ - HAL_GPIO_RegisterCallBack(&g_intHandle, GPIO_PIN_0, GPIO_CallBackFunc); - g_intHandle.irqNum = IRQ_GPIO1; - HAL_GPIO_IRQService(&g_intHandle); /* Associating irqNum with Callbacks */ - IRQ_SetPriority(g_intHandle.irqNum, 1); /* set gpio1 interrupt priority to 1, 1~7 */ - IRQ_EnableN(g_intHandle.irqNum); /* gpio interrupt enable */ -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); - - g_uart0.baseAddress = UART0; - g_uart0.irqNum = IRQ_UART0; - g_uart0.baudRate = UART0_BAND_RATE; - g_uart0.dataLength = UART_DATALENGTH_8BIT; - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; - g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart0); -} - -static void IOConfig(void) -{ - IOConfig_RegStruct *iconfig = IOCONFIG; - - iconfig->iocmg_11.BIT.func = 0x0; /* 0x0 is GPIO1_0 */ - iconfig->iocmg_11.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_11.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_11.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_11.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_11.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_19.BIT.func = 0x0; /* 0x0 is GPIO2_0 */ - iconfig->iocmg_19.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_19.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_19.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_19.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_19.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ - iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ - iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - GPIO_Init(); - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_interrupt/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_interrupt/readme.md deleted file mode 100644 index 21a7f2bc3..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_interrupt/readme.md +++ /dev/null @@ -1,22 +0,0 @@ -# 配置GPIO管脚的中断功能,实现GPIO不同触发方式下中断功能测试 -## 关键字: GPIO, 中断,触发方式 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、GPIO控制器初始化和功能配置。在示例代码的中断功能测试中使用GPIO的两个管脚,一个用于输出信号,另一个用于作为中断管脚接收信号,在不同中断方式下触发GPIO的中断功能。 - -**【示例配置】** -+ GPIO管脚选择:示例代码中选择了两个GPIO管脚用于中断功能测试。也可以选择其他GPIO管脚用于中断功能测试,在"GPIO_Init()"接口中的"g_gpiox.baseAddress"可以配置其它GPIOX,g_gpiox.pins可以配置“GPIO_PIN_0-GPIO_PIN_7”中的任意一个。 - -+ GPIO管脚初始化:调用接口"HAL_GPIO_Init()”完成对示例代码中GPIO两个管脚的方向、电平、中断模式配置。在进行GPIO管脚配置时,需将其中一个管脚配置成输出模式、低电平、不使用中断模式,将另一个管脚配置成输入模式、低电平、高电平中断模式。之后,再调用中断相关接口注册、开启中断功能。 - -+ GPIO中断功能测试过程: - 1. 对于输出管脚调用接口"HAL_GPIO_SetValue()"变换管脚输出电平,从而直接或间接构造出高电平、低电平、上升沿、下降沿输出信号; - 2. 对于输入管脚调用接口"HAL_GPIO_SetIrqType()"设置管脚不同的中断触发类型; - 3. 通过输出管脚和输入管脚的相互配合实现不同触发类型的中断功能测试。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码中会依次进行不同触发模式的中断功能测试。功能正常时Debug串口打印成功log信息;功能异常时Debug串口打印失败log信息。 - -**【注意事项】** -+ 示例代码使用UART0进行结果打印输出,需要对UART0配置。 -+ 示例代码中使用GPIO两个管脚需连接在一起。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_interrupt/src/gpio_interrupt_sample.c b/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_interrupt/src/gpio_interrupt_sample.c deleted file mode 100644 index c5e807726..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_interrupt/src/gpio_interrupt_sample.c +++ /dev/null @@ -1,126 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file gpio_interrupt_sample.c - * @author MCU Driver Team - * @brief GPIO module trigger each interrupt type sample - * @details Set two groups of GPIOs. One group is used to provide the trigger condition \ - * for triggering the interrupt, and the other group is used to provide the interrupt response. The \ - * pin numbers of the two groups correspond to each other to verify the five interrupt types. If the \ - * hardware environment does not support this function, you need to set up an environment for verification. - */ - -/* Includes ------------------------------------------------------------------*/ -#include "debug.h" -#include "gpio.h" -#include "main.h" -#include "gpio_interrupt_sample.h" - -#define GPIO_LEVEL_SHIFT_SAFE_TIME 1 -static bool g_intFlag = false; -/* prototype functions -------------------------------------------------------*/ -void GPIO_CallBackFunc(void *param); -static void GPIO_InterruptTest(void); -/* Macro definitions ---------------------------------------------------------*/ - -/* ---------------------------------- Sample Parameters -------------------------------- */ -/** - * @brief GPIO Interrupt sample. - * @param None - * @retval Value of @ref BASE_StatusType. - */ -void GPIO_InterruptSample(void) -{ - SystemInit(); - DBG_PRINTF("GPIO Interrupt Sample \r\n"); - GPIO_InterruptTest(); -} - -/** - * @brief GPIO Interrupt callback function. - * @param param Value of @ref GPIO_Handle. - * @retval None - */ -void GPIO_CallBackFunc(void *param) -{ - GPIO_Handle *handle = (GPIO_Handle *)param; - GPIO_ASSERT_PARAM(handle != NULL); - GPIO_InterruptMode mode = HAL_GPIO_GetPinIrqType(handle, handle->pins); - DBG_PRINTF("In intMode[%d]'s callback -- ", mode); - if (mode == GPIO_INT_TYPE_HIGH_LEVEL) { - /* reverse trigHandle's value */ - HAL_GPIO_SetValue(&TRIG_HANDLE, TRIG_PIN, GPIO_LOW_LEVEL); - } else if (mode == GPIO_INT_TYPE_LOW_LEVEL) { - /* reverse trigHandle's value */ - HAL_GPIO_SetValue(&TRIG_HANDLE, TRIG_PIN, GPIO_HIGH_LEVEL); - } - g_intFlag = true; -} -/** - * @brief Check GPIO Interrupt state. - * @param None. - * @retval None - */ -static void CheckGpioIntState(void) -{ - /* true means into interrupt callback, false is not */ - if (g_intFlag == true) { - DBG_PRINTF("success ! \r\n"); - } else { - DBG_PRINTF("fail ! \r\n"); - } - g_intFlag = false; /* resumn status is false */ -} -/** - * @brief GPIO Interrupt test scene one: GPIO2 -> GPIO1. - * @param trigHandle the handle provide trig source. - * @param intHandle the handle generate interrupt. - * @retval None - */ -static void GPIO_InterruptTest(void) -{ - /* Test high level interrupt type */ - DBG_PRINTF(" Test high level interrupt type : trig GPIO -> int GPIO high level-------------------- "); - HAL_GPIO_SetValue(&TRIG_HANDLE, TRIG_PIN, GPIO_HIGH_LEVEL); /* Provide high level trig condition */ - BASE_FUNC_DELAY_MS(GPIO_LEVEL_SHIFT_SAFE_TIME); - CheckGpioIntState(); - /* Test low level interrupt type */ - DBG_PRINTF(" Test low level interrupt type : trig GPIO -> int GPIO low level-------------------- "); - HAL_GPIO_SetIrqType(&INT_HANDLE, INT_PIN, GPIO_INT_TYPE_LOW_LEVEL); /* change interrupt type to low level */ - BASE_FUNC_DELAY_MS(GPIO_LEVEL_SHIFT_SAFE_TIME); - CheckGpioIntState(); - /* Test rise level interrupt type */ - DBG_PRINTF(" Test rise level interrupt type : trig GPIO -> int GPIO rising edge-------------------- "); - HAL_GPIO_SetIrqType(&INT_HANDLE, INT_PIN, GPIO_INT_TYPE_RISE_EDGE); /* change interrupt type to rise type */ - HAL_GPIO_SetValue(&TRIG_HANDLE, TRIG_PIN, GPIO_LOW_LEVEL); /* Provide rise level trig condition */ - BASE_FUNC_DELAY_MS(GPIO_LEVEL_SHIFT_SAFE_TIME); - HAL_GPIO_SetValue(&TRIG_HANDLE, TRIG_PIN, GPIO_HIGH_LEVEL); - CheckGpioIntState(); - /* Test fall level interrupt type */ - DBG_PRINTF(" Test fall level interrupt type : trig GPIO -> int GPIO falling edge-------------------- "); - HAL_GPIO_SetIrqType(&INT_HANDLE, INT_PIN, GPIO_INT_TYPE_FALL_EDGE); /* change interrupt type to fall type */ - HAL_GPIO_SetValue(&TRIG_HANDLE, TRIG_PIN, GPIO_LOW_LEVEL); - BASE_FUNC_DELAY_MS(GPIO_LEVEL_SHIFT_SAFE_TIME); - CheckGpioIntState(); - /* Test high/low both level interrupt type */ - DBG_PRINTF(" Test high/low both level interrupt type : trig GPIO -> int GPIO both edge-------------------- "); - HAL_GPIO_SetIrqType(&INT_HANDLE, INT_PIN, GPIO_INT_TYPE_BOTH_EDGE); /* change interrupt type to both type */ - HAL_GPIO_SetValue(&TRIG_HANDLE, TRIG_PIN, GPIO_HIGH_LEVEL); - BASE_FUNC_DELAY_MS(GPIO_LEVEL_SHIFT_SAFE_TIME); - HAL_GPIO_SetValue(&TRIG_HANDLE, TRIG_PIN, GPIO_LOW_LEVEL); - CheckGpioIntState(); -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_key/inc/gpio_key_sample.h b/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_key/inc/gpio_key_sample.h deleted file mode 100644 index e490c9de9..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_key/inc/gpio_key_sample.h +++ /dev/null @@ -1,30 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file gpio_key_sample.h - * @author MCU Driver Team - * @brief GPIO module sample - * @details This file provides sample code for users to help use - * the trigger an interrupt based on the key connected to the GPIO. - */ - -#ifndef GPIO_KEY_SAMPLE_H -#define GPIO_KEY_SAMPLE_H - -BASE_StatusType GPIO_KeySample(void); - -#endif /* GPIO_KEY_SAMPLE_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_key/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_key/init/main.c deleted file mode 100644 index f0e073cb1..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_key/init/main.c +++ /dev/null @@ -1,36 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ -#include "feature.h" -#include "main.h" -#include "gpio_key_sample.h" - -UART_Handle g_uart0; - -GPIO_Handle g_keyHandle; - -int main(void) -{ - GPIO_KeySample(); - while (1) { - } - return BASE_STATUS_OK; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_key/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_key/init/main.h deleted file mode 100644 index fc21f4530..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_key/init/main.h +++ /dev/null @@ -1,48 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "gpio.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -extern UART_Handle g_uart0; - -extern GPIO_Handle g_keyHandle; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -void GPIO_CallBackFunc(void *param); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_key/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_key/init/system_init.c deleted file mode 100644 index 7f07ca92a..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_key/init/system_init.c +++ /dev/null @@ -1,121 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -__weak void GPIO_CallBackFunc(void *param) -{ - GPIO_Handle *handle = (GPIO_Handle *)param; - /* USER CODE BEGIN GPIO_CallBackFunc */ - /* USER CODE END GPIO_CallBackFunc */ - BASE_FUNC_UNUSED(handle); -} - -static void GPIO_Init(void) -{ - HAL_CRG_IpEnableSet(GPIO3_BASE, IP_CLK_ENABLE); - g_keyHandle.baseAddress = GPIO3; - g_keyHandle.dir = GPIO_INPUT_MODE; - g_keyHandle.value = GPIO_LOW_LEVEL; - g_keyHandle.interruptMode = GPIO_INT_TYPE_RISE_EDGE; - g_keyHandle.pins = GPIO_PIN_0; - HAL_GPIO_Init(&g_keyHandle); - /* Register callback functions to be defined by users. */ - HAL_GPIO_RegisterCallBack(&g_keyHandle, GPIO_PIN_0, GPIO_CallBackFunc); - g_keyHandle.irqNum = IRQ_GPIO3; - HAL_GPIO_IRQService(&g_keyHandle); - IRQ_SetPriority(g_keyHandle.irqNum, 1); /* set gpio1 interrupt priority to 1, 1~7 */ - IRQ_EnableN(g_keyHandle.irqNum); /* gpio interrupt enable */ -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); - g_uart0.baseAddress = UART0; - g_uart0.irqNum = IRQ_UART0; - g_uart0.baudRate = UART0_BAND_RATE; - g_uart0.dataLength = UART_DATALENGTH_8BIT; - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; - g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart0); -} - -static void IOConfig(void) -{ - IOConfig_RegStruct *iconfig = IOCONFIG; - - iconfig->iocmg_27.BIT.func = 0x0; /* 0x0 is GPIO3_0 */ - iconfig->iocmg_27.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_27.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_27.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_27.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_27.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ - iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ - iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - GPIO_Init(); - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_key/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_key/readme.md deleted file mode 100644 index 93ceff618..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_key/readme.md +++ /dev/null @@ -1,17 +0,0 @@ -# 配置GPIO管脚的中断功能,实现GPIO对按键检测 -## 关键字: GPIO, 中断,按键检测 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、GPIO控制器初始化和功能配置。在示例代码中通过中断的方式实现对按键的检测。 - -**【示例配置】** -+ GPIO管脚选择:示例代码中选择GPIO管脚用于通过中断方式进行按键检测。也可以选择其他GPIO管脚用于按键检测功能测试,在"GPIO_Init()"接口中的"g_gpiox.baseAddress"可以配置其它GPIOX,g_gpiox.pins可以配置“GPIO_PIN_0-GPIO_PIN_7”中的任意一个。 - -+ GPIO管脚初始化:调用接口"HAL_GPIO_Init()”完成对示例代码中GPIO管脚的方向、电平、中断模式配置。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码中在按键没有按下时Debug串口会一直打印等待按键的log信息,当连接的按键按下时功能正常时Debug串口打印成功log信息;功能异常时按下按键时Debug串口还是会一直打印等待按键的log信息。 - -**【注意事项】** -+ 示例代码使用UART0进行结果打印输出,需要对UART0配置。 -+ 示例代码中使用的GPIO管脚需和按键连接在一起。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_key/src/gpio_key_sample.c b/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_key/src/gpio_key_sample.c deleted file mode 100644 index 6ec5c721c..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_key/src/gpio_key_sample.c +++ /dev/null @@ -1,65 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file gpio_key_sample.c - * @author MCU Driver Team - * @brief GPIO module realize a key function sample - * @details GPIO Capturing Key Triggered Interrupt Service Function. If the hardware environment does \ - * not support this function, you need to set up an environment for verification. - */ - -/* Includes ------------------------------------------------------------------*/ -#include "debug.h" -#include "gpio.h" -#include "main.h" -#include "gpio_key_sample.h" - -#define PREVENT_SWIPE_SCREEN_TIME 50 -#define CYCLE_INTERVAL_TIME 500 - -/* prototype functions -------------------------------------------------------*/ -void GPIO_CallBackFunc(void *param); - -/* ---------------------------------- Sample Parameters ---------------------- */ -/** - * @brief GPIO key test sample. - * @param None - * @retval Value of @ref BASE_StatusType. - */ -BASE_StatusType GPIO_KeySample(void) -{ - SystemInit(); - /* Waiting for the key to come. */ - while (1) { - DBG_PRINTF("Wait key \r\n"); - BASE_FUNC_DELAY_MS(CYCLE_INTERVAL_TIME); - } - - return BASE_STATUS_OK; -} - -/** - * @brief GPIO register interrupt callback function. - * @param param Value of @ref GPIO_Handle. - * @retval None - */ -void GPIO_CallBackFunc(void *param) -{ - BASE_FUNC_UNUSED(param); - DBG_PRINTF("in GPIO Key Handler \r\n"); - BASE_FUNC_DELAY_MS(PREVENT_SWIPE_SCREEN_TIME); -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_led/inc/gpio_led_sample.h b/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_led/inc/gpio_led_sample.h deleted file mode 100644 index c5ddef433..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_led/inc/gpio_led_sample.h +++ /dev/null @@ -1,30 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file gpio_led_sample.h - * @author MCU Driver Team - * @brief GPIO module sample - * @details This file provides sample code for users to help use - * the GPIO flashing LEDs. - */ - -#ifndef GPIO_LED_SAMPLE_H -#define GPIO_LED_SAMPLE_H - -BASE_StatusType GPIO_LedSample(void); - -#endif /* GPIO_LED_SAMPLE_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_led/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_led/init/main.c deleted file mode 100644 index 923c56289..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_led/init/main.c +++ /dev/null @@ -1,36 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ -#include "feature.h" -#include "main.h" -#include "gpio_led_sample.h" - -UART_Handle g_uart0; - -GPIO_Handle g_ledHandle; - -int main(void) -{ - GPIO_LedSample(); - while (1) { - } - return BASE_STATUS_OK; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_led/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_led/init/main.h deleted file mode 100644 index d871dfc85..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_led/init/main.h +++ /dev/null @@ -1,46 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "gpio.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -extern UART_Handle g_uart0; - -extern GPIO_Handle g_ledHandle; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_led/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_led/init/system_init.c deleted file mode 100644 index 604c645f1..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_led/init/system_init.c +++ /dev/null @@ -1,109 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void GPIO_Init(void) -{ - HAL_CRG_IpEnableSet(GPIO5_BASE, IP_CLK_ENABLE); - g_ledHandle.baseAddress = GPIO5; /* can be config by ide */ - - g_ledHandle.dir = GPIO_OUTPUT_MODE; - g_ledHandle.value = GPIO_HIGH_LEVEL; - g_ledHandle.interruptMode = GPIO_INT_TYPE_NONE; - g_ledHandle.pins = GPIO_PIN_6; /* can be config by ide */ - HAL_GPIO_Init(&g_ledHandle); -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); - - g_uart0.baseAddress = UART0; - g_uart0.irqNum = IRQ_UART0; - g_uart0.baudRate = UART0_BAND_RATE; - g_uart0.dataLength = UART_DATALENGTH_8BIT; - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; - g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart0); -} - -static void IOConfig(void) -{ - IOConfig_RegStruct *iconfig; - - iconfig->iocmg_49.BIT.func = 0x0; /* 0x0 is GPIO5_6 */ - iconfig->iocmg_49.BIT.ds = IO_DRV_LEVEL1; - iconfig->iocmg_49.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_49.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_49.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_49.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ - iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ - iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - GPIO_Init(); - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_led/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_led/readme.md deleted file mode 100644 index 048b59644..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_led/readme.md +++ /dev/null @@ -1,19 +0,0 @@ -# 配置GPIO管脚的电平反转功能,实现GPIO管脚控制LED灯的亮灭 -## 关键字: GPIO, 电平反转,LED - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、GPIO控制器初始化和功能配置。在示例代码中通过控制GPIO管脚的电平翻转实现控制LED灯的亮灭控制。 - -**【示例配置】** -+ GPIO管脚选择:示例代码中选择GPIO管脚用于控制LED灯亮灭。也可以选择其他GPIO管脚用于控制LED的功能,在"GPIO_Init()"接口中的"g_gpiox.baseAddress"可以配置其它GPIOX,g_gpiox.pins可以配置“GPIO_PIN_0-GPIO_PIN_7”中的任意一个。 - -+ GPIO管脚初始化:调用接口"HAL_GPIO_Init()”完成对示例代码中GPIO管脚的方向、电平、中断模式配置。 - -+ GPIO管脚实现对LED灯控制:对于输出管脚调用接口"HAL_GPIO_TogglePin()"实现管脚电平翻转,结合延时函数实现GPIO管脚控制LED灯每50ms亮灭状态反转一次。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码中会控制GPIO管脚连接的LED每50ms进行一次亮灭,每反转一次电平Debug串口会打印一条信息。 - -**【注意事项】** -+ 示例代码使用UART0进行结果打印输出,需要对UART0配置。 -+ 示例代码中使用的GPIO管脚需和LED灯连接在一起。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_led/src/gpio_led_sample.c b/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_led/src/gpio_led_sample.c deleted file mode 100644 index 67ee9be6c..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_led/src/gpio_led_sample.c +++ /dev/null @@ -1,49 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file gpio_led_sample.c - * @author MCU Driver Team - * @brief GPIO module realize a led on/off function sample - * @details Controls the LED to turn on and off. The status is reversed every 50 ms. If the hardware environment \ - * does not support this function, you need to set up an environment for verification. - */ - -/* Includes ------------------------------------------------------------------*/ -#include "debug.h" -#include "gpio.h" -#include "main.h" -#include "gpio_led_sample.h" - -#define CYCLE_INTERVAL_TIME 500 - -/* ---------------------------------- Sample Parameters -------------------------------- */ -/** - * @brief Test GPIO PIN control LED. - * @param None - * @retval Value of @ref BASE_StatusType. - */ -BASE_StatusType GPIO_LedSample(void) -{ - SystemInit(); - /* Cycle control LED on and off. */ - while (1) { - BASE_FUNC_DELAY_MS(CYCLE_INTERVAL_TIME); - HAL_GPIO_TogglePin(&LED_HANDLE, LED_PIN); - DBG_PRINTF("LED Stata reverse! \r\n"); - } - return BASE_STATUS_OK; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_period_interrupt/inc/sample_gpt_period_interrupt.h b/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_period_interrupt/inc/sample_gpt_period_interrupt.h deleted file mode 100644 index e4a97037e..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_period_interrupt/inc/sample_gpt_period_interrupt.h +++ /dev/null @@ -1,32 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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.. - * @file sample_gpt_period_interrupt.h - * @author MCU Driver Team - * @brief gpt sample module. - * @details This file provides users with sample code to help use GPT function: - * GPT runs、GPT period interrupt. - */ -#ifndef SAMPLE_GPT_PERIOD_INTERRUPT_H -#define SAMPLE_GPT_PERIOD_INTERRUPT_H - -#include "debug.h" -#include "gpt.h" -#include "main.h" - -void GPT_PeriodInterrupt(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_period_interrupt/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_period_interrupt/init/main.c deleted file mode 100644 index 488358078..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_period_interrupt/init/main.c +++ /dev/null @@ -1,51 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ - -#include "typedefs.h" -#include "feature.h" -#include "sample_gpt_period_interrupt.h" -#include "main.h" -/* USER CODE BEGIN 0 */ -/* USER CODE END 0 */ -GPT_Handle g_gptHandle; -UART_Handle g_uart0Handle; -/* USER CODE BEGIN 1 */ -/* USER CODE END 1 */ - -int main(void) -{ - /* USER CODE BEGIN 2 */ - /* USER CODE END 2 */ - GPT_PeriodInterrupt(); - /* USER CODE BEGIN 3 */ - /* USER CODE END 3 */ - while (1) { - /* USER CODE BEGIN 4 */ - /* USER CODE END 4 */ - } - /* USER CODE BEGIN 5 */ - /* USER CODE END 5 */ - return BASE_STATUS_OK; -} - -/* USER CODE BEGIN 6 */ -/* USER CODE END 6 */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_period_interrupt/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_period_interrupt/init/main.h deleted file mode 100644 index 07b818abd..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_period_interrupt/init/main.h +++ /dev/null @@ -1,53 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "uart_ex.h" -#include "gpt.h" -#include "gpt_ex.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -#define XTAL_DRV_LEVEL4 0x03U -#define XTAL_DRV_LEVEL3 0x02U -#define XTAL_DRV_LEVEL2 0x01U -#define XTAL_DRV_LEVEL1 0x00U - -extern GPT_Handle g_gptHandle; -extern UART_Handle g_uart0Handle; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); -void GPT2PWMOutputFinishCallBack(void *handle); -void GPT2PWMPeriodOutputFinishCallBack(void *handle); -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_period_interrupt/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_period_interrupt/init/system_init.c deleted file mode 100644 index 71aae6109..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_period_interrupt/init/system_init.c +++ /dev/null @@ -1,137 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" -#include "iocmg.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 48; /* PLL Multiplier 48 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_2; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; - crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; - crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; - - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -__weak void GPT2PWMOutputFinishCallBack(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN IRQ_GPT2_INT */ - /* USER CODE END IRQ_GPT2_INT */ -} - -__weak void GPT2PWMPeriodOutputFinishCallBack(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN IRQ_GPT2_PRD_INT */ - /* USER CODE END IRQ_GPT2_PRD_INT */ -} - -static void GPT2_Init(void) -{ - HAL_CRG_IpEnableSet(GPT2_BASE, IP_CLK_ENABLE); - - g_gptHandle.baseAddress = GPT2; - g_gptHandle.clockDiv = 9; /* 9 is the internal frequency division of GPT */ - g_gptHandle.period = 49999; /* 49999 is the number of GPT counting cycles. */ - g_gptHandle.refA0.refdot = 10000; /* 10000 is the value of PWM reference point A. */ - g_gptHandle.refA0.refAction = GPT_ACTION_OUTPUT_HIGH; /* GPT Action high */ - g_gptHandle.refB0.refdot = 30000; /* 30000 is the value of PWM reference point B. */ - g_gptHandle.refB0.refAction = GPT_ACTION_OUTPUT_LOW; - g_gptHandle.bufLoad = BASE_CFG_ENABLE; - g_gptHandle.pwmKeep = BASE_CFG_ENABLE; - g_gptHandle.handleEx.periodIntEnable = BASE_CFG_ENABLE; - g_gptHandle.handleEx.outputFinIntEnable = BASE_CFG_ENABLE; - g_gptHandle.triggleAdcOutFinish = BASE_CFG_DISABLE; - g_gptHandle.triggleAdcPeriod = BASE_CFG_DISABLE; - HAL_GPT_Init(&g_gptHandle); - HAL_GPT_RegisterCallBack(&g_gptHandle, GPT_INT_PWM_OUTPUT_FIN, GPT2PWMOutputFinishCallBack); - IRQ_Register(IRQ_GPT2_INT, HAL_GPT_IrqOutFinishHandler, &g_gptHandle); - IRQ_SetPriority(IRQ_GPT2_INT, 1); - IRQ_EnableN(IRQ_GPT2_INT); - HAL_GPT_RegisterCallBack(&g_gptHandle, GPT_INT_PERIOD, GPT2PWMPeriodOutputFinishCallBack); - IRQ_Register(IRQ_GPT2_PRD_INT, HAL_GPT_IrqPeriodHandler, &g_gptHandle); - IRQ_SetPriority(IRQ_GPT2_PRD_INT, 1); - IRQ_EnableN(IRQ_GPT2_PRD_INT); -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - g_uart0Handle.baseAddress = UART0; - g_uart0Handle.baudRate = UART0_BAND_RATE; - g_uart0Handle.dataLength = UART_DATALENGTH_8BIT; - g_uart0Handle.stopBits = UART_STOPBITS_ONE; - g_uart0Handle.parity = UART_PARITY_NONE; - g_uart0Handle.txMode = UART_MODE_BLOCKING; - g_uart0Handle.rxMode = UART_MODE_BLOCKING; - g_uart0Handle.fifoMode = BASE_CFG_ENABLE; - g_uart0Handle.fifoTxThr = UART_FIFODEPTH_SIZE8; - g_uart0Handle.fifoRxThr = UART_FIFODEPTH_SIZE8; - g_uart0Handle.hwFlowCtr = BASE_CFG_DISABLE; - g_uart0Handle.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; - g_uart0Handle.handleEx.msbFirst = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart0Handle); -} - -static void IOConfig(void) -{ - HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO5_2_AS_GPT2_PWM); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO5_2_AS_GPT2_PWM, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO5_2_AS_GPT2_PWM, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO5_2_AS_GPT2_PWM, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO5_2_AS_GPT2_PWM, DRIVER_RATE_2); /* Output signal edge fast/slow */ -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - GPT2_Init(); - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_period_interrupt/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_period_interrupt/readme.md deleted file mode 100644 index eb7814a2b..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_period_interrupt/readme.md +++ /dev/null @@ -1,24 +0,0 @@ -# 通用脉宽调制PWM-周期中断 -## 关键字: PWM, 周期中断 - -**【功能描述】** -+ 该GPT示例中产生连续的PWM波。 - -+ 每个PWM波输出完之后,都会产生周期中断。 - -**【示例配置】** -+ 示例默认输出周期为0.02s,占空比为40%的PWM波,其中周期可通过配置Period项更改,占空比可通过refA0和RefB0的参考值进行更改。 - -+ 每个PWM波输出完成之后,都会产生周期中断,调用周期中断回调函数,示例样例回调函数为“GPT2PWMPeriodOutputFinishCallBack”。 - -**【示例效果】** -+ 在IOCMG_8输出连续方波,如果IOCMG_8上无对应外设,可通过示波器观察方波的周期和占空比。 - -+ 串口0提示GPT输出信息和中期中断回调函数输出的信息。 - -**【注意事项】** -+ 更改PWM的周期和占空比一般先使用“HAL_GPT_GetConfig”获取GPT的配置,再使用“HAL_GPT_Config”更改GPT的配置。 - -+ 串口0输出提示信息。 - -+ ```c输出的PWMPWM频率=工作时钟频率/((分频系数+1)*(计数周期值+1))``` \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_period_interrupt/src/sample_gpt_period_interrupt.c b/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_period_interrupt/src/sample_gpt_period_interrupt.c deleted file mode 100644 index 2c31f3288..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_period_interrupt/src/sample_gpt_period_interrupt.c +++ /dev/null @@ -1,51 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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.. - * @file sample_gpt_period_interrupt.c - * @author MCU Driver Team - * @brief gpt sample module. - * @details This file provides users with sample code to help use GPT function: - * 1) Generate a continuous square wave with period and duty set in the function SystemInit. - * 2) GPT period interrupt callback. - */ -#include "sample_gpt_period_interrupt.h" - -/** - * @brief GPT period interrupt callback - * @param None. - * @retval None. - */ -void GPT2PWMPeriodOutputFinishCallBack(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN IRQ_GPT2_PRD_INT */ - DBG_PRINTF("GPT period interrupt\n"); - /* USER CODE END IRQ_GPT2_PRD_INT */ -} - -/** - * @brief GPT run and modify period and duty during running. - * @param None. - * @retval None. - */ -void GPT_PeriodInterrupt(void) -{ - SystemInit(); - DBG_PRINTF("GPT Continued Run begin\r\n"); - HAL_GPT_Start(&g_gptHandle); - BASE_FUNC_DelaySeconds(10); /* Delay 10 seconds */ -} diff --git a/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_pwm_output/inc/sample_gpt_pwm_output.h b/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_pwm_output/inc/sample_gpt_pwm_output.h deleted file mode 100644 index d6ffdd89c..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_pwm_output/inc/sample_gpt_pwm_output.h +++ /dev/null @@ -1,32 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_gpt_pwm_output.h - * @author MCU Driver Team - * @brief gpt sample module. - * @details This file provides users with sample code to help use GPT function: - * GPT runs. - */ -#ifndef SAMPLE_GPT_PWM_OUTPUT_H -#define SAMPLE_GPT_PWM_OUTPUT_H - -#include "debug.h" -#include "gpt.h" -#include "main.h" - -void GPT_SampleMain(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_pwm_output/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_pwm_output/init/main.c deleted file mode 100644 index d2fa4c090..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_pwm_output/init/main.c +++ /dev/null @@ -1,51 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ - -#include "typedefs.h" -#include "feature.h" -#include "sample_gpt_pwm_output.h" -#include "main.h" -/* USER CODE BEGIN 0 */ -/* USER CODE END 0 */ -GPT_Handle g_gptHandle; -UART_Handle g_uart0Handle; -/* USER CODE BEGIN 1 */ -/* USER CODE END 1 */ - -int main(void) -{ - /* USER CODE BEGIN 2 */ - /* USER CODE END 2 */ - GPT_SampleMain(); - /* USER CODE BEGIN 3 */ - /* USER CODE END 3 */ - while (1) { - /* USER CODE BEGIN 4 */ - /* USER CODE END 4 */ - } - /* USER CODE BEGIN 5 */ - /* USER CODE END 5 */ - return BASE_STATUS_OK; -} - -/* USER CODE BEGIN 6 */ -/* USER CODE END 6 */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_pwm_output/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_pwm_output/init/main.h deleted file mode 100644 index 7c9ef5f69..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_pwm_output/init/main.h +++ /dev/null @@ -1,52 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "uart_ex.h" -#include "gpt.h" -#include "gpt_ex.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -#define XTAL_DRV_LEVEL4 0x03U -#define XTAL_DRV_LEVEL3 0x02U -#define XTAL_DRV_LEVEL2 0x01U -#define XTAL_DRV_LEVEL1 0x00U - -extern GPT_Handle g_gptHandle; -extern UART_Handle g_uart0Handle; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_pwm_output/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_pwm_output/init/system_init.c deleted file mode 100644 index aa921e15c..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_pwm_output/init/system_init.c +++ /dev/null @@ -1,118 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" -#include "iocmg.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 48; /* PLL Multiplier 48 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_2; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; - crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; - crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; - - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void GPT2_Init(void) -{ - HAL_CRG_IpEnableSet(GPT2_BASE, IP_CLK_ENABLE); - - g_gptHandle.baseAddress = GPT2; - g_gptHandle.clockDiv = 9; /* 9 is the internal frequency division of GPT */ - g_gptHandle.period = 49999; /* 49999 is the number of GPT counting cycles. */ - g_gptHandle.refA0.refdot = 10000; /* 10000 is the value of PWM reference point A. */ - g_gptHandle.refA0.refAction = GPT_ACTION_OUTPUT_HIGH; /* GPT Action high */ - g_gptHandle.refB0.refdot = 30000; /* 30000 is the value of PWM reference point B. */ - g_gptHandle.refB0.refAction = GPT_ACTION_OUTPUT_LOW; - g_gptHandle.bufLoad = BASE_CFG_ENABLE; - g_gptHandle.pwmKeep = BASE_CFG_ENABLE; - g_gptHandle.handleEx.periodIntEnable = BASE_CFG_DISABLE; - g_gptHandle.handleEx.outputFinIntEnable = BASE_CFG_DISABLE; - g_gptHandle.triggleAdcOutFinish = BASE_CFG_DISABLE; - g_gptHandle.triggleAdcPeriod = BASE_CFG_DISABLE; - - HAL_GPT_Init(&g_gptHandle); -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - - g_uart0Handle.baseAddress = UART0; - - g_uart0Handle.baudRate = UART0_BAND_RATE; - g_uart0Handle.dataLength = UART_DATALENGTH_8BIT; - g_uart0Handle.stopBits = UART_STOPBITS_ONE; - g_uart0Handle.parity = UART_PARITY_NONE; - g_uart0Handle.txMode = UART_MODE_BLOCKING; - g_uart0Handle.rxMode = UART_MODE_BLOCKING; - g_uart0Handle.fifoMode = BASE_CFG_ENABLE; - g_uart0Handle.fifoTxThr = UART_FIFODEPTH_SIZE8; - g_uart0Handle.fifoRxThr = UART_FIFODEPTH_SIZE8; - g_uart0Handle.hwFlowCtr = BASE_CFG_DISABLE; - g_uart0Handle.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; - g_uart0Handle.handleEx.msbFirst = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart0Handle); -} - -static void IOConfig(void) -{ - HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO5_2_AS_GPT2_PWM); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO5_2_AS_GPT2_PWM, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO5_2_AS_GPT2_PWM, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO5_2_AS_GPT2_PWM, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO5_2_AS_GPT2_PWM, DRIVER_RATE_2); /* Output signal edge fast/slow */ -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - GPT2_Init(); - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_pwm_output/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_pwm_output/readme.md deleted file mode 100644 index 90349ef63..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_pwm_output/readme.md +++ /dev/null @@ -1,24 +0,0 @@ -# 通用脉宽调制PWM-输出频率和占空比可配的PWM波 -## 关键字: PWM, 占空比 - -**【功能描述】** -+ 该GPT示例中产生连续的PWM波。 - -+ 持续输出10s的PWM波之后,会更改PWM的周期和占空比。 - -**【示例配置】** -+ 示例默认输出频率50Hz,占空比为40%的PWM波,其中周期可通过配置Period项更改,占空比可通过refA0和RefB0的参考值进行更改。 - -+ 定时器计时10s之后,通过“HAL_GPT_Config”函数,更改GPT输出PWM波的周期和占空比。 - -**【示例效果】** -+ 在IOCMG_8输出连续方波,如果IOCMG_8上无对应外设,可通过示波器观察方波的周期和占空比。 - -+ 串口0提示GPT输出信息和更改参数的信息。 - -**【注意事项】** -+ 更改PWM的周期和占空比一般先使用“HAL_GPT_GetConfig”获取GPT的配置,再使用“HAL_GPT_Config”更改GPT的配置。 - -+ 串口0输出提示信息。 - -+ ```c输出的PWMPWM频率=工作时钟频率/((分频系数+1)*(计数周期值+1))``` \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_pwm_output/src/sample_gpt_pwm_output.c b/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_pwm_output/src/sample_gpt_pwm_output.c deleted file mode 100644 index 10f03685e..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_pwm_output/src/sample_gpt_pwm_output.c +++ /dev/null @@ -1,45 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_gpt_pwm_output.c - * @author MCU Driver Team - * @brief gpt sample module. - * @details This file provides users with sample code to help use GPT function: - * 1) Generate a continuous square wave with period and duty set in the function SystemInit. - * 2) Change the period and duty. - */ -#include "sample_gpt_pwm_output.h" - -/** - * @brief GPT run and modify period and duty during running. - * @param None. - * @retval None. - */ -void GPT_SampleMain(void) -{ - SystemInit(); - DBG_PRINTF("GPT Continued Run begin\r\n"); - HAL_GPT_Start(&g_gptHandle); - BASE_FUNC_DelaySeconds(10); /* Delay 10 seconds */ - DBG_PRINTF("Change the duty to 50%%\r\n"); - - HAL_GPT_GetConfig(&g_gptHandle); - g_gptHandle.period = 59999; /* 59999 is the number of GPT counting cycles. */ - g_gptHandle.refA0.refdot = 20000; /* 20000 is the value of PWM reference point A. */ - g_gptHandle.refB0.refdot = 50000; /* 50000 is the value of PWM reference point A. */ - HAL_GPT_Config(&g_gptHandle); -} diff --git a/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_simplerun/inc/sample_gpt_simplerun.h b/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_simplerun/inc/sample_gpt_simplerun.h deleted file mode 100644 index 91fd12586..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_simplerun/inc/sample_gpt_simplerun.h +++ /dev/null @@ -1,32 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_gpt_simplerun.h - * @author MCU Driver Team - * @brief gpt sample module. - * @details This file provides users with sample code to help use GPT function: - * GPT runs. - */ -#ifndef SAMPLE_GPT_SIMPLERUN_H -#define SAMPLE_GPT_SIMPLERUN_H - -#include "debug.h" -#include "gpt.h" -#include "main.h" - -void GPT_SampleMain(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_simplerun/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_simplerun/init/main.c deleted file mode 100644 index d2407363e..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_simplerun/init/main.c +++ /dev/null @@ -1,36 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "feature.h" -#include "main.h" -#include "sample_gpt_simplerun.h" - -GPT_Handle g_gptHandle; -UART_Handle g_uart0Handle; - -int main(void) -{ - GPT_SampleMain(); - while (1) { - } - return BASE_STATUS_OK; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_simplerun/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_simplerun/init/main.h deleted file mode 100644 index 11edb26a6..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_simplerun/init/main.h +++ /dev/null @@ -1,46 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "gpt.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -extern GPT_Handle g_gptHandle; - -extern UART_Handle g_uart0Handle; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_simplerun/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_simplerun/init/system_init.c deleted file mode 100644 index 70ada1e1c..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_simplerun/init/system_init.c +++ /dev/null @@ -1,112 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void GPT1_Init(void) -{ - HAL_CRG_IpEnableSet(GPT1_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(GPT1_BASE, CRG_PLL_NO_PREDV); - - g_gptHandle.baseAddress = GPT1; - g_gptHandle.period = 10000 * 1000; /* Period counter, Period = 10000us, 1000ns in 1us */ - g_gptHandle.duty = 10000 * 10 * 10; /* Duty counter, duty = 10000 / 10 us */ - g_gptHandle.pwmPolarity = BASE_CFG_ENABLE; /* Continuous output */ - g_gptHandle.pwmKeep = BASE_CFG_ENABLE; /* Continuous output */ - HAL_GPT_Init(&g_gptHandle); -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); - - g_uart0Handle.baseAddress = UART0; - g_uart0Handle.irqNum = IRQ_UART0; - - g_uart0Handle.baudRate = UART0_BAND_RATE; - g_uart0Handle.dataLength = UART_DATALENGTH_8BIT; - g_uart0Handle.stopBits = UART_STOPBITS_ONE; - g_uart0Handle.parity = UART_PARITY_NONE; - g_uart0Handle.txMode = UART_MODE_BLOCKING; - g_uart0Handle.rxMode = UART_MODE_BLOCKING; - g_uart0Handle.fifoMode = BASE_CFG_ENABLE; - g_uart0Handle.fifoTxThr = UART_FIFOFULL_ONE_TWO; - g_uart0Handle.fifoRxThr = UART_FIFOFULL_ONE_TWO; - g_uart0Handle.hwFlowCtr = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart0Handle); -} - -static void IOConfig(void) -{ - IOConfig_RegStruct *iconfig = IOCONFIG; - - iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ - iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ - iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_14.BIT.func = 0x2; /* 0x2 is GPT1_PWM */ - iconfig->iocmg_14.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_14.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_14.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_14.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_14.BIT.se = BASE_CFG_DISABLE; -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - GPT1_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_simplerun/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_simplerun/readme.md deleted file mode 100644 index c77b1f1cf..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_simplerun/readme.md +++ /dev/null @@ -1,18 +0,0 @@ -# 输出占空比可配的PWM波 -## 关键字: PWM, PWM波 - -**【功能描述】** -+ 该GPT示例中产生连续的PWM波,周期和占空比可配。 - -**【示例配置】** -+ 该示例默认输出频率50Hz,占空比为40%的PWM波,周期和占空比均可通过“HAL_GPT_Config”进行更改。 - -**【示例效果】** -+ 串口0提示GPT输出信息和更改参数的信息。 - -+ 在IOCMG_8输出连续方波,如果IOCMG_8上无对应外设,可通过示波器观察方波的周期和占空比。 - -**【注意事项】** -+ 更改PWM的周期和占空比一般先使用“HAL_GPT_GetConfig”获取GPT的配置,再使用“HAL_GPT_Config”更改GPT的配置。 - -+ 输出频率计算:```c输出的PWMPWM频率=工作时钟频率/((分频系数+1)*(计数周期值+1))``` \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_simplerun/src/sample_gpt_simplerun.c b/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_simplerun/src/sample_gpt_simplerun.c deleted file mode 100644 index 7e6e9ad6b..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_simplerun/src/sample_gpt_simplerun.c +++ /dev/null @@ -1,53 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_gpt_simplerun.c - * @author MCU Driver Team - * @brief gpt sample module. - * @details This file provides users with sample code to help use GPT function: - * 1) Generate a continuous square wave with period and duty set in the function SystemInit. - * 2) Change the period and duty, or any parameters you need to modify during gpt running - * Output square wave at iocmg_8. If no peripheral is connected to iocmg_8, please use an - * oscilloscope to measure the output square wave. - */ -#include "sample_gpt_simplerun.h" - -/** - * @brief GPT run and modify period and duty during running. - * @param None. - * @retval None. - */ -void GPT_SampleMain(void) -{ - GPT_Handle gpt; - SystemInit(); - DBG_PRINTF("GPT Continued Run begin\r\n"); - HAL_GPT_Start(&g_gptHandle); - - BASE_FUNC_DelaySeconds(10); /* Delay 10 seconds */ - gpt.baseAddress = g_gptHandle.baseAddress; - if (HAL_GPT_GetConfig(&gpt) != BASE_STATUS_OK) { - return; - } - - DBG_PRINTF("Change GPT Period and duty\r\n"); - gpt.period = 5000000; /* Change period to 5000000 ns */ - gpt.duty = 1000000; /* Change period to 1000000 ns */ - if (HAL_GPT_Config(&gpt) != BASE_STATUS_OK) { - return; - } -} diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_blocking_stlm75/inc/sample_i2c_blocking_stlm75.h b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_blocking_stlm75/inc/sample_i2c_blocking_stlm75.h deleted file mode 100644 index f8b03b2a0..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_blocking_stlm75/inc/sample_i2c_blocking_stlm75.h +++ /dev/null @@ -1,29 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_i2c_blocking_stlm75.h - * @author MCU Driver Team - * @brief I2C module sample. - * @details This file provides sample code for users to help use - * the functionalities of the I2C. - */ -#ifndef McuMagicTag_SAMPLE_I2C_BLOCKING_STLM75_H -#define McuMagicTag_SAMPLE_I2C_BLOCKING_STLM75_H - -unsigned int Stlm75SampleProcessing(void); - -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_blocking_stlm75/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_blocking_stlm75/init/main.c deleted file mode 100644 index fa66b1c86..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_blocking_stlm75/init/main.c +++ /dev/null @@ -1,35 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ -#include "feature.h" -#include "main.h" -#include "sample_i2c_blocking_stlm75.h" - -I2C_Handle g_i2cSampleHandle; -UART_Handle g_uart0; - -int main(void) -{ - Stlm75SampleProcessing(); - while (1) { - } - return BASE_STATUS_OK; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_blocking_stlm75/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_blocking_stlm75/init/main.h deleted file mode 100644 index 3172be17a..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_blocking_stlm75/init/main.h +++ /dev/null @@ -1,46 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "i2c.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -extern I2C_Handle g_i2cSampleHandle; - -extern UART_Handle g_uart0; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_blocking_stlm75/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_blocking_stlm75/init/system_init.c deleted file mode 100644 index 898405abd..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_blocking_stlm75/init/system_init.c +++ /dev/null @@ -1,127 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" - -#define UART0_BAND_RATE 115200 - -#define I2C_FREQ_SCR 100000 -#define I2C_HOLD_DURATION 10 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void I2C_Init(void) -{ - HAL_CRG_IpEnableSet(I2C_BASE, IP_CLK_ENABLE); - - g_i2cSampleHandle.baseAddress = I2C; - g_i2cSampleHandle.irqNum = IRQ_I2C; - - g_i2cSampleHandle.addrMode = I2C_7_BITS; - g_i2cSampleHandle.sdaHoldTime = I2C_HOLD_DURATION; - g_i2cSampleHandle.freq = I2C_FREQ_SCR; - g_i2cSampleHandle.rxBuff = NULL; - g_i2cSampleHandle.txBuff = NULL; - g_i2cSampleHandle.ignoreAckFlag = BASE_CFG_DISABLE; - g_i2cSampleHandle.msgStopFlag = BASE_CFG_ENABLE; - g_i2cSampleHandle.state = I2C_STATE_RESET; - HAL_I2C_Init(&g_i2cSampleHandle); -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); - - g_uart0.baseAddress = UART0; - g_uart0.irqNum = IRQ_UART0; - - g_uart0.baudRate = UART0_BAND_RATE; - g_uart0.dataLength = UART_DATALENGTH_8BIT; - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; - g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart0); -} - -static void IOConfig(void) -{ - IOConfig_RegStruct *iconfig = IOCONFIG; - - iconfig->iocmg_14.BIT.func = 0x5; /* 0x5 is I2C0_SCL */ - iconfig->iocmg_14.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_14.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_14.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_14.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_14.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_15.BIT.func = 0x5; /* 0x5 is I2C0_SDA */ - iconfig->iocmg_15.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_15.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_15.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_15.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_15.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ - iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ - iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - I2C_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_blocking_stlm75/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_blocking_stlm75/readme.md deleted file mode 100644 index 373c158ce..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_blocking_stlm75/readme.md +++ /dev/null @@ -1,18 +0,0 @@ -# 配置I2C作为主机以阻塞方式进行数据的接收、发送,通过Debug串口打印读取的数据 -## 关键字: I2C, 主机,数据读取,数据发送,阻塞方式 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、I2C控制器初始化和功能配置。通过阻塞方式与STLM75温度传感器进行数据的接收和数据的发送,通过Debug串口打印读取的温度数值。 - -**【示例配置】** - -+ I2C初始化:调用接口"HAL_I2C_Init()”完成对示例代码中I2C的基地址、寻址模式(7bit寻址或10bit寻址)、通讯速率等参数进行配置。 - -+ 操作I2C读取温度传感器的数值操作:通过调用 "HAL_I2C_MasterWriteBlocking()"接口以阻塞方式实现温度传感器的目标内存地址写入数据;通过调用"HAL_I2C_MasterReadBlocking()"接口以阻塞方式实现接收温度传感器发送的数据。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码中会通过I2C以阻塞方式读取温度传感器的数值,Debug串口打印读取的温度数值信息。 - -**【注意事项】** -+ 示例代码使用UART0进行结果打印输出,需要对UART0配置。 -+ I2C必须必须对接stlm75温度传感器,否则程序无法正常运行。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_blocking_stlm75/src/sample_i2c_blocking_stlm75.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_blocking_stlm75/src/sample_i2c_blocking_stlm75.c deleted file mode 100644 index 2c2792295..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_blocking_stlm75/src/sample_i2c_blocking_stlm75.c +++ /dev/null @@ -1,80 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_i2c_blocking_stlm75.c - * @author MCU Driver Team - * @brief Sample for I2C Module Blocking. - * @details This sample is connected to the temperature sensor stlm75 to demonstrate how to use the HAL interface that - * operates in blocking mode in the I2C driver. - * This sample must be connected to the stlm75 temperature sensor. - * Run the sample and print the temperature value through the serial port. - */ -#include "main.h" -#include "i2c.h" -#include "debug.h" -#include "sample_i2c_blocking_stlm75.h" - -#define STLM75_DEV_ADDR_WRITE 0x90 -#define STLM75_DEV_ADDR_READ 0x91 - -#define MAX_TIMEOUT_VAL 5000 - -/** - * @brief I2c blocking sample lm75 read two byte. - * @param addr stlm75 address. - * @retval unsigned short. - */ -static unsigned short Stlm75ReadtwoByte(unsigned char addr) -{ - unsigned short temp; - unsigned char opAddr = addr; - unsigned char rxBuff[3]; - - HAL_I2C_MasterWriteBlocking(&g_i2cSampleHandle, STLM75_DEV_ADDR_WRITE, &opAddr, 1, MAX_TIMEOUT_VAL); - HAL_I2C_MasterReadBlocking(&g_i2cSampleHandle, STLM75_DEV_ADDR_READ, rxBuff, 2, MAX_TIMEOUT_VAL); /* Read 2 data */ - - temp = rxBuff[0]; - temp <<= 8; /* Shift left by 8 bits */ - temp = temp | rxBuff[1]; - return temp; -} - -/** - * @brief I2c blocking sample processing. - * @param addr lm75 address. - * @retval unsigned int, 0 is OK, other is fail. - */ -unsigned int Stlm75SampleProcessing(void) -{ - unsigned short temp; - float ftemp; - - SystemInit(); - while (1) { - temp = Stlm75ReadtwoByte(0x00); - temp >>= 5; /* Move the data by 5 bits to the right to obtain the lower 10 bits. */ - if ((temp & 0x0400) == 0x0400) { /* Determine the 10th digit. temp & 0x0400 */ - ftemp = -temp * 0.125; /* The formula is temp x 0.125. */ - } else { - ftemp = temp * 0.125; /* The formula is temp x 0.125. */ - } - DBG_PRINTF("ftemp = %f\r\n", ftemp); - BASE_FUNC_DELAY_MS(1000); /* Delay 1000ms */ - } - return 0; -} - diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_dma_stlm75/inc/sample_i2c_dma_stlm75.h b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_dma_stlm75/inc/sample_i2c_dma_stlm75.h deleted file mode 100644 index b5e595905..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_dma_stlm75/inc/sample_i2c_dma_stlm75.h +++ /dev/null @@ -1,29 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_i2c_dma_stlm75.h - * @author MCU Driver Team - * @brief I2C module sample. - * @details This file provides sample code for users to help use - * the functionalities of the I2C. - */ -#ifndef McuMagicTag_SAMPLE_I2C_DMA_STLM75_H -#define McuMagicTag_SAMPLE_I2C_DMA_STLM75_H - -void Stlm75DmaSampleProcessing(void); - -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_dma_stlm75/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_dma_stlm75/init/main.c deleted file mode 100644 index e664ac529..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_dma_stlm75/init/main.c +++ /dev/null @@ -1,37 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ -#include "feature.h" -#include "main.h" -#include "sample_i2c_dma_stlm75.h" - -I2C_Handle g_i2cSampleHandle; -UART_Handle g_uart0; - -DMA_Handle g_dmac; - -int main(void) -{ - Stlm75DmaSampleProcessing(); - while (1) { - } - return BASE_STATUS_OK; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_dma_stlm75/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_dma_stlm75/init/main.h deleted file mode 100644 index 9eaeb40f0..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_dma_stlm75/init/main.h +++ /dev/null @@ -1,53 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "i2c.h" -#include "crg.h" -#include "dma.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -extern I2C_Handle g_i2cSampleHandle; - -extern UART_Handle g_uart0; - -extern DMA_Handle g_dmac; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -void Stlm75TxSampleHandle(I2C_Handle *handle); -void Stlm75RxSampleHandle(I2C_Handle *handle); -void Stlm75ErrSampleHandle(I2C_Handle *handle); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_dma_stlm75/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_dma_stlm75/init/system_init.c deleted file mode 100644 index 9a3a65a7f..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_dma_stlm75/init/system_init.c +++ /dev/null @@ -1,192 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" - -#define UART0_BAND_RATE 115200 - -#define I2C_FREQ_SCR 100000 -#define I2C_HOLD_DURATION 10 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void DMA_Channel2Init(void *handle) -{ - DMA_ChannelParam dma_param; - dma_param.direction = DMA_PERIPH_TO_MEMORY_BY_DMAC; - dma_param.srcAddrInc = DMA_ADDR_UNALTERED; - dma_param.destAddrInc = DMA_ADDR_UNALTERED; - dma_param.srcPeriph = DMA_REQUEST_I2C_RX; - dma_param.destPeriph = DMA_REQUEST_MEM; - dma_param.srcWidth = DMA_TRANSWIDTH_BYTE; - dma_param.destWidth = DMA_TRANSWIDTH_BYTE; - dma_param.srcBurst = DMA_BURST_LENGTH_1; - dma_param.destBurst = DMA_BURST_LENGTH_1; - dma_param.pHandle = handle; - HAL_DMA_InitChannel(&g_dmac, &dma_param, 2); /* Channel 2 */ -} - -static void DMA_Init(void) -{ - g_dmac.baseAddress = DMA; - g_dmac.srcByteOrder = DMA_BYTEORDER_SMALLENDIAN; - g_dmac.destByteOrder = DMA_BYTEORDER_SMALLENDIAN; - g_dmac.irqNumTc = IRQ_DMA_TC; - g_dmac.irqNumError = IRQ_DMA_ERR; - HAL_DMA_IRQService(&g_dmac); - IRQ_EnableN(IRQ_DMA_TC); - IRQ_EnableN(IRQ_DMA_ERR); - HAL_DMA_Init(&g_dmac); - - DMA_Channel2Init((void *)(&g_i2cSampleHandle)); -} - -__weak void Stlm75TxSampleHandle(I2C_Handle *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN Stlm75TxSampleHandle */ - /* USER CODE END Stlm75TxSampleHandle */ -} - -__weak void Stlm75RxSampleHandle(I2C_Handle *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN Stlm75RxSampleHandle */ - /* USER CODE END Stlm75RxSampleHandle */ -} - -__weak void Stlm75ErrSampleHandle(I2C_Handle *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN Stlm75ErrSampleHandle */ - /* USER CODE END Stlm75ErrSampleHandle */ -} - -static void I2C_Init(void) -{ - HAL_CRG_IpEnableSet(I2C_BASE, IP_CLK_ENABLE); - - g_i2cSampleHandle.baseAddress = I2C; - g_i2cSampleHandle.irqNum = IRQ_I2C; - - g_i2cSampleHandle.addrMode = I2C_7_BITS; - g_i2cSampleHandle.sdaHoldTime = I2C_HOLD_DURATION; - g_i2cSampleHandle.freq = I2C_FREQ_SCR; - g_i2cSampleHandle.rxBuff = NULL; - g_i2cSampleHandle.txBuff = NULL; - g_i2cSampleHandle.ignoreAckFlag = BASE_CFG_DISABLE; - g_i2cSampleHandle.msgStopFlag = BASE_CFG_ENABLE; - g_i2cSampleHandle.state = I2C_STATE_RESET; - g_i2cSampleHandle.rxWaterMark = 1; /* Rx water mark is 1 */ - g_i2cSampleHandle.txWaterMark = 16; /* Tx water mark is 16 */ - g_i2cSampleHandle.dmaHandle = &g_dmac; - g_i2cSampleHandle.dmaCh = 2; /* Channel is 2 */ - g_i2cSampleHandle.srcBurst = DMA_BURST_LENGTH_1; - g_i2cSampleHandle.destBurst = DMA_BURST_LENGTH_1; - g_i2cSampleHandle.srcWidth = DMA_TRANSWIDTH_BYTE; - g_i2cSampleHandle.destWidth = DMA_TRANSWIDTH_BYTE; - HAL_I2C_Init(&g_i2cSampleHandle); - - HAL_I2C_RegisterCallback(&g_i2cSampleHandle, I2C_MASTER_TX_COMPLETE_CB_ID, Stlm75TxSampleHandle); - HAL_I2C_RegisterCallback(&g_i2cSampleHandle, I2C_MASTER_RX_COMPLETE_CB_ID, Stlm75RxSampleHandle); - HAL_I2C_RegisterCallback(&g_i2cSampleHandle, I2C_ERROR_CB_ID, Stlm75ErrSampleHandle); -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); - - g_uart0.baseAddress = UART0; - g_uart0.irqNum = IRQ_UART0; - - g_uart0.baudRate = UART0_BAND_RATE; - g_uart0.dataLength = UART_DATALENGTH_8BIT; - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; - g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart0); -} - -static void IOConfig(void) -{ - IOConfig_RegStruct *iconfig = IOCONFIG; - - iconfig->iocmg_66.BIT.func = 0x2; /* 0x2 is I2C0_SCL */ - iconfig->iocmg_66.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_66.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_66.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_66.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_66.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_67.BIT.func = 0x2; /* 0x2 is I2C0_SDA */ - iconfig->iocmg_67.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_67.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_67.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_67.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_67.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ - iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ - iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - DMA_Init(); - I2C_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_dma_stlm75/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_dma_stlm75/readme.md deleted file mode 100644 index fdf5d2ae3..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_dma_stlm75/readme.md +++ /dev/null @@ -1,18 +0,0 @@ -# 配置I2C作为主机以DMA方式进行数据的接收、发送,通过Debug串口打印读取的数据 -## 关键字: I2C, 主机,数据读取,数据发送,DMA方式 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、I2C控制器初始化和功能配置。通过DMA方式与STLM75温度传感器进行数据的接收和数据的发送,通过Debug串口打印读取的温度数值。 - -**【示例配置】** - -+ I2C初始化:调用接口"HAL_I2C_Init()”完成对示例代码中I2C的基地址、寻址模式(7bit寻址或10bit寻址)、通讯速率、DMA通道等参数进行配置。调用"HAL_I2C_RegisterCallback()"接口注册收发完成、传输错误时的回调函数。 - -+ 操作I2C读取温度传感器的数值操作:通过调用 "HAL_I2C_MasterWriteDMA()"接口以DMA方式实现温度传感器的目标内存地址写入数据;通过调用"HAL_I2C_MasterReadDMA()"接口以DMA方式实现接收温度传感器发送的数据。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码中会通过I2C以DMA方式读取温度传感器的数值,Debug串口打印发送或接收数据完成的信息与读取的温度数值信息。功能异常时会打印错误提示信息。 - -**【注意事项】** -+ 示例代码使用UART0进行结果打印输出,需要对UART0配置。 -+ I2C必须必须对接stlm75温度传感器,否则程序无法正常运行。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_dma_stlm75/src/sample_i2c_dma_stlm75.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_dma_stlm75/src/sample_i2c_dma_stlm75.c deleted file mode 100644 index 67130b8bd..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_dma_stlm75/src/sample_i2c_dma_stlm75.c +++ /dev/null @@ -1,110 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_i2c_dma_stlm75.c - * @author MCU Driver Team - * @brief Sample for I2C Module DMA. - * @details This sample is connected to the temperature sensor stlm75 to demonstrate how to use the HAL interface that - * operates in DMA mode in the I2C driver. - * This sample must be connected to the stlm75 temperature sensor. - * Run the sample and print the temperature value through the serial port. - */ -#include "main.h" -#include "i2c.h" -#include "debug.h" -#include "sample_i2c_dma_stlm75.h" - -#define DEV_ADDR_WRITE 0x90 -#define DEV_ADDR_READ 0x91 - - -static volatile unsigned char g_txFlang = 0; -static volatile unsigned char g_rxFlang = 0; - -static unsigned char g_rxBuff[3]; -static unsigned char g_txBuff[3]; - -/** - * @brief I2c dma sample stlm75 error handle. - * @param handle I2c handle. - * @retval None. - */ -void Stlm75ErrSampleHandle(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("errHandle\r\n"); -} - -/** - * @brief I2c dma sample stlm75 tx handle. - * @param handle I2c handle. - * @retval None. - */ -void Stlm75TxSampleHandle(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("txHandle\r\n"); - g_txFlang = 1; -} - -/** - * @brief I2c dma sample stlm75 rx handle. - * @param handle I2c handle. - * @retval None. - */ -void Stlm75RxSampleHandle(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("rxHandle\r\n"); - g_rxFlang = 1; -} - -/** - * @brief I2c dma sample stlm75 init. - * @param None. - * @retval None. - */ -void Stlm75DmaSampleProcessing(void) -{ - unsigned short temp = 0; - float ftemp = 0; - g_txBuff[0] = 0; - - SystemInit(); - HAL_I2C_MasterWriteDMA(&g_i2cSampleHandle, DEV_ADDR_WRITE, g_txBuff, 1); - while (1) { - if (g_rxFlang > 0) { - g_rxFlang = 0; - temp = g_rxBuff[0]; - temp <<= 8; /* Shift left by 8 bits */ - temp = temp | g_rxBuff[1]; - temp >>= 5; /* Move right by 5 digits */ - if ((temp & 0x0400) == 0x0400) { /* Determine the 10th digit. temp & 0x0400 */ - ftemp = -temp * 0.125; /* The formula is temp x 0.125. */ - } else { - ftemp = temp * 0.125; /* The formula is temp x 0.125. */ - } - DBG_PRINTF("ftemp = %f\r\n", ftemp); - HAL_I2C_MasterWriteDMA(&g_i2cSampleHandle, DEV_ADDR_WRITE, g_txBuff, 1); - } - if (g_txFlang > 0) { - g_txFlang = 0; - HAL_I2C_MasterReadDMA(&g_i2cSampleHandle, DEV_ADDR_READ, g_rxBuff, 2); /* Read 2 data */ - } - BASE_FUNC_DELAY_MS(500); /* Delay 500ms */ - } -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_interrupt_stlm75/inc/sample_i2c_interrupt_stlm75.h b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_interrupt_stlm75/inc/sample_i2c_interrupt_stlm75.h deleted file mode 100644 index e2138fc4a..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_interrupt_stlm75/inc/sample_i2c_interrupt_stlm75.h +++ /dev/null @@ -1,29 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_i2c_interrupt_stlm75.h - * @author MCU Driver Team - * @brief I2C module sample. - * @details This file provides sample code for users to help use - * the functionalities of the I2C. - */ -#ifndef McuMagicTag_SAMPLE_I2C_INTERRUPT_STLM75_H -#define McuMagicTag_SAMPLE_I2C_INTERRUPT_STLM75_H - -void I2cStlm75InterruptSampleProcessing(void); - -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_interrupt_stlm75/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_interrupt_stlm75/init/main.c deleted file mode 100644 index 0c1901996..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_interrupt_stlm75/init/main.c +++ /dev/null @@ -1,35 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ -#include "feature.h" -#include "main.h" -#include "sample_i2c_interrupt_stlm75.h" - -I2C_Handle g_i2cSampleHandle; -UART_Handle g_uart0; - -int main(void) -{ - I2cStlm75InterruptSampleProcessing(); - while (1) { - } - return BASE_STATUS_OK; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_interrupt_stlm75/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_interrupt_stlm75/init/main.h deleted file mode 100644 index 752da1c91..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_interrupt_stlm75/init/main.h +++ /dev/null @@ -1,50 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "i2c.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -extern I2C_Handle g_i2cSampleHandle; - -extern UART_Handle g_uart0; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -void Stlm75TxCallbackHandle(I2C_Handle *handle); -void Stlm75RxCallbackHandle(I2C_Handle *handle); -void Stlm75ErrCallbackHandle(I2C_Handle *handle); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_interrupt_stlm75/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_interrupt_stlm75/init/system_init.c deleted file mode 100644 index 0ac4197c1..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_interrupt_stlm75/init/system_init.c +++ /dev/null @@ -1,157 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" - -#define UART0_BAND_RATE 115200 - -#define I2C_FREQ_SCR 100000 -#define I2C_HOLD_DURATION 10 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -__weak void Stlm75TxCallbackHandle(I2C_Handle *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN Stlm75TxCallbackHandle */ - /* USER CODE END Stlm75TxCallbackHandle */ -} - -__weak void Stlm75RxCallbackHandle(I2C_Handle *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN Stlm75RxCallbackHandle */ - /* USER CODE END Stlm75RxCallbackHandle */ -} - -__weak void Stlm75ErrCallbackHandle(I2C_Handle *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN Stlm75ErrCallbackHandle */ - /* USER CODE END Stlm75ErrCallbackHandle */ -} - -static void I2C_Init(void) -{ - HAL_CRG_IpEnableSet(I2C_BASE, IP_CLK_ENABLE); - - g_i2cSampleHandle.baseAddress = I2C; - g_i2cSampleHandle.irqNum = IRQ_I2C; - - g_i2cSampleHandle.addrMode = I2C_7_BITS; - g_i2cSampleHandle.sdaHoldTime = I2C_HOLD_DURATION; - g_i2cSampleHandle.freq = I2C_FREQ_SCR; - g_i2cSampleHandle.rxBuff = NULL; - g_i2cSampleHandle.txBuff = NULL; - g_i2cSampleHandle.ignoreAckFlag = BASE_CFG_DISABLE; - g_i2cSampleHandle.msgStopFlag = BASE_CFG_ENABLE; - g_i2cSampleHandle.state = I2C_STATE_RESET; - g_i2cSampleHandle.rxWaterMark = 32; /* Rx water mark is 32 */ - g_i2cSampleHandle.txWaterMark = 32; /* Tx water mark is 32 */ - HAL_I2C_Init(&g_i2cSampleHandle); - - HAL_I2C_RegisterCallback(&g_i2cSampleHandle, I2C_MASTER_TX_COMPLETE_CB_ID, Stlm75TxCallbackHandle); - HAL_I2C_RegisterCallback(&g_i2cSampleHandle, I2C_MASTER_RX_COMPLETE_CB_ID, Stlm75RxCallbackHandle); - HAL_I2C_RegisterCallback(&g_i2cSampleHandle, I2C_ERROR_CB_ID, Stlm75ErrCallbackHandle); - HAL_I2C_IRQService(&g_i2cSampleHandle); - IRQ_SetPriority(g_i2cSampleHandle.irqNum, 1); - IRQ_EnableN(IRQ_I2C); -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); - - g_uart0.baseAddress = UART0; - g_uart0.irqNum = IRQ_UART0; - - g_uart0.baudRate = UART0_BAND_RATE; - g_uart0.dataLength = UART_DATALENGTH_8BIT; - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; - g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart0); -} - -static void IOConfig(void) -{ - IOConfig_RegStruct *iconfig = IOCONFIG; - - iconfig->iocmg_14.BIT.func = 0x5; /* 0x5 is I2C0_SCL */ - iconfig->iocmg_14.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_14.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_14.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_14.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_14.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_15.BIT.func = 0x5; /* 0x5 is I2C0_SDA */ - iconfig->iocmg_15.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_15.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_15.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_15.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_15.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ - iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ - iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - I2C_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_interrupt_stlm75/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_interrupt_stlm75/readme.md deleted file mode 100644 index 2e396faeb..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_interrupt_stlm75/readme.md +++ /dev/null @@ -1,18 +0,0 @@ -# 配置I2C作为主机以中断方式进行数据的接收、发送,通过Debug串口打印读取的数据 -## 关键字: I2C, 主机,数据读取,数据发送,中断方式 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、I2C控制器初始化和功能配置。通过中断方式与STLM75温度传感器进行数据的接收和数据的发送,通过Debug串口打印读取的温度数值。 - -**【示例配置】** - -+ I2C初始化:调用接口"HAL_I2C_Init()”完成对示例代码中I2C的基地址、寻址模式(7bit寻址或10bit寻址)、通讯速率等参数进行配置。调用"HAL_I2C_RegisterCallback()"接口注册中断回调函数,并使能相关中断配置。 - -+ 操作I2C读取温度传感器的数值操作:通过调用 "HAL_I2C_MasterWriteIT()"接口以中断方式实现温度传感器的目标内存地址写入数据;通过调用"HAL_I2C_MasterReadIT()"接口以中断方式实现接收温度传感器发送的数据。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码中会通过I2C以中断方式读取温度传感器的数值,Debug串口打印发送或接收数据完成的信息与读取的温度数值信息。功能异常时会打印错误提示信息。 - -**【注意事项】** -+ 示例代码使用UART0进行结果打印输出,需要对UART0配置。 -+ I2C必须必须对接stlm75温度传感器,否则程序无法正常运行。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_interrupt_stlm75/src/sample_i2c_interrupt_stlm75.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_interrupt_stlm75/src/sample_i2c_interrupt_stlm75.c deleted file mode 100644 index a39820ccc..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_interrupt_stlm75/src/sample_i2c_interrupt_stlm75.c +++ /dev/null @@ -1,110 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_i2c_interrupt_stlm75.c - * @author MCU Driver Team - * @brief Sample for I2C Module Interrupt. - * @details This sample is connected to the temperature sensor stlm75 to demonstrate how to use the HAL interface that - * operates in interrupt mode in the I2C driver. - * This sample must be connected to the stlm75 temperature sensor. - * Run the sample and print the temperature value through the serial port. - */ -#include "main.h" -#include "i2c.h" -#include "interrupt.h" -#include "debug.h" -#include "sample_i2c_interrupt_stlm75.h" - -#define DEV_ADDR_WRITE 0x90 -#define DEV_ADDR_READ 0x91 - -static volatile unsigned char g_txFlang = 0; -static volatile unsigned char g_rxFlang = 0; - -static unsigned char g_rxBuff[3]; -static unsigned char g_txBuff[3]; - -/** - * @brief I2c interrupt sample stlm75 Error callback handle. - * @param handle I2c handle. - * @retval None. - */ -void Stlm75ErrCallbackHandle(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("Stlm75ErrCallbackHandle\r\n"); -} - -/** - * @brief I2c interrupt sample stlm75 tx callback handle. - * @param handle I2c handle. - * @retval None. - */ -void Stlm75TxCallbackHandle(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("Stlm75TxCallbackHandle\r\n"); - g_txFlang = 1; -} - -/** - * @brief I2c interrupt sample stlm75 rx callback handle. - * @param handle I2c handle. - * @retval None. - */ -void Stlm75RxCallbackHandle(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("Stlm75RxCallbackHandle\r\n"); - g_rxFlang = 1; -} - -/** - * @brief I2c interrupt sample stlm75 processing. - * @param None. - * @retval None. - */ -void I2cStlm75InterruptSampleProcessing(void) -{ - unsigned short temp = 0; - float ftemp = 0; - g_txBuff[0] = 0; - - SystemInit(); - HAL_I2C_MasterWriteIT(&g_i2cSampleHandle, DEV_ADDR_WRITE, g_txBuff, 1); - while (1) { - if (g_rxFlang > 0) { - g_rxFlang = 0; - temp = g_rxBuff[0]; - temp <<= 8; /* Shift left by 8 bits */ - temp = temp | g_rxBuff[1]; - temp >>= 5; /* Move right by 5 digits */ - if ((temp & 0x0400) == 0x0400) { /* Determine the 10th digit. temp & 0x0400 */ - ftemp = -temp * 0.125; /* The formula is temp x 0.125. */ - } else { - ftemp = temp * 0.125; /* The formula is temp x 0.125. */ - } - DBG_PRINTF("ftemp = %f\r\n", ftemp); - HAL_I2C_MasterWriteIT(&g_i2cSampleHandle, DEV_ADDR_WRITE, g_txBuff, 1); - } - if (g_txFlang > 0) { - g_txFlang = 0; - HAL_I2C_MasterReadIT(&g_i2cSampleHandle, DEV_ADDR_READ, g_rxBuff, 2); /* Read 2 data */ - } - BASE_FUNC_DELAY_MS(1000); /* Delay 1000ms */ - } -} diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/inc/sample_i2c_master_blocking_at24c64.h b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/inc/sample_i2c_master_blocking_at24c64.h deleted file mode 100644 index 68042bda9..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/inc/sample_i2c_master_blocking_at24c64.h +++ /dev/null @@ -1,29 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_i2c_master_blocking_at24c64.c - * @author MCU Driver Team - * @brief Sample for I2C module blocking as master. - * @details This sample demonstrates how to use the I2C master blocking interface to read and write the EEPROM. - * To use this sample, the I2C interface must be connected to the AT24C64 EEPROM chip. - */ -#ifndef McuMagicTag_SAMPLE_I2C_MASTER_BLOCKING_AT24C64_H -#define McuMagicTag_SAMPLE_I2C_MASTER_BLOCKING_AT24C64_H - -void I2cBlocking24c64Processing(void); - -#endif /* #ifndef McuMagicTag_SAMPLE_I2C_MASTER_BLOCKING_AT24C64_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/init/main.c deleted file mode 100644 index c2cbf8fa6..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/init/main.c +++ /dev/null @@ -1,52 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ - -#include "typedefs.h" -#include "feature.h" -#include "sample_i2c_master_blocking_at24c64.h" -#include "main.h" - -/* USER CODE BEGIN 0 */ -/* USER CODE END 0 */ -UART_Handle g_uart0; -I2C_Handle g_i2c0; -/* USER CODE BEGIN 1 */ -/* USER CODE END 1 */ - -int main(void) -{ - /* USER CODE BEGIN 2 */ - /* USER CODE END 2 */ - I2cBlocking24c64Processing(); - /* USER CODE BEGIN 3 */ - /* USER CODE END 3 */ - while (1) { - /* USER CODE BEGIN 4 */ - /* USER CODE END 4 */ - } - /* USER CODE BEGIN 5 */ - /* USER CODE END 5 */ - return BASE_STATUS_OK; -} - -/* USER CODE BEGIN 6 */ -/* USER CODE END 6 */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/init/main.h deleted file mode 100644 index bd646c19c..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/init/main.h +++ /dev/null @@ -1,51 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "i2c.h" -#include "i2c_ex.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -#define XTAL_DRV_LEVEL4 0x03U -#define XTAL_DRV_LEVEL3 0x02U -#define XTAL_DRV_LEVEL2 0x01U -#define XTAL_DRV_LEVEL1 0x00U - -extern UART_Handle g_uart0; -extern I2C_Handle g_i2c0; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/init/system_init.c deleted file mode 100644 index 2b879fce2..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/init/system_init.c +++ /dev/null @@ -1,125 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" -#include "iocmg_ip.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - /* Clock-related parameter configuration. */ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; - crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; - crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_1; - /* Initialize the clock configuration. */ - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void I2C0_Init(void) -{ - HAL_CRG_IpEnableSet(I2C0_BASE, IP_CLK_ENABLE); - g_i2c0.baseAddress = I2C0; - - g_i2c0.functionMode = I2C_MODE_SELECT_MASTER_ONLY; - g_i2c0.addrMode = I2C_7_BITS; - g_i2c0.sdaHoldTime = 10; /* I2C SDA hold time 10. */ - g_i2c0.freq = 400000; /* I2C SCL rate 400000 bit/s. */ - g_i2c0.transferBuff = NULL; - g_i2c0.ignoreAckFlag = BASE_CFG_DISABLE; - g_i2c0.handleEx.spikeFilterTime = 0; - g_i2c0.handleEx.sdaDelayTime = 0; - g_i2c0.timeout = 10000; /* The value of timeout is 10000ms; */ - g_i2c0.state = I2C_STATE_RESET; - HAL_I2C_Init(&g_i2c0); -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); - /* UART-related parameter configuration. */ - g_uart0.baseAddress = UART0; - - g_uart0.baudRate = UART0_BAND_RATE; /* Setting the UART Baud Rate. */ - g_uart0.dataLength = UART_DATALENGTH_8BIT; - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; /* Disable uart fifo mode. */ - g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; - g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; - g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; - /* Initializing the UART0. */ - HAL_UART_Init(&g_uart0); -} - -static void IOConfig(void) -{ - HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO4_5_AS_I2C0_SCL); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO4_5_AS_I2C0_SCL, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO4_5_AS_I2C0_SCL, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO4_5_AS_I2C0_SCL, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO4_5_AS_I2C0_SCL, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO4_6_AS_I2C0_SDA); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO4_6_AS_I2C0_SDA, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO4_6_AS_I2C0_SDA, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO4_6_AS_I2C0_SDA, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO4_6_AS_I2C0_SDA, DRIVER_RATE_2); /* Output signal edge fast/slow */ -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - I2C0_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/readme.md deleted file mode 100644 index 37c0631df..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/readme.md +++ /dev/null @@ -1,19 +0,0 @@ -# 配置I2C作为主机以阻塞方式进行数据的接收、发送,通过Debug串口打印数据收发的结果 -## 关键字: I2C, 主机,数据读取,数据发送,阻塞方式 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、I2C控制器初始化和功能配置。通过阻塞方式与EEPROM(AT24C64)进行数据的接收和数据的发送,通过Debug串口打印数据收发成功或失败的信息。 - -**【示例配置】** -+ I2C控制器选择:可选择I2C0或I2C1实现与EEPROM的数据接收和发送。 - -+ I2C初始化:调用接口"HAL_I2C_Init()”完成对示例代码中I2C的基地址、主从模式、寻址模式(7bit寻址或10bit寻址)、通讯速率等参数进行配置。 - -+ 操作I2C写入和读取EEPROM的内容:通过调用 "HAL_I2C_MasterWriteBlocking()"接口以阻塞方式向EEPROM目标内存地址写入数据;通过调用"HAL_I2C_MasterReadBlocking()"接口以阻塞方式实现从EEPROM的目标地址中接收数据。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码中会通过I2C以阻塞方式向EEPROM写入和读取写入的内容,Debug串口打印I2C与EEPROM进行通信交互的结果信息,当写入和读取的数据一致时Debug串口打印"I2C Data Success";当写入和读取的数据不一致时Debug串口打印错误信息。 - -**【注意事项】** -+ 示例代码使用UART0进行结果打印输出,需要对UART0配置。 -+ 示例代码中I2C必须必须对接EEPROM(AT24C64),且保证EEPROM的7bit地址为50,否则示例代码无法正常运行。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/src/sample_i2c_master_blocking_at24c64.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/src/sample_i2c_master_blocking_at24c64.c deleted file mode 100644 index 5ffe39d07..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/src/sample_i2c_master_blocking_at24c64.c +++ /dev/null @@ -1,202 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_i2c_master_blocking_at24c64.c - * @author MCU Driver Team - * @brief Sample for I2C module blocking as master. - * @details This sample demonstrates how to use the I2C master blocking interface to read and write the EEPROM. - * To use this sample, the I2C interface must be connected to the AT24C64 EEPROM chip. - */ -#include "i2c.h" -#include "main.h" -#include "debug.h" -#include "sample_i2c_master_blocking_at24c64.h" - -#define DEV_24C64_ADDRESS_WRITE 0xA0 -#define DEV_24C64_ADDRESS_READ 0xA1 -#define I2C_SAMPLE_24C64_OPT_LEN 8 -#define I2C_SAMPLE_24C64_OPT_START_ADDR 0x0 -#define I2C_SAMPLE_24C64_DATA_OFFSET 2 -#define I2C_SAMPLE_24C64_PAGE_SIZE 32 -#define I2C_SAMPLE_24C64_ADDR_SIZE 2 -#define I2C_SAMPLE_24C64_OPT_ONCE_LEN 255 -#define I2C_SAMPLE_24C64_ADDRESS_POS 8 -#define I2C_SAMPLE_24C64_ADDRESS_MASK 0xFF - -#define I2C_SAMPLE_24C64_TEST_NUM 200 -#define I2C_SAMPLE_MAX_TIMEOUT 10000 - -/** - * @brief Copy data. - * @param destBuffer dest buffer. - * @param srcBuffer source buffer. - * @param len Number of the data to be copy. - * @retval None. - */ -static void CopyData(unsigned char *destBuffer, unsigned char *srcBuffer, unsigned int len) -{ - for (unsigned int i = 0; i < len; i++) { - destBuffer[i] = srcBuffer[i]; /* Copy the srcBuffer data to the destBuffer. */ - } -} - -/** - * @brief Read data from eeprom. - * @param addr The memory address of eeprom. - * @param buffer Address of buff to be receive data. - * @param len Number of the data to be read. - * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. - */ -static BASE_StatusType Sample24c64ReadData(unsigned int addr, unsigned char *buffer, unsigned int len) -{ - BASE_StatusType ret = BASE_STATUS_OK; - /* Define variables for internal use. */ - unsigned char tempAddr[I2C_SAMPLE_24C64_ADDR_SIZE]; - unsigned int currentLen = len; - unsigned int currentAddr = addr; - unsigned int tempReadLen; - unsigned char *tempBuffer = buffer; - - /* Start read data from the 24c64 eeprom. */ - while (1) { - if (currentLen == 0) { - break; - } - /* Set the memory address of eeprom. */ - tempAddr[0] = (currentAddr >> I2C_SAMPLE_24C64_ADDRESS_POS) & I2C_SAMPLE_24C64_ADDRESS_MASK; - tempAddr[1] = currentAddr & I2C_SAMPLE_24C64_ADDRESS_MASK; - - tempReadLen = currentLen; - if (currentLen > I2C_SAMPLE_24C64_OPT_ONCE_LEN) { - tempReadLen = I2C_SAMPLE_24C64_OPT_ONCE_LEN; - } - /* Send the memory address of eeprom. */ - ret = HAL_I2C_MasterWriteBlocking(&g_i2c0, DEV_24C64_ADDRESS_WRITE, tempAddr, - I2C_SAMPLE_24C64_ADDR_SIZE, I2C_SAMPLE_MAX_TIMEOUT); - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("LINE:%d,Read Data Fail,ret:%d\r\n", __LINE__, ret); - return ret; - } - /* Read data from eeprom. */ - ret = HAL_I2C_MasterReadBlocking(&g_i2c0, DEV_24C64_ADDRESS_READ, tempBuffer, - tempReadLen, I2C_SAMPLE_MAX_TIMEOUT); - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("LINE:%d,Read Data Fail,ret:%d\r\n", __LINE__, ret); - return ret; - } - /* Updata the destAddress, srcAddress and len. */ - currentAddr += tempReadLen; - currentLen -= tempReadLen; - tempBuffer += tempReadLen; - } - return ret; -} - -/** - * @brief Read data from eeprom. - * @param addr The memory address of eeprom. - * @param buffer Address of buff to be send. - * @param len Number of the data to be send. - * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. - */ -static BASE_StatusType Sample24c64WriteData(unsigned int addr, unsigned char *buffer, unsigned int len) -{ - unsigned char tempWrite[I2C_SAMPLE_24C64_PAGE_SIZE + I2C_SAMPLE_24C64_ADDR_SIZE]; - unsigned int currentLen = len; - unsigned int currentAddr = addr; - unsigned int tempWriteLen; - unsigned char *tempBuffer = buffer; - BASE_StatusType ret = BASE_STATUS_OK; - - /* Start send data to eeprom. */ - while (1) { - if (currentLen == 0) { - break; - } - tempWriteLen = I2C_SAMPLE_24C64_PAGE_SIZE - (currentAddr % I2C_SAMPLE_24C64_PAGE_SIZE); - if (tempWriteLen > currentLen) { - tempWriteLen = currentLen; - } - /* Set the memory address of eeprom. */ - tempWrite[0] = (currentAddr >> I2C_SAMPLE_24C64_ADDRESS_POS) & I2C_SAMPLE_24C64_ADDRESS_MASK; - tempWrite[1] = currentAddr & I2C_SAMPLE_24C64_ADDRESS_MASK; - CopyData(&tempWrite[I2C_SAMPLE_24C64_ADDR_SIZE], tempBuffer, tempWriteLen); - /* Send data to eeprom. */ - ret = HAL_I2C_MasterWriteBlocking(&g_i2c0, DEV_24C64_ADDRESS_WRITE, tempWrite, - tempWriteLen + I2C_SAMPLE_24C64_ADDR_SIZE, I2C_SAMPLE_MAX_TIMEOUT); - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("LINE:%d,Write Data Fail!,ret:%d\r\n", __LINE__, ret); - break; - } - /* Updata the destAddress, srcAddress and len. */ - currentAddr += tempWriteLen; - currentLen -= tempWriteLen; - tempBuffer += tempWriteLen; - } - return ret; -} - -/** - * @brief Send and receive data with the 24c64 eeprom in interrupt mode as master. - * @retval None. - */ -void I2cBlocking24c64Processing(void) -{ - BASE_StatusType ret; - unsigned int i; - unsigned int dataFlag; - unsigned char tempWriteBuff[I2C_SAMPLE_24C64_OPT_LEN] = {0}; - unsigned int successCnt = 0; - - SystemInit(); - DBG_PRINTF("I2C Blocking 24C64 Start\r\n"); - for (i = 0; i < I2C_SAMPLE_24C64_OPT_LEN; i++) { - tempWriteBuff[i] = 0x5A; /* The written data. */ - } - BASE_FUNC_DELAY_MS(20); /* Delay 20 ms. */ - for (int j = 0; j < I2C_SAMPLE_24C64_TEST_NUM; j++) { - unsigned char tempReadBuff[I2C_SAMPLE_24C64_OPT_LEN] = {0}; - /* Write 24c64 data */ - ret = Sample24c64WriteData(I2C_SAMPLE_24C64_OPT_START_ADDR, tempWriteBuff, I2C_SAMPLE_24C64_OPT_LEN); - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("LINE:%d,Write Data Fail,ret:%d\r\n", __LINE__, ret); - } - BASE_FUNC_DELAY_MS(20); /* Delay 20 ms. */ - /* Read 24c64 data */ - ret = Sample24c64ReadData(I2C_SAMPLE_24C64_OPT_START_ADDR, tempReadBuff, I2C_SAMPLE_24C64_OPT_LEN); - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("LINE:%d,Write Data Fail,ret:%d\r\n", __LINE__, ret); - } - BASE_FUNC_DELAY_MS(20); /* Delay 20 ms. */ - /* Compare read and write data */ - dataFlag = 0; - for (i = 0; i < I2C_SAMPLE_24C64_OPT_LEN; i++) { - if (tempReadBuff[i] != tempWriteBuff[i]) { - DBG_PRINTF("I2C Data error! offset[%d]\r\nReadData:0x%x\r\nWriteData:0x%x\r\n", i, - tempReadBuff[i], tempWriteBuff[i]); - dataFlag = 1; - break; - } - } - /* The read data is exactly the same as the written data. */ - if (dataFlag == 0) { - successCnt++; - DBG_PRINTF("I2C Data Success\r\n"); - } - } - DBG_PRINTF("I2C sample End!\r\nsuccessCnt:%d\r\n", successCnt); -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_dma_at24c64/inc/sample_i2c_master_dma_at24c64.h b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_dma_at24c64/inc/sample_i2c_master_dma_at24c64.h deleted file mode 100644 index 5666e536e..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_dma_at24c64/inc/sample_i2c_master_dma_at24c64.h +++ /dev/null @@ -1,29 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_i2c_master_dma_at24c64.c - * @author MCU Driver Team - * @brief Sample for I2C module dma as master. - * @details This sample demonstrates how to use the I2C master DMA interface to read and write the EEPROM. - * To use this sample, the I2C interface must be connected to the AT24C64 EEPROM chip. - */ -#ifndef McuMagicTag_SAMPLE_I2C_MASTER_DAM_AT24C64_H -#define McuMagicTag_SAMPLE_I2C_MASTER_DAM_AT24C64_H - -void I2cDma24c64Processing(void); - -#endif /* #ifndef McuMagicTag_SAMPLE_I2C_MASTER_DAM_AT24C64_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_dma_at24c64/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_dma_at24c64/init/main.c deleted file mode 100644 index 2ac1fa57f..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_dma_at24c64/init/main.c +++ /dev/null @@ -1,53 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ - -#include "typedefs.h" -#include "feature.h" -#include "sample_i2c_master_dma_at24c64.h" -#include "main.h" - -/* USER CODE BEGIN 0 */ -/* USER CODE END 0 */ -UART_Handle g_uart0; -I2C_Handle g_i2c0; -DMA_Handle g_dmac; -/* USER CODE BEGIN 1 */ -/* USER CODE END 1 */ - -int main(void) -{ - /* USER CODE BEGIN 2 */ - /* USER CODE END 2 */ - I2cDma24c64Processing(); - /* USER CODE BEGIN 3 */ - /* USER CODE END 3 */ - while (1) { - /* USER CODE BEGIN 4 */ - /* USER CODE END 4 */ - } - /* USER CODE BEGIN 5 */ - /* USER CODE END 5 */ - return BASE_STATUS_OK; -} - -/* USER CODE BEGIN 6 */ -/* USER CODE END 6 */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_dma_at24c64/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_dma_at24c64/init/main.h deleted file mode 100644 index 9e0d9fccb..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_dma_at24c64/init/main.h +++ /dev/null @@ -1,54 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "i2c.h" -#include "i2c_ex.h" -#include "crg.h" -#include "dma.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -#define XTAL_DRV_LEVEL4 0x03U -#define XTAL_DRV_LEVEL3 0x02U -#define XTAL_DRV_LEVEL2 0x01U -#define XTAL_DRV_LEVEL1 0x00U - -extern UART_Handle g_uart0; -extern I2C_Handle g_i2c0; - -extern DMA_Handle g_dmac; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_dma_at24c64/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_dma_at24c64/init/system_init.c deleted file mode 100644 index dd44a7127..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_dma_at24c64/init/system_init.c +++ /dev/null @@ -1,212 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" -#include "iocmg_ip.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - /* Clock-related parameter configuration. */ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; - crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; - crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_1; - /* Initialize the clock configuration. */ - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void DMA_Channel0Init(void *handle) -{ - /* Setting DMA-related parameters. */ - DMA_ChannelParam dma_param; - dma_param.direction = DMA_PERIPH_TO_MEMORY_BY_DMAC; - dma_param.srcAddrInc = DMA_ADDR_UNALTERED; - dma_param.destAddrInc = DMA_ADDR_INCREASE; - dma_param.srcPeriph = DMA_REQUEST_I2C0_RX; - dma_param.destPeriph = DMA_REQUEST_MEM; - /* Set the moving position width. */ - dma_param.srcWidth = DMA_TRANSWIDTH_BYTE; - dma_param.destWidth = DMA_TRANSWIDTH_BYTE; - dma_param.srcBurst = DMA_BURST_LENGTH_1; - dma_param.destBurst = DMA_BURST_LENGTH_1; - dma_param.pHandle = handle; - /* DMA Channel initialization. */ - HAL_DMA_InitChannel(&g_dmac, &dma_param, DMA_CHANNEL_ZERO); -} - -static void DMA_Channel1Init(void *handle) -{ - /* Setting DMA-related parameters. */ - DMA_ChannelParam dma_param; - dma_param.direction = DMA_MEMORY_TO_PERIPH_BY_DMAC; - dma_param.srcAddrInc = DMA_ADDR_INCREASE; - dma_param.destAddrInc = DMA_ADDR_UNALTERED; - dma_param.srcPeriph = DMA_REQUEST_MEM; - dma_param.destPeriph = DMA_REQUEST_I2C0_TX; - /* Set the moving position width. */ - dma_param.srcWidth = DMA_TRANSWIDTH_WORD; - dma_param.destWidth = DMA_TRANSWIDTH_WORD; - dma_param.srcBurst = DMA_BURST_LENGTH_1; - dma_param.destBurst = DMA_BURST_LENGTH_1; - dma_param.pHandle = handle; - /* DMA Channel initialization. */ - HAL_DMA_InitChannel(&g_dmac, &dma_param, DMA_CHANNEL_ONE); -} - -static void DMA_Init(void) -{ - /* DMA initialization. */ - HAL_CRG_IpEnableSet(DMA_BASE, IP_CLK_ENABLE); - g_dmac.baseAddress = DMA; - /* Configuring DMA Interrupt Parameters. */ - IRQ_Register(IRQ_DMA_TC, HAL_DMA_IrqHandlerTc, &g_dmac); - IRQ_Register(IRQ_DMA_ERR, HAL_DMA_IrqHandlerError, &g_dmac); - IRQ_EnableN(IRQ_DMA_TC); - IRQ_EnableN(IRQ_DMA_ERR); - HAL_DMA_Init(&g_dmac); - /* Setting the Channel Priority and Initializing the Channel. */ - DMA_Channel0Init((void *)(&g_i2c0)); - HAL_DMA_SetChannelPriorityEx(&g_dmac, DMA_CHANNEL_ZERO, DMA_PRIORITY_HIGHEST); - DMA_Channel1Init((void *)(&g_i2c0)); - HAL_DMA_SetChannelPriorityEx(&g_dmac, DMA_CHANNEL_ONE, DMA_PRIORITY_HIGHEST); -} - -__weak void I2C0TxCallback(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN I2C0TxCallback */ - /* USER CODE END I2C0TxCallback */ -} - -__weak void I2C0RxCallback(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN I2C0RxCallback */ - /* USER CODE END I2C0RxCallback */ -} - -__weak void I2C0ErrorCallback(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN I2C0ErrorCallback */ - /* USER CODE END I2C0ErrorCallback */ -} - -static void I2C0_Init(void) -{ - HAL_CRG_IpEnableSet(I2C0_BASE, IP_CLK_ENABLE); - g_i2c0.baseAddress = I2C0; - - g_i2c0.functionMode = I2C_MODE_SELECT_MASTER_ONLY; - g_i2c0.addrMode = I2C_7_BITS; - g_i2c0.sdaHoldTime = 10; /* I2C SDA hold time 10. */ - g_i2c0.freq = 400000; /* I2C SCL rate 400000 bit/s. */ - g_i2c0.transferBuff = NULL; - g_i2c0.ignoreAckFlag = BASE_CFG_DISABLE; - g_i2c0.handleEx.spikeFilterTime = 0; - g_i2c0.handleEx.sdaDelayTime = 0; - g_i2c0.timeout = 10000; /* The value of timeout is 10000ms; */ - g_i2c0.state = I2C_STATE_RESET; - g_i2c0.rxWaterMark = 1; /* The value of rx Water mark is 1. */ - g_i2c0.txWaterMark = 12; /* The value of tx Water mark is 12. */ - g_i2c0.dmaHandle = &g_dmac; - g_i2c0.txDmaCh = DMA_CHANNEL_ONE; - g_i2c0.rxDmaCh = DMA_CHANNEL_ZERO; - HAL_I2C_Init(&g_i2c0); - - HAL_I2C_RegisterCallback(&g_i2c0, I2C_MASTER_TX_COMPLETE_CB_ID, I2C0TxCallback); - HAL_I2C_RegisterCallback(&g_i2c0, I2C_MASTER_RX_COMPLETE_CB_ID, I2C0RxCallback); - HAL_I2C_RegisterCallback(&g_i2c0, I2C_ERROR_CB_ID, I2C0ErrorCallback); -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); - /* UART-related parameter configuration. */ - g_uart0.baseAddress = UART0; - - g_uart0.baudRate = UART0_BAND_RATE; /* Setting the UART Baud Rate. */ - g_uart0.dataLength = UART_DATALENGTH_8BIT; - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; /* Disable uart fifo mode. */ - g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; - g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; - g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; - /* Initializing the UART0. */ - HAL_UART_Init(&g_uart0); -} - -static void IOConfig(void) -{ - HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO4_5_AS_I2C0_SCL); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO4_5_AS_I2C0_SCL, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO4_5_AS_I2C0_SCL, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO4_5_AS_I2C0_SCL, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO4_5_AS_I2C0_SCL, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO4_6_AS_I2C0_SDA); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO4_6_AS_I2C0_SDA, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO4_6_AS_I2C0_SDA, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO4_6_AS_I2C0_SDA, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO4_6_AS_I2C0_SDA, DRIVER_RATE_2); /* Output signal edge fast/slow */ -} - -void SystemInit(void) -{ - IOConfig(); - DMA_Init(); - UART0_Init(); - I2C0_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_dma_at24c64/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_dma_at24c64/readme.md deleted file mode 100644 index 3e011c26d..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_dma_at24c64/readme.md +++ /dev/null @@ -1,19 +0,0 @@ -# 配置I2C作为主机以DMA方式进行数据的接收、发送,通过Debug串口打印数据收发的结果 -## 关键字: I2C, 主机,数据读取,数据发送,DMA方式 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、I2C控制器初始化和功能配置。通过中断方式与EEPROM(AT24C64)进行数据的接收和数据的发送,通过Debug串口打印数据收发成功或失败的信息。 - -**【示例配置】** -+ I2C控制器选择:可选择I2C0或I2C1实现与EEPROM的数据接收和发送。 - -+ I2C初始化:调用接口"HAL_I2C_Init()”完成对示例代码中I2C的基地址、主从模式、寻址模式(7bit寻址或10bit寻址)、通讯速率、DMA通道等参数进行配置。调用"HAL_I2C_RegisterCallback()"接口注册收发完成、传输错误时的回调函数。 - -+ 操作I2C写入和读取EEPROM的内容:通过调用 "HAL_I2C_MasterWriteDMA()"接口以DMA方式向EEPROM目标内存地址写入数据;通过调用"HAL_I2C_MasterReadDMA()"接口以DMA方式实现从EEPROM的目标地址中接收数据。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码中会通过I2C以DMA方式向EEPROM写入和读取写入的内容,Debug串口打印I2C与EEPROM进行通信交互的结果信息,当写入和读取的数据一致时Debug串口打印"I2C Data Success";当写入和读取的数据不一致时Debug串口打印错误信息。 - -**【注意事项】** -+ 示例代码使用UART0进行结果打印输出,需要对UART0配置。 -+ 示例代码中I2C必须必须对接EEPROM(AT24C64),且保证EEPROM的7bit地址为50,否则示例代码无法正常运行。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_dma_at24c64/src/sample_i2c_master_dma_at24c64.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_dma_at24c64/src/sample_i2c_master_dma_at24c64.c deleted file mode 100644 index d51275749..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_dma_at24c64/src/sample_i2c_master_dma_at24c64.c +++ /dev/null @@ -1,286 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_i2c_master_dma_at24c64.c - * @author MCU Driver Team - * @brief Sample for I2C module dma as master. - * @details This sample demonstrates how to use the I2C master DMA interface to read and write the EEPROM. - * To use this sample, the I2C interface must be connected to the AT24C64 EEPROM chip. - */ -#include "i2c.h" -#include "dma.h" -#include "main.h" -#include "debug.h" -#include "sample_i2c_master_dma_at24c64.h" - -#define DEV_24C64_ADDRESS_WRITE 0xA0 -#define DEV_24C64_ADDRESS_READ 0xA1 -#define I2C_SAMPLE_24C64_OPT_LEN 8 -#define I2C_SAMPLE_24C64_OPT_START_ADDR 0x0 -#define I2C_SAMPLE_24C64_DATA_OFFSET 2 -#define I2C_SAMPLE_24C64_PAGE_SIZE 32 -#define I2C_SAMPLE_24C64_ADDR_SIZE 2 -#define I2C_SAMPLE_24C64_OPT_ONCE_LEN 255 - -#define I2C_SAMPLE_24C64_ADDRESS_POS 8 -#define I2C_SAMPLE_24C64_ADDRESS_MASK 0xFF - -#define I2C_SAMPLE_24C64_TEST_NUM 100 - -static volatile int g_txDoneFlag = BASE_CFG_UNSET; -static volatile int g_rxDoneFlag = BASE_CFG_UNSET; -static volatile int g_errorFlag = BASE_CFG_UNSET; - -/** - * @brief I2c dma sample tx callback handle. - * @param handle I2c handle. - * @retval None. - */ -void I2C0TxCallback(void *handle) -{ - BASE_FUNC_UNUSED(handle); - g_txDoneFlag = BASE_CFG_SET; -} - -/** - * @brief I2c dma sample rx callback handle. - * @param handle I2c handle. - * @retval None. - */ -void I2C0RxCallback(void *handle) -{ - BASE_FUNC_UNUSED(handle); - g_rxDoneFlag = BASE_CFG_SET; -} - -/** - * @brief I2c dma sample Error callback handle. - * @param handle I2c handle. - * @retval None. - */ -void I2C0ErrorCallback(void *handle) -{ - BASE_FUNC_UNUSED(handle); - g_errorFlag = BASE_CFG_SET; -} - -/** - * @brief Copy data. - * @param destBuffer dest buffer. - * @param srcBuffer source buffer. - * @param len Number of the data to be copy. - * @retval None. - */ -static void CopyData(unsigned char *destBuffer, unsigned char *srcBuffer, unsigned int len) -{ - for (unsigned int i = 0; i < len; i++) { - destBuffer[i] = srcBuffer[i]; - } -} - -/** - * @brief Write the memory address of 24c64 eeprom. - * @param addrBuffer The memory address of eeprom. - * @param length The length of data buffer. - * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. - */ -static BASE_StatusType Write24c64MemoryAddress(unsigned char *addrBuffer, unsigned int length) -{ - BASE_StatusType ret = BASE_STATUS_OK; - unsigned char *tempAddr = addrBuffer; - - /* Write the memory address to AT24c64 eeprom. */ - ret = HAL_I2C_MasterWriteDMA(&g_i2c0, DEV_24C64_ADDRESS_WRITE, tempAddr, length); - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("LINE:%d,Write Data Fail,ret:%d\r\n", __LINE__, ret); - return ret; - } - /* Waiting for write completion or failure */ - while (!(g_txDoneFlag || g_errorFlag)) { - ; - } - g_txDoneFlag = BASE_CFG_UNSET; - if (g_errorFlag == BASE_CFG_SET) { - g_errorFlag = BASE_CFG_UNSET; /* Reset g_errorFlag. */ - DBG_PRINTF("LINE:%d,Read Data Fail\r\n", __LINE__); - return BASE_STATUS_ERROR; - } - return ret; -} - -/** - * @brief Read data from the 24c64 eeprom. - * @param addr The memory address of eeprom. - * @param buffer Address of buff to be receive data. - * @param len Number of the data to be read. - * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. - */ -static BASE_StatusType Sample24c64ReadData(unsigned int addr, unsigned char *buffer, unsigned int len) -{ - BASE_StatusType ret = BASE_STATUS_OK; /* Transfer success and failure status. */ - unsigned char tempAddr[I2C_SAMPLE_24C64_ADDR_SIZE]; - unsigned int currentLen = len; - unsigned int currentAddr = addr; - unsigned int tempReadLen; - unsigned char *tempBuffer = buffer; - - /* Start read data to eeprom. */ - while (1) { - if (currentLen == 0) { - break; - } - /* Set the memory address of eeprom. */ - tempAddr[0] = (currentAddr >> I2C_SAMPLE_24C64_ADDRESS_POS) & I2C_SAMPLE_24C64_ADDRESS_MASK; - tempAddr[1] = currentAddr & I2C_SAMPLE_24C64_ADDRESS_MASK; - tempReadLen = currentLen; - if (currentLen > I2C_SAMPLE_24C64_OPT_ONCE_LEN) { - tempReadLen = I2C_SAMPLE_24C64_OPT_ONCE_LEN; - } - BASE_FUNC_DELAY_MS(5); /* Delay 5 ms. */ - ret = Write24c64MemoryAddress(tempAddr, I2C_SAMPLE_24C64_ADDR_SIZE); - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("LINE:%d,Read Data Fail,ret:%d\r\n", __LINE__, ret); - return ret; - } - BASE_FUNC_DELAY_MS(5); /* Delay 5 ms. */ - ret = HAL_I2C_MasterReadDMA(&g_i2c0, DEV_24C64_ADDRESS_READ, tempBuffer, tempReadLen); - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("LINE:%d,Read Data Fail,ret:%d\r\n", __LINE__, ret); - return ret; - } - /* Waiting for read completion or failure */ - while (!(g_rxDoneFlag || g_errorFlag)) { - ; - } - g_rxDoneFlag = BASE_CFG_UNSET; - if (g_errorFlag == BASE_CFG_SET) { - DBG_PRINTF("LINE:%d,Read Data Fail\r\n", __LINE__); - g_errorFlag = BASE_CFG_UNSET; - return BASE_STATUS_ERROR; - } - /* Updata the destAddress, srcAddress and len. */ - currentAddr += tempReadLen; - currentLen -= tempReadLen; - tempBuffer += tempReadLen; - } - - return ret; -} - -/** - * @brief Send data to the 24c64 eeprom. - * @param addr The memory address of eeprom. - * @param buffer Address of buff to be send. - * @param len Number of the data to be send. - * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. - */ -static BASE_StatusType Sample24c64WriteData(unsigned int addr, unsigned char *buffer, unsigned int len) -{ - unsigned char tempWrite[I2C_SAMPLE_24C64_PAGE_SIZE + I2C_SAMPLE_24C64_ADDR_SIZE]; - unsigned int currentLen = len; - unsigned int currentAddr = addr; - unsigned int tempWriteLen; - unsigned char *tempBuffer = buffer; - BASE_StatusType ret = BASE_STATUS_OK; - - /* Start send data to eeprom. */ - while (1) { - if (currentLen == 0) { - break; - } - tempWriteLen = I2C_SAMPLE_24C64_PAGE_SIZE - (currentAddr % I2C_SAMPLE_24C64_PAGE_SIZE); - if (tempWriteLen > currentLen) { - tempWriteLen = currentLen; - } - /* Set the memory address of eeprom. */ - tempWrite[0] = (currentAddr >> I2C_SAMPLE_24C64_ADDRESS_POS) & I2C_SAMPLE_24C64_ADDRESS_MASK; - tempWrite[1] = currentAddr & I2C_SAMPLE_24C64_ADDRESS_MASK; - CopyData(&tempWrite[I2C_SAMPLE_24C64_ADDR_SIZE], tempBuffer, tempWriteLen); - BASE_FUNC_DELAY_MS(5); /* Delay 5 ms. */ - /* Send data to eeprom. */ - ret = HAL_I2C_MasterWriteDMA(&g_i2c0, DEV_24C64_ADDRESS_WRITE, tempWrite, - tempWriteLen + I2C_SAMPLE_24C64_ADDR_SIZE); - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("LINE:%d,Write Data Fail!,ret:%d\r\n", __LINE__, ret); - break; - } - /* Waiting for read completion or failure */ - while (!(g_txDoneFlag || g_errorFlag)) { - ; - } - g_txDoneFlag = BASE_CFG_UNSET; - if (g_errorFlag == BASE_CFG_SET) { - DBG_PRINTF("LINE:%d,Read Data Fail\r\n", __LINE__); - g_errorFlag = BASE_CFG_UNSET; - return BASE_STATUS_ERROR; - } - /* Updata the destAddress, srcAddress and len. */ - currentAddr += tempWriteLen; - tempBuffer += tempWriteLen; - currentLen -= tempWriteLen; - } - return ret; -} - -/** - * @brief Send and receive data with the 24c64 eeprom in dma mode as master. - * @retval None. - */ -void I2cDma24c64Processing(void) -{ - BASE_StatusType ret; - unsigned int dataFlag; - unsigned char tempWriteBuff[I2C_SAMPLE_24C64_OPT_LEN] = {0}; - unsigned int successCnt = 0; - - SystemInit(); - DBG_PRINTF("I2C Dma 24C64 Start\r\n"); - for (unsigned int i = 0; i < I2C_SAMPLE_24C64_OPT_LEN; i++) { - tempWriteBuff[i] = 0x5A; /* The written data. */ - } - - for (int j = 0; j < I2C_SAMPLE_24C64_TEST_NUM; j++) { - unsigned char tempReadBuff[I2C_SAMPLE_24C64_OPT_LEN] = {0}; - /* Write 24c64 data */ - ret = Sample24c64WriteData(I2C_SAMPLE_24C64_OPT_START_ADDR, tempWriteBuff, I2C_SAMPLE_24C64_OPT_LEN); - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("LINE:%d,Write Data Fail!,ret:%d\r\n", __LINE__, ret); - } - /* Read 24c64 data */ - ret = Sample24c64ReadData(I2C_SAMPLE_24C64_OPT_START_ADDR, tempReadBuff, I2C_SAMPLE_24C64_OPT_LEN); - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("LINE:%d,Read Data Fail,ret:%d\r\n", __LINE__, ret); - } - /* Compare read and write data */ - dataFlag = 0; - for (unsigned int i = 0; i < I2C_SAMPLE_24C64_OPT_LEN - 1; i++) { - if (tempReadBuff[i] != tempWriteBuff[i]) { - DBG_PRINTF("I2C Data error! offset[%d]\r\nReadData:0x%x\r\nWriteData:0x%x\r\n", i, tempReadBuff[i], - tempWriteBuff[i]); - dataFlag = 1; - break; - } - } - - /* The read data is exactly the same as the written data. */ - if (dataFlag == 0) { - successCnt++; - DBG_PRINTF("I2C Data Success\r\n"); - } - } - DBG_PRINTF("I2C sample End!\r\nsuccessCnt:%d\r\n", successCnt); -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/inc/sample_i2c_master_interrupt_at24c64.h b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/inc/sample_i2c_master_interrupt_at24c64.h deleted file mode 100644 index 0177aeb00..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/inc/sample_i2c_master_interrupt_at24c64.h +++ /dev/null @@ -1,29 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_i2c_master_interrupt_at24c64.c - * @author MCU Driver Team - * @brief Sample for I2C module interrupt as master. - * @details This sample demonstrates how to use the I2C master interrupt interface to read and write the EEPROM. - * To use this sample, the I2C interface must be connected to the AT24C64 EEPROM chip. - */ -#ifndef McuMagicTag_SAMPLE_I2C_MASTER_INTERRUPT_AT24C64_H -#define McuMagicTag_SAMPLE_I2C_MASTER_INTERRUPT_AT24C64_H - -void I2cInterrupt24c64Processing(void); - -#endif /* #ifndef McuMagicTag_SAMPLE_I2C_MASTER_INTERRUPT_AT24C64_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/init/main.c deleted file mode 100644 index cf5190300..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/init/main.c +++ /dev/null @@ -1,51 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ - -#include "typedefs.h" -#include "feature.h" -#include "sample_i2c_master_interrupt_at24c64.h" -#include "main.h" -/* USER CODE BEGIN 0 */ -/* USER CODE END 0 */ -UART_Handle g_uart0; -I2C_Handle g_i2c0; -/* USER CODE BEGIN 1 */ -/* USER CODE END 1 */ - -int main(void) -{ - /* USER CODE BEGIN 2 */ - /* USER CODE END 2 */ - I2cInterrupt24c64Processing(); - /* USER CODE BEGIN 3 */ - /* USER CODE END 3 */ - while (1) { - /* USER CODE BEGIN 4 */ - /* USER CODE END 4 */ - } - /* USER CODE BEGIN 5 */ - /* USER CODE END 5 */ - return BASE_STATUS_OK; -} - -/* USER CODE BEGIN 6 */ -/* USER CODE END 6 */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/init/main.h deleted file mode 100644 index 340f824bd..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/init/main.h +++ /dev/null @@ -1,55 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "i2c.h" -#include "i2c_ex.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -#define XTAL_DRV_LEVEL4 0x03U -#define XTAL_DRV_LEVEL3 0x02U -#define XTAL_DRV_LEVEL2 0x01U -#define XTAL_DRV_LEVEL1 0x00U - -extern UART_Handle g_uart0; -extern I2C_Handle g_i2c0; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -void I2C0TxCallback(void *handle); -void I2C0RxCallback(void *handle); -void I2C0ErrorCallback(void *handle); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/init/system_init.c deleted file mode 100644 index bc14db3a2..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/init/system_init.c +++ /dev/null @@ -1,156 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" -#include "iocmg_ip.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - /* Clock-related parameter configuration. */ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; - crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; - crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_1; - /* Initialize the clock configuration. */ - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -__weak void I2C0TxCallback(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN I2C0TxCallback */ - /* USER CODE END I2C0TxCallback */ -} - -__weak void I2C0RxCallback(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN I2C0RxCallback */ - /* USER CODE END I2C0RxCallback */ -} - -__weak void I2C0ErrorCallback(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN I2C0ErrorCallback */ - /* USER CODE END I2C0ErrorCallback */ -} - -static void I2C0_Init(void) -{ - HAL_CRG_IpEnableSet(I2C0_BASE, IP_CLK_ENABLE); - g_i2c0.baseAddress = I2C0; - - g_i2c0.functionMode = I2C_MODE_SELECT_MASTER_ONLY; - g_i2c0.addrMode = I2C_7_BITS; - g_i2c0.sdaHoldTime = 10; /* I2C SDA hold time 10. */ - g_i2c0.freq = 400000; /* I2C SCL rate 400000 bit/s. */ - g_i2c0.transferBuff = NULL; - g_i2c0.ignoreAckFlag = BASE_CFG_DISABLE; - g_i2c0.handleEx.spikeFilterTime = 0; - g_i2c0.handleEx.sdaDelayTime = 0; - g_i2c0.timeout = 10000; /* The value of timeout is 10000ms; */ - g_i2c0.state = I2C_STATE_RESET; - g_i2c0.rxWaterMark = 1; - g_i2c0.txWaterMark = 12; /* The value of tx Water mark is 12. */ - HAL_I2C_Init(&g_i2c0); - - HAL_I2C_RegisterCallback(&g_i2c0, I2C_MASTER_TX_COMPLETE_CB_ID, I2C0TxCallback); - HAL_I2C_RegisterCallback(&g_i2c0, I2C_MASTER_RX_COMPLETE_CB_ID, I2C0RxCallback); - HAL_I2C_RegisterCallback(&g_i2c0, I2C_ERROR_CB_ID, I2C0ErrorCallback); - /* Configuring I2C Interrupt Parameters. */ - IRQ_Register(IRQ_I2C0, HAL_I2C_IrqHandler, &g_i2c0); - IRQ_SetPriority(IRQ_I2C0, 1); - IRQ_EnableN(IRQ_I2C0); -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); - /* UART-related parameter configuration. */ - g_uart0.baseAddress = UART0; - - g_uart0.baudRate = UART0_BAND_RATE; /* Setting the UART Baud Rate. */ - g_uart0.dataLength = UART_DATALENGTH_8BIT; - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; /* Disable uart fifo mode. */ - g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; - g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; - g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; - /* Initializing the UART0. */ - HAL_UART_Init(&g_uart0); -} - -static void IOConfig(void) -{ - HAL_IOCMG_SetPinAltFuncMode(GPIO4_5_AS_I2C0_SCL); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO4_5_AS_I2C0_SCL, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO4_5_AS_I2C0_SCL, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO4_5_AS_I2C0_SCL, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO4_5_AS_I2C0_SCL, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO4_6_AS_I2C0_SDA); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO4_6_AS_I2C0_SDA, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO4_6_AS_I2C0_SDA, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO4_6_AS_I2C0_SDA, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO4_6_AS_I2C0_SDA, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - I2C0_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/readme.md deleted file mode 100644 index ce8964bcb..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/readme.md +++ /dev/null @@ -1,19 +0,0 @@ -# 配置I2C作为主机以中断方式进行数据的接收、发送,通过Debug串口打印数据收发的结果 -## 关键字: I2C, 主机,数据读取,数据发送,中断方式 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、I2C控制器初始化和功能配置。通过中断方式与EEPROM(AT24C64)进行数据的接收和数据的发送,通过Debug串口打印数据收发成功或失败的信息。 - -**【示例配置】** -+ I2C控制器选择:可选择I2C0或I2C1实现与EEPROM的数据接收和发送。 - -+ I2C初始化:调用接口"HAL_I2C_Init()”完成对示例代码中I2C的基地址、主从模式、寻址模式(7bit寻址或10bit寻址)、通讯速率等参数进行配置。调用"HAL_I2C_RegisterCallback()"接口注册中断回调函数,并使能相关中断配置。 - -+ 操作I2C写入和读取EEPROM的内容:通过调用 "HAL_I2C_MasterWriteIT()"接口以中断方式向EEPROM目标内存地址写入数据;通过调用"HAL_I2C_MasterReadIT()"接口以中断方式实现从EEPROM的目标地址中接收数据。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码中会通过I2C以中断方式向EEPROM写入和读取写入的内容,Debug串口打印I2C与EEPROM进行通信交互的结果信息,当写入和读取的数据一致时Debug串口打印"I2C Data Success";当写入和读取的数据不一致时Debug串口打印错误信息。 - -**【注意事项】** -+ 示例代码使用UART0进行结果打印输出,需要对UART0配置。 -+ 示例代码中I2C必须必须对接EEPROM(AT24C64),且保证EEPROM的7bit地址为50,否则示例代码无法正常运行。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/src/sample_i2c_master_interrupt_at24c64.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/src/sample_i2c_master_interrupt_at24c64.c deleted file mode 100644 index 69d39d68d..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/src/sample_i2c_master_interrupt_at24c64.c +++ /dev/null @@ -1,293 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_i2c_master_interrupt_at24c64.c - * @author MCU Driver Team - * @brief Sample for I2C module interrupt as master. - * @details This sample demonstrates how to use the I2C master interrupt interface to read and write the EEPROM. - * To use this sample, the I2C interface must be connected to the AT24C64 EEPROM chip. - */ -#include "i2c.h" -#include "main.h" -#include "debug.h" -#include "sample_i2c_master_interrupt_at24c64.h" - -#define DEV_24C64_ADDRESS_WRITE 0xA0 -#define DEV_24C64_ADDRESS_READ 0xA1 -#define I2C_SAMPLE_24C64_OPT_LEN 8 -#define I2C_SAMPLE_24C64_OPT_START_ADDR 0x0 -#define I2C_SAMPLE_24C64_DATA_OFFSET 2 -#define I2C_SAMPLE_24C64_PAGE_SIZE 32 -#define I2C_SAMPLE_24C64_ADDR_SIZE 2 -#define I2C_SAMPLE_24C64_OPT_ONCE_LEN 255 -#define I2C_SAMPLE_24C64_ADDRESS_POS 8 -#define I2C_SAMPLE_24C64_ADDRESS_MASK 0xFF - -#define I2C_SAMPLE_24C64_TEST_NUM 100 - -static volatile int g_txDoneFlag = BASE_CFG_UNSET; -static volatile int g_rxDoneFlag = BASE_CFG_UNSET; -static volatile int g_errorFlag = BASE_CFG_UNSET; - -/** - * @brief I2c interrupt sample tx callback handle. - * @param handle I2c handle. - * @retval None. - */ -void I2C0TxCallback(void *handle) -{ - BASE_FUNC_UNUSED(handle); - g_txDoneFlag = BASE_CFG_SET; -} - -/** - * @brief I2c interrupt sample rx callback handle. - * @param handle I2c handle. - * @retval None. - */ -void I2C0RxCallback(void *handle) -{ - BASE_FUNC_UNUSED(handle); - g_rxDoneFlag = BASE_CFG_SET; -} - -/** - * @brief I2c interrupt sample Error callback handle. - * @param handle I2c handle. - * @retval None. - */ -void I2C0ErrorCallback(void *handle) -{ - BASE_FUNC_UNUSED(handle); - g_errorFlag = BASE_CFG_SET; -} - -/** - * @brief Copy data. - * @param destBuffer dest buffer. - * @param srcBuffer source buffer. - * @param len Number of the data to be copy. - * @retval None. - */ -static void CopyData(unsigned char *destBuffer, unsigned char *srcBuffer, unsigned int len) -{ - for (unsigned int i = 0; i < len; i++) { - destBuffer[i] = srcBuffer[i]; - } -} - -/** - * @brief Write the memory address of 24c64 eeprom. - * @param addrBuffer The memory address of eeprom. - * @param length The length of data buffer. - * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. - */ -static BASE_StatusType Write24c64MemoryAddress(unsigned char *addrBuffer, unsigned int length) -{ - BASE_StatusType ret = BASE_STATUS_OK; - unsigned char *tempAddr = addrBuffer; - - /* Write the memory address to 24c64 eeprom. */ - HAL_I2C_MasterWriteIT(&g_i2c0, DEV_24C64_ADDRESS_WRITE, tempAddr, length); - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("LINE:%d,Write Data Fail,ret:%d\r\n", __LINE__, ret); - return ret; - } - - /* Waiting for write completion or failure */ - while (!(g_txDoneFlag || g_errorFlag)) { - ; - } - g_txDoneFlag = BASE_CFG_UNSET; - if (g_errorFlag == BASE_CFG_SET) { - g_errorFlag = BASE_CFG_UNSET; /* Reset g_errorFlag. */ - DBG_PRINTF("LINE:%d,Read Data Fail\r\n", __LINE__); - return BASE_STATUS_ERROR; - } - return ret; -} - -/** - * @brief Read data from the 24c64 eeprom. - * @param addr The memory address of eeprom. - * @param buffer Address of buff to be receive data. - * @param len Number of the data to be read. - * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. - */ -static BASE_StatusType Sample24c64ReadData(unsigned int addr, unsigned char *buffer, unsigned int len) -{ - BASE_StatusType ret = BASE_STATUS_OK; /* Transfer success and failure status. */ - unsigned char tempAddr[I2C_SAMPLE_24C64_ADDR_SIZE]; - unsigned int currentLen = len; - unsigned int currentAddr = addr; - unsigned int tempReadLen; - unsigned char *tempBuffer = buffer; - - /* Start read data from the 24c64 eeprom. */ - while (1) { - if (currentLen == 0) { - break; - } - - /* Set the memory address of eeprom. */ - tempAddr[0] = (currentAddr >> I2C_SAMPLE_24C64_ADDRESS_POS) & I2C_SAMPLE_24C64_ADDRESS_MASK; - tempAddr[1] = currentAddr & I2C_SAMPLE_24C64_ADDRESS_MASK; - - tempReadLen = currentLen; - if (currentLen > I2C_SAMPLE_24C64_OPT_ONCE_LEN) { - tempReadLen = I2C_SAMPLE_24C64_OPT_ONCE_LEN; - } - - ret = Write24c64MemoryAddress(tempAddr, I2C_SAMPLE_24C64_ADDR_SIZE); - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("LINE:%d,Read Data Fail,ret:%d\r\n", __LINE__, ret); - return ret; - } - - ret = HAL_I2C_MasterReadIT(&g_i2c0, DEV_24C64_ADDRESS_READ, - tempBuffer, tempReadLen); - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("LINE:%d,Read Data Fail,ret:%d\r\n", __LINE__, ret); - return ret; - } - - /* Waiting for read completion or failure */ - while (!(g_rxDoneFlag || g_errorFlag)) { - ; - } - g_rxDoneFlag = BASE_CFG_UNSET; - if (g_errorFlag == BASE_CFG_SET) { - g_errorFlag = BASE_CFG_UNSET; /* Reset g_errorFlag. */ - DBG_PRINTF("LINE:%d,Read Data Fail\r\n", __LINE__); - return BASE_STATUS_ERROR; - } - /* Updata the destAddress, srcAddress and len. */ - currentAddr += tempReadLen; - currentLen -= tempReadLen; - tempBuffer += tempReadLen; - } - return ret; -} - -/** - * @brief Send data to the 24c64 eeprom. - * @param addr The memory address of eeprom. - * @param buffer Address of buff to be send. - * @param len Number of the data to be send. - * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. - */ -static BASE_StatusType Sample24c64WriteData(unsigned int addr, unsigned char *buffer, unsigned int len) -{ - unsigned char tempWrite[I2C_SAMPLE_24C64_PAGE_SIZE + I2C_SAMPLE_24C64_ADDR_SIZE]; - unsigned int currentLen = len; - unsigned int currentAddr = addr; - unsigned int tempWriteLen; - unsigned char *tempBuffer = buffer; - BASE_StatusType ret = BASE_STATUS_OK; - - /* Start send data to eeprom. */ - while (1) { - if (currentLen == 0) { - break; - } - tempWriteLen = I2C_SAMPLE_24C64_PAGE_SIZE - (currentAddr % I2C_SAMPLE_24C64_PAGE_SIZE); - if (tempWriteLen > currentLen) { - tempWriteLen = currentLen; - } - /* Set the memory address of eeprom. */ - tempWrite[0] = (currentAddr >> I2C_SAMPLE_24C64_ADDRESS_POS) & I2C_SAMPLE_24C64_ADDRESS_MASK; - tempWrite[1] = currentAddr & I2C_SAMPLE_24C64_ADDRESS_MASK; - CopyData(&tempWrite[I2C_SAMPLE_24C64_ADDR_SIZE], tempBuffer, tempWriteLen); - /* Send data to eeprom. */ - ret = HAL_I2C_MasterWriteIT(&g_i2c0, DEV_24C64_ADDRESS_WRITE, tempWrite, - tempWriteLen + I2C_SAMPLE_24C64_ADDR_SIZE); - BASE_FUNC_DELAY_MS(20); /* Delay 20 ms. */ - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("LINE:%d,Write Data Fail!,ret:%d\r\n", __LINE__, ret); - break; - } - - /* Waiting for write completion or failure */ - while (!(g_txDoneFlag || g_errorFlag)) { - ; - } - g_txDoneFlag = BASE_CFG_UNSET; - if (g_errorFlag == BASE_CFG_SET) { - g_errorFlag = BASE_CFG_UNSET; /* Reset g_errorFlag. */ - DBG_PRINTF("LINE:%d,Write Data Fail\r\n", __LINE__); - return BASE_STATUS_ERROR; - } - /* Updata the destAddress, srcAddress and len. */ - currentAddr += tempWriteLen; - currentLen -= tempWriteLen; - tempBuffer += tempWriteLen; - } - return ret; -} - -/** - * @brief Send and receive data with the 24c64 eeprom in interrupt mode as master. - * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. - */ -void I2cInterrupt24c64Processing(void) -{ - BASE_StatusType ret; - unsigned int i; - unsigned int dataFlag; - unsigned char tempWriteBuff[I2C_SAMPLE_24C64_OPT_LEN] = {0}; - unsigned int successCnt = 0; - - SystemInit(); - DBG_PRINTF("I2C Interrupt AT24C64 Start\r\n"); - for (i = 0; i < I2C_SAMPLE_24C64_OPT_LEN; i++) { - tempWriteBuff[i] = 0x5A; /* The written data. */ - } - - for (int j = 0; j < I2C_SAMPLE_24C64_TEST_NUM; j++) { - unsigned char tempReadBuff[I2C_SAMPLE_24C64_OPT_LEN] = {0}; - - /* Write 24c64 data */ - ret = Sample24c64WriteData(I2C_SAMPLE_24C64_OPT_START_ADDR, tempWriteBuff, I2C_SAMPLE_24C64_OPT_LEN); - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("LINE:%d,Write Data Fail,ret:%d\r\n", __LINE__, ret); - } - - /* Read 24c64 data */ - ret = Sample24c64ReadData(I2C_SAMPLE_24C64_OPT_START_ADDR, tempReadBuff, I2C_SAMPLE_24C64_OPT_LEN); - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("LINE:%d,Write Data Fail,ret:%d\r\n", __LINE__, ret); - } - - /* Compare read and write data */ - dataFlag = 0; - for (i = 0; i < I2C_SAMPLE_24C64_OPT_LEN; i++) { - if (tempReadBuff[i] != tempWriteBuff[i]) { - DBG_PRINTF("I2C Data error! offset[%d]\r\nReadData:0x%x\r\nWriteData:0x%x\r\n", i, - tempReadBuff[i], tempWriteBuff[i]); - dataFlag = 1; - break; - } - } - - /* The read data is exactly the same as the written data. */ - if (dataFlag == 0) { - successCnt++; - DBG_PRINTF("I2C Data Success\r\n"); - } - } - DBG_PRINTF("I2C sample End!\r\nsuccessCnt:%d\r\n", successCnt); -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_blocking/inc/sample_i2c_slave_blocking.h b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_blocking/inc/sample_i2c_slave_blocking.h deleted file mode 100644 index 82e72c767..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_blocking/inc/sample_i2c_slave_blocking.h +++ /dev/null @@ -1,29 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_i2c_slave_blocking.h - * @author MCU Driver Team - * @brief Sample for I2C module blocking as slave. - * @details This sample demonstrates how to use the I2C slave blocking interface to read and write with I2C master. - * To use this sample, the I2C interface must be connected to the I2C master. - */ -#ifndef McuMagicTag_SAMPLE_I2C_SLAVE_BLOCKING_H -#define McuMagicTag_SAMPLE_I2C_SLAVE_BLOCKING_H - -void I2cSlaveBlockingProcessing(void); - -#endif /* #ifndef McuMagicTag_SAMPLE_I2C_SLAVE_BLOCKING_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_blocking/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_blocking/init/main.c deleted file mode 100644 index 5742fadab..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_blocking/init/main.c +++ /dev/null @@ -1,51 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ - -#include "typedefs.h" -#include "feature.h" -#include "sample_i2c_slave_blocking.h" -#include "main.h" -/* USER CODE BEGIN 0 */ -/* USER CODE END 0 */ -UART_Handle g_uart0; -I2C_Handle g_i2c0; -/* USER CODE BEGIN 1 */ -/* USER CODE END 1 */ - -int main(void) -{ - /* USER CODE BEGIN 2 */ - /* USER CODE END 2 */ - I2cSlaveBlockingProcessing(); - /* USER CODE BEGIN 3 */ - /* USER CODE END 3 */ - while (1) { - /* USER CODE BEGIN 4 */ - /* USER CODE END 4 */ - } - /* USER CODE BEGIN 5 */ - /* USER CODE END 5 */ - return BASE_STATUS_OK; -} - -/* USER CODE BEGIN 6 */ -/* USER CODE END 6 */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_blocking/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_blocking/init/main.h deleted file mode 100644 index bd646c19c..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_blocking/init/main.h +++ /dev/null @@ -1,51 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "i2c.h" -#include "i2c_ex.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -#define XTAL_DRV_LEVEL4 0x03U -#define XTAL_DRV_LEVEL3 0x02U -#define XTAL_DRV_LEVEL2 0x01U -#define XTAL_DRV_LEVEL1 0x00U - -extern UART_Handle g_uart0; -extern I2C_Handle g_i2c0; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_blocking/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_blocking/init/system_init.c deleted file mode 100644 index f8b0519b0..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_blocking/init/system_init.c +++ /dev/null @@ -1,129 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" -#include "iocmg_ip.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - /* Clock-related parameter configuration. */ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; - crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; - crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_1; - /* Initialize the clock configuration. */ - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void I2C0_Init(void) -{ - HAL_CRG_IpEnableSet(I2C0_BASE, IP_CLK_ENABLE); - g_i2c0.baseAddress = I2C0; - - g_i2c0.functionMode = I2C_MODE_SELECT_SLAVE_ONLY; - g_i2c0.addrMode = I2C_7_BITS; - g_i2c0.sdaHoldTime = 10; /* I2C SDA hold time 10. */ - g_i2c0.freq = 400000; /* I2C SCL rate 400000 bit/s. */ - g_i2c0.transferBuff = NULL; - g_i2c0.ignoreAckFlag = BASE_CFG_DISABLE; - g_i2c0.handleEx.spikeFilterTime = 0; - g_i2c0.handleEx.sdaDelayTime = 0; - g_i2c0.timeout = 10000; /* The value of timeout is 10000ms; */ - g_i2c0.slaveOwnAddress = 82; /* The own address of I2C is 82. */ - g_i2c0.handleEx.slaveOwnXmbAddressEnable = BASE_CFG_DISABLE; - g_i2c0.handleEx.slaveOwnXmbAddress = 0; - g_i2c0.generalCallMode = BASE_CFG_DISABLE; - g_i2c0.state = I2C_STATE_RESET; - HAL_I2C_Init(&g_i2c0); -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); - /* UART-related parameter configuration. */ - g_uart0.baseAddress = UART0; - - g_uart0.baudRate = UART0_BAND_RATE; /* Setting the UART Baud Rate. */ - g_uart0.dataLength = UART_DATALENGTH_8BIT; - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; /* Disable uart fifo mode. */ - g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; - g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; - g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; - /* Initializing the UART0. */ - HAL_UART_Init(&g_uart0); -} - -static void IOConfig(void) -{ - HAL_IOCMG_SetPinAltFuncMode(GPIO4_5_AS_I2C0_SCL); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO4_5_AS_I2C0_SCL, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO4_5_AS_I2C0_SCL, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO4_5_AS_I2C0_SCL, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO4_5_AS_I2C0_SCL, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO4_6_AS_I2C0_SDA); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO4_6_AS_I2C0_SDA, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO4_6_AS_I2C0_SDA, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO4_6_AS_I2C0_SDA, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO4_6_AS_I2C0_SDA, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - I2C0_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_blocking/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_blocking/readme.md deleted file mode 100644 index 02f77b964..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_blocking/readme.md +++ /dev/null @@ -1,23 +0,0 @@ -# 配置I2C作为从机以阻塞方式进行数据的接收、发送,通过Debug串口打印数据收发的结果 -## 关键字: I2C, 从机,数据读取,数据发送,阻塞方式 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、I2C控制器初始化和功能配置。通过阻塞方式与I2C主机进行数据的接收和数据的发送,通过Debug串口打印数据收发成功或失败的信息。 - -**【示例配置】** -+ I2C控制器选择:可选择I2C0或I2C1作为从机实现与I2C主机的数据接收和发送。 - -+ I2C初始化:调用接口"HAL_I2C_Init()”完成对示例代码中I2C的基地址、主从模式、寻址模式(7bit寻址或10bit寻址)、自身地址、通讯速率等参数进行配置。 - -+ 操作I2C与主机进行数据的发送和接收:
    - 1. 示例代码中首先循环等待I2C主机发送一个"0x3A"的开始标志帧,当接收到此帧后进入与I2C主机的数据发送和接收的交互;
    - 2. 调用"HAL_I2C_SlaveWriteBlocking()"接口以阻塞方式向I2C主机发送数据;
    - 3. 调用"HAL_I2C_SlaveReadBlocking()"接口以阻塞方式实现从I2C主机接收数据;
    - 4. 比较步骤2和步骤3发送和接收的数据是否一致,如果接收和发送的数据一致,则Debug串口打印"I2C Data Success"信息,不一致时打印错误信息。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码中会通过I2C以阻塞方式与主机进行数据的接收和发送,Debug串口打印I2C与主机进行通信交互的结果信息,当发送和接收的数据一致时Debug串口打印"I2C Data Success";当接收和发送的数据不一致时Debug串口打印错误信息。 - -**【注意事项】** -+ 示例代码使用UART0进行结果打印输出,需要对UART0配置。 -+ 示例代码中I2C必须必须对接主机,且保证主机寻址的地址为82(7bit地址),否则示例代码无法正常运行。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_blocking/src/sample_i2c_slave_blocking.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_blocking/src/sample_i2c_slave_blocking.c deleted file mode 100644 index e24287cc7..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_blocking/src/sample_i2c_slave_blocking.c +++ /dev/null @@ -1,148 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_i2c_slave_blocking.c - * @author MCU Driver Team - * @brief Sample for I2C module blocking as slave. - * @details This sample demonstrates how to use the I2C slave blocking interface to read and write with I2C master. - * To use this sample, the I2C interface must be connected to the I2C master. - */ -#include "i2c.h" -#include "main.h" -#include "debug.h" -#include "sample_i2c_slave_blocking.h" - -#define I2C_SAMPLE_SLAVE_OPT_LEN 8 -#define I2C_TEST_START_FLAG 0x3A - -#define I2C_SAMPLE_SLAVE_TEST_NUM 500 -#define I2C_SAMPLE_MAX_TIMEOUT 10000 - -/** - * @brief Read data from master. - * @param buffer Address of buff to be receive data. - * @param len Number of the data to be read. - * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. - */ -static BASE_StatusType SampleSlaveBlockingReadData(unsigned char *buffer, unsigned int len) -{ - BASE_StatusType ret = BASE_STATUS_OK; - unsigned int currentLen = len; - unsigned char *tempBuffer = buffer; - - if (currentLen == 0) { /* Number of illegal transmissions. */ - return ret; - } - /* Read data from the master. */ - ret = HAL_I2C_SlaveReadBlocking(&g_i2c0, tempBuffer, currentLen, I2C_SAMPLE_MAX_TIMEOUT); - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("LINE:%d,Read Data Fail,ret:%d\r\n", __LINE__, ret); - return ret; - } - - return ret; -} - -/** - * @brief Send data to the master in blocking mode. - * @param buffer Address of buff to be send. - * @param len Number of the data to be send. - * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. - */ -static BASE_StatusType SampleSlaveBlockingWriteData(unsigned char *buffer, unsigned int len) -{ - BASE_StatusType ret = BASE_STATUS_OK; - unsigned int currentLen = len; - unsigned char *tempBuffer = buffer; - - if (currentLen == 0) { /* Number of illegal transmissions. */ - return ret; - } - /* Send data to the master. */ - ret = HAL_I2C_SlaveWriteBlocking(&g_i2c0, tempBuffer, currentLen, I2C_SAMPLE_MAX_TIMEOUT); - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("LINE:%d,Write Data Fail!,ret:%d\r\n", __LINE__, ret); - return ret; - } - - return ret; -} - -/** - * @brief Send and receive data in blocking mode as slave. - * @retval None. - */ -void I2cSlaveBlockingProcessing(void) -{ - BASE_StatusType ret; - unsigned int i; - unsigned int dataFlag; - unsigned char tempWriteBuff[I2C_SAMPLE_SLAVE_OPT_LEN] = {0}; - unsigned int successCnt = 0; - unsigned char testStart = 0; - - SystemInit(); - DBG_PRINTF("I2C Slave Blocking Sample Start\r\n"); - for (i = 0; i < I2C_SAMPLE_SLAVE_OPT_LEN; i++) { - tempWriteBuff[i] = 0x4A; /* The written data. */ - } - - /* Waiting for the start signal from the master */ - DBG_PRINTF("Waiting Master Start......\r\n"); - while (true) { - SampleSlaveBlockingReadData(&testStart, 1); - if (testStart == I2C_TEST_START_FLAG) { - DBG_PRINTF("Master wait done\r\n"); - break; - } - } - - /* Start to send and receive test data. */ - for (int j = 0; j < I2C_SAMPLE_SLAVE_TEST_NUM; j++) { - unsigned char tempReadBuff[I2C_SAMPLE_SLAVE_OPT_LEN] = {0}; - - /* Write data to master */ - ret = SampleSlaveBlockingWriteData(tempWriteBuff, I2C_SAMPLE_SLAVE_OPT_LEN); - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("LINE:%d,Write Data Fail,ret:%d\r\n", __LINE__, ret); - } - - /* Read data from master */ - ret = SampleSlaveBlockingReadData(tempReadBuff, I2C_SAMPLE_SLAVE_OPT_LEN); - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("LINE:%d,Read Data Fail,ret:%d\r\n", __LINE__, ret); - } - - /* Compare read and write data */ - dataFlag = 0; - for (i = 0; i < I2C_SAMPLE_SLAVE_OPT_LEN; i++) { - if (tempReadBuff[i] != tempWriteBuff[i]) { - DBG_PRINTF("I2C Data error! offset[%d]\r\nReadData:0x%x\r\nWriteData:0x%x\r\n", i, - tempReadBuff[i], tempWriteBuff[i]); - dataFlag = 1; - break; - } - } - - /* The read data is exactly the same as the written data. */ - if (dataFlag == 0) { - successCnt++; - DBG_PRINTF("I2C Data Success\r\n"); - } - } - DBG_PRINTF("I2C sample End!\r\nsuccessCnt:%d\r\n", successCnt); -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_dma/inc/sample_i2c_slave_dma.h b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_dma/inc/sample_i2c_slave_dma.h deleted file mode 100644 index 860a34ac3..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_dma/inc/sample_i2c_slave_dma.h +++ /dev/null @@ -1,29 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_i2c_slave_dma.c - * @author MCU Driver Team - * @brief Sample for I2C module dma as slave. - * @details This sample demonstrates how to use the I2C slave DMA interface to read and write with I2C master. - * To use this sample, the I2C interface must be connected to the I2C master. - */ -#ifndef McuMagicTag_SAMPLE_I2C_SLAVE_DMA_H -#define McuMagicTag_SAMPLE_I2C_SLAVE_DMA_H - -void I2cSlaveDmaProcessing(void); - -#endif /* #ifndef McuMagicTag_SAMPLE_I2C_SLAVE_DMA_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_dma/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_dma/init/main.c deleted file mode 100644 index 0ff74a0aa..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_dma/init/main.c +++ /dev/null @@ -1,53 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ - -#include "typedefs.h" -#include "feature.h" -#include "sample_i2c_slave_dma.h" -#include "main.h" - -/* USER CODE BEGIN 0 */ -/* USER CODE END 0 */ -UART_Handle g_uart0; -I2C_Handle g_i2c0; -DMA_Handle g_dmac; -/* USER CODE BEGIN 1 */ -/* USER CODE END 1 */ - -int main(void) -{ - /* USER CODE BEGIN 2 */ - /* USER CODE END 2 */ - I2cSlaveDmaProcessing(); - /* USER CODE BEGIN 3 */ - /* USER CODE END 3 */ - while (1) { - /* USER CODE BEGIN 4 */ - /* USER CODE END 4 */ - } - /* USER CODE BEGIN 5 */ - /* USER CODE END 5 */ - return BASE_STATUS_OK; -} - -/* USER CODE BEGIN 6 */ -/* USER CODE END 6 */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_dma/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_dma/init/main.h deleted file mode 100644 index 9e0d9fccb..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_dma/init/main.h +++ /dev/null @@ -1,54 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "i2c.h" -#include "i2c_ex.h" -#include "crg.h" -#include "dma.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -#define XTAL_DRV_LEVEL4 0x03U -#define XTAL_DRV_LEVEL3 0x02U -#define XTAL_DRV_LEVEL2 0x01U -#define XTAL_DRV_LEVEL1 0x00U - -extern UART_Handle g_uart0; -extern I2C_Handle g_i2c0; - -extern DMA_Handle g_dmac; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_dma/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_dma/init/system_init.c deleted file mode 100644 index da15b6fa3..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_dma/init/system_init.c +++ /dev/null @@ -1,216 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" -#include "iocmg_ip.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - /* Clock-related parameter configuration. */ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; - crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; - crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_1; - /* Initialize the clock configuration. */ - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void DMA_Channel0Init(void *handle) -{ - /* Setting DMA-related parameters. */ - DMA_ChannelParam dma_param; - dma_param.direction = DMA_PERIPH_TO_MEMORY_BY_DMAC; - dma_param.srcAddrInc = DMA_ADDR_UNALTERED; - dma_param.destAddrInc = DMA_ADDR_INCREASE; - dma_param.srcPeriph = DMA_REQUEST_I2C0_RX; - dma_param.destPeriph = DMA_REQUEST_MEM; - /* Set the moving position width. */ - dma_param.srcWidth = DMA_TRANSWIDTH_BYTE; - dma_param.destWidth = DMA_TRANSWIDTH_BYTE; - dma_param.srcBurst = DMA_BURST_LENGTH_1; - dma_param.destBurst = DMA_BURST_LENGTH_1; - dma_param.pHandle = handle; - /* DMA Channel initialization. */ - HAL_DMA_InitChannel(&g_dmac, &dma_param, DMA_CHANNEL_ZERO); -} - -static void DMA_Channel1Init(void *handle) -{ - /* Setting DMA-related parameters. */ - DMA_ChannelParam dma_param; - dma_param.direction = DMA_MEMORY_TO_PERIPH_BY_DMAC; - dma_param.srcAddrInc = DMA_ADDR_INCREASE; - dma_param.destAddrInc = DMA_ADDR_UNALTERED; - dma_param.srcPeriph = DMA_REQUEST_MEM; - dma_param.destPeriph = DMA_REQUEST_I2C0_TX; - /* Set the moving position width. */ - dma_param.srcWidth = DMA_TRANSWIDTH_WORD; - dma_param.destWidth = DMA_TRANSWIDTH_WORD; - dma_param.srcBurst = DMA_BURST_LENGTH_1; - dma_param.destBurst = DMA_BURST_LENGTH_1; - dma_param.pHandle = handle; - /* DMA Channel initialization. */ - HAL_DMA_InitChannel(&g_dmac, &dma_param, DMA_CHANNEL_ONE); -} - -static void DMA_Init(void) -{ - /* DMA initialization. */ - HAL_CRG_IpEnableSet(DMA_BASE, IP_CLK_ENABLE); - g_dmac.baseAddress = DMA; - /* Configuring DMA Interrupt Parameters. */ - IRQ_Register(IRQ_DMA_TC, HAL_DMA_IrqHandlerTc, &g_dmac); - IRQ_Register(IRQ_DMA_ERR, HAL_DMA_IrqHandlerError, &g_dmac); - IRQ_EnableN(IRQ_DMA_TC); - IRQ_EnableN(IRQ_DMA_ERR); - HAL_DMA_Init(&g_dmac); - /* Setting the Channel Priority and Initializing the Channel. */ - DMA_Channel0Init((void *)(&g_i2c0)); - HAL_DMA_SetChannelPriorityEx(&g_dmac, DMA_CHANNEL_ZERO, DMA_PRIORITY_HIGHEST); - DMA_Channel1Init((void *)(&g_i2c0)); - HAL_DMA_SetChannelPriorityEx(&g_dmac, DMA_CHANNEL_ONE, DMA_PRIORITY_HIGHEST); -} - -__weak void I2C0TxCallback(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN I2C0TxCallback */ - /* USER CODE END I2C0TxCallback */ -} - -__weak void I2C0RxCallback(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN I2C0RxCallback */ - /* USER CODE END I2C0RxCallback */ -} - -__weak void I2C0ErrorCallback(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN I2C0ErrorCallback */ - /* USER CODE END I2C0ErrorCallback */ -} - -static void I2C0_Init(void) -{ - HAL_CRG_IpEnableSet(I2C0_BASE, IP_CLK_ENABLE); - g_i2c0.baseAddress = I2C0; - - g_i2c0.functionMode = I2C_MODE_SELECT_SLAVE_ONLY; - g_i2c0.addrMode = I2C_7_BITS; - g_i2c0.sdaHoldTime = 10; /* I2C SDA hold time 10. */ - g_i2c0.freq = 400000; /* I2C SCL rate 400000 bit/s. */ - g_i2c0.transferBuff = NULL; - g_i2c0.ignoreAckFlag = BASE_CFG_DISABLE; - g_i2c0.handleEx.spikeFilterTime = 0; - g_i2c0.handleEx.sdaDelayTime = 0; - g_i2c0.timeout = 10000; /* The value of timeout is 10000ms; */ - g_i2c0.slaveOwnAddress = 82; /* The own address of I2C is 82. */ - g_i2c0.handleEx.slaveOwnXmbAddressEnable = BASE_CFG_DISABLE; - g_i2c0.handleEx.slaveOwnXmbAddress = 0; - g_i2c0.generalCallMode = BASE_CFG_DISABLE; - g_i2c0.state = I2C_STATE_RESET; - g_i2c0.rxWaterMark = 1; /* The value of rx Water mark is 1. */ - g_i2c0.txWaterMark = 12; /* The value of tx Water mark is 12. */ - g_i2c0.dmaHandle = &g_dmac; - g_i2c0.txDmaCh = DMA_CHANNEL_ONE; - g_i2c0.rxDmaCh = DMA_CHANNEL_ZERO; - HAL_I2C_Init(&g_i2c0); - - HAL_I2C_RegisterCallback(&g_i2c0, I2C_SLAVE_TX_COMPLETE_CB_ID, I2C0TxCallback); - HAL_I2C_RegisterCallback(&g_i2c0, I2C_SLAVE_RX_COMPLETE_CB_ID, I2C0RxCallback); - HAL_I2C_RegisterCallback(&g_i2c0, I2C_ERROR_CB_ID, I2C0ErrorCallback); -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); - /* UART-related parameter configuration. */ - g_uart0.baseAddress = UART0; - - g_uart0.baudRate = UART0_BAND_RATE; /* Setting the UART Baud Rate. */ - g_uart0.dataLength = UART_DATALENGTH_8BIT; - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; /* Disable uart fifo mode. */ - g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; - g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; - g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; - /* Initializing the UART0. */ - HAL_UART_Init(&g_uart0); -} - -static void IOConfig(void) -{ - HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO4_5_AS_I2C0_SCL); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO4_5_AS_I2C0_SCL, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO4_5_AS_I2C0_SCL, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO4_5_AS_I2C0_SCL, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO4_5_AS_I2C0_SCL, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO4_6_AS_I2C0_SDA); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO4_6_AS_I2C0_SDA, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO4_6_AS_I2C0_SDA, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO4_6_AS_I2C0_SDA, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO4_6_AS_I2C0_SDA, DRIVER_RATE_2); /* Output signal edge fast/slow */ -} - -void SystemInit(void) -{ - IOConfig(); - DMA_Init(); - UART0_Init(); - I2C0_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_dma/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_dma/readme.md deleted file mode 100644 index 883d89fcb..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_dma/readme.md +++ /dev/null @@ -1,23 +0,0 @@ -# 配置I2C作为从机以DMA方式进行数据的接收、发送,通过Debug串口打印数据收发的结果 -## 关键字: I2C, 从机,数据读取,数据发送,DMA方式 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、I2C控制器初始化和功能配置。通过DMA方式与I2C主机进行数据的接收和数据的发送,通过Debug串口打印数据收发成功或失败的信息。 - -**【示例配置】** -+ I2C控制器选择:可选择I2C0或I2C1作为从机实现与I2C主机的数据接收和发送。 - -+ I2C初始化:调用接口"HAL_I2C_Init()”完成对示例代码中I2C的基地址、主从模式、寻址模式(7bit寻址或10bit寻址)、自身地址、接收水线和发送水线、通讯速率等参数进行配置。调用"HAL_I2C_RegisterCallback()"接口注册收发完成、传输错误时的回调函数。 - -+ 操作I2C与主机进行数据的发送和接收:
    - 1. 示例代码中首先循环等待I2C主机发送一个"0x3A"的开始标志帧,当接收到此帧后进入与I2C主机的数据发送和接收的交互;
    - 2. 调用"HAL_I2C_SlaveWriteDMA()"接口以DMA方式向I2C主机发送数据;
    - 3. 调用"HAL_I2C_SlaveReadDMA()"接口以DMA方式实现从I2C主机接收数据;
    - 4. 比较步骤2和步骤3发送和接收的数据是否一致,如果接收和发送的数据一致,则Debug串口打印"I2C Data Success"信息,不一致时打印错误信息。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码中会通过I2C以DMA方式与主机进行数据的接收和发送,Debug串口打印I2C与主机进行通信交互的结果信息,当发送和接收的数据一致时Debug串口打印"I2C Data Success";当接收和发送的数据不一致时Debug串口打印错误信息。 - -**【注意事项】** -+ 示例代码使用UART0进行结果打印输出,需要对UART0配置。 -+ 示例代码中I2C必须必须对接主机,且保证主机寻址的地址为82(7bit地址),否则示例代码无法正常运行。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_dma/src/sample_i2c_slave_dma.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_dma/src/sample_i2c_slave_dma.c deleted file mode 100644 index 4adb63d62..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_dma/src/sample_i2c_slave_dma.c +++ /dev/null @@ -1,208 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_i2c_slave_dma.c - * @author MCU Driver Team - * @brief Sample for I2C module dma as slave. - * @details This sample demonstrates how to use the I2C slave DMA interface to read and write with I2C master. - * To use this sample, the I2C interface must be connected to the I2C master. - */ -#include "main.h" -#include "debug.h" -#include "sample_i2c_slave_dma.h" - -#define I2C_SAMPLE_SLAVE_OPT_LEN 8 -#define I2C_TEST_START_FLAG 0x3A - -#define I2C_SAMPLE_SLAVE_TEST_NUM 500 - -static volatile int g_txDoneFlag = BASE_CFG_UNSET; -static volatile int g_rxDoneFlag = BASE_CFG_UNSET; -static volatile int g_errorFlag = BASE_CFG_UNSET; - -/** - * @brief I2c interrupt sample tx callback handle. - * @param handle I2c handle. - * @retval None. - */ -void I2C0TxCallback(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("Tx callback\r\n"); - g_txDoneFlag = BASE_CFG_SET; -} - -/** - * @brief I2c interrupt sample rx callback handle. - * @param handle I2c handle. - * @retval None. - */ -void I2C0RxCallback(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("Rx callback\r\n"); - g_rxDoneFlag = BASE_CFG_SET; -} - -/** - * @brief I2c interrupt sample Error callback handle. - * @param handle I2c handle. - * @retval None. - */ -void I2C0ErrorCallback(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("Error callback\r\n"); - g_errorFlag = BASE_CFG_SET; -} - -/** - * @brief Read data from master in dma. - * @param buffer Address of buff to be receive data. - * @param len Number of the data to be read. - * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. - */ -static BASE_StatusType SampleSlaveDmaReadData(unsigned char *buffer, unsigned int len) -{ - BASE_StatusType ret = BASE_STATUS_OK; - unsigned int currentLen = len; - unsigned char *tempBuffer = buffer; - - if (currentLen == 0) { /* Number of illegal transmissions. */ - return ret; - } - - /* Read data from the master. */ - ret = HAL_I2C_SlaveReadDMA(&g_i2c0, tempBuffer, currentLen); - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("LINE:%d,Read Data Fail,ret:%d\r\n", __LINE__, ret); - return ret; - } - /* Waiting for read completion or failure */ - while (!(g_rxDoneFlag || g_errorFlag)) { - ; - } - g_rxDoneFlag = BASE_CFG_UNSET; - if (g_errorFlag == BASE_CFG_SET) { - DBG_PRINTF("LINE:%d,Read Data Fail\r\n", __LINE__); - g_errorFlag = BASE_CFG_UNSET; - return BASE_STATUS_ERROR; - } - - return ret; -} - -/** - * @brief Send data to the master in dma. - * @param buffer Address of buff to be send. - * @param len Number of the data to be send. - * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. - */ -static BASE_StatusType SampleSlaveDmaWriteData(unsigned char *buffer, unsigned int len) -{ - BASE_StatusType ret = BASE_STATUS_OK; - unsigned int currentLen = len; - unsigned char *tempBuffer = buffer; - - if (currentLen == 0) { /* Number of illegal transmissions. */ - return ret; - } - - /* Send data to the master. */ - ret = HAL_I2C_SlaveWriteDMA(&g_i2c0, tempBuffer, currentLen); - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("LINE:%d,Write Data Fail!,ret:%d\r\n", __LINE__, ret); - return ret; - } - /* Waiting for read completion or failure */ - while (!(g_txDoneFlag || g_errorFlag)) { - ; - } - g_txDoneFlag = BASE_CFG_UNSET; - if (g_errorFlag == BASE_CFG_SET) { - g_errorFlag = BASE_CFG_UNSET; - DBG_PRINTF("LINE:%d,Read Data Fail\r\n", __LINE__); - return BASE_STATUS_ERROR; - } - - return ret; -} - -/** - * @brief Send and receive data in dma mode as slave. - * @retval None. - */ -void I2cSlaveDmaProcessing(void) -{ - BASE_StatusType ret; - unsigned int i; - unsigned int dataFlag; - unsigned char tempWriteBuff[I2C_SAMPLE_SLAVE_OPT_LEN] = {0}; - unsigned int successCnt = 0; - unsigned char testStart = 0; - - SystemInit(); - DBG_PRINTF("I2C Slave Dma Sample Start\r\n"); - for (i = 0; i < I2C_SAMPLE_SLAVE_OPT_LEN; i++) { - tempWriteBuff[i] = 0x4A; /* The written data. */ - } - /* Waiting for the start signal from the master */ - DBG_PRINTF("Waiting Master Start......\r\n"); - while (true) { - SampleSlaveDmaReadData(&testStart, 1); - if (testStart == I2C_TEST_START_FLAG) { - DBG_PRINTF("Master wait done\r\n"); - break; - } - } - - /* Start to send and receive test data. */ - for (int j = 0; j < I2C_SAMPLE_SLAVE_TEST_NUM; j++) { - unsigned char tempReadBuff[I2C_SAMPLE_SLAVE_OPT_LEN] = {0}; - - /* Write data to master */ - ret = SampleSlaveDmaWriteData(tempWriteBuff, I2C_SAMPLE_SLAVE_OPT_LEN); - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("LINE:%d,Write Data Fail,ret:%d\r\n", __LINE__, ret); - } - - /* Read data from master */ - ret = SampleSlaveDmaReadData(tempReadBuff, I2C_SAMPLE_SLAVE_OPT_LEN); - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("LINE:%d,Read Data Fail,ret:%d\r\n", __LINE__, ret); - } - - BASE_FUNC_DELAY_MS(10); /* Delay 10 ms. */ - /* Compare read and write data */ - dataFlag = 0; - for (i = 0; i < I2C_SAMPLE_SLAVE_OPT_LEN; i++) { - if (tempReadBuff[i] != tempWriteBuff[i]) { - DBG_PRINTF("I2C Data error! offset[%d]\r\nReadData:0x%x\r\nWriteData:0x%x\r\n", i, - tempReadBuff[i], tempWriteBuff[i]); - dataFlag = 1; - break; - } - } - - /* The read data is exactly the same as the written data. */ - if (dataFlag == 0) { - successCnt++; - DBG_PRINTF("I2C Data Success\r\n"); - } - } - DBG_PRINTF("I2C sample End!\r\nsuccessCnt:%d\r\n", successCnt); -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_interrupt/inc/sample_i2c_slave_interrupt.h b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_interrupt/inc/sample_i2c_slave_interrupt.h deleted file mode 100644 index 6490acab6..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_interrupt/inc/sample_i2c_slave_interrupt.h +++ /dev/null @@ -1,29 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_i2c_slave_interrupt.c - * @author MCU Driver Team - * @brief Sample for I2C module interrupt as slave. - * @details This sample demonstrates how to use the I2C slave interrupt interface to read and write with I2C master. - * To use this sample, the I2C interface must be connected to the I2C master. - */ -#ifndef McuMagicTag_SAMPLE_I2C_SLAVE_INTERRUPT_H -#define McuMagicTag_SAMPLE_I2C_SLAVE_INTERRUPT_H - -void I2cSlaveInterruptProcessing(void); - -#endif /* #ifndef McuMagicTag_SAMPLE_I2C_SLAVE_INTERRUPT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_interrupt/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_interrupt/init/main.c deleted file mode 100644 index 0a65c2f2a..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_interrupt/init/main.c +++ /dev/null @@ -1,52 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ - -#include "typedefs.h" -#include "feature.h" -#include "sample_i2c_slave_interrupt.h" -#include "main.h" - -/* USER CODE BEGIN 0 */ -/* USER CODE END 0 */ -UART_Handle g_uart0; -I2C_Handle g_i2c0; -/* USER CODE BEGIN 1 */ -/* USER CODE END 1 */ - -int main(void) -{ - /* USER CODE BEGIN 2 */ - /* USER CODE END 2 */ - I2cSlaveInterruptProcessing(); - /* USER CODE BEGIN 3 */ - /* USER CODE END 3 */ - while (1) { - /* USER CODE BEGIN 4 */ - /* USER CODE END 4 */ - } - /* USER CODE BEGIN 5 */ - /* USER CODE END 5 */ - return BASE_STATUS_OK; -} - -/* USER CODE BEGIN 6 */ -/* USER CODE END 6 */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_interrupt/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_interrupt/init/main.h deleted file mode 100644 index 340f824bd..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_interrupt/init/main.h +++ /dev/null @@ -1,55 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "i2c.h" -#include "i2c_ex.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -#define XTAL_DRV_LEVEL4 0x03U -#define XTAL_DRV_LEVEL3 0x02U -#define XTAL_DRV_LEVEL2 0x01U -#define XTAL_DRV_LEVEL1 0x00U - -extern UART_Handle g_uart0; -extern I2C_Handle g_i2c0; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -void I2C0TxCallback(void *handle); -void I2C0RxCallback(void *handle); -void I2C0ErrorCallback(void *handle); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_interrupt/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_interrupt/init/system_init.c deleted file mode 100644 index db5c8a2cf..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_interrupt/init/system_init.c +++ /dev/null @@ -1,159 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" -#include "iocmg_ip.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - /* Clock-related parameter configuration. */ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; - crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; - crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_1; - /* Initialize the clock configuration. */ - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -__weak void I2C0TxCallback(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN I2C0TxCallback */ - /* USER CODE END I2C0TxCallback */ -} - -__weak void I2C0RxCallback(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN I2C0RxCallback */ - /* USER CODE END I2C0RxCallback */ -} - -__weak void I2C0ErrorCallback(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN I2C0ErrorCallback */ - /* USER CODE END I2C0ErrorCallback */ -} - -static void I2C0_Init(void) -{ - HAL_CRG_IpEnableSet(I2C0_BASE, IP_CLK_ENABLE); - g_i2c0.baseAddress = I2C0; - - g_i2c0.functionMode = I2C_MODE_SELECT_SLAVE_ONLY; - g_i2c0.addrMode = I2C_7_BITS; - g_i2c0.sdaHoldTime = 10; /* I2C SDA hold time 10. */ - g_i2c0.freq = 400000; /* I2C SCL rate 400000 bit/s. */ - g_i2c0.transferBuff = NULL; - g_i2c0.ignoreAckFlag = BASE_CFG_DISABLE; - g_i2c0.handleEx.spikeFilterTime = 0; - g_i2c0.handleEx.sdaDelayTime = 0; - g_i2c0.timeout = 10000; /* The value of timeout is 10000ms; */ - g_i2c0.slaveOwnAddress = 82; /* The own address of I2C is 82. */ - g_i2c0.handleEx.slaveOwnXmbAddressEnable = BASE_CFG_DISABLE; - g_i2c0.handleEx.slaveOwnXmbAddress = 0; - g_i2c0.generalCallMode = BASE_CFG_DISABLE; - g_i2c0.state = I2C_STATE_RESET; - g_i2c0.rxWaterMark = 1; /* The value of rx Water mark is 1. */ - g_i2c0.txWaterMark = 12; /* The value of tx Water mark is 12. */ - HAL_I2C_Init(&g_i2c0); - - HAL_I2C_RegisterCallback(&g_i2c0, I2C_SLAVE_TX_COMPLETE_CB_ID, I2C0TxCallback); - HAL_I2C_RegisterCallback(&g_i2c0, I2C_SLAVE_RX_COMPLETE_CB_ID, I2C0RxCallback); - HAL_I2C_RegisterCallback(&g_i2c0, I2C_ERROR_CB_ID, I2C0ErrorCallback); - IRQ_Register(IRQ_I2C0, HAL_I2C_IrqHandler, &g_i2c0); - IRQ_SetPriority(IRQ_I2C0, 1); - IRQ_EnableN(IRQ_I2C0); -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); - /* UART-related parameter configuration. */ - g_uart0.baseAddress = UART0; - - g_uart0.baudRate = UART0_BAND_RATE; /* Setting the UART Baud Rate. */ - g_uart0.dataLength = UART_DATALENGTH_8BIT; - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; /* Disable uart fifo mode. */ - g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; - g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; - g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; - /* Initializing the UART0. */ - HAL_UART_Init(&g_uart0); -} - -static void IOConfig(void) -{ - HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO4_5_AS_I2C0_SCL); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO4_5_AS_I2C0_SCL, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO4_5_AS_I2C0_SCL, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO4_5_AS_I2C0_SCL, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO4_5_AS_I2C0_SCL, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO4_6_AS_I2C0_SDA); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO4_6_AS_I2C0_SDA, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO4_6_AS_I2C0_SDA, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO4_6_AS_I2C0_SDA, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO4_6_AS_I2C0_SDA, DRIVER_RATE_2); /* Output signal edge fast/slow */ -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - I2C0_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_interrupt/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_interrupt/readme.md deleted file mode 100644 index 5ad208553..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_interrupt/readme.md +++ /dev/null @@ -1,23 +0,0 @@ -# 配置I2C作为从机以中断方式进行数据的接收、发送,通过Debug串口打印数据收发的结果 -## 关键字: I2C, 从机,数据读取,数据发送,中断方式 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、I2C控制器初始化和功能配置。通过中断方式与I2C主机进行数据的接收和数据的发送,通过Debug串口打印数据收发成功或失败的信息。 - -**【示例配置】** -+ I2C控制器选择:可选择I2C0或I2C1作为从机实现与I2C主机的数据接收和发送。 - -+ I2C初始化:调用接口"HAL_I2C_Init()”完成对示例代码中I2C的基地址、主从模式、寻址模式(7bit寻址或10bit寻址)、自身地址、接收水线和发送水线、通讯速率等参数进行配置。调用"HAL_I2C_RegisterCallback()"接口注册中断回调函数,并使能相关中断配置。 - -+ 操作I2C与主机进行数据的发送和接收:
    - 1. 示例代码中首先循环等待I2C主机发送一个"0x3A"的开始标志帧,当接收到此帧后进入与I2C主机的数据发送和接收的交互;
    - 2. 调用"HAL_I2C_SlaveWriteIT()"接口以中断方式向I2C主机发送数据;
    - 3. 调用"HAL_I2C_SlaveReadIT()"接口以中断方式实现从I2C主机接收数据;
    - 4. 比较步骤2和步骤3发送和接收的数据是否一致,如果接收和发送的数据一致,则Debug串口打印"I2C Data Success"信息,不一致时打印错误信息。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码中会通过I2C以中断方式与主机进行数据的接收和发送,Debug串口打印I2C与主机进行通信交互的结果信息,当发送和接收的数据一致时Debug串口打印"I2C Data Success";当接收和发送的数据不一致时Debug串口打印错误信息。 - -**【注意事项】** -+ 示例代码使用UART0进行结果打印输出,需要对UART0配置。 -+ 示例代码中I2C必须必须对接主机,且保证主机寻址的地址为82(7bit地址),否则示例代码无法正常运行。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_interrupt/src/sample_i2c_slave_interrupt.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_interrupt/src/sample_i2c_slave_interrupt.c deleted file mode 100644 index 99554d7d2..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_interrupt/src/sample_i2c_slave_interrupt.c +++ /dev/null @@ -1,206 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_i2c_slave_interrupt.c - * @author MCU Driver Team - * @brief Sample for I2C module interrupt as slave. - * @details This sample demonstrates how to use the I2C slave interrupt interface to read and write with I2C master. - * To use this sample, the I2C interface must be connected to the I2C master. - */ -#include "i2c.h" -#include "main.h" -#include "debug.h" -#include "sample_i2c_slave_interrupt.h" - -#define I2C_SAMPLE_SLAVE_OPT_LEN 8 -#define I2C_TEST_START_FLAG 0x3A - -#define I2C_SAMPLE_SLAVE_TEST_NUM 500 - -static volatile int g_txDoneFlag = BASE_CFG_UNSET; -static volatile int g_rxDoneFlag = BASE_CFG_UNSET; -static volatile int g_errorFlag = BASE_CFG_UNSET; - -/** - * @brief I2c interrupt sample tx callback handle. - * @param handle I2c handle. - * @retval None. - */ -void I2C0TxCallback(void *handle) -{ - DBG_PRINTF("SampleI2CTxDone\r\n"); - BASE_FUNC_UNUSED(handle); - g_txDoneFlag = BASE_CFG_SET; -} - -/** - * @brief I2c interrupt sample rx callback handle. - * @param handle I2c handle. - * @retval None. - */ -void I2C0RxCallback(void *handle) -{ - DBG_PRINTF("SampleI2CRxDone\r\n"); - BASE_FUNC_UNUSED(handle); - g_rxDoneFlag = BASE_CFG_SET; -} - -/** - * @brief I2c interrupt sample Error callback handle. - * @param handle I2c handle. - * @retval None. - */ -void I2C0ErrorCallback(void *handle) -{ - DBG_PRINTF("SampleI2CError\r\n"); - BASE_FUNC_UNUSED(handle); - g_errorFlag = BASE_CFG_SET; -} - -/** - * @brief Read data from master in interrupt. - * @param buffer Address of buff to be receive data. - * @param len Number of the data to be read. - * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. - */ -static BASE_StatusType SampleSlaveInterruptReadData(unsigned char *buffer, unsigned int len) -{ - BASE_StatusType ret = BASE_STATUS_OK; /* Transfer success and failure status. */ - unsigned int currentLen = len; - unsigned char *tempBuffer = buffer; - - if (currentLen == 0) { /* Number of illegal transmissions. */ - return ret; - } - /* Read data from the master. */ - ret = HAL_I2C_SlaveReadIT(&g_i2c0, tempBuffer, currentLen); - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("LINE:%d,Read Data Fail,ret:%d\r\n", __LINE__, ret); - return ret; - } - /* Waiting for read completion or failure */ - while (!(g_rxDoneFlag || g_errorFlag)) { - ; - } - g_rxDoneFlag = BASE_CFG_UNSET; - if (g_errorFlag == BASE_CFG_SET) { - g_errorFlag = BASE_CFG_UNSET; - DBG_PRINTF("LINE:%d,Read Data Fail\r\n", __LINE__); - return BASE_STATUS_ERROR; - } - - return ret; -} - -/** - * @brief Send data to the master in interrupt. - * @param buffer Address of buff to be send. - * @param len Number of the data to be send. - * @retval BASE status type: OK, ERROR, BUSY, TIMEOUT. - */ -static BASE_StatusType SampleSlaveInterruptWriteData(unsigned char *buffer, unsigned int len) -{ - BASE_StatusType ret = BASE_STATUS_OK; /* Transfer success and failure status. */ - unsigned int currentLen = len; - unsigned char *tempBuffer = buffer; - - if (currentLen == 0) { - return ret; - } - /* Send data to the master. */ - ret = HAL_I2C_SlaveWriteIT(&g_i2c0, tempBuffer, currentLen); - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("LINE:%d,Write Data Fail!,ret:%d\r\n", __LINE__, ret); - return ret; - } - /* Waiting for write completion or failure */ - while (!(g_txDoneFlag || g_errorFlag)) { - ; - } - g_txDoneFlag = BASE_CFG_UNSET; - if (g_errorFlag == BASE_CFG_SET) { - g_errorFlag = BASE_CFG_UNSET; - DBG_PRINTF("LINE:%d,Write Data Fail\r\n", __LINE__); - return BASE_STATUS_ERROR; - } - - return ret; -} - -/** - * @brief Send and receive data in interrupt mode as slave. - * @retval None. - */ -void I2cSlaveInterruptProcessing(void) -{ - BASE_StatusType ret; - unsigned int i; - unsigned int dataFlag; - unsigned char tempWriteBuff[I2C_SAMPLE_SLAVE_OPT_LEN] = {0}; - unsigned int successCnt = 0; - unsigned char testStart = 0; - - SystemInit(); - DBG_PRINTF("I2C Slave Interrupt Sample Start\r\n"); - for (i = 0; i < I2C_SAMPLE_SLAVE_OPT_LEN; i++) { - tempWriteBuff[i] = 0x4A; /* The written data. */ - } - /* Waiting for the start signal from the master */ - DBG_PRINTF("Waiting Master Start......\r\n"); - while (true) { - SampleSlaveInterruptReadData(&testStart, 1); - if (testStart == I2C_TEST_START_FLAG) { - DBG_PRINTF("Master wait done\r\n"); - break; - } - } - /* Start to send and receive test data. */ - for (int j = 0; j < I2C_SAMPLE_SLAVE_TEST_NUM; j++) { - unsigned char tempReadBuff[I2C_SAMPLE_SLAVE_OPT_LEN] = {0}; - - /* Write data to master */ - ret = SampleSlaveInterruptWriteData(tempWriteBuff, I2C_SAMPLE_SLAVE_OPT_LEN); - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("LINE:%d,Write Data Fail,ret:%d\r\n", __LINE__, ret); - } - - /* Read data from master */ - ret = SampleSlaveInterruptReadData(tempReadBuff, I2C_SAMPLE_SLAVE_OPT_LEN); - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("LINE:%d,Read Data Fail,ret:%d\r\n", __LINE__, ret); - } - - BASE_FUNC_DELAY_MS(5); /* Delay 5 ms. */ - /* Compare read and write data */ - dataFlag = 0; - for (i = 0; i < I2C_SAMPLE_SLAVE_OPT_LEN; i++) { - if (tempReadBuff[i] != tempWriteBuff[i]) { - DBG_PRINTF("I2C Data error! offset[%d]\r\nReadData:0x%x\r\nWriteData:0x%x\r\n", i, - tempReadBuff[i], tempWriteBuff[i]); - dataFlag = 1; - break; - } - } - - /* The read data is exactly the same as the written data. */ - if (dataFlag == 0) { - successCnt++; - DBG_PRINTF("I2C Data Success\r\n"); - } - } - DBG_PRINTF("I2C sample End!\r\nsuccessCnt:%d\r\n", successCnt); -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/iocmg/iolist_sample/inc/iolist_sample.h b/vendor/yibaina_3061M/demo/drivers_sample/iocmg/iolist_sample/inc/iolist_sample.h deleted file mode 100644 index bb338cd22..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/iocmg/iolist_sample/inc/iolist_sample.h +++ /dev/null @@ -1,30 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file iolist_sample.h - * @author MCU Driver Team - * @brief IOCMG module sample - * @details The header file contains the following declaration: - * This file provides sample code for users to init iolist. - */ - -#ifndef IOLIST_SAMPLE_H -#define IOLIST_SAMPLE_H - -void IOCMG_IOListInitSample(void); - -#endif /* IOLIST_SAMPLE_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/iocmg/iolist_sample/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/iocmg/iolist_sample/init/main.c deleted file mode 100644 index 56b83161b..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/iocmg/iolist_sample/init/main.c +++ /dev/null @@ -1,34 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ -#include "feature.h" -#include "main.h" -#include "iolist_sample.h" - -UART_Handle g_uart0; - -int main(void) -{ - IOCMG_IOListInitSample(); - while (1) { - } - return BASE_STATUS_OK; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/iocmg/iolist_sample/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/iocmg/iolist_sample/init/main.h deleted file mode 100644 index 0dbdd0fd3..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/iocmg/iolist_sample/init/main.h +++ /dev/null @@ -1,47 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "iocmg.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -#define UART0_TXD_PIN IOCMG_PIN_MUX(iocmg_6, FUNC_MODE_4, 0x0000) -#define UART0_RXD_PIN IOCMG_PIN_MUX(iocmg_7, FUNC_MODE_4, 0x0000) - -extern UART_Handle g_uart0; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/iocmg/iolist_sample/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/iocmg/iolist_sample/init/system_init.c deleted file mode 100644 index bc9691eec..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/iocmg/iolist_sample/init/system_init.c +++ /dev/null @@ -1,86 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); - - g_uart0.baseAddress = UART0; - g_uart0.irqNum = IRQ_UART0; - - g_uart0.baudRate = UART0_BAND_RATE; - g_uart0.dataLength = UART_DATALENGTH_8BIT; - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; - g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart0); -} - -static void IOCMG_Init(void) -{ - IOCMG_Handle handle = {0}; - handle.pinTypedef = UART0_RXD_PIN; /* UART0_RX pin */ - handle.pullMode = PULL_NONE; - handle.schmidtMode = SCHMIDT_ENABLE; - handle.levelShiftRate = LEVEL_SHIFT_RATE_FAST; - handle.driveRate = DRIVER_RATE_2; - HAL_IOCMG_Init(&handle); /* iocmg handle uart0_rxd init */ - - handle.pinTypedef = UART0_TXD_PIN; /* UART0_TX pin */ - handle.pullMode = PULL_NONE; - handle.schmidtMode = SCHMIDT_ENABLE; - handle.levelShiftRate = LEVEL_SHIFT_RATE_FAST; - handle.driveRate = DRIVER_RATE_2; - HAL_IOCMG_Init(&handle); /* iocmg handle uart0_txd init */ -} - -void SystemInit(void) -{ - IOCMG_Init(); - UART0_Init(); - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/iocmg/iolist_sample/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/iocmg/iolist_sample/readme.md deleted file mode 100644 index 1793dd8bb..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/iocmg/iolist_sample/readme.md +++ /dev/null @@ -1,14 +0,0 @@ -# 使用HAL_IOCMG_Init API完成IO端口的相关功能配置 -## 关键字: IOCMG,iomap映射 - -**【功能描述】** -+ 通过HAL_IOCMG_Init API初始化iolist配置表格。 - -**【示例配置】** -+ g_ioListTable数组的初始化:该数组中的每个元素值表示一个IO端口的结构体IOCMG_Handle,而每个结构体表示某一个IO端口的所有配置信息(包括端口映射地址值pinTypedef,上下拉pullMode,施密特状态schmidtMode、管脚驱动能力levelShiftRate、电平转换速率driveRate) - -**【示例效果】** -+ Debug串口打印配置前的iolist数据,然后打印初始化后的寄存器中的数据,判断配置的数据和预期的是否相同,同时调用HAL_IOCMG_SetXXX API接口和HAL_IOCMG_GetXXX API分别配置和获取IOCMG寄存器的数据是否符合预期。 - -**【注意事项】** -+ PIN NUMBER和function mode均已编码定义,在iomap中,若配置数据与定义的数据不符则配置失败返回对应的错误,已定义的pin number和function mode可在iomap.h中直接调用。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/iocmg/iolist_sample/src/iolist_sample.c b/vendor/yibaina_3061M/demo/drivers_sample/iocmg/iolist_sample/src/iolist_sample.c deleted file mode 100644 index 79aaac038..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/iocmg/iolist_sample/src/iolist_sample.c +++ /dev/null @@ -1,103 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file iolist_sample.c - * @author MCU Driver Team - * @brief Calculate and verify the CRC value of the data. - * @details IOCMG Config in IOListTable, init the iolist g_resultTable, printf the config of the g_resultTable \ - * and Get config after init ,verify the value has been configed success or not, and \ - * set config by HAL_IOCMG_SetConfig API, and get congfig by HAL_IOCMG_GetConfig API, \ - * Compare the config value is match or not. - */ - -/* Includes ------------------------------------------------------------------*/ -#include "debug.h" -#include "iocmg.h" -#include "iolist_sample.h" - -/* for sample normalize in different chip, \ - when user use it, needn't define this macro, just need find the io pin in the iomap.h */ -#define UART0_TXD_PIN IOCMG_PIN_MUX(iocmg_6, FUNC_MODE_4, 0x0000) -#define UART0_RXD_PIN IOCMG_PIN_MUX(iocmg_7, FUNC_MODE_4, 0x0000) -#define I2C0_SCL_PIN IOCMG_PIN_MUX(iocmg_14, FUNC_MODE_5, 0x0211) -#define I2C0_SDA_PIN IOCMG_PIN_MUX(iocmg_15, FUNC_MODE_5, 0x0001) - -static IOCMG_Handle g_ioListTable[] = { - {UART0_TXD_PIN, PULL_BOTH, SCHMIDT_ENABLE, LEVEL_SHIFT_RATE_SLOW, DRIVER_RATE_2}, - {UART0_RXD_PIN, PULL_BOTH, SCHMIDT_ENABLE, LEVEL_SHIFT_RATE_SLOW, DRIVER_RATE_2}, - {I2C0_SCL_PIN, PULL_UP, SCHMIDT_ENABLE, LEVEL_SHIFT_RATE_FAST, DRIVER_RATE_1}, - {I2C0_SDA_PIN, PULL_UP, SCHMIDT_ENABLE, LEVEL_SHIFT_RATE_FAST, DRIVER_RATE_1}, -}; - -const unsigned int IOLIST_SIZE = sizeof(g_ioListTable) / sizeof(g_ioListTable[0]); - -/** - * @brief Init IOLIST by HAL_IOCMG_Init API. - * @param None - * @retval None. - */ -void IOCMG_IOListInitSample(void) -{ - /* init method 1 */ - for (unsigned int index = 0; index < IOLIST_SIZE; ++index) { - HAL_IOCMG_Init(&g_ioListTable[index]); /* Use the HAL_IOCMG_Init function to init uart. */ - } - DBG_UartPrintInit(115200); /* 115200 : baud rate */ - BASE_FUNC_DELAY_MS(10); /* 10 : delay 10ms */ - while (1) { - DBG_PRINTF("**************************************************************\r\n"); - /* test API */ - for (unsigned int index = 0; index < IOLIST_SIZE; ++index) { - DBG_PRINTF("\r\nindex = %d Func Num = %d \r\n", index, \ - HAL_IOCMG_GetPinAltFuncMode(g_ioListTable[index].pinTypedef)); - DBG_PRINTF("Pull Mode = %d \r\n", HAL_IOCMG_GetPinPullMode(g_ioListTable[index].pinTypedef)); - DBG_PRINTF("Level Shift Rate = %d \r\n", HAL_IOCMG_GetPinLevelShiftRate(g_ioListTable[index].pinTypedef)); - DBG_PRINTF("Schmidt Mode = %d \r\n", HAL_IOCMG_GetPinSchmidtMode(g_ioListTable[index].pinTypedef)); - DBG_PRINTF("Drive Rate = %d \r\n", HAL_IOCMG_GetPinDriveRate(g_ioListTable[index].pinTypedef)); - BASE_FUNC_DELAY_MS(10); /* 10: Prevents the printing rate of the serial port from being too high. */ - } - - /* init method 2 */ - for (unsigned int index = 2; index < IOLIST_SIZE; ++index) { - HAL_IOCMG_SetPinAltFuncMode(g_ioListTable[index].pinTypedef); - HAL_IOCMG_SetPinPullMode(g_ioListTable[index].pinTypedef, PULL_BOTH); - HAL_IOCMG_SetPinLevelShiftRate(g_ioListTable[index].pinTypedef, LEVEL_SHIFT_RATE_SLOW); - HAL_IOCMG_SetPinSchmidtMode(g_ioListTable[index].pinTypedef, SCHMIDT_ENABLE); - HAL_IOCMG_SetPinDriveRate(g_ioListTable[index].pinTypedef, DRIVER_RATE_2); - } - /* test API */ - for (unsigned int index = 2; index < IOLIST_SIZE; ++index) { - DBG_PRINTF("\r\nindex = %d Func Num = %d \r\n", index, \ - HAL_IOCMG_GetPinAltFuncMode(g_ioListTable[index].pinTypedef)); - DBG_PRINTF("Pull Mode = %d \r\n", HAL_IOCMG_GetPinPullMode(g_ioListTable[index].pinTypedef)); - DBG_PRINTF("Level Shift Rate = %d \r\n", HAL_IOCMG_GetPinLevelShiftRate(g_ioListTable[index].pinTypedef)); - DBG_PRINTF("Schmidt Mode = %d \r\n", HAL_IOCMG_GetPinSchmidtMode(g_ioListTable[index].pinTypedef)); - DBG_PRINTF("Drive Rate = %d \r\n", HAL_IOCMG_GetPinDriveRate(g_ioListTable[index].pinTypedef)); - BASE_FUNC_DELAY_MS(10); /* 10 : Prevents the printing rate of the serial port from being too high. */ - } - - /* test osc pin function */ - HAL_IOCMG_SetOscClkFuncMode(BASE_CFG_ENABLE); - HAL_IOCMG_SetOscClkOutputMode(BASE_CFG_ENABLE); - HAL_IOCMG_SetOscClkDriveRate(DRIVER_RATE_2); - /* test API */ - DBG_PRINTF("\r\nOsc func mode = %d \r\n", HAL_IOCMG_GetOscClkFuncMode()); - DBG_PRINTF("Osc clk output mode = %d \r\n", HAL_IOCMG_GetOscClkOutputMode()); - DBG_PRINTF("Osc drive rate = %d \r\n", HAL_IOCMG_GetOscClkDriveRate()); - BASE_FUNC_DELAY_MS(1000U); /* delay 1s */ - } -} diff --git a/vendor/yibaina_3061M/demo/drivers_sample/iocmg/sample_iocfg_list/inc/sample_iocfg_list.h b/vendor/yibaina_3061M/demo/drivers_sample/iocmg/sample_iocfg_list/inc/sample_iocfg_list.h deleted file mode 100644 index de3c67fcc..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/iocmg/sample_iocfg_list/inc/sample_iocfg_list.h +++ /dev/null @@ -1,30 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_iocfg_list.h - * @author MCU Driver Team - * @brief IOCMG module sample - * @details The header file contains the following declaration: - * This file provides sample code for users to init iolist. - */ - -#ifndef SAMPLE_IOCFG_LIST_H -#define SAMPLE_IOCFG_LIST_H - -void IOCMG_IOListInitSample(void); - -#endif /* SAMPLE_IOCFG_LIST_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/iocmg/sample_iocfg_list/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/iocmg/sample_iocfg_list/init/main.c deleted file mode 100644 index f6b262251..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/iocmg/sample_iocfg_list/init/main.c +++ /dev/null @@ -1,50 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ - -#include "typedefs.h" -#include "feature.h" -#include "sample_iocfg_list.h" -#include "main.h" -/* USER CODE BEGIN 0 */ -/* USER CODE END 0 */ -UART_Handle g_uart0; -/* USER CODE BEGIN 1 */ -/* USER CODE END 1 */ - -int main(void) -{ - /* USER CODE BEGIN 2 */ - /* USER CODE END 2 */ - /* USER CODE BEGIN 3 */ - /* USER CODE END 3 */ - IOCMG_IOListInitSample(); - while (1) { - /* USER CODE BEGIN 4 */ - /* USER CODE END 4 */ - } - /* USER CODE BEGIN 5 */ - /* USER CODE END 5 */ - return BASE_STATUS_OK; -} - -/* USER CODE BEGIN 6 */ -/* USER CODE END 6 */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/iocmg/sample_iocfg_list/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/iocmg/sample_iocfg_list/init/main.h deleted file mode 100644 index 834192874..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/iocmg/sample_iocfg_list/init/main.h +++ /dev/null @@ -1,49 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "uart_ex.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -#define XTAL_DRV_LEVEL4 0x03U -#define XTAL_DRV_LEVEL3 0x02U -#define XTAL_DRV_LEVEL2 0x01U -#define XTAL_DRV_LEVEL1 0x00U - -extern UART_Handle g_uart0; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/iocmg/sample_iocfg_list/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/iocmg/sample_iocfg_list/init/system_init.c deleted file mode 100644 index 1a1c721e6..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/iocmg/sample_iocfg_list/init/system_init.c +++ /dev/null @@ -1,92 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" -#include "iocmg_ip.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; - crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; - crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_1; - - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); - - g_uart0.baseAddress = UART0; - - g_uart0.baudRate = UART0_BAND_RATE; - g_uart0.dataLength = UART_DATALENGTH_8BIT; - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; - g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; - g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; - g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart0); -} - -static void IOConfig(void) -{ - HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/iocmg/sample_iocfg_list/readme.rd b/vendor/yibaina_3061M/demo/drivers_sample/iocmg/sample_iocfg_list/readme.rd deleted file mode 100644 index 1793dd8bb..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/iocmg/sample_iocfg_list/readme.rd +++ /dev/null @@ -1,14 +0,0 @@ -# 使用HAL_IOCMG_Init API完成IO端口的相关功能配置 -## 关键字: IOCMG,iomap映射 - -**【功能描述】** -+ 通过HAL_IOCMG_Init API初始化iolist配置表格。 - -**【示例配置】** -+ g_ioListTable数组的初始化:该数组中的每个元素值表示一个IO端口的结构体IOCMG_Handle,而每个结构体表示某一个IO端口的所有配置信息(包括端口映射地址值pinTypedef,上下拉pullMode,施密特状态schmidtMode、管脚驱动能力levelShiftRate、电平转换速率driveRate) - -**【示例效果】** -+ Debug串口打印配置前的iolist数据,然后打印初始化后的寄存器中的数据,判断配置的数据和预期的是否相同,同时调用HAL_IOCMG_SetXXX API接口和HAL_IOCMG_GetXXX API分别配置和获取IOCMG寄存器的数据是否符合预期。 - -**【注意事项】** -+ PIN NUMBER和function mode均已编码定义,在iomap中,若配置数据与定义的数据不符则配置失败返回对应的错误,已定义的pin number和function mode可在iomap.h中直接调用。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/iocmg/sample_iocfg_list/src/sample_iocfg_list.c b/vendor/yibaina_3061M/demo/drivers_sample/iocmg/sample_iocfg_list/src/sample_iocfg_list.c deleted file mode 100644 index ce9a625f4..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/iocmg/sample_iocfg_list/src/sample_iocfg_list.c +++ /dev/null @@ -1,106 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_iocfg_list.c - * @author MCU Driver Team - * @brief Calculate and verify the CRC value of the data. - * @details IOCMG Config in IOListTable, init the iolist g_resultTable, printf the config of the g_resultTable \ - * and Get config after init ,verify the value has been configed success or not, and \ - * set config by HAL_IOCMG_SetConfig API, and get congfig by HAL_IOCMG_GetConfig API, \ - * Compare the config value is match or not. - */ - -/* Includes ------------------------------------------------------------------*/ -#include "debug.h" -#include "iocmg.h" -#include "main.h" -#include "sample_iocfg_list.h" - -/* for sample normalize in different chip, \ - when user use it, needn't define this macro, just need find the io pin in the iomap.h */ -#define UART0_TXD_PIN IOCMG_PIN_MUX(IOCFG_GPIO0_3, FUNC_MODE_3, 0x0230) -#define UART0_RXD_PIN IOCMG_PIN_MUX(IOCFG_GPIO0_4, FUNC_MODE_3, 0x0230) -#define I2C0_SCL_PIN IOCMG_PIN_MUX(IOCFG_GPIO4_2, FUNC_MODE_2, 0x0230) -#define I2C0_SDA_PIN IOCMG_PIN_MUX(IOCFG_GPIO2_1, FUNC_MODE_1, 0x0220) - -static IOCMG_Handle g_ioListTable[] = { - {UART0_TXD_PIN, PULL_NONE, SCHMIDT_DISABLE, LEVEL_SHIFT_RATE_SLOW, DRIVER_RATE_2}, - {UART0_RXD_PIN, PULL_NONE, SCHMIDT_DISABLE, LEVEL_SHIFT_RATE_SLOW, DRIVER_RATE_2}, - {I2C0_SCL_PIN, PULL_UP, SCHMIDT_ENABLE, LEVEL_SHIFT_RATE_FAST, DRIVER_RATE_1}, - {I2C0_SDA_PIN, PULL_UP, SCHMIDT_ENABLE, LEVEL_SHIFT_RATE_FAST, DRIVER_RATE_1}, -}; - -const unsigned int IOLIST_SIZE = sizeof(g_ioListTable) / sizeof(g_ioListTable[0]); - -/** - * @brief Init IOLIST by HAL_IOCMG_Init API. - * @param None - * @retval None. - */ -void IOCMG_IOListInitSample(void) -{ - /* init method 1 */ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - - for (unsigned int index = 0; index < IOLIST_SIZE; ++index) { - HAL_IOCMG_Init(&g_ioListTable[index]); /* Use the HAL_IOCMG_Init function to init uart. */ - } - DBG_UartPrintInit(115200); /* 115200 : baud rate */ - BASE_FUNC_DELAY_MS(10); /* 10 : delay 10ms */ - while (1) { - DBG_PRINTF("**************************************************************\r\n"); - /* test API */ - for (unsigned int index = 0; index < IOLIST_SIZE; ++index) { - DBG_PRINTF("\r\nindex = %d Func Num = %d \r\n", index, \ - HAL_IOCMG_GetPinAltFuncMode(g_ioListTable[index].pinTypedef)); - DBG_PRINTF("Pull Mode = %d \r\n", HAL_IOCMG_GetPinPullMode(g_ioListTable[index].pinTypedef)); - DBG_PRINTF("Level Shift Rate = %d \r\n", HAL_IOCMG_GetPinLevelShiftRate(g_ioListTable[index].pinTypedef)); - DBG_PRINTF("Schmidt Mode = %d \r\n", HAL_IOCMG_GetPinSchmidtMode(g_ioListTable[index].pinTypedef)); - DBG_PRINTF("Drive Rate = %d \r\n", HAL_IOCMG_GetPinDriveRate(g_ioListTable[index].pinTypedef)); - BASE_FUNC_DELAY_MS(10); /* 10: Prevents the printing rate of the serial port from being too high. */ - } - - /* init method 2 */ - for (unsigned int index = 2; index < IOLIST_SIZE; ++index) { - HAL_IOCMG_SetPinAltFuncMode(g_ioListTable[index].pinTypedef); - HAL_IOCMG_SetPinPullMode(g_ioListTable[index].pinTypedef, PULL_BOTH); - HAL_IOCMG_SetPinLevelShiftRate(g_ioListTable[index].pinTypedef, LEVEL_SHIFT_RATE_SLOW); - HAL_IOCMG_SetPinSchmidtMode(g_ioListTable[index].pinTypedef, SCHMIDT_ENABLE); - HAL_IOCMG_SetPinDriveRate(g_ioListTable[index].pinTypedef, DRIVER_RATE_2); - } - /* test API */ - for (unsigned int index = 2; index < IOLIST_SIZE; ++index) { - DBG_PRINTF("\r\nindex = %d Func Num = %d \r\n", index, \ - HAL_IOCMG_GetPinAltFuncMode(g_ioListTable[index].pinTypedef)); - DBG_PRINTF("Pull Mode = %d \r\n", HAL_IOCMG_GetPinPullMode(g_ioListTable[index].pinTypedef)); - DBG_PRINTF("Level Shift Rate = %d \r\n", HAL_IOCMG_GetPinLevelShiftRate(g_ioListTable[index].pinTypedef)); - DBG_PRINTF("Schmidt Mode = %d \r\n", HAL_IOCMG_GetPinSchmidtMode(g_ioListTable[index].pinTypedef)); - DBG_PRINTF("Drive Rate = %d \r\n", HAL_IOCMG_GetPinDriveRate(g_ioListTable[index].pinTypedef)); - BASE_FUNC_DELAY_MS(10); /* 10 : Prevents the printing rate of the serial port from being too high. */ - } - - /* test osc pin function */ - HAL_IOCMG_SetOscClkFuncMode(BASE_CFG_ENABLE); - HAL_IOCMG_SetOscClkOutputMode(BASE_CFG_ENABLE); - HAL_IOCMG_SetOscClkDriveRate(DRIVER_RATE_2); - /* test API */ - DBG_PRINTF("\r\nOsc func mode = %d \r\n", HAL_IOCMG_GetOscClkFuncMode()); - DBG_PRINTF("Osc clk output mode = %d \r\n", HAL_IOCMG_GetOscClkOutputMode()); - DBG_PRINTF("Osc drive rate = %d \r\n", HAL_IOCMG_GetOscClkDriveRate()); - BASE_FUNC_DELAY_MS(1000U); /* delay 1s */ - } -} diff --git a/vendor/yibaina_3061M/demo/drivers_sample/open_mcu b/vendor/yibaina_3061M/demo/drivers_sample/open_mcu deleted file mode 160000 index 1bc802495..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/open_mcu +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 1bc8024950597ae9fc794ba3982564d12314e0d5 diff --git a/vendor/yibaina_3061M/demo/drivers_sample/open_mcu_1 b/vendor/yibaina_3061M/demo/drivers_sample/open_mcu_1 deleted file mode 160000 index 1bc802495..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/open_mcu_1 +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 1bc8024950597ae9fc794ba3982564d12314e0d5 diff --git a/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga/init/main.c deleted file mode 100644 index cd2fe885d..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga/init/main.c +++ /dev/null @@ -1,33 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ -#include "feature.h" -#include "main.h" - -PGA_Handle g_pga; - -int main(void) -{ - SystemInit(); - while (1) { - } - return BASE_STATUS_OK; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga/init/main.h deleted file mode 100644 index 7dd948b29..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga/init/main.h +++ /dev/null @@ -1,43 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "pga.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -extern PGA_Handle g_pga; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga/init/system_init.c deleted file mode 100644 index 6afdfc728..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga/init/system_init.c +++ /dev/null @@ -1,88 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void PGA0_Init(void) -{ - HAL_CRG_IpEnableSet(PGA0_BASE, IP_CLK_ENABLE); - - g_pga.baseAddress = PGA0_BASE; - g_pga.enable = BASE_CFG_ENABLE; - g_pga.extLoopbackEn = BASE_CFG_DISABLE; - g_pga.pgaMux = PGA_INTER_RES_VI0; /* use Internal resistance */ - g_pga.gain = PGA_GAIN_2X; /* Gain value: 2 */ - - HAL_PGA_Init(&g_pga); -} - -static void IOConfig(void) -{ - IOConfig_RegStruct *iconfig = IOCONFIG; - - iconfig->iocmg_40.BIT.func = 0x8; /* 0x8 is PGA0_ANA_EXT */ - iconfig->iocmg_40.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_40.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_40.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_40.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_40.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_39.BIT.func = 0x9; /* 0x9 is PGA0_ANA_N */ - iconfig->iocmg_39.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_39.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_39.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_39.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_39.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_38.BIT.func = 0x9; /* 0x9 is PGA0_ANA_P */ - iconfig->iocmg_38.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_38.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_38.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_38.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_38.BIT.se = BASE_CFG_DISABLE; -} - -void SystemInit(void) -{ - IOConfig(); - PGA0_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga/readme.md deleted file mode 100644 index dc1f94ada..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga/readme.md +++ /dev/null @@ -1,14 +0,0 @@ -# 可编译增益放大器-内部电阻模式的增益放大 -## 关键字: PGA, 内部电阻模式 - -**【功能描述】** -+ 内部电阻模式下,对输入信号进行放大。 - -**【示例配置】** -+ 本示例中采用内部电阻模式, 增益放大值为X2倍,增益值可在PGA模块的配置界面中进行更改,其对应的设置选项为“g_pga.gain”。 - -**【示例效果】** -+ 在IOCMG_38输入正端信号,在IOCMG_39输入负端信号,在IOCMG_40输出放大后的信号。 - -**【注意事项】** -+ 增益可编程为x2, x4, x8, x16。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_extra_resistor/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_extra_resistor/init/main.c deleted file mode 100644 index 3e64c9229..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_extra_resistor/init/main.c +++ /dev/null @@ -1,34 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ -#include "typedefs.h" -#include "feature.h" -#include "main.h" - -PGA_Handle g_pgaExt; - -int main(void) -{ - SystemInit(); - while (1) { - } - return BASE_STATUS_OK; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_extra_resistor/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_extra_resistor/init/main.h deleted file mode 100644 index 103838e0d..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_extra_resistor/init/main.h +++ /dev/null @@ -1,43 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "pga.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -extern PGA_Handle g_pgaExt; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_extra_resistor/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_extra_resistor/init/system_init.c deleted file mode 100644 index ab82f453a..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_extra_resistor/init/system_init.c +++ /dev/null @@ -1,88 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void PGA1_Init(void) -{ - HAL_CRG_IpEnableSet(PGA1_BASE, IP_CLK_ENABLE); - - g_pgaExt.baseAddress = PGA1_BASE; /* pga1 */ - g_pgaExt.enable = BASE_CFG_ENABLE; - g_pgaExt.extLoopbackEn = BASE_CFG_DISABLE; - g_pgaExt.pgaMux = PGA_EXT_RES_VI0; /* use external resistor */ - g_pgaExt.gain = PGA_GAIN_1X; - - HAL_PGA_Init(&g_pgaExt); -} - -static void IOConfig(void) -{ - IOConfig_RegStruct *iconfig = IOCONFIG; - - iconfig->iocmg_22.BIT.func = 0x9; /* 0x9 is PGA1_ANA_P */ - iconfig->iocmg_22.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_22.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_22.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_22.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_22.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_23.BIT.func = 0x9; /* 0x9 is PGA1_ANA_N */ - iconfig->iocmg_23.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_23.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_23.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_23.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_23.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_24.BIT.func = 0x8; /* 0x8 is PGA1_ANA_EXT */ - iconfig->iocmg_24.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_24.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_24.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_24.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_24.BIT.se = BASE_CFG_DISABLE; -} - -void SystemInit(void) -{ - IOConfig(); - PGA1_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_extra_resistor/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_extra_resistor/readme.md deleted file mode 100644 index faffe87d6..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_extra_resistor/readme.md +++ /dev/null @@ -1,14 +0,0 @@ -# 可编译增益放大器-外部电阻模式的增益放大 -## 关键字: PGA, 外部电阻模式 - -**【功能描述】** -+ 外部电阻模式下,对输入信号进行放大。 - -**【示例配置】** -+ 本示例中采用外部电阻模式, 放大倍数需通过外部电阻配置。 - -**【示例效果】** -+ 在IOCMG_22输入正端信号,在IOCMG_23输入负端信号,在IOCMG_24输出放大后的信号。 - -**【注意事项】** -+ 外部电阻模式,依赖外部电阻,灵活可调增益。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_result_sampling/inc/sample_pga_result_sampling.h b/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_result_sampling/inc/sample_pga_result_sampling.h deleted file mode 100644 index ea4867a41..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_result_sampling/inc/sample_pga_result_sampling.h +++ /dev/null @@ -1,31 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_pga_result_sampling.h - * @author MCU Driver Team - * @brief pga sample module. - * @details This file provides users with sample code to help use pga function. - */ -#ifndef SAMPLE_PGA_RESULT_SAMPLING_H -#define SAMPLE_PGA_RESULT_SAMPLING_H - -#include "debug.h" -#include "adc.h" -#include "main.h" - -void PGA_ReultSampling(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_result_sampling/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_result_sampling/init/main.c deleted file mode 100644 index baca48b07..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_result_sampling/init/main.c +++ /dev/null @@ -1,52 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ - -#include "typedefs.h" -#include "feature.h" -#include "sample_pga_result_sampling.h" -#include "main.h" -/* USER CODE BEGIN 0 */ -/* USER CODE END 0 */ -PGA_Handle g_pga0; -UART_Handle g_uart0; -ADC_Handle g_adc; -/* USER CODE BEGIN 1 */ -/* USER CODE END 1 */ - -int main(void) -{ - /* USER CODE BEGIN 2 */ - /* USER CODE END 2 */ - PGA_ReultSampling(); - /* USER CODE BEGIN 3 */ - /* USER CODE END 3 */ - while (1) { - /* USER CODE BEGIN 4 */ - /* USER CODE END 4 */ - } - /* USER CODE BEGIN 5 */ - /* USER CODE END 5 */ - return BASE_STATUS_OK; -} - -/* USER CODE BEGIN 6 */ -/* USER CODE END 6 */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_result_sampling/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_result_sampling/init/main.h deleted file mode 100644 index c97081771..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_result_sampling/init/main.h +++ /dev/null @@ -1,54 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "uart_ex.h" -#include "dac.h" -#include "pga.h" -#include "crg.h" -#include "iocmg.h" -#include "adc.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -#define XTAL_DRV_LEVEL4 0x03U -#define XTAL_DRV_LEVEL3 0x02U -#define XTAL_DRV_LEVEL2 0x01U -#define XTAL_DRV_LEVEL1 0x00U - -extern UART_Handle g_uart0; -extern ADC_Handle g_adc; -extern PGA_Handle g_pga0; -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_result_sampling/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_result_sampling/init/system_init.c deleted file mode 100644 index 7060c137b..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_result_sampling/init/system_init.c +++ /dev/null @@ -1,143 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" -#include "iocmg_ip.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - BASE_FUNC_ASSERT_PARAM(coreClkSelect != NULL); - - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllFbDiv = 0x30; /* PLL loop divider ratio = 0x30 */ - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllPostDiv = CRG_PLL_POSTDIV_2; - crg.coreClkSelect = 0; /* Inner clock HOSC select. */ - crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; - crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; /* Set the 1MHz clock select. */ - crg.handleEx.clk1MDiv = 0x29; /* Default frequency divider of the 1 MHz clock = 0x29 */ - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; /* CRG init error. */ - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void PGA0_Init(void) -{ - HAL_CRG_IpEnableSet(PGA0_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(PGA0_BASE, 0); - - g_pga0.baseAddress = PGA0_BASE; - g_pga0.gain = PGA_GAIN_2X; /* PGA gain value. */ - g_pga0.externalResistorMode = BASE_CFG_DISABLE; /* Inner resistor mode. */ - HAL_PGA_Init(&g_pga0); -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - - g_uart0.baseAddress = UART0; - g_uart0.baudRate = UART0_BAND_RATE; - g_uart0.dataLength = UART_DATALENGTH_8BIT; /* Word length 8 bit. */ - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; /* UART blocking mode. */ - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; - g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; /* UART FIFO depth. */ - g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; /* Oversamping 16x. */ - g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart0); -} - -static void IOConfig(void) -{ - HAL_IOCMG_SetPinAltFuncMode(GPIO2_7_AS_PGA0_OUT); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_7_AS_PGA0_OUT, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_7_AS_PGA0_OUT, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_7_AS_PGA0_OUT, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_7_AS_PGA0_OUT, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO2_6_AS_PGA0_N0); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_6_AS_PGA0_N0, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_6_AS_PGA0_N0, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_6_AS_PGA0_N0, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_6_AS_PGA0_N0, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO2_5_AS_PGA0_P0); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_5_AS_PGA0_P0, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_5_AS_PGA0_P0, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_5_AS_PGA0_P0, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_5_AS_PGA0_P0, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO0_3_AS_UART0_TXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO0_3_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO0_3_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO0_3_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO0_3_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO0_4_AS_UART0_RXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO0_4_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO0_4_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO0_4_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO0_4_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ -} - - -static void ADC0_Init(void) -{ - HAL_CRG_IpEnableSet(ADC0_BASE, IP_CLK_ENABLE); /* ADC clock configure. */ - HAL_CRG_IpClkSelectSet(ADC0_BASE, CRG_ADC_CLK_ASYN_PLL_DIV); - HAL_CRG_IpClkDivSet(ADC0_BASE, CRG_ADC_DIV_2); - - g_adc.baseAddress = ADC0; - g_adc.socPriority = ADC_PRIMODE_ALL_ROUND; - - HAL_ADC_Init(&g_adc); /* ADC init configure. */ - - SOC_Param socParam = {0}; - socParam.adcInput = ADC_CH_ADCINA0; /* PIN47(ADC AIN2) */ - socParam.sampleTotalTime = ADC_SOCSAMPLE_5CLK; /* adc sample total time 5 adc_clk */ - socParam.trigSource = ADC_TRIGSOC_SOFT; - socParam.continueMode = BASE_CFG_DISABLE; - socParam.finishMode = ADC_SOCFINISH_NONE; - HAL_ADC_ConfigureSoc(&g_adc, ADC_SOC_NUM1, &socParam); /* SOC configure. */ -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - ADC0_Init(); - PGA0_Init(); - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_result_sampling/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_result_sampling/readme.md deleted file mode 100644 index 916ae67da..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_result_sampling/readme.md +++ /dev/null @@ -1,16 +0,0 @@ -# 运放的基本使用 - ADC采样PGA的输出电压 -## 关键字: PGA放大电压 - -**【功能描述】** -+ 内部电阻模式下,PGA对输入电压放大,并使用ADC采样PGA的输出电压。 - -**【示例配置】** -+ 本示例中使用了PGA的内部电阻模式,电压输出到PGA端,通过PGA进行2倍的放大,并通过ADC将最后采样结果输出。 - -+ 本示例中采用内部电阻模式, 增益放大值为X2倍,增益值可在PGA模块的配置界面中进行更改,其对应的设置选项为“g_pga.gain”。 - -**【示例效果】** -+ PGA的运放结果会通过ADC的采样进行输出,并通过串口0将结果输出。 - -**【注意事项】** -+ 增益可编程为x2, x4, x8, x16。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_result_sampling/src/sample_pga_result_sampling.c b/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_result_sampling/src/sample_pga_result_sampling.c deleted file mode 100644 index 1ead4584e..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_result_sampling/src/sample_pga_result_sampling.c +++ /dev/null @@ -1,51 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_pga_result_sampling.c - * @author MCU Driver Team - * @brief pga sample module. - * @details (1) In this example, the internal resistor mode of the PGA is used. The voltage is output to PGA through - * the DAC, the PGA is amplified by 2 times, and the last sampled result is output through the ADC. - * (2) the internal resistor mode is used, and the gain magnification value is X2. - * The gain value can be changed on the PGA module configuration interface. - */ - -#include "sample_pga_result_sampling.h" - -/** - * @brief The PGA amplifies the DAC voltage and uses the ADC to sample the output of the PGA. - * @param None. - * @retval None. - */ -void PGA_ReultSampling(void) -{ - SystemInit(); - DBG_PRINTF("The PGA amplifies the output of the DAC and uses the ADC to sample the result.\r\n"); - /* Configure ADC software triggering. */ - HAL_ADC_SoftTrigSample(&g_adc, ADC_SOC_NUM1); - BASE_FUNC_DELAY_MS(10); /* delay 10 ms */ - if (HAL_ADC_CheckSocFinish(&g_adc, ADC_SOC_NUM1) == BASE_STATUS_ERROR) { - DBG_PRINTF("ADC sampling error output.\r\n"); - return; - } - /* Software trigger ADC sampling */ - unsigned int ret = HAL_ADC_GetConvResult(&g_adc, ADC_SOC_NUM1); - DBG_PRINTF("Sampling completed, result: %x\r\n", ret); - float voltage = (float)ret / (float)4096 * 3.3; /* 4096 and 3.3 are for Sample Value Conversion */ - DBG_PRINTF("Output voltage of the PGA: %f\r\n", voltage); - return; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/pic/1726194906962-1726195658552-18.jpg b/vendor/yibaina_3061M/demo/drivers_sample/pic/1726194906962-1726195658552-18.jpg deleted file mode 100644 index bf758c8f9cc35e8a42926f8951b587d87d028817..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4937 zcmeHLeNl{ln+f%1K&RVv1$5?%FjyWXQxp9=CEcWEFW3&WL z2BZAar}?zaPHtp|s(9j>IG&rnThnj#6ht@TYubmu5nPOWT)s4sLY|3%c&$y)!XaZ8Z?zQMBqO_e!6Vg8ijn8 z7KFqmb2)kXYU}p&*Lm@s9nqIB9Fg#u?Md2*WkByldy@#<3`t%NBipHtt=;{k8AR#m z)KgchR`+I)2V>rl7>y!vCuXny3hs_Ftt2UG{V4^3qZWh|mbsFf(soHI?XNPq)13lg zsDu$$ukqw#YIANrsOzp|0I#JRXk%^$A2P}}eS{)*2fgE1q^~mnRD-TX(0D(C z04JTv*l!HHob2RxDHVSLQ9Rn(#w8}(p=0t;q$=H+e3b2KmLflc^`zdEapR{469`WlfMH* zJCG-A>H9 z@RqECU5U9g*ulW(#Ou^y73-T{Yo#|1EQi~NkmJuelbPt)00mF!a^m*yWP9BeeYL!U zw2bqt;}oHMTT5U3Do8wt_TDis8>4vGOQ#Bl4Sm?P^(F(`ZoNisdRY=yuQrvj4SR*A zw7F@wPm$cGg^|#G-U7sU9BVi$haP+1VBM6Lj|E|dK#J`As8n&ACrM%O$B-ygCv7zd zkDj2#d>uZUrq3GqpCHZk>Cq@1Fx~TpQ&R2tI{8a5BQ_x<)}-gDxw7yIKb|1UU>oYk4yz%_5 zF&~cFVh`g}NWkz_s}F;GU|0VF|RVcu1#ZAgUPtJ#co>E(0y%dGqaXp#!ykGL6_K&PO6& zkj59J@h2pW&l^s~XOUtaQwSmzJ}LGfTGgv!b>p<^uEkPl)t|9`Sr!aLe~(1+dP&e* zisa3cnuT#7ds+wK^)p5ck+gv5aG*TjB^ zV!4gve)$lMgQCq*RlC-sNwv1j#Wt=KG3>LcUk;vFZRM};;Ds9x%XIdQf6pLt`j4Q4 z$0L2EInz<3>0vqR&=mS!phQB>xy{cA=$xBfL6y+vuElqv zIe76W4BBE<=sFuE?F<_F=Xm9tNjo3mGtkt+43wW5*Xacu1!Gpd*7{&?Jaf^Fym3CE zZR6CgR1<%kv+|YAgT?>L&>Meoa!Rc*MtVhrqw%pjVvAqL;d_3!cH)kyst#_yzRjv- zcg*Y^FRbf+QW({5t{@9NzB)QrJby|5_v0TM&Ytp#+kZ9tEvhg^n61}s?YDNUTpP%8 Q2XqDO58TJw`-k`b1zcgcy8r+H diff --git a/vendor/yibaina_3061M/demo/drivers_sample/pic/1726194962547-1726195476280-9.jpg b/vendor/yibaina_3061M/demo/drivers_sample/pic/1726194962547-1726195476280-9.jpg deleted file mode 100644 index 9468da025f2bccc563aa4faf201c2aceefe0af51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7234 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.BIT.func = 0x4; /* 0x4 is UART0_TXD */ - iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ - iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - PMC_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_pvd/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_pvd/readme.md deleted file mode 100644 index 51afde02c..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_pvd/readme.md +++ /dev/null @@ -1,17 +0,0 @@ -# 配置PMC模块的PVD功能,实现对VDD电压的监测 -## 关键字: PMC, PVD,中断, 电压监测 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、PMC控制器初始化和功能配置。通过PVD实现对VDD电压的监测,PVD中断发生时Debug串口打印相关提示信息。 - -**【示例配置】** - -+ PMC初始化:调用接口"HAL_PMC_Init()”完成对示例代码中PMC的基地址、唤醒模式、唤醒时间或唤醒触发类型、PVD阈值进行配置,其中PVD阈值可以选择的范围是PMC_PVD_THRED_LEVEL2 - PMC_PVD_THRED_LEVEL7。 - -+ 调用"HAL_PMC_RegisterCallback()"注册PVD中断回调函数,并使能相关中断配置。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码中在监测到VDD电压高于或低于设定的PVD阈值时,会产生PVD中断并通过Debug串口打印"PVD happen!"提示信息。 - -**【注意事项】** -+ 示例代码使用UART0进行结果打印输出,需要对UART0配置。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_pvd/src/sample_pmc_pvd.c b/vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_pvd/src/sample_pmc_pvd.c deleted file mode 100644 index 8fc2e5e0b..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_pvd/src/sample_pmc_pvd.c +++ /dev/null @@ -1,53 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_pmc_pvd.c - * @author MCU Driver Team - * @brief APT module sample of HAL API. - * This file provides some configuration example of PMC module's PVD function. - * + Debug printf information in interrupt callback function if PVD happen. - */ -#include "debug.h" -#include "pmc.h" -#include "crg.h" -#include "sample_pmc_pvd.h" -#include "main.h" - - -/** - * @brief PVD event interrupt callback. - * @retval None. - */ -void PMC_PvdCallback(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("PVD happen!\r\n"); - BASE_FUNC_DELAY_MS(10); /* delay 10 ms, wait for uart printf finish */ - HAL_CRG_PvdResetEnable(BASE_CFG_ENABLE); /* enable pvd reset function */ -} - -/** - * @brief PVD sample. - * @retval None. - */ -void PmcPvdSample(void) -{ - SystemInit(); - DBG_PRINTF("enter main!\r\n"); /* enter main */ - while (1) { - } -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_wakeup/inc/sample_pmc_wakeup.h b/vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_wakeup/inc/sample_pmc_wakeup.h deleted file mode 100644 index df2050f7f..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_wakeup/inc/sample_pmc_wakeup.h +++ /dev/null @@ -1,31 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file pmc_hal_sample.h - * @author MCU Driver Team - * @brief This file shows a sample of PMC. - */ -#ifndef McuMagicTag_PMC_HAL_SAMPLE_H -#define McuMagicTag_PMC_HAL_SAMPLE_H -#include "pmc.h" -#include "uart.h" - -extern PMC_Handle g_pmc; -extern UART_Handle g_uart0;; -void PmcWakeupSample(void); - -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_wakeup/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_wakeup/init/main.c deleted file mode 100644 index f31c38b4b..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_wakeup/init/main.c +++ /dev/null @@ -1,42 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ -/* Header file generated by the IDE BEGIN */ -#include "typedefs.h" -#include "feature.h" -#include "sample_pmc_wakeup.h" -#include "main.h" -/* Header file generated by the IDE END */ - -/* Module handle generated by the IDE BEGIN */ -PMC_Handle g_pmc; -UART_Handle g_uart0; -/* Module handle generated by the IDE END */ - -int main(void) -{ - /* Auto-generated by the IDE BEGIN */ - PmcWakeupSample(); - /* Auto-generated by the IDE END */ - while (1) { - } - return BASE_STATUS_OK; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_wakeup/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_wakeup/init/main.h deleted file mode 100644 index 5ee36c60c..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_wakeup/init/main.h +++ /dev/null @@ -1,46 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "pmc.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -extern PMC_Handle g_pmc; - -extern UART_Handle g_uart0; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_wakeup/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_wakeup/init/system_init.c deleted file mode 100644 index f33aa44ef..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_wakeup/init/system_init.c +++ /dev/null @@ -1,107 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void PMC_Init(void) -{ - HAL_CRG_IpEnableSet(PMC_BASE, IP_CLK_ENABLE); - - g_pmc.baseAddress = PMC_BASE; - g_pmc.irqNumPvd = IRQ_PVD; - - g_pmc.wakeupSrc = PMC_WAKEUP_CNT; /* wakeup from timer */ - g_pmc.wakeupActMode = PMC_WAKEUP_ACT_UP_EDGE; /* wakeup at up edge */ - g_pmc.wakeupTime = 9600; /* 9600: wakeup after about 3s */ - g_pmc.pvdEnable = BASE_CFG_DISABLE; /* disable PVD */ - g_pmc.pvdThreshold = PMC_PVD_THRED_LEVEL2; - HAL_PMC_Init(&g_pmc); -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); - - g_uart0.baseAddress = UART0; - g_uart0.irqNum = IRQ_UART0; - - g_uart0.baudRate = UART0_BAND_RATE; - g_uart0.dataLength = UART_DATALENGTH_8BIT; - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; - g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart0); -} - -static void IOConfig(void) -{ - IOConfig_RegStruct *iconfig = IOCONFIG; - - iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ - iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ - iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - PMC_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_wakeup/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_wakeup/readme.md deleted file mode 100644 index 5a0aad898..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_wakeup/readme.md +++ /dev/null @@ -1,17 +0,0 @@ -# 配置PMC模块的定时唤醒功能,实现对深度睡眠芯片的唤醒 -## 关键字: PMC, 定时唤醒 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、PMC控制器初始化和功能配置。通过定时唤醒方式实现对深度睡眠芯片唤醒,唤醒后Debug串口打印相关提示信息。 - -**【示例配置】** - -+ PMC初始化:调用接口"HAL_PMC_Init()”完成对示例代码中PMC的基地址、唤醒模式(包括定时唤醒、管脚唤醒)、唤醒时间配置。 - -+ 操作PMC模块进行定时唤醒:在完成PMC初始化操作以后,调用"HAL_PMC_EnterDeepSleepMode()"实现芯片进入深入睡眠模式;在经过设定的唤醒时间后,芯片会唤醒程序复位重新运行,调用"HAL_PMC_GetWakeupType()"获取芯片是从何种模式唤醒,当从深度睡眠中定时唤醒时Debug串口会打印"wakeup from deepsleep."提示信息。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码中在芯片进入深度睡眠后一段时间定时唤醒,通过Debug串口打印"wakeup from deepsleep."提示信息。 - -**【注意事项】** -+ 示例代码使用UART0进行结果打印输出,需要对UART0配置。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_wakeup/src/sample_pmc_wakeup.c b/vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_wakeup/src/sample_pmc_wakeup.c deleted file mode 100644 index dc7bcfd92..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_wakeup/src/sample_pmc_wakeup.c +++ /dev/null @@ -1,68 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file acmp_hal_sample.c - * @author MCU Driver Team - * @brief This file shows a sample of PMC. - */ -#include "pmc_ip.h" -#include "sample_pmc_wakeup.h" -#include "debug.h" -#include "crg.h" -#include "main.h" - -#define PMC_UART_BAUDRATE 115200 - -/** - * @brief User callbaclk after wakeup from deepsleep. - * @param handle pmc handle. - * @retval None - */ -static void UserFuncAfterWakeup(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); /* Open uart's clock */ - HAL_UART_Init(&g_uart0); /* initialize uart */ - DBG_PRINTF("wakeup from deepsleep.\r\n"); -} - -/** - * @brief A sample of PMC's HAL layer. - * @param None. - * @retval None - */ -void PmcWakeupSample(void) -{ - int count = 0; - PMC_LowpowerType wakeupType; - SystemInit(); - wakeupType = HAL_PMC_GetWakeupType(&g_pmc); - if (wakeupType == PMC_LP_DEEPSLEEP) { - UserFuncAfterWakeup(); - } - while (1) { - if (count == 1000) { /* 1000: Enter lowpower mode every 1 second */ - count = 0; - DBG_PRINTF("Enter deep sleep mode.\r\n"); - BASE_FUNC_DELAY_MS(100); /* Delay 100ms to wait for uart output all data */ - HAL_UART_DeInit(&g_uart0); /* deinitialize uart */ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_DISABLE); /* Close uart's clock */ - HAL_PMC_EnterDeepSleepMode(&g_pmc); /* Enter deep sleep mode */ - } - BASE_FUNC_DELAY_MS(1); /* Delay 1ms */ - count++; - } -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_m/inc/sample_qdm_m.h b/vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_m/inc/sample_qdm_m.h deleted file mode 100644 index 90e35ede3..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_m/inc/sample_qdm_m.h +++ /dev/null @@ -1,26 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_qdm_m.h - * @author MCU Driver Team - * @brief this file shows use M method and MT method to get speed information for QDM. - */ -#ifndef McuMagicTag_SAMPLE_QDM_M_H -#define McuMagicTag_SAMPLE_QDM_M_H - -void QDM_SampleM(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_m/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_m/init/main.c deleted file mode 100644 index de0185bac..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_m/init/main.c +++ /dev/null @@ -1,37 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ -#include "feature.h" -#include "main.h" -#include "debug.h" -#include "sample_qdm_m.h" - -QDM_Handle g_qdmHandle; -UART_Handle g_uart0; - -int main(void) -{ - DBG_PRINTF("enter main\r\n"); - QDM_SampleM(); - while (1) { - } - return BASE_STATUS_OK; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_m/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_m/init/main.h deleted file mode 100644 index c4cddf992..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_m/init/main.h +++ /dev/null @@ -1,49 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "qdm.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -extern QDM_Handle g_qdmHandle; - -extern UART_Handle g_uart0; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -void QDM_SpeedLoseCallback(QDM_Handle *handle); -void QDM_PTUCycleCallback(QDM_Handle *handle); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_m/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_m/init/system_init.c deleted file mode 100644 index ceea34489..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_m/init/system_init.c +++ /dev/null @@ -1,175 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "debug.h" -#include "main.h" -#include "ioconfig.h" - -#define UART0_BAND_RATE 115200 - -#define QDM_MOTOR_LINE_NUMBER 1000 -#define QDM_INPUT_FILTER_VALUE 0 -#define QDM_INPUT_PALORITY 0x0 /**< bit0~2: A B Z phase, bit value: 0--direct input, 1--invert input */ -#define INTERUPT_ENABLE_BITS 0x304 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -__weak void QDM_PTUCycleCallback(QDM_Handle *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN QDMPTUCycleCallback */ - /* USER CODE END QDMPTUCycleCallback */ -} - -__weak void QDM_SpeedLoseCallback(QDM_Handle *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN QDM_SpeedLose */ - /* USER CODE END QDM_SpeedLose */ -} - -static void QDM_Init(void) -{ - HAL_CRG_IpEnableSet(QDM0_BASE, IP_CLK_ENABLE); - - g_qdmHandle.baseAddress = QDM0_BASE; - g_qdmHandle.irqNum = IRQ_QDM0; - /* emulation config */ - g_qdmHandle.emuMode = QDM_EMULATION_MODE_STOP_IMMEDIATELY; - /* input config */ - g_qdmHandle.ctrlConfig.decoderMode = QDM_QUADRATURE_COUNT; - g_qdmHandle.ctrlConfig.polarity = 0; - g_qdmHandle.ctrlConfig.resolution = QDM_1X_RESOLUTION; - g_qdmHandle.ctrlConfig.trgLockMode = QDM_TRG_BY_CYCLE; - g_qdmHandle.ctrlConfig.swap = QDM_SWAP_DISABLE; - g_qdmHandle.ctrlConfig.ptuMode = QDM_PTU_MODE_CYCLE; - /* filter config */ - g_qdmHandle.inputFilter.qdmAFilterLevel = 0; /* filter level */ - g_qdmHandle.inputFilter.qdmBFilterLevel = 0; /* filter level */ - g_qdmHandle.inputFilter.qdmZFilterLevel = 0; /* filter level */ - /* other config */ - g_qdmHandle.pcntMode = QDM_PCNT_MODE_BY_DIR; - g_qdmHandle.pcntRstMode = QDM_PCNT_RST_BY_PTU; - g_qdmHandle.pcntIdxInitMode = QDM_IDX_INIT_DISABLE; - g_qdmHandle.qcMax = 0xffffffff; /* 0xffffffff: QDM TSU Counter Maximum Value */ - g_qdmHandle.subModeEn = true; - g_qdmHandle.tsuPrescaler = 0; /* 0: TSU prescaler */ - g_qdmHandle.cevtPrescaler = 0; /* 0: cevt prescaler */ - g_qdmHandle.posMax = 0xffffffff; /* 0xffffffff: QDM PPU Position Counter Maximum Value */ - g_qdmHandle.posInit = 0; - g_qdmHandle.period = 200000000; /* 200000000: QDM PTU Period Value */ - g_qdmHandle.motorLineNum = 1000; /* 1000: line number */ - g_qdmHandle.interruptEn = INTERUPT_ENABLE_BITS; - - HAL_QDM_Init(&g_qdmHandle); - HAL_QDM_RegisterCallback(&g_qdmHandle, QDM_TSU_CYCLE, QDM_PTUCycleCallback); - HAL_QDM_RegisterCallback(&g_qdmHandle, QDM_SPEED_LOSE, QDM_SpeedLoseCallback); - - HAL_QDM_IRQService(&g_qdmHandle); - IRQ_SetPriority(g_qdmHandle.irqNum, 1); - IRQ_EnableN(g_qdmHandle.irqNum); -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); - - g_uart0.baseAddress = UART0; - g_uart0.irqNum = IRQ_UART0; - - g_uart0.baudRate = UART0_BAND_RATE; - g_uart0.dataLength = UART_DATALENGTH_8BIT; - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; - g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart0); -} - -static void IOConfig(void) -{ - IOConfig_RegStruct *iconfig = IOCONFIG; - - iconfig->iocmg_11.BIT.func = 0x1; /* 0x1 is QDM_A */ - iconfig->iocmg_11.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_11.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_11.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_11.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_11.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_12.BIT.func = 0x1; /* 0x1 is QDM_B */ - iconfig->iocmg_12.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_12.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_12.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_12.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_12.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_17.BIT.func = 0x1; /* 0x1 is QDM_INDEX */ - iconfig->iocmg_17.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_17.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_17.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_17.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_17.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ - iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ - iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - QDM_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_m/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_m/readme.md deleted file mode 100644 index 4ef61a3c7..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_m/readme.md +++ /dev/null @@ -1,24 +0,0 @@ -# M法测量电机实时转速 -## 关键字: QDM, 电机,M法 - -**【功能描述】** -+ 通过获取电机编码器QDM的相关信息,使用M法进行计算电机实时转速 - -**【示例配置】** -+ QDM控制配置:解码模式decoderMode,极性选择polarity,正交分解resolution、触发锁存模式trgLockMode,A/B相互换swap,PTU单元周期模式ptuMode - -+ 输入滤波配置:可通过“g_qdmHandle.inputFilter”对A/B/Z相滤波等级进行配置,默认均为0 - -+ PPU电机位置处理单元配置:位置计数模式pcntMode,位置计数复位模式pcntRstMode,位置计数初始化模式pcntIdxInitMode,位置计数器最大值posMax,位置计数初始化值posInit - -+ TSU时间戳单元配置:TSU计数器最大值qcMax,TSU预分频tsuPrescaler - -+ PTU周期触发单元配置:PTU周期大小period - -+ 其他配置:捕获事件预分频cevtPrescaler,编码器线数motorLineNum,中断使能interruptEn,子模块使能subModeEn - -**【示例效果】** -+ 串口打印出电机实时的转速值大小 - -**【注意事项】** -+ 需要转动电机才能进行测量实时转速 diff --git a/vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_m/src/sample_qdm_m.c b/vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_m/src/sample_qdm_m.c deleted file mode 100644 index c335f2387..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_m/src/sample_qdm_m.c +++ /dev/null @@ -1,41 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file qdm_hal_sample.c - * @author MCU Driver Team - * @brief this file shows use M method to get speed information for QDM. - */ - -#include "qdm.h" -#include "debug.h" -#include "sample_qdm_m.h" -#include "main.h" - -/** - * @brief QDM sample use M method - * @param none. - * @retval none. - */ -void QDM_SampleM(void) -{ - SystemInit(); - while (1) { - int speed; - speed = HAL_QDM_GetSpeedRpmM(&g_qdmHandle); /* get speed */ - DBG_PRINTF("speed: %d.\r\n", speed); - } -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_mt/inc/sample_qdm_mt.h b/vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_mt/inc/sample_qdm_mt.h deleted file mode 100644 index 7106d390a..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_mt/inc/sample_qdm_mt.h +++ /dev/null @@ -1,26 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_qdm_mt.h - * @author MCU Driver Team - * @brief this file shows use M method and MT method to get speed information for QDM. - */ -#ifndef McuMagicTag_SAMPLE_QDM_MT -#define McuMagicTag_SAMPLE_QDM_MT - -void QDM_SampleMT(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_mt/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_mt/init/main.c deleted file mode 100644 index c082789ce..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_mt/init/main.c +++ /dev/null @@ -1,37 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ -#include "feature.h" -#include "debug.h" -#include "main.h" -#include "sample_qdm_mt.h" - -QDM_Handle g_qdmHandle; -UART_Handle g_uart0; - -int main(void) -{ - DBG_PRINTF("enter main.\r\n"); - QDM_SampleMT(); - while (1) { - } - return BASE_STATUS_OK; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_mt/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_mt/init/main.h deleted file mode 100644 index 0469f61bf..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_mt/init/main.h +++ /dev/null @@ -1,46 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "qdm.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -extern QDM_Handle g_qdmHandle; - -extern UART_Handle g_uart0; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_mt/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_mt/init/system_init.c deleted file mode 100644 index b74d4febd..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_mt/init/system_init.c +++ /dev/null @@ -1,154 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" - -#define UART0_BAND_RATE 115200 - -#define QDM_MOTOR_LINE_NUMBER 1000 -#define QDM_INPUT_FILTER_VALUE 0 -#define QDM_INPUT_PALORITY 0x0 /**< bit0~2: A B Z phase, bit value: 0--direct input, 1--invert input */ -#define INTERUPT_ENABLE_BITS 0x304 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void QDM_Init(void) -{ - HAL_CRG_IpEnableSet(QDM0_BASE, IP_CLK_ENABLE); - - g_qdmHandle.baseAddress = QDM0_BASE; - g_qdmHandle.irqNum = IRQ_QDM0; - - /* emulation config */ - g_qdmHandle.emuMode = QDM_EMULATION_MODE_STOP_IMMEDIATELY; - /* input config */ - g_qdmHandle.ctrlConfig.decoderMode = QDM_QUADRATURE_COUNT; - g_qdmHandle.ctrlConfig.polarity = 0; - g_qdmHandle.ctrlConfig.resolution = QDM_4X_RESOLUTION; - g_qdmHandle.ctrlConfig.trgLockMode = QDM_TRG_BY_CYCLE; - g_qdmHandle.ctrlConfig.swap = QDM_SWAP_DISABLE; - g_qdmHandle.ctrlConfig.ptuMode = QDM_PTU_MODE_CYCLE; - /* filter config */ - g_qdmHandle.inputFilter.qdmAFilterLevel = 0; /* filter level */ - g_qdmHandle.inputFilter.qdmBFilterLevel = 0; /* filter level */ - g_qdmHandle.inputFilter.qdmZFilterLevel = 0; /* filter level */ - /* other config */ - g_qdmHandle.pcntMode = QDM_PCNT_MODE_BY_DIR; - g_qdmHandle.pcntRstMode = QDM_PCNT_RST_AUTO; - g_qdmHandle.pcntIdxInitMode = QDM_IDX_INIT_DISABLE; - g_qdmHandle.qcMax = 0xffffffff; /* 0xffffffff: QDM TSU Counter Maximum Value */ - g_qdmHandle.subModeEn = true; - g_qdmHandle.tsuPrescaler = 8; /* 8: TSU prescaler */ - g_qdmHandle.cevtPrescaler = 11; /* 11: cevt prescaler */ - g_qdmHandle.posMax = 0xffffffff; /* 0xffffffff: QDM PPU Position Counter Maximum Value */ - g_qdmHandle.posInit = 0; - - g_qdmHandle.period = 200000000; /* 200000000: QDM PTU Period Value */ - g_qdmHandle.motorLineNum = 1000; /* 1000: line number */ - HAL_QDM_Init(&g_qdmHandle); -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); - - g_uart0.baseAddress = UART0; - g_uart0.irqNum = IRQ_UART0; - - g_uart0.baudRate = UART0_BAND_RATE; - g_uart0.dataLength = UART_DATALENGTH_8BIT; - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; - g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart0); -} - -static void IOConfig(void) -{ - IOConfig_RegStruct *iconfig = IOCONFIG; - - iconfig->iocmg_11.BIT.func = 0x1; /* 0x1 is QDM_A */ - iconfig->iocmg_11.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_11.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_11.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_11.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_11.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_12.BIT.func = 0x1; /* 0x1 is QDM_B */ - iconfig->iocmg_12.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_12.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_12.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_12.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_12.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_17.BIT.func = 0x1; /* 0x1 is QDM_INDEX */ - iconfig->iocmg_17.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_17.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_17.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_17.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_17.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ - iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ - iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - QDM_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_mt/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_mt/readme.md deleted file mode 100644 index df64b9079..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_mt/readme.md +++ /dev/null @@ -1,13 +0,0 @@ -# mcs_65demo - -**【功能描述】** -+ 基于AD105HDMA VER.A单板的双FOC应用 - -**【环境要求】** -+ 所用单板电源改制为演示用的24V低压,双电机均选用深圳杰美康机电的42JSF630AS-1000 - -**【IDE配置方法】** -+ chipConfig中的sample栏目里面选中Motorcontrolsystem示例,然后点击生成代码即可 - -**【注意事项】** -+ AD105HDMA VER.A单板本身为高压板,需要将供电改成24V低压 diff --git a/vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_mt/src/sample_qdm_mt.c b/vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_mt/src/sample_qdm_mt.c deleted file mode 100644 index 8ddef4b9e..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_mt/src/sample_qdm_mt.c +++ /dev/null @@ -1,42 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file qdm_hal_sample.c - * @author MCU Driver Team - * @brief this file shows use M method and MT method to get speed information for QDM. - */ - -#include "qdm.h" -#include "debug.h" -#include "sample_qdm_mt.h" -#include "main.h" - - -/** - * @brief QDM sample use MT method. - * @param none. - * @retval none. - */ -void QDM_SampleMT(void) -{ - SystemInit(); - while (1) { - int speed; - speed = HAL_QDM_GetSpeedRpmMT(&g_qdmHandle); /* get speed value */ - DBG_PRINTF("speed: %d\r\n", speed); - } -} diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_kta7953/inc/sample_spi_blocking_kta7953.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_kta7953/inc/sample_spi_blocking_kta7953.h deleted file mode 100644 index 6f4aaf426..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_kta7953/inc/sample_spi_blocking_kta7953.h +++ /dev/null @@ -1,28 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_spi_blocking_kta7953.h - * @author MCU Driver Team - * @brief SPI module sample. - * @details This file provides sample code for users to help use - * the functionalities of the SPI. - */ -#ifndef McuMagicTag_SAMPLE_SPI_BLOCKING_KTA7953_H -#define McuMagicTag_SAMPLE_SPI_BLOCKING_KTA7953_H - -void Kta7953SampleProcessing(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_kta7953/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_kta7953/init/main.c deleted file mode 100644 index 71e1ba809..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_kta7953/init/main.c +++ /dev/null @@ -1,35 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ -#include "feature.h" -#include "main.h" -#include "sample_spi_blocking_kta7953.h" - -SPI_Handle g_spiSampleHandle; -UART_Handle g_uart0; - -int main(void) -{ - Kta7953SampleProcessing(); - while (1) { - } - return BASE_STATUS_OK; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_kta7953/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_kta7953/init/main.h deleted file mode 100644 index 8467e01ce..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_kta7953/init/main.h +++ /dev/null @@ -1,46 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "spi.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -extern SPI_Handle g_spiSampleHandle; - -extern UART_Handle g_uart0; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_kta7953/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_kta7953/init/system_init.c deleted file mode 100644 index 4050da8e3..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_kta7953/init/system_init.c +++ /dev/null @@ -1,163 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" - -#define UART0_BAND_RATE 115200 - -#define SPI_FREQ_SCR 2 -#define SPI_FREQ_CPSDVSR 10 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void SPI_Init(void) -{ - HAL_CRG_IpEnableSet(SPI_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(SPI_BASE, CRG_PLL_NO_PREDV); - - g_spiSampleHandle.baseAddress = SPI; - g_spiSampleHandle.irqNum = IRQ_SPI; - - g_spiSampleHandle.mode = HAL_SPI_MASTER; - g_spiSampleHandle.csMode = SPI_CHIP_SELECT_MODE_INTERNAL; - g_spiSampleHandle.xFerMode = HAL_XFER_MODE_BLOCKING; - g_spiSampleHandle.clkPolarity = 0; - g_spiSampleHandle.clkPhase = 0; - g_spiSampleHandle.endian = HAL_SPI_BIG_ENDIAN; - g_spiSampleHandle.frameFormat = HAL_SPI_MODE_MOTOROLA; - g_spiSampleHandle.dataWidth = SPI_DATA_WIDTH_16BIT; - g_spiSampleHandle.freqScr = SPI_FREQ_SCR; - g_spiSampleHandle.freqCpsdvsr = SPI_FREQ_CPSDVSR; - g_spiSampleHandle.waitVal = 127; /* Wait time is 127 clock */ - g_spiSampleHandle.rxBuff = NULL; - g_spiSampleHandle.txBuff = NULL; - g_spiSampleHandle.transferSize = 0; - g_spiSampleHandle.txCount = 0; - g_spiSampleHandle.rxCount = 0; - g_spiSampleHandle.state = HAL_SPI_STATE_RESET; - g_spiSampleHandle.rxIntSize = SPI_RX_INTERRUPT_SIZE_1; - g_spiSampleHandle.txIntSize = SPI_TX_INTERRUPT_SIZE_1; - g_spiSampleHandle.rxDMABurstSize = SPI_RX_DMA_BURST_SIZE_1; - g_spiSampleHandle.txDMABurstSize = SPI_TX_DMA_BURST_SIZE_1; - - HAL_SPI_Init(&g_spiSampleHandle); -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); - - g_uart0.baseAddress = UART0; - g_uart0.irqNum = IRQ_UART0; - - g_uart0.baudRate = UART0_BAND_RATE; - g_uart0.dataLength = UART_DATALENGTH_8BIT; - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; - g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart0); -} - -static void IOConfig(void) -{ - IOConfig_RegStruct *iconfig = IOCONFIG; - - iconfig->iocmg_22.BIT.func = 0x5; /* 0x5 is SPI_CLK */ - iconfig->iocmg_22.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_22.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_22.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_22.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_22.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_18.BIT.func = 0x5; /* 0x5 is SPI_CSN0 */ - iconfig->iocmg_18.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_18.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_18.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_18.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_18.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_21.BIT.func = 0x5; /* 0x5 is SPI_CSN1 */ - iconfig->iocmg_21.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_21.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_21.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_21.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_21.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_20.BIT.func = 0x5; /* 0x5 is SPI_RXD */ - iconfig->iocmg_20.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_20.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_20.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_20.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_20.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_19.BIT.func = 0x5; /* 0x5 is SPI_TXD */ - iconfig->iocmg_19.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_19.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_19.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_19.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_19.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ - iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ - iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - SPI_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_kta7953/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_kta7953/readme.md deleted file mode 100644 index 15d63306d..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_kta7953/readme.md +++ /dev/null @@ -1,18 +0,0 @@ -# 对接ADC芯片kta7953,通过SPI阻塞方式读取ADC各个通道采样值 -## 关键字: SPI, 阻塞, kta7953 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、SPI控制器初始化和功能配置。SPI对接ADC芯片kta7953,通过阻塞查询方式不断读取ADC芯片kta7953各通道(ch0-ch6)的采样值,以手动模式操作ADC芯片kta7953各个通道。 - -**【示例配置】** -+ 在"SystemInit()”接口中配置SPI时钟极性、时钟相位、帧格式等参数,需根据对接的芯片进行相关参数配置。 - -+ 定义数组,数组中存放以手动操作模式读取各个通道采样值的命令。 - -+ 每次执行测试10次,进行遍历数组,前七次采用“HAL_SPI_WriteReadBlocking()”进行ch0-ch6通道采样,后三次采用“HAL_SPI_WriteBlocking()”和“HAL_SPI_ReadBlocking()”进行ch2-ch4通道采样。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码通过串口打印的方式输出ADC芯片kta7953各通道的采样值。 - -**【注意事项】** -+ 使用此示例代码必须外接ADC芯片kta7953。 diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_kta7953/src/sample_spi_blocking_kta7953.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_kta7953/src/sample_spi_blocking_kta7953.c deleted file mode 100644 index 04e3eaac8..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_kta7953/src/sample_spi_blocking_kta7953.c +++ /dev/null @@ -1,95 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_spi_blocking_kta7953.c - * @author MCU Driver Team - * @brief Sample for SPI Module Blocking. - * @details This sample is connected to the ADC chip kta7953 to demonstrate how to operate the HAL interface - * in blocking mode in the SPI driver. - * This sample operates channels 0 to 6 of ADC chip kta7953 in manual mode. - * This sample outputs the sampling values of each channel of the ADC chip kta7953 through the serial port. - * To use this sample, connect the external ADC chip kta7953. - */ -#include "main.h" -#include "spi.h" -#include "debug.h" -#include "sample_spi_blocking_kta7953.h" - -#define USER_TIMEOUT 0x400 - -#define MANUAL_MODE_SET_CH0 0x1040 -#define MANUAL_MODE_SET_CH1 0x10C0 -#define MANUAL_MODE_SET_CH2 0x1140 -#define MANUAL_MODE_SET_CH3 0x11C0 -#define MANUAL_MODE_SET_CH4 0x1240 -#define MANUAL_MODE_SET_CH5 0x12C0 -#define MANUAL_MODE_SET_CH6 0x1340 - -#define MAX_TIMEOUT_VAL 5000 - -/** - * @brief Spi blocking sample kta7953 processing. - * @param None. - * @retval None. - */ -void Kta7953SampleProcessing(void) -{ - unsigned short temp = MANUAL_MODE_SET_CH0; - unsigned short tempWdata[] = { - MANUAL_MODE_SET_CH0, - MANUAL_MODE_SET_CH1, - MANUAL_MODE_SET_CH2, - MANUAL_MODE_SET_CH3, - MANUAL_MODE_SET_CH4, - MANUAL_MODE_SET_CH5, - MANUAL_MODE_SET_CH6, - MANUAL_MODE_SET_CH2, - MANUAL_MODE_SET_CH3, - MANUAL_MODE_SET_CH4 - }; - unsigned short tempRdata[10]; - unsigned short outCh = 0; - unsigned short outData = 0; - - SystemInit(); - HAL_SPI_WriteBlocking(&g_spiSampleHandle, (unsigned char *)&temp, sizeof(temp), MAX_TIMEOUT_VAL); - while (1) { - for (int i = 0; i < 10; i++) { /* Test 10 times */ - if (i < 7) { /* First 7 */ - HAL_SPI_WriteReadBlocking(&g_spiSampleHandle, - (unsigned char *)&tempRdata[i], - (unsigned char *)&tempWdata[i], - sizeof(tempWdata[i]), - MAX_TIMEOUT_VAL); - } else { - HAL_SPI_WriteBlocking(&g_spiSampleHandle, - (unsigned char *)&tempWdata[i], - sizeof(tempWdata[i]), - MAX_TIMEOUT_VAL); - HAL_SPI_ReadBlocking(&g_spiSampleHandle, - (unsigned char *)&tempRdata[i], - sizeof(tempRdata[i]), - MAX_TIMEOUT_VAL); - } - outCh = tempRdata[i] >> 12; /* Shift right by 12 bits to obtain the lower four bits. */ - outData = tempRdata[i] & 0x0FFF; /* Mask 0x0FFF */ - DBG_PRINTF("[%d], CH:%d = %d\r\n", i, outCh, outData); - } - - BASE_FUNC_DELAY_MS(2000); /* Delay 2000ms */ - } -} diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32/inc/sample_spi_blocking_w25q32.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32/inc/sample_spi_blocking_w25q32.h deleted file mode 100644 index 5870361fb..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32/inc/sample_spi_blocking_w25q32.h +++ /dev/null @@ -1,28 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_spi_blocking_w25q32.h - * @author MCU Driver Team - * @brief SPI module sample. - * @details This file provides sample code for users to help use - * the functionalities of the SPI. - */ -#ifndef SAMPLE_SPI_BLOCKING_W25Q32_H -#define SAMPLE_SPI_BLOCKING_W25Q32_H - -void W25Q32BlockingSampleProcessing(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32/init/main.c deleted file mode 100644 index 9a8240a8a..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32/init/main.c +++ /dev/null @@ -1,50 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ - -#include "typedefs.h" -#include "feature.h" -#include "main.h" -/* USER CODE BEGIN 0 */ -/* USER CODE END 0 */ -UART_Handle g_uart0; -SPI_Handle g_spiSampleHandle; -/* USER CODE BEGIN 1 */ -/* USER CODE END 1 */ - -int main(void) -{ - /* USER CODE BEGIN 2 */ - /* USER CODE END 2 */ - W25Q32BlockingSampleProcessing(); - /* USER CODE BEGIN 3 */ - /* USER CODE END 3 */ - while (1) { - /* USER CODE BEGIN 4 */ - /* USER CODE END 4 */ - } - /* USER CODE BEGIN 5 */ - /* USER CODE END 5 */ - return BASE_STATUS_OK; -} - -/* USER CODE BEGIN 6 */ -/* USER CODE END 6 */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32/init/main.h deleted file mode 100644 index f2ff5b487..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32/init/main.h +++ /dev/null @@ -1,50 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "spi.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -#define XTAL_DRV_LEVEL4 0x03U -#define XTAL_DRV_LEVEL3 0x02U -#define XTAL_DRV_LEVEL2 0x01U -#define XTAL_DRV_LEVEL1 0x00U - -extern UART_Handle g_uart0; -extern SPI_Handle g_spiSampleHandle; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32/init/system_init.c deleted file mode 100644 index ad52532ca..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32/init/system_init.c +++ /dev/null @@ -1,157 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" -#include "iocmg_ip.h" - -#define UART0_BAND_RATE 115200 - -#define SPI1_FREQ_SCR 2 -#define SPI1_FREQ_CPSDVSR 10 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; /* crg baseaddress */ - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; - crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; - crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_1; - - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { /* CRG init */ - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void SPI1_Init(void) -{ - HAL_CRG_IpEnableSet(SPI1_BASE, IP_CLK_ENABLE); - - g_spiSampleHandle.baseAddress = SPI1; - - g_spiSampleHandle.mode = HAL_SPI_MASTER; /* spi master */ - g_spiSampleHandle.csMode = SPI_CHIP_SELECT_MODE_CALLBACK; - g_spiSampleHandle.xFerMode = HAL_XFER_MODE_BLOCKING; - g_spiSampleHandle.clkPolarity = HAL_SPI_CLKPOL_0; /* spi ploarity is 0 */ - g_spiSampleHandle.clkPhase = HAL_SPI_CLKPHA_1; - g_spiSampleHandle.endian = HAL_SPI_BIG_ENDIAN; - g_spiSampleHandle.frameFormat = HAL_SPI_MODE_MOTOROLA; /* motorola frame format */ - g_spiSampleHandle.dataWidth = SPI_DATA_WIDTH_8BIT; - g_spiSampleHandle.freqScr = SPI1_FREQ_SCR; - g_spiSampleHandle.freqCpsdvsr = SPI1_FREQ_CPSDVSR; - g_spiSampleHandle.waitEn = BASE_CFG_DISABLE; - g_spiSampleHandle.waitVal = 127; /* microwire wait time 127 */ - g_spiSampleHandle.rxBuff = NULL; - g_spiSampleHandle.txBuff = NULL; - g_spiSampleHandle.transferSize = 0; - g_spiSampleHandle.txCount = 0; /* transfer count */ - g_spiSampleHandle.rxCount = 0; - g_spiSampleHandle.state = HAL_SPI_STATE_RESET; - g_spiSampleHandle.rxIntSize = SPI_RX_INTERRUPT_SIZE_1; - g_spiSampleHandle.txIntSize = SPI_TX_INTERRUPT_SIZE_1; /* tx interrupt size */ - g_spiSampleHandle.rxDMABurstSize = SPI_RX_DMA_BURST_SIZE_1; - g_spiSampleHandle.txDMABurstSize = SPI_TX_DMA_BURST_SIZE_1; - HAL_SPI_Init(&g_spiSampleHandle); - HAL_SPI_ChipSelectChannelSet(&g_spiSampleHandle, SPI_CHIP_SELECT_CHANNEL_1); -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - - g_uart0.baseAddress = UART0; /* uart0 baseaaddress */ - - g_uart0.baudRate = UART0_BAND_RATE; - g_uart0.dataLength = UART_DATALENGTH_8BIT; /* data length 8 */ - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; /* blocking mode */ - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; - g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; /* fifo size 8 */ - g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; - g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart0); -} - -static void IOConfig(void) -{ - HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO4_6_AS_SPI1_CLK); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO4_6_AS_SPI1_CLK, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO4_6_AS_SPI1_CLK, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO4_6_AS_SPI1_CLK, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO4_6_AS_SPI1_CLK, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO1_4_AS_SPI1_RXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO1_4_AS_SPI1_RXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO1_4_AS_SPI1_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO1_4_AS_SPI1_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO1_4_AS_SPI1_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO3_0_AS_SPI1_CSN1); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO3_0_AS_SPI1_CSN1, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO3_0_AS_SPI1_CSN1, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO3_0_AS_SPI1_CSN1, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO3_0_AS_SPI1_CSN1, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO1_3_AS_SPI1_TXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO1_3_AS_SPI1_TXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO1_3_AS_SPI1_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO1_3_AS_SPI1_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO1_3_AS_SPI1_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO4_5_AS_SPI1_CSN0); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO4_5_AS_SPI1_CSN0, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO4_5_AS_SPI1_CSN0, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO4_5_AS_SPI1_CSN0, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO4_5_AS_SPI1_CSN0, DRIVER_RATE_2); /* Output signal edge fast/slow */ -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - SPI1_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32/readme.md deleted file mode 100644 index 76b7715d5..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32/readme.md +++ /dev/null @@ -1,20 +0,0 @@ -# 对接flash芯片w25q32,通过SPI阻塞方式写入和读取w25q32芯片中的数据 -## 关键字: SPI, 阻塞, w25q32芯片 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、SPI控制器初始化和功能配置。SPI对接flash芯片w25q32,通过阻塞方式对w25q32芯片进行写入120个数据,之后从芯片中再读出120字节数据。 - -**【示例配置】** -+ 在"SystemInit()”接口中配置SPI时钟极性、时钟相位、帧格式等参数,需根据对接的芯片进行相关参数配置。 - -+ w25q32芯片扇区擦除:调用“SectorErase()”接口先对w25q32芯片进行擦写操作,内部调用接口“SPI_W25Q32_WriteEnable()”向w25q32发送写使能命令,之后发送擦写扇区命令。命令的发送都是调用“HAL_SPI_WriteBlocking()”接口。 - -+ 向w25q32芯片写数据:调用“WritePage()”接口进行数据写入,发送页写入命令和需要写入120个数据,调用“HAL_SPI_WriteBlocking()”接口。 - -+ 从w25q32芯片读数据:调用“ReadData()”接口进行读数据,发送读命令,调用“HAL_SPI_WriteReadBlocking()”接口从芯片读取120个数据。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成后,串口打印写入的120个数据和读取的120个数据,如果写入和读取的数据是相同则打印data correct,否则打印data err。 - -**【注意事项】** -+ 使用此示例代码必须外接flash芯片w25q32。 diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32/src/sample_spi_blocking_w25q32.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32/src/sample_spi_blocking_w25q32.c deleted file mode 100644 index b9649fb42..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32/src/sample_spi_blocking_w25q32.c +++ /dev/null @@ -1,244 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_spi_blocking_w25q32.c - * @author MCU Driver Team - * @brief Sample for SPI Module Blocking. - * @details This sample is used to operate the HAL interface on the W25Q32 chip of the flash. - * Write data and read data to address 0 of W25Q32 - */ -#include "main.h" -#include "spi.h" -#include "debug.h" -#include "sample_spi_blocking_w25q32.h" - -#define SPI_W25X_WRITE_ENABLE 0x06 -#define SPI_W25X_SECTOR_ERASE 0x20 -#define SPI_W25X_PAGE_PROGRAM 0x02 -#define SPI_W25X_READ_DATA 0x03 - -#define MAX_TIMEOUT_VAL 5000 - -static unsigned int g_flashAddr = 0; -static unsigned char g_writeBuf[120] = {0}; -static unsigned char g_recvBuf[120] = {0}; - -void SPICsCallback(void *handle); -/** - * @brief spi chip select callback function. - * @param handle SPI handle. - * @retval None - */ -void SPICsCallback(void *handle) -{ - SPI_Handle *spiHandle = (SPI_Handle *)handle; - /* USER CODE BEGIN SPICsCallback */ - if (g_spiSampleHandle.csCtrl == SPI_CHIP_SELECT) { - HAL_SPI_SetChipConfigSelectEx(spiHandle, HAL_SPI_CHIP_CONFIG_SOFR_UNSET); - } else { - HAL_SPI_SetChipConfigSelectEx(spiHandle, HAL_SPI_CHIP_CONFIG_SOFR_SET); - } - /* USER CODE END SPICsCallback */ -} - -/** - * @brief w25q32 enable the write function. - * @param None. - * @retval BASE_StatusType:OK, ERROR. - */ -static BASE_StatusType SPI_W25Q32_WriteEnable(void) -{ - unsigned char temp = SPI_W25X_WRITE_ENABLE; /* Write enable command */ - BASE_StatusType ret; - ret = HAL_SPI_WriteBlocking(&g_spiSampleHandle, (unsigned char *)&temp, sizeof(temp), MAX_TIMEOUT_VAL); - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("enable error!\r\n"); - return BASE_STATUS_ERROR; - } - return BASE_STATUS_OK; -} - -/** - * @brief w25q32 sector erase function. - * @param sectorEraseAddr sector erase address. - * @retval BASE_StatusType:OK, ERROR. - */ -static BASE_StatusType SectorErase(unsigned int sectorEraseAddr) -{ - BASE_StatusType ret; - ret = SPI_W25Q32_WriteEnable(); - if (ret != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - BASE_FUNC_DELAY_MS(20); /* delay 20 ms */ - - unsigned char buffer[4] = {0}; - buffer[0] = SPI_W25X_SECTOR_ERASE; /* Sector erase command */ - buffer[1] = (sectorEraseAddr & 0xFF0000) >> 16; /* Shift right by 16 bits */ - buffer[2] = (sectorEraseAddr & 0xFF00) >> 8; /* Shift right by 8 bits, 2 array subscript */ - buffer[3] = (sectorEraseAddr & 0xFF); /* Lower 8 bits of the sector erase address, 3 array subscript */ - ret = HAL_SPI_WriteBlocking(&g_spiSampleHandle, buffer, sizeof(buffer), MAX_TIMEOUT_VAL); - if (ret != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - return BASE_STATUS_OK; -} - -/** - * @brief w25q32 single page write, maximum 256 bytes. - * @param writeBuf write data buffer. - * @param writeAddr write address. - * @param len data length. - * @retval BASE_StatusType:OK, ERROR. - */ -static BASE_StatusType WritePage(unsigned char *writeBuf, unsigned int writeAddr, unsigned int len) -{ - BASE_StatusType ret; - ret = SPI_W25Q32_WriteEnable(); /* enable the write */ - if (ret != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - BASE_FUNC_DELAY_MS(20); /* Delay 20ms */ - - unsigned char buffer[124] = {0}; /* transmit 124 bytes: 4-byte command and 120-byte data */ - - buffer[0] = SPI_W25X_PAGE_PROGRAM; /* Page Program command */ - buffer[1] = (writeAddr & 0xFF0000) >> 16; /* Shift right by 16 bits */ - buffer[2] = (writeAddr & 0xFF00) >> 8; /* Shift right by 8 bits, 2 array subscript */ - buffer[3] = (writeAddr & 0xFF); /* Lower 8 bits of the sector erase address, 3 array subscript */ - for (unsigned int count = 0; count < len; count++) { - buffer[count + 4] = writeBuf[count]; /* data is stored from array subscript 4 */ - } - ret = HAL_SPI_WriteBlocking(&g_spiSampleHandle, buffer, (len + 4), MAX_TIMEOUT_VAL); /* len + 4 is total size */ - if (ret != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - return BASE_STATUS_OK; -} - -/** - * @brief Read data in the address. - * @param recvBuf write data buffer. - * @param recvAddr write address. - * @param len data length. - * @retval BASE_StatusType:OK, ERROR. - */ -static BASE_StatusType ReadData(unsigned char *recvBuf, unsigned int recvAddr, unsigned int len) -{ - unsigned char buffer[124] = {0}; /* The array size is 124 bytes */ - BASE_StatusType ret; - buffer[0] = SPI_W25X_READ_DATA; /* Read data command */ - buffer[1] = (recvAddr & 0xFF0000) >> 16; /* Shift right by 16 bits */ - buffer[2] = (recvAddr & 0xFF00) >> 8; /* Shift right by 8 bits, 2 array subscript */ - buffer[3] = (recvAddr & 0xFF); /* Lower 8 bits of the sector erase address, 3 array subscript */ - - unsigned char readBuf[124] = {0}; - /* len + 4 is total size */ - ret = HAL_SPI_WriteReadBlocking(&g_spiSampleHandle, readBuf, (unsigned char *)buffer, (len + 4), MAX_TIMEOUT_VAL); - if (ret != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - for (unsigned int i = 0; i < len; i++) { - recvBuf[i] = readBuf[i + 4]; /* read valid data from array subscript 4 */ - } - return BASE_STATUS_OK; -} - -/** - * @brief Performs read data and write page on w25q32. - * @param None. - * @retval None. - */ -static void SPI_WritePageAndReadData(void) -{ - BASE_StatusType ret; - DBG_PRINTF("write data is : \r\n"); - unsigned int writeLen = 120; /* transfer 120 bytes of data */ - for (unsigned int i = 0; i < writeLen; i++) { - g_writeBuf[i] = i; - DBG_PRINTF("%d ", g_writeBuf[i]); - } - DBG_PRINTF("\r\n"); - ret = WritePage(g_writeBuf, g_flashAddr, writeLen); /* w25q32 single page write */ - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("write page failed!\r\n"); - } - - BASE_FUNC_DELAY_MS(5); /* Delay 5ms */ - - unsigned int recvLen = 120; /* 120 bytes of data needs to be received */ - for (unsigned int index = 0; index < recvLen; index++) { - g_recvBuf[index] = 0; - } - ret = ReadData(g_recvBuf, g_flashAddr, recvLen); /* Read data in the g_flashAddr address */ - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("read page failed!\r\n"); - } else { - DBG_PRINTF("read data is : \r\n"); - for (unsigned int i = 0; i < recvLen; i++) { - DBG_PRINTF("%d ", g_recvBuf[i]); /* print received Data */ - } - DBG_PRINTF("\r\n"); - } -} - -/** - * @brief Performs read and write operations on w25q32. - * @param None. - * @retval None. - */ -static void SPI_W25Q32_TEST(void) -{ - BASE_StatusType ret; - ret = SectorErase(g_flashAddr); /* w25q32 sector erase function */ - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("sector erase failed!\r\n"); - } - BASE_FUNC_DELAY_MS(500); /* Delay 500 ms */ - - SPI_WritePageAndReadData(); - - bool flag = true; - unsigned int recvLen = 120; - for (unsigned int i = 0; i < recvLen; i++) { - if (g_recvBuf[i] != g_writeBuf[i]) { /* compare the transmitted data with the received data */ - DBG_PRINTF("data err! \r\n"); - flag = false; - break; - } - } - if (flag) { - DBG_PRINTF("data correct \r\n"); - } - DBG_PRINTF("\r\n"); -} - -/** - * @brief Spi blocking sample w25q32 processing. - * @param None. - * @retval None. - */ -void W25Q32BlockingSampleProcessing(void) -{ - SystemInit(); - HAL_SPI_SetChipConfigSelectEx(&g_spiSampleHandle, HAL_SPI_CHIP_CONFIG_SOFR_SET); - HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_CS_CB_ID, SPICsCallback); - while (1) { - SPI_W25Q32_TEST(); - BASE_FUNC_DELAY_MS(1000); /* Delay 1000 ms */ - } -} diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32_internal/inc/sample_spi_blocking_w25q32_internal.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32_internal/inc/sample_spi_blocking_w25q32_internal.h deleted file mode 100644 index 3ea2d959e..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32_internal/inc/sample_spi_blocking_w25q32_internal.h +++ /dev/null @@ -1,28 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_spi_blocking_w25q32_internal.h - * @author MCU Driver Team - * @brief SPI module sample. - * @details This file provides sample code for users to help use - * the functionalities of the SPI. - */ -#ifndef SAMPLE_SPI_BLOCKING_W25Q32_INTERNAL_H -#define SAMPLE_SPI_BLOCKING_W25Q32_INTERNAL_H - -void W25Q32BlockingSampleProcessing(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32_internal/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32_internal/init/main.c deleted file mode 100644 index b1190ef85..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32_internal/init/main.c +++ /dev/null @@ -1,51 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ - -#include "typedefs.h" -#include "feature.h" -#include "sample_spi_blocking_w25q32_internal.h" -#include "main.h" -/* USER CODE BEGIN 0 */ -/* USER CODE END 0 */ -SPI_Handle g_spiSampleHandle; -UART_Handle g_uart0; -/* USER CODE BEGIN 1 */ -/* USER CODE END 1 */ - -int main(void) -{ - /* USER CODE BEGIN 2 */ - /* USER CODE END 2 */ - W25Q32BlockingSampleProcessing(); - /* USER CODE BEGIN 3 */ - /* USER CODE END 3 */ - while (1) { - /* USER CODE BEGIN 4 */ - /* USER CODE END 4 */ - } - /* USER CODE BEGIN 5 */ - /* USER CODE END 5 */ - return BASE_STATUS_OK; -} - -/* USER CODE BEGIN 6 */ -/* USER CODE END 6 */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32_internal/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32_internal/init/main.h deleted file mode 100644 index 4b520d365..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32_internal/init/main.h +++ /dev/null @@ -1,50 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "spi.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -#define XTAL_DRV_LEVEL4 0x03U -#define XTAL_DRV_LEVEL3 0x02U -#define XTAL_DRV_LEVEL2 0x01U -#define XTAL_DRV_LEVEL1 0x00U - -extern SPI_Handle g_spiSampleHandle; -extern UART_Handle g_uart0; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32_internal/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32_internal/init/system_init.c deleted file mode 100644 index 53603017f..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32_internal/init/system_init.c +++ /dev/null @@ -1,157 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" -#include "iocmg.h" - -#define UART0_BAND_RATE 115200 - -#define SPI_FREQ_SCR 2 -#define SPI_FREQ_CPSDVSR 10 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; - - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { /* CRG init */ - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void SPI_Init(void) -{ - HAL_CRG_IpEnableSet(SPI_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(SPI_BASE, CRG_PLL_NO_PREDV); - - g_spiSampleHandle.baseAddress = SPI; - - g_spiSampleHandle.mode = HAL_SPI_MASTER; /* spi master */ - g_spiSampleHandle.csMode = SPI_CHIP_SELECT_MODE_INTERNAL; - g_spiSampleHandle.xFerMode = HAL_XFER_MODE_BLOCKING; - g_spiSampleHandle.clkPolarity = HAL_SPI_CLKPOL_0; /* spi ploarity is 0 */ - g_spiSampleHandle.clkPhase = HAL_SPI_CLKPHA_1; - g_spiSampleHandle.endian = HAL_SPI_BIG_ENDIAN; - g_spiSampleHandle.frameFormat = HAL_SPI_MODE_MOTOROLA; /* motorola frame format */ - g_spiSampleHandle.dataWidth = SPI_DATA_WIDTH_8BIT; - g_spiSampleHandle.freqScr = SPI_FREQ_SCR; - g_spiSampleHandle.freqCpsdvsr = SPI_FREQ_CPSDVSR; - g_spiSampleHandle.waitEn = BASE_CFG_DISABLE; - g_spiSampleHandle.waitVal = 127; /* microwire wait time 127 */ - g_spiSampleHandle.rxBuff = NULL; - g_spiSampleHandle.txBuff = NULL; - g_spiSampleHandle.transferSize = 0; - g_spiSampleHandle.txCount = 0; /* transfer count */ - g_spiSampleHandle.rxCount = 0; - g_spiSampleHandle.state = HAL_SPI_STATE_RESET; - g_spiSampleHandle.rxIntSize = SPI_RX_INTERRUPT_SIZE_1; - g_spiSampleHandle.txIntSize = SPI_TX_INTERRUPT_SIZE_1; /* tx interrupt size */ - g_spiSampleHandle.rxDMABurstSize = SPI_RX_DMA_BURST_SIZE_1; - g_spiSampleHandle.txDMABurstSize = SPI_TX_DMA_BURST_SIZE_1; - HAL_SPI_Init(&g_spiSampleHandle); -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); - - g_uart0.baseAddress = UART0; /* uart0 baseaaddress */ - - g_uart0.baudRate = UART0_BAND_RATE; - g_uart0.dataLength = UART_DATALENGTH_8BIT; /* data length 8 */ - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; /* blocking mode */ - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; - g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart0); -} - -static void IOConfig(void) -{ - SYSCTRL0->SC_SYS_STAT.BIT.update_mode = 0; - SYSCTRL0->SC_SYS_STAT.BIT.update_mode_clear = 1; - HAL_IOCMG_SetPinAltFuncMode(IO6_AS_SSP0_CLK); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(IO6_AS_SSP0_CLK, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(IO6_AS_SSP0_CLK, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(IO6_AS_SSP0_CLK, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(IO6_AS_SSP0_CLK, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(IO3_AS_SSP0_TXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(IO3_AS_SSP0_TXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(IO3_AS_SSP0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(IO3_AS_SSP0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(IO3_AS_SSP0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(IO4_AS_SSP0_RXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(IO4_AS_SSP0_RXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(IO4_AS_SSP0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(IO4_AS_SSP0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(IO4_AS_SSP0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(IO2_AS_SSP0_CSN0); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(IO2_AS_SSP0_CSN0, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(IO2_AS_SSP0_CSN0, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(IO2_AS_SSP0_CSN0, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(IO2_AS_SSP0_CSN0, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(IO5_AS_SSP0_CSN1); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(IO5_AS_SSP0_CSN1, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(IO5_AS_SSP0_CSN1, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(IO5_AS_SSP0_CSN1, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(IO5_AS_SSP0_CSN1, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(IO52_AS_UART0_TXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(IO52_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(IO52_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(IO52_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(IO52_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - /* UART RX recommend PULL_UP */ - HAL_IOCMG_SetPinAltFuncMode(IO53_AS_UART0_RXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(IO53_AS_UART0_RXD, PULL_UP); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(IO53_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(IO53_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(IO53_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - SPI_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32_internal/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32_internal/readme.md deleted file mode 100644 index 76b7715d5..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32_internal/readme.md +++ /dev/null @@ -1,20 +0,0 @@ -# 对接flash芯片w25q32,通过SPI阻塞方式写入和读取w25q32芯片中的数据 -## 关键字: SPI, 阻塞, w25q32芯片 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、SPI控制器初始化和功能配置。SPI对接flash芯片w25q32,通过阻塞方式对w25q32芯片进行写入120个数据,之后从芯片中再读出120字节数据。 - -**【示例配置】** -+ 在"SystemInit()”接口中配置SPI时钟极性、时钟相位、帧格式等参数,需根据对接的芯片进行相关参数配置。 - -+ w25q32芯片扇区擦除:调用“SectorErase()”接口先对w25q32芯片进行擦写操作,内部调用接口“SPI_W25Q32_WriteEnable()”向w25q32发送写使能命令,之后发送擦写扇区命令。命令的发送都是调用“HAL_SPI_WriteBlocking()”接口。 - -+ 向w25q32芯片写数据:调用“WritePage()”接口进行数据写入,发送页写入命令和需要写入120个数据,调用“HAL_SPI_WriteBlocking()”接口。 - -+ 从w25q32芯片读数据:调用“ReadData()”接口进行读数据,发送读命令,调用“HAL_SPI_WriteReadBlocking()”接口从芯片读取120个数据。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成后,串口打印写入的120个数据和读取的120个数据,如果写入和读取的数据是相同则打印data correct,否则打印data err。 - -**【注意事项】** -+ 使用此示例代码必须外接flash芯片w25q32。 diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32_internal/src/sample_spi_blocking_w25q32_internal.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32_internal/src/sample_spi_blocking_w25q32_internal.c deleted file mode 100644 index 1f682f268..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32_internal/src/sample_spi_blocking_w25q32_internal.c +++ /dev/null @@ -1,224 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_spi_blocking_w25q32_internal.c - * @author MCU Driver Team - * @brief Sample for SPI Module Blocking. - * @details This sample is used to operate the HAL interface on the W25Q32 chip of the flash. - * Write data and read data to address 0 of W25Q32 - */ -#include "main.h" -#include "spi.h" -#include "debug.h" -#include "sample_spi_blocking_w25q32_internal.h" - -#define SPI_W25X_WRITE_ENABLE 0x06 -#define SPI_W25X_SECTOR_ERASE 0x20 -#define SPI_W25X_PAGE_PROGRAM 0x02 -#define SPI_W25X_READ_DATA 0x03 - -#define MAX_TIMEOUT_VAL 5000 - -static unsigned int g_flashAddr = 0; -static unsigned char g_writeBuf[120] = {0}; -static unsigned char g_recvBuf[120] = {0}; - -/** - * @brief w25q32 enable the write function. - * @param None. - * @retval BASE_StatusType:OK, ERROR. - */ -static BASE_StatusType SPI_W25Q32_WriteEnable(void) -{ - unsigned char temp = SPI_W25X_WRITE_ENABLE; /* Write enable command */ - BASE_StatusType ret; - ret = HAL_SPI_WriteBlocking(&g_spiSampleHandle, (unsigned char *)&temp, sizeof(temp), MAX_TIMEOUT_VAL); - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("enable error!\r\n"); - return BASE_STATUS_ERROR; - } - return BASE_STATUS_OK; -} - -/** - * @brief w25q32 sector erase function. - * @param sectorEraseAddr sector erase address. - * @retval BASE_StatusType:OK, ERROR. - */ -static BASE_StatusType SectorErase(unsigned int sectorEraseAddr) -{ - BASE_StatusType ret; - ret = SPI_W25Q32_WriteEnable(); - if (ret != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - BASE_FUNC_DELAY_MS(20); /* delay 20 ms */ - - unsigned char buffer[4] = {0}; - buffer[0] = SPI_W25X_SECTOR_ERASE; /* Sector erase command */ - buffer[1] = (sectorEraseAddr & 0xFF0000) >> 16; /* Shift right by 16 bits */ - buffer[2] = (sectorEraseAddr & 0xFF00) >> 8; /* Shift right by 8 bits, 2 array subscript */ - buffer[3] = (sectorEraseAddr & 0xFF); /* Lower 8 bits of the sector erase address, 3 array subscript */ - ret = HAL_SPI_WriteBlocking(&g_spiSampleHandle, buffer, sizeof(buffer), MAX_TIMEOUT_VAL); - if (ret != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - return BASE_STATUS_OK; -} - -/** - * @brief w25q32 single page write, maximum 256 bytes. - * @param writeBuf write data buffer. - * @param writeAddr write address. - * @param len data length. - * @retval BASE_StatusType:OK, ERROR. - */ -static BASE_StatusType WritePage(unsigned char *writeBuf, unsigned int writeAddr, unsigned int len) -{ - BASE_StatusType ret; - ret = SPI_W25Q32_WriteEnable(); /* enable the write */ - if (ret != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - BASE_FUNC_DELAY_MS(20); /* Delay 20ms */ - - unsigned char buffer[124] = {0}; /* transmit 124 bytes: 4-byte command and 120-byte data */ - - buffer[0] = SPI_W25X_PAGE_PROGRAM; /* Page Program command */ - buffer[1] = (writeAddr & 0xFF0000) >> 16; /* Shift right by 16 bits */ - buffer[2] = (writeAddr & 0xFF00) >> 8; /* Shift right by 8 bits, 2 array subscript */ - buffer[3] = (writeAddr & 0xFF); /* Lower 8 bits of the sector erase address, 3 array subscript */ - for (unsigned int count = 0; count < len; count++) { - buffer[count + 4] = writeBuf[count]; /* data is stored from array subscript 4 */ - } - ret = HAL_SPI_WriteBlocking(&g_spiSampleHandle, buffer, (len + 4), MAX_TIMEOUT_VAL); /* len + 4 is total size */ - if (ret != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - return BASE_STATUS_OK; -} - -/** - * @brief Read data in the address. - * @param recvBuf write data buffer. - * @param recvAddr write address. - * @param len data length. - * @retval BASE_StatusType:OK, ERROR. - */ -static BASE_StatusType ReadData(unsigned char *recvBuf, unsigned int recvAddr, unsigned int len) -{ - unsigned char buffer[124] = {0}; /* The array size is 124 bytes */ - BASE_StatusType ret; - buffer[0] = SPI_W25X_READ_DATA; /* Read data command */ - buffer[1] = (recvAddr & 0xFF0000) >> 16; /* Shift right by 16 bits */ - buffer[2] = (recvAddr & 0xFF00) >> 8; /* Shift right by 8 bits, 2 array subscript */ - buffer[3] = (recvAddr & 0xFF); /* Lower 8 bits of the sector erase address, 3 array subscript */ - - unsigned char readBuf[124] = {0}; - /* len + 4 is total size */ - ret = HAL_SPI_WriteReadBlocking(&g_spiSampleHandle, readBuf, (unsigned char *)buffer, (len + 4), MAX_TIMEOUT_VAL); - if (ret != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - for (unsigned int i = 0; i < len; i++) { - recvBuf[i] = readBuf[i + 4]; /* read valid data from array subscript 4 */ - } - return BASE_STATUS_OK; -} - -/** - * @brief Performs read data and write page on w25q32. - * @param None. - * @retval None. - */ -static void SPI_WritePageAndReadData(void) -{ - BASE_StatusType ret; - DBG_PRINTF("write data is : \r\n"); - unsigned int writeLen = 120; /* transfer 120 bytes of data */ - for (unsigned int i = 0; i < writeLen; i++) { - g_writeBuf[i] = i; - DBG_PRINTF("%d ", g_writeBuf[i]); - } - DBG_PRINTF("\r\n"); - ret = WritePage(g_writeBuf, g_flashAddr, writeLen); /* w25q32 single page write */ - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("write page failed!\r\n"); - } - - BASE_FUNC_DELAY_MS(5); /* Delay 5ms */ - - unsigned int recvLen = 120; /* 120 bytes of data needs to be received */ - for (unsigned int index = 0; index < recvLen; index++) { - g_recvBuf[index] = 0; - } - ret = ReadData(g_recvBuf, g_flashAddr, recvLen); /* Read data in the g_flashAddr address */ - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("read page failed!\r\n"); - } else { - DBG_PRINTF("read data is : \r\n"); - for (unsigned int i = 0; i < recvLen; i++) { - DBG_PRINTF("%d ", g_recvBuf[i]); /* print received Data */ - } - DBG_PRINTF("\r\n"); - } -} - -/** - * @brief Performs read and write operations on w25q32. - * @param None. - * @retval None. - */ -static void SPI_W25Q32_TEST(void) -{ - BASE_StatusType ret; - ret = SectorErase(g_flashAddr); /* w25q32 sector erase function */ - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("sector erase failed!\r\n"); - } - BASE_FUNC_DELAY_MS(500); /* Delay 500 ms */ - - SPI_WritePageAndReadData(); - - bool flag = true; - unsigned int recvLen = 120; - for (unsigned int i = 0; i < recvLen; i++) { - if (g_recvBuf[i] != g_writeBuf[i]) { /* compare the transmitted data with the received data */ - DBG_PRINTF("data err! \r\n"); - flag = false; - break; - } - } - if (flag) { - DBG_PRINTF("data correct \r\n"); - } - DBG_PRINTF("\r\n"); -} - -/** - * @brief Spi blocking sample w25q32 processing. - * @param None. - * @retval None. - */ -void W25Q32BlockingSampleProcessing(void) -{ - SystemInit(); - while (1) { - SPI_W25Q32_TEST(); - BASE_FUNC_DELAY_MS(1000); /* Delay 1000 ms */ - } -} diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_kta7953/inc/sample_spi_dma_kta7953.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_kta7953/inc/sample_spi_dma_kta7953.h deleted file mode 100644 index 073d0c1aa..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_kta7953/inc/sample_spi_dma_kta7953.h +++ /dev/null @@ -1,28 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_spi_dma_kta7953.h - * @author MCU Driver Team - * @brief SPI module SPI module sample.. - * @details This file provides sample code for users to help use - * the functionalities of the SPI. - */ -#ifndef McuMagicTag_SAMPLE_SPI_DMA_KTA7953_H -#define McuMagicTag_SAMPLE_SPI_DMA_KTA7953_H - -void Kta7953DmaSampleProcessing(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_kta7953/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_kta7953/init/main.c deleted file mode 100644 index 7978172f9..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_kta7953/init/main.c +++ /dev/null @@ -1,37 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ -#include "feature.h" -#include "main.h" -#include "sample_spi_dma_kta7953.h" - -SPI_Handle g_spiSampleHandle; -UART_Handle g_uart0; - -DMA_Handle g_dmac; - -int main(void) -{ - Kta7953DmaSampleProcessing(); - while (1) { - } - return BASE_STATUS_OK; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_kta7953/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_kta7953/init/main.h deleted file mode 100644 index e93d494b4..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_kta7953/init/main.h +++ /dev/null @@ -1,55 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "spi.h" -#include "crg.h" -#include "dma.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -extern SPI_Handle g_spiSampleHandle; - -extern UART_Handle g_uart0; - -extern DMA_Handle g_dmac; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -void TxSampleCallbackHandle(SPI_Handle *handle); -void RxSampleCallbackHandle(SPI_Handle *handle); -void TxRxSampleCallbackHandle(SPI_Handle *handle); -void ErrorSampleCallbackHandle(SPI_Handle *handle); -void SPICsCallback(SPI_Handle *handle); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_kta7953/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_kta7953/init/system_init.c deleted file mode 100644 index 1e3c7ad30..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_kta7953/init/system_init.c +++ /dev/null @@ -1,256 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" - -#define UART0_BAND_RATE 115200 - -#define SPI_FREQ_SCR 2 -#define SPI_FREQ_CPSDVSR 10 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void DMA_Channel3Init(void *handle) -{ - DMA_ChannelParam dma_param; - dma_param.direction = DMA_PERIPH_TO_MEMORY_BY_DMAC; - dma_param.srcAddrInc = DMA_ADDR_UNALTERED; - dma_param.destAddrInc = DMA_ADDR_UNALTERED; - dma_param.srcPeriph = DMA_REQUEST_SPI_RX; - dma_param.destPeriph = DMA_REQUEST_MEM; - dma_param.srcWidth = DMA_TRANSWIDTH_BYTE; - dma_param.destWidth = DMA_TRANSWIDTH_BYTE; - dma_param.srcBurst = DMA_BURST_LENGTH_1; - dma_param.destBurst = DMA_BURST_LENGTH_1; - dma_param.pHandle = handle; - HAL_DMA_InitChannel(&g_dmac, &dma_param, 3); /* Channel is 3 */ -} - -static void DMA_Channel2Init(void *handle) -{ - DMA_ChannelParam dma_param; - dma_param.direction = DMA_MEMORY_TO_PERIPH_BY_DMAC; - dma_param.srcAddrInc = DMA_ADDR_UNALTERED; - dma_param.destAddrInc = DMA_ADDR_UNALTERED; - dma_param.srcPeriph = DMA_REQUEST_MEM; - dma_param.destPeriph = DMA_REQUEST_SPI_TX; - dma_param.srcWidth = DMA_TRANSWIDTH_BYTE; - dma_param.destWidth = DMA_TRANSWIDTH_BYTE; - dma_param.srcBurst = DMA_BURST_LENGTH_1; - dma_param.destBurst = DMA_BURST_LENGTH_1; - dma_param.pHandle = handle; - HAL_DMA_InitChannel(&g_dmac, &dma_param, 2); /* Channel is 2 */ -} - -static void DMA_Init(void) -{ - g_dmac.baseAddress = DMA; - g_dmac.srcByteOrder = DMA_BYTEORDER_SMALLENDIAN; - g_dmac.destByteOrder = DMA_BYTEORDER_SMALLENDIAN; - g_dmac.irqNumTc = IRQ_DMA_TC; - g_dmac.irqNumError = IRQ_DMA_ERR; - HAL_DMA_IRQService(&g_dmac); - IRQ_EnableN(IRQ_DMA_TC); - IRQ_EnableN(IRQ_DMA_ERR); - HAL_DMA_Init(&g_dmac); - - DMA_Channel3Init((void *)(&g_spiSampleHandle)); - DMA_Channel2Init((void *)(&g_spiSampleHandle)); -} - -__weak void TxSampleCallbackHandle(SPI_Handle *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN TxSampleCallbackHandle */ - /* USER CODE END TxSampleCallbackHandle */ -} - -__weak void RxSampleCallbackHandle(SPI_Handle *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN RxSampleCallbackHandle */ - /* USER CODE END RxSampleCallbackHandle */ -} - -__weak void TxRxSampleCallbackHandle(SPI_Handle *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN TxRxSampleCallbackHandle */ - /* USER CODE END TxRxSampleCallbackHandle */ -} - -__weak void ErrorSampleCallbackHandle(SPI_Handle *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN ErrorSampleCallbackHandle */ - /* USER CODE END ErrorSampleCallbackHandle */ -} - -__weak void SPICsCallback(SPI_Handle *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN SPICsCallback */ - /* USER CODE END SPICsCallback */ -} - -static void SPI_Init(void) -{ - HAL_CRG_IpEnableSet(SPI_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(SPI_BASE, CRG_PLL_NO_PREDV); - - g_spiSampleHandle.baseAddress = SPI; - g_spiSampleHandle.irqNum = IRQ_SPI; - - g_spiSampleHandle.mode = HAL_SPI_MASTER; - g_spiSampleHandle.csMode = SPI_CHIP_SELECT_MODE_INTERNAL; - g_spiSampleHandle.xFerMode = HAL_XFER_MODE_DMA; - g_spiSampleHandle.clkPolarity = 0; - g_spiSampleHandle.clkPhase = 0; - g_spiSampleHandle.endian = HAL_SPI_BIG_ENDIAN; - g_spiSampleHandle.frameFormat = HAL_SPI_MODE_MOTOROLA; - g_spiSampleHandle.dataWidth = SPI_DATA_WIDTH_16BIT; - g_spiSampleHandle.freqScr = SPI_FREQ_SCR; - g_spiSampleHandle.freqCpsdvsr = SPI_FREQ_CPSDVSR; - g_spiSampleHandle.waitVal = 127; /* Wait time is 127 clock */ - g_spiSampleHandle.rxBuff = NULL; - g_spiSampleHandle.txBuff = NULL; - g_spiSampleHandle.transferSize = 0; - g_spiSampleHandle.txCount = 0; - g_spiSampleHandle.rxCount = 0; - g_spiSampleHandle.state = HAL_SPI_STATE_RESET; - g_spiSampleHandle.rxIntSize = SPI_RX_INTERRUPT_SIZE_1; - g_spiSampleHandle.txIntSize = SPI_TX_INTERRUPT_SIZE_1; - g_spiSampleHandle.rxDMABurstSize = SPI_RX_DMA_BURST_SIZE_1; - g_spiSampleHandle.txDMABurstSize = SPI_TX_DMA_BURST_SIZE_1; - g_spiSampleHandle.dmaHandle = &g_dmac; - g_spiSampleHandle.txDmaCh = 2; /* Channel 2 */ - g_spiSampleHandle.rxDmaCh = 3; /* Channel 3 */ - - HAL_SPI_Init(&g_spiSampleHandle); - - HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_TX_COMPLETE_CB_ID, TxSampleCallbackHandle); - HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_RX_COMPLETE_CB_ID, RxSampleCallbackHandle); - HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_TX_RX_COMPLETE_CB_ID, TxRxSampleCallbackHandle); - HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_ERROR_CB_ID, ErrorSampleCallbackHandle); - HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_CS_CB_ID, SPICsCallback); -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); - - g_uart0.baseAddress = UART0; - g_uart0.irqNum = IRQ_UART0; - - g_uart0.baudRate = UART0_BAND_RATE; - g_uart0.dataLength = UART_DATALENGTH_8BIT; - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; - g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart0); -} - -static void IOConfig(void) -{ - IOConfig_RegStruct *iconfig = IOCONFIG; - - iconfig->iocmg_22.BIT.func = 0x5; /* 0x5 is SPI_CLK */ - iconfig->iocmg_22.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_22.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_22.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_22.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_22.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_18.BIT.func = 0x5; /* 0x5 is SPI_CSN0 */ - iconfig->iocmg_18.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_18.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_18.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_18.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_18.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_21.BIT.func = 0x5; /* 0x5 is SPI_CSN1 */ - iconfig->iocmg_21.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_21.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_21.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_21.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_21.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_20.BIT.func = 0x5; /* 0x5 is SPI_RXD */ - iconfig->iocmg_20.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_20.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_20.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_20.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_20.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_19.BIT.func = 0x5; /* 0x5 is SPI_TXD */ - iconfig->iocmg_19.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_19.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_19.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_19.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_19.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ - iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ - iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - DMA_Init(); - SPI_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_kta7953/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_kta7953/readme.md deleted file mode 100644 index 18b334bd1..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_kta7953/readme.md +++ /dev/null @@ -1,20 +0,0 @@ -# 对接ADC芯片kta7953,通过SPI中的DMA方式读取ADC各个通道采样值 -## 关键字: SPI, DMA, kta7953 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、SPI控制器初始化和功能配置。SPI对接ADC芯片kta7953,不断读取ADC芯片kta7953各通道(ch0-ch6)的采样值,以手动模式操作ADC芯片kta7953各个通道,通过DMA方式进行数据搬运。 - -**【示例配置】** -+ 在"SystemInit()”接口中配置SPI时钟极性、时钟相位、帧格式等参数和DMA通道相关参数,其中SPI参数配置需根据对接的芯片进行相关参数配置。 - -+ 定义数组,数组中存放以手动操作模式读取各个通道采样值的命令。 - -+ 采用“HAL_SPI_WriteReadDMA()”进行ch0-ch6通道采样。执行十次后调用“Kta7953BuffPrintf()”打印结果值。 - -+ 编写回调函数代码,使用SPI的DMA方式搬运完成会调用回调函数。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码通过串口打印的方式输出ADC芯片kta7953各通道的采样值,当每次DMA每次搬运完结果进入回调函数。 - -**【注意事项】** -+ 使用此示例代码必须外接ADC芯片kta7953。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_kta7953/src/sample_spi_dma_kta7953.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_kta7953/src/sample_spi_dma_kta7953.c deleted file mode 100644 index 02e495806..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_kta7953/src/sample_spi_dma_kta7953.c +++ /dev/null @@ -1,164 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_spi_dma_kta7953.c - * @author MCU Driver Team - * @brief Sample for SPI Module DMA. - * @details This sample is connected to the ADC chip kta7953 to demonstrate how to operate the HAL interface - * in DMA mode in the SPI driver. - * This sample operates channels 0 to 6 of ADC chip kta7953 in manual mode. - * This sample outputs the sampling values of each channel of the ADC chip kta7953 through the serial port. - * To use this sample, connect the external ADC chip kta7953. - */ -#include "main.h" -#include "spi.h" -#include "debug.h" -#include "interrupt.h" -#include "sample_spi_dma_kta7953.h" - -#define USER_TIMEOUT 0x400 - -#define MANUAL_MODE_SET_CH0 0x1040 -#define MANUAL_MODE_SET_CH1 0x10C0 -#define MANUAL_MODE_SET_CH2 0x1140 -#define MANUAL_MODE_SET_CH3 0x11C0 -#define MANUAL_MODE_SET_CH4 0x1240 -#define MANUAL_MODE_SET_CH5 0x12C0 -#define MANUAL_MODE_SET_CH6 0x1340 - -static unsigned int g_txrxFlag = 0; - -static unsigned short g_tempRdata[10]; -static volatile unsigned short g_outCh = 0; -static volatile unsigned short g_outData = 0; - -/** - * @brief Spi dma sample kta7953 TxRx callback handle. - * @param handle Spi handle. - * @retval None. - */ -void TxRxSampleCallbackHandle(void *handle) -{ - BASE_FUNC_UNUSED(handle); - g_txrxFlag = 1; - DBG_PRINTF("TxRxCpltCallbackHandle\r\n"); -} - -/** - * @brief Spi dma sample kta7953 Tx callback handle. - * @param handle Spi handle. - * @retval None. - */ -void TxSampleCallbackHandle(void *handle) -{ - BASE_FUNC_UNUSED(handle); - g_txrxFlag = 1; - DBG_PRINTF("txCpltCallbackHandle\r\n"); -} - -/** - * @brief Spi dma sample kta7953 Rx callback handle. - * @param handle Spi handle. - * @retval None. - */ -void RxSampleCallbackHandle(void *handle) -{ - BASE_FUNC_UNUSED(handle); - g_txrxFlag = 1; - DBG_PRINTF("RxCpltCallbackHandle\r\n"); -} - -/** - * @brief Spi dma sample kta7953 error callback handle. - * @param handle Spi handle. - * @retval None. - */ -void ErrorSampleCallbackHandle(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("ErrorCallbackHandle\r\n"); -} - -/** - * @brief Spi dma sample kta7953 buffer printf. - * @param None. - * @retval None. - */ -static void Kta7953BuffPrintf(void) -{ - for (int i = 0; i < 10; i++) { /* Print 10 groups of test data. */ - g_outCh = g_tempRdata[i] >> 12; /* Shift right by 12 bits to obtain the lower four bits. */ - g_outData = g_tempRdata[i] & 0x0FFF; /* Mask 0x0FFF */ - DBG_PRINTF("[%d] = CH:%d = %d\r\n", i, g_outCh, g_outData); - } -} - -/** - * @brief Spi dma sample kta7953 processing. - * @param None. - * @retval None. - */ -void Kta7953DmaSampleProcessing(void) -{ - static unsigned short cnt = 0; - unsigned short tempWdata[] = { - MANUAL_MODE_SET_CH0, - MANUAL_MODE_SET_CH1, - MANUAL_MODE_SET_CH2, - MANUAL_MODE_SET_CH3, - MANUAL_MODE_SET_CH4, - MANUAL_MODE_SET_CH5, - MANUAL_MODE_SET_CH6, - 3, - 0, - 0 - }; - unsigned short temp = MANUAL_MODE_SET_CH0; - - SystemInit(); - HAL_SPI_WriteDMA(&g_spiSampleHandle, (unsigned char *)&temp, sizeof(temp)); - while (1) { - if (g_txrxFlag > 0) { - g_txrxFlag = 0; - if (cnt >= 10) { /* Test 10 times in total */ - cnt = 0; - g_txrxFlag = 1; - Kta7953BuffPrintf(); - } - - if (cnt > 7 && cnt < 10) { /* 7 to 10 */ - HAL_SPI_ReadDMA(&g_spiSampleHandle, (unsigned char *)&g_tempRdata[cnt], sizeof(g_tempRdata[cnt])); - cnt++; - } - - if (cnt == 7) { /* 7th */ - HAL_SPI_WriteDMA(&g_spiSampleHandle, (unsigned char *)&tempWdata[cnt], sizeof(tempWdata[cnt])); - g_tempRdata[cnt] = cnt; - cnt++; - } - - if (cnt < 7) { /* First 7 */ - HAL_SPI_WriteReadDMA(&g_spiSampleHandle, - (unsigned char *)&g_tempRdata[cnt], - (unsigned char *)&tempWdata[cnt], - sizeof(tempWdata[cnt])); - cnt++; - } - } - BASE_FUNC_DELAY_MS(300); /* Delay 300ms */ - } -} diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32/inc/sample_spi_dma_w25q32.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32/inc/sample_spi_dma_w25q32.h deleted file mode 100644 index 2bbf3e483..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32/inc/sample_spi_dma_w25q32.h +++ /dev/null @@ -1,28 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_spi_dma_w25q32.h - * @author MCU Driver Team - * @brief SPI module sample. - * @details This file provides sample code for users to help use - * the functionalities of the SPI. - */ -#ifndef SAMPLE_SPI_DMA_W25Q32_H -#define SAMPLE_SPI_DMA_W25Q32_H - -void W25Q32DmaSampleProcessing(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32/init/main.c deleted file mode 100644 index 60492effb..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32/init/main.c +++ /dev/null @@ -1,51 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ - -#include "typedefs.h" -#include "feature.h" -#include "main.h" -/* USER CODE BEGIN 0 */ -/* USER CODE END 0 */ -UART_Handle g_uart0; -SPI_Handle g_spiSampleHandle; -DMA_Handle g_dmac; -/* USER CODE BEGIN 1 */ -/* USER CODE END 1 */ - -int main(void) -{ - /* USER CODE BEGIN 2 */ - /* USER CODE END 2 */ - W25Q32DmaSampleProcessing(); - /* USER CODE BEGIN 3 */ - /* USER CODE END 3 */ - while (1) { - /* USER CODE BEGIN 4 */ - /* USER CODE END 4 */ - } - /* USER CODE BEGIN 5 */ - /* USER CODE END 5 */ - return BASE_STATUS_OK; -} - -/* USER CODE BEGIN 6 */ -/* USER CODE END 6 */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32/init/main.h deleted file mode 100644 index 0159263ea..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32/init/main.h +++ /dev/null @@ -1,59 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "spi.h" -#include "crg.h" -#include "dma.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -#define XTAL_DRV_LEVEL4 0x03U -#define XTAL_DRV_LEVEL3 0x02U -#define XTAL_DRV_LEVEL2 0x01U -#define XTAL_DRV_LEVEL1 0x00U - -extern UART_Handle g_uart0; -extern SPI_Handle g_spiSampleHandle; - -extern DMA_Handle g_dmac; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -void TxSampleCallbackHandle(void *handle); -void RxSampleCallbackHandle(void *handle); -void TxRxSampleCallbackHandle(void *handle); -void ErrorSampleCallbackHandle(void *handle); -void SPICsCallback(void *handle); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32/init/system_init.c deleted file mode 100644 index da38c36f0..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32/init/system_init.c +++ /dev/null @@ -1,250 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" -#include "iocmg_ip.h" - -#define UART0_BAND_RATE 115200 - -#define SPI1_FREQ_SCR 2 -#define SPI1_FREQ_CPSDVSR 10 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; /* crg baseaddress */ - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; - crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; - crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_1; - - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { /* CRG init */ - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void DMA_Channel0Init(void *handle) -{ - DMA_ChannelParam dma_param; - dma_param.direction = DMA_PERIPH_TO_MEMORY_BY_DMAC; /* periph to memory */ - dma_param.srcAddrInc = DMA_ADDR_UNALTERED; - dma_param.destAddrInc = DMA_ADDR_INCREASE; - dma_param.srcPeriph = DMA_REQUEST_SPI1_RX; /* srcperiph is spi1_rx */ - dma_param.destPeriph = DMA_REQUEST_MEM; - dma_param.srcWidth = DMA_TRANSWIDTH_BYTE; - dma_param.destWidth = DMA_TRANSWIDTH_BYTE; - dma_param.srcBurst = DMA_BURST_LENGTH_1; - dma_param.destBurst = DMA_BURST_LENGTH_1; /* destperiph burst size */ - dma_param.pHandle = handle; - HAL_DMA_InitChannel(&g_dmac, &dma_param, DMA_CHANNEL_ZERO); -} - -static void DMA_Channel1Init(void *handle) -{ - DMA_ChannelParam dma_param; - dma_param.direction = DMA_MEMORY_TO_PERIPH_BY_DMAC; /* memory to periph */ - dma_param.srcAddrInc = DMA_ADDR_INCREASE; - dma_param.destAddrInc = DMA_ADDR_UNALTERED; - dma_param.srcPeriph = DMA_REQUEST_MEM; - dma_param.destPeriph = DMA_REQUEST_SPI1_TX; /* srcperiph is spi1_tx */ - dma_param.srcWidth = DMA_TRANSWIDTH_BYTE; - dma_param.destWidth = DMA_TRANSWIDTH_BYTE; - dma_param.srcBurst = DMA_BURST_LENGTH_1; - dma_param.destBurst = DMA_BURST_LENGTH_1; /* destperiph burst size */ - dma_param.pHandle = handle; - HAL_DMA_InitChannel(&g_dmac, &dma_param, DMA_CHANNEL_ONE); -} - -static void DMA_Init(void) -{ - HAL_CRG_IpEnableSet(DMA_BASE, IP_CLK_ENABLE); - g_dmac.baseAddress = DMA; /* dma baseaddress */ - IRQ_Register(IRQ_DMA_TC, HAL_DMA_IrqHandlerTc, &g_dmac); - IRQ_Register(IRQ_DMA_ERR, HAL_DMA_IrqHandlerError, &g_dmac); - IRQ_EnableN(IRQ_DMA_TC); - IRQ_EnableN(IRQ_DMA_ERR); - HAL_DMA_Init(&g_dmac); /* dma init */ - DMA_Channel0Init((void *)(&g_spiSampleHandle)); - HAL_DMA_SetChannelPriorityEx(&g_dmac, DMA_CHANNEL_ZERO, DMA_PRIORITY_HIGHEST); - DMA_Channel1Init((void *)(&g_spiSampleHandle)); /* dma channel 1 init */ - HAL_DMA_SetChannelPriorityEx(&g_dmac, DMA_CHANNEL_ONE, DMA_PRIORITY_HIGHEST); -} - -__weak void TxSampleCallbackHandle(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN TxSampleCallbackHandle */ - /* USER CODE END TxSampleCallbackHandle */ -} - -__weak void RxSampleCallbackHandle(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN RxSampleCallbackHandle */ - /* USER CODE END RxSampleCallbackHandle */ -} - -__weak void TxRxSampleCallbackHandle(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN TxRxSampleCallbackHandle */ - /* USER CODE END TxRxSampleCallbackHandle */ -} - -__weak void ErrorSampleCallbackHandle(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN ErrorSampleCallbackHandle */ - /* USER CODE END ErrorSampleCallbackHandle */ -} - -__weak void SPICsCallback(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN SPICsCallback */ - /* USER CODE END SPICsCallback */ -} - -static void SPI1_Init(void) -{ - HAL_CRG_IpEnableSet(SPI1_BASE, IP_CLK_ENABLE); - - g_spiSampleHandle.baseAddress = SPI1; - - g_spiSampleHandle.mode = HAL_SPI_MASTER; /* spi master */ - g_spiSampleHandle.csMode = SPI_CHIP_SELECT_MODE_CALLBACK; - g_spiSampleHandle.xFerMode = HAL_XFER_MODE_DMA; - g_spiSampleHandle.clkPolarity = HAL_SPI_CLKPOL_0; /* spi ploarity is 0 */ - g_spiSampleHandle.clkPhase = HAL_SPI_CLKPHA_1; - g_spiSampleHandle.endian = HAL_SPI_BIG_ENDIAN; - g_spiSampleHandle.frameFormat = HAL_SPI_MODE_MOTOROLA; /* motorola frame format */ - g_spiSampleHandle.dataWidth = SPI_DATA_WIDTH_8BIT; - g_spiSampleHandle.freqScr = SPI1_FREQ_SCR; - g_spiSampleHandle.freqCpsdvsr = SPI1_FREQ_CPSDVSR; - g_spiSampleHandle.waitEn = BASE_CFG_DISABLE; - g_spiSampleHandle.waitVal = 127; /* mircowire wait time 127 */ - g_spiSampleHandle.rxBuff = NULL; - g_spiSampleHandle.txBuff = NULL; - g_spiSampleHandle.transferSize = 0; - g_spiSampleHandle.txCount = 0; /* transfer count */ - g_spiSampleHandle.rxCount = 0; - g_spiSampleHandle.state = HAL_SPI_STATE_RESET; - g_spiSampleHandle.rxIntSize = SPI_RX_INTERRUPT_SIZE_1; - g_spiSampleHandle.txIntSize = SPI_TX_INTERRUPT_SIZE_1; /* tx interrupt size */ - g_spiSampleHandle.rxDMABurstSize = SPI_RX_DMA_BURST_SIZE_1; - g_spiSampleHandle.txDMABurstSize = SPI_TX_DMA_BURST_SIZE_1; - g_spiSampleHandle.dmaHandle = &g_dmac; - g_spiSampleHandle.txDmaCh = DMA_CHANNEL_ONE; - g_spiSampleHandle.rxDmaCh = DMA_CHANNEL_ZERO; /* dma rx channel is 0 */ - HAL_SPI_Init(&g_spiSampleHandle); - - /* spi register callback */ - HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_TX_COMPLETE_CB_ID, TxSampleCallbackHandle); - HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_RX_COMPLETE_CB_ID, RxSampleCallbackHandle); - HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_TX_RX_COMPLETE_CB_ID, TxRxSampleCallbackHandle); - HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_ERROR_CB_ID, ErrorSampleCallbackHandle); - HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_CS_CB_ID, SPICsCallback); - HAL_SPI_ChipSelectChannelSet(&g_spiSampleHandle, SPI_CHIP_SELECT_CHANNEL_1); -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - - g_uart0.baseAddress = UART0; /* uart0 baseaaddress */ - - g_uart0.baudRate = UART0_BAND_RATE; - g_uart0.dataLength = UART_DATALENGTH_8BIT; /* data length 8 */ - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; /* blocking mode */ - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; - g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; /* fifo size 8 */ - g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; - g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart0); -} - -static void IOConfig(void) -{ - HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO4_6_AS_SPI1_CLK); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO4_6_AS_SPI1_CLK, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO4_6_AS_SPI1_CLK, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO4_6_AS_SPI1_CLK, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO4_6_AS_SPI1_CLK, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO1_4_AS_SPI1_RXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO1_4_AS_SPI1_RXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO1_4_AS_SPI1_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO1_4_AS_SPI1_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO1_4_AS_SPI1_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO3_0_AS_SPI1_CSN1); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO3_0_AS_SPI1_CSN1, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO3_0_AS_SPI1_CSN1, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO3_0_AS_SPI1_CSN1, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO3_0_AS_SPI1_CSN1, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO1_3_AS_SPI1_TXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO1_3_AS_SPI1_TXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO1_3_AS_SPI1_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO1_3_AS_SPI1_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO1_3_AS_SPI1_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO4_5_AS_SPI1_CSN0); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO4_5_AS_SPI1_CSN0, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO4_5_AS_SPI1_CSN0, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO4_5_AS_SPI1_CSN0, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO4_5_AS_SPI1_CSN0, DRIVER_RATE_2); /* Output signal edge fast/slow */ -} - -void SystemInit(void) -{ - IOConfig(); - DMA_Init(); - UART0_Init(); - SPI1_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32/readme.md deleted file mode 100644 index 058bb69dd..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32/readme.md +++ /dev/null @@ -1,20 +0,0 @@ -# 对接flash芯片w25q32,通过SPI的DMA方式写入和读取w25q32芯片中的数据 -## 关键字: SPI, DMA, w25q32芯片 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、SPI控制器初始化和功能配置。SPI对接flash芯片w25q32,对w25q32芯片进行写入120个数据,之后从芯片中再读出120字节数据,数据的搬运由DMA方式完成。 - -**【示例配置】** -+ 在"SystemInit()”接口中配置SPI时钟极性、时钟相位、帧格式等参数和DMA通道相关参数,需根据对接的芯片进行相关参数配置。 - -+ w25q32芯片扇区擦除:调用“SectorErase()”接口先对w25q32芯片进行擦写操作,内部调用接口“SPI_W25Q32_WriteEnable()”向w25q32发送写使能命令,之后发送擦写扇区命令。命令的发送都是调用“HAL_SPI_WriteDMA()”接口。 - -+ 向w25q32芯片写数据:调用“WritePage()”接口进行数据写入,发送页写入命令和需要写入120个数据,调用“HAL_SPI_WriteDMA()”接口。 - -+ 从w25q32芯片读数据:调用“ReadData()”接口进行读数据,发送读命令,调用“HAL_SPI_WriteReadDMA()”接口从芯片读取120个数据。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成后。当每次DMA搬运完成会进入回调函数打印log,串口打印写入的120个数据和读取的120个数据,如果写入和读取的数据是相同则打印data correct,否则打印data err。 - -**【注意事项】** -+ 使用此示例代码必须外接flash芯片w25q32。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32/src/sample_spi_dma_w25q32.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32/src/sample_spi_dma_w25q32.c deleted file mode 100644 index fbf2c1e16..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32/src/sample_spi_dma_w25q32.c +++ /dev/null @@ -1,288 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_spi_dma_w25q32.c - * @author MCU Driver Team - * @brief Sample for SPI Module DMA. - * @details This sample is used to operate the HAL interface on the W25Q32 chip of the flash. - * Write data and read data to address 0 of W25Q32 - */ - -#include "main.h" -#include "spi.h" -#include "debug.h" -#include "sample_spi_dma_w25q32.h" - -#define SPI_W25X_WRITE_ENABLE 0x06 -#define SPI_W25X_SECTOR_ERASE 0x20 -#define SPI_W25X_PAGE_PROGRAM 0x02 -#define SPI_W25X_READ_DATA 0x03 - -static unsigned int g_flashAddr = 0; -static unsigned char g_writeBuf[120] = {0}; -static unsigned char g_recvBuf[120] = {0}; - -/** - * @brief spi chip select callback function. - * @param handle SPI handle. - * @retval None - */ -void SPICsCallback(void *handle) -{ - SPI_Handle *spiHandle = (SPI_Handle *)handle; - /* USER CODE BEGIN SPICsCallback */ - if (g_spiSampleHandle.csCtrl == SPI_CHIP_SELECT) { - HAL_SPI_SetChipConfigSelectEx(spiHandle, HAL_SPI_CHIP_CONFIG_SOFR_UNSET); - } else { - HAL_SPI_SetChipConfigSelectEx(spiHandle, HAL_SPI_CHIP_CONFIG_SOFR_SET); - } - /* USER CODE END SPICsCallback */ -} - - -/** - * @brief Spi dma sample w25q32 TxRx callback handle. - * @param handle SPI handle. - * @retval None. - */ -void TxRxSampleCallbackHandle(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("TxRxCpltCallbackHandle\r\n"); -} - -/** - * @brief Spi dma sample w25q32 Tx callback handle. - * @param handle SPI handle. - * @retval None. - */ -void TxSampleCallbackHandle(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("txCpltCallbackHandle\r\n"); -} - -/** - * @brief Spi dma sample w25q32 Rx callback handle. - * @param handle SPI handle. - * @retval None. - */ -void RxSampleCallbackHandle(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("RxCpltCallbackHandle\r\n"); -} - -/** - * @brief Spi dma sample w25q32 Error callback handle. - * @param handle SPI handle. - * @retval None. - */ -void ErrorSampleCallbackHandle(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("ErrorCallbackHandle\r\n"); -} - -/** - * @brief w25q32 enable the write function. - * @param None. - * @retval BASE_StatusType:OK, ERROR. - */ -static BASE_StatusType SPI_W25Q32_WriteEnable(void) -{ - unsigned char temp = SPI_W25X_WRITE_ENABLE; /* Write enable command */ - BASE_StatusType ret; - ret = HAL_SPI_WriteDMA(&g_spiSampleHandle, (unsigned char *)&temp, sizeof(temp)); - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("enable error!\r\n"); - return BASE_STATUS_ERROR; - } - return BASE_STATUS_OK; -} - -/** - * @brief w25q32 sector erase function. - * @param sectorEraseAddr sector erase address. - * @retval BASE_StatusType:OK, ERROR. - */ -static BASE_StatusType SectorErase(unsigned int sectorEraseAddr) -{ - BASE_StatusType ret; - ret = SPI_W25Q32_WriteEnable(); - if (ret != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - BASE_FUNC_DELAY_MS(20); /* delay 20 ms */ - - unsigned char buffer[4] = {0}; - buffer[0] = SPI_W25X_SECTOR_ERASE; /* Sector erase command */ - buffer[1] = (sectorEraseAddr & 0xFF0000) >> 16; /* Shift right by 16 bits */ - buffer[2] = (sectorEraseAddr & 0xFF00) >> 8; /* Shift right by 8 bits, 2 array subscript */ - buffer[3] = (sectorEraseAddr & 0xFF); /* Lower 8 bits of the sector erase address, 3 array subscript */ - ret = HAL_SPI_WriteDMA(&g_spiSampleHandle, buffer, sizeof(buffer)); - if (ret != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - return BASE_STATUS_OK; -} - -/** - * @brief w25q32 single page write, maximum 256 bytes. - * @param writeBuf write data buffer. - * @param writeAddr write address. - * @param len data length. - * @retval BASE_StatusType:OK, ERROR. - */ -static BASE_StatusType WritePage(unsigned char *writeBuf, unsigned int writeAddr, unsigned int len) -{ - BASE_StatusType ret; - ret = SPI_W25Q32_WriteEnable(); /* enable the write */ - if (ret != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - BASE_FUNC_DELAY_MS(20); /* Delay 20 ms */ - - unsigned char buffer[124] = {0}; /* transmit 124 bytes: 4-byte command and 120-byte data */ - - buffer[0] = SPI_W25X_PAGE_PROGRAM; /* Page Program command */ - buffer[1] = (writeAddr & 0xFF0000) >> 16; /* Shift right by 16 bits */ - buffer[2] = (writeAddr & 0xFF00) >> 8; /* Shift right by 8 bits, 2 array subscript */ - buffer[3] = (writeAddr & 0xFF); /* Lower 8 bits of the sector erase address, 3 array subscript */ - for (unsigned int count = 0; count < len; count++) { - buffer[count + 4] = writeBuf[count]; /* data is stored from array subscript 4 */ - } - ret = HAL_SPI_WriteDMA(&g_spiSampleHandle, buffer, (len + 4)); /* len + 4 is total size */ - BASE_FUNC_DELAY_MS(2000); /* delay 2000 ms, wait until the DMA complete the data transfer. */ - if (ret != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - return BASE_STATUS_OK; -} - -/** - * @brief Read data in the address. - * @param recvBuf write data buffer. - * @param recvAddr write address. - * @param len data length. - * @retval BASE_StatusType:OK, ERROR. - */ -static BASE_StatusType ReadData(unsigned char *recvBuf, unsigned int recvAddr, unsigned int len) -{ - unsigned char buffer[124] = {0}; /* The array size is 124 bytes */ - BASE_StatusType ret; - buffer[0] = SPI_W25X_READ_DATA; /* Read data command */ - buffer[1] = (recvAddr & 0xFF0000) >> 16; /* Shift right by 16 bits */ - buffer[2] = (recvAddr & 0xFF00) >> 8; /* Shift right by 8 bits, 2 array subscript */ - buffer[3] = (recvAddr & 0xFF); /* Lower 8 bits of the sector erase address, 3 array subscript */ - - unsigned char readBuf[124] = {0}; - /* len + 4 is total size */ - ret = HAL_SPI_WriteReadDMA(&g_spiSampleHandle, readBuf, (unsigned char *)buffer, (len + 4)); - if (ret != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - BASE_FUNC_DELAY_MS(2000); /* delay 2000 ms, wait until the DMA complete the data transfer. */ - for (unsigned int i = 0; i < len; i++) { - recvBuf[i] = readBuf[i + 4]; /* read valid data from array subscript 4 */ - } - return BASE_STATUS_OK; -} - -/** - * @brief Performs read data and write page on w25q32. - * @param None. - * @retval None. - */ -static void SPI_WritePageAndReadData(void) -{ - BASE_StatusType ret; - DBG_PRINTF("write data is : \r\n"); - unsigned int writeLen = 120; /* transfer 120 bytes of data */ - for (unsigned int i = 0; i < writeLen; i++) { - g_writeBuf[i] = i; - DBG_PRINTF("%d ", g_writeBuf[i]); - } - DBG_PRINTF("\r\n"); - ret = WritePage(g_writeBuf, g_flashAddr, writeLen); /* w25q32 single page write */ - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("write page failed!\r\n"); - } - - BASE_FUNC_DELAY_MS(5); /* Delay 5ms */ - - unsigned int recvLen = 120; /* 120 bytes of data needs to be received */ - for (unsigned int index = 0; index < recvLen; index++) { - g_recvBuf[index] = 0; - } - ret = ReadData(g_recvBuf, g_flashAddr, recvLen); /* Read data in the g_flashAddr address */ - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("read page failed!\r\n"); - } else { - DBG_PRINTF("read data is : \r\n"); - for (unsigned int i = 0; i < recvLen; i++) { - DBG_PRINTF("%d ", g_recvBuf[i]); /* print received Data */ - } - DBG_PRINTF("\r\n"); - } -} - -/** - * @brief Performs read and write operations on w25q32. - * @param None. - * @retval None. - */ -static void SPI_W25Q32_TEST(void) -{ - BASE_StatusType ret; - ret = SectorErase(g_flashAddr); /* w25q32 sector erase function */ - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("sector erase failed!\r\n"); - } - BASE_FUNC_DELAY_MS(500); /* Delay 500 ms */ - - SPI_WritePageAndReadData(); - - bool flag = true; - unsigned int recvLen = 120; - for (unsigned int i = 0; i < recvLen; i++) { - if (g_recvBuf[i] != g_writeBuf[i]) { /* compare the transmitted data with the received data */ - DBG_PRINTF("data err! \r\n"); - flag = false; - break; - } - } - if (flag) { - DBG_PRINTF("data correct \r\n"); - } - DBG_PRINTF("\r\n"); -} - -/** - * @brief Spi dma sample w25q32 processing. - * @param None. - * @retval None. - */ -void W25Q32DmaSampleProcessing(void) -{ - SystemInit(); - HAL_SPI_SetChipConfigSelectEx(&g_spiSampleHandle, HAL_SPI_CHIP_CONFIG_SOFR_SET); - while (1) { - SPI_W25Q32_TEST(); - BASE_FUNC_DELAY_MS(2000); /* Delay 2000 ms */ - } -} diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32_internal/inc/sample_spi_dma_w25q32_internal.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32_internal/inc/sample_spi_dma_w25q32_internal.h deleted file mode 100644 index 3f37aadf6..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32_internal/inc/sample_spi_dma_w25q32_internal.h +++ /dev/null @@ -1,28 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_spi_dma_w25q32_internal.h - * @author MCU Driver Team - * @brief SPI module sample. - * @details This file provides sample code for users to help use - * the functionalities of the SPI. - */ -#ifndef SAMPLE_SPI_DMA_W25Q32_INTERNAL_H -#define SAMPLE_SPI_DMA_W25Q32_INTERNAL_H - -void W25Q32DmaSampleProcessing(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32_internal/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32_internal/init/main.c deleted file mode 100644 index 65d342632..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32_internal/init/main.c +++ /dev/null @@ -1,52 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ - -#include "typedefs.h" -#include "feature.h" -#include "sample_spi_dma_w25q32_internal.h" -#include "main.h" -/* USER CODE BEGIN 0 */ -/* USER CODE END 0 */ -SPI_Handle g_spiSampleHandle; -UART_Handle g_uart0; -DMA_Handle g_dmac; -/* USER CODE BEGIN 1 */ -/* USER CODE END 1 */ - -int main(void) -{ - /* USER CODE BEGIN 2 */ - /* USER CODE END 2 */ - W25Q32DmaSampleProcessing(); - /* USER CODE BEGIN 3 */ - /* USER CODE END 3 */ - while (1) { - /* USER CODE BEGIN 4 */ - /* USER CODE END 4 */ - } - /* USER CODE BEGIN 5 */ - /* USER CODE END 5 */ - return BASE_STATUS_OK; -} - -/* USER CODE BEGIN 6 */ -/* USER CODE END 6 */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32_internal/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32_internal/init/main.h deleted file mode 100644 index ad884564e..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32_internal/init/main.h +++ /dev/null @@ -1,59 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "spi.h" -#include "crg.h" -#include "dma.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -#define XTAL_DRV_LEVEL4 0x03U -#define XTAL_DRV_LEVEL3 0x02U -#define XTAL_DRV_LEVEL2 0x01U -#define XTAL_DRV_LEVEL1 0x00U - -extern SPI_Handle g_spiSampleHandle; -extern UART_Handle g_uart0; - -extern DMA_Handle g_dmac; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -void TxSampleCallbackHandle(void *handle); -void RxSampleCallbackHandle(void *handle); -void TxRxSampleCallbackHandle(void *handle); -void ErrorSampleCallbackHandle(void *handle); -void SPICsCallback(void *handle); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32_internal/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32_internal/init/system_init.c deleted file mode 100644 index dde023764..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32_internal/init/system_init.c +++ /dev/null @@ -1,250 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" -#include "iocmg.h" - -#define UART0_BAND_RATE 115200 - -#define SPI_FREQ_SCR 2 -#define SPI_FREQ_CPSDVSR 10 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; - - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { /* CRG init */ - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void DMA_Channel1Init(void *handle) -{ - DMA_ChannelParam dma_param; - dma_param.direction = DMA_PERIPH_TO_MEMORY_BY_DMAC; /* periph to memory */ - dma_param.srcAddrInc = DMA_ADDR_UNALTERED; - dma_param.destAddrInc = DMA_ADDR_INCREASE; - dma_param.srcPeriph = DMA_REQUEST_SPI_RX; /* srcperiph is spi1_rx */ - dma_param.destPeriph = DMA_REQUEST_MEM; - dma_param.srcWidth = DMA_TRANSWIDTH_BYTE; - dma_param.destWidth = DMA_TRANSWIDTH_BYTE; - dma_param.srcBurst = DMA_BURST_LENGTH_1; - dma_param.destBurst = DMA_BURST_LENGTH_1; /* destperiph burst size */ - dma_param.pHandle = handle; - HAL_DMA_InitChannel(&g_dmac, &dma_param, DMA_CHANNEL_ONE); -} - -static void DMA_Channel0Init(void *handle) -{ - DMA_ChannelParam dma_param; - dma_param.direction = DMA_MEMORY_TO_PERIPH_BY_DMAC; /* memory to periph */ - dma_param.srcAddrInc = DMA_ADDR_INCREASE; - dma_param.destAddrInc = DMA_ADDR_UNALTERED; - dma_param.srcPeriph = DMA_REQUEST_MEM; - dma_param.destPeriph = DMA_REQUEST_SPI_TX; /* srcperiph is spi1_tx */ - dma_param.srcWidth = DMA_TRANSWIDTH_BYTE; - dma_param.destWidth = DMA_TRANSWIDTH_BYTE; - dma_param.srcBurst = DMA_BURST_LENGTH_1; - dma_param.destBurst = DMA_BURST_LENGTH_1; /* destperiph burst size */ - dma_param.pHandle = handle; - HAL_DMA_InitChannel(&g_dmac, &dma_param, DMA_CHANNEL_ZERO); -} - -static void DMA_Init(void) -{ - HAL_CRG_IpEnableSet(DMA_BASE, IP_CLK_ENABLE); - g_dmac.baseAddress = DMA; /* dma baseaddress */ - g_dmac.handleEx.srcByteOrder = DMA_BYTEORDER_SMALLENDIAN; - g_dmac.handleEx.destByteOrder = DMA_BYTEORDER_SMALLENDIAN; - IRQ_Register(IRQ_DMA_TC, HAL_DMA_IrqHandlerTc, &g_dmac); - IRQ_Register(IRQ_DMA_ERR, HAL_DMA_IrqHandlerError, &g_dmac); - IRQ_EnableN(IRQ_DMA_TC); - IRQ_EnableN(IRQ_DMA_ERR); - HAL_DMA_Init(&g_dmac); /* dma init */ - - DMA_Channel1Init((void *)(&g_spiSampleHandle)); /* dma channel 1 init */ - DMA_Channel0Init((void *)(&g_spiSampleHandle)); -} - -__weak void TxSampleCallbackHandle(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN SPI_TX_COMPLETE_CB_ID */ - /* USER CODE END SPI_TX_COMPLETE_CB_ID */ -} - -__weak void RxSampleCallbackHandle(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN SPI_RX_COMPLETE_CB_ID */ - /* USER CODE END SPI_RX_COMPLETE_CB_ID */ -} - -__weak void TxRxSampleCallbackHandle(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN SPI_TX_RX_COMPLETE_CB_ID */ - /* USER CODE END SPI_TX_RX_COMPLETE_CB_ID */ -} - -__weak void ErrorSampleCallbackHandle(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN SPI_ERROR_CB_ID */ - /* USER CODE END SPI_ERROR_CB_ID */ -} - -__weak void SPICsCallback(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN SPI_CS_CB_ID */ - /* USER CODE END SPI_CS_CB_ID */ -} - -static void SPI_Init(void) -{ - HAL_CRG_IpEnableSet(SPI_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(SPI_BASE, CRG_PLL_NO_PREDV); - - g_spiSampleHandle.baseAddress = SPI; - - g_spiSampleHandle.mode = HAL_SPI_MASTER; /* spi master */ - g_spiSampleHandle.csMode = SPI_CHIP_SELECT_MODE_INTERNAL; - g_spiSampleHandle.xFerMode = HAL_XFER_MODE_DMA; - g_spiSampleHandle.clkPolarity = HAL_SPI_CLKPOL_0; /* spi ploarity is 0 */ - g_spiSampleHandle.clkPhase = HAL_SPI_CLKPHA_1; - g_spiSampleHandle.endian = HAL_SPI_BIG_ENDIAN; - g_spiSampleHandle.frameFormat = HAL_SPI_MODE_MOTOROLA; /* motorola frame format */ - g_spiSampleHandle.dataWidth = SPI_DATA_WIDTH_8BIT; - g_spiSampleHandle.freqScr = SPI_FREQ_SCR; - g_spiSampleHandle.freqCpsdvsr = SPI_FREQ_CPSDVSR; - g_spiSampleHandle.waitEn = BASE_CFG_DISABLE; - g_spiSampleHandle.waitVal = 127; /* mircowire wait time 127 */ - g_spiSampleHandle.rxBuff = NULL; - g_spiSampleHandle.txBuff = NULL; - g_spiSampleHandle.transferSize = 0; - g_spiSampleHandle.txCount = 0; /* transfer count */ - g_spiSampleHandle.rxCount = 0; - g_spiSampleHandle.state = HAL_SPI_STATE_RESET; - g_spiSampleHandle.rxIntSize = SPI_RX_INTERRUPT_SIZE_1; - g_spiSampleHandle.txIntSize = SPI_TX_INTERRUPT_SIZE_1; /* tx interrupt size */ - g_spiSampleHandle.rxDMABurstSize = SPI_RX_DMA_BURST_SIZE_1; - g_spiSampleHandle.txDMABurstSize = SPI_TX_DMA_BURST_SIZE_1; - g_spiSampleHandle.dmaHandle = &g_dmac; - g_spiSampleHandle.txDmaCh = 0; /* DMA Channel 0 */ - g_spiSampleHandle.rxDmaCh = 1; /* DMA Channel 1 */ - HAL_SPI_Init(&g_spiSampleHandle); - /* spi register callback */ - HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_TX_COMPLETE_CB_ID, TxSampleCallbackHandle); - HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_RX_COMPLETE_CB_ID, RxSampleCallbackHandle); - HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_TX_RX_COMPLETE_CB_ID, TxRxSampleCallbackHandle); - HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_ERROR_CB_ID, ErrorSampleCallbackHandle); - HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_CS_CB_ID, SPICsCallback); -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); - - g_uart0.baseAddress = UART0; /* uart0 baseaaddress */ - - g_uart0.baudRate = UART0_BAND_RATE; - g_uart0.dataLength = UART_DATALENGTH_8BIT; /* data length 8 */ - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; /* blocking mode */ - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; - g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart0); -} - -static void IOConfig(void) -{ - SYSCTRL0->SC_SYS_STAT.BIT.update_mode = 0; - SYSCTRL0->SC_SYS_STAT.BIT.update_mode_clear = 1; - HAL_IOCMG_SetPinAltFuncMode(IO6_AS_SSP0_CLK); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(IO6_AS_SSP0_CLK, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(IO6_AS_SSP0_CLK, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(IO6_AS_SSP0_CLK, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(IO6_AS_SSP0_CLK, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(IO3_AS_SSP0_TXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(IO3_AS_SSP0_TXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(IO3_AS_SSP0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(IO3_AS_SSP0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(IO3_AS_SSP0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(IO4_AS_SSP0_RXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(IO4_AS_SSP0_RXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(IO4_AS_SSP0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(IO4_AS_SSP0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(IO4_AS_SSP0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(IO2_AS_SSP0_CSN0); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(IO2_AS_SSP0_CSN0, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(IO2_AS_SSP0_CSN0, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(IO2_AS_SSP0_CSN0, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(IO2_AS_SSP0_CSN0, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(IO5_AS_SSP0_CSN1); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(IO5_AS_SSP0_CSN1, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(IO5_AS_SSP0_CSN1, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(IO5_AS_SSP0_CSN1, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(IO5_AS_SSP0_CSN1, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(IO52_AS_UART0_TXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(IO52_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(IO52_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(IO52_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(IO52_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - /* UART RX recommend PULL_UP */ - HAL_IOCMG_SetPinAltFuncMode(IO53_AS_UART0_RXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(IO53_AS_UART0_RXD, PULL_UP); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(IO53_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(IO53_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(IO53_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ -} - -void SystemInit(void) -{ - IOConfig(); - DMA_Init(); - UART0_Init(); - SPI_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32_internal/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32_internal/readme.md deleted file mode 100644 index 058bb69dd..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32_internal/readme.md +++ /dev/null @@ -1,20 +0,0 @@ -# 对接flash芯片w25q32,通过SPI的DMA方式写入和读取w25q32芯片中的数据 -## 关键字: SPI, DMA, w25q32芯片 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、SPI控制器初始化和功能配置。SPI对接flash芯片w25q32,对w25q32芯片进行写入120个数据,之后从芯片中再读出120字节数据,数据的搬运由DMA方式完成。 - -**【示例配置】** -+ 在"SystemInit()”接口中配置SPI时钟极性、时钟相位、帧格式等参数和DMA通道相关参数,需根据对接的芯片进行相关参数配置。 - -+ w25q32芯片扇区擦除:调用“SectorErase()”接口先对w25q32芯片进行擦写操作,内部调用接口“SPI_W25Q32_WriteEnable()”向w25q32发送写使能命令,之后发送擦写扇区命令。命令的发送都是调用“HAL_SPI_WriteDMA()”接口。 - -+ 向w25q32芯片写数据:调用“WritePage()”接口进行数据写入,发送页写入命令和需要写入120个数据,调用“HAL_SPI_WriteDMA()”接口。 - -+ 从w25q32芯片读数据:调用“ReadData()”接口进行读数据,发送读命令,调用“HAL_SPI_WriteReadDMA()”接口从芯片读取120个数据。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成后。当每次DMA搬运完成会进入回调函数打印log,串口打印写入的120个数据和读取的120个数据,如果写入和读取的数据是相同则打印data correct,否则打印data err。 - -**【注意事项】** -+ 使用此示例代码必须外接flash芯片w25q32。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32_internal/src/sample_spi_dma_w25q32_internal.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32_internal/src/sample_spi_dma_w25q32_internal.c deleted file mode 100644 index 002cbb012..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32_internal/src/sample_spi_dma_w25q32_internal.c +++ /dev/null @@ -1,269 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_spi_dma_w25q32_internal.c - * @author MCU Driver Team - * @brief Sample for SPI Module DMA. - * @details This sample is used to operate the HAL interface on the W25Q32 chip of the flash. - * Write data and read data to address 0 of W25Q32 - */ - -#include "main.h" -#include "spi.h" -#include "debug.h" -#include "sample_spi_dma_w25q32_internal.h" - -#define SPI_W25X_WRITE_ENABLE 0x06 -#define SPI_W25X_SECTOR_ERASE 0x20 -#define SPI_W25X_PAGE_PROGRAM 0x02 -#define SPI_W25X_READ_DATA 0x03 - -static unsigned int g_flashAddr = 0; -static unsigned char g_writeBuf[120] = {0}; -static unsigned char g_recvBuf[120] = {0}; - -/** - * @brief Spi dma sample w25q32 TxRx callback handle. - * @param handle SPI handle. - * @retval None. - */ -void TxRxSampleCallbackHandle(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("TxRxCpltCallbackHandle\r\n"); -} - -/** - * @brief Spi dma sample w25q32 Tx callback handle. - * @param handle SPI handle. - * @retval None. - */ -void TxSampleCallbackHandle(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("txCpltCallbackHandle\r\n"); -} - -/** - * @brief Spi dma sample w25q32 Rx callback handle. - * @param handle SPI handle. - * @retval None. - */ -void RxSampleCallbackHandle(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("RxCpltCallbackHandle\r\n"); -} - -/** - * @brief Spi dma sample w25q32 Error callback handle. - * @param handle SPI handle. - * @retval None. - */ -void ErrorSampleCallbackHandle(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("ErrorCallbackHandle\r\n"); -} - -/** - * @brief w25q32 enable the write function. - * @param None. - * @retval BASE_StatusType:OK, ERROR. - */ -static BASE_StatusType SPI_W25Q32_WriteEnable(void) -{ - unsigned char temp = SPI_W25X_WRITE_ENABLE; /* Write enable command */ - BASE_StatusType ret; - ret = HAL_SPI_WriteDMA(&g_spiSampleHandle, (unsigned char *)&temp, sizeof(temp)); - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("enable error!\r\n"); - return BASE_STATUS_ERROR; - } - return BASE_STATUS_OK; -} - -/** - * @brief w25q32 sector erase function. - * @param sectorEraseAddr sector erase address. - * @retval BASE_StatusType:OK, ERROR. - */ -static BASE_StatusType SectorErase(unsigned int sectorEraseAddr) -{ - BASE_StatusType ret; - ret = SPI_W25Q32_WriteEnable(); - if (ret != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - BASE_FUNC_DELAY_MS(20); /* delay 20 ms */ - - unsigned char buffer[4] = {0}; - buffer[0] = SPI_W25X_SECTOR_ERASE; /* Sector erase command */ - buffer[1] = (sectorEraseAddr & 0xFF0000) >> 16; /* Shift right by 16 bits */ - buffer[2] = (sectorEraseAddr & 0xFF00) >> 8; /* Shift right by 8 bits, 2 array subscript */ - buffer[3] = (sectorEraseAddr & 0xFF); /* Lower 8 bits of the sector erase address, 3 array subscript */ - ret = HAL_SPI_WriteDMA(&g_spiSampleHandle, buffer, sizeof(buffer)); - if (ret != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - return BASE_STATUS_OK; -} - -/** - * @brief w25q32 single page write, maximum 256 bytes. - * @param writeBuf write data buffer. - * @param writeAddr write address. - * @param len data length. - * @retval BASE_StatusType:OK, ERROR. - */ -static BASE_StatusType WritePage(unsigned char *writeBuf, unsigned int writeAddr, unsigned int len) -{ - BASE_StatusType ret; - ret = SPI_W25Q32_WriteEnable(); /* enable the write */ - if (ret != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - BASE_FUNC_DELAY_MS(20); /* Delay 20 ms */ - - unsigned char buffer[124] = {0}; /* transmit 124 bytes: 4-byte command and 120-byte data */ - - buffer[0] = SPI_W25X_PAGE_PROGRAM; /* Page Program command */ - buffer[1] = (writeAddr & 0xFF0000) >> 16; /* Shift right by 16 bits */ - buffer[2] = (writeAddr & 0xFF00) >> 8; /* Shift right by 8 bits, 2 array subscript */ - buffer[3] = (writeAddr & 0xFF); /* Lower 8 bits of the sector erase address, 3 array subscript */ - for (unsigned int count = 0; count < len; count++) { - buffer[count + 4] = writeBuf[count]; /* data is stored from array subscript 4 */ - } - ret = HAL_SPI_WriteDMA(&g_spiSampleHandle, buffer, (len + 4)); /* len + 4 is total size */ - BASE_FUNC_DELAY_MS(2000); /* delay 2000 ms, wait until the DMA complete the data transfer. */ - if (ret != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - return BASE_STATUS_OK; -} - -/** - * @brief Read data in the address. - * @param recvBuf write data buffer. - * @param recvAddr write address. - * @param len data length. - * @retval BASE_StatusType:OK, ERROR. - */ -static BASE_StatusType ReadData(unsigned char *recvBuf, unsigned int recvAddr, unsigned int len) -{ - unsigned char buffer[124] = {0}; /* The array size is 124 bytes */ - BASE_StatusType ret; - buffer[0] = SPI_W25X_READ_DATA; /* Read data command */ - buffer[1] = (recvAddr & 0xFF0000) >> 16; /* Shift right by 16 bits */ - buffer[2] = (recvAddr & 0xFF00) >> 8; /* Shift right by 8 bits, 2 array subscript */ - buffer[3] = (recvAddr & 0xFF); /* Lower 8 bits of the sector erase address, 3 array subscript */ - - unsigned char readBuf[124] = {0}; - /* len + 4 is total size */ - ret = HAL_SPI_WriteReadDMA(&g_spiSampleHandle, readBuf, (unsigned char *)buffer, (len + 4)); - if (ret != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - BASE_FUNC_DELAY_MS(2000); /* delay 2000 ms, wait until the DMA complete the data transfer. */ - for (unsigned int i = 0; i < len; i++) { - recvBuf[i] = readBuf[i + 4]; /* read valid data from array subscript 4 */ - } - return BASE_STATUS_OK; -} - -/** - * @brief Performs read data and write page on w25q32. - * @param None. - * @retval None. - */ -static void SPI_WritePageAndReadData(void) -{ - BASE_StatusType ret; - DBG_PRINTF("write data is : \r\n"); - unsigned int writeLen = 120; /* transfer 120 bytes of data */ - for (unsigned int i = 0; i < writeLen; i++) { - g_writeBuf[i] = i; - DBG_PRINTF("%d ", g_writeBuf[i]); - } - DBG_PRINTF("\r\n"); - ret = WritePage(g_writeBuf, g_flashAddr, writeLen); /* w25q32 single page write */ - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("write page failed!\r\n"); - } - - BASE_FUNC_DELAY_MS(5); /* Delay 5ms */ - - unsigned int recvLen = 120; /* 120 bytes of data needs to be received */ - for (unsigned int index = 0; index < recvLen; index++) { - g_recvBuf[index] = 0; - } - ret = ReadData(g_recvBuf, g_flashAddr, recvLen); /* Read data in the g_flashAddr address */ - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("read page failed!\r\n"); - } else { - DBG_PRINTF("read data is : \r\n"); - for (unsigned int i = 0; i < recvLen; i++) { - DBG_PRINTF("%d ", g_recvBuf[i]); /* print received Data */ - } - DBG_PRINTF("\r\n"); - } -} - -/** - * @brief Performs read and write operations on w25q32. - * @param None. - * @retval None. - */ -static void SPI_W25Q32_TEST(void) -{ - BASE_StatusType ret; - ret = SectorErase(g_flashAddr); /* w25q32 sector erase function */ - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("sector erase failed!\r\n"); - } - BASE_FUNC_DELAY_MS(500); /* Delay 500 ms */ - - SPI_WritePageAndReadData(); - - bool flag = true; - unsigned int recvLen = 120; - for (unsigned int i = 0; i < recvLen; i++) { - if (g_recvBuf[i] != g_writeBuf[i]) { /* compare the transmitted data with the received data */ - DBG_PRINTF("data err! \r\n"); - flag = false; - break; - } - } - if (flag) { - DBG_PRINTF("data correct \r\n"); - } - DBG_PRINTF("\r\n"); -} - -/** - * @brief Spi dma sample w25q32 processing. - * @param None. - * @retval None. - */ -void W25Q32DmaSampleProcessing(void) -{ - SystemInit(); - while (1) { - SPI_W25Q32_TEST(); - BASE_FUNC_DELAY_MS(2000); /* Delay 2000 ms */ - } -} diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_kta7953/inc/sample_spi_interrupt_kta7953.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_kta7953/inc/sample_spi_interrupt_kta7953.h deleted file mode 100644 index 38a53dcaf..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_kta7953/inc/sample_spi_interrupt_kta7953.h +++ /dev/null @@ -1,28 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_spi_interrupt_kta7953.h - * @author MCU Driver Team - * @brief SPI module SPI module sample.. - * @details This file provides sample code for users to help use - * the functionalities of the SPI. - */ -#ifndef McuMagicTag_SAMPLE_SPI_INTERRUPT_KTA7953_H -#define McuMagicTag_SAMPLE_SPI_INTERRUPT_KTA7953_H - -void Kta7953InterruptSampleProcessing(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_kta7953/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_kta7953/init/main.c deleted file mode 100644 index 3cd3d19de..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_kta7953/init/main.c +++ /dev/null @@ -1,35 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ -#include "feature.h" -#include "main.h" -#include "sample_spi_interrupt_kta7953.h" - -SPI_Handle g_spiSampleHandle; -UART_Handle g_uart0; - -int main(void) -{ - Kta7953InterruptSampleProcessing(); - while (1) { - } - return BASE_STATUS_OK; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_kta7953/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_kta7953/init/main.h deleted file mode 100644 index 93fabf199..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_kta7953/init/main.h +++ /dev/null @@ -1,52 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "spi.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -extern SPI_Handle g_spiSampleHandle; - -extern UART_Handle g_uart0; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -void TxSampleCallbackHandle(SPI_Handle *handle); -void RxSampleCallbackHandle(SPI_Handle *handle); -void TxRxSampleCallbackHandle(SPI_Handle *handle); -void ErrorSampleCallbackHandle(SPI_Handle *handle); -void SPICsCallback(SPI_Handle *handle); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_kta7953/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_kta7953/init/system_init.c deleted file mode 100644 index 8fab41759..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_kta7953/init/system_init.c +++ /dev/null @@ -1,207 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" - -#define UART0_BAND_RATE 115200 - -#define SPI_FREQ_SCR 2 -#define SPI_FREQ_CPSDVSR 10 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -__weak void TxSampleCallbackHandle(SPI_Handle *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN TxSampleCallbackHandle */ - /* USER CODE END TxSampleCallbackHandle */ -} - -__weak void RxSampleCallbackHandle(SPI_Handle *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN RxSampleCallbackHandle */ - /* USER CODE END RxSampleCallbackHandle */ -} - -__weak void TxRxSampleCallbackHandle(SPI_Handle *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN TxRxSampleCallbackHandle */ - /* USER CODE END TxRxSampleCallbackHandle */ -} - -__weak void ErrorSampleCallbackHandle(SPI_Handle *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN ErrorSampleCallbackHandle */ - /* USER CODE END ErrorSampleCallbackHandle */ -} - -__weak void SPICsCallback(SPI_Handle *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN SPICsCallback */ - /* USER CODE END SPICsCallback */ -} - -static void SPI_Init(void) -{ - HAL_CRG_IpEnableSet(SPI_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(SPI_BASE, CRG_PLL_NO_PREDV); - - g_spiSampleHandle.baseAddress = SPI; - g_spiSampleHandle.irqNum = IRQ_SPI; - - g_spiSampleHandle.mode = HAL_SPI_MASTER; - g_spiSampleHandle.csMode = SPI_CHIP_SELECT_MODE_INTERNAL; - g_spiSampleHandle.xFerMode = HAL_XFER_MODE_INTERRUPTS; - g_spiSampleHandle.clkPolarity = 0; - g_spiSampleHandle.clkPhase = 0; - g_spiSampleHandle.endian = HAL_SPI_BIG_ENDIAN; - g_spiSampleHandle.frameFormat = HAL_SPI_MODE_MOTOROLA; - g_spiSampleHandle.dataWidth = SPI_DATA_WIDTH_16BIT; - g_spiSampleHandle.freqScr = SPI_FREQ_SCR; - g_spiSampleHandle.freqCpsdvsr = SPI_FREQ_CPSDVSR; - g_spiSampleHandle.waitVal = 127; /* Wait time is 127 clock */ - g_spiSampleHandle.rxBuff = NULL; - g_spiSampleHandle.txBuff = NULL; - g_spiSampleHandle.transferSize = 0; - g_spiSampleHandle.txCount = 0; - g_spiSampleHandle.rxCount = 0; - g_spiSampleHandle.state = HAL_SPI_STATE_RESET; - g_spiSampleHandle.rxIntSize = SPI_RX_INTERRUPT_SIZE_1; - g_spiSampleHandle.txIntSize = SPI_TX_INTERRUPT_SIZE_32; - g_spiSampleHandle.rxDMABurstSize = SPI_RX_DMA_BURST_SIZE_1; - g_spiSampleHandle.txDMABurstSize = SPI_TX_DMA_BURST_SIZE_1; - - HAL_SPI_Init(&g_spiSampleHandle); - - HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_TX_COMPLETE_CB_ID, TxSampleCallbackHandle); - HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_RX_COMPLETE_CB_ID, RxSampleCallbackHandle); - HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_TX_RX_COMPLETE_CB_ID, TxRxSampleCallbackHandle); - HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_ERROR_CB_ID, ErrorSampleCallbackHandle); - HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_CS_CB_ID, SPICsCallback); - HAL_SPI_IRQService(&g_spiSampleHandle); - IRQ_SetPriority(g_spiSampleHandle.irqNum, 1); - IRQ_EnableN(g_spiSampleHandle.irqNum); -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); - - g_uart0.baseAddress = UART0; - g_uart0.irqNum = IRQ_UART0; - - g_uart0.baudRate = UART0_BAND_RATE; - g_uart0.dataLength = UART_DATALENGTH_8BIT; - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; - g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart0); -} - -static void IOConfig(void) -{ - IOConfig_RegStruct *iconfig = IOCONFIG; - - iconfig->iocmg_22.BIT.func = 0x5; /* 0x5 is SPI_CLK */ - iconfig->iocmg_22.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_22.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_22.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_22.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_22.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_18.BIT.func = 0x5; /* 0x5 is SPI_CSN0 */ - iconfig->iocmg_18.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_18.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_18.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_18.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_18.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_21.BIT.func = 0x5; /* 0x5 is SPI_CSN1 */ - iconfig->iocmg_21.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_21.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_21.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_21.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_21.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_20.BIT.func = 0x5; /* 0x5 is SPI_RXD */ - iconfig->iocmg_20.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_20.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_20.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_20.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_20.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_19.BIT.func = 0x5; /* 0x5 is SPI_TXD */ - iconfig->iocmg_19.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_19.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_19.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_19.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_19.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ - iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ - iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - SPI_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_kta7953/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_kta7953/readme.md deleted file mode 100644 index 6c781e6ba..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_kta7953/readme.md +++ /dev/null @@ -1,20 +0,0 @@ -# 对接ADC芯片kta7953,通过SPI中的中断方式读取ADC各个通道采样值 -## 关键字: SPI, 中断, kta7953 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、SPI控制器初始化和功能配置。SPI对接ADC芯片kta7953,通过中断方式不断读取ADC芯片kta7953各通道(ch0-ch6)的采样值,以手动模式操作ADC芯片kta7953各个通道。 - -**【示例配置】** -+ 在"SystemInit()”接口中配置SPI时钟极性、时钟相位、帧格式、中断等参数。 - -+ 定义数组,数组中存放以手动操作模式读取各个通道采样值的命令。 - -+ 采用“HAL_SPI_WriteReadIT()”进行ch0-ch6通道采样。执行十次后调用“Kta7953BuffPrintf()”打印结果值。 - -+ 编写回调函数代码,当产生中断会调用回调函数。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码通过串口打印的方式输出ADC芯片kta7953各通道的采样值,并且执行中断回调代码进行串口打印。 - -**【注意事项】** -+ 使用此示例代码必须外接ADC芯片kta7953。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_kta7953/src/sample_spi_interrupt_kta7953.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_kta7953/src/sample_spi_interrupt_kta7953.c deleted file mode 100644 index c6c97ad13..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_kta7953/src/sample_spi_interrupt_kta7953.c +++ /dev/null @@ -1,163 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_spi_interrupt_kta7953.c - * @author MCU Driver Team - * @brief Sample for SPI Module Interrupt. - * @details This sample is connected to the ADC chip kta7953 to demonstrate how to operate the HAL interface - * in interrupt mode in the SPI driver. - * This sample operates channels 0 to 6 of ADC chip kta7953 in manual mode. - * This sample outputs the sampling values of each channel of the ADC chip kta7953 through the serial port. - * To use this sample, connect the external ADC chip kta7953. - */ -#include "main.h" -#include "spi.h" -#include "debug.h" -#include "interrupt.h" -#include "sample_spi_interrupt_kta7953.h" - -#define USER_TIMEOUT 0x400 - -#define MANUAL_MODE_SET_CH0 0x1040 -#define MANUAL_MODE_SET_CH1 0x10C0 -#define MANUAL_MODE_SET_CH2 0x1140 -#define MANUAL_MODE_SET_CH3 0x11C0 -#define MANUAL_MODE_SET_CH4 0x1240 -#define MANUAL_MODE_SET_CH5 0x12C0 -#define MANUAL_MODE_SET_CH6 0x1340 - - -static volatile unsigned int g_txrxFlag = 0; -static unsigned short g_tempRdata[10]; -static volatile unsigned short g_outCh = 0; -static volatile unsigned short g_outData = 0; - -/** - * @brief Spi interrupt sample kta7953 buffer printf. - * @param None. - * @retval None. - */ -static void Kta7953BuffPrintf(void) -{ - for (int i = 0; i < 10; i++) { /* Print 10 groups of test data. */ - g_outCh = g_tempRdata[i] >> 12; /* Shift right by 12 bits to obtain the lower four bits. */ - g_outData = g_tempRdata[i] & 0x0FFF; /* Mask 0x0FFF */ - DBG_PRINTF("[%d] = CH:%d = %d\r\n", i, g_outCh, g_outData); - } -} - -/** - * @brief Spi interrupt sample kta7953 TxRx callback handle. - * @param handle SPI handle. - * @retval None. - */ -void TxRxSampleCallbackHandle(void *handle) -{ - BASE_FUNC_UNUSED(handle); - g_txrxFlag = 1; - DBG_PRINTF("TxRxCpltCallbackHandle\r\n"); -} - -/** - * @brief Spi interrupt sample kta7953 Tx callback handle. - * @param handle SPI handle. - * @retval None. - */ -void TxSampleCallbackHandle(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("txCpltCallbackHandle\r\n"); -} - -/** - * @brief Spi interrupt sample kta7953 Rx callback handle. - * @param handle SPI handle. - * @retval None. - */ -void RxSampleCallbackHandle(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("RxCpltCallbackHandle\r\n"); -} - -/** - * @brief Spi interrupt sample kta7953 Error callback handle. - * @param handle SPI handle. - * @retval None. - */ -void ErrorSampleCallbackHandle(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("ErrorCallbackHandle\r\n"); -} - -/** - * @brief Spi interrupt sample kta7953 processing. - * @param None. - * @retval None. - */ -void Kta7953InterruptSampleProcessing(void) -{ - static unsigned short cnt = 0; - unsigned short temp = MANUAL_MODE_SET_CH0; - unsigned short tempWdata[] = { - MANUAL_MODE_SET_CH0, - MANUAL_MODE_SET_CH1, - MANUAL_MODE_SET_CH2, - MANUAL_MODE_SET_CH3, - MANUAL_MODE_SET_CH4, - MANUAL_MODE_SET_CH5, - MANUAL_MODE_SET_CH6, - 3, - 0, - 0 - }; - - SystemInit(); - HAL_SPI_WriteIT(&g_spiSampleHandle, (unsigned char *)&temp, sizeof(temp)); - while (1) { - if (g_txrxFlag > 0) { - g_txrxFlag = 0; - - if (cnt >= 10) { /* Test 10 times in total */ - cnt = 0; - g_txrxFlag = 1; - Kta7953BuffPrintf(); - } - - if (cnt > 7 && cnt < 10) { /* 7 to 10 */ - HAL_SPI_ReadIT(&g_spiSampleHandle, (unsigned char *)&g_tempRdata[cnt], sizeof(g_tempRdata[cnt])); - cnt++; - } - - if (cnt == 7) { /* 7th */ - HAL_SPI_WriteIT(&g_spiSampleHandle, (unsigned char *)&tempWdata[cnt], sizeof(tempWdata[cnt])); - g_tempRdata[cnt] = cnt; - cnt++; - } - - if (cnt < 7) { /* First 7 */ - HAL_SPI_WriteReadIT(&g_spiSampleHandle, - (unsigned char *)&g_tempRdata[cnt], - (unsigned char *)&tempWdata[cnt], - sizeof(tempWdata[cnt])); - cnt++; - } - } - BASE_FUNC_DELAY_MS(300); /* Delay 300ms */ - } -} diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32/inc/sample_spi_interrupt_w25q32.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32/inc/sample_spi_interrupt_w25q32.h deleted file mode 100644 index ea145626c..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32/inc/sample_spi_interrupt_w25q32.h +++ /dev/null @@ -1,28 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_spi_interrupt_w25q32.h - * @author MCU Driver Team - * @brief SPI module sample. - * @details This file provides sample code for users to help use - * the functionalities of the SPI. - */ -#ifndef SAMPLE_SPI_INTERRUPT_W25Q32_H -#define SAMPLE_SPI_INTERRUPT_W25Q32_H - -void W25Q32InterruptSampleProcessing(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32/init/main.c deleted file mode 100644 index 0c5f30bcf..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32/init/main.c +++ /dev/null @@ -1,50 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ - -#include "typedefs.h" -#include "feature.h" -#include "main.h" -/* USER CODE BEGIN 0 */ -/* USER CODE END 0 */ -UART_Handle g_uart0; -SPI_Handle g_spiSampleHandle; -/* USER CODE BEGIN 1 */ -/* USER CODE END 1 */ - -int main(void) -{ - /* USER CODE BEGIN 2 */ - /* USER CODE END 2 */ - W25Q32InterruptSampleProcessing(); - /* USER CODE BEGIN 3 */ - /* USER CODE END 3 */ - while (1) { - /* USER CODE BEGIN 4 */ - /* USER CODE END 4 */ - } - /* USER CODE BEGIN 5 */ - /* USER CODE END 5 */ - return BASE_STATUS_OK; -} - -/* USER CODE BEGIN 6 */ -/* USER CODE END 6 */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32/init/main.h deleted file mode 100644 index 5d6cae904..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32/init/main.h +++ /dev/null @@ -1,56 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "spi.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -#define XTAL_DRV_LEVEL4 0x03U -#define XTAL_DRV_LEVEL3 0x02U -#define XTAL_DRV_LEVEL2 0x01U -#define XTAL_DRV_LEVEL1 0x00U - -extern UART_Handle g_uart0; -extern SPI_Handle g_spiSampleHandle; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -void TxSampleCallbackHandle(void *handle); -void RxSampleCallbackHandle(void *handle); -void TxRxSampleCallbackHandle(void *handle); -void ErrorSampleCallbackHandle(void *handle); -void SPICsCallback(void *handle); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32/init/system_init.c deleted file mode 100644 index 7d18f1ec0..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32/init/system_init.c +++ /dev/null @@ -1,203 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" -#include "iocmg_ip.h" - -#define UART0_BAND_RATE 115200 - -#define SPI1_FREQ_SCR 2 -#define SPI1_FREQ_CPSDVSR 10 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; /* crg baseaddress */ - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; - crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; - crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_1; - - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { /* CRG init */ - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -__weak void TxSampleCallbackHandle(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN TxSampleCallbackHandle */ - /* USER CODE END TxSampleCallbackHandle */ -} - -__weak void RxSampleCallbackHandle(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN RxSampleCallbackHandle */ - /* USER CODE END RxSampleCallbackHandle */ -} - -__weak void TxRxSampleCallbackHandle(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN TxRxSampleCallbackHandle */ - /* USER CODE END TxRxSampleCallbackHandle */ -} - -__weak void ErrorSampleCallbackHandle(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN ErrorSampleCallbackHandle */ - /* USER CODE END ErrorSampleCallbackHandle */ -} - -__weak void SPICsCallback(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN SPICsCallback */ - /* USER CODE END SPICsCallback */ -} - -static void SPI1_Init(void) -{ - HAL_CRG_IpEnableSet(SPI1_BASE, IP_CLK_ENABLE); - - g_spiSampleHandle.baseAddress = SPI1; - - g_spiSampleHandle.mode = HAL_SPI_MASTER; /* spi master */ - g_spiSampleHandle.csMode = SPI_CHIP_SELECT_MODE_CALLBACK; - g_spiSampleHandle.xFerMode = HAL_XFER_MODE_INTERRUPTS; - g_spiSampleHandle.clkPolarity = HAL_SPI_CLKPOL_0; /* spi ploarity is 0 */ - g_spiSampleHandle.clkPhase = HAL_SPI_CLKPHA_1; - g_spiSampleHandle.endian = HAL_SPI_BIG_ENDIAN; - g_spiSampleHandle.frameFormat = HAL_SPI_MODE_MOTOROLA; /* motorola frame format */ - g_spiSampleHandle.dataWidth = SPI_DATA_WIDTH_8BIT; - g_spiSampleHandle.freqScr = SPI1_FREQ_SCR; - g_spiSampleHandle.freqCpsdvsr = SPI1_FREQ_CPSDVSR; - g_spiSampleHandle.waitEn = BASE_CFG_DISABLE; - g_spiSampleHandle.waitVal = 127; /* mircowire wait time 127 */ - g_spiSampleHandle.rxBuff = NULL; - g_spiSampleHandle.txBuff = NULL; - g_spiSampleHandle.transferSize = 0; - g_spiSampleHandle.txCount = 0; /* transfer count */ - g_spiSampleHandle.rxCount = 0; - g_spiSampleHandle.state = HAL_SPI_STATE_RESET; - g_spiSampleHandle.rxIntSize = SPI_RX_INTERRUPT_SIZE_1; - g_spiSampleHandle.txIntSize = SPI_TX_INTERRUPT_SIZE_1; /* tx interrupt size */ - g_spiSampleHandle.rxDMABurstSize = SPI_RX_DMA_BURST_SIZE_1; - g_spiSampleHandle.txDMABurstSize = SPI_TX_DMA_BURST_SIZE_1; - HAL_SPI_Init(&g_spiSampleHandle); - - /* spi register callback */ - HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_TX_COMPLETE_CB_ID, TxSampleCallbackHandle); - HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_RX_COMPLETE_CB_ID, RxSampleCallbackHandle); - HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_TX_RX_COMPLETE_CB_ID, TxRxSampleCallbackHandle); - HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_ERROR_CB_ID, ErrorSampleCallbackHandle); - HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_CS_CB_ID, SPICsCallback); - /* spi interrupt setting */ - IRQ_Register(IRQ_SPI1, HAL_SPI_IrqHandler, &g_spiSampleHandle); - IRQ_SetPriority(IRQ_SPI1, 1); - IRQ_EnableN(IRQ_SPI1); - HAL_SPI_ChipSelectChannelSet(&g_spiSampleHandle, SPI_CHIP_SELECT_CHANNEL_1); -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - - g_uart0.baseAddress = UART0; /* uart0 baseaaddress */ - - g_uart0.baudRate = UART0_BAND_RATE; - g_uart0.dataLength = UART_DATALENGTH_8BIT; /* data length 8 */ - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; /* blocking mode */ - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; - g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; /* fifo size 8 */ - g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; - g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart0); -} - -static void IOConfig(void) -{ - HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO4_6_AS_SPI1_CLK); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO4_6_AS_SPI1_CLK, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO4_6_AS_SPI1_CLK, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO4_6_AS_SPI1_CLK, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO4_6_AS_SPI1_CLK, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO1_4_AS_SPI1_RXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO1_4_AS_SPI1_RXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO1_4_AS_SPI1_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO1_4_AS_SPI1_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO1_4_AS_SPI1_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO3_0_AS_SPI1_CSN1); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO3_0_AS_SPI1_CSN1, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO3_0_AS_SPI1_CSN1, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO3_0_AS_SPI1_CSN1, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO3_0_AS_SPI1_CSN1, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO1_3_AS_SPI1_TXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO1_3_AS_SPI1_TXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO1_3_AS_SPI1_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO1_3_AS_SPI1_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO1_3_AS_SPI1_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO4_5_AS_SPI1_CSN0); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO4_5_AS_SPI1_CSN0, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO4_5_AS_SPI1_CSN0, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO4_5_AS_SPI1_CSN0, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO4_5_AS_SPI1_CSN0, DRIVER_RATE_2); /* Output signal edge fast/slow */ -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - SPI1_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32/readme.md deleted file mode 100644 index 9206fbbb1..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32/readme.md +++ /dev/null @@ -1,20 +0,0 @@ -# 对接flash芯片w25q32,通过SPI的中断方式写入和读取w25q32芯片中的数据 -## 关键字: SPI, 中断, w25q32芯片 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、SPI控制器初始化和功能配置。SPI对接flash芯片w25q32,通过中断方式对w25q32芯片进行写入120个数据,之后从芯片中再读出120字节数据。 - -**【示例配置】** -+ 在"SystemInit()”接口中配置SPI时钟极性、时钟相位、帧格式等参数和DMA通道相关参数,需根据对接的芯片进行相关参数配置。 - -+ w25q32芯片扇区擦除:调用“SectorErase()”接口先对w25q32芯片进行擦写操作,内部调用接口“SPI_W25Q32_WriteEnable()”向w25q32发送写使能命令,之后发送擦写扇区命令。命令的发送都是调用“HAL_SPI_WriteIT()”接口。 - -+ 向w25q32芯片写数据:调用“WritePage()”接口进行数据写入,发送页写入命令和需要写入120个数据,调用“HAL_SPI_WriteIT()”接口。 - -+ 从w25q32芯片读数据:调用“ReadData()”接口进行读数据,发送读命令,调用“HAL_SPI_WriteReadIT()”接口从芯片读取120个数据。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成后。当每次产生中断会进入回调函数打印log,串口打印写入的120个数据和读取的120个数据,如果写入和读取的数据是相同则打印data correct,否则打印data err。 - -**【注意事项】** -+ 使用此示例代码必须外接flash芯片w25q32。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32/src/sample_spi_interrupt_w25q32.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32/src/sample_spi_interrupt_w25q32.c deleted file mode 100644 index 41bf6eda9..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32/src/sample_spi_interrupt_w25q32.c +++ /dev/null @@ -1,286 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_spi_interrupt_w25q32.c - * @author MCU Driver Team - * @brief Sample for SPI Module Interrupt. - * @details This sample is used to operate the HAL interface on the W25Q32 chip of the flash. - * Write data and read data to address 0 of W25Q32 - */ - -#include "main.h" -#include "spi.h" -#include "debug.h" -#include "sample_spi_interrupt_w25q32.h" - -#define SPI_W25X_WRITE_ENABLE 0x06 -#define SPI_W25X_SECTOR_ERASE 0x20 -#define SPI_W25X_PAGE_PROGRAM 0x02 -#define SPI_W25X_READ_DATA 0x03 - -static unsigned char g_wirteEnableBuf; -static unsigned int g_flashAddr = 0; -static unsigned char g_writeBuf[120] = {0}; -static unsigned char g_recvBuf[120] = {0}; -static unsigned char g_writeCmdBuf[124] = {0}; -static unsigned char g_readCmdBuf[124] = {0}; -static unsigned char g_earseBuf[4] = {0}; - -/** - * @brief spi chip select callback function. - * @param handle SPI handle. - * @retval None - */ -void SPICsCallback(void *handle) -{ - SPI_Handle *spiHandle = (SPI_Handle *)handle; - /* USER CODE BEGIN SPICsCallback */ - if (g_spiSampleHandle.csCtrl == SPI_CHIP_SELECT) { - HAL_SPI_SetChipConfigSelectEx(spiHandle, HAL_SPI_CHIP_CONFIG_SOFR_UNSET); - } else { - HAL_SPI_SetChipConfigSelectEx(spiHandle, HAL_SPI_CHIP_CONFIG_SOFR_SET); - } - /* USER CODE END SPICsCallback */ -} - -/** - * @brief Spi interrupt sample w25q32 TxRx callback handle. - * @param handle SPI handle. - * @retval None. - */ -void TxRxSampleCallbackHandle(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("TxRxCpltCallbackHandle\r\n"); -} - -/** - * @brief Spi interrupt sample w25q32 Tx callback handle. - * @param handle SPI handle. - * @retval None. - */ -void TxSampleCallbackHandle(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("txCpltCallbackHandle\r\n"); -} - -/** - * @brief Spi interrupt sample w25q32 Rx callback handle. - * @param handle SPI handle. - * @retval None. - */ -void RxSampleCallbackHandle(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("RxCpltCallbackHandle\r\n"); -} - -/** - * @brief Spi interrupt sample w25q32 Error callback handle. - * @param handle SPI handle. - * @retval None. - */ -void ErrorSampleCallbackHandle(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("ErrorCallbackHandle\r\n"); -} - -/** - * @brief w25q32 enable the write function. - * @param None. - * @retval BASE_StatusType:OK, ERROR. - */ -static BASE_StatusType SPI_W25Q32_WriteEnable(void) -{ - g_wirteEnableBuf = SPI_W25X_WRITE_ENABLE; /* Write enable command */ - BASE_StatusType ret; - ret = HAL_SPI_WriteIT(&g_spiSampleHandle, (unsigned char *)&g_wirteEnableBuf, sizeof(g_wirteEnableBuf)); - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("enable error!\r\n"); - return BASE_STATUS_ERROR; - } - return BASE_STATUS_OK; -} - -/** - * @brief w25q32 sector erase function. - * @param sectorEraseAddr sector erase address. - * @retval BASE_StatusType:OK, ERROR. - */ -static BASE_StatusType SectorErase(unsigned int sectorEraseAddr) -{ - BASE_StatusType ret; - ret = SPI_W25Q32_WriteEnable(); - if (ret != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - BASE_FUNC_DELAY_MS(20); /* delay 20 ms */ - - g_earseBuf[0] = SPI_W25X_SECTOR_ERASE; /* Sector erase command */ - g_earseBuf[1] = (sectorEraseAddr & 0xFF0000) >> 16; /* Shift right by 16 bits */ - g_earseBuf[2] = (sectorEraseAddr & 0xFF00) >> 8; /* Shift right by 8 bits, 2 array subscript */ - g_earseBuf[3] = (sectorEraseAddr & 0xFF); /* Lower 8 bits of the sector erase address, 3 array subscript */ - ret = HAL_SPI_WriteIT(&g_spiSampleHandle, g_earseBuf, sizeof(g_earseBuf)); - if (ret != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - return BASE_STATUS_OK; -} - -/** - * @brief w25q32 single page write, maximum 256 bytes. - * @param writeBuf write data buffer. - * @param writeAddr write address. - * @param len data length. - * @retval BASE_StatusType:OK, ERROR. - */ -static BASE_StatusType WritePage(unsigned char *writeBuf, unsigned int writeAddr, unsigned int len) -{ - BASE_StatusType ret; - ret = SPI_W25Q32_WriteEnable(); /* enable the write */ - if (ret != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - BASE_FUNC_DELAY_MS(20); /* Delay 20 ms */ - - g_writeCmdBuf[0] = SPI_W25X_PAGE_PROGRAM; /* Page Program command */ - g_writeCmdBuf[1] = (writeAddr & 0xFF0000) >> 16; /* Shift right by 16 bits */ - g_writeCmdBuf[2] = (writeAddr & 0xFF00) >> 8; /* Shift right by 8 bits, 2 array subscript */ - g_writeCmdBuf[3] = (writeAddr & 0xFF); /* Lower 8 bits of the sector erase address, 3 array subscript */ - for (unsigned int count = 0; count < len; count++) { - g_writeCmdBuf[count + 4] = writeBuf[count]; /* data is stored from array subscript 4 */ - } - ret = HAL_SPI_WriteIT(&g_spiSampleHandle, g_writeCmdBuf, (len + 4)); /* len + 4 is total size */ - if (ret != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - return BASE_STATUS_OK; -} - -/** - * @brief Read data in the address. - * @param recvBuf write data buffer. - * @param recvAddr write address. - * @param len data length. - * @retval BASE_StatusType:OK, ERROR. - */ -static BASE_StatusType ReadData(unsigned char *recvBuf, unsigned int recvAddr, unsigned int len) -{ - BASE_StatusType ret; - g_readCmdBuf[0] = SPI_W25X_READ_DATA; /* Read data command */ - g_readCmdBuf[1] = (recvAddr & 0xFF0000) >> 16; /* Shift right by 16 bits */ - g_readCmdBuf[2] = (recvAddr & 0xFF00) >> 8; /* Shift right by 8 bits, 2 array subscript */ - g_readCmdBuf[3] = (recvAddr & 0xFF); /* Lower 8 bits of the sector erase address, 3 array subscript */ - - unsigned char readDataBuf[124] = {0}; - /* len + 4 is total size */ - ret = HAL_SPI_WriteReadIT(&g_spiSampleHandle, readDataBuf, g_readCmdBuf, (len + 4)); - if (ret != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - BASE_FUNC_DELAY_MS(200); /* Delay 200ms */ - for (unsigned int i = 0; i < len; i++) { - recvBuf[i] = readDataBuf[i + 4]; /* read valid data from array subscript 4 */ - } - return BASE_STATUS_OK; -} - -/** - * @brief Performs read data and write page on w25q32. - * @param None. - * @retval None. - */ -static void SPI_WritePageAndReadData(void) -{ - BASE_StatusType ret; - DBG_PRINTF("write data is : \r\n"); - unsigned int writeLen = 120; /* transfer 120 bytes of data */ - for (unsigned int i = 0; i < writeLen; i++) { - g_writeBuf[i] = i; - DBG_PRINTF("%d ", g_writeBuf[i]); - } - DBG_PRINTF("\r\n"); - ret = WritePage(g_writeBuf, g_flashAddr, writeLen); /* w25q32 single page write */ - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("write page failed!\r\n"); - } - - BASE_FUNC_DELAY_MS(5); /* Delay 5ms */ - - unsigned int recvLen = 120; /* 120 bytes of data needs to be received */ - for (unsigned int index = 0; index < recvLen; index++) { - g_recvBuf[index] = 0; - } - ret = ReadData(g_recvBuf, g_flashAddr, recvLen); /* Read data in the g_flashAddr address */ - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("read page failed!\r\n"); - } else { - DBG_PRINTF("read data is : \r\n"); - for (unsigned int i = 0; i < recvLen; i++) { - DBG_PRINTF("%d ", g_recvBuf[i]); /* print received Data */ - } - DBG_PRINTF("\r\n"); - } -} - -/** - * @brief Performs read and write operations on w25q32. - * @param None. - * @retval None. - */ -static void SPI_W25Q32_TEST(void) -{ - BASE_StatusType ret; - ret = SectorErase(g_flashAddr); /* w25q32 sector erase function */ - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("sector erase failed!\r\n"); - } - BASE_FUNC_DELAY_MS(500); /* Delay 500 ms */ - - SPI_WritePageAndReadData(); - - bool flag = true; - unsigned int recvLen = 120; - for (unsigned int i = 0; i < recvLen; i++) { - if (g_recvBuf[i] != g_writeBuf[i]) { /* compare the transmitted data with the received data */ - DBG_PRINTF("data err! \r\n"); - flag = false; - break; - } - } - if (flag) { - DBG_PRINTF("data correct \r\n"); - } - DBG_PRINTF("\r\n"); -} - -/** - * @brief Spi interrupt sample w25q32 processing. - * @param None. - * @retval None. - */ -void W25Q32InterruptSampleProcessing(void) -{ - SystemInit(); - HAL_SPI_SetChipConfigSelectEx(&g_spiSampleHandle, HAL_SPI_CHIP_CONFIG_SOFR_SET); - while (1) { - SPI_W25Q32_TEST(); - BASE_FUNC_DELAY_MS(2000); /* Delay 2000 ms */ - } -} diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/inc/sample_spi_interrupt_w25q32_internal.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/inc/sample_spi_interrupt_w25q32_internal.h deleted file mode 100644 index 1238e2bee..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/inc/sample_spi_interrupt_w25q32_internal.h +++ /dev/null @@ -1,28 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_spi_interrupt_w25q32_internal.h - * @author MCU Driver Team - * @brief SPI module sample. - * @details This file provides sample code for users to help use - * the functionalities of the SPI. - */ -#ifndef SAMPLE_SPI_INTERRUPT_W25Q32_INTERNAL_H -#define SAMPLE_SPI_INTERRUPT_W25Q32_INTERNAL_H - -void W25Q32InterruptSampleProcessing(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/init/main.c deleted file mode 100644 index f03009588..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/init/main.c +++ /dev/null @@ -1,51 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ - -#include "typedefs.h" -#include "feature.h" -#include "sample_spi_interrupt_w25q32_internal.h" -#include "main.h" -/* USER CODE BEGIN 0 */ -/* USER CODE END 0 */ -SPI_Handle g_spiSampleHandle; -UART_Handle g_uart0; -/* USER CODE BEGIN 1 */ -/* USER CODE END 1 */ - -int main(void) -{ - /* USER CODE BEGIN 2 */ - /* USER CODE END 2 */ - W25Q32InterruptSampleProcessing(); - /* USER CODE BEGIN 3 */ - /* USER CODE END 3 */ - while (1) { - /* USER CODE BEGIN 4 */ - /* USER CODE END 4 */ - } - /* USER CODE BEGIN 5 */ - /* USER CODE END 5 */ - return BASE_STATUS_OK; -} - -/* USER CODE BEGIN 6 */ -/* USER CODE END 6 */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/init/main.h deleted file mode 100644 index 45a93ed2d..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/init/main.h +++ /dev/null @@ -1,56 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "spi.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -#define XTAL_DRV_LEVEL4 0x03U -#define XTAL_DRV_LEVEL3 0x02U -#define XTAL_DRV_LEVEL2 0x01U -#define XTAL_DRV_LEVEL1 0x00U - -extern SPI_Handle g_spiSampleHandle; -extern UART_Handle g_uart0; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -void TxSampleCallbackHandle(void *handle); -void RxSampleCallbackHandle(void *handle); -void TxRxSampleCallbackHandle(void *handle); -void ErrorSampleCallbackHandle(void *handle); -void SPICsCallback(void *handle); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/init/system_init.c deleted file mode 100644 index 21a60100a..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/init/system_init.c +++ /dev/null @@ -1,203 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" -#include "iocmg.h" - -#define UART0_BAND_RATE 115200 - -#define SPI_FREQ_SCR 2 -#define SPI_FREQ_CPSDVSR 10 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; - - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { /* CRG init */ - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -__weak void TxSampleCallbackHandle(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN SPI_TX_COMPLETE_CB_ID */ - /* USER CODE END SPI_TX_COMPLETE_CB_ID */ -} - -__weak void RxSampleCallbackHandle(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN SPI_RX_COMPLETE_CB_ID */ - /* USER CODE END SPI_RX_COMPLETE_CB_ID */ -} - -__weak void TxRxSampleCallbackHandle(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN SPI_TX_RX_COMPLETE_CB_ID */ - /* USER CODE END SPI_TX_RX_COMPLETE_CB_ID */ -} - -__weak void ErrorSampleCallbackHandle(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN SPI_ERROR_CB_ID */ - /* USER CODE END SPI_ERROR_CB_ID */ -} - -__weak void SPICsCallback(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN SPI_CS_CB_ID */ - /* USER CODE END SPI_CS_CB_ID */ -} - -static void SPI_Init(void) -{ - HAL_CRG_IpEnableSet(SPI_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(SPI_BASE, CRG_PLL_NO_PREDV); - - g_spiSampleHandle.baseAddress = SPI; - - g_spiSampleHandle.mode = HAL_SPI_MASTER; /* spi master */ - g_spiSampleHandle.csMode = SPI_CHIP_SELECT_MODE_INTERNAL; - g_spiSampleHandle.xFerMode = HAL_XFER_MODE_INTERRUPTS; - g_spiSampleHandle.clkPolarity = HAL_SPI_CLKPOL_0; /* spi ploarity is 0 */ - g_spiSampleHandle.clkPhase = HAL_SPI_CLKPHA_1; - g_spiSampleHandle.endian = HAL_SPI_BIG_ENDIAN; - g_spiSampleHandle.frameFormat = HAL_SPI_MODE_MOTOROLA; /* motorola frame format */ - g_spiSampleHandle.dataWidth = SPI_DATA_WIDTH_8BIT; - g_spiSampleHandle.freqScr = SPI_FREQ_SCR; - g_spiSampleHandle.freqCpsdvsr = SPI_FREQ_CPSDVSR; - g_spiSampleHandle.waitEn = BASE_CFG_DISABLE; - g_spiSampleHandle.waitVal = 127; /* mircowire wait time 127 */ - g_spiSampleHandle.rxBuff = NULL; - g_spiSampleHandle.txBuff = NULL; - g_spiSampleHandle.transferSize = 0; - g_spiSampleHandle.txCount = 0; /* transfer count */ - g_spiSampleHandle.rxCount = 0; - g_spiSampleHandle.state = HAL_SPI_STATE_RESET; - g_spiSampleHandle.rxIntSize = SPI_RX_INTERRUPT_SIZE_1; - g_spiSampleHandle.txIntSize = SPI_TX_INTERRUPT_SIZE_1; /* tx interrupt size */ - g_spiSampleHandle.rxDMABurstSize = SPI_RX_DMA_BURST_SIZE_1; - g_spiSampleHandle.txDMABurstSize = SPI_TX_DMA_BURST_SIZE_1; - HAL_SPI_Init(&g_spiSampleHandle); - - /* spi register callback */ - HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_TX_COMPLETE_CB_ID, TxSampleCallbackHandle); - HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_RX_COMPLETE_CB_ID, RxSampleCallbackHandle); - HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_TX_RX_COMPLETE_CB_ID, TxRxSampleCallbackHandle); - HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_ERROR_CB_ID, ErrorSampleCallbackHandle); - HAL_SPI_RegisterCallback(&g_spiSampleHandle, SPI_CS_CB_ID, SPICsCallback); - /* spi interrupt setting */ - IRQ_Register(IRQ_SPI, HAL_SPI_IrqHandler, &g_spiSampleHandle); - IRQ_SetPriority(IRQ_SPI, 1); - IRQ_EnableN(IRQ_SPI); -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); - - g_uart0.baseAddress = UART0; /* uart0 baseaaddress */ - - g_uart0.baudRate = UART0_BAND_RATE; - g_uart0.dataLength = UART_DATALENGTH_8BIT; /* data length 8 */ - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; /* blocking mode */ - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; - g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart0); -} - -static void IOConfig(void) -{ - SYSCTRL0->SC_SYS_STAT.BIT.update_mode = 0; - SYSCTRL0->SC_SYS_STAT.BIT.update_mode_clear = 1; - HAL_IOCMG_SetPinAltFuncMode(IO6_AS_SSP0_CLK); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(IO6_AS_SSP0_CLK, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(IO6_AS_SSP0_CLK, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(IO6_AS_SSP0_CLK, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(IO6_AS_SSP0_CLK, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(IO2_AS_SSP0_CSN0); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(IO2_AS_SSP0_CSN0, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(IO2_AS_SSP0_CSN0, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(IO2_AS_SSP0_CSN0, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(IO2_AS_SSP0_CSN0, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(IO5_AS_SSP0_CSN1); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(IO5_AS_SSP0_CSN1, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(IO5_AS_SSP0_CSN1, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(IO5_AS_SSP0_CSN1, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(IO5_AS_SSP0_CSN1, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(IO4_AS_SSP0_RXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(IO4_AS_SSP0_RXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(IO4_AS_SSP0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(IO4_AS_SSP0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(IO4_AS_SSP0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(IO3_AS_SSP0_TXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(IO3_AS_SSP0_TXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(IO3_AS_SSP0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(IO3_AS_SSP0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(IO3_AS_SSP0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - /* UART RX recommend PULL_UP */ - HAL_IOCMG_SetPinAltFuncMode(IO53_AS_UART0_RXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(IO53_AS_UART0_RXD, PULL_UP); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(IO53_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(IO53_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(IO53_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(IO52_AS_UART0_TXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(IO52_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(IO52_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(IO52_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(IO52_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - SPI_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/readme.md deleted file mode 100644 index 9206fbbb1..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/readme.md +++ /dev/null @@ -1,20 +0,0 @@ -# 对接flash芯片w25q32,通过SPI的中断方式写入和读取w25q32芯片中的数据 -## 关键字: SPI, 中断, w25q32芯片 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、SPI控制器初始化和功能配置。SPI对接flash芯片w25q32,通过中断方式对w25q32芯片进行写入120个数据,之后从芯片中再读出120字节数据。 - -**【示例配置】** -+ 在"SystemInit()”接口中配置SPI时钟极性、时钟相位、帧格式等参数和DMA通道相关参数,需根据对接的芯片进行相关参数配置。 - -+ w25q32芯片扇区擦除:调用“SectorErase()”接口先对w25q32芯片进行擦写操作,内部调用接口“SPI_W25Q32_WriteEnable()”向w25q32发送写使能命令,之后发送擦写扇区命令。命令的发送都是调用“HAL_SPI_WriteIT()”接口。 - -+ 向w25q32芯片写数据:调用“WritePage()”接口进行数据写入,发送页写入命令和需要写入120个数据,调用“HAL_SPI_WriteIT()”接口。 - -+ 从w25q32芯片读数据:调用“ReadData()”接口进行读数据,发送读命令,调用“HAL_SPI_WriteReadIT()”接口从芯片读取120个数据。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成后。当每次产生中断会进入回调函数打印log,串口打印写入的120个数据和读取的120个数据,如果写入和读取的数据是相同则打印data correct,否则打印data err。 - -**【注意事项】** -+ 使用此示例代码必须外接flash芯片w25q32。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/src/sample_spi_interrupt_w25q32_internal.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/src/sample_spi_interrupt_w25q32_internal.c deleted file mode 100644 index 0c656b1d3..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/src/sample_spi_interrupt_w25q32_internal.c +++ /dev/null @@ -1,268 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_spi_interrupt_w25q32_internal.c - * @author MCU Driver Team - * @brief Sample for SPI Module Interrupt. - * @details This sample is used to operate the HAL interface on the W25Q32 chip of the flash. - * Write data and read data to address 0 of W25Q32 - */ - -#include "main.h" -#include "spi.h" -#include "debug.h" -#include "sample_spi_interrupt_w25q32_internal.h" - -#define SPI_W25X_WRITE_ENABLE 0x06 -#define SPI_W25X_SECTOR_ERASE 0x20 -#define SPI_W25X_PAGE_PROGRAM 0x02 -#define SPI_W25X_READ_DATA 0x03 - -static unsigned char g_wirteEnableBuf; -static unsigned int g_flashAddr = 0; -static unsigned char g_writeBuf[120] = {0}; -static unsigned char g_recvBuf[120] = {0}; -static unsigned char g_writeCmdBuf[124] = {0}; -static unsigned char g_readCmdBuf[124] = {0}; -static unsigned char g_earseBuf[4] = {0}; - -/** - * @brief Spi interrupt sample w25q32 TxRx callback handle. - * @param handle SPI handle. - * @retval None. - */ -void TxRxSampleCallbackHandle(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("TxRxCpltCallbackHandle\r\n"); -} - -/** - * @brief Spi interrupt sample w25q32 Tx callback handle. - * @param handle SPI handle. - * @retval None. - */ -void TxSampleCallbackHandle(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("txCpltCallbackHandle\r\n"); -} - -/** - * @brief Spi interrupt sample w25q32 Rx callback handle. - * @param handle SPI handle. - * @retval None. - */ -void RxSampleCallbackHandle(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("RxCpltCallbackHandle\r\n"); -} - -/** - * @brief Spi interrupt sample w25q32 Error callback handle. - * @param handle SPI handle. - * @retval None. - */ -void ErrorSampleCallbackHandle(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("ErrorCallbackHandle\r\n"); -} - -/** - * @brief w25q32 enable the write function. - * @param None. - * @retval BASE_StatusType:OK, ERROR. - */ -static BASE_StatusType SPI_W25Q32_WriteEnable(void) -{ - g_wirteEnableBuf = SPI_W25X_WRITE_ENABLE; /* Write enable command */ - BASE_StatusType ret; - ret = HAL_SPI_WriteIT(&g_spiSampleHandle, (unsigned char *)&g_wirteEnableBuf, sizeof(g_wirteEnableBuf)); - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("enable error!\r\n"); - return BASE_STATUS_ERROR; - } - return BASE_STATUS_OK; -} - -/** - * @brief w25q32 sector erase function. - * @param sectorEraseAddr sector erase address. - * @retval BASE_StatusType:OK, ERROR. - */ -static BASE_StatusType SectorErase(unsigned int sectorEraseAddr) -{ - BASE_StatusType ret; - ret = SPI_W25Q32_WriteEnable(); - if (ret != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - BASE_FUNC_DELAY_MS(20); /* delay 20 ms */ - - g_earseBuf[0] = SPI_W25X_SECTOR_ERASE; /* Sector erase command */ - g_earseBuf[1] = (sectorEraseAddr & 0xFF0000) >> 16; /* Shift right by 16 bits */ - g_earseBuf[2] = (sectorEraseAddr & 0xFF00) >> 8; /* Shift right by 8 bits, 2 array subscript */ - g_earseBuf[3] = (sectorEraseAddr & 0xFF); /* Lower 8 bits of the sector erase address, 3 array subscript */ - ret = HAL_SPI_WriteIT(&g_spiSampleHandle, g_earseBuf, sizeof(g_earseBuf)); - if (ret != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - return BASE_STATUS_OK; -} - -/** - * @brief w25q32 single page write, maximum 256 bytes. - * @param writeBuf write data buffer. - * @param writeAddr write address. - * @param len data length. - * @retval BASE_StatusType:OK, ERROR. - */ -static BASE_StatusType WritePage(unsigned char *writeBuf, unsigned int writeAddr, unsigned int len) -{ - BASE_StatusType ret; - ret = SPI_W25Q32_WriteEnable(); /* enable the write */ - if (ret != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - BASE_FUNC_DELAY_MS(20); /* Delay 20 ms */ - - g_writeCmdBuf[0] = SPI_W25X_PAGE_PROGRAM; /* Page Program command */ - g_writeCmdBuf[1] = (writeAddr & 0xFF0000) >> 16; /* Shift right by 16 bits */ - g_writeCmdBuf[2] = (writeAddr & 0xFF00) >> 8; /* Shift right by 8 bits, 2 array subscript */ - g_writeCmdBuf[3] = (writeAddr & 0xFF); /* Lower 8 bits of the sector erase address, 3 array subscript */ - for (unsigned int count = 0; count < len; count++) { - g_writeCmdBuf[count + 4] = writeBuf[count]; /* data is stored from array subscript 4 */ - } - ret = HAL_SPI_WriteIT(&g_spiSampleHandle, g_writeCmdBuf, (len + 4)); /* len + 4 is total size */ - if (ret != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - return BASE_STATUS_OK; -} - -/** - * @brief Read data in the address. - * @param recvBuf write data buffer. - * @param recvAddr write address. - * @param len data length. - * @retval BASE_StatusType:OK, ERROR. - */ -static BASE_StatusType ReadData(unsigned char *recvBuf, unsigned int recvAddr, unsigned int len) -{ - BASE_StatusType ret; - g_readCmdBuf[0] = SPI_W25X_READ_DATA; /* Read data command */ - g_readCmdBuf[1] = (recvAddr & 0xFF0000) >> 16; /* Shift right by 16 bits */ - g_readCmdBuf[2] = (recvAddr & 0xFF00) >> 8; /* Shift right by 8 bits, 2 array subscript */ - g_readCmdBuf[3] = (recvAddr & 0xFF); /* Lower 8 bits of the sector erase address, 3 array subscript */ - - unsigned char readDataBuf[124] = {0}; - /* len + 4 is total size */ - ret = HAL_SPI_WriteReadIT(&g_spiSampleHandle, readDataBuf, g_readCmdBuf, (len + 4)); - if (ret != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - BASE_FUNC_DELAY_MS(200); /* Delay 200ms */ - for (unsigned int i = 0; i < len; i++) { - recvBuf[i] = readDataBuf[i + 4]; /* read valid data from array subscript 4 */ - } - return BASE_STATUS_OK; -} - -/** - * @brief Performs read data and write page on w25q32. - * @param None. - * @retval None. - */ -static void SPI_WritePageAndReadData(void) -{ - BASE_StatusType ret; - DBG_PRINTF("write data is : \r\n"); - unsigned int writeLen = 120; /* transfer 120 bytes of data */ - for (unsigned int i = 0; i < writeLen; i++) { - g_writeBuf[i] = i; - DBG_PRINTF("%d ", g_writeBuf[i]); - } - DBG_PRINTF("\r\n"); - ret = WritePage(g_writeBuf, g_flashAddr, writeLen); /* w25q32 single page write */ - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("write page failed!\r\n"); - } - - BASE_FUNC_DELAY_MS(5); /* Delay 5ms */ - - unsigned int recvLen = 120; /* 120 bytes of data needs to be received */ - for (unsigned int index = 0; index < recvLen; index++) { - g_recvBuf[index] = 0; - } - ret = ReadData(g_recvBuf, g_flashAddr, recvLen); /* Read data in the g_flashAddr address */ - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("read page failed!\r\n"); - } else { - DBG_PRINTF("read data is : \r\n"); - for (unsigned int i = 0; i < recvLen; i++) { - DBG_PRINTF("%d ", g_recvBuf[i]); /* print received Data */ - } - DBG_PRINTF("\r\n"); - } -} - -/** - * @brief Performs read and write operations on w25q32. - * @param None. - * @retval None. - */ -static void SPI_W25Q32_TEST(void) -{ - BASE_StatusType ret; - ret = SectorErase(g_flashAddr); /* w25q32 sector erase function */ - if (ret != BASE_STATUS_OK) { - DBG_PRINTF("sector erase failed!\r\n"); - } - BASE_FUNC_DELAY_MS(500); /* Delay 500 ms */ - - SPI_WritePageAndReadData(); - - bool flag = true; - unsigned int recvLen = 120; - for (unsigned int i = 0; i < recvLen; i++) { - if (g_recvBuf[i] != g_writeBuf[i]) { /* compare the transmitted data with the received data */ - DBG_PRINTF("data err! \r\n"); - flag = false; - break; - } - } - if (flag) { - DBG_PRINTF("data correct \r\n"); - } - DBG_PRINTF("\r\n"); -} - -/** - * @brief Spi interrupt sample w25q32 processing. - * @param None. - * @retval None. - */ -void W25Q32InterruptSampleProcessing(void) -{ - SystemInit(); - while (1) { - SPI_W25Q32_TEST(); - BASE_FUNC_DELAY_MS(2000); /* Delay 2000 ms */ - } -} diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_master/inc/sample_spi_master.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_master/inc/sample_spi_master.h deleted file mode 100644 index c35468912..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_master/inc/sample_spi_master.h +++ /dev/null @@ -1,28 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_spi_master.h - * @author MCU Driver Team - * @brief SPI module driver. - * @details This file provides sample code for users to help use - * the functionalities of the SPI. - */ -#ifndef McuMagicTag_SAMPLE_SPI_MASTER_H -#define McuMagicTag_SAMPLE_SPI_MASTER_H - -void MasterTestSampleProcessing(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_master/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_master/init/main.c deleted file mode 100644 index f35db2277..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_master/init/main.c +++ /dev/null @@ -1,50 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ - -#include "typedefs.h" -#include "feature.h" -#include "main.h" -/* USER CODE BEGIN 0 */ -/* USER CODE END 0 */ -UART_Handle g_uart0; -SPI_Handle g_spiSampleHandle; -/* USER CODE BEGIN 1 */ -/* USER CODE END 1 */ - -int main(void) -{ - /* USER CODE BEGIN 2 */ - /* USER CODE END 2 */ - MasterTestSampleProcessing(); - /* USER CODE BEGIN 3 */ - /* USER CODE END 3 */ - while (1) { - /* USER CODE BEGIN 4 */ - /* USER CODE END 4 */ - } - /* USER CODE BEGIN 5 */ - /* USER CODE END 5 */ - return BASE_STATUS_OK; -} - -/* USER CODE BEGIN 6 */ -/* USER CODE END 6 */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_master/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_master/init/main.h deleted file mode 100644 index f2ff5b487..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_master/init/main.h +++ /dev/null @@ -1,50 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "spi.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -#define XTAL_DRV_LEVEL4 0x03U -#define XTAL_DRV_LEVEL3 0x02U -#define XTAL_DRV_LEVEL2 0x01U -#define XTAL_DRV_LEVEL1 0x00U - -extern UART_Handle g_uart0; -extern SPI_Handle g_spiSampleHandle; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_master/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_master/init/system_init.c deleted file mode 100644 index 009044a72..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_master/init/system_init.c +++ /dev/null @@ -1,157 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" -#include "iocmg_ip.h" - -#define UART0_BAND_RATE 115200 - -#define SPI1_FREQ_SCR 2 -#define SPI1_FREQ_CPSDVSR 10 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; /* crg baseaddress */ - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; - crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; - crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_1; - - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { /* CRG init */ - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void SPI1_Init(void) -{ - HAL_CRG_IpEnableSet(SPI1_BASE, IP_CLK_ENABLE); - - g_spiSampleHandle.baseAddress = SPI1; - - g_spiSampleHandle.mode = HAL_SPI_MASTER; /* spi master */ - g_spiSampleHandle.csMode = SPI_CHIP_SELECT_MODE_INTERNAL; - g_spiSampleHandle.xFerMode = HAL_XFER_MODE_BLOCKING; - g_spiSampleHandle.clkPolarity = HAL_SPI_CLKPOL_0; /* spi ploarity is 0 */ - g_spiSampleHandle.clkPhase = HAL_SPI_CLKPHA_0; - g_spiSampleHandle.endian = HAL_SPI_BIG_ENDIAN; - g_spiSampleHandle.frameFormat = HAL_SPI_MODE_MOTOROLA; /* motorola frame format */ - g_spiSampleHandle.dataWidth = SPI_DATA_WIDTH_16BIT; - g_spiSampleHandle.freqScr = SPI1_FREQ_SCR; - g_spiSampleHandle.freqCpsdvsr = SPI1_FREQ_CPSDVSR; - g_spiSampleHandle.waitEn = BASE_CFG_DISABLE; - g_spiSampleHandle.waitVal = 127; /* mircowire wait time 127 */ - g_spiSampleHandle.rxBuff = NULL; - g_spiSampleHandle.txBuff = NULL; - g_spiSampleHandle.transferSize = 0; - g_spiSampleHandle.txCount = 0; /* transfer count */ - g_spiSampleHandle.rxCount = 0; - g_spiSampleHandle.state = HAL_SPI_STATE_RESET; - g_spiSampleHandle.rxIntSize = SPI_RX_INTERRUPT_SIZE_1; - g_spiSampleHandle.txIntSize = SPI_TX_INTERRUPT_SIZE_1; /* tx interrupt size */ - g_spiSampleHandle.rxDMABurstSize = SPI_RX_DMA_BURST_SIZE_1; - g_spiSampleHandle.txDMABurstSize = SPI_TX_DMA_BURST_SIZE_1; - HAL_SPI_Init(&g_spiSampleHandle); - HAL_SPI_ChipSelectChannelSet(&g_spiSampleHandle, SPI_CHIP_SELECT_CHANNEL_1); -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - - g_uart0.baseAddress = UART0; /* uart0 baseaaddress */ - - g_uart0.baudRate = UART0_BAND_RATE; - g_uart0.dataLength = UART_DATALENGTH_8BIT; /* data length 8 */ - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; /* blocking mode */ - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; - g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; /* fifo size 8 */ - g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; - g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart0); -} - -static void IOConfig(void) -{ - HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO4_6_AS_SPI1_CLK); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO4_6_AS_SPI1_CLK, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO4_6_AS_SPI1_CLK, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO4_6_AS_SPI1_CLK, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO4_6_AS_SPI1_CLK, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO1_3_AS_SPI1_TXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO1_3_AS_SPI1_TXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO1_3_AS_SPI1_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO1_3_AS_SPI1_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO1_3_AS_SPI1_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO1_4_AS_SPI1_RXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO1_4_AS_SPI1_RXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO1_4_AS_SPI1_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO1_4_AS_SPI1_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO1_4_AS_SPI1_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO4_5_AS_SPI1_CSN0); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO4_5_AS_SPI1_CSN0, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO4_5_AS_SPI1_CSN0, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO4_5_AS_SPI1_CSN0, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO4_5_AS_SPI1_CSN0, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO3_0_AS_SPI1_CSN1); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO3_0_AS_SPI1_CSN1, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO3_0_AS_SPI1_CSN1, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO3_0_AS_SPI1_CSN1, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO3_0_AS_SPI1_CSN1, DRIVER_RATE_2); /* Output signal edge fast/slow */ -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - SPI1_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_master/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_master/readme.md deleted file mode 100644 index 7cbffc8ed..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_master/readme.md +++ /dev/null @@ -1,18 +0,0 @@ -# SPI使用阻塞方式进行主从通信,此示例代码作为主机使用 -## 关键字: SPI, 阻塞, 主机 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、SPI控制器初始化和功能配置。主机读从机数据或者向从机发送数据。 - -**【示例配置】** -+ 在"SystemInit()”接口中配置SPI时钟极性、时钟相位、帧格式等参数。 - -+ 定义数组,数组中存放主机需要发送的数据。 - -+ 首先主机调用“HAL_SPI_WriteBlocking()”向从机发送10个数据,之后调用“HAL_SPI_ReadBlocking()”读10个数据,最后调用“HAL_SPI_WriteReadBlocking()”边写边读10个数据,不断循环。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码通过串口不断打印主机接收到的数据、发送的数据。 - -**【注意事项】** -+ 使用此示例代码必须对接spi_slave一起使用,使用两个设备一个做master一个做slave。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_master/src/sample_spi_master.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_master/src/sample_spi_master.c deleted file mode 100644 index 8929dd5c1..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_master/src/sample_spi_master.c +++ /dev/null @@ -1,97 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_spi_master.c - * @author MCU Driver Team - * @brief Sample for SPI Module master. - * @details This sample demonstrates the use of HAL interfaces in the master mode. This sample uses the blocking mode. - * This sample must be connected to the slave device. - * This sample code corresponds to sample_spi_slave.c code. - * This sample sends 0x1001, 0x1002, 0x1003, 0x1004, 0x1005, 0x1006, and 0x1007 in polling mode. - * Print the received and sent data through the serial port. - */ -#include "main.h" -#include "spi.h" -#include "debug.h" -#include "sample_spi_master.h" - -#define MASTER_READ_TESE -#define MASTER_READ_WRITE_TESE -#define MASTER_WRITE_TESE - -#define USER_TIMEOUT 0x400 - -#define MANUAL_MODE_SET_CH0 0x1001 -#define MANUAL_MODE_SET_CH1 0x1002 -#define MANUAL_MODE_SET_CH2 0x1003 -#define MANUAL_MODE_SET_CH3 0x1004 -#define MANUAL_MODE_SET_CH4 0x1005 -#define MANUAL_MODE_SET_CH5 0x1006 -#define MANUAL_MODE_SET_CH6 0x1007 - -#define MAX_TIMEOUT_VAL 5000 - - -/** - * @brief Spi master sample processing. - * @param None. - * @retval None. - */ -void MasterTestSampleProcessing(void) -{ - unsigned short tempWdata[] = { - MANUAL_MODE_SET_CH0, - MANUAL_MODE_SET_CH1, - MANUAL_MODE_SET_CH2, - MANUAL_MODE_SET_CH3, - MANUAL_MODE_SET_CH4, - MANUAL_MODE_SET_CH5, - MANUAL_MODE_SET_CH6, - MANUAL_MODE_SET_CH2, - MANUAL_MODE_SET_CH3, - MANUAL_MODE_SET_CH4 - }; - unsigned short tempRdata[10] = {0}; - - SystemInit(); - while (1) { -#ifdef MASTER_WRITE_TESE - for (int i = 0; i < 10; i++) { /* Print the test data for 10 times. */ - DBG_PRINTF("tempWdata[%d] = 0x%x \r\n", i, tempWdata[i]); - } - HAL_SPI_WriteBlocking(&g_spiSampleHandle, (unsigned char *)tempWdata, sizeof(tempWdata), MAX_TIMEOUT_VAL); -#endif - BASE_FUNC_DELAY_MS(300); /* Delay 300ms */ -#ifdef MASTER_READ_TESE - HAL_SPI_ReadBlocking(&g_spiSampleHandle, (unsigned char *)tempRdata, sizeof(tempRdata), MAX_TIMEOUT_VAL); - for (int i = 0; i < 10; i++) { /* Print the test data for 10 times. */ - DBG_PRINTF("tempRdata[%d] = 0x%x \r\n", i, tempRdata[i]); - } -#endif - BASE_FUNC_DELAY_MS(20); /* Delay 20ms */ -#ifdef MASTER_READ_WRITE_TESE - HAL_SPI_WriteReadBlocking(&g_spiSampleHandle, (unsigned char *)tempRdata, - (unsigned char *)tempWdata, - sizeof(tempWdata), MAX_TIMEOUT_VAL); - for (int i = 0; i < 10; i++) { /* Print the test data for 10 times. */ - DBG_PRINTF("tempRdata[%d] = 0x%x tempWdata[%d] = 0x%x \r\n", i, tempRdata[i], i, tempWdata[i]); - BASE_FUNC_DELAY_MS(10); /* Delay 10ms */ - } -#endif - BASE_FUNC_DELAY_MS(20); /* Delay 20ms */ - } -} diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_master/inc/sample_spi_microwire_master.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_master/inc/sample_spi_microwire_master.h deleted file mode 100644 index 775047b8b..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_master/inc/sample_spi_microwire_master.h +++ /dev/null @@ -1,28 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_spi_microwire_master.h - * @author MCU Driver Team - * @brief SPI module driver. - * @details This file provides sample code for users to help use - * the functionalities of the SPI. - */ -#ifndef McuMagicTag_SAMPLE_SPI_MICROWRITE_MASTER_H -#define McuMagicTag_SAMPLE_SPI_MICROWRITE_MASTER_H - -void MicroWireMasterTestSampleProcessing(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_master/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_master/init/main.c deleted file mode 100644 index aaeaa52e0..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_master/init/main.c +++ /dev/null @@ -1,34 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ -#include "feature.h" -#include "main.h" -#include "sample_spi_microwire_master.h" - -SPI_Handle g_spiSampleHandle; - -int main(void) -{ - MicroWireMasterTestSampleProcessing(); - while (1) { - } - return BASE_STATUS_OK; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_master/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_master/init/main.h deleted file mode 100644 index 9a1c68192..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_master/init/main.h +++ /dev/null @@ -1,43 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "spi.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -extern SPI_Handle g_spiSampleHandle; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_master/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_master/init/system_init.c deleted file mode 100644 index 70b9fbd99..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_master/init/system_init.c +++ /dev/null @@ -1,125 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" - -#define SPI_FREQ_SCR 2 -#define SPI_FREQ_CPSDVSR 10 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void SPI_Init(void) -{ - HAL_CRG_IpEnableSet(SPI_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(SPI_BASE, CRG_PLL_NO_PREDV); - - g_spiSampleHandle.baseAddress = SPI; - g_spiSampleHandle.irqNum = IRQ_SPI; - - g_spiSampleHandle.mode = HAL_SPI_MASTER; - g_spiSampleHandle.csMode = SPI_CHIP_SELECT_MODE_INTERNAL; - g_spiSampleHandle.xFerMode = HAL_XFER_MODE_BLOCKING; - g_spiSampleHandle.clkPolarity = 0; - g_spiSampleHandle.clkPhase = 0; - g_spiSampleHandle.endian = HAL_SPI_BIG_ENDIAN; - g_spiSampleHandle.frameFormat = HAL_SPI_MODE_MICROWIRE; - g_spiSampleHandle.dataWidth = SPI_DATA_WIDTH_8BIT; - g_spiSampleHandle.freqScr = SPI_FREQ_SCR; - g_spiSampleHandle.freqCpsdvsr = SPI_FREQ_CPSDVSR; - g_spiSampleHandle.waitVal = 127; /* Wait time is 127 clock */ - g_spiSampleHandle.rxBuff = NULL; - g_spiSampleHandle.txBuff = NULL; - g_spiSampleHandle.transferSize = 0; - g_spiSampleHandle.txCount = 0; - g_spiSampleHandle.rxCount = 0; - g_spiSampleHandle.state = HAL_SPI_STATE_RESET; - g_spiSampleHandle.rxIntSize = SPI_RX_INTERRUPT_SIZE_1; - g_spiSampleHandle.txIntSize = SPI_TX_INTERRUPT_SIZE_1; - g_spiSampleHandle.rxDMABurstSize = SPI_RX_DMA_BURST_SIZE_1; - g_spiSampleHandle.txDMABurstSize = SPI_TX_DMA_BURST_SIZE_1; - - HAL_SPI_Init(&g_spiSampleHandle); -} - -static void IOConfig(void) -{ - IOConfig_RegStruct *iconfig = IOCONFIG; - - iconfig->iocmg_22.BIT.func = 0x5; /* 0x5 is SPI_CLK */ - iconfig->iocmg_22.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_22.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_22.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_22.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_22.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_18.BIT.func = 0x5; /* 0x5 is SPI_CSN0 */ - iconfig->iocmg_18.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_18.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_18.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_18.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_18.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_21.BIT.func = 0x5; /* 0x5 is SPI_CSN1 */ - iconfig->iocmg_21.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_21.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_21.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_21.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_21.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_20.BIT.func = 0x5; /* 0x5 is SPI_RXD */ - iconfig->iocmg_20.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_20.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_20.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_20.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_20.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_19.BIT.func = 0x5; /* 0x5 is SPI_TXD */ - iconfig->iocmg_19.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_19.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_19.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_19.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_19.BIT.se = BASE_CFG_DISABLE; -} - -void SystemInit(void) -{ - IOConfig(); - SPI_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_master/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_master/readme.md deleted file mode 100644 index 77708a895..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_master/readme.md +++ /dev/null @@ -1,26 +0,0 @@ -# SPI使用Mircowire帧格式进行主从通信,此示例代码作为主机使用 -## 关键字: SPI, Mircowire, 主机 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、SPI控制器初始化和功能配置。Mircowire主机发送不同的数据给从机,从机发送数据给主机,主机进行读取。 -+ 发送 <-> 接收 -0xFF -> 0xFFFF -0x1C -> 0x1C20 -0x83 -> 0x1183 -0x85 -> 0x1285 -0x40 -> 0x1240 -0xc0 -> 0x12C0 -0x13 -> 0x1340 - -**【示例配置】** -+ 在"SystemInit()”接口中配置SPI时钟极性、时钟相位、帧格式等参数。 - -+ 定义数组,数组中存放主机需要发送的数据。 - -+ 每次采用“HAL_SPI_WriteBlocking()”发送数据,“HAL_SPI_ReadBlocking()”读取数据,不断循环进行。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码通过串口打印主机发送的数据和接收到的数据。 - -**【注意事项】** -+ 此示例必须配合sample_spi_microwire_slave一起使用,使用两个设备一个做master一个做slave。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_master/src/sample_spi_microwire_master.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_master/src/sample_spi_microwire_master.c deleted file mode 100644 index 04585dacd..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_master/src/sample_spi_microwire_master.c +++ /dev/null @@ -1,84 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_spi_microwire_master.c - * @author MCU Driver Team - * @brief Sample for SPI Module microwire master. - * @details This sample demonstrates how to use the HAL interface to perform operations on the microwire master. - * The microwire master sends different commands to the microwire slave to obtain different data: - * 0xFF->0xFFFF - * 0x1C->0x1C20 - * 0x83->0x1183 - * 0x85->0x1285 - * 0x40->0x1240 - * 0xc0->0x12C0 - * 0x13->0x1340 - * This sample must be used together with sample_spi_microwire_slave. One device functions as the - * master device and the other as the slave device. - */ -#include "main.h" -#include "spi.h" -#include "debug.h" -#include "sample_spi_microwire_master.h" - -#define USER_TIMEOUT 0x400 - -#define MANUAL_MODE_SET_CH0 0xFF -#define MANUAL_MODE_SET_CH1 0x1c -#define MANUAL_MODE_SET_CH2 0x83 -#define MANUAL_MODE_SET_CH3 0x85 -#define MANUAL_MODE_SET_CH4 0x40 -#define MANUAL_MODE_SET_CH5 0xC0 -#define MANUAL_MODE_SET_CH6 0x13 - -#define MAX_TIMEOUT_VAL 5000 - -/** - * @brief Spi microwire master sample processing. - * @param None. - * @retval None. - */ -void MicroWireMasterTestSampleProcessing(void) -{ - unsigned short tempWdata[] = { - MANUAL_MODE_SET_CH0, - MANUAL_MODE_SET_CH1, - MANUAL_MODE_SET_CH2, - MANUAL_MODE_SET_CH3, - MANUAL_MODE_SET_CH4, - MANUAL_MODE_SET_CH5, - MANUAL_MODE_SET_CH6, - MANUAL_MODE_SET_CH2, - MANUAL_MODE_SET_CH3, - MANUAL_MODE_SET_CH4 - }; - unsigned short tempRdata[10] = {0}; - - SystemInit(); - while (1) { - for (int i = 0; i < 7; i++) { /* Test 7 times */ - HAL_SPI_WriteBlocking(&g_spiSampleHandle, (unsigned char *)&tempWdata[i], - sizeof(tempWdata[i]), MAX_TIMEOUT_VAL); - HAL_SPI_ReadBlocking(&g_spiSampleHandle, (unsigned char *)&tempRdata[i], - sizeof(tempRdata[i]), MAX_TIMEOUT_VAL); - BASE_FUNC_DELAY_MS(100); /* Delay 100ms */ - DBG_PRINTF("tempWdata[%d] = 0x%x \r\n", i, tempWdata[i]); - DBG_PRINTF("tempRdata[%d] = 0x%x \r\n", i, tempRdata[i]); - } - BASE_FUNC_DELAY_MS(1000); /* Delay 1000ms */ - } -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_slave/inc/sample_spi_microwire_slave.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_slave/inc/sample_spi_microwire_slave.h deleted file mode 100644 index 4e2f8b390..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_slave/inc/sample_spi_microwire_slave.h +++ /dev/null @@ -1,28 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_spi_microwire_slave.h - * @author MCU Driver Team - * @brief SPI module driver. - * @details This file provides sample code for users to help use - * the functionalities of the SPI. - */ -#ifndef McuMagicTag_SAMPLE_SPI_MICROWRITE_SLAVE_H -#define McuMagicTag_SAMPLE_SPI_MICROWRITE_SLAVE_H - -void MicroWireSlaveTestSampleProcessing(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_slave/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_slave/init/main.c deleted file mode 100644 index 45d94ea93..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_slave/init/main.c +++ /dev/null @@ -1,35 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ -#include "feature.h" -#include "main.h" -#include "sample_spi_microwire_slave.h" - -SPI_Handle g_spiSampleHandle; -UART_Handle g_uart0; - -int main(void) -{ - MicroWireSlaveTestSampleProcessing(); - while (1) { - } - return BASE_STATUS_OK; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_slave/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_slave/init/main.h deleted file mode 100644 index 8467e01ce..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_slave/init/main.h +++ /dev/null @@ -1,46 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "spi.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -extern SPI_Handle g_spiSampleHandle; - -extern UART_Handle g_uart0; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_slave/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_slave/init/system_init.c deleted file mode 100644 index 773a34d97..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_slave/init/system_init.c +++ /dev/null @@ -1,163 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" - -#define UART0_BAND_RATE 115200 - -#define SPI_FREQ_SCR 2 -#define SPI_FREQ_CPSDVSR 10 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void SPI_Init(void) -{ - HAL_CRG_IpEnableSet(SPI_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(SPI_BASE, CRG_PLL_NO_PREDV); - - g_spiSampleHandle.baseAddress = SPI; - g_spiSampleHandle.irqNum = IRQ_SPI; - - g_spiSampleHandle.mode = HAL_SPI_SLAVE; - g_spiSampleHandle.csMode = SPI_CHIP_SELECT_MODE_INTERNAL; - g_spiSampleHandle.xFerMode = HAL_XFER_MODE_BLOCKING; - g_spiSampleHandle.clkPolarity = 0; - g_spiSampleHandle.clkPhase = 0; - g_spiSampleHandle.endian = HAL_SPI_BIG_ENDIAN; - g_spiSampleHandle.frameFormat = HAL_SPI_MODE_MICROWIRE; - g_spiSampleHandle.dataWidth = SPI_DATA_WIDTH_8BIT; - g_spiSampleHandle.freqScr = SPI_FREQ_SCR; - g_spiSampleHandle.freqCpsdvsr = SPI_FREQ_CPSDVSR; - g_spiSampleHandle.waitVal = 127; /* Wait time is 127 clock */ - g_spiSampleHandle.rxBuff = NULL; - g_spiSampleHandle.txBuff = NULL; - g_spiSampleHandle.transferSize = 0; - g_spiSampleHandle.txCount = 0; - g_spiSampleHandle.rxCount = 0; - g_spiSampleHandle.state = HAL_SPI_STATE_RESET; - g_spiSampleHandle.rxIntSize = SPI_RX_INTERRUPT_SIZE_1; - g_spiSampleHandle.txIntSize = SPI_TX_INTERRUPT_SIZE_1; - g_spiSampleHandle.rxDMABurstSize = SPI_RX_DMA_BURST_SIZE_1; - g_spiSampleHandle.txDMABurstSize = SPI_TX_DMA_BURST_SIZE_1; - - HAL_SPI_Init(&g_spiSampleHandle); -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); - - g_uart0.baseAddress = UART0; - g_uart0.irqNum = IRQ_UART0; - - g_uart0.baudRate = UART0_BAND_RATE; - g_uart0.dataLength = UART_DATALENGTH_8BIT; - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; - g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart0); -} - -static void IOConfig(void) -{ - IOConfig_RegStruct *iconfig = IOCONFIG; - - iconfig->iocmg_22.BIT.func = 0x5; /* 0x5 is SPI_CLK */ - iconfig->iocmg_22.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_22.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_22.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_22.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_22.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_18.BIT.func = 0x5; /* 0x5 is SPI_CSN0 */ - iconfig->iocmg_18.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_18.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_18.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_18.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_18.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_21.BIT.func = 0x5; /* 0x5 is SPI_CSN1 */ - iconfig->iocmg_21.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_21.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_21.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_21.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_21.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_20.BIT.func = 0x5; /* 0x5 is SPI_RXD */ - iconfig->iocmg_20.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_20.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_20.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_20.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_20.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_19.BIT.func = 0x5; /* 0x5 is SPI_TXD */ - iconfig->iocmg_19.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_19.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_19.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_19.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_19.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ - iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ - iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - SPI_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_slave/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_slave/readme.md deleted file mode 100644 index 4d4a8a006..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_slave/readme.md +++ /dev/null @@ -1,26 +0,0 @@ -# SPI使用Mircowire帧格式进行主从通信,此示例代码作为从机使用 -## 关键字: SPI, Mircowire, 从机 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、SPI控制器初始化和功能配置。Mircowire从机接收到主机发送的不同数据,来回应给主机不同的数据。 -+ 接收 <-> 发送 -0xFF -> 0xFFFF -0x1C -> 0x1C20 -0x83 -> 0x1183 -0x85 -> 0x1285 -0x40 -> 0x1240 -0xc0 -> 0x12C0 -0x13 -> 0x1340 - -**【示例配置】** -+ 在"SystemInit()”接口中配置SPI时钟极性、时钟相位、帧格式等参数。 - -+ 定义数组,数组中存放从机需要发送的数据。 - -+ 首先从机调用“HAL_SPI_ReadBlocking()”读取主机发过来的数据,根据不同的数据调用“HAL_SPI_WriteBlocking()”发送对应的数据,不断循环进行。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码通过串口不断打印从机接收到的数据。 - -**【注意事项】** -+ 此示例必须配合sample_spi_microwire_master一起使用,使用两个设备一个做master一个做slave。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_slave/src/sample_spi_microwire_slave.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_slave/src/sample_spi_microwire_slave.c deleted file mode 100644 index cb80590c6..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_slave/src/sample_spi_microwire_slave.c +++ /dev/null @@ -1,118 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_spi_microwire_slave.c - * @author MCU Driver Team - * @brief Sample for SPI Module microwire slave. - * @details This sample demonstrates how to use the HAL interface to perform operations on the microwire master. - * The microwire slave receives different commands sent by the master and responds with different data.: - * 0xFF->0xFFFF - * 0x1C->0x1C20 - * 0x83->0x1183 - * 0x85->0x1285 - * 0x40->0x1240 - * 0xc0->0x12C0 - * 0x13->0x1340 - * This sample must be used together with sample_spi_microwire_master. One device functions as the - * master device and the other as the slave device. - */ -#include "main.h" -#include "spi.h" -#include "debug.h" -#include "sample_spi_microwire_slave.h" - -#define USER_TIMEOUT 0x400 - -#define MANUAL_MODE_SET_CH0 0xFFFF -#define MANUAL_MODE_SET_CH1 0x1c20 -#define MANUAL_MODE_SET_CH2 0x1183 -#define MANUAL_MODE_SET_CH3 0x1285 -#define MANUAL_MODE_SET_CH4 0x1240 -#define MANUAL_MODE_SET_CH5 0x12C0 -#define MANUAL_MODE_SET_CH6 0x1340 - -#define MANUAL_MODE_SET_CH0_RX 0xFF -#define MANUAL_MODE_SET_CH1_RX 0x1c -#define MANUAL_MODE_SET_CH2_RX 0x83 -#define MANUAL_MODE_SET_CH3_RX 0x85 -#define MANUAL_MODE_SET_CH4_RX 0x40 -#define MANUAL_MODE_SET_CH5_RX 0xC0 -#define MANUAL_MODE_SET_CH6_RX 0x13 - -#define MAX_TIMEOUT_VAL 5000 - -/** - * @brief Spi microwire slave sample processing. - * @param None. - * @retval None. - */ -void MicroWireSlaveTestSampleProcessing(void) -{ - unsigned short tempWdata[] = { - MANUAL_MODE_SET_CH0, MANUAL_MODE_SET_CH1, - MANUAL_MODE_SET_CH2, MANUAL_MODE_SET_CH3, - MANUAL_MODE_SET_CH4, MANUAL_MODE_SET_CH5, - MANUAL_MODE_SET_CH6, MANUAL_MODE_SET_CH2, - MANUAL_MODE_SET_CH3, MANUAL_MODE_SET_CH4 - }; - unsigned short tempRxData = 0; - - SystemInit(); - while (1) { - HAL_SPI_ReadBlocking(&g_spiSampleHandle, (unsigned char *)&tempRxData, sizeof(tempRxData), MAX_TIMEOUT_VAL); - switch (tempRxData) { - case MANUAL_MODE_SET_CH0_RX : - /* Send the 0 piece of data. */ - HAL_SPI_WriteBlocking(&g_spiSampleHandle, (unsigned char *)&tempWdata[0], - sizeof(tempWdata[0]), MAX_TIMEOUT_VAL); /* Send the 0 piece of data. */ - break; - case MANUAL_MODE_SET_CH1_RX : - /* Send the 1 piece of data. */ - HAL_SPI_WriteBlocking(&g_spiSampleHandle, (unsigned char *)&tempWdata[1], - sizeof(tempWdata[1]), MAX_TIMEOUT_VAL); /* Send the 1 piece of data. */ - break; - case MANUAL_MODE_SET_CH2_RX : - /* Send the 2 piece of data. */ - HAL_SPI_WriteBlocking(&g_spiSampleHandle, (unsigned char *)&tempWdata[2], - sizeof(tempWdata[2]), MAX_TIMEOUT_VAL); /* Send the 2 piece of data. */ - break; - case MANUAL_MODE_SET_CH3_RX : - /* Send the 3 piece of data. */ - HAL_SPI_WriteBlocking(&g_spiSampleHandle, (unsigned char *)&tempWdata[3], - sizeof(tempWdata[3]), MAX_TIMEOUT_VAL); /* Send the 3 piece of data. */ - break; - case MANUAL_MODE_SET_CH4_RX : - /* Send the 4 piece of data. */ - HAL_SPI_WriteBlocking(&g_spiSampleHandle, (unsigned char *)&tempWdata[4], - sizeof(tempWdata[4]), MAX_TIMEOUT_VAL); /* Send the 4 piece of data. */ - break; - case MANUAL_MODE_SET_CH5_RX : - /* Send the 5 piece of data. */ - HAL_SPI_WriteBlocking(&g_spiSampleHandle, (unsigned char *)&tempWdata[5], - sizeof(tempWdata[5]), MAX_TIMEOUT_VAL); /* Send the 5 piece of data. */ - break; - case MANUAL_MODE_SET_CH6_RX : - /* Send the 6 piece of data. */ - HAL_SPI_WriteBlocking(&g_spiSampleHandle, (unsigned char *)&tempWdata[6], - sizeof(tempWdata[6]), MAX_TIMEOUT_VAL); /* Send the 6 piece of data. */ - break; - default : - break; - } - DBG_PRINTF("tempRxData = 0x%x \r\n", tempRxData); - } -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_slave/inc/sample_spi_slave.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_slave/inc/sample_spi_slave.h deleted file mode 100644 index d8995810a..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_slave/inc/sample_spi_slave.h +++ /dev/null @@ -1,28 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_spi_slave.h - * @author MCU Driver Team - * @brief SPI module driver. - * @details This file provides sample code for users to help use - * the functionalities of the SPI. - */ -#ifndef McuMagicTag_SAMPLE_SPI_SLAVE_H -#define McuMagicTag_SAMPLE_SPI_SLAVE_H - -void SlaveTestSampleProcessing(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_slave/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_slave/init/main.c deleted file mode 100644 index 7ca5712ac..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_slave/init/main.c +++ /dev/null @@ -1,35 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ -#include "feature.h" -#include "main.h" -#include "sample_spi_slave.h" - -SPI_Handle g_spiSampleHandle; -UART_Handle g_uart0; - -int main(void) -{ - SlaveTestSampleProcessing(); - while (1) { - } - return BASE_STATUS_OK; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_slave/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_slave/init/main.h deleted file mode 100644 index 8467e01ce..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_slave/init/main.h +++ /dev/null @@ -1,46 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "spi.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -extern SPI_Handle g_spiSampleHandle; - -extern UART_Handle g_uart0; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_slave/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_slave/init/system_init.c deleted file mode 100644 index 7b573b09c..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_slave/init/system_init.c +++ /dev/null @@ -1,163 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" - -#define UART0_BAND_RATE 115200 - -#define SPI_FREQ_SCR 2 -#define SPI_FREQ_CPSDVSR 10 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void SPI_Init(void) -{ - HAL_CRG_IpEnableSet(SPI_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(SPI_BASE, CRG_PLL_NO_PREDV); - - g_spiSampleHandle.baseAddress = SPI; - g_spiSampleHandle.irqNum = IRQ_SPI; - - g_spiSampleHandle.mode = HAL_SPI_SLAVE; - g_spiSampleHandle.csMode = SPI_CHIP_SELECT_MODE_INTERNAL; - g_spiSampleHandle.xFerMode = HAL_XFER_MODE_BLOCKING; - g_spiSampleHandle.clkPolarity = 0; - g_spiSampleHandle.clkPhase = 0; - g_spiSampleHandle.endian = HAL_SPI_BIG_ENDIAN; - g_spiSampleHandle.frameFormat = HAL_SPI_MODE_MOTOROLA; - g_spiSampleHandle.dataWidth = SPI_DATA_WIDTH_16BIT; - g_spiSampleHandle.freqScr = SPI_FREQ_SCR; - g_spiSampleHandle.freqCpsdvsr = SPI_FREQ_CPSDVSR; - g_spiSampleHandle.waitVal = 127; /* Wait time is 127 clock */ - g_spiSampleHandle.rxBuff = NULL; - g_spiSampleHandle.txBuff = NULL; - g_spiSampleHandle.transferSize = 0; - g_spiSampleHandle.txCount = 0; - g_spiSampleHandle.rxCount = 0; - g_spiSampleHandle.state = HAL_SPI_STATE_RESET; - g_spiSampleHandle.rxIntSize = SPI_RX_INTERRUPT_SIZE_1; - g_spiSampleHandle.txIntSize = SPI_TX_INTERRUPT_SIZE_1; - g_spiSampleHandle.rxDMABurstSize = SPI_RX_DMA_BURST_SIZE_1; - g_spiSampleHandle.txDMABurstSize = SPI_TX_DMA_BURST_SIZE_1; - - HAL_SPI_Init(&g_spiSampleHandle); -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); - - g_uart0.baseAddress = UART0; - g_uart0.irqNum = IRQ_UART0; - - g_uart0.baudRate = UART0_BAND_RATE; - g_uart0.dataLength = UART_DATALENGTH_8BIT; - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; - g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart0); -} - -static void IOConfig(void) -{ - IOConfig_RegStruct *iconfig = IOCONFIG; - - iconfig->iocmg_22.BIT.func = 0x5; /* 0x5 is SPI_CLK */ - iconfig->iocmg_22.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_22.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_22.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_22.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_22.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_18.BIT.func = 0x5; /* 0x5 is SPI_CSN0 */ - iconfig->iocmg_18.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_18.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_18.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_18.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_18.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_21.BIT.func = 0x5; /* 0x5 is SPI_CSN1 */ - iconfig->iocmg_21.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_21.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_21.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_21.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_21.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_20.BIT.func = 0x5; /* 0x5 is SPI_RXD */ - iconfig->iocmg_20.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_20.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_20.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_20.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_20.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_19.BIT.func = 0x5; /* 0x5 is SPI_TXD */ - iconfig->iocmg_19.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_19.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_19.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_19.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_19.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ - iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ - iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - SPI_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_slave/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_slave/readme.md deleted file mode 100644 index 1fdf39cdf..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_slave/readme.md +++ /dev/null @@ -1,18 +0,0 @@ -# SPI使用阻塞方式进行主从通信,此示例代码作为从机使用 -## 关键字: SPI, 阻塞, 从机 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、SPI控制器初始化和功能配置。从机读主机数据或者向主机发送数据。 - -**【示例配置】** -+ 在"SystemInit()”接口中配置SPI时钟极性、时钟相位、帧格式等参数。 - -+ 定义数组,数组中存放从机需要发送的数据。 - -+ 首先从机调用“HAL_SPI_ReadBlocking()”读取主机发过来的10个数据,之后调用“HAL_SPI_WriteBlocking()”写10个数据,最后调用“HAL_SPI_WriteReadBlocking()”边写边读10个数据,不断循环。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成后,示例代码通过串口不断打印从机接收到的数据、发送的数据。 - -**【注意事项】** -+ 使用此示例代码必须对接master设备。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_slave/src/sample_spi_slave.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_slave/src/sample_spi_slave.c deleted file mode 100644 index e6957a578..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_slave/src/sample_spi_slave.c +++ /dev/null @@ -1,97 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_spi_slave.c - * @author MCU Driver Team - * @brief Sample for SPI Module slave. - * @details This sample demonstrates the use of HAL interfaces in the salve mode. This sample uses the blocking mode. - * This sample must be connected to the master device. - * This sample sends 0x1105, 0x1c20, 0x1183, 0x1285, 0x1240, 0x12c0, and 0x1340 in polling mode. - * Print the received and sent data through the serial port. - */ -#include "main.h" -#include "spi.h" -#include "debug.h" -#include "sample_spi_slave.h" - -#define SLAVE_READ_TESE -#define SLAVE_READ_WRITE_TESE -#define SLAVE_WRITE_TESE - -#define USER_TIMEOUT 0x400 - -#define MANUAL_MODE_SET_CH0 0x1105 -#define MANUAL_MODE_SET_CH1 0x1c20 -#define MANUAL_MODE_SET_CH2 0x1183 -#define MANUAL_MODE_SET_CH3 0x1285 -#define MANUAL_MODE_SET_CH4 0x1240 -#define MANUAL_MODE_SET_CH5 0x12C0 -#define MANUAL_MODE_SET_CH6 0x1340 - -#define MAX_TIMEOUT_VAL 5000 - - -/** - * @brief Spi slave sample processing. - * @param None. - * @retval None. - */ -void SlaveTestSampleProcessing(void) -{ - unsigned short tempWdata[] = { - MANUAL_MODE_SET_CH0, - MANUAL_MODE_SET_CH1, - MANUAL_MODE_SET_CH2, - MANUAL_MODE_SET_CH3, - MANUAL_MODE_SET_CH4, - MANUAL_MODE_SET_CH5, - MANUAL_MODE_SET_CH6, - MANUAL_MODE_SET_CH2, - MANUAL_MODE_SET_CH3, - MANUAL_MODE_SET_CH4 - }; - unsigned short tempRdata[10] = {0}; - - SystemInit(); - while (1) { -#ifdef SLAVE_READ_TESE - HAL_SPI_ReadBlocking(&g_spiSampleHandle, (unsigned char *)tempRdata, sizeof(tempRdata), MAX_TIMEOUT_VAL); - for (int i = 0; i < 10; i++) { /* Print the test data for 10 times. */ - DBG_PRINTF("tempRdata[%d] = 0x%x \r\n", i, tempRdata[i]); - BASE_FUNC_DELAY_MS(10); /* Delay 10ms */ - } -#endif - -#ifdef SLAVE_WRITE_TESE - for (int i = 0; i < 10; i++) { /* Print the test data for 10 times. */ - DBG_PRINTF("tempWdata[%d] = 0x%x \r\n", i, tempWdata[i]); - BASE_FUNC_DELAY_MS(10); /* Delay 10ms */ - } - HAL_SPI_WriteBlocking(&g_spiSampleHandle, (unsigned char *)tempWdata, sizeof(tempWdata), MAX_TIMEOUT_VAL); -#endif - -#ifdef SLAVE_READ_WRITE_TESE - HAL_SPI_WriteReadBlocking(&g_spiSampleHandle, (unsigned char *)tempRdata, - (unsigned char *)tempWdata, - sizeof(tempWdata), MAX_TIMEOUT_VAL); - for (int i = 0; i < 10; i++) { /* Print the test data for 10 times. */ - DBG_PRINTF("tempRdata[%d] = 0x%x tempWdata[%d] = 0x%x \r\n", i, tempRdata[i], i, tempWdata[i]); - BASE_FUNC_DELAY_MS(10); /* Delay 10ms */ - } -#endif - } -} diff --git a/vendor/yibaina_3061M/demo/drivers_sample/timer/sample_timer_interrupt/inc/sample_timer_interrupt.h b/vendor/yibaina_3061M/demo/drivers_sample/timer/sample_timer_interrupt/inc/sample_timer_interrupt.h deleted file mode 100644 index d7beb574a..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/timer/sample_timer_interrupt/inc/sample_timer_interrupt.h +++ /dev/null @@ -1,32 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_timer_interrupt.h - * @author MCU Driver Team - * @brief timer sample module. - * @details This file provides users with sample code to help use TIMER function: - * TIMER runs and triggers an interrupt. - */ -#ifndef SAMPLE_TIMER_INTERRUPT_H -#define SAMPLE_TIMER_INTERRUPT_H - -#include "debug.h" -#include "timer.h" -#include "main.h" - -void TIMER_SampleMain(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/timer/sample_timer_interrupt/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/timer/sample_timer_interrupt/init/main.c deleted file mode 100644 index b647662a0..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/timer/sample_timer_interrupt/init/main.c +++ /dev/null @@ -1,48 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ - -#include "typedefs.h" -#include "feature.h" -#include "sample_timer_interrupt.h" -#include "main.h" -/* USER CODE BEGIN 0 */ -/* USER CODE END 0 */ -TIMER_Handle g_timerHandle; -UART_Handle g_uart0Handle; -/* USER CODE BEGIN 1 */ -/* USER CODE END 1 */ - -int main(void) -{ - /* USER CODE BEGIN 2 */ - /* USER CODE END 2 */ - TIMER_SampleMain(); - /* USER CODE BEGIN 3 */ - /* USER CODE END 3 */ - while (1) { - /* USER CODE BEGIN 4 */ - /* USER CODE END 4 */ - } - /* USER CODE BEGIN 5 */ - /* USER CODE END 5 */ - return BASE_STATUS_OK; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/timer/sample_timer_interrupt/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/timer/sample_timer_interrupt/init/main.h deleted file mode 100644 index 8a102586d..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/timer/sample_timer_interrupt/init/main.h +++ /dev/null @@ -1,52 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "uart_ex.h" -#include "timer.h" -#include "timer_ex.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -#define XTAL_DRV_LEVEL4 0x03U -#define XTAL_DRV_LEVEL3 0x02U -#define XTAL_DRV_LEVEL2 0x01U -#define XTAL_DRV_LEVEL1 0x00U - -extern TIMER_Handle g_timerHandle; -extern UART_Handle g_uart0Handle; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); -void TIMER0_InterruptProcess(void *handle); -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/timer/sample_timer_interrupt/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/timer/sample_timer_interrupt/init/system_init.c deleted file mode 100644 index 6dc29e612..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/timer/sample_timer_interrupt/init/system_init.c +++ /dev/null @@ -1,123 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" -#include "iocmg.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 48; /* PLL Multiplier 48 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_2; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; - crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; - crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; - - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -__weak void TIMER0_InterruptProcess(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN TIMER0_InterruptProcess */ - /* USER CODE END TIMER0_InterruptProcess */ -} - -static void TIMER0_Init(void) -{ - HAL_CRG_IpEnableSet(TIMER0_BASE, IP_CLK_ENABLE); - - unsigned int load = HAL_CRG_GetIpFreq((void *)TIMER0) / 1000000u * 1000000; - - g_timerHandle.baseAddress = TIMER0; - g_timerHandle.load = load - 1; /* Set timer value immediately */ - g_timerHandle.bgLoad = load - 1; /* Set timer value */ - g_timerHandle.mode = TIMER_MODE_RUN_PERIODIC; /* Run in period mode */ - g_timerHandle.prescaler = TIMERPRESCALER_NO_DIV; /* Don't frequency division */ - g_timerHandle.size = TIMER_SIZE_32BIT; /* 1 for 32bit, 0 for 16bit */ - g_timerHandle.interruptEn = BASE_CFG_ENABLE; - g_timerHandle.adcSocReqEnable = BASE_CFG_DISABLE; - g_timerHandle.dmaReqEnable = BASE_CFG_DISABLE; - HAL_TIMER_Init(&g_timerHandle); - IRQ_Register(IRQ_TIMER0, HAL_TIMER_IrqHandler, &g_timerHandle); - - HAL_TIMER_RegisterCallback(&g_timerHandle, TIMER_PERIOD_FIN, TIMER0_InterruptProcess); - IRQ_SetPriority(IRQ_TIMER0, 1); - IRQ_EnableN(IRQ_TIMER0); -} - - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - - g_uart0Handle.baseAddress = UART0; - - g_uart0Handle.baudRate = UART0_BAND_RATE; - g_uart0Handle.dataLength = UART_DATALENGTH_8BIT; - g_uart0Handle.stopBits = UART_STOPBITS_ONE; - g_uart0Handle.parity = UART_PARITY_NONE; - g_uart0Handle.txMode = UART_MODE_BLOCKING; - g_uart0Handle.rxMode = UART_MODE_BLOCKING; - g_uart0Handle.fifoMode = BASE_CFG_ENABLE; - g_uart0Handle.fifoTxThr = UART_FIFODEPTH_SIZE8; - g_uart0Handle.fifoRxThr = UART_FIFODEPTH_SIZE8; - g_uart0Handle.hwFlowCtr = BASE_CFG_DISABLE; - g_uart0Handle.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; - g_uart0Handle.handleEx.msbFirst = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart0Handle); -} - -static void IOConfig(void) -{ - HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - TIMER0_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/timer/sample_timer_interrupt/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/timer/sample_timer_interrupt/readme.md deleted file mode 100644 index 613a6bda8..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/timer/sample_timer_interrupt/readme.md +++ /dev/null @@ -1,18 +0,0 @@ -# 周期为1秒的定时器 -## 关键字: TIMER, 定时器周期 - -**【功能描述】** -+ 该示例中TIMER每秒产生一个中断,同时定义了一个中断处理函数,该中断处理函数完成串口输出。 - -+ 在TIMER运行过程中,修改TIMER的load影子寄存器,将其定时周期修改为0.5秒。 - -**【示例配置】** -+ 示例默认配置定时周期为1秒,对应的IDE配置参数为“Period(us)”,用户可通过更改此参数,设定定时器的周期。 - -+ 定时器计时10s之后,通过“HAL_TIMER_Config”函数,将定时器的周期减半。 - -**【示例效果】** -+ 中断处理函数按照Timer设置周期执行, 在串口上每秒或者0.5秒打印字符串"In Interrupt"。 - -**【注意事项】** -+ 串口0输出提示信息。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/timer/sample_timer_interrupt/src/sample_timer_interrupt.c b/vendor/yibaina_3061M/demo/drivers_sample/timer/sample_timer_interrupt/src/sample_timer_interrupt.c deleted file mode 100644 index fb3756896..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/timer/sample_timer_interrupt/src/sample_timer_interrupt.c +++ /dev/null @@ -1,65 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_timer_interrupt.c - * @author MCU Driver Team - * @brief timer sample module. - * @details This file provides users with sample code to help use TIMER function: - * 1) TIMER runs period and triggers an interrupt every second. - * 2) Change the period during TIMER running - * Phenomenon: - * The interrupt handler is executed every 1 second, after 10 second, the interrupt handler execute - * every 0.5 second and print "In interrupt" on the serial port. - */ -#include "sample_timer_interrupt.h" - -void TIMER0_InterruptProcess(void *handle); - -/** - * @brief Timer run and triggers an interrupt. - * @param None. - * @retval None. - */ -void TIMER_SampleMain(void) -{ - TIMER_Handle timerHandle; - - SystemInit(); - DBG_PRINTF("TIMER_SampleMain begin\r\n"); - HAL_TIMER_Start(&g_timerHandle); - - BASE_FUNC_DelaySeconds(10); /* Delay 10 seconds */ - DBG_PRINTF("Change period of timer\r\n"); - timerHandle.baseAddress = g_timerHandle.baseAddress; - HAL_TIMER_GetConfig(&timerHandle); - timerHandle.bgLoad = HAL_CRG_GetIpFreq((void *)TIMER0) >> 1; - HAL_TIMER_Config(&timerHandle, TIMER_CFG_BGLOAD); -} - -/** - * @brief Timer Interrupt callback function - * @param handle Handle of Timer - * @retval None. - */ -void TIMER0_InterruptProcess(void *handle) -{ - /* USER CODE BEGIN TIMER0_InterruptProcess */ - TIMER_Handle *timerHandle = (TIMER_Handle *)handle; - BASE_FUNC_UNUSED(timerHandle); - DBG_PRINTF("In interrupt\r\n"); - /* USER CODE END TIMER0_InterruptProcess */ -} diff --git a/vendor/yibaina_3061M/demo/drivers_sample/tsensor/sample_tsensor/inc/sample_tsensor.h b/vendor/yibaina_3061M/demo/drivers_sample/tsensor/sample_tsensor/inc/sample_tsensor.h deleted file mode 100644 index 48f59c161..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/tsensor/sample_tsensor/inc/sample_tsensor.h +++ /dev/null @@ -1,32 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_tsensor.h - * @author MCU Driver Team - * @brief tsensor sample module. - * @details This file provides sample to get temperature of mcu by using tsensor. - */ - -/* Includes ------------------------------------------------------------------*/ -#ifndef SAMPLE_TSENSOR_SAMPLE_H -#define SAMPLE_TSENSOR_SAMPLE_H - -#include "debug.h" -#include "tsensor.h" - -void TSENSOR_GetAveTemp(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/tsensor/sample_tsensor/readme.txt b/vendor/yibaina_3061M/demo/drivers_sample/tsensor/sample_tsensor/readme.txt deleted file mode 100644 index 9e2972782..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/tsensor/sample_tsensor/readme.txt +++ /dev/null @@ -1,6 +0,0 @@ -“sample_tsensor”示例代码提供示例功能: -利用ADC内置的TSENEOR模块,对器件结温进行采集,示例返回为摄氏度。 - -示例代码中配置如下: -(1)示例中连续采样16次后,算出平均温度 -(2)示例中TSENSOR,使用ADC1_SOC15进行配置和采样 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/tsensor/sample_tsensor/src/sample_tsensor.c b/vendor/yibaina_3061M/demo/drivers_sample/tsensor/sample_tsensor/src/sample_tsensor.c deleted file mode 100644 index 82ec4c011..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/tsensor/sample_tsensor/src/sample_tsensor.c +++ /dev/null @@ -1,48 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_tsensor.c - * @author MCU Driver Team - * @brief tsensor sample module. - * @details This file provides sample to get temperature of mcu by using tsensor. - */ -#include "sample_tsensor.h" - -#define SAMPLE_COUNT 16 - -/** - * @brief Tsensor samples 16 times, takes the average value, and converts the average value to degrees Celsius. - * @param None. - * @retval None. - */ -void TSENSOR_GetAveTemp(void) -{ - DBG_UartPrintInit(BAUDRATE); - float total = 0; - float ret; - float aveTemp; - HAL_TSENSOR_Init(); - /* Tsensor cyclic sampling */ - for (int i = 0; i < SAMPLE_COUNT; ++i) { - ret = HAL_TSENSOR_GetTemperature(); - total += ret; - } - /* Converting the sampled average value of the test sensor to temperature */ - aveTemp = total / SAMPLE_COUNT; - DBG_PRINTF("Tsensor Average temperature: %f\r\n", aveTemp); - return; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_baud_detect/inc/sample_uart_baud_detect.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_baud_detect/inc/sample_uart_baud_detect.h deleted file mode 100644 index 31e67eb8f..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_baud_detect/inc/sample_uart_baud_detect.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_uart_baud_detect.h - * @author MCU Driver Team - * @brief uart baud detection sample module. - * @details This file provides sample code for users to help use - * the baud detection of the UART. Send char 'Z' to the UART to complete the baud rate detection. - */ -#ifndef SAMPLE_UART_INTERRUPT_TRANSMIT_H -#define SAMPLE_UART_INTERRUPT_TRANSMIT_H - -#include "debug.h" -#include "uart.h" -#include "interrupt.h" -#include "main.h" - -void UART_BaudDetection(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_baud_detect/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_baud_detect/init/main.c deleted file mode 100644 index 055dc2638..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_baud_detect/init/main.c +++ /dev/null @@ -1,50 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ - -#include "typedefs.h" -#include "feature.h" -#include "sample_uart_baud_detect.h" -#include "main.h" -/* USER CODE BEGIN 0 */ -/* USER CODE END 0 */ -UART_Handle g_uart; -/* USER CODE BEGIN 1 */ -/* USER CODE END 1 */ - -int main(void) -{ - /* USER CODE BEGIN 2 */ - /* USER CODE END 2 */ - UART_BaudDetection(); - /* USER CODE BEGIN 3 */ - /* USER CODE END 3 */ - while (1) { - /* USER CODE BEGIN 4 */ - /* USER CODE END 4 */ - } - /* USER CODE BEGIN 5 */ - /* USER CODE END 5 */ - return BASE_STATUS_OK; -} - -/* USER CODE BEGIN 6 */ -/* USER CODE END 6 */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_baud_detect/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_baud_detect/init/main.h deleted file mode 100644 index 88aaeab8a..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_baud_detect/init/main.h +++ /dev/null @@ -1,55 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "uart_ex.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -#define XTAL_DRV_LEVEL4 0x03U -#define XTAL_DRV_LEVEL3 0x02U -#define XTAL_DRV_LEVEL2 0x01U -#define XTAL_DRV_LEVEL1 0x00U - -extern UART_Handle g_uart; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -void UART0InterruptErrorCallback(void *handle); -void UART0WriteInterruptCallback(void *handle); -void UART0ReadInterruptCallback(void *handle); -void UART_BaudDetectCallBack_Ok(void *handle); -void UART_BaudDetectCallBack_Error(void *handle); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_baud_detect/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_baud_detect/init/system_init.c deleted file mode 100644 index f6ab9c7b6..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_baud_detect/init/system_init.c +++ /dev/null @@ -1,136 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" -#include "iocmg.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 48; /* PLL Multiplier 48 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_2; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; - crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; - crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; - - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -__weak void UART0InterruptErrorCallback(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN UART0_TRNS_IT_ERROR */ - /* USER CODE END UART0_TRNS_IT_ERROR */ -} - -__weak void UART0WriteInterruptCallback(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN UART0_WRITE_IT_FINISH */ - /* USER CODE END UART0_WRITE_IT_FINISH */ -} - -__weak void UART0ReadInterruptCallback(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN UART0_READ_IT_FINISH */ - /* USER CODE END UART0_READ_IT_FINISH */ -} - -__weak void UART_BaudDetectCallBack_Ok(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN UART_BaudDetectCallBack_Ok */ - /* USER CODE END UART_BaudDetectCallBack_Ok */ -} - -__weak void UART_BaudDetectCallBack_Error(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN UART_BaudDetectCallBack_Error */ - /* USER CODE END UART_BaudDetectCallBack_Error */ -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - - g_uart.baseAddress = UART0; - - g_uart.baudRate = UART0_BAND_RATE; - g_uart.dataLength = UART_DATALENGTH_8BIT; - g_uart.stopBits = UART_STOPBITS_ONE; - g_uart.parity = UART_PARITY_NONE; - g_uart.txMode = UART_MODE_INTERRUPT; - g_uart.rxMode = UART_MODE_INTERRUPT; - g_uart.fifoMode = BASE_CFG_ENABLE; - g_uart.fifoTxThr = UART_FIFODEPTH_SIZE8; - g_uart.fifoRxThr = UART_FIFODEPTH_SIZE8; - g_uart.hwFlowCtr = BASE_CFG_DISABLE; - g_uart.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; - g_uart.handleEx.msbFirst = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart); - HAL_UART_EnableBaudDetectionEx(&g_uart); - HAL_UART_RegisterCallBack(&g_uart, UART_BAUD_DETECT_FINISH, UART_BaudDetectCallBack_Ok); - HAL_UART_RegisterCallBack(&g_uart, UART_BAUD_DETECT_ERROR, UART_BaudDetectCallBack_Error); - HAL_UART_RegisterCallBack(&g_uart, UART_TRNS_IT_ERROR, UART0InterruptErrorCallback); - HAL_UART_RegisterCallBack(&g_uart, UART_WRITE_IT_FINISH, UART0WriteInterruptCallback); - HAL_UART_RegisterCallBack(&g_uart, UART_READ_IT_FINISH, UART0ReadInterruptCallback); - - IRQ_Register(IRQ_UART0, HAL_UART_IrqHandler, &g_uart); - IRQ_SetPriority(IRQ_UART0, 1); - IRQ_EnableN(IRQ_UART0); -} - -static void IOConfig(void) -{ - HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_baud_detect/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_baud_detect/readme.md deleted file mode 100644 index 65f48e6ab..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_baud_detect/readme.md +++ /dev/null @@ -1,19 +0,0 @@ -# UART波特率自检 -## 关键字: UART, 波特率自检 - -**【功能描述】** -+ 能够识别总线上的波特率,并自动配置UART的波特率。 - -**【示例配置】** -+ 特定字符发送:若要检测波特率,需要向串口发送大写字符“Z”,代码中有成功检测标志"baudCheck", 可以依据检测成功标志,实现后续逻辑。 - -+ 波特率检测中断:波特率检测成功之后,会调用波特率检测成功函数"UART_BaudDetectCallBack_Ok", 用户可以使用"HAL_UART_RegisterCallBack"进行更改。 - - -**【示例效果】** -+ 向串口0发送大写字符"Z",如果串口输出“UART_BaudDetectCallBack_Ok”字符,则代表波特率检测成功。 - -**【注意事项】** -+ 串口波特率不一致时,需要先完成波特率的检测。 - -+ 需要向串口发送特定字符“Z”,才能触发波特率检测。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_baud_detect/src/sample_uart_baud_detect.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_baud_detect/src/sample_uart_baud_detect.c deleted file mode 100644 index e5ef4e17d..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_baud_detect/src/sample_uart_baud_detect.c +++ /dev/null @@ -1,67 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_uart_baud_detect.c - * @author MCU Driver Team - * @brief uart baud detection sample module. - * @details This file provides sample code for users to help use - * the baud detection of the UART. Send char 'Z' to the UART to complete the baud rate detection. - */ -#include "sample_uart_baud_detect.h" - -static bool baudCheck = BASE_CFG_DISABLE; /* Flag of baud detection. */ - -/** - * @brief UART baud detection success callback. - * @param None. - * @retval None. - */ -void UART_BaudDetectCallBack_Ok(void *handle) -{ - UART_Handle *uartHandle = (UART_Handle *)handle; - BASE_FUNC_UNUSED(uartHandle); - DBG_PRINTF("UART_BaudDetectCallBack_Ok\r\n"); - baudCheck = BASE_CFG_ENABLE; -} - -/** - * @brief UART baud detection error callback. - * @param None. - * @retval None. - */ -void UART_BaudDetectCallBack_Error(void *handle) -{ - UART_Handle *uartHandle = (UART_Handle *)handle; - BASE_FUNC_UNUSED(uartHandle); - /* Enable tx and rx. */ - uartHandle->baseAddress->UART_CR.BIT.txe = BASE_CFG_ENABLE; - uartHandle->baseAddress->UART_CR.BIT.rxe = BASE_CFG_ENABLE; - DBG_PRINTF("UART_BaudDetectCallBack_Error\r\n"); - baudCheck = BASE_CFG_DISABLE; -} - -/** - * @brief UART baud detection. - * @param None. - * @retval None. - */ -void UART_BaudDetection(void) -{ - SystemInit(); - /* Send char 'Z' to the UART to complete the baud rate detection. */ - return; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_rx/inc/sample_uart_blocking_rx.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_rx/inc/sample_uart_blocking_rx.h deleted file mode 100644 index 6fefb5099..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_rx/inc/sample_uart_blocking_rx.h +++ /dev/null @@ -1,35 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_uart_blocking_rx.h - * @author MCU Driver Team - * @brief uart sample module. - * @details This file provides sample code for users to help use - * the transmission of the UART in blocking mode. - */ - -/* Includes ------------------------------------------------------------------*/ -#ifndef SAMPLE_UART_BLOCKING_RX_H -#define SAMPLE_UART_BLOCKING_RX_H - -#include "uart.h" -#include "debug.h" -#include "interrupt.h" -#include "main.h" - -void UART_BlcokingRX(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_rx/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_rx/init/main.c deleted file mode 100644 index 1ce0ab892..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_rx/init/main.c +++ /dev/null @@ -1,34 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ -#include "feature.h" -#include "main.h" -#include "sample_uart_blocking_rx.h" - -UART_Handle g_uart; - -int main(void) -{ - UART_BlcokingRX(); - while (1) { - } - return BASE_STATUS_OK; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_rx/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_rx/init/main.h deleted file mode 100644 index 48319a4fd..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_rx/init/main.h +++ /dev/null @@ -1,43 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -extern UART_Handle g_uart; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_rx/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_rx/init/system_init.c deleted file mode 100644 index dbefea54e..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_rx/init/system_init.c +++ /dev/null @@ -1,90 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" -#include "iocmg.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_XTAL; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = 0; - crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; - crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_1; - - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - - g_uart.baseAddress = UART0; - - g_uart.baudRate = UART0_BAND_RATE; - g_uart.dataLength = UART_DATALENGTH_8BIT; - g_uart.stopBits = UART_STOPBITS_ONE; - g_uart.parity = UART_PARITY_NONE; - g_uart.txMode = UART_MODE_BLOCKING; - g_uart.rxMode = UART_MODE_BLOCKING; - g_uart.fifoMode = BASE_CFG_ENABLE; - g_uart.fifoTxThr = UART_FIFODEPTH_SIZE8; - g_uart.fifoRxThr = UART_FIFODEPTH_SIZE8; - g_uart.hwFlowCtr = BASE_CFG_DISABLE; - g_uart.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; - g_uart.handleEx.msbFirst = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart); -} - -static void IOConfig(void) -{ - HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_rx/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_rx/readme.md deleted file mode 100644 index 8574d7929..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_rx/readme.md +++ /dev/null @@ -1,23 +0,0 @@ -# UART阻塞模式接收数据 -## 关键字: UART, 阻塞模式接收 - -**【功能描述】** -+ 在阻塞下模式下,阻塞一段时间等待UART接收数据,接收到的数据从预设置的缓存中读取。 - -+ 阻塞模式下的超时等待时间为2000ms。 - -**【示例配置】** -+ 预设置的缓存:需要使用者自行开辟内存空间,将内存首地址和需要接收的字符长度作为入参传入HAL_UART_ReadBlocking()。 - -+ 超时时间配置:通过“HAL_UART_ReadBlocking()”进行配置,单位为ms。 - -+ HAL_UART_ReadBlocking()返回值BASE_STATUS_OK,表示在给定时间内,接收完数据,可以在缓存中读取数据;返回值为 -BASE_STATUS_TIMEOUT,表示在规定时间内,未能完成数据接收;其他返回值,表示错误。 - -+ 串口0会打印出接收到的数据和超时提示。 - -**【示例效果】** -+ 向串口0发送数据,串口0会将接收的数据打印,若超过设定的超时时间未接收到数据会打印“Receive time out!”。 - -**【注意事项】** -+ 串口通信的波特率,校验位等配置需保持一致,可以通过UART配置界面进行更改。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_rx/src/sample_uart_blocking_rx.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_rx/src/sample_uart_blocking_rx.c deleted file mode 100644 index a33f20741..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_rx/src/sample_uart_blocking_rx.c +++ /dev/null @@ -1,53 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_uart_blocking_rx.c - * @author MCU Driver Team - * @brief uart sample module. - * @details In blocking mode, the ADC blocks for a period of time and waits for the UART to receive data. - * The received data is read from the preset buffer. - * (1)Preset buffer: The user needs to create the memory space. - * (2)Blocking time: It is as HAL_UART_ReadBlocking() parameter and the unit is ms. - * (3)Result judgment: BASE_STATUS_OK, indicating that data receive successfully. The return value is - * BASE_STATUS_TIMEOUT, indicating that data reception fails within the specified time. - * Other return values, indicating an error. - */ -#include "sample_uart_blocking_rx.h" -#define BLOCKING_TIME 2000 - -/** - * @brief UART blocking receive sample code. - * @param None. - * @retval None. - */ -void UART_BlcokingRX(void) -{ - SystemInit(); - unsigned char rxStr[20] = {0}; /* rxStr[20], Receive memory address */ - DBG_PRINTF("RX: UART Init finish\r\n"); - unsigned int ret; - while (1) { - ret = HAL_UART_ReadBlocking(&g_uart, rxStr, 5, BLOCKING_TIME); /* 5 is data length, 2000 is timeout limit */ - if (ret == BASE_STATUS_OK) { - DBG_PRINTF("Receive success: %s \r\n", rxStr); - } else if (ret == BASE_STATUS_TIMEOUT) { - DBG_PRINTF("Receive time out!\r\n"); - } else { - DBG_PRINTF("Receive verification error!\r\n"); - } - } -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_tx/inc/sample_uart_blocking_tx.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_tx/inc/sample_uart_blocking_tx.h deleted file mode 100644 index ba885e50e..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_tx/inc/sample_uart_blocking_tx.h +++ /dev/null @@ -1,35 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_uart_blocking_tx.h - * @author MCU Driver Team - * @brief uart sample module. - * @details This file provides sample code for users to help use - * the transmission of the UART in blocking mode. - */ - -/* Includes ------------------------------------------------------------------*/ -#ifndef SAMPLE_UART_BLOCKING_TX_H -#define SAMPLE_UART_BLOCKING_TX_H - -#include "uart.h" -#include "debug.h" -#include "interrupt.h" -#include "main.h" - -void UART_BlcokingTX(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_tx/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_tx/init/main.c deleted file mode 100644 index c97ce182c..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_tx/init/main.c +++ /dev/null @@ -1,34 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ -#include "feature.h" -#include "main.h" -#include "sample_uart_blocking_tx.h" - -UART_Handle g_uart; - -int main(void) -{ - UART_BlcokingTX(); - while (1) { - } - return BASE_STATUS_OK; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_tx/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_tx/init/main.h deleted file mode 100644 index 9042bc0c9..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_tx/init/main.h +++ /dev/null @@ -1,48 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -#define XTAL_DRV_LEVEL4 0x03U -#define XTAL_DRV_LEVEL3 0x02U -#define XTAL_DRV_LEVEL2 0x01U -#define XTAL_DRV_LEVEL1 0x00U - -extern UART_Handle g_uart; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_tx/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_tx/init/system_init.c deleted file mode 100644 index 231b06da9..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_tx/init/system_init.c +++ /dev/null @@ -1,91 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" -#include "iocmg.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_XTAL; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = 0; - crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; - crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_1; - - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - - g_uart.baseAddress = UART0; - - g_uart.baudRate = UART0_BAND_RATE; - g_uart.dataLength = UART_DATALENGTH_8BIT; - g_uart.stopBits = UART_STOPBITS_ONE; - g_uart.parity = UART_PARITY_NONE; - g_uart.txMode = UART_MODE_BLOCKING; - g_uart.rxMode = UART_MODE_BLOCKING; - g_uart.fifoMode = BASE_CFG_ENABLE; - g_uart.fifoTxThr = UART_FIFODEPTH_SIZE8; - g_uart.fifoRxThr = UART_FIFODEPTH_SIZE8; - g_uart.hwFlowCtr = BASE_CFG_DISABLE; - g_uart.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; - g_uart.handleEx.msbFirst = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart); -} - -static void IOConfig(void) -{ - HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_tx/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_tx/readme.md deleted file mode 100644 index 82676acd8..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_tx/readme.md +++ /dev/null @@ -1,22 +0,0 @@ -# UART阻塞模式发送数据 -## 关键字: UART, 阻塞模式发送 - -**【功能描述】** -+ 在阻塞下模式下,阻塞一段时间等待UART发送数据。 - -+ 阻塞模式下的发送数据的超时时间为2000ms。 - -**【示例配置】** -+ 待发送数据:将待发送首地址和字符长度作为入参传入HAL_UART_WriteBlocking()。 - -+ 发送超时时间配置:通过“HAL_UART_WriteBlocking()”进行配置,单位为ms。 - -+ HAL_UART_WriteBlocking()返回值BASE_STATUS_OK,表示在给定时间内,发送完成数据;返回值为BASE_STATUS_TIMEOUT,表示在规定时间内,未能完成数据发送;其他返回值,表示错误。 - -+ 串口0会打印发送成功或发送超时。 - -**【示例效果】** -+ 串口0发送数据,若在超时时长内发送数据,则打印“Send success!”,若发送超时则打印“Send time out!”, 发送错误,打印“Send verification error!”。 - -**【注意事项】** -+ 串口通信的波特率,校验位等配置需保持一致,可以通过UART配置界面进行更改。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_tx/src/sample_uart_blocking_tx.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_tx/src/sample_uart_blocking_tx.c deleted file mode 100644 index d42307c4e..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_tx/src/sample_uart_blocking_tx.c +++ /dev/null @@ -1,53 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_uart_blocking_tx.c - * @author MCU Driver Team - * @brief uart sample module. - * @details In block mode, the UART is blocked for a period of time and waits for the UART to transmit data. - * (1) Data to be sent: The start address and character length to be sent are used as input parameters - * and transferred to HAL_UART_WriteBlocking(). - * (2)Blocking time: It is as HAL_UART_WriteBlocking() parameter and the unit is ms. - * (3)Result judgment: BASE_STATUS_OK, indicating that send data successfully. The return value is - * BASE_STATUS_TIMEOUT, indicating that send data fails within the specified time. - * Other return values, indicating an error. - */ -#include "sample_uart_blocking_tx.h" - -#define BAND_RATE 115200 -#define BLOCKING_TIME 2000 - -/** - * @brief UART blocking send sample code. - * @param None. - * @retval None. - */ -void UART_BlcokingTX(void) -{ - SystemInit(); - DBG_PRINTF("TX: UART Init finish\r\n"); - unsigned char txStr[] = "UARTWrite"; - unsigned int ret; - ret = HAL_UART_WriteBlocking(&g_uart, txStr, 9, BLOCKING_TIME); /* 9 is transmission length */ - if (ret == BASE_STATUS_OK) { - DBG_PRINTF("Send success!\r\n"); /* Sending succeeded */ - } else if (ret == BASE_STATUS_TIMEOUT) { - DBG_PRINTF("Send time out!\r\n"); /* Sending failed */ - } else { - DBG_PRINTF("Send verification error!\r\n"); - } -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_character_match/inc/sample_uart_character_match.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_character_match/inc/sample_uart_character_match.h deleted file mode 100644 index 9bb4c3b22..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_character_match/inc/sample_uart_character_match.h +++ /dev/null @@ -1,35 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_uart_character_match.h - * @author MCU Driver Team - * @brief uart sample module. - * @details This file provides sample code for users to help use - * the character match of uart. - */ - -#ifndef SAMPLE_UART_CHARACTER_MATCH_H -#define SAMPLE_UART_CHARACTER_MATCH_H - -#include "debug.h" -#include "uart.h" -#include "uart_ex.h" -#include "interrupt.h" -#include "main.h" - -void UART_CharacterMatch(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_character_match/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_character_match/init/main.c deleted file mode 100644 index 202bfd8b2..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_character_match/init/main.c +++ /dev/null @@ -1,50 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ - -#include "typedefs.h" -#include "feature.h" -#include "sample_uart_character_match.h" -#include "main.h" -/* USER CODE BEGIN 0 */ -/* USER CODE END 0 */ -UART_Handle g_uart; -/* USER CODE BEGIN 1 */ -/* USER CODE END 1 */ - -int main(void) -{ - /* USER CODE BEGIN 2 */ - /* USER CODE END 2 */ - UART_CharacterMatch(); - /* USER CODE BEGIN 3 */ - /* USER CODE END 3 */ - while (1) { - /* USER CODE BEGIN 4 */ - /* USER CODE END 4 */ - } - /* USER CODE BEGIN 5 */ - /* USER CODE END 5 */ - return BASE_STATUS_OK; -} - -/* USER CODE BEGIN 6 */ -/* USER CODE END 6 */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_character_match/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_character_match/init/main.h deleted file mode 100644 index 3be06f42a..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_character_match/init/main.h +++ /dev/null @@ -1,53 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "uart_ex.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -#define XTAL_DRV_LEVEL4 0x03U -#define XTAL_DRV_LEVEL3 0x02U -#define XTAL_DRV_LEVEL2 0x01U -#define XTAL_DRV_LEVEL1 0x00U - -extern UART_Handle g_uart; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -void UART0InterruptErrorCallback(void *handle); -void UART0WriteInterruptCallback(void *handle); -void ReadFinish(void *handle); -void UART_CharacterMatchCallBack(void *handle); -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_character_match/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_character_match/init/system_init.c deleted file mode 100644 index 8714c7614..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_character_match/init/system_init.c +++ /dev/null @@ -1,129 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" -#include "iocmg.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 48; /* PLL Multiplier 48 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_2; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; - crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; - crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; - - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -__weak void UART0InterruptErrorCallback(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN UART0_TRNS_IT_ERROR */ - /* USER CODE END UART0_TRNS_IT_ERROR */ -} - -__weak void UART0WriteInterruptCallback(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN UART0_WRITE_IT_FINISH */ - /* USER CODE END UART0_WRITE_IT_FINISH */ -} - -__weak void ReadFinish(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN UART0_READ_IT_FINISH */ - /* USER CODE END UART0_READ_IT_FINISH */ -} - -__weak void UART_CharacterMatchCallBack(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN UART_CharacterMatchCallBack */ - /* USER CODE END UART_CharacterMatchCallBack */ -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - - g_uart.baseAddress = UART0; - - g_uart.baudRate = UART0_BAND_RATE; - g_uart.dataLength = UART_DATALENGTH_8BIT; - g_uart.stopBits = UART_STOPBITS_ONE; - g_uart.parity = UART_PARITY_NONE; - g_uart.txMode = UART_MODE_INTERRUPT; - g_uart.rxMode = UART_MODE_INTERRUPT; - g_uart.fifoMode = BASE_CFG_ENABLE; - g_uart.fifoTxThr = UART_FIFODEPTH_SIZE8; - g_uart.fifoRxThr = UART_FIFODEPTH_SIZE8; - g_uart.hwFlowCtr = BASE_CFG_DISABLE; - g_uart.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; - g_uart.handleEx.msbFirst = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart); - HAL_UART_RegisterCallBack(&g_uart, UART_TRNS_IT_ERROR, UART0InterruptErrorCallback); - HAL_UART_RegisterCallBack(&g_uart, UART_WRITE_IT_FINISH, UART0WriteInterruptCallback); - HAL_UART_RegisterCallBack(&g_uart, UART_READ_IT_FINISH, ReadFinish); - unsigned char ch = 'A'; /* Detect character of user input */ - HAL_UART_OpenCharacterMatchEx(&g_uart, ch); /* parameter check */ - HAL_UART_RegisterCallBack(&g_uart, UART_CHARACTER_MATCH, UART_CharacterMatchCallBack); - - IRQ_Register(IRQ_UART0, HAL_UART_IrqHandler, &g_uart); - IRQ_SetPriority(IRQ_UART0, 1); - IRQ_EnableN(IRQ_UART0); -} - -static void IOConfig(void) -{ - HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_character_match/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_character_match/readme.md deleted file mode 100644 index 493a30b0c..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_character_match/readme.md +++ /dev/null @@ -1,16 +0,0 @@ -# UART检测特定字符 -## 关键字: UART, 特定字符检测 - -**【功能描述】** -+ UART检测特定字符,检测到特定字符,会触发检测成功回调函数。 - -**【示例配置】** -+ 特定字符检测:示例中设定的检测字符为“A”,当收到带有字符“A”的数据,UART就会触发字符检测回调函数。用户可以使用“HAL_UART_OpenCharacterMatchEx”函数来设定需要检测的字符。 - -+ 字符检测成功中断:字符检测成功之后,会以中断的形式调用字符检测成功函数“UART_CharacterMatchCallBack”,用户可以使用“HAL_UART_RegisterCallBack”进行更改。 - -**【示例效果】** -+ 向串口0发送大写字符"123Acharactermatch",如果串口输出“Match character success”字符,则代表检测到字符“A”。 - -**【注意事项】** -+ 串口通信的波特率,校验位等配置需保持一致,可以通过UART配置界面进行更改。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_character_match/src/sample_uart_character_match.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_character_match/src/sample_uart_character_match.c deleted file mode 100644 index 568bdf31d..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_character_match/src/sample_uart_character_match.c +++ /dev/null @@ -1,67 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_uart_character_match.c - * @author MCU Driver Team - * @brief uart sample module. - * @details This file provides sample code for users to help use - * the character match of uart. - */ - -#include "sample_uart_character_match.h" - -#define MATCH_CHARACTER_LENGTH 10 -#define WAIT_TIMER 10 - -unsigned char save_data[MATCH_CHARACTER_LENGTH]; - -/** - * @brief UART read interrupt finish. - * @param None. - * @retval None. - */ -void ReadFinish(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("Receive Characters: %s", save_data); -} - -/** - * @brief UART charter match - * @param None. - * @retval None. - */ -void UART_CharacterMatchCallBack(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("Match character success\r\n"); -} - -/** - * @brief UART charter match. - * @param None. - * @retval None. - */ -void UART_CharacterMatch(void) -{ - SystemInit(); - /* Message */ - DBG_PRINTF("Match start! Send 10 characters containing the uppercase character A.\r\n"); - HAL_UART_ReadIT(&g_uart, save_data, MATCH_CHARACTER_LENGTH); /* Read interrupt callback. */ - BASE_FUNC_DELAY_MS(WAIT_TIMER); - return; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx/inc/sample_uart_dma_rx.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx/inc/sample_uart_dma_rx.h deleted file mode 100644 index 2b024c215..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx/inc/sample_uart_dma_rx.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_uart_dma_rx.h - * @author MCU Driver Team - * @brief uart sample module. - * @details This file provides sample code for users to help use - * the transmission of the UART in DMA mode. - */ -#ifndef SAMPLE_UART_DMA_RX_H -#define SAMPLE_UART_DMA_RX_H - -#include "debug.h" -#include "uart.h" -#include "interrupt.h" -#include "main.h" - -int UART_DMA_RX(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx/init/main.c deleted file mode 100644 index ec347d05c..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx/init/main.c +++ /dev/null @@ -1,48 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ - -#include "typedefs.h" -#include "feature.h" -#include "sample_uart_dma_rx.h" -#include "main.h" -/* USER CODE BEGIN 0 */ -/* USER CODE END 0 */ -UART_Handle g_uart; -DMA_Handle g_dmac; -/* USER CODE BEGIN 1 */ -/* USER CODE END 1 */ - -int main(void) -{ - /* USER CODE BEGIN 2 */ - /* USER CODE END 2 */ - UART_DMA_RX(); - /* USER CODE BEGIN 3 */ - /* USER CODE END 3 */ - while (1) { - /* USER CODE BEGIN 4 */ - /* USER CODE END 4 */ - } - /* USER CODE BEGIN 5 */ - /* USER CODE END 5 */ - return BASE_STATUS_OK; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx/init/main.h deleted file mode 100644 index acb8e43a2..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx/init/main.h +++ /dev/null @@ -1,58 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "uart_ex.h" -#include "crg.h" -#include "dma.h" -#include "dma_ex.h" -#include "iocmg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -#define XTAL_DRV_LEVEL4 0x03U -#define XTAL_DRV_LEVEL3 0x02U -#define XTAL_DRV_LEVEL2 0x01U -#define XTAL_DRV_LEVEL1 0x00U - -extern UART_Handle g_uart; - -extern DMA_Handle g_dmac; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -void UART0WriteInterruptCallback(UART_Handle *handle); -void UART0ReadInterruptCallback(UART_Handle *handle); -void UART0InterruptErrorCallback(void *handle); -void DMA_Channel2CallBack(void *handle); -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx/init/system_init.c deleted file mode 100644 index 3f7049d9d..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx/init/system_init.c +++ /dev/null @@ -1,142 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" -#include "iocmg_ip.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 48; /* PLL Multiplier 48 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_2; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; - crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; - crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; - - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void DMA_Channel2Init(void *handle) -{ - DMA_ChannelParam dma_param; - dma_param.direction = DMA_PERIPH_TO_MEMORY_BY_DMAC; - dma_param.srcAddrInc = DMA_ADDR_UNALTERED; - dma_param.destAddrInc = DMA_ADDR_INCREASE; - dma_param.srcPeriph = DMA_REQUEST_UART0_RX; - dma_param.destPeriph = DMA_REQUEST_MEM; - dma_param.srcWidth = DMA_TRANSWIDTH_BYTE; - dma_param.destWidth = DMA_TRANSWIDTH_BYTE; - dma_param.srcBurst = DMA_BURST_LENGTH_1; - dma_param.destBurst = DMA_BURST_LENGTH_1; - dma_param.pHandle = handle; - HAL_DMA_InitChannel(&g_dmac, &dma_param, DMA_CHANNEL_TWO); -} - -static void DMA_Init(void) -{ - HAL_CRG_IpEnableSet(DMA_BASE, IP_CLK_ENABLE); - g_dmac.baseAddress = DMA; - IRQ_Register(IRQ_DMA_TC, HAL_DMA_IrqHandlerTc, &g_dmac); - IRQ_Register(IRQ_DMA_ERR, HAL_DMA_IrqHandlerError, &g_dmac); - IRQ_EnableN(IRQ_DMA_TC); - IRQ_EnableN(IRQ_DMA_ERR); - HAL_DMA_Init(&g_dmac); - DMA_Channel2Init((void *)(&g_uart)); - HAL_DMA_SetChannelPriorityEx(&g_dmac, DMA_CHANNEL_TWO, DMA_PRIORITY_MEDIUM); -} - -__weak void UART0InterruptErrorCallback(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN UART0_TRNS_IT_ERROR */ - /* USER CODE END UART0_TRNS_IT_ERROR */ -} - -__weak void DMA_Channel2CallBack(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN UART0_READ_DMA_FINISH */ - /* USER CODE END UART0_READ_DMA_FINISH */ -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - - g_uart.baseAddress = UART0; - - g_uart.baudRate = UART0_BAND_RATE; - g_uart.dataLength = UART_DATALENGTH_8BIT; - g_uart.stopBits = UART_STOPBITS_ONE; - g_uart.parity = UART_PARITY_NONE; - g_uart.txMode = UART_MODE_BLOCKING; - g_uart.rxMode = UART_MODE_DMA; - g_uart.fifoMode = BASE_CFG_ENABLE; - g_uart.fifoTxThr = UART_FIFODEPTH_SIZE8; - g_uart.fifoRxThr = UART_FIFODEPTH_SIZE8; - g_uart.hwFlowCtr = BASE_CFG_DISABLE; - g_uart.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; - g_uart.handleEx.msbFirst = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart); - HAL_UART_RegisterCallBack(&g_uart, UART_TRNS_IT_ERROR, UART0InterruptErrorCallback); - - IRQ_Register(IRQ_UART0, HAL_UART_IrqHandler, &g_uart); - IRQ_SetPriority(IRQ_UART0, 1); - IRQ_EnableN(IRQ_UART0); - g_uart.dmaHandle = &g_dmac; - g_uart.uartDmaRxChn = 2; /* DMA channel is 2. */ - HAL_UART_RegisterCallBack(&g_uart, UART_READ_DMA_FINISH, DMA_Channel2CallBack); -} - -static void IOConfig(void) -{ - HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ -} - -void SystemInit(void) -{ - IOConfig(); - DMA_Init(); - UART0_Init(); - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx/readme.md deleted file mode 100644 index 3c3cec867..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx/readme.md +++ /dev/null @@ -1,22 +0,0 @@ -# UART-DMA模式接收数据 -## 关键字: UART, DMA模式接收 - -**【功能描述】** -+ 在UART DMA模式下,通过DMA将接收的数据搬运到指定的内存空间。 - -**【示例配置】** -+ 预设置的缓存:需要使用者自行开辟内存空间,将内存首地址和需要接收的字符长度作为入参传入HAL_UART_ReadDMA()。 - -+ 串口0的接收模式配置为DMA模式。 - -+ 初始化DMA接收通道,需配置源地址和目标地址增长方式以及中断等。可通过DMA配置界面进行更改。 - -+ DMA接收完成中断:DMA接收中断开启,接收完成之后,会调用接收完成回调函数“DMA_Channel2CallBack”, 回调函数的名称可通过“HAL_UART_RegisterCallBack”进行更改。 - -+ 串口0会打印出接收到的数据和提示信息。 - -**【示例效果】** -+ 向串口0发送数据,串口0会将接收的数据打印。 - -**【注意事项】** -+ 串口通信的波特率,校验位等配置需保持一致,可以通过UART配置界面进行更改。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx/src/sample_uart_dma_rx.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx/src/sample_uart_dma_rx.c deleted file mode 100644 index 282a18707..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx/src/sample_uart_dma_rx.c +++ /dev/null @@ -1,59 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_uart_dma_rx.c - * @author MCU Driver Team - * @brief uart sample module, DMA transfer direction: peripheral to memory. - * @details In DMA mode, after receiving data from the UART, the DMA receives the transfer - * request from the UART and transfers the data to the preset memory. - * (1)Preset buffer: The user needs to create the memory space. Use the start address of the memory - * and the length of the character to be received as input parameters to HAL_UART_ReadDMA(). - * (2) Result reading: Read the result from the preset memory in the callback function of the DMA. - */ - -#include "sample_uart_dma_rx.h" - -static unsigned char g_rxStr[20] = {0}; -/** - * @brief User-defined read completion DMAC callback function. - * @param handle UART handle. - * @retval None. - */ -void DMA_Channel2CallBack(void *handle) -{ - UART_Handle *uartHandle = (UART_Handle *)handle; - DBG_PRINTF("read_finish: %s\r\n", g_rxStr); - BASE_FUNC_UNUSED(uartHandle); - return; -} - -/** - * @brief UART receive sample code in DMAC mode. - * @param None. - * @retval None. - */ -int UART_DMA_RX(void) -{ - SystemInit(); - DBG_PRINTF("UART and DMA Init Finish, please send characters to UART\r\n"); - unsigned int dataLength = 10; /* The receive length is 10 */ - HAL_UART_ReadDMA(&g_uart, g_rxStr, dataLength); - while (1) { - HAL_UART_ReadDMA(&g_uart, g_rxStr, dataLength); - } - return 0; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/inc/sample_uart_dma_rx_cyclically_stored.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/inc/sample_uart_dma_rx_cyclically_stored.h deleted file mode 100644 index d0c10ea51..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/inc/sample_uart_dma_rx_cyclically_stored.h +++ /dev/null @@ -1,34 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_uart_dma_rx_cyclically_stored.h - * @author MCU Driver Team - * @brief uart sample module. - * @details This file provides sample code for users to help use - * the repeat transmission of the UART in DMA mode. - */ - -#ifndef SAMPLE_UART_DMA_RX_CYCLICALLY_STORED_H -#define SAMPLE_UART_DMA_RX_CYCLICALLY_STORED_H - -#include "debug.h" -#include "uart.h" -#include "interrupt.h" -#include "main.h" - -int UART_DMA_RxCyclicallyStored(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/init/main.c deleted file mode 100644 index 90a64adb1..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/init/main.c +++ /dev/null @@ -1,51 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ - -#include "typedefs.h" -#include "feature.h" -#include "sample_uart_dma_rx_cyclically_stored.h" -#include "main.h" -/* USER CODE BEGIN 0 */ -/* USER CODE END 0 */ -UART_Handle g_uart; -DMA_Handle g_dmac; -/* USER CODE BEGIN 1 */ -/* USER CODE END 1 */ - -int main(void) -{ - /* USER CODE BEGIN 2 */ - /* USER CODE END 2 */ - UART_DMA_RxCyclicallyStored(); - /* USER CODE BEGIN 3 */ - /* USER CODE END 3 */ - while (1) { - /* USER CODE BEGIN 4 */ - /* USER CODE END 4 */ - } - /* USER CODE BEGIN 5 */ - /* USER CODE END 5 */ - return BASE_STATUS_OK; -} - -/* USER CODE BEGIN 6 */ -/* USER CODE END 6 */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/init/main.h deleted file mode 100644 index 7c8cbfe4c..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/init/main.h +++ /dev/null @@ -1,54 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "uart_ex.h" -#include "crg.h" -#include "dma.h" -#include "dma_ex.h" -#include "debug.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -#define XTAL_DRV_LEVEL4 0x03U -#define XTAL_DRV_LEVEL3 0x02U -#define XTAL_DRV_LEVEL2 0x01U -#define XTAL_DRV_LEVEL1 0x00U - -extern UART_Handle g_uart; - -extern DMA_Handle g_dmac; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); -void DMA_Channel2CallBack(void *handle); -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/init/system_init.c deleted file mode 100644 index 56391d3f7..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/init/system_init.c +++ /dev/null @@ -1,131 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" -#include "iocmg.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 48; /* PLL Multiplier 48 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_2; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; - crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; - crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; - - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void DMA_Channel2Init(void *handle) -{ - DMA_ChannelParam dma_param; - dma_param.direction = DMA_PERIPH_TO_MEMORY_BY_DMAC; - dma_param.srcAddrInc = DMA_ADDR_UNALTERED; - dma_param.destAddrInc = DMA_ADDR_INCREASE; - dma_param.srcPeriph = DMA_REQUEST_UART0_RX; - dma_param.destPeriph = DMA_REQUEST_MEM; - dma_param.srcWidth = DMA_TRANSWIDTH_BYTE; - dma_param.destWidth = DMA_TRANSWIDTH_BYTE; - dma_param.srcBurst = DMA_BURST_LENGTH_1; - dma_param.destBurst = DMA_BURST_LENGTH_1; - dma_param.pHandle = handle; - HAL_DMA_InitChannel(&g_dmac, &dma_param, DMA_CHANNEL_TWO); -} - -static void DMA_Init(void) -{ - HAL_CRG_IpEnableSet(DMA_BASE, IP_CLK_ENABLE); - g_dmac.baseAddress = DMA; - IRQ_Register(IRQ_DMA_TC, HAL_DMA_IrqHandlerTc, &g_dmac); - IRQ_Register(IRQ_DMA_ERR, HAL_DMA_IrqHandlerError, &g_dmac); - IRQ_EnableN(IRQ_DMA_TC); - IRQ_EnableN(IRQ_DMA_ERR); - HAL_DMA_Init(&g_dmac); - DMA_Channel2Init((void *)(&g_uart)); - HAL_DMA_SetChannelPriorityEx(&g_dmac, DMA_CHANNEL_TWO, DMA_PRIORITY_MEDIUM); -} - -__weak void DMA_Channel2CallBack(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN UART0_READ_DMA_FINISH */ - /* USER CODE END UART0_READ_DMA_FINISH */ -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - - g_uart.baseAddress = UART0; - - g_uart.baudRate = UART0_BAND_RATE; - g_uart.dataLength = UART_DATALENGTH_8BIT; - g_uart.stopBits = UART_STOPBITS_ONE; - g_uart.parity = UART_PARITY_NONE; - g_uart.txMode = UART_MODE_BLOCKING; - g_uart.rxMode = UART_MODE_DMA; - g_uart.fifoMode = BASE_CFG_ENABLE; - g_uart.fifoTxThr = UART_FIFODEPTH_SIZE8; - g_uart.fifoRxThr = UART_FIFODEPTH_SIZE8; - g_uart.hwFlowCtr = BASE_CFG_DISABLE; - g_uart.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; - g_uart.handleEx.msbFirst = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart); - - g_uart.dmaHandle = &g_dmac; - g_uart.uartDmaRxChn = 2; /* DMA channel is 2. */ - HAL_UART_RegisterCallBack(&g_uart, UART_READ_DMA_FINISH, DMA_Channel2CallBack); -} - -static void IOConfig(void) -{ - HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ -} - -void SystemInit(void) -{ - IOConfig(); - DMA_Init(); - UART0_Init(); - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/readme.md deleted file mode 100644 index 7391320f5..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/readme.md +++ /dev/null @@ -1,21 +0,0 @@ -# UART-DMA模式循环接收数据 -## 关键字: UART, DMA循环接收 - -**【功能描述】** -+ 在UART DMA模式下,当UART接收数据完成后,DMA接收到UART的搬运请求,将数据循环搬运到预设置的内存中, 当预设置的内存写满之后, -将会从内存的起始地址开始写, 循环此过程。 - -**【示例配置】** -+ 预设置的缓存:需要使用者自行开辟内存空间,将内存首地址和需要接收的字符长度作为入参传入HAL_UART_ReadDMAAndCyclicallyStored()中。 - -+ 串口0的接收模式配置为DMA模式。并初始化DMA接收通道,需配置源地址和目标地址增长方式以及中断等。可通过DMA配置界面进行更改。 - -+ DMA接收数据完成,会将接收的数据存储在预设置的缓存中,并通过串口打印。 - -+ 结果读取:通过读取预设置的内存,并通过函数“HAL_UART_ReadDMAGetPos”来判断相对于指定内存的偏移位置。 - -**【示例效果】** -+ 不断向串口0发送数据,串口0会打印出接收的数据,并将数据储存到预设的内存中,当预设置的内存写满之后,会从内存的起始地址开始写。 - -**【注意事项】** -+ 串口通信的波特率,校验位等配置需保持一致,可以通过UART配置界面进行更改。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/src/sample_uart_dma_rx_cyclically_stored.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/src/sample_uart_dma_rx_cyclically_stored.c deleted file mode 100644 index b18e889b1..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/src/sample_uart_dma_rx_cyclically_stored.c +++ /dev/null @@ -1,65 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_uart_dma_rx_cyclically_stored.c - * @author MCU Driver Team - * @brief uart sample module, UART example module, DMA cyclic write data, transfer direction: peripheral to memory. - * @details In DMA cyclic write data mode, after receiving data from the UART, DMA transfers the data to - * preset memory. If the memory is full, the data will be stored again. - * request from the UART and transfers the data to the preset memory. - * (1)Preset buffer: The user needs to create the memory space. Use the start address of the memory - * and length of character to be received as input parameters to HAL_UART_ReadDMAAndCyclicallyStored(). - * (2) Result reading: Read the result from the preset memory. - */ - -#include "sample_uart_dma_rx_cyclically_stored.h" - -#define BUF_LEN 80 - -unsigned int g_pointRead = 0; /* Read position */ -unsigned int g_pointWrite = 0; /* Write position */ - -unsigned char g_buf[BUF_LEN]; /* Buf for saving data */ - -static DMA_LinkList g_Node; /* DMA linked list must be global */ - -int UART_DMA_RxCyclicallyStored(void) -{ - SystemInit(); - - DBG_PRINTF("UART and DMA Init Finish\r\n UART DMA read and cyclically stored: please send characters to UART\r\n"); - g_pointRead = 0; - - /* Start DMA cyclically stored, The DMA can cyclically transfer data to the g_buf buffer */ - HAL_UART_ReadDMAAndCyclicallyStored(&g_uart, g_buf, &g_Node, BUF_LEN); - - while (1) { - /* Obtains the destination address written by the DAM */ - g_pointWrite = HAL_UART_ReadDMAGetPos(&g_uart); - - /* Print data if read pointer is inconsistent with write pointer */ - while (g_pointRead != g_pointWrite) { - DBG_PRINTF( - "g_pointRead=0x%x, g_pointWrite=0x%x, receive:%c\r\n", g_pointRead, g_pointWrite, g_buf[g_pointRead]); - g_pointRead++; - if (g_pointRead >= BUF_LEN) { - g_pointRead = 0; - } - } - } - return 0; -} diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx/inc/sample_uart_dma_tx.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx/inc/sample_uart_dma_tx.h deleted file mode 100644 index bb8f625ca..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx/inc/sample_uart_dma_tx.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_uart_dma_tx.h - * @author MCU Driver Team - * @brief uart sample module. - * @details This file provides sample code for users to help use - * the transmission of the UART in DMA mode. - */ -#ifndef SAMPLE_UART_DMA_TX_H -#define SAMPLE_UART_DMA_TX_H - -#include "debug.h" -#include "uart.h" -#include "interrupt.h" -#include "main.h" - -void UART_DMA_TX(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx/init/main.c deleted file mode 100644 index d3c9ff927..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx/init/main.c +++ /dev/null @@ -1,48 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ - -#include "typedefs.h" -#include "feature.h" -#include "sample_uart_dma_tx.h" -#include "main.h" -/* USER CODE BEGIN 0 */ -/* USER CODE END 0 */ -UART_Handle g_uart; -DMA_Handle g_dmac; -/* USER CODE BEGIN 1 */ -/* USER CODE END 1 */ - -int main(void) -{ - /* USER CODE BEGIN 2 */ - /* USER CODE END 2 */ - UART_DMA_TX(); - /* USER CODE BEGIN 3 */ - /* USER CODE END 3 */ - while (1) { - /* USER CODE BEGIN 4 */ - /* USER CODE END 4 */ - } - /* USER CODE BEGIN 5 */ - /* USER CODE END 5 */ - return BASE_STATUS_OK; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx/init/main.h deleted file mode 100644 index d2fdaec4e..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx/init/main.h +++ /dev/null @@ -1,57 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "uart_ex.h" -#include "crg.h" -#include "dma.h" -#include "dma_ex.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -#define XTAL_DRV_LEVEL4 0x03U -#define XTAL_DRV_LEVEL3 0x02U -#define XTAL_DRV_LEVEL2 0x01U -#define XTAL_DRV_LEVEL1 0x00U - -extern UART_Handle g_uart; - -extern DMA_Handle g_dmac; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -void UART0WriteInterruptCallback(UART_Handle *handle); -void UART0ReadInterruptCallback(UART_Handle *handle); -void UART0InterruptErrorCallback(void *handle); -void DMA_Channel3CallBack(void *handle); -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx/init/system_init.c deleted file mode 100644 index 98ba5e617..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx/init/system_init.c +++ /dev/null @@ -1,144 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" -#include "iocmg_ip.h" -#include "iocmg.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 48; /* PLL Multiplier 48 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_2; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; - crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; - crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; - - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void DMA_Channel3Init(void *handle) -{ - DMA_ChannelParam dma_param; - dma_param.direction = DMA_MEMORY_TO_PERIPH_BY_DMAC; - dma_param.srcAddrInc = DMA_ADDR_INCREASE; - dma_param.destAddrInc = DMA_ADDR_UNALTERED; - dma_param.srcPeriph = DMA_REQUEST_MEM; - dma_param.destPeriph = DMA_REQUEST_UART0_TX; - dma_param.srcWidth = DMA_TRANSWIDTH_BYTE; - dma_param.destWidth = DMA_TRANSWIDTH_BYTE; - dma_param.srcBurst = DMA_BURST_LENGTH_1; - dma_param.destBurst = DMA_BURST_LENGTH_1; - dma_param.pHandle = handle; - HAL_DMA_InitChannel(&g_dmac, &dma_param, DMA_CHANNEL_THREE); -} - -static void DMA_Init(void) -{ - HAL_CRG_IpEnableSet(DMA_BASE, IP_CLK_ENABLE); - g_dmac.baseAddress = DMA; - IRQ_Register(IRQ_DMA_TC, HAL_DMA_IrqHandlerTc, &g_dmac); - IRQ_Register(IRQ_DMA_ERR, HAL_DMA_IrqHandlerError, &g_dmac); - IRQ_EnableN(IRQ_DMA_TC); - IRQ_EnableN(IRQ_DMA_ERR); - HAL_DMA_Init(&g_dmac); - DMA_Channel3Init((void *)(&g_uart)); - HAL_DMA_SetChannelPriorityEx(&g_dmac, DMA_CHANNEL_THREE, DMA_PRIORITY_LOW); -} - -__weak void UART0InterruptErrorCallback(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN UART0_TRNS_IT_ERROR */ - /* USER CODE END UART0_TRNS_IT_ERROR */ -} - -__weak void DMA_Channel3CallBack(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN UART0_WRITE_DMA_FINISH */ - /* USER CODE END UART0_WRITE_DMA_FINISH */ -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - - g_uart.baseAddress = UART0; - - g_uart.baudRate = UART0_BAND_RATE; - g_uart.dataLength = UART_DATALENGTH_8BIT; - g_uart.stopBits = UART_STOPBITS_ONE; - g_uart.parity = UART_PARITY_NONE; - g_uart.txMode = UART_MODE_DMA; - g_uart.rxMode = UART_MODE_BLOCKING; - g_uart.fifoMode = BASE_CFG_ENABLE; - g_uart.fifoTxThr = UART_FIFODEPTH_SIZE8; - g_uart.fifoRxThr = UART_FIFODEPTH_SIZE8; - g_uart.hwFlowCtr = BASE_CFG_DISABLE; - g_uart.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; - g_uart.handleEx.msbFirst = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart); - HAL_UART_RegisterCallBack(&g_uart, UART_TRNS_IT_ERROR, UART0InterruptErrorCallback); - - IRQ_Register(IRQ_UART0, HAL_UART_IrqHandler, &g_uart); - IRQ_SetPriority(IRQ_UART0, 1); - IRQ_EnableN(IRQ_UART0); - g_uart.dmaHandle = &g_dmac; - g_uart.uartDmaTxChn = 3; /* Rx Dma Channel is 3. */ - HAL_UART_RegisterCallBack(&g_uart, UART_WRITE_DMA_FINISH, DMA_Channel3CallBack); -} - -static void IOConfig(void) -{ - HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ -} - -void SystemInit(void) -{ - IOConfig(); - DMA_Init(); - UART0_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx/readme.md deleted file mode 100644 index 1b61cb366..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx/readme.md +++ /dev/null @@ -1,22 +0,0 @@ -# UART-DMA模式发送数据 -## 关键字: UART, DMA模式发送 - -**【功能描述】** -+ 在UART DMA模式下,DMA接收到UART的搬运请求,将待发送的数据从内存中直接搬运到UART直接发送。 - -**【示例配置】** -+ 预发送数据:将待发送首地址和字符长度作为入参传入HAL_UART_WriteDMA()。 - -+ 串口0的发送模式配置为DMA模式。 - -+ 初始化DMA发送通道,需配置源地址和目标地址增长方式以及中断等。可通过DMA配置界面进行更改。 - -+ DMA发送完成中断:DMA发送中断开启,数据发送完成之后,会调用发送完成回调函数“DMA_Channel3CallBack”, 回调函数的名称可通过“HAL_UART_RegisterCallBack”进行更改。 - -+ 串口0会打印出发送成功等提示信息。 - -**【示例效果】** -+ DMA搬运结束后,会上报中断,可以在DMA中断回调函数中加上标志位进行判断是否完成。若发送完成,串口0会打印“write_finish”字符。 - -**【注意事项】** -+ 串口通信的波特率,校验位等配置需保持一致,可以通过UART配置界面进行更改。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx/src/sample_uart_dma_tx.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx/src/sample_uart_dma_tx.c deleted file mode 100644 index 5111c11e8..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx/src/sample_uart_dma_tx.c +++ /dev/null @@ -1,58 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_uart_dma_tx.c - * @author MCU Driver Team - * @brief uart sample module, DMA transfer direction: memory to peripheral. - * @details In DMA mode, the DMA receives the transfer request from the UART and directly transfers the data - * to be transmitted from the memory to the UART for transmission. - * (1) Data to be sent: The start address and character length to be sent are used as input parameters - * and transferred to HAL_UART_WriteDMA(). - * (2) Result determination: After the DMA transfer is complete, an interrupt is reported. You can add - * a flag to the DMA interrupt callback function to determine whether the transfer is complete. - */ - -#include "sample_uart_dma_tx.h" - -static unsigned char g_txStr[] = "123456789A"; - - -/** - * @brief User-defined write completion DMAC callback function. - * @param handle UART handle. - * @retval None. - */ -void DMA_Channel3CallBack(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("\r\nwrite_finish\r\n"); - return; -} - -/** - * @brief UART send sample code in DMAC mode. - * @param None. - * @retval None. - */ -void UART_DMA_TX(void) -{ - SystemInit(); - unsigned int dataLength = 10; - DBG_PRINTF("UART and DMA Init finish\r\n"); - HAL_UART_WriteDMA(&g_uart, g_txStr, dataLength); /* Sending timeout */ - return; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/inc/sample_uart_dma_tx_dma_rx_simultaneously.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/inc/sample_uart_dma_tx_dma_rx_simultaneously.h deleted file mode 100644 index 22624e40a..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/inc/sample_uart_dma_tx_dma_rx_simultaneously.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_uart_dma_tx_dma_rx_simultaneously.h - * @author MCU Driver Team - * @brief uart sample module. - * @details This file provides sample code for users to help use - * the transmission of the UART in DMA TX/RX simultaneously. - */ -#ifndef SAMPLE_UART_DMA_TX_DMA_RX_SIMULTANEOUSLY_H -#define SAMPLE_UART_DMA_TX_DMA_RX_SIMULTANEOUSLY_H - -#include "debug.h" -#include "uart.h" -#include "interrupt.h" -#include "main.h" - -void UART_DMATxAndRxSimultaneously(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/init/main.c deleted file mode 100644 index bdd352ec3..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/init/main.c +++ /dev/null @@ -1,48 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ - -#include "typedefs.h" -#include "feature.h" -#include "sample_uart_dma_tx_dma_rx_simultaneously.h" -#include "main.h" -/* USER CODE BEGIN 0 */ -/* USER CODE END 0 */ -UART_Handle g_uart; -DMA_Handle g_dmac; -/* USER CODE BEGIN 1 */ -/* USER CODE END 1 */ - -int main(void) -{ - /* USER CODE BEGIN 2 */ - /* USER CODE END 2 */ - UART_DMATxAndRxSimultaneously(); - /* USER CODE BEGIN 3 */ - /* USER CODE END 3 */ - while (1) { - /* USER CODE BEGIN 4 */ - /* USER CODE END 4 */ - } - /* USER CODE BEGIN 5 */ - /* USER CODE END 5 */ - return BASE_STATUS_OK; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/init/main.h deleted file mode 100644 index ebfbea6cc..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/init/main.h +++ /dev/null @@ -1,54 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "uart_ex.h" -#include "crg.h" -#include "dma.h" -#include "dma_ex.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -#define XTAL_DRV_LEVEL4 0x03U -#define XTAL_DRV_LEVEL3 0x02U -#define XTAL_DRV_LEVEL2 0x01U -#define XTAL_DRV_LEVEL1 0x00U - -extern UART_Handle g_uart; - -extern DMA_Handle g_dmac; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); -void DMA_Channel3CallBack(void *handle); -void DMA_Channel2CallBack(void *handle); -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/init/system_init.c deleted file mode 100644 index a17817354..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/init/system_init.c +++ /dev/null @@ -1,158 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" -#include "iocmg.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 48; /* PLL Multiplier 48 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_2; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; - crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; - crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; - - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void DMA_Channel3Init(void *handle) -{ - DMA_ChannelParam dma_param; - dma_param.direction = DMA_MEMORY_TO_PERIPH_BY_DMAC; - dma_param.srcAddrInc = DMA_ADDR_INCREASE; - dma_param.destAddrInc = DMA_ADDR_UNALTERED; - dma_param.srcPeriph = DMA_REQUEST_MEM; - dma_param.destPeriph = DMA_REQUEST_UART0_TX; - dma_param.srcWidth = DMA_TRANSWIDTH_BYTE; - dma_param.destWidth = DMA_TRANSWIDTH_BYTE; - dma_param.srcBurst = DMA_BURST_LENGTH_1; - dma_param.destBurst = DMA_BURST_LENGTH_1; - dma_param.pHandle = handle; - HAL_DMA_InitChannel(&g_dmac, &dma_param, DMA_CHANNEL_THREE); -} - -static void DMA_Channel2Init(void *handle) -{ - DMA_ChannelParam dma_param; - dma_param.direction = DMA_PERIPH_TO_MEMORY_BY_DMAC; - dma_param.srcAddrInc = DMA_ADDR_UNALTERED; - dma_param.destAddrInc = DMA_ADDR_INCREASE; - dma_param.srcPeriph = DMA_REQUEST_UART0_RX; - dma_param.destPeriph = DMA_REQUEST_MEM; - dma_param.srcWidth = DMA_TRANSWIDTH_BYTE; - dma_param.destWidth = DMA_TRANSWIDTH_BYTE; - dma_param.srcBurst = DMA_BURST_LENGTH_1; - dma_param.destBurst = DMA_BURST_LENGTH_1; - dma_param.pHandle = handle; - HAL_DMA_InitChannel(&g_dmac, &dma_param, DMA_CHANNEL_TWO); -} - -static void DMA_Init(void) -{ - HAL_CRG_IpEnableSet(DMA_BASE, IP_CLK_ENABLE); - g_dmac.baseAddress = DMA; - IRQ_Register(IRQ_DMA_TC, HAL_DMA_IrqHandlerTc, &g_dmac); - IRQ_Register(IRQ_DMA_ERR, HAL_DMA_IrqHandlerError, &g_dmac); - IRQ_EnableN(IRQ_DMA_TC); - IRQ_EnableN(IRQ_DMA_ERR); - HAL_DMA_Init(&g_dmac); - DMA_Channel3Init((void *)(&g_uart)); - HAL_DMA_SetChannelPriorityEx(&g_dmac, DMA_CHANNEL_THREE, DMA_PRIORITY_LOW); - DMA_Channel2Init((void *)(&g_uart)); - HAL_DMA_SetChannelPriorityEx(&g_dmac, DMA_CHANNEL_TWO, DMA_PRIORITY_MEDIUM); -} - -__weak void DMA_Channel3CallBack(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN UART0_WRITE_DMA_FINISH */ - /* USER CODE END UART0_WRITE_DMA_FINISH */ -} - -__weak void DMA_Channel2CallBack(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN UART0_READ_DMA_FINISH */ - /* USER CODE END UART0_READ_DMA_FINISH */ -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - - g_uart.baseAddress = UART0; - - g_uart.baudRate = UART0_BAND_RATE; - g_uart.dataLength = UART_DATALENGTH_8BIT; - g_uart.stopBits = UART_STOPBITS_ONE; - g_uart.parity = UART_PARITY_NONE; - g_uart.txMode = UART_MODE_DMA; - g_uart.rxMode = UART_MODE_DMA; - g_uart.fifoMode = BASE_CFG_ENABLE; - g_uart.fifoTxThr = UART_FIFODEPTH_SIZE8; - g_uart.fifoRxThr = UART_FIFODEPTH_SIZE8; - g_uart.hwFlowCtr = BASE_CFG_DISABLE; - g_uart.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; - g_uart.handleEx.msbFirst = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart); - - g_uart.dmaHandle = &g_dmac; - g_uart.uartDmaTxChn = 3; /* Rx Dma Channel is 3. */ - HAL_UART_RegisterCallBack(&g_uart, UART_WRITE_DMA_FINISH, DMA_Channel3CallBack); - g_uart.uartDmaRxChn = 2; /* DMA channel is 2. */ - HAL_UART_RegisterCallBack(&g_uart, UART_READ_DMA_FINISH, DMA_Channel2CallBack); -} - -static void IOConfig(void) -{ - HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ -} - -void SystemInit(void) -{ - IOConfig(); - DMA_Init(); - UART0_Init(); - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/readme.md deleted file mode 100644 index edef7c1d1..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/readme.md +++ /dev/null @@ -1,22 +0,0 @@ -# UART-Tx和Rx在DMA模式下同时收发数据 -## 关键字: UART, Tx_DMA_Rx_INT收发数据 - -**【功能描述】** -+ UART_DMA全双工收发数据,UART_DMA写的过程中,可以进行UART_DMA读。 - -**【示例配置】** -+ 预设置的缓存:配置发送数据和接收数据缓存地址 - -+ UART的Tx和Rx都配置为DMA模式。 - -+ UART_DMA发送数据:将待发送首地址和字符长度作为入参传入HAL_UART_WriteDMA()。 - -+ UART_DMA接收数据:将存放接收的首地址,和接收长度作为入参传入到HAL_UART_ReadDMA()中。 - -+ 串口0会打印发送和接收的数据。 - -**【示例效果】** -+ 示例程序会不断的进行UART_DMA发送、接收,实现UART_DMA写的过程中,可以进行UART_DMA读。 - -**【注意事项】** -+ 串口通信的波特率,校验位等配置需保持一致,可以通过UART配置界面进行更改。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/src/sample_uart_dma_tx_dma_rx_simultaneously.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/src/sample_uart_dma_tx_dma_rx_simultaneously.c deleted file mode 100644 index 39deeeb42..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/src/sample_uart_dma_tx_dma_rx_simultaneously.c +++ /dev/null @@ -1,113 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_uart_dma_tx_dma_rx_simultaneously.c - * @author MCU Driver Team - * @brief uart sample module, DMA transfer simultaneously. - * @details Transmits and receives UART_DMA data simultaneously. During UART_DMA write, UART_DMA can be read. - * (1) UART_DMA transmit data: The to-be-sent start address and character length are used as input - * parameters and transferred to HAL_UART_WriteDMA(). - * (2) UART_DMA receive data: The start address and receive length are used as input parameters to - * HAL_UART_ReadDMA(). - * (3) The sample program continuously transmits and receives UART_DMA. During UART_DMA write, - * UART_DMA can be read. - */ - -#include "sample_uart_dma_tx_dma_rx_simultaneously.h" - -#define DMA_RX_DATA_LENGTH 10 -#define DMA_TX_DATA_LENGTH 15 -#define NEED_REQUIRE_TIME 30 - -static unsigned char g_txDMAStr[DMA_TX_DATA_LENGTH] = "123456789012345"; /* The transmit data length is 15 */ -static unsigned char g_rxDMAStr[DMA_RX_DATA_LENGTH] = {0}; /* The receive data length is 10 */ -volatile bool txDMAFlag = false; /* This parameter is frequently changed in - the main function and callback function, - indicating whether the transmission is complete */ - -volatile bool rxDMAFlag = false; /* This parameter is frequently changed in - the main function and callback function, - indicating whether the reception is complete */ - -/** - * @brief Clear string. - * @param str, String to be cleared. - * @retval None. - */ -static void ClearString(unsigned char *str) -{ - for (unsigned int i = 0; i < DMA_RX_DATA_LENGTH; ++i) { - str[i] = 0; - } -} - -/** - * @brief User-defined write completion DMA write finish callback function. - * @param handle UART handle. - * @retval None. - */ -void DMA_Channel3CallBack(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("\r\nwrite_finish\r\n"); - txDMAFlag = true; - return; -} - -/** - * @brief User-defined write completion DMA read finish callback function. - * @param handle UART handle. - * @retval None. - */ -void DMA_Channel2CallBack(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("\r\nread_finish: %s\r\n", g_rxDMAStr); - rxDMAFlag = true; - return; -} - -/** - * @brief UART send and receive sample code in DMA mode. - * @param None. - * @retval None. - */ -void UART_DMATxAndRxSimultaneously(void) -{ - SystemInit(); - DBG_PRINTF("UART and DMA Init finish, UART DMA Tx DMA Rx simultaneously mode:\r\n"); - DBG_PRINTF("Tx transmits data 123456789012345, and Rx receives data with the length of 10 \r\n"); - - txDMAFlag = true; /* Enable DMA transmission */ - rxDMAFlag = true; /* Enable DMA reception */ - while (1) { - if (txDMAFlag) { - txDMAFlag = false; - HAL_UART_WriteDMA(&g_uart, g_txDMAStr, DMA_TX_DATA_LENGTH); /* DMA transmit data */ - } - - if (rxDMAFlag) { - rxDMAFlag = false; - ClearString(g_rxDMAStr); /* Clear the received data */ - /* DMA read: Length of the received data must be equal to the DMA_RX_DATA_LENGTH */ - HAL_UART_ReadDMA(&g_uart, g_rxDMAStr, DMA_RX_DATA_LENGTH); - } - /* Add a deletion delay as required */ - BASE_FUNC_DELAY_MS(NEED_REQUIRE_TIME); - } - return; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/inc/sample_uart_dma_tx_int_rx_simultaneously.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/inc/sample_uart_dma_tx_int_rx_simultaneously.h deleted file mode 100644 index b42b3ff96..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/inc/sample_uart_dma_tx_int_rx_simultaneously.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_uart_dma_tx_int_rx_simultaneously.h - * @author MCU Driver Team - * @brief uart sample module. - * @details This file provides sample code for users to help use - * the transmission of the UART in DMA tx and interrupt rx simultaneously. - */ -#ifndef SAMPLE_UART_DMA_TX_INT_RX_SIMULTANEOUSLY_H -#define SAMPLE_UART_DMA_TX_INT_RX_SIMULTANEOUSLY_H - -#include "debug.h" -#include "uart.h" -#include "interrupt.h" -#include "main.h" - -void UART_DMATxAndINTRxSimultaneously(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/init/main.c deleted file mode 100644 index d9924296f..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/init/main.c +++ /dev/null @@ -1,48 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ - -#include "typedefs.h" -#include "feature.h" -#include "sample_uart_dma_tx_int_rx_simultaneously.h" -#include "main.h" -/* USER CODE BEGIN 0 */ -/* USER CODE END 0 */ -UART_Handle g_uart; -DMA_Handle g_dmac; -/* USER CODE BEGIN 1 */ -/* USER CODE END 1 */ - -int main(void) -{ - /* USER CODE BEGIN 2 */ - /* USER CODE END 2 */ - UART_DMATxAndINTRxSimultaneously(); - /* USER CODE BEGIN 3 */ - /* USER CODE END 3 */ - while (1) { - /* USER CODE BEGIN 4 */ - /* USER CODE END 4 */ - } - /* USER CODE BEGIN 5 */ - /* USER CODE END 5 */ - return BASE_STATUS_OK; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/init/main.h deleted file mode 100644 index 90f388676..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/init/main.h +++ /dev/null @@ -1,57 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "uart_ex.h" -#include "crg.h" -#include "dma.h" -#include "dma_ex.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -#define XTAL_DRV_LEVEL4 0x03U -#define XTAL_DRV_LEVEL3 0x02U -#define XTAL_DRV_LEVEL2 0x01U -#define XTAL_DRV_LEVEL1 0x00U - -extern UART_Handle g_uart; - -extern DMA_Handle g_dmac; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -void WriteFinish(void *handle); -void ReadCallBack(void *handle); -void UART0InterruptErrorCallback(void *handle); -void DMA_Channel3CallBack(void *handle); -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/init/system_init.c deleted file mode 100644 index 67df918fc..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/init/system_init.c +++ /dev/null @@ -1,150 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" -#include "iocmg.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 48; /* PLL Multiplier 48 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_2; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; - crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; - crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; - - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void DMA_Channel3Init(void *handle) -{ - DMA_ChannelParam dma_param; - dma_param.direction = DMA_MEMORY_TO_PERIPH_BY_DMAC; - dma_param.srcAddrInc = DMA_ADDR_INCREASE; - dma_param.destAddrInc = DMA_ADDR_UNALTERED; - dma_param.srcPeriph = DMA_REQUEST_MEM; - dma_param.destPeriph = DMA_REQUEST_UART0_TX; - dma_param.srcWidth = DMA_TRANSWIDTH_BYTE; - dma_param.destWidth = DMA_TRANSWIDTH_BYTE; - dma_param.srcBurst = DMA_BURST_LENGTH_1; - dma_param.destBurst = DMA_BURST_LENGTH_1; - dma_param.pHandle = handle; - HAL_DMA_InitChannel(&g_dmac, &dma_param, DMA_CHANNEL_THREE); -} - -static void DMA_Init(void) -{ - HAL_CRG_IpEnableSet(DMA_BASE, IP_CLK_ENABLE); - g_dmac.baseAddress = DMA; - IRQ_Register(IRQ_DMA_TC, HAL_DMA_IrqHandlerTc, &g_dmac); - IRQ_Register(IRQ_DMA_ERR, HAL_DMA_IrqHandlerError, &g_dmac); - IRQ_EnableN(IRQ_DMA_TC); - IRQ_EnableN(IRQ_DMA_ERR); - HAL_DMA_Init(&g_dmac); - DMA_Channel3Init((void *)(&g_uart)); - HAL_DMA_SetChannelPriorityEx(&g_dmac, DMA_CHANNEL_THREE, DMA_PRIORITY_LOW); -} - -__weak void UART0InterruptErrorCallback(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN UART0_TRNS_IT_ERROR */ - /* USER CODE END UART0_TRNS_IT_ERROR */ -} - -__weak void ReadCallBack(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN UART0_READ_IT_FINISH */ - /* USER CODE END UART0_READ_IT_FINISH */ -} - -__weak void DMA_Channel3CallBack(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN UART0_WRITE_DMA_FINISH */ - /* USER CODE END UART0_WRITE_DMA_FINISH */ -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - - g_uart.baseAddress = UART0; - - g_uart.baudRate = UART0_BAND_RATE; - g_uart.dataLength = UART_DATALENGTH_8BIT; - g_uart.stopBits = UART_STOPBITS_ONE; - g_uart.parity = UART_PARITY_NONE; - g_uart.txMode = UART_MODE_DMA; - g_uart.rxMode = UART_MODE_INTERRUPT; - g_uart.fifoMode = BASE_CFG_ENABLE; - g_uart.fifoTxThr = UART_FIFODEPTH_SIZE8; - g_uart.fifoRxThr = UART_FIFODEPTH_SIZE8; - g_uart.hwFlowCtr = BASE_CFG_DISABLE; - g_uart.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; - g_uart.handleEx.msbFirst = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart); - HAL_UART_RegisterCallBack(&g_uart, UART_TRNS_IT_ERROR, UART0InterruptErrorCallback); - HAL_UART_RegisterCallBack(&g_uart, UART_READ_IT_FINISH, ReadCallBack); - - IRQ_Register(IRQ_UART0, HAL_UART_IrqHandler, &g_uart); - IRQ_SetPriority(IRQ_UART0, 1); - IRQ_EnableN(IRQ_UART0); - g_uart.dmaHandle = &g_dmac; - g_uart.uartDmaTxChn = 3; /* Rx Dma Channel is 3. */ - HAL_UART_RegisterCallBack(&g_uart, UART_WRITE_DMA_FINISH, DMA_Channel3CallBack); -} - -static void IOConfig(void) -{ - HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ -} - -void SystemInit(void) -{ - IOConfig(); - DMA_Init(); - UART0_Init(); - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/readme.md deleted file mode 100644 index acb2b0f97..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/readme.md +++ /dev/null @@ -1,22 +0,0 @@ -# UART-Tx在DMA模式下发送数据Rx在中断模式下接收数据 -## 关键字: UART, Tx_DMA_Rx_INT收发数据 - -**【功能描述】** -+ UART全双工收发数据,实现中断和UART_DAM全双工收发数据,UART_DMA写的过程中,可以进行中断读。 - -**【示例配置】** -+ 预设置的缓存:配置发送数据和接收数据缓存地址 - -+ 配置UART接收中断以及中断回调函数,默认接收中断回调函数为“ReadCallBack”, 可通过函数“HAL_UART_RegisterCallBack”进行更改。 - -+ UART_DMA发送数据:将待发送首地址和字符长度作为入参传入HAL_UART_WriteDMA()。 - -+ 中断接收数据:将存放接收的首地址,和接收长度作为入参传入到HAL_UART_ReadIT()中。 - -+ 串口0会打印发送和接收的数据。 - -**【示例效果】** -+ 示例程序会不断的进行UART_DMA发送、中断接收数据,实现UART_DMA发送的过程中,可以进行中断接收数据。 - -**【注意事项】** -+ 串口通信的波特率,校验位等配置需保持一致,可以通过UART配置界面进行更改。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/src/sample_uart_dma_tx_int_rx_simultaneously.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/src/sample_uart_dma_tx_int_rx_simultaneously.c deleted file mode 100644 index 890da75ca..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/src/sample_uart_dma_tx_int_rx_simultaneously.c +++ /dev/null @@ -1,115 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_uart_dma_tx_int_rx_simultaneously.c - * @author MCU Driver Team - * @brief uart sample module. - * @details Implements the interrupt and UART_DAM transmit and receive data simultaneously. - * During UART_DMA write, the interrupt can be read. - * (1) UART_DMA transmit data: The to-be-sent start address and character length are used as input - * parameters and transferred to HAL_UART_WriteDMA(). - * (2) Interrupt receive data: The start address and receive length are used as input parameters to - * HAL_UART_ReadIT(). - * (3) The example program continuously transmits UART_DMA and interrupts data reception. - * During the UART_DMA transmission process, interrupts can be received data. - */ - -#include "sample_uart_dma_tx_int_rx_simultaneously.h" - -#define RX_DATA_LENGTH 10 -#define TX_DATA_LENGTH 15 -#define REQUIRE_TIME 30 - -static unsigned char g_txStr[TX_DATA_LENGTH] = "123456789012345"; /* The transmit data length is 15 */ -static unsigned char g_rxStr[RX_DATA_LENGTH] = {0}; /* The receive data length is 10 */ -volatile bool txFlag = false; /* This parameter is frequently changed in - the main function and callback function, - indicating whether transmission is complete */ - -volatile bool rxFlag = false; /* This parameter is frequently changed in - the main function and callback function, - indicating whether reception is complete */ - -/** - * @brief Clear string. - * @param str, String to be cleared. - * @retval None. - */ -static void ClearString(unsigned char *str) -{ - for (unsigned int i = 0; i < RX_DATA_LENGTH; ++i) { - str[i] = 0; - } -} - -/** - * @brief User-defined write completion interrupt callback function. - * @param UART_Handle UART handle. - * @retval None. - */ -void ReadCallBack(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("\r\nRead Finish: %s\r\n", g_rxStr); - rxFlag = true; - return; -} - -/** - * @brief User-defined write completion DMA callback function. - * @param handle UART handle. - * @retval None. - */ -void DMA_Channel3CallBack(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("\r\nwrite_finish\r\n"); - txFlag = true; - return; -} - -/** - * @brief UART DMA Tx and interrupt Rx simultaneously. - * @param None. - * @retval None. - */ -void UART_DMATxAndINTRxSimultaneously(void) -{ - SystemInit(); - DBG_PRINTF("UART Init finish, UART DMA Tx interrupt Rx simultaneously mode:\r\n"); - DBG_PRINTF("Tx transmits data 123456789012345, and Rx receives data with the length of 10 \r\n"); - - txFlag = true; /* Enable DMA transmission */ - rxFlag = true; /* Enable IT reception */ - while (1) { - if (txFlag) { - txFlag = false; - /* DMA transmit data */ - HAL_UART_WriteDMA(&g_uart, g_txStr, TX_DATA_LENGTH); - } - - if (rxFlag) { - rxFlag = false; - /* Clear the received data */ - ClearString(g_rxStr); - /* UART IT read: Length of the received data must be equal to the RX_DATA_LENGTH */ - HAL_UART_ReadIT(&g_uart, g_rxStr, RX_DATA_LENGTH); - } - BASE_FUNC_DELAY_MS(REQUIRE_TIME); /* Add a deletion delay as required */ - } - return; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/inc/sample_uart_int_tx_dma_rx_simultaneously.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/inc/sample_uart_int_tx_dma_rx_simultaneously.h deleted file mode 100644 index 2a20ac8bf..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/inc/sample_uart_int_tx_dma_rx_simultaneously.h +++ /dev/null @@ -1,34 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_uart_int_tx_dma_rx_simultaneously.h - * @author MCU Driver Team - * @brief uart sample module. - * @details This file provides sample code for users to help use - * the transmission of the UART in interrupt tx and DMA rx simultaneously. - */ - -#ifndef SAMPLE_UART_INT_TX_DMA_RX_SIMULTANEOUSLY_H -#define SAMPLE_UART_INT_TX_DMA_RX_SIMULTANEOUSLY_H - -#include "debug.h" -#include "uart.h" -#include "interrupt.h" -#include "main.h" - -void UART_INTTxAndDMARxSimultaneously(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/init/main.c deleted file mode 100644 index 173ab8d88..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/init/main.c +++ /dev/null @@ -1,48 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ - -#include "typedefs.h" -#include "feature.h" -#include "sample_uart_int_tx_dma_rx_simultaneously.h" -#include "main.h" -/* USER CODE BEGIN 0 */ -/* USER CODE END 0 */ -UART_Handle g_uart; -DMA_Handle g_dmac; -/* USER CODE BEGIN 1 */ -/* USER CODE END 1 */ - -int main(void) -{ - /* USER CODE BEGIN 2 */ - /* USER CODE END 2 */ - UART_INTTxAndDMARxSimultaneously(); - /* USER CODE BEGIN 3 */ - /* USER CODE END 3 */ - while (1) { - /* USER CODE BEGIN 4 */ - /* USER CODE END 4 */ - } - /* USER CODE BEGIN 5 */ - /* USER CODE END 5 */ - return BASE_STATUS_OK; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/init/main.h deleted file mode 100644 index e67e803d3..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/init/main.h +++ /dev/null @@ -1,57 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "uart_ex.h" -#include "crg.h" -#include "dma.h" -#include "dma_ex.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -#define XTAL_DRV_LEVEL4 0x03U -#define XTAL_DRV_LEVEL3 0x02U -#define XTAL_DRV_LEVEL2 0x01U -#define XTAL_DRV_LEVEL1 0x00U - -extern UART_Handle g_uart; - -extern DMA_Handle g_dmac; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -void WriteCallBack(void *handle); -void ReadCallBack(void *handle); -void UART0InterruptErrorCallback(void *handle); -void DMA_Channel2CallBack(void *handle); -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/init/system_init.c deleted file mode 100644 index 20675e47c..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/init/system_init.c +++ /dev/null @@ -1,150 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" -#include "iocmg.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 48; /* PLL Multiplier 48 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_2; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; - crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; - crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; - - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void DMA_Channel2Init(void *handle) -{ - DMA_ChannelParam dma_param; - dma_param.direction = DMA_PERIPH_TO_MEMORY_BY_DMAC; - dma_param.srcAddrInc = DMA_ADDR_UNALTERED; - dma_param.destAddrInc = DMA_ADDR_INCREASE; - dma_param.srcPeriph = DMA_REQUEST_UART0_RX; - dma_param.destPeriph = DMA_REQUEST_MEM; - dma_param.srcWidth = DMA_TRANSWIDTH_BYTE; - dma_param.destWidth = DMA_TRANSWIDTH_BYTE; - dma_param.srcBurst = DMA_BURST_LENGTH_1; - dma_param.destBurst = DMA_BURST_LENGTH_1; - dma_param.pHandle = handle; - HAL_DMA_InitChannel(&g_dmac, &dma_param, DMA_CHANNEL_TWO); -} - -static void DMA_Init(void) -{ - HAL_CRG_IpEnableSet(DMA_BASE, IP_CLK_ENABLE); - g_dmac.baseAddress = DMA; - IRQ_Register(IRQ_DMA_TC, HAL_DMA_IrqHandlerTc, &g_dmac); - IRQ_Register(IRQ_DMA_ERR, HAL_DMA_IrqHandlerError, &g_dmac); - IRQ_EnableN(IRQ_DMA_TC); - IRQ_EnableN(IRQ_DMA_ERR); - HAL_DMA_Init(&g_dmac); - DMA_Channel2Init((void *)(&g_uart)); - HAL_DMA_SetChannelPriorityEx(&g_dmac, DMA_CHANNEL_TWO, DMA_PRIORITY_MEDIUM); -} - -__weak void UART0InterruptErrorCallback(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN UART0_TRNS_IT_ERROR */ - /* USER CODE END UART0_TRNS_IT_ERROR */ -} - -__weak void WriteCallBack(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN UART0_WRITE_IT_FINISH */ - /* USER CODE END UART0_WRITE_IT_FINISH */ -} - -__weak void DMA_Channel2CallBack(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN UART0_READ_DMA_FINISH */ - /* USER CODE END UART0_READ_DMA_FINISH */ -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - - g_uart.baseAddress = UART0; - - g_uart.baudRate = UART0_BAND_RATE; - g_uart.dataLength = UART_DATALENGTH_8BIT; - g_uart.stopBits = UART_STOPBITS_ONE; - g_uart.parity = UART_PARITY_NONE; - g_uart.txMode = UART_MODE_INTERRUPT; - g_uart.rxMode = UART_MODE_DMA; - g_uart.fifoMode = BASE_CFG_ENABLE; - g_uart.fifoTxThr = UART_FIFODEPTH_SIZE8; - g_uart.fifoRxThr = UART_FIFODEPTH_SIZE8; - g_uart.hwFlowCtr = BASE_CFG_DISABLE; - g_uart.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; - g_uart.handleEx.msbFirst = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart); - HAL_UART_RegisterCallBack(&g_uart, UART_TRNS_IT_ERROR, UART0InterruptErrorCallback); - HAL_UART_RegisterCallBack(&g_uart, UART_WRITE_IT_FINISH, WriteCallBack); - - IRQ_Register(IRQ_UART0, HAL_UART_IrqHandler, &g_uart); - IRQ_SetPriority(IRQ_UART0, 1); - IRQ_EnableN(IRQ_UART0); - g_uart.dmaHandle = &g_dmac; - g_uart.uartDmaRxChn = 2; /* DMA channel is 2. */ - HAL_UART_RegisterCallBack(&g_uart, UART_READ_DMA_FINISH, DMA_Channel2CallBack); -} - -static void IOConfig(void) -{ - HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ -} - -void SystemInit(void) -{ - IOConfig(); - DMA_Init(); - UART0_Init(); - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/readme.md deleted file mode 100644 index f682c1b56..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/readme.md +++ /dev/null @@ -1,22 +0,0 @@ -# UART-Tx在中断模式下发送数据Rx在DMA模式下接收数据 -## 关键字: UART, Tx_INT_Rx_DMA收发数据 - -**【功能描述】** -+ UART全双工收发数据,实现中断和UART_DAM全双工收发数据,中断写的过程中,可以进行UART_DMA读。 - -**【示例配置】** -+ 预设置的缓存:配置发送数据和接收数据缓存地址 - -+ 配置UART发送中断以及回调函数,默认发送中断回调函数为“WriteCallBack”, 可通过函数“HAL_UART_RegisterCallBack”进行更改。 - -+ 中断发送数据:将待发送首地址和字符长度作为入参传入HAL_UART_WriteIT()。 - -+ UART_DMA接收数据:将存放接收的首地址,和接收长度作为入参传入到HAL_UART_ReadDMA()中。 - -+ 串口0会打印发送和接收的数据。 - -**【示例效果】** -+ 示例程序会不断的进行中断发送、UART_DMA接收,实现中断写的过程中,可以进行UART_DMA读。 - -**【注意事项】** -+ 串口通信的波特率,校验位等配置需保持一致,可以通过UART配置界面进行更改。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/src/sample_uart_int_tx_dma_rx_simultaneously.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/src/sample_uart_int_tx_dma_rx_simultaneously.c deleted file mode 100644 index 92ef41045..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/src/sample_uart_int_tx_dma_rx_simultaneously.c +++ /dev/null @@ -1,115 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_uart_int_tx_dma_rx_simultaneously.c - * @author MCU Driver Team - * @brief uart sample module. - * @details Transmits and receive data simultaneously by interrupt tx and dma rx. During interrupt writing, - * UART_DMA can be read. - * (1) Interrupt sending data: The start address and character length to be sent are used as input parameters - * and transferred to HAL_UART_WriteIT(). - * (2) UART_DMA receive data: The start address and receive length are used as input parameters to - * HAL_UART_ReadDMA(). - * (3) The sample program continuously transmits interrupts and receives UART_DMA. During interrupt writing, - * UART_DMA can be read. - */ - -#include "sample_uart_int_tx_dma_rx_simultaneously.h" - -#define RX_IT_DMA_DATA_LENGTH 10 -#define TX_IT_DMA_DATA_LENGTH 15 -#define IT_DMA_REQUIRE_TIME 30 - -static unsigned char g_txITDMAStr[TX_IT_DMA_DATA_LENGTH] = "123456789012345"; /* The transmit data length is 15 */ -static unsigned char g_rxITDMAStr[RX_IT_DMA_DATA_LENGTH] = {0}; /* The receive data length is 10 */ -volatile bool txITDMAFlag = false; /* This parameter is frequently changed in - the main function and callback function, - indicating whether the transmission is complete */ - -volatile bool rxITDMAFlag = false; /* This parameter is frequently changed in - the main function and callback function, - indicating whether the reception is complete */ - -/** - * @brief Clear string. - * @param str, String to be cleared. - * @retval None. - */ -static void ClearString(unsigned char *str) -{ - for (unsigned int i = 0; i < RX_IT_DMA_DATA_LENGTH; ++i) { - str[i] = 0; - } -} - -/** - * @brief User-defined write completion interrupt callback function. - * @param UART_Handle UART handle. - * @retval None. - */ -void WriteCallBack(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("\r\nWrite Finish\r\n"); - txITDMAFlag = true; - return; -} - -/** - * @brief User-defined read completion DMA callback function. - * @param handle UART handle. - * @retval None. - */ -void DMA_Channel2CallBack(void *handle) -{ - UART_Handle *uartHandle = (UART_Handle *)handle; - DBG_PRINTF("read_finish: %s\r\n", g_rxITDMAStr); - BASE_FUNC_UNUSED(uartHandle); /* Use uart handle. */ - rxITDMAFlag = true; - return; -} - -/** - * @brief UART Interrupt Tx and DMA Rx simultaneously. - * @param None. - * @retval None. - */ -void UART_INTTxAndDMARxSimultaneously(void) -{ - SystemInit(); - DBG_PRINTF("UART Init finish, Interrupt Tx and DMA Rx simultaneously mode:\r\n"); - DBG_PRINTF("Tx transmits data 123456789012345, and Rx receives data with the length of 10 \r\n"); - - txITDMAFlag = true; /* Enable IT transmission */ - rxITDMAFlag = true; /* Enable DMA reception */ - while (1) { - if (txITDMAFlag) { - txITDMAFlag = false; - /* transmit data using UART_IT */ - HAL_UART_WriteIT(&g_uart, g_txITDMAStr, TX_IT_DMA_DATA_LENGTH); - } - - if (rxITDMAFlag) { - rxITDMAFlag = false; - ClearString(g_rxITDMAStr); /* Clear the array of g_rxITDMAStr */ - /* DMA read: Length of the received data must be equal to the RX_IT_DMA_DATA_LENGTH */ - HAL_UART_ReadDMA(&g_uart, g_rxITDMAStr, RX_IT_DMA_DATA_LENGTH); - } - BASE_FUNC_DELAY_MS(IT_DMA_REQUIRE_TIME); /* Add a deletion delay as required */ - } - return; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/inc/sample_uart_int_tx_int_rx_simultaneously.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/inc/sample_uart_int_tx_int_rx_simultaneously.h deleted file mode 100644 index e7a48b78a..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/inc/sample_uart_int_tx_int_rx_simultaneously.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_uart_int_tx_int_rx_simultaneously.h - * @author MCU Driver Team - * @brief uart sample module. - * @details This file provides sample code for users to help use - * the transmission of the UART in interrupt mode. - */ -#ifndef SAMPLE_UART_INT_TX_INT_RX_SIMULTANEOUSLY_H -#define SAMPLE_UART_INT_TX_INT_RX_SIMULTANEOUSLY_H - -#include "debug.h" -#include "uart.h" -#include "interrupt.h" -#include "main.h" - -void UART_INTTxAndINTRxSimultaneously(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/init/main.c deleted file mode 100644 index 6f1b17457..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/init/main.c +++ /dev/null @@ -1,47 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ - -#include "typedefs.h" -#include "feature.h" -#include "sample_uart_int_tx_int_rx_simultaneously.h" -#include "main.h" -/* USER CODE BEGIN 0 */ -/* USER CODE END 0 */ -UART_Handle g_uart; -/* USER CODE BEGIN 1 */ -/* USER CODE END 1 */ - -int main(void) -{ - /* USER CODE BEGIN 2 */ - /* USER CODE END 2 */ - UART_INTTxAndINTRxSimultaneously(); - /* USER CODE BEGIN 3 */ - /* USER CODE END 3 */ - while (1) { - /* USER CODE BEGIN 4 */ - /* USER CODE END 4 */ - } - /* USER CODE BEGIN 5 */ - /* USER CODE END 5 */ - return BASE_STATUS_OK; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/init/main.h deleted file mode 100644 index 4b0c36d84..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/init/main.h +++ /dev/null @@ -1,53 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "uart_ex.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -#define XTAL_DRV_LEVEL4 0x03U -#define XTAL_DRV_LEVEL3 0x02U -#define XTAL_DRV_LEVEL2 0x01U -#define XTAL_DRV_LEVEL1 0x00U - -extern UART_Handle g_uart; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -void WriteCallBack(void *handle); -void ReadCallBack(void *handle); -void UART0InterruptErrorCallback(void *handle); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/init/system_init.c deleted file mode 100644 index b5e8bb2c9..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/init/system_init.c +++ /dev/null @@ -1,118 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" -#include "iocmg.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 48; /* PLL Multiplier 48 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_2; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; - crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; - crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; - - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -__weak void UART0InterruptErrorCallback(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN UART0_TRNS_IT_ERROR */ - /* USER CODE END UART0_TRNS_IT_ERROR */ -} - -__weak void WriteCallBack(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN UART0_WRITE_IT_FINISH */ - /* USER CODE END UART0_WRITE_IT_FINISH */ -} - -__weak void ReadCallBack(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN UART0_READ_IT_FINISH */ - /* USER CODE END UART0_READ_IT_FINISH */ -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - - g_uart.baseAddress = UART0; - - g_uart.baudRate = UART0_BAND_RATE; - g_uart.dataLength = UART_DATALENGTH_8BIT; - g_uart.stopBits = UART_STOPBITS_ONE; - g_uart.parity = UART_PARITY_NONE; - g_uart.txMode = UART_MODE_INTERRUPT; - g_uart.rxMode = UART_MODE_INTERRUPT; - g_uart.fifoMode = BASE_CFG_ENABLE; - g_uart.fifoTxThr = UART_FIFODEPTH_SIZE8; - g_uart.fifoRxThr = UART_FIFODEPTH_SIZE8; - g_uart.hwFlowCtr = BASE_CFG_DISABLE; - g_uart.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; - g_uart.handleEx.msbFirst = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart); - HAL_UART_RegisterCallBack(&g_uart, UART_TRNS_IT_ERROR, UART0InterruptErrorCallback); - HAL_UART_RegisterCallBack(&g_uart, UART_WRITE_IT_FINISH, WriteCallBack); - HAL_UART_RegisterCallBack(&g_uart, UART_READ_IT_FINISH, ReadCallBack); - - IRQ_Register(IRQ_UART0, HAL_UART_IrqHandler, &g_uart); - IRQ_SetPriority(IRQ_UART0, 1); - IRQ_EnableN(IRQ_UART0); -} - -static void IOConfig(void) -{ - HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/readme.md deleted file mode 100644 index 3c0d4116e..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/readme.md +++ /dev/null @@ -1,22 +0,0 @@ -# UART-Tx和Rx在中断模式下收发数据 -## 关键字: UART, Tx_INT_Rx_INT收发数据 - -**【功能描述】** -+ UART全双工收发数据,实现UART全双工中断收发数据,中断写的过程中,可以进行中断读。 - -**【示例配置】** -+ 预设置的缓存:配置发送数据和接收数据缓存地址 - -+ 配置UART发送和接收中断以及回调函数,默认发送中断回调函数为“WriteCallBack”, 默认的接收中断回调函数为“ReadCallBack” 可通过函数“HAL_UART_RegisterCallBack”进行更改。 - -+ 中断发送数据:将待发送首地址和字符长度作为入参传入HAL_UART_WriteIT()。 - -+ 中断接收数据:将存放接收的首地址,和接收长度作为入参传入到HAL_UART_ReadIT()中。 - -+ 串口0会打印发送和接收的数据。 - -**【示例效果】** -+ 示例程序会不断的进行中断发送、接收,实现中断写的过程中,可以进行中断读。 - -**【注意事项】** -+ 串口通信的波特率,校验位等配置需保持一致,可以通过UART配置界面进行更改。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/src/sample_uart_int_tx_int_rx_simultaneously.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/src/sample_uart_int_tx_int_rx_simultaneously.c deleted file mode 100644 index 10d273033..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/src/sample_uart_int_tx_int_rx_simultaneously.c +++ /dev/null @@ -1,114 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_uart_int_tx_int_rx_simultaneously.c - * @author MCU Driver Team - * @brief uart sample module. - * @details Transmits and receives data simultaneously by interrupt tx and rx. During interrupt writing, interrupts - * can be read. - * (1) Interrupt sending data: The start address and character length to be sent are used as input - * parameters and transferred to HAL_UART_WriteIT(). - * (2) Interrupt receive data: The start address and receive length are used as input parameters to - * HAL_UART_ReadIT(). - * (3) The example program continuously transmits and receives interrupts. During interrupt writing, - * interrupt reading can be performed. - */ -#include "sample_uart_int_tx_int_rx_simultaneously.h" - -#define RX_IT_DATA_LENGTH 10 -#define TX_IT_DATA_LENGTH 15 -#define REQUIRE_TIME_IT 30 - -static unsigned char g_txITStr[TX_IT_DATA_LENGTH] = "123456789012345"; /* The transmit data length is 15 */ -static unsigned char g_rxITStr[RX_IT_DATA_LENGTH] = {0}; /* The receive data length is 10 */ -volatile bool txITFlag = false; /* This parameter is frequently changed in - the main function and callback function, - indicating whether transmission is complete */ - -volatile bool rxITFlag = false; /* This parameter is frequently changed in - the main function and callback function, - indicating whether reception is complete */ - -/** - * @brief Clear string. - * @param str, String to be cleared. - * @retval None. - */ -static void ClearString(unsigned char *str) -{ - for (unsigned int i = 0; i < RX_IT_DATA_LENGTH; ++i) { - str[i] = 0; - } -} - -/** - * @brief User-defined read completion interrupt callback function. - * @param UART_Handle UART handle. - * @retval None. - */ -void ReadCallBack(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("Read Finish: %s\r\n", g_rxITStr); - rxITFlag = true; - return; -} - -/** - * @brief User-defined write completion interrupt callback function. - * @param UART_Handle UART handle. - * @retval None. - */ -void WriteCallBack(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("\r\nWrite Finish\r\n"); - txITFlag = true; - return; -} - -/** - * @brief UART Interrupt Tx and Rx simultaneously. - * @param None. - * @retval None. - */ -void UART_INTTxAndINTRxSimultaneously(void) -{ - SystemInit(); - DBG_PRINTF("UART Init finish, UART intrrupt tx and interrupt rx simultaneously mode:\r\n"); - DBG_PRINTF("Tx transmits data 123456789012345, and Rx receives data with the length of 10 \r\n"); - - txITFlag = true; /* Enable interrupt transmission */ - rxITFlag = true; /* Enable interrupt reception */ - while (1) { - if (txITFlag) { - txITFlag = false; - /* UART interrupt send data */ - HAL_UART_WriteIT(&g_uart, g_txITStr, TX_IT_DATA_LENGTH); - } - - if (rxITFlag) { - rxITFlag = false; - /* Clear received data */ - ClearString(g_rxITStr); - /* Length of the received data must be equal to the RX_IT_DATA_LENGTH */ - HAL_UART_ReadIT(&g_uart, g_rxITStr, RX_IT_DATA_LENGTH); - } - BASE_FUNC_DELAY_MS(REQUIRE_TIME_IT); /* Add a deletion delay as required */ - } - return; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_rx/inc/sample_uart_interrupt_rx.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_rx/inc/sample_uart_interrupt_rx.h deleted file mode 100644 index 33b5d7569..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_rx/inc/sample_uart_interrupt_rx.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_uart_interrupt_rx.h - * @author MCU Driver Team - * @brief uart sample module. - * @details This file provides sample code for users to help use - * the transmission of the UART in interrupt mode. - */ -#ifndef SAMPLE_UART_INTERRUPT_TRANSMIT_H -#define SAMPLE_UART_INTERRUPT_TRANSMIT_H - -#include "debug.h" -#include "uart.h" -#include "interrupt.h" -#include "main.h" - -void UART_InterruptRX(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_rx/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_rx/init/main.c deleted file mode 100644 index e4a3186b6..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_rx/init/main.c +++ /dev/null @@ -1,47 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ - -#include "typedefs.h" -#include "feature.h" -#include "sample_uart_interrupt_rx.h" -#include "main.h" -/* USER CODE BEGIN 0 */ -/* USER CODE END 0 */ -UART_Handle g_uart; -/* USER CODE BEGIN 1 */ -/* USER CODE END 1 */ - -int main(void) -{ - /* USER CODE BEGIN 2 */ - /* USER CODE END 2 */ - UART_InterruptRX(); - /* USER CODE BEGIN 3 */ - /* USER CODE END 3 */ - while (1) { - /* USER CODE BEGIN 4 */ - /* USER CODE END 4 */ - } - /* USER CODE BEGIN 5 */ - /* USER CODE END 5 */ - return BASE_STATUS_OK; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_rx/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_rx/init/main.h deleted file mode 100644 index d29065a23..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_rx/init/main.h +++ /dev/null @@ -1,53 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "uart_ex.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -#define XTAL_DRV_LEVEL4 0x03U -#define XTAL_DRV_LEVEL3 0x02U -#define XTAL_DRV_LEVEL2 0x01U -#define XTAL_DRV_LEVEL1 0x00U - -extern UART_Handle g_uart; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -void UART0WriteInterruptCallback(void *handle); -void ReadFinish(void *handle); -void UART0InterruptErrorCallback(void *handle); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_rx/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_rx/init/system_init.c deleted file mode 100644 index 8654f721a..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_rx/init/system_init.c +++ /dev/null @@ -1,119 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" -#include "iocmg.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 48; /* PLL Multiplier 48 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_2; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; - crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; - crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; - - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -__weak void UART0InterruptErrorCallback(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN UART0_TRNS_IT_ERROR */ - /* USER CODE END UART0_TRNS_IT_ERROR */ -} - -__weak void UART0WriteInterruptCallback(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN UART0_WRITE_IT_FINISH */ - /* USER CODE END UART0_WRITE_IT_FINISH */ -} - -__weak void ReadFinish(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN UART0_READ_IT_FINISH */ - /* USER CODE END UART0_READ_IT_FINISH */ -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - - g_uart.baseAddress = UART0; - - g_uart.baudRate = UART0_BAND_RATE; - g_uart.dataLength = UART_DATALENGTH_8BIT; - g_uart.stopBits = UART_STOPBITS_ONE; - g_uart.parity = UART_PARITY_NONE; - g_uart.txMode = UART_MODE_INTERRUPT; - g_uart.rxMode = UART_MODE_INTERRUPT; - g_uart.fifoMode = BASE_CFG_ENABLE; - g_uart.fifoTxThr = UART_FIFODEPTH_SIZE8; - g_uart.fifoRxThr = UART_FIFODEPTH_SIZE8; - g_uart.hwFlowCtr = BASE_CFG_DISABLE; - g_uart.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; - g_uart.handleEx.msbFirst = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart); - HAL_UART_RegisterCallBack(&g_uart, UART_TRNS_IT_ERROR, UART0InterruptErrorCallback); - HAL_UART_RegisterCallBack(&g_uart, UART_WRITE_IT_FINISH, UART0WriteInterruptCallback); - HAL_UART_RegisterCallBack(&g_uart, UART_READ_IT_FINISH, ReadFinish); - - IRQ_Register(IRQ_UART0, HAL_UART_IrqHandler, &g_uart); - IRQ_SetPriority(IRQ_UART0, 1); - IRQ_EnableN(IRQ_UART0); -} - -static void IOConfig(void) -{ - HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_rx/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_rx/readme.md deleted file mode 100644 index f7b47e89d..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_rx/readme.md +++ /dev/null @@ -1,22 +0,0 @@ -# UART-中断模式接收数据 -## 关键字: UART, 中断模式接收 - -**【功能描述】** -+ UART以中断模式接收数据,数据接收完成将触发中断回调。 - -**【示例配置】** -+ 预设置的缓存:需要使用者自行开辟内存空间,将内存首地址和需要接收的字符长度作为入参传入HAL_UART_ReadIT()。 - -+ 串口0的接收模式配置为中断模式。 - -+ 发送数据完成之后,会调用发送完成中断回调函数,默认为“ReadFinish”, 可通过“HAL_UART_RegisterCallBack”函数进行更改。 - -+ 串口0会打印出接收到的数据和提示信息。 - -**【示例效果】** -+ 向串口0发送数据,串口0数据接收完成之后,会触发中断回调,打印接收的内容。 - -+ UART完成接收后,会上报中断,可以在UART中断回调函数中从预设值的缓存中读到接收的数据。 - -**【注意事项】** -+ 串口通信的波特率,校验位等配置需保持一致,可以通过UART配置界面进行更改。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_rx/src/sample_uart_interrupt_rx.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_rx/src/sample_uart_interrupt_rx.c deleted file mode 100644 index b3132e975..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_rx/src/sample_uart_interrupt_rx.c +++ /dev/null @@ -1,64 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_uart_interrupt_rx.c - * @author MCU Driver Team - * @brief uart sample module. - * @details In interrupt mode, when the UART completes receiving data, it indicates that the data - * has been transferred to the preset memory. In this case, an interrupt is triggered. - * (1) Preset buffer: The user needs to create the memory space. Use the start address of the memory - * and the length of the character to be received as input parameters to HAL_UART_ReadIT(). - * (2) Result reading: Read the result from the preset memory in the callback function of the UART. - */ -#include "sample_uart_interrupt_rx.h" - -static unsigned char g_rxStr[20] = {0}; -static volatile unsigned int g_flag; - -/** - * @brief User-defined read completion interrupt callback function. - * @param UART_Handle UART handle. - * @retval None. - */ -void ReadFinish(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("read_finish: %s\r\n", g_rxStr); - g_flag = 1; - return; -} - -/** - * @brief UART interrupt receive sample code. - * @param None. - * @retval None. - */ -void UART_InterruptRX(void) -{ - SystemInit(); - DBG_PRINTF("UART Init finish\r\n"); - unsigned int dataLength = 15; /* The receive length is 15 */ - g_flag = 0; - HAL_UART_ReadIT(&g_uart, g_rxStr, dataLength); - while (1) { - if (g_flag == 1) { - g_flag = 0; - HAL_UART_ReadIT(&g_uart, g_rxStr, dataLength); /* Start receiving again */ - } - } - return; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx/inc/sample_uart_interrupt_tx.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx/inc/sample_uart_interrupt_tx.h deleted file mode 100644 index 2ac7c4d70..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx/inc/sample_uart_interrupt_tx.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_uart_interrupt_tx.h - * @author MCU Driver Team - * @brief uart sample module. - * @details This file provides sample code for users to help use - * the transmission of the UART in interrupt mode. - */ -#ifndef SAMPLE_UART_INTERRUPT_TX_H -#define SAMPLE_UART_INTERRUPT_TX_H - -#include "debug.h" -#include "uart.h" -#include "interrupt.h" -#include "main.h" - -void UART_InterruptTX(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx/init/main.c deleted file mode 100644 index 18ead45fb..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx/init/main.c +++ /dev/null @@ -1,47 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ - -#include "typedefs.h" -#include "feature.h" -#include "sample_uart_interrupt_tx.h" -#include "main.h" -/* USER CODE BEGIN 0 */ -/* USER CODE END 0 */ -UART_Handle g_uart; -/* USER CODE BEGIN 1 */ -/* USER CODE END 1 */ - -int main(void) -{ - /* USER CODE BEGIN 2 */ - /* USER CODE END 2 */ - UART_InterruptTX(); - /* USER CODE BEGIN 3 */ - /* USER CODE END 3 */ - while (1) { - /* USER CODE BEGIN 4 */ - /* USER CODE END 4 */ - } - /* USER CODE BEGIN 5 */ - /* USER CODE END 5 */ - return BASE_STATUS_OK; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx/init/main.h deleted file mode 100644 index 88060880a..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx/init/main.h +++ /dev/null @@ -1,53 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "uart_ex.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -#define XTAL_DRV_LEVEL4 0x03U -#define XTAL_DRV_LEVEL3 0x02U -#define XTAL_DRV_LEVEL2 0x01U -#define XTAL_DRV_LEVEL1 0x00U - -extern UART_Handle g_uart; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -void WriteFinish(void *handle); -void UART0ReadInterruptCallback(void *handle); -void UART0InterruptErrorCallback(void *handle); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx/init/system_init.c deleted file mode 100644 index d5668746c..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx/init/system_init.c +++ /dev/null @@ -1,118 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" -#include "iocmg.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 48; /* PLL Multiplier 48 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_2; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; - crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; - crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; - - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -__weak void UART0InterruptErrorCallback(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN UART0_TRNS_IT_ERROR */ - /* USER CODE END UART0_TRNS_IT_ERROR */ -} - -__weak void WriteFinish(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN UART0_WRITE_IT_FINISH */ - /* USER CODE END UART0_WRITE_IT_FINISH */ -} - -__weak void UART0ReadInterruptCallback(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN UART0_READ_IT_FINISH */ - /* USER CODE END UART0_READ_IT_FINISH */ -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - - g_uart.baseAddress = UART0; - - g_uart.baudRate = UART0_BAND_RATE; - g_uart.dataLength = UART_DATALENGTH_8BIT; - g_uart.stopBits = UART_STOPBITS_ONE; - g_uart.parity = UART_PARITY_NONE; - g_uart.txMode = UART_MODE_INTERRUPT; - g_uart.rxMode = UART_MODE_INTERRUPT; - g_uart.fifoMode = BASE_CFG_ENABLE; - g_uart.fifoTxThr = UART_FIFODEPTH_SIZE8; - g_uart.fifoRxThr = UART_FIFODEPTH_SIZE8; - g_uart.hwFlowCtr = BASE_CFG_DISABLE; - g_uart.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; - g_uart.handleEx.msbFirst = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart); - HAL_UART_RegisterCallBack(&g_uart, UART_TRNS_IT_ERROR, UART0InterruptErrorCallback); - HAL_UART_RegisterCallBack(&g_uart, UART_WRITE_IT_FINISH, WriteFinish); - HAL_UART_RegisterCallBack(&g_uart, UART_READ_IT_FINISH, UART0ReadInterruptCallback); - - IRQ_Register(IRQ_UART0, HAL_UART_IrqHandler, &g_uart); - IRQ_SetPriority(IRQ_UART0, 1); - IRQ_EnableN(IRQ_UART0); -} - -static void IOConfig(void) -{ - HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx/readme.md deleted file mode 100644 index 935b41429..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx/readme.md +++ /dev/null @@ -1,20 +0,0 @@ -# UART-中断模式发送数据 -## 关键字: UART, 中断模式发送 - -**【功能描述】** -+ UART以中断模式发送数据,数据发送完成将触发中断回调。 - -**【示例配置】** -+ 预设置的缓存:需要使用者自行开辟内存空间,将待发送首地址和字符长度作为入参传入HAL_UART_WriteIT()。 - -+ 串口0的发送模式配置为中断模式。 - -+ 发送数据完成之后,会调用发送完成中断回调函数,默认为“UART0ReadInterruptCallback”, 可通过“HAL_UART_RegisterCallBack”函数进行更改。 - -+ 串口0会打印出发送成功的提示信息。 - -**【示例效果】** -+ UART搬运结束后,会上报中断,可以在UART中断回调函数中加上标志位进行判断是否完成。 - -**【注意事项】** -+ 串口通信的波特率,校验位等配置需保持一致,可以通过UART配置界面进行更改。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx/src/sample_uart_interrupt_tx.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx/src/sample_uart_interrupt_tx.c deleted file mode 100644 index e053c2066..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx/src/sample_uart_interrupt_tx.c +++ /dev/null @@ -1,58 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_uart_interrupt_tx.c - * @author MCU Driver Team - * @brief uart sample module. - * @details In interrupt mode, an interrupt is triggered when the UART has finished transmitting data. - * (1) Data to be sent: The start address and character length to be sent are used as input parameters - * and transferred to HAL_UART_WriteIT(). - * (2) Result determination: After the transfer is complete, an UART interrupt is reported. You can add - * a flag to the DMA interrupt callback function to determine whether the transfer is complete. - */ -#include "sample_uart_interrupt_tx.h" - -static unsigned char g_txStr[] = "12345678987654321"; - -/** - * @brief User-defined write completion interrupt callback function. - * @param None. - * @retval None. - */ -void WriteFinish(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("\r\nwrite_finish\r\n"); - return; -} - -/** - * @brief UART interrupt send sample code. - * @param None. - * @retval None. - */ -void UART_InterruptTX(void) -{ - SystemInit(); - DBG_PRINTF("UART Init finish\r\n"); - unsigned int dataLength = 17; /* The receive length is 17 */ - HAL_UART_WriteIT(&g_uart, g_txStr, dataLength); - while (1) { - ; - } - return; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/inc/sample_uart_interrupt_tx_after_rx.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/inc/sample_uart_interrupt_tx_after_rx.h deleted file mode 100644 index f8f23aae8..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/inc/sample_uart_interrupt_tx_after_rx.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_uart_interrupt_tx_after_rx.h - * @author MCU Driver Team - * @brief uart sample module. - * @details This file provides sample code for users to help use - * the transmission of the UART in interrupt mode. - */ -#ifndef SAMPLE_UART_INTERRUPT_TX_AFTER_RX_H -#define SAMPLE_UART_INTERRUPT_TX_AFTER_RX_H - -#include "debug.h" -#include "uart.h" -#include "interrupt.h" -#include "main.h" - -void UART_InterruptTxAfterRx(void); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/init/main.c deleted file mode 100644 index 8913c1b6b..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/init/main.c +++ /dev/null @@ -1,47 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ - -#include "typedefs.h" -#include "feature.h" -#include "sample_uart_interrupt_tx_after_rx.h" -#include "main.h" -/* USER CODE BEGIN 0 */ -/* USER CODE END 0 */ -UART_Handle g_uart; -/* USER CODE BEGIN 1 */ -/* USER CODE END 1 */ - -int main(void) -{ - /* USER CODE BEGIN 2 */ - /* USER CODE END 2 */ - UART_InterruptTxAfterRx(); - /* USER CODE BEGIN 3 */ - /* USER CODE END 3 */ - while (1) { - /* USER CODE BEGIN 4 */ - /* USER CODE END 4 */ - } - /* USER CODE BEGIN 5 */ - /* USER CODE END 5 */ - return BASE_STATUS_OK; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/init/main.h deleted file mode 100644 index 6bd6340f0..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/init/main.h +++ /dev/null @@ -1,52 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "uart_ex.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -#define XTAL_DRV_LEVEL4 0x03U -#define XTAL_DRV_LEVEL3 0x02U -#define XTAL_DRV_LEVEL2 0x01U -#define XTAL_DRV_LEVEL1 0x00U - -extern UART_Handle g_uart; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -void WriteCallBack(void *handle); -void ReadCallBack(void *handle); -void UART0InterruptErrorCallback(void *handle); -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/init/system_init.c deleted file mode 100644 index b5e8bb2c9..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/init/system_init.c +++ /dev/null @@ -1,118 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" -#include "iocmg.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 48; /* PLL Multiplier 48 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_2; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; - crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; - crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; - - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -__weak void UART0InterruptErrorCallback(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN UART0_TRNS_IT_ERROR */ - /* USER CODE END UART0_TRNS_IT_ERROR */ -} - -__weak void WriteCallBack(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN UART0_WRITE_IT_FINISH */ - /* USER CODE END UART0_WRITE_IT_FINISH */ -} - -__weak void ReadCallBack(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN UART0_READ_IT_FINISH */ - /* USER CODE END UART0_READ_IT_FINISH */ -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - - g_uart.baseAddress = UART0; - - g_uart.baudRate = UART0_BAND_RATE; - g_uart.dataLength = UART_DATALENGTH_8BIT; - g_uart.stopBits = UART_STOPBITS_ONE; - g_uart.parity = UART_PARITY_NONE; - g_uart.txMode = UART_MODE_INTERRUPT; - g_uart.rxMode = UART_MODE_INTERRUPT; - g_uart.fifoMode = BASE_CFG_ENABLE; - g_uart.fifoTxThr = UART_FIFODEPTH_SIZE8; - g_uart.fifoRxThr = UART_FIFODEPTH_SIZE8; - g_uart.hwFlowCtr = BASE_CFG_DISABLE; - g_uart.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; - g_uart.handleEx.msbFirst = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart); - HAL_UART_RegisterCallBack(&g_uart, UART_TRNS_IT_ERROR, UART0InterruptErrorCallback); - HAL_UART_RegisterCallBack(&g_uart, UART_WRITE_IT_FINISH, WriteCallBack); - HAL_UART_RegisterCallBack(&g_uart, UART_READ_IT_FINISH, ReadCallBack); - - IRQ_Register(IRQ_UART0, HAL_UART_IrqHandler, &g_uart); - IRQ_SetPriority(IRQ_UART0, 1); - IRQ_EnableN(IRQ_UART0); -} - -static void IOConfig(void) -{ - HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/readme.md deleted file mode 100644 index 14690b450..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/readme.md +++ /dev/null @@ -1,22 +0,0 @@ -# UART-中断模式下环回发送数据 -## 关键字: UART, 中断模式环回发送 - -**【功能描述】** -+ 在中断模式下,当UART接收到对端发送数据时,又将刚接收到的数据发送到对端,整个过程接收和发送均会触发UART中断。 - -**【示例配置】** -+ 接收:需要使用者自行开辟内存空间,将内存首地址和需要接收的字符长度作为入参传入HAL_UART_ReadIT(),接收到的数据会存到缓存中。 - -+ 发送:在接收中断上报后,将缓存中的数据作为待发送数据,填入HAL_UART_WriteIT()。 - -+ 发送数据完成之后,会调用发送完成中断回调函数,默认为“UART0ReadInterruptCallback”, 可通过“HAL_UART_RegisterCallBack”函数进行更改。 - -+ 接收数据完成之后,会调用接收完成中断回调函数,默认为“ReadCallBack”, 用户可通过“HAL_UART_RegisterCallBack”函数进行更改。 - -+ 串口0会打印出发送成功的提示信息。 - -**【示例效果】** -+ 向串口0发送数据, 串口0会发送刚刚接收到的字符。 - -**【注意事项】** -+ 串口通信的波特率,校验位等配置需保持一致,可以通过UART配置界面进行更改。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/src/sample_uart_interrupt_tx_after_rx.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/src/sample_uart_interrupt_tx_after_rx.c deleted file mode 100644 index 7f57451bd..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/src/sample_uart_interrupt_tx_after_rx.c +++ /dev/null @@ -1,114 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_uart_interrupt_tx_after_rx.c - * @author MCU Driver Team - * @brief uart sample module. - * @details In interrupt mode, when the UART receives data from the peer end, the UART sends the received data to the - * peer end. The UART interrupt is triggered during the entire process of receiving and transmitting data. - * (1) Receive: The user needs to open the memory space. The start address of the memory and the length of - * character to be received are used as input parameters and transferred to HAL_UART_ReadIT(). The received - * data is stored in the cache. - * (2) Transmit: After receiving an interrupt, the data in the buffer is used as the data to be transmitted - * and is filled in HAL_UART_WriteIT(). - */ -#include "sample_uart_interrupt_tx_after_rx.h" - -static unsigned char g_str[15] = {0}; -static volatile unsigned int g_flag; -static unsigned int CountString(unsigned char *str); -static void ClearString(unsigned char *str); - -/** - * @brief User-defined read completion interrupt callback function. - * @param UART_Handle UART handle. - * @retval None. - */ -void ReadCallBack(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("Read Finish: %s\r\n", g_str); - g_flag = true; - return; -} - -/** - * @brief User-defined write completion interrupt callback function. - * @param UART_Handle UART handle. - * @retval None. - */ -void WriteCallBack(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("\r\nWrite Finish\r\n"); - return; -} - -/** - * @brief Count length of string. - * @param str, String to be cleared. - * @retval unsigned int, Character length. - */ -static unsigned int CountString(unsigned char *str) -{ - unsigned int ret; - if (str == NULL) { - return 0; - } - unsigned char *tmpStr = str; /* Cycle Count */ - for (ret = 0; *tmpStr != 0; tmpStr++) { - ret++; - } - return ret; -} - -/** - * @brief Clear string. - * @param str, String to be cleared. - * @retval None. - */ -static void ClearString(unsigned char *str) -{ - unsigned int len = CountString(str); - for (unsigned int i = 0; i < len; ++i) { - str[i] = 0; - } -} - -/** - * @brief UART interrupt receive sample code. - * @param None. - * @retval None. - */ -void UART_InterruptTxAfterRx(void) -{ - SystemInit(); - DBG_PRINTF("UART Init finish, please enter characters(length no more than 10):\r\n"); - unsigned int rxDataLength = 10; /* The receive length is 10 */ - g_flag = false; - HAL_UART_ReadIT(&g_uart, g_str, rxDataLength); - while (1) { - if (g_flag == true) { - g_flag = false; - unsigned int txDataLength = CountString(g_str); /* string length of the data to be sent after receiving */ - HAL_UART_WriteIT(&g_uart, g_str, txDataLength); - ClearString(g_str); - HAL_UART_ReadIT(&g_uart, g_str, rxDataLength); - } - } - return; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_single_wire_communication/inc/sample_uart_single_wire_communication.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_single_wire_communication/inc/sample_uart_single_wire_communication.h deleted file mode 100644 index 3f2d1d78e..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_single_wire_communication/inc/sample_uart_single_wire_communication.h +++ /dev/null @@ -1,55 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_uart_single_wire_communication.h - * @author MCU Driver Team - * @brief uart sample module. - * @details This file provides sample code for users to help use - * the single wire transmission of the UART in interrupt mode. - */ - -#ifndef SAMPLE_UART_SINGLE_WIRE_COMMUNICATION -#define SAMPLE_UART_SINGLE_WIRE_COMMUNICATION - -#include "debug.h" -#include "uart.h" -#include "interrupt.h" -#include "main.h" -#include "ioconfig.h" -/* Indicates the bus status. */ -typedef enum { - UART_SINGLE_WIRE_READY = 0x00000000U, - UART_SINGLE_WIRE_TX_FIN = 0x00000001U, - UART_SINGLE_WIRE_RX_FIN = 0x00000002U, - UART_SINGLE_WIRE_BUSY = 0x00000004U, - UART_SINGLE_WIRE_SEND_SUCCESS = 0x00000008U -} UART_SINGLEWIRESTATUS; - -extern volatile unsigned int g_uartSingleWireStatus; /* A global variable that indicates the bus status. */ -extern volatile bool g_uartNotBusy; /* Global variable indicating whether the bus is busy. */ - -/* Function declaration */ -void UART_SingleWireCommunication(void); -void UART_EnableTx(UART_Handle *handle); -void UART_DisableTx(UART_Handle *handle); -void UART_EnableRx(UART_Handle *handle); -void UART_DisableRx(UART_Handle *handle); -void UART2TxIOEnable(void); /* IO config setting. */ -void UART1TxIOEnable(void); -void UART1TxToUART2Rx(UART_Handle *uart1Handle, UART_Handle *uart2Handle); /* Pin configure. */ -void UART2TxToUART1Rx(UART_Handle *uart1Handle, UART_Handle *uart2Handle); -#endif \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_single_wire_communication/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_single_wire_communication/init/main.c deleted file mode 100644 index c37a23031..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_single_wire_communication/init/main.c +++ /dev/null @@ -1,51 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ - -#include "typedefs.h" -#include "feature.h" -#include "main.h" -/* USER CODE BEGIN 0 */ -/* USER CODE END 0 */ -TIMER_Handle g_timer2; -UART_Handle g_uart0; -UART_Handle g_uart1; -UART_Handle g_uart2; -/* USER CODE BEGIN 1 */ -/* USER CODE END 1 */ -int main(void) -{ - /* USER CODE BEGIN 2 */ - /* USER CODE END 2 */ - UART_SingleWireCommunication(); - /* USER CODE BEGIN 3 */ - /* USER CODE END 3 */ - while (1) { - /* USER CODE BEGIN 4 */ - /* USER CODE END 4 */ - } - /* USER CODE BEGIN 5 */ - /* USER CODE END 5 */ - return BASE_STATUS_OK; -} - -/* USER CODE BEGIN 6 */ -/* USER CODE END 6 */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_single_wire_communication/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_single_wire_communication/init/main.h deleted file mode 100644 index 327587170..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_single_wire_communication/init/main.h +++ /dev/null @@ -1,60 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "timer.h" -#include "crg.h" -#include "sample_uart_single_wire_communication.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -#define XTAL_DRV_LEVEL4 0x03U -#define XTAL_DRV_LEVEL3 0x02U -#define XTAL_DRV_LEVEL2 0x01U -#define XTAL_DRV_LEVEL1 0x00U - -extern TIMER_Handle g_timer2; -extern UART_Handle g_uart0; -extern UART_Handle g_uart1; -extern UART_Handle g_uart2; -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -void UART1WriteInterruptCallback(UART_Handle *handle); -void UART1ReadInterruptCallback(UART_Handle *handle); -void UART1InterruptErrorCallback(UART_Handle *handle); -void UART2WriteInterruptCallback(UART_Handle *handle); -void UART2ReadInterruptCallback(UART_Handle *handle); -void UART2InterruptErrorCallback(UART_Handle *handle); -void TIMER2CallbackFunction(void *handle); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_single_wire_communication/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_single_wire_communication/init/system_init.c deleted file mode 100644 index a844db244..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_single_wire_communication/init/system_init.c +++ /dev/null @@ -1,268 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" - -#define UART0_BAND_RATE 115200 -#define UART1_BAND_RATE 800 -#define UART2_BAND_RATE 800 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; - /* USER CODE BEGIN CRG ITCallBackFunc */ - /* USER CODE END CRG ITCallBackFunc */ - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - /* USER CODE BEGIN crg system_init */ - /* USER CODE END crg system_init */ - return BASE_STATUS_OK; -} - -__weak void TIMER2CallbackFunction(void *handle) -{ - HAL_TIMER_IrqClear((TIMER_Handle *)handle); - /* USER CODE BEGIN TIMER2 ITCallBackFunc */ - /* USER CODE END TIMER2 ITCallBackFunc */ -} -static void TIMER2_Init(void) -{ - unsigned int load = HAL_CRG_GetIpFreq((void *)TIMER2) / 1000000u * 500; /* 500us timer counting period. */ - - HAL_CRG_IpEnableSet(TIMER2_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(TIMER2_BASE, CRG_PLL_NO_PREDV); - - g_timer2.baseAddress = TIMER2; - g_timer2.irqNum = IRQ_TIMER2; - /* USER CODE BEGIN timer2 system_init */ - /* USER CODE END timer2 system_init */ - g_timer2.load = load - 1; /* Set timer value immediately */ - g_timer2.bgLoad = load - 1; /* Set timer value */ - g_timer2.mode = TIMER_MODE_RUN_PERIODIC; /* Run in period mode */ - g_timer2.prescaler = TIMERPRESCALER_NO_DIV; /* Don't frequency division */ - g_timer2.size = TIMER_SIZE_32BIT; /* 1 for 32bit, 0 for 16bit */ - g_timer2.dmaAdcSingleReqEnable = BASE_CFG_DISABLE; - g_timer2.dmaBurstReqEnable = BASE_CFG_DISABLE; - g_timer2.interruptEn = BASE_CFG_ENABLE; - HAL_TIMER_Init(&g_timer2); - /* USER CODE BEGIN timer2 system_init */ - /* USER CODE END timer2 system_init */ - HAL_TIMER_RegisterCallback(&g_timer2, TIMER2CallbackFunction); /* Timer callback funtion register. */ - IRQ_SetPriority(g_timer2.irqNum, 1); - IRQ_EnableN(g_timer2.irqNum); -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); - /* USER CODE BEGIN uart0 system_init */ - /* USER CODE END uart0 system_init */ - g_uart0.baseAddress = UART0; - g_uart0.irqNum = IRQ_UART0; - /* USER CODE BEGIN uart0 system_init */ - /* USER CODE END uart0 system_init */ - g_uart0.baudRate = UART0_BAND_RATE; - g_uart0.dataLength = UART_DATALENGTH_8BIT; - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; /* FIFO enable. */ - g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart0); - /* USER CODE BEGIN uart0 system_init */ - /* USER CODE END uart0 system_init */ -} - -__weak void UART1WriteInterruptCallback(UART_Handle *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN UART1_WRITE_IT_FINISH */ - /* USER CODE END UART1_WRITE_IT_FINISH */ -} - -__weak void UART1ReadInterruptCallback(UART_Handle *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN UART1_READ_IT_FINISH */ - /* USER CODE END UART1_READ_IT_FINISH */ -} - -__weak void UART1InterruptErrorCallback(UART_Handle *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN UART1_TRNS_IT_ERROR */ - /* USER CODE END UART1_TRNS_IT_ERROR */ -} - -static void UART1_Init(void) -{ - HAL_CRG_IpEnableSet(UART1_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(UART1_BASE, CRG_PLL_NO_PREDV); - /* USER CODE BEGIN uart1 system_init */ - /* USER CODE END uart1 system_init */ - g_uart1.baseAddress = UART1; - g_uart1.irqNum = IRQ_UART1; - - g_uart1.baudRate = UART1_BAND_RATE; /* Baud rate setting. */ - g_uart1.dataLength = UART_DATALENGTH_8BIT; - g_uart1.stopBits = UART_STOPBITS_ONE; - g_uart1.parity = UART_PARITY_NONE; - g_uart1.txMode = UART_MODE_INTERRUPT; - g_uart1.rxMode = UART_MODE_INTERRUPT; - g_uart1.fifoMode = BASE_CFG_DISABLE; /* FIFO disable. */ - g_uart1.fifoTxThr = UART_FIFOFULL_ONE_TWO; - g_uart1.fifoRxThr = UART_FIFOFULL_ONE_TWO; - g_uart1.hwFlowCtr = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart1); - /* UART1 user callback register. */ - HAL_UART_RegisterCallBack(&g_uart1, UART_WRITE_IT_FINISH, UART1WriteInterruptCallback); - HAL_UART_RegisterCallBack(&g_uart1, UART_READ_IT_FINISH, UART1ReadInterruptCallback); - HAL_UART_RegisterCallBack(&g_uart1, UART_TRNS_IT_ERROR, UART1InterruptErrorCallback); - HAL_UART_IRQService(&g_uart1); /* Interrupt Enable */ - IRQ_SetPriority(g_uart1.irqNum, 1); - IRQ_EnableN(g_uart1.irqNum); -} - -__weak void UART2WriteInterruptCallback(UART_Handle *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN UART2_WRITE_IT_FINISH */ - /* USER CODE END UART2_WRITE_IT_FINISH */ -} - -__weak void UART2ReadInterruptCallback(UART_Handle *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN UART2_READ_IT_FINISH */ - /* USER CODE END UART2_READ_IT_FINISH */ -} - -__weak void UART2InterruptErrorCallback(UART_Handle *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN UART2_TRNS_IT_ERROR */ - /* USER CODE END UART2_TRNS_IT_ERROR */ -} - -static void UART2_Init(void) -{ - HAL_CRG_IpEnableSet(UART2_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(UART2_BASE, CRG_PLL_NO_PREDV); - /* USER CODE BEGIN uart2 system_init */ - /* USER CODE END uart3 system_init */ - g_uart2.baseAddress = UART2; - g_uart2.irqNum = IRQ_UART2; - - g_uart2.baudRate = UART2_BAND_RATE; - g_uart2.dataLength = UART_DATALENGTH_8BIT; - g_uart2.stopBits = UART_STOPBITS_ONE; - g_uart2.parity = UART_PARITY_NONE; - g_uart2.txMode = UART_MODE_INTERRUPT; - g_uart2.rxMode = UART_MODE_INTERRUPT; - g_uart2.fifoMode = BASE_CFG_DISABLE; /* FIFO disable. */ - g_uart2.fifoTxThr = UART_FIFOFULL_ONE_TWO; - g_uart2.fifoRxThr = UART_FIFOFULL_ONE_TWO; - g_uart2.hwFlowCtr = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart2); - /* UART2 user callback register */ - HAL_UART_RegisterCallBack(&g_uart2, UART_WRITE_IT_FINISH, UART2WriteInterruptCallback); - HAL_UART_RegisterCallBack(&g_uart2, UART_READ_IT_FINISH, UART2ReadInterruptCallback); - HAL_UART_RegisterCallBack(&g_uart2, UART_TRNS_IT_ERROR, UART2InterruptErrorCallback); - /* USER CODE BEGIN uart2 system_init */ - /* USER CODE END uart2 system_init */ - HAL_UART_IRQService(&g_uart2); - IRQ_SetPriority(g_uart2.irqNum, 1); - IRQ_EnableN(g_uart2.irqNum); -} - -void IOConfig(void) -{ - IOConfig_RegStruct *iconfig = IOCONFIG; /* Handle of ioconfig. */ - SYSCTRL0->SC_SYS_STAT.BIT.update_mode = 0; - SYSCTRL0->SC_SYS_STAT.BIT.update_mode_clear = 1; - - iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ - iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ - iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_15.BIT.func = 0x4; /* 0x4 is UART1_TXD */ - iconfig->iocmg_15.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_15.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_15.BIT.pu = BASE_CFG_ENABLE; /* Pull-up resistor of UART1_Tx. */ - iconfig->iocmg_15.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_15.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_14.BIT.func = 0x4; /* 0x4 is UART1_RXD */ - iconfig->iocmg_14.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_14.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_14.BIT.pu = BASE_CFG_ENABLE; /* Pull-up resistor of UART1_Rx. */ - iconfig->iocmg_14.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_14.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_51.BIT.func = 0x3; /* 0x3 is UART2_TXD */ - iconfig->iocmg_51.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_51.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_51.BIT.pu = BASE_CFG_ENABLE; /* Pull-up resistor of UART1_Tx. */ - iconfig->iocmg_51.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_51.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_52.BIT.func = 0x3; /* 0x3 is UART2_RXD */ - iconfig->iocmg_52.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_52.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_52.BIT.pu = BASE_CFG_ENABLE; /* Pull-up resistor of UART2_Rx. */ - iconfig->iocmg_52.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_52.BIT.se = BASE_CFG_DISABLE; -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - UART1_Init(); - UART2_Init(); - TIMER2_Init(); - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_single_wire_communication/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_single_wire_communication/readme.md deleted file mode 100644 index 52ac5060c..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_single_wire_communication/readme.md +++ /dev/null @@ -1,28 +0,0 @@ -# UART-单线通信 -## 关键字: UART, 单线通信 - -**【功能描述】** -+ UART单线通信,使用一根线连接UART1和UART2的TX和RX,UART通过不断的切换接收和发送功能,从而实现在单线上的数据接收和发送。 - -**【示例配置】** -+ TIMER定时器:TIMER用于监控UART发送是否完成,若发送完成,则可以进行数据的接收,UART切换为数据接收功能。默认0.5ms判断一次UART的发送状态,用户可在TIMER的配置界面中更改此配置周期。 - -+ 接线方式:此用例使用了UART1和UART2进行单线通信,其单线的连接方式如下: -```c - UART1_Tx---|_____|---UART2_Tx - UART1_Rx---| |---UART2_Rx -``` - -+ 发送数据和接收数据:发送数据和接收数据都是采用中断的模式,发送完成或接收完成之后,会调用发送完成中断和接收完成中断回调函数。 - -+ 状态机:由于UART采用单线通信,因此UART总线上同一时间只能存在一种状态,因此需要控制UART1和UART2的收发使能,此示例中采用状态机控制,使得总线上同一时刻只能处于下列一种状态:UART1发送UART2接收、空闲、UART2发送UART1接收。 - -+ 串口0(UART0)用于打印调试信息,串口2(UART2)和串口1(UART1)用于单线通信,用户可以查看串口0的调试信息,判断单线通信是否正常。 - -**【示例效果】** -+ 运行样例之后,查看串口0的信息,UART1和UART2会循环的发送和接收数据。 - -**【注意事项】** -+ 串口通信的波特率,校验位等配置需保持一致,可以通过UART配置界面进行更改。 - -+ 此sample适用于单线实现UART的通讯功能,此时UART为半双工工作模式。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_single_wire_communication/src/sample_uart_single_wire_communication.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_single_wire_communication/src/sample_uart_single_wire_communication.c deleted file mode 100644 index 79c8438d6..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_single_wire_communication/src/sample_uart_single_wire_communication.c +++ /dev/null @@ -1,354 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_uart_single_wire_communication.c - * @author MCU Driver Team - * @brief uart sample module. - * @details In single-line communication, one line is used to connect the TX and RX of the UART. - * The UART continuously switches the RX and RX functions to receive and transmit data on one data line. - * (1) This sample is applicable to the single-wire UART communication function. In this case, the UART works - * in half-duplex mode. - * (2) Serial port 0 (UART0) is used to print debugging information, aUART1 and UART2 are used for - * single-wire communication. The connection modes of UART1 and UART2 are as follows: - * UART1_Tx---|_____|---UART2_Tx - * UART1_Rx---| |---UART2_Rx - * (3) The TIMER is used to query the UART single-wire status in interrupt mode (or block mode). - */ -#include "sample_uart_single_wire_communication.h" - - -#define UART_SINGLE_WIRE_TX_COUNT 5 -#define UART_SINGLE_WIRE_RX_COUNT 5 -#define UART_SINGLE_DELAY_TIMER 1000 -#define UART2_ENABLE_TX 0x3 -#define UART1_ENABLE_TX 0x4 -#define UART_RESET_STATUS 0x1 - -static unsigned char g_singleWireTx[UART_SINGLE_WIRE_TX_COUNT] = "12345"; /* Single wire Tx data length is 5 */ -static unsigned char g_singleWireRx[UART_SINGLE_WIRE_RX_COUNT] = {0}; /* Single wire Rx data length is 5 */ - - -volatile bool g_uart2NotBusy = true; /* Flag of uart not busy. */ -volatile bool g_uart1NotBusy = true; -volatile unsigned int g_uartSingleWireStatus = UART_SINGLE_WIRE_READY; /* By default, the UART is ready. */ - -/** - * @brief Enables the UART Tx interrupt and transmit functions. - * @param handle UART handle. - * @retval None. - */ -void UART_EnableTx(UART_Handle *handle) -{ - UART_ASSERT_PARAM(handle != NULL); - UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); - /* Enable the TX and TX completion interrupts. */ - handle->baseAddress->UART_CR.BIT.uarten = BASE_CFG_DISABLE; - handle->baseAddress->UART_CR.BIT.txe = BASE_CFG_ENABLE; /* Enables UART transmit. */ - /* Clears the TX and RX FIFOs. */ - handle->baseAddress->UART_LCR_H.BIT.fen = BASE_CFG_DISABLE; - __asm__ volatile ("nop"); - handle->baseAddress->UART_LCR_H.BIT.fen = handle->fifoMode; - handle->baseAddress->UART_IMSC.BIT.txim = BASE_CFG_ENABLE; /* TX interrupt enable. */ - /* Make all configurations take effect. */ - handle->baseAddress->UART_CR.BIT.uarten = BASE_CFG_ENABLE; -} - -/** - * @brief Disable the UART Tx interrupt and transmit functions. - * @param handle UART handle. - * @retval None. - */ -void UART_DisableTx(UART_Handle *handle) -{ - UART_ASSERT_PARAM(handle != NULL); - UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); - /* Disable the TX and TX completion interrupts. */ - handle->baseAddress->UART_CR.BIT.uarten = BASE_CFG_DISABLE; - handle->baseAddress->UART_CR.BIT.txe = BASE_CFG_DISABLE; /* Disable UART transmit. */ - handle->baseAddress->UART_LCR_H.BIT.fen = BASE_CFG_DISABLE; /* Clears the FIFOs. */ - __asm__ volatile ("nop"); - handle->baseAddress->UART_LCR_H.BIT.fen = handle->fifoMode; /* Flesh the FIFOs */ - handle->baseAddress->UART_IMSC.BIT.txim = BASE_CFG_DISABLE; /* Mask TX interrupt enable. */ - handle->baseAddress->UART_CR.BIT.uarten = BASE_CFG_ENABLE; /* Enable UART. */ -} - -/** - * @brief Enable the UART Rx interrupt and transmit functions. - * @param handle UART handle. - * @retval None. - */ -void UART_EnableRx(UART_Handle *handle) -{ - UART_ASSERT_PARAM(handle != NULL); - UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); - /* Enable the RX and RX completion interrupts. */ - handle->baseAddress->UART_CR.BIT.uarten = BASE_CFG_DISABLE; - handle->baseAddress->UART_CR.BIT.rxe = BASE_CFG_ENABLE; /* Enables UART reception. */ - - handle->baseAddress->UART_LCR_H.BIT.fen = BASE_CFG_DISABLE; /* Flesh the FIFOs */ - __asm__ volatile ("nop"); - handle->baseAddress->UART_LCR_H.BIT.fen = handle->fifoMode; - handle->baseAddress->UART_IMSC.BIT.rxim = BASE_CFG_ENABLE; /* Mask RX interrupt enable. */ - - handle->baseAddress->UART_CR.BIT.uarten = BASE_CFG_ENABLE; /* The configuration takes effect. */ -} - -/** - * @brief Disable the UART Rx interrupt and transmit functions. - * @param handle UART handle. - * @retval None. - */ -void UART_DisableRx(UART_Handle *handle) -{ - UART_ASSERT_PARAM(handle != NULL); - UART_ASSERT_PARAM(IsUARTInstance(uartHandle->baseAddress)); - /* disable the RX and RX completion interrupts. */ - handle->baseAddress->UART_CR.BIT.uarten = BASE_CFG_DISABLE; - /* Disable UART reception. */ - handle->baseAddress->UART_CR.BIT.rxe = BASE_CFG_DISABLE; - /* Flesh the FIFOs */ - handle->baseAddress->UART_LCR_H.BIT.fen = BASE_CFG_DISABLE; - __asm__ volatile ("nop"); - handle->baseAddress->UART_LCR_H.BIT.fen = handle->fifoMode; - handle->baseAddress->UART_IMSC.BIT.rxim = BASE_CFG_DISABLE; /* Mask RX interrupt disable. */ - /* Enable UART */ - handle->baseAddress->UART_CR.BIT.uarten = BASE_CFG_ENABLE; -} - -/** - * @brief Enable the transmit pin of the UART2 and disable the transmit pin of the UART1. - * @param None - * @retval None. - */ -void UART2TxIOEnable(void) -{ - IOConfig_RegStruct *iconfig = IOCONFIG; - iconfig->iocmg_15.BIT.func = UART_RESET_STATUS; /* Disable the Tx of UART1. */ - iconfig->iocmg_51.BIT.func = UART2_ENABLE_TX; /* Enable the Tx of UART2. */ -} - -/** - * @brief Enable the transmit pin of the UART1 and disable the transmit pin of the UART2. - * @param None - * @retval None. - */ -void UART1TxIOEnable(void) -{ - IOConfig_RegStruct *iconfig = IOCONFIG; - iconfig->iocmg_15.BIT.func = UART1_ENABLE_TX; /* Enable the Tx of UART1. */ - iconfig->iocmg_51.BIT.func = UART_RESET_STATUS; /* Disable the Tx of UART2. */ -} - -/** - * @brief Clear string. - * @param str, String to be cleared. - * @retval None. - */ -static void ClearString(unsigned char *str) -{ - for (unsigned int i = 0; i < UART_SINGLE_WIRE_RX_COUNT; ++i) { - str[i] = 0; - } -} - -/** - * @brief Periodic callback function of TIMER2. - * @param handle TIMER handle - * @retval None. - */ -void TIMER2CallbackFunction(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* Queries the bus status of UART2. */ - if (g_uart2.baseAddress->UART_FR.BIT.busy == BASE_CFG_DISABLE) { - g_uart2NotBusy = true; - } else { - g_uart2NotBusy = false; /* UART2 busy */ - } - /* Queries the bus status of UART1. */ - if (g_uart1.baseAddress->UART_FR.BIT.busy == BASE_CFG_DISABLE) { - g_uart1NotBusy = true; - } else { - g_uart1NotBusy = false; /* UART1 busy */ - } -} - -/** - * @brief User-defined read completion interrupt callback function of UART2. - * @param handle UART handle. - * @retval None. - */ -void UART2ReadInterruptCallback(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("\r\nUART 2 Read Finish: %s\r\n", g_singleWireRx); - g_uartSingleWireStatus = UART_SINGLE_WIRE_RX_FIN; - return; -} - -/** - * @brief User-defined write completion interrupt callback function of UART2. - * @param handle UART handle. - * @retval None. - */ -void UART2WriteInterruptCallback(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("\r\nUART 2 Write Finish\r\n"); - g_uartSingleWireStatus = UART_SINGLE_WIRE_TX_FIN; - return; -} - -/** - * @brief User-defined write completion interrupt callback function of UART 1. - * @param handle UART handle. - * @retval None. - */ -void UART1WriteInterruptCallback(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("\r\nUART 1 Write Finish\r\n"); - /* USER CODE BEGIN UART1_WRITE_IT_FINISH */ - /* USER CODE END UART1_WRITE_IT_FINISH */ -} - -/** - * @brief User-defined read completion interrupt callback function of UART1. - * @param handle UART handle. - * @retval None. - */ -void UART1ReadInterruptCallback(void *handle) -{ - BASE_FUNC_UNUSED(handle); - DBG_PRINTF("\r\nUART 1 Read Finish: %s\r\n", g_singleWireRx); - /* USER CODE BEGIN UART1_READ_IT_FINISH */ - /* USER CODE END UART1_READ_IT_FINISH */ -} - -/** - * @brief Prompt message - * @param None. - * @retval None. - */ -static void SingleWirePromptMessage(void) -{ - /* Message Begin */ - DBG_PRINTF("UART Init finish, UART single wire commiuncation:\r\n"); - DBG_PRINTF("The sent data is 12345 and the received data length is 5. \r\n"); - DBG_PRINTF("By default, the message is sent before the message is received. \r\n"); - DBG_PRINTF("--- UART0 is used for printing and debugging. \r\n"); - DBG_PRINTF("UART1 and UART2 are used for single-wire communication."); - DBG_PRINTF("The connection modes of UART1 and UART2 are as follows:\r\n"); - DBG_PRINTF("\r\n UART1_Tx---|_____|---UART2_Tx \r\n"); - DBG_PRINTF("\r\n UART1_Rx---| |---UART2_Rx \r\n"); - DBG_PRINTF("You can view prompt information through serial port 0 and check whether single-wire communication"); - DBG_PRINTF("is normal. \r\n"); - /* Message End */ -} - -/** - * @brief UART1 TX, UART2 RX, pin configuration. - * @param uart1Handle UART Handle. - * @param uart2Handle UART Handle - * @retval None. - */ -void UART1TxToUART2Rx(UART_Handle *uart1Handle, UART_Handle *uart2Handle) -{ - UART_ASSERT_PARAM((uart1Handle != NULL) && (uart2Handle != NULL)); - UART_ASSERT_PARAM(IsUARTInstance(uart1Handle->baseAddress) && IsUARTInstance(uart2Handle->baseAddress)); - DBG_PRINTF("UART single wire communications: UART1 -> UART2 \r\n"); - UART1TxIOEnable(); /* Pin and Tx enable configuration. */ - UART_DisableRx(uart1Handle); /* UART1 Tx enable and UART2 Rx enable. */ - UART_EnableTx(uart1Handle); - UART_DisableTx(uart2Handle); - UART_EnableRx(uart2Handle); -} - -/** - * @brief UART2 TX, UART1 RX, pin configuration. - * @param uart1Handle UART Handle. - * @param uart2Handle UART Handle - * @retval None. - */ -void UART2TxToUART1Rx(UART_Handle *uart1Handle, UART_Handle *uart2Handle) -{ - UART_ASSERT_PARAM((uart1Handle != NULL) && (uart2Handle != NULL)); - UART_ASSERT_PARAM(IsUARTInstance(uart1Handle->baseAddress) && IsUARTInstance(uart2Handle->baseAddress)); - DBG_PRINTF("UART single wire communications: UART2 -> UART1 \r\n"); - UART2TxIOEnable(); /* Pin and Tx enable configuration. */ - UART_DisableRx(uart2Handle); /* UART2 Tx enable and UART1 Rx enable. */ - UART_EnableTx(uart2Handle); - UART_DisableTx(uart1Handle); - UART_EnableRx(uart1Handle); -} - -/** - * @brief UART Interrupt Tx and Rx simultaneously. - * @param None. - * @retval None. - */ -void UART_SingleWireCommunication(void) -{ - SystemInit(); - /* Prompt message. */ - SingleWirePromptMessage(); - while (1) { - /* By default, data is sent first and then received. */ - switch (g_uartSingleWireStatus) { - case UART_SINGLE_WIRE_READY: - /* Initially, it is sent by default. You can set whether to receive or send first. */ - UART2TxToUART1Rx(&g_uart1, &g_uart2); - ClearString(g_singleWireRx); - /* UART2 transmits data to UART1. */ - HAL_UART_WriteIT(&g_uart2, g_singleWireTx, UART_SINGLE_WIRE_TX_COUNT); - HAL_UART_ReadIT(&g_uart1, g_singleWireRx, UART_SINGLE_WIRE_RX_COUNT); - g_uartSingleWireStatus = UART_SINGLE_WIRE_BUSY; - break; - case UART_SINGLE_WIRE_TX_FIN: - /* UART1 transmits data to UART2. */ - /* You need to query the bus status before configuring the TX. */ - if (g_uart2NotBusy == BASE_CFG_ENABLE) { /* Check whether the UART2 bus is busy. */ - UART1TxToUART2Rx(&g_uart1, &g_uart2); /* Pin and Tx enable configuration. UART1 -> UART2 */ - HAL_UART_WriteIT(&g_uart1, g_singleWireTx, UART_SINGLE_WIRE_TX_COUNT); - } - /* UART2 RX data. */ - ClearString(g_singleWireRx); - HAL_UART_ReadIT(&g_uart2, g_singleWireRx, UART_SINGLE_WIRE_RX_COUNT); - g_uartSingleWireStatus = UART_SINGLE_WIRE_BUSY; - break; - case UART_SINGLE_WIRE_RX_FIN: - /* UART2 transmits data to UART1. */ - /* You need to query the bus status before configuring the TX. */ - if (g_uart1NotBusy == BASE_CFG_ENABLE) { /* Check whether the UART1 bus is busy. */ - UART2TxToUART1Rx(&g_uart1, &g_uart2); /* Pin and Tx enable configuration. UART2 -> UART1 */ - HAL_UART_WriteIT(&g_uart2, g_singleWireTx, UART_SINGLE_WIRE_TX_COUNT); - } - /* UART2 RX data. */ - ClearString(g_singleWireRx); - HAL_UART_ReadIT(&g_uart1, g_singleWireRx, UART_SINGLE_WIRE_RX_COUNT); - g_uartSingleWireStatus = UART_SINGLE_WIRE_BUSY; - break; - case UART_SINGLE_WIRE_BUSY: /* Bus busy, pause for a while. */ - __asm__ volatile ("nop"); - break; - default: - break; - } - BASE_FUNC_DELAY_MS(UART_SINGLE_DELAY_TIMER); /* Communication delay time (not mandatory). */ - } - return; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_refresh/inc/sample_iwdg_refresh.h b/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_refresh/inc/sample_iwdg_refresh.h deleted file mode 100644 index 09f66fab7..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_refresh/inc/sample_iwdg_refresh.h +++ /dev/null @@ -1,30 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_iwdg_refresh.h - * @author MCU Driver Team - * @brief IWDG module sample - * @details This file provides sample code for users to help - * register iwdg interrupt and feed iwdg. - */ - -#ifndef IWDG_REFRESH_SAMPLE_H -#define IWDG_REFRESH_SAMPLE_H - -BASE_StatusType IWDG_RefreshSample(void); - -#endif /* IWDG_REFRESH_SAMPLE_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_refresh/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_refresh/init/main.c deleted file mode 100644 index c51434366..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_refresh/init/main.c +++ /dev/null @@ -1,52 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ - -#include "typedefs.h" -#include "feature.h" -#include "sample_iwdg_refresh.h" -#include "main.h" -/* USER CODE BEGIN 0 */ -/* USER CODE */ -/* USER CODE END 0 */ -UART_Handle g_uart0; -IWDG_Handle g_iwdg; -/* USER CODE BEGIN 1 */ -/* USER CODE END 1 */ - -int main(void) -{ - /* USER CODE BEGIN 2 */ - /* USER CODE END 2 */ - IWDG_RefreshSample(); - /* USER CODE BEGIN 3 */ - /* USER CODE END 3 */ - while (1) { - /* USER CODE BEGIN 4 */ - /* USER CODE END 4 */ - } - /* USER CODE BEGIN 5 */ - /* USER CODE END 5 */ - return BASE_STATUS_OK; -} - -/* USER CODE BEGIN 6 */ -/* USER CODE END 6 */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_refresh/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_refresh/init/main.h deleted file mode 100644 index e063f5a7c..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_refresh/init/main.h +++ /dev/null @@ -1,59 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "uart_ex.h" -#include "crg.h" -#include "iwdg.h" -#include "iwdg_ex.h" -#include "iocmg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -#define XTAL_DRV_LEVEL4 0x03U -#define XTAL_DRV_LEVEL3 0x02U -#define XTAL_DRV_LEVEL2 0x01U -#define XTAL_DRV_LEVEL1 0x00U - -extern IWDG_Handle g_iwdg; -extern UART_Handle g_uart0; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -void IWDGCallbackFunction(void *handle); - -/* USER CODE BEGIN 0 */ -/* USER CODE */ -/* USER CODE END 0 */ - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_refresh/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_refresh/init/system_init.c deleted file mode 100644 index 8ab0bc96e..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_refresh/init/system_init.c +++ /dev/null @@ -1,112 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" -#include "iocmg_ip.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 48; /* PLL Multiplier 48 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_2; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; - crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; - crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; - crg.handleEx.clk1MDiv = (25 - 1); /* The 1 MHz freq is equal to the input clock frequency / (clk_1m_div + 1). 25 is - the div of the clk_1m in CLOCK. */ - - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - - g_uart0.baseAddress = UART0; /* uart0 baseaaddress */ - - g_uart0.baudRate = UART0_BAND_RATE; - g_uart0.dataLength = UART_DATALENGTH_8BIT; /* data length 8 */ - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; /* blocking mode */ - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; - g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; /* fifo size 8 */ - g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; - g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart0); -} - -__weak void IWDGCallbackFunction(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN IWDG Callback */ - /* USER CODE END IWDG Callback */ -} - -static void IWDG_Init(void) -{ - HAL_CRG_IpEnableSet(IWDG_BASE, IP_CLK_ENABLE); - g_iwdg.baseAddress = IWDG; - g_iwdg.timeValue = 1000; /* 1000 is time value */ - g_iwdg.timeType = IWDG_TIME_UNIT_MS; - g_iwdg.freqDivValue = IWDG_FREQ_DIV_128; - HAL_IWDG_Init(&g_iwdg); - HAL_IWDG_EnableWindowModeEx(&g_iwdg); - HAL_IWDG_SetWindowValueEx(&g_iwdg, 500, IWDG_TIME_UNIT_MS); /* 500 is window value */ -} - -static void IOConfig(void) -{ - HAL_IOCMG_SetPinAltFuncMode(GPIO0_3_AS_UART0_TXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO0_3_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO0_3_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO0_3_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO0_3_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - HAL_IOCMG_SetPinAltFuncMode(GPIO0_4_AS_UART0_RXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO0_4_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO0_4_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO0_4_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO0_4_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - IWDG_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_refresh/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_refresh/readme.md deleted file mode 100644 index 615c26644..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_refresh/readme.md +++ /dev/null @@ -1,18 +0,0 @@ -# 配置IWDG参数,验证看门狗复位功能,软件进行喂狗操作 -## 关键字: IWDG,中断, 喂狗 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、IWDG初始化和功能配置。设置喂狗时间和窗口值,计时值递减到窗口值后喂狗则不复位,否则在计数递减到窗口值前喂狗或计数到0没喂狗则产生复位操作。 - -**【示例配置】** -+ 在"SystemInit()”接口中配置IWDG的初始值、窗口值和窗口使能、分频系数等参数。 - -+ 调用"HAL_IWDG_Start()"启动看门狗。 - -+ 设置调用"HAL_IWDG_Refresh()"进行喂狗操作,如果调用喂狗操作则不复位,否则计数为0没喂狗则系统复位,程序重新执行。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成后。串口打印testlog,如果喂狗生效,则不产生复位。否则系统复位,程序重新运行,循环往复。 - -**【注意事项】** -+ 在计数递减到窗口值前喂狗或计数到0没喂狗,均会产生复位操作。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_refresh/src/sample_iwdg_refresh.c b/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_refresh/src/sample_iwdg_refresh.c deleted file mode 100644 index d32dd6135..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_refresh/src/sample_iwdg_refresh.c +++ /dev/null @@ -1,58 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_iwdg_refresh.c - * @author MCU Driver Team - * @brief IWDG module realize reset function sample - * @details The watchdog timeout reset function is used to set the time when the watchdog feeds the watchdog. - * When the window mode is enabled and the corresponding window value is set, - * an interrupt is generated when the count value is equal to the window value. - * When the watchdog is fed beyond the window value, a reset signal is generated. - * When the count value is 0 and the interrupt is not cleared, a reset signal is also generated. - * When the window mode is disabled, an interrupt is generated when the count value is reduced to half. - * The reset signal is generated only when the count value is 0 and the interrupt is not cleared. - */ - -/* Includes ------------------------------------------------------------------*/ -#include "baseinc.h" -#include "debug.h" -#include "iwdg.h" -#include "main.h" -#include "sample_iwdg_refresh.h" - -#define CYCLE_INTERVAL_TIME 600 - -/* prototype functions -------------------------------------------------------*/ -/** - * @brief IWDG refresh sample function - * @param None - * @return BASE_StatusType - */ -BASE_StatusType IWDG_RefreshSample(void) -{ - SystemInit(); - HAL_IWDG_Start(&g_iwdg); /* iwdg start */ - DBG_PRINTF("\r\n START : test iwdg sample \r\n"); - while (1) { - DBG_PRINTF("test iwdg sample \r\n"); - BASE_FUNC_DELAY_MS(CYCLE_INTERVAL_TIME); - /* User can Add HAL_IWDG_Refresh() API here, iwdg not reset because refresh period, \ - if not refresh, next time reset. */ - HAL_IWDG_Refresh(&g_iwdg); /* The dog feeding time is determined by the user. */ - } - return BASE_STATUS_OK; -} diff --git a/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_reset/inc/iwdg_reset_sample.h b/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_reset/inc/iwdg_reset_sample.h deleted file mode 100644 index 5e59e4bee..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_reset/inc/iwdg_reset_sample.h +++ /dev/null @@ -1,30 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file iwdg_reset_sample.h - * @author MCU Driver Team - * @brief WDG module sample - * @details This file provides sample code for users to help - * register iwdg interrupt and feed iwdg. - */ - -#ifndef IWDG_RESET_SAMPLE_H -#define IWDG_RESET_SAMPLE_H - -BASE_StatusType IWDG_ResetSample(void); - -#endif /* IWDG_RESET_SAMPLE_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_reset/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_reset/init/main.c deleted file mode 100644 index a4147b1a4..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_reset/init/main.c +++ /dev/null @@ -1,51 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ - -#include "typedefs.h" -#include "feature.h" -#include "iwdg_reset_sample.h" -#include "main.h" -/* USER CODE BEGIN 0 */ -/* USER CODE END 0 */ -WDG_Handle g_iwdg; -UART_Handle g_uart0; -/* USER CODE BEGIN 1 */ -/* USER CODE END 1 */ - -int main(void) -{ - /* USER CODE BEGIN 2 */ - /* USER CODE END 2 */ - IWDG_ResetSample(); - /* USER CODE BEGIN 3 */ - /* USER CODE END 3 */ - while (1) { - /* USER CODE BEGIN 4 */ - /* USER CODE END 4 */ - } - /* USER CODE BEGIN 5 */ - /* USER CODE END 5 */ - return BASE_STATUS_OK; -} - -/* USER CODE BEGIN 6 */ -/* USER CODE END 6 */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_reset/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_reset/init/main.h deleted file mode 100644 index ef63367b0..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_reset/init/main.h +++ /dev/null @@ -1,47 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "crg.h" -#include "wdg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -extern WDG_Handle g_iwdg; -extern UART_Handle g_uart0; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -void IwdgITCallBackFunc(void *handle); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_reset/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_reset/init/system_init.c deleted file mode 100644 index bdeb90b4d..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_reset/init/system_init.c +++ /dev/null @@ -1,118 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); - - g_uart0.baseAddress = UART0; - g_uart0.irqNum = IRQ_UART0; - - g_uart0.baudRate = UART0_BAND_RATE; - g_uart0.dataLength = UART_DATALENGTH_8BIT; - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; - g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart0); -} - -__weak void IwdgITCallBackFunc(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN IwdgITCallBackFunc */ - /* USER CODE END IwdgITCallBackFunc */ -} - -static void IWDG_Init(void) -{ - HAL_CRG_IpEnableSet(IWDG_BASE, IP_CLK_ENABLE); /* Enable the IWDG clock */ - HAL_CRG_IpClkSelectSet(IWDG_BASE, CRG_PLL_NO_PREDV); - - g_iwdg.baseAddress = IWDG; - g_iwdg.irqNum = IRQ_IWDG; - - g_iwdg.loadValue = 2000; /* 2000 is load value */ - g_iwdg.timeType = WDG_TIME_UNIT_MS; - g_iwdg.enableIT = BASE_CFG_DISABLE; - g_iwdg.enableRST = BASE_CFG_ENABLE; - HAL_WDG_Init(&g_iwdg); - - HAL_WDG_RegisterCallback(&g_iwdg, IwdgITCallBackFunc); /* Registering callback functions */ - HAL_WDG_IRQService(&g_iwdg); - IRQ_SetPriority(g_iwdg.irqNum, 1); - IRQ_EnableN(g_iwdg.irqNum); -} - -static void IOConfig(void) -{ - IOConfig_RegStruct *iconfig = IOCONFIG; - - iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ - iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ - iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; -} -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - IWDG_Init(); - - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_reset/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_reset/readme.md deleted file mode 100644 index 18d2e51eb..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_reset/readme.md +++ /dev/null @@ -1,18 +0,0 @@ -# 配置IWDG参数,验证看门狗复位功能,中断回调中进行喂狗操作 -## 关键字: IWDG,中断, 喂狗 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、中断和IWDG初始化和功能配置。设置喂狗时间,计时值递减到0后触发中断,中断中喂狗则不复位,否则第二次计数到0没喂狗则产生复位操作。 - -**【示例配置】** -+ 在"SystemInit()”接口中配置IWDG的初始值、中断和复位使能等参数。 - -+ 调用"HAL_WDG_Start()"启动看门狗。 - -+ 设置中断回调函数"IwdgITCallBackFunc()",在中断回调函数中调用"HAL_WDG_Refresh()"进行喂狗操作,如果调用喂狗操作则不复位,否则第二次计数为0则系统复位,程序重新执行。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成后。串口打印testlog,中断触发后打印中断log,如果在中断中调用喂狗操作,则不产生复位。否则第二次触发中断则系统复位,程序重新运行,循环往复。 - -**【注意事项】** -+ 若想不复位,可在第一次计数清零触发中断时喂狗,为喂狗窗口,该版IP实际超时复位时间为两倍计数值,第二次计数清零才复位。用户可在回调函数中清中断,清中断系统自动喂狗,导致复位功能失效,可降规作为timer使用。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_reset/src/iwdg_reset_sample.c b/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_reset/src/iwdg_reset_sample.c deleted file mode 100644 index 61f3b7a28..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_reset/src/iwdg_reset_sample.c +++ /dev/null @@ -1,78 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file iwdg_reset_sample.c - * @author MCU Driver Team - * @brief IWDG module realize reset function sample - * @details The watchdog timeout reset function is used to set the watchdog feeding time. When the timing \ - * value decreases to 0, an interrupt is triggered. The watchdog is not fed and the count value is \ - * overloaded. The reset operation is performed after the second count is cleared. If you do not \ - * want to reset, you can feed the watchdog when the first count is cleared to trigger an interrupt. \ - * The actual timeout reset time of the IP version is twice the count value. The reset is performed \ - * only after the second count is cleared. clear interrupt signal will auto load value, reset function \ - * invalid, not clear irq, second times will reset User can Add HAL_WDG_Refresh() API here, then, \ - * wdg can use as a timer because clear with reload. so reset function invalid. - */ - -/* Includes ------------------------------------------------------------------*/ -#include "baseinc.h" -#include "debug.h" -#include "iwdg.h" -#include "main.h" -#include "iwdg_reset_sample.h" - -#define DOG_FEED_INTRVAL_TIME 2000 -#define CYCLE_INTERVAL_TIME 1000 - -/* prototype functions -------------------------------------------------------*/ -void IwdgITCallBackFunc(void *param); - -/** - * @brief IWDG reset sample function - * @param None - * @return BASE_StatusType - */ -BASE_StatusType IWDG_ResetSample(void) -{ - SystemInit(); - HAL_IWDG_Start(&g_iwdg); - DBG_UartPrintInit(115200); /* 115200 : baud rate */ - DBG_PRINTF("\r\n START : test iwdg sample \r\n"); - while (1) { - DBG_PRINTF("test iwdg sample \r\n"); - BASE_FUNC_DELAY_MS(CYCLE_INTERVAL_TIME); - } - return BASE_STATUS_OK; -} - -/** - * @brief Handling IWDG interrupt callback - * @param handle IWDG handle for registers and initialnized values - * @return None - */ -void IwdgITCallBackFunc(void *param) -{ - IWDG_Handle *handle = (IWDG_Handle *)param; - IWDG_ASSERT_PARAM(handle != NULL); - /* clear interrupt signal will auto load value, reset function invalid, \ - not clear irq, second times will reset */ - /* User can Add HAL_IWDG_Refresh() API here, wdg not reset because refresh period, \ - if not refresh, next time reset */ - HAL_IWDG_Refresh(handle); - - DBG_PRINTF("IWDG Interrupt handle \r\n"); -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wdg_reset/inc/wdg_reset_sample.h b/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wdg_reset/inc/wdg_reset_sample.h deleted file mode 100644 index 6a41d36fb..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wdg_reset/inc/wdg_reset_sample.h +++ /dev/null @@ -1,30 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file wdg_reset_sample.h - * @author MCU Driver Team - * @brief WDG module sample - * @details This file provides sample code for users to help - * register wdg interrupt and feed wdg. - */ - -#ifndef WDG_RESET_SAMPLE_H -#define WDG_RESET_SAMPLE_H - -BASE_StatusType WDG_ResetSample(void); - -#endif /* WDG_RESET_SAMPLE_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wdg_reset/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wdg_reset/init/main.c deleted file mode 100644 index 8fa680482..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wdg_reset/init/main.c +++ /dev/null @@ -1,35 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ -#include "feature.h" -#include "main.h" -#include "wdg_reset_sample.h" - -WDG_Handle g_resetWdgHandler; -UART_Handle g_uart0; - -int main(void) -{ - WDG_ResetSample(); - while (1) { - } - return BASE_STATUS_OK; -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wdg_reset/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wdg_reset/init/main.h deleted file mode 100644 index c0bd46ff6..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wdg_reset/init/main.h +++ /dev/null @@ -1,48 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "wdg.h" -#include "crg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -extern WDG_Handle g_resetWdgHandler; - -extern UART_Handle g_uart0; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -void WDG_CallbackFunc(void *handle); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wdg_reset/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wdg_reset/init/system_init.c deleted file mode 100644 index da647597d..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wdg_reset/init/system_init.c +++ /dev/null @@ -1,116 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(UART0_BASE, CRG_PLL_NO_PREDV); - - g_uart0.baseAddress = UART0; - g_uart0.irqNum = IRQ_UART0; - g_uart0.baudRate = UART0_BAND_RATE; - g_uart0.dataLength = UART_DATALENGTH_8BIT; - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; - g_uart0.fifoTxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.fifoRxThr = UART_FIFOFULL_ONE_TWO; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart0); -} - -__weak void WDG_CallbackFunc(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN WDG_CallbackFunc */ - /* USER CODE END WDG_CallbackFunc */ -} - -static void WDG_Init(void) -{ - HAL_CRG_IpEnableSet(WDG_BASE, IP_CLK_ENABLE); - HAL_CRG_IpClkSelectSet(WDG_BASE, CRG_PLL_NO_PREDV); - - g_resetWdgHandler.baseAddress = WDG; - g_resetWdgHandler.irqNum = IRQ_WDG; - g_resetWdgHandler.loadValue = 2000; /* 2000: Interrupt Trigger Time */ - g_resetWdgHandler.timeType = WDG_TIME_UNIT_MS; - g_resetWdgHandler.enableIT = BASE_CFG_ENABLE; - g_resetWdgHandler.enableRST = BASE_CFG_ENABLE; - HAL_WDG_Init(&g_resetWdgHandler); - /* Register callback functions to be defined by users. */ - HAL_WDG_RegisterCallback(&g_resetWdgHandler, WDG_CallbackFunc); - HAL_WDG_IRQService(&g_resetWdgHandler); - IRQ_SetPriority(g_resetWdgHandler.irqNum, 1); /* set gpio1 interrupt priority to 1, 1~7 */ - IRQ_EnableN(g_resetWdgHandler.irqNum); -} - -static void IOConfig(void) -{ - IOConfig_RegStruct *iconfig = IOCONFIG; - - iconfig->iocmg_7.BIT.func = 0x4; /* 0x4 is UART0_RXD */ - iconfig->iocmg_7.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_7.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_7.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_7.BIT.se = BASE_CFG_DISABLE; - - iconfig->iocmg_6.BIT.func = 0x4; /* 0x4 is UART0_TXD */ - iconfig->iocmg_6.BIT.ds = IO_DRV_LEVEL2; - iconfig->iocmg_6.BIT.pd = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.pu = BASE_CFG_DISABLE; - iconfig->iocmg_6.BIT.sr = IO_SPEED_SLOW; - iconfig->iocmg_6.BIT.se = BASE_CFG_DISABLE; -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - WDG_Init(); - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wdg_reset/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wdg_reset/readme.md deleted file mode 100644 index e583c6c8e..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wdg_reset/readme.md +++ /dev/null @@ -1,18 +0,0 @@ -# 配置WDG参数,验证看门狗复位功能,中断回调中进行喂狗操作 -## 关键字: WDG,中断, 喂狗 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、中断和WDG初始化和功能配置。设置喂狗时间,计时值递减到0后触发中断,中断中喂狗则不复位,否则第二次计数到0没喂狗则产生复位操作。 - -**【示例配置】** -+ 在"SystemInit()”接口中配置WDG的初始值、中断和复位使能等参数。 - -+ 调用"HAL_WDG_Start()"启动看门狗。 - -+ 设置中断回调函数"WDG_CallbackFunc()",在中断回调函数中调用"HAL_WDG_Refresh()"进行喂狗操作,如果调用喂狗操作则不复位,否则第二次计数为0则系统复位,程序重新执行。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成后。串口打印testlog,中断触发后打印中断log,如果在中断中调用喂狗操作,则不产生复位。否则第二次触发中断则系统复位,程序重新运行,循环往复。 - -**【注意事项】** -+ 若想不复位,可在第一次计数清零触发中断时喂狗,为喂狗窗口,该版IP实际超时复位时间为两倍计数值,第二次计数清零才复位。用户可在回调函数中清中断,清中断系统自动喂狗,导致复位功能失效,可降规作为timer使用。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wdg_reset/src/wdg_reset_sample.c b/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wdg_reset/src/wdg_reset_sample.c deleted file mode 100644 index c097e4dd3..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wdg_reset/src/wdg_reset_sample.c +++ /dev/null @@ -1,77 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file wdg_reset_sample.c - * @author MCU Driver Team - * @brief WDG module realize reset function sample - * @details The watchdog timeout reset function is used to set the watchdog feeding time. When the timing \ - * value decreases to 0, an interrupt is triggered. The watchdog is not fed and the count value is \ - * overloaded. The reset operation is performed after the second count is cleared. If you do not \ - * want to reset, you can feed the watchdog when the first count is cleared to trigger an interrupt. \ - * The actual timeout reset time of the IP version is twice the count value. The reset is performed \ - * only after the second count is cleared. clear interrupt signal will auto load value, reset function \ - * invalid, not clear irq, second times will reset User can Add HAL_WDG_Refresh() API here, then, \ - * wdg can use as a timer because clear with reload. so reset function invalid. - */ - -/* Includes ------------------------------------------------------------------*/ -#include "debug.h" -#include "wdg.h" -#include "wdg_reset_sample.h" -#include "main.h" -#include "baseinc.h" - -#define DOG_FEED_INTRVAL_TIME 2000 -#define CYCLE_INTERVAL_TIME 1000 - -/* prototype functions -------------------------------------------------------*/ -void WDG_CallbackFunc(void *param); - -/** - * @brief WDG reset sample function - * @param None - * @return BASE_StatusType - */ -BASE_StatusType WDG_ResetSample(void) -{ - SystemInit(); - DBG_UartPrintInit(115200); /* 115200 : baud rate */ - DBG_PRINTF("\r\n START : test wdg sample \r\n"); - while (1) { - DBG_PRINTF("test wdg sample \r\n"); - BASE_FUNC_DELAY_MS(CYCLE_INTERVAL_TIME); - } - return BASE_STATUS_OK; -} - -/** - * @brief Handling WDG interrupt callback - * @param handle WDG handle for registers and initialnized values - * @return None - */ -void WDG_CallbackFunc(void *param) -{ - WDG_Handle *handle = (WDG_Handle *)param; - WDG_ASSERT_PARAM(handle != NULL); - /* clear interrupt signal will auto load value, reset function invalid, \ - not clear irq, second times will reset */ - /* User can Add HAL_WDG_Refresh() API here, wdg not reset because refresh period, \ - if not refresh, next time reset */ - HAL_WDG_Refresh(handle); - - DBG_PRINTF("WDG Interrupt handle \r\n"); -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wwdg_refresh/inc/sample_wwdg_refresh.h b/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wwdg_refresh/inc/sample_wwdg_refresh.h deleted file mode 100644 index 7f19f96c5..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wwdg_refresh/inc/sample_wwdg_refresh.h +++ /dev/null @@ -1,30 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_wwdg_refresh.h - * @author MCU Driver Team - * @brief WWDG module sample - * @details This file provides sample code for users to help - * register wwdg interrupt and feed wwdg. - */ - -#ifndef WWDG_REFRESH_SAMPLE_H -#define WWDG_REFRESH_SAMPLE_H - -BASE_StatusType WWDG_RefreshSample(void); - -#endif /* WWDG_REFRESH_SAMPLE_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wwdg_refresh/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wwdg_refresh/init/main.c deleted file mode 100644 index 432f16cf5..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wwdg_refresh/init/main.c +++ /dev/null @@ -1,50 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.c - * @author MCU Driver Team - * @brief Main program body. - */ - -#include "typedefs.h" -#include "feature.h" -#include "main.h" -/* USER CODE BEGIN 0 */ -/* USER CODE END 0 */ -UART_Handle g_uart0; -WWDG_Handle g_wwdg; -/* USER CODE BEGIN 1 */ -/* USER CODE END 1 */ - -int main(void) -{ - /* USER CODE BEGIN 2 */ - /* USER CODE END 2 */ - WWDG_RefreshSample(); - /* USER CODE BEGIN 3 */ - /* USER CODE END 3 */ - while (1) { - /* USER CODE BEGIN 4 */ - /* USER CODE END 4 */ - } - /* USER CODE BEGIN 5 */ - /* USER CODE END 5 */ - return BASE_STATUS_OK; -} - -/* USER CODE BEGIN 6 */ -/* USER CODE END 6 */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wwdg_refresh/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wwdg_refresh/init/main.h deleted file mode 100644 index 56ff9600a..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wwdg_refresh/init/main.h +++ /dev/null @@ -1,52 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file main.h - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -/* Define to prevent recursive inclusion ------------------------------------- */ -#ifndef McuMagicTag_SYSTEM_INIT_H -#define McuMagicTag_SYSTEM_INIT_H - -#include "uart.h" -#include "crg.h" -#include "wwdg.h" - -#define IO_SPEED_FAST 0x00U -#define IO_SPEED_SLOW 0x01U - -#define IO_DRV_LEVEL4 0x00U -#define IO_DRV_LEVEL3 0x01U -#define IO_DRV_LEVEL2 0x02U -#define IO_DRV_LEVEL1 0x03U - -#define XTAL_DRV_LEVEL4 0x03U -#define XTAL_DRV_LEVEL3 0x02U -#define XTAL_DRV_LEVEL2 0x01U -#define XTAL_DRV_LEVEL1 0x00U - -extern WWDG_Handle g_wwdg; -extern UART_Handle g_uart0; - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect); -void SystemInit(void); - -void WWDGCallbackFunction(void *handle); - -#endif /* McuMagicTag_SYSTEM_INIT_H */ \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wwdg_refresh/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wwdg_refresh/init/system_init.c deleted file mode 100644 index a692bc4c8..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wwdg_refresh/init/system_init.c +++ /dev/null @@ -1,119 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file system_init.c - * @author MCU Driver Team - * @brief This file contains driver init functions. - */ - -#include "main.h" -#include "ioconfig.h" -#include "iocmg_ip.h" - -#define UART0_BAND_RATE 115200 - -BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) -{ - CRG_Handle crg; - crg.baseAddress = CRG; /* crg baseaddress */ - crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; - crg.pllPreDiv = CRG_PLL_PREDIV_4; - crg.pllFbDiv = 32; /* PLL Multiplier 32 */ - crg.pllPostDiv = CRG_PLL_POSTDIV_1; - crg.coreClkSelect = CRG_CORE_CLK_SELECT_HOSC; - crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; - crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_1; - - if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { /* CRG init */ - return BASE_STATUS_ERROR; - } - *coreClkSelect = crg.coreClkSelect; - return BASE_STATUS_OK; -} - -static void UART0_Init(void) -{ - HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); - - g_uart0.baseAddress = UART0; /* uart0 baseaaddress */ - - g_uart0.baudRate = UART0_BAND_RATE; - g_uart0.dataLength = UART_DATALENGTH_8BIT; /* data length 8 */ - g_uart0.stopBits = UART_STOPBITS_ONE; - g_uart0.parity = UART_PARITY_NONE; - g_uart0.txMode = UART_MODE_BLOCKING; /* blocking mode */ - g_uart0.rxMode = UART_MODE_BLOCKING; - g_uart0.fifoMode = BASE_CFG_ENABLE; - g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; /* fifo size 8 */ - g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; - g_uart0.hwFlowCtr = BASE_CFG_DISABLE; - g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; - g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; - HAL_UART_Init(&g_uart0); -} - -__weak void WWDGCallbackFunction(void *handle) -{ - BASE_FUNC_UNUSED(handle); - /* USER CODE BEGIN WWDGCallbackFunction */ - /* USER CODE END WWDGCallbackFunction */ -} - -static void WWDG_Init(void) -{ - HAL_CRG_IpEnableSet(WWDG_BASE, IP_CLK_ENABLE); - - g_wwdg.baseAddress = WWDG; - - g_wwdg.timeValue = 2000; /* wwdg time value 2000 */ - g_wwdg.timeType = WWDG_TIME_UNIT_MS; - g_wwdg.enableIT = BASE_CFG_ENABLE; - g_wwdg.freqDivValue = WWDG_FREQ_DIV_1024; - g_wwdg.windowValue = 100; /* wwdg window value 100 */ - HAL_WWDG_EnableWindowModeEx(&g_wwdg); - HAL_WWDG_Init(&g_wwdg); - - /* wwdg interrput setting */ - HAL_WWDG_RegisterCallback(&g_wwdg, WWDGCallbackFunction); - IRQ_Register(IRQ_WWDG, HAL_WWDG_IrqHandler, &g_wwdg); - IRQ_SetPriority(IRQ_WWDG, 1); - IRQ_EnableN(IRQ_WWDG); -} - -static void IOConfig(void) -{ - HAL_IOCMG_SetPinAltFuncMode(GPIO2_2_AS_UART0_TXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_2_AS_UART0_TXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_2_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_2_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_2_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ - - HAL_IOCMG_SetPinAltFuncMode(GPIO2_3_AS_UART0_RXD); /* Check function selection */ - HAL_IOCMG_SetPinPullMode(GPIO2_3_AS_UART0_RXD, PULL_NONE); /* Pull-up and pull-down */ - HAL_IOCMG_SetPinSchmidtMode(GPIO2_3_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ - HAL_IOCMG_SetPinLevelShiftRate(GPIO2_3_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ - HAL_IOCMG_SetPinDriveRate(GPIO2_3_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ -} - -void SystemInit(void) -{ - IOConfig(); - UART0_Init(); - WWDG_Init(); - /* USER CODE BEGIN system_init */ - /* USER CODE END system_init */ -} \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wwdg_refresh/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wwdg_refresh/readme.md deleted file mode 100644 index 3a3e7364d..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wwdg_refresh/readme.md +++ /dev/null @@ -1,18 +0,0 @@ -# 配置WWDG参数,验证看门狗复位功能,中断回调中进行喂狗操作 -## 关键字: WWDG,中断, 喂狗 - -**【功能描述】** -+ 示例代码基于HAL接口完成时钟、中断和WWDG初始化和功能配置。设置喂狗时间和窗口值,计时值递减到窗口值后触发中断,中断中喂狗则不复位,否则计数到0没喂狗则产生复位操作。 - -**【示例配置】** -+ 在"SystemInit()”接口中配置WWDG的初始值、窗口值和窗口使能、分频系数、中断等参数。 - -+ 调用"HAL_WWDG_Start()"启动看门狗。 - -+ 设置中断回调函数"WWDGCallbackFunction()",在中断回调函数中调用"HAL_WWDG_Refresh()"进行喂狗操作,如果调用喂狗操作则不复位,否则计数为0没喂狗则系统复位,程序重新执行。 - -**【示例效果】** -+ 当用户烧录编译后的示例代码后,初始化和配置完成后。串口打印testlog,中断触发后打印中断log,如果在中断中调用喂狗操作,则不产生复位。否则系统复位,程序重新运行,循环往复。 - -**【注意事项】** -+ 若想不复位,可在第一次计数到窗口值触发中断时喂狗,为喂狗窗口。用户可在回调函数中清中断,清中断系统自动喂狗,导致复位功能失效,可降规作为timer使用。 \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wwdg_refresh/src/sample_wwdg_refresh.c b/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wwdg_refresh/src/sample_wwdg_refresh.c deleted file mode 100644 index 9e0f2b629..000000000 --- a/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wwdg_refresh/src/sample_wwdg_refresh.c +++ /dev/null @@ -1,76 +0,0 @@ -/** - * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. - * @file sample_wwdg_refresh.c - * @author MCU Driver Team - * @brief WWDG module realize refresh function sample - * @details The watchdog timeout reset function is used to set the time when the watchdog feeds the watchdog. - * When the window mode is enabled and the corresponding window value is set, - * an interrupt is generated when the count value is equal to the window value. - * When the watchdog is fed beyond the window value, a reset signal is generated. - * When the count value is 0 and the interrupt is not cleared, a reset signal is also generated. - * When the window mode is disabled, an interrupt is generated when the count value is reduced to half. - * The reset signal is generated only when the count value is 0 and the interrupt is not cleared. - */ - -/* Includes ------------------------------------------------------------------*/ -#include "debug.h" -#include "wwdg.h" -#include "main.h" -#include "baseinc.h" -#include "sample_wwdg_refresh.h" - -#define DOG_FEED_INTRVAL_TIME 2000 -#define CYCLE_INTERVAL_TIME 1000 - -/* prototype functions -------------------------------------------------------*/ -void WWDGCallbackFunction(void *param); - -/** - * @brief WWDG reset sample function - * @param None - * @return BASE_StatusType - */ -BASE_StatusType WWDG_RefreshSample(void) -{ - SystemInit(); - HAL_WWDG_Start(&g_wwdg); /* Turn on the watchdog timing */ - DBG_PRINTF("\r\n START : test wwdg sample \r\n"); - while (1) { - DBG_PRINTF("test wwdg sample \r\n"); - BASE_FUNC_DELAY_MS(CYCLE_INTERVAL_TIME); - } - return BASE_STATUS_OK; -} - -/** - * @brief Handling WWDG interrupt callback - * @param handle WWDG handle for registers and initialnized values - * @return None - */ -void WWDGCallbackFunction(void *param) -{ - WWDG_Handle *handle = (WWDG_Handle *)param; - WWDG_ASSERT_PARAM(handle != NULL); - /* clear interrupt signal will auto load value, reset function invalid, \ - not clear irq, second times will reset */ - /* User can Add HAL_WWDG_Refresh() API here, wwdg not reset because refresh period, \ - if not refresh, next time reset */ - HAL_WWDG_Refresh(handle); - - DBG_PRINTF("WWDG Interrupt handle \r\n"); -} \ No newline at end of file diff --git "a/vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726194739756.jpg" "b/vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726194739756.jpg" deleted file mode 100644 index 87c9fbfdea4dc6247aeb31b6a98b34c87fa4529c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5782 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 diff --git "a/vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726194794028.jpg" "b/vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726194794028.jpg" deleted file mode 100644 index 49a62d44b2f9a1fe31f5e2a58b719b7f515e9615..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62232 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 diff --git "a/vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726194869607.jpg" "b/vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726194869607.jpg" deleted file mode 100644 index c978f4388baf02d13b40ab41b536751acf75ac03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166495 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
    icY4>&=#fIdZs`H>Ixz(c9V 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%0A1er9x#@&j3D?3k76;v7*b|!CvjM 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%0D*lB4yOw4>P0RGToZocCX`?TXTn0Lpgx;qE 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 Q2XqDO58TJw`-k`b1zcgcy8r+H diff --git "a/vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726194962547.jpg" "b/vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726194962547.jpg" deleted file mode 100644 index 9468da025f2bccc563aa4faf201c2aceefe0af51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7234 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 J?=K&n{5O4($y)#b diff --git "a/vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726195007716.jpg" "b/vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726195007716.jpg" deleted file mode 100644 index 800d00c0999bcc27b0becd6a908faecdb8536392..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5702 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 aLNvIk9=9G#JrBU2Js&3Q;_v+A^M3%=K>tSo diff --git "a/vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726195033006.jpg" "b/vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726195033006.jpg" deleted file mode 100644 index af33c5de91e2d83e733a2c4f81247a692b441802..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2418 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 Yd-tE8bJJ!iD9#x?UHx3vIVCg!0BL;V>Hq)$ diff --git "a/vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726195185553.jpg" "b/vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726195185553.jpg" deleted file mode 100644 index d5e854c9146b31d5214ba175f4803576c49474b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 538 zcmV+#0_FXQP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0k26!K~zXf?Uhff z0Z|x-eI~aVWrgx5N-+zOQp#3M%3>B$cEpDurQ{1JDJztcNTX!M*ZAo@HFC#0ccwe{ zvYEwGr}>>T&pGdzbH?ZQf8i7OBuT<2@WgM!6Tb~lY)K#xKrWXufg5W`rv-NlDIS zuEkub>Bz)lF(K}BI*7;PFUN=`OJkp(J@YGZu~@`*yG6g>7tn`PC=|Z+p)sz+R;6w< z8sgHpUaz8U&i|#<2DMrZs;aV?>rzLfQRupEd23m5JRT7ahuMs<6%&ia0_}F2&CJjQ zTdkHj%Uo{YNKC7y`+Bq4JT3?;=(-$_$4Dd+?7Ivci3wT>eJtkRp_ybd$&NSUSp3&` c;x{4T4sjkeL0y^dS^xk507*qoM6N<$g5@{#oB#j- diff --git "a/vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726194945180.jpg" b/vendor/yibaina_3061M/demo/pic/1726194945180-1726210955941-2.jpg similarity index 100% rename from "vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726194945180.jpg" rename to vendor/yibaina_3061M/demo/pic/1726194945180-1726210955941-2.jpg diff --git "a/vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726195055385.jpg" b/vendor/yibaina_3061M/demo/pic/1726195055385.jpg similarity index 100% rename from "vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726195055385.jpg" rename to vendor/yibaina_3061M/demo/pic/1726195055385.jpg diff --git a/vendor/yibaina_3061M/demo/drivers_sample/acmp/sample_acmp_interrupt/inc/sample_acmp_interrupt.h b/vendor/yibaina_3061M/demo/sample_acmp_interrupt/inc/sample_acmp_interrupt.h similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/acmp/sample_acmp_interrupt/inc/sample_acmp_interrupt.h rename to vendor/yibaina_3061M/demo/sample_acmp_interrupt/inc/sample_acmp_interrupt.h diff --git a/vendor/yibaina_3061M/demo/drivers_sample/acmp/sample_acmp_interrupt/init/main.c b/vendor/yibaina_3061M/demo/sample_acmp_interrupt/init/main.c similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/acmp/sample_acmp_interrupt/init/main.c rename to vendor/yibaina_3061M/demo/sample_acmp_interrupt/init/main.c diff --git a/vendor/yibaina_3061M/demo/drivers_sample/acmp/sample_acmp_interrupt/init/main.h b/vendor/yibaina_3061M/demo/sample_acmp_interrupt/init/main.h similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/acmp/sample_acmp_interrupt/init/main.h rename to vendor/yibaina_3061M/demo/sample_acmp_interrupt/init/main.h diff --git a/vendor/yibaina_3061M/demo/drivers_sample/acmp/sample_acmp_interrupt/init/system_init.c b/vendor/yibaina_3061M/demo/sample_acmp_interrupt/init/system_init.c similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/acmp/sample_acmp_interrupt/init/system_init.c rename to vendor/yibaina_3061M/demo/sample_acmp_interrupt/init/system_init.c diff --git a/vendor/yibaina_3061M/demo/drivers_sample/acmp/sample_acmp_interrupt/readme.md b/vendor/yibaina_3061M/demo/sample_acmp_interrupt/readme.md similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/acmp/sample_acmp_interrupt/readme.md rename to vendor/yibaina_3061M/demo/sample_acmp_interrupt/readme.md diff --git a/vendor/yibaina_3061M/demo/drivers_sample/acmp/sample_acmp_interrupt/src/sample_acmp_interrupt.c b/vendor/yibaina_3061M/demo/sample_acmp_interrupt/src/sample_acmp_interrupt.c similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/acmp/sample_acmp_interrupt/src/sample_acmp_interrupt.c rename to vendor/yibaina_3061M/demo/sample_acmp_interrupt/src/sample_acmp_interrupt.c diff --git a/vendor/yibaina_3061M/demo/drivers_sample/acmp/sample_acmp_out_result/inc/sample_acmp_out_result.h b/vendor/yibaina_3061M/demo/sample_acmp_out_result/inc/sample_acmp_out_result.h similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/acmp/sample_acmp_out_result/inc/sample_acmp_out_result.h rename to vendor/yibaina_3061M/demo/sample_acmp_out_result/inc/sample_acmp_out_result.h diff --git a/vendor/yibaina_3061M/demo/drivers_sample/acmp/sample_acmp_out_result/init/main.c b/vendor/yibaina_3061M/demo/sample_acmp_out_result/init/main.c similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/acmp/sample_acmp_out_result/init/main.c rename to vendor/yibaina_3061M/demo/sample_acmp_out_result/init/main.c diff --git a/vendor/yibaina_3061M/demo/drivers_sample/acmp/sample_acmp_out_result/init/main.h b/vendor/yibaina_3061M/demo/sample_acmp_out_result/init/main.h similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/acmp/sample_acmp_out_result/init/main.h rename to vendor/yibaina_3061M/demo/sample_acmp_out_result/init/main.h diff --git a/vendor/yibaina_3061M/demo/drivers_sample/acmp/sample_acmp_out_result/init/system_init.c b/vendor/yibaina_3061M/demo/sample_acmp_out_result/init/system_init.c similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/acmp/sample_acmp_out_result/init/system_init.c rename to vendor/yibaina_3061M/demo/sample_acmp_out_result/init/system_init.c diff --git a/vendor/yibaina_3061M/demo/drivers_sample/acmp/sample_acmp_out_result/readme.md b/vendor/yibaina_3061M/demo/sample_acmp_out_result/readme.md similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/acmp/sample_acmp_out_result/readme.md rename to vendor/yibaina_3061M/demo/sample_acmp_out_result/readme.md diff --git a/vendor/yibaina_3061M/demo/drivers_sample/acmp/sample_acmp_out_result/src/sample_acmp_out_result.c b/vendor/yibaina_3061M/demo/sample_acmp_out_result/src/sample_acmp_out_result.c similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/acmp/sample_acmp_out_result/src/sample_acmp_out_result.c rename to vendor/yibaina_3061M/demo/sample_acmp_out_result/src/sample_acmp_out_result.c diff --git a/vendor/yibaina_3061M/demo/drivers_sample/apt/sample_apt_single_resistor/inc/sample_apt_single_resistor.h b/vendor/yibaina_3061M/demo/sample_apt_single_resistor/inc/sample_apt_single_resistor.h similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/apt/sample_apt_single_resistor/inc/sample_apt_single_resistor.h rename to vendor/yibaina_3061M/demo/sample_apt_single_resistor/inc/sample_apt_single_resistor.h diff --git a/vendor/yibaina_3061M/demo/drivers_sample/apt/sample_apt_single_resistor/init/main.c b/vendor/yibaina_3061M/demo/sample_apt_single_resistor/init/main.c similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/apt/sample_apt_single_resistor/init/main.c rename to vendor/yibaina_3061M/demo/sample_apt_single_resistor/init/main.c diff --git a/vendor/yibaina_3061M/demo/drivers_sample/apt/sample_apt_single_resistor/init/main.h b/vendor/yibaina_3061M/demo/sample_apt_single_resistor/init/main.h similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/apt/sample_apt_single_resistor/init/main.h rename to vendor/yibaina_3061M/demo/sample_apt_single_resistor/init/main.h diff --git a/vendor/yibaina_3061M/demo/drivers_sample/apt/sample_apt_single_resistor/init/system_init.c b/vendor/yibaina_3061M/demo/sample_apt_single_resistor/init/system_init.c similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/apt/sample_apt_single_resistor/init/system_init.c rename to vendor/yibaina_3061M/demo/sample_apt_single_resistor/init/system_init.c diff --git a/vendor/yibaina_3061M/demo/drivers_sample/apt/sample_apt_single_resistor/readme.md b/vendor/yibaina_3061M/demo/sample_apt_single_resistor/readme.md similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/apt/sample_apt_single_resistor/readme.md rename to vendor/yibaina_3061M/demo/sample_apt_single_resistor/readme.md diff --git a/vendor/yibaina_3061M/demo/drivers_sample/apt/sample_apt_single_resistor/src/sample_apt_single_resistor.c b/vendor/yibaina_3061M/demo/sample_apt_single_resistor/src/sample_apt_single_resistor.c similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/apt/sample_apt_single_resistor/src/sample_apt_single_resistor.c rename to vendor/yibaina_3061M/demo/sample_apt_single_resistor/src/sample_apt_single_resistor.c diff --git a/vendor/yibaina_3061M/demo/drivers_sample/can/sample_can_send_receive/inc/sample_can_send_receive.h b/vendor/yibaina_3061M/demo/sample_can_send_receive/inc/sample_can_send_receive.h similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/can/sample_can_send_receive/inc/sample_can_send_receive.h rename to vendor/yibaina_3061M/demo/sample_can_send_receive/inc/sample_can_send_receive.h diff --git a/vendor/yibaina_3061M/demo/drivers_sample/can/sample_can_send_receive/init/main.c b/vendor/yibaina_3061M/demo/sample_can_send_receive/init/main.c similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/can/sample_can_send_receive/init/main.c rename to vendor/yibaina_3061M/demo/sample_can_send_receive/init/main.c diff --git a/vendor/yibaina_3061M/demo/drivers_sample/can/sample_can_send_receive/init/main.h b/vendor/yibaina_3061M/demo/sample_can_send_receive/init/main.h similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/can/sample_can_send_receive/init/main.h rename to vendor/yibaina_3061M/demo/sample_can_send_receive/init/main.h diff --git a/vendor/yibaina_3061M/demo/drivers_sample/can/sample_can_send_receive/init/system_init.c b/vendor/yibaina_3061M/demo/sample_can_send_receive/init/system_init.c similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/can/sample_can_send_receive/init/system_init.c rename to vendor/yibaina_3061M/demo/sample_can_send_receive/init/system_init.c diff --git a/vendor/yibaina_3061M/demo/drivers_sample/can/sample_can_send_receive/readme.md b/vendor/yibaina_3061M/demo/sample_can_send_receive/readme.md similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/can/sample_can_send_receive/readme.md rename to vendor/yibaina_3061M/demo/sample_can_send_receive/readme.md diff --git a/vendor/yibaina_3061M/demo/drivers_sample/can/sample_can_send_receive/src/sample_can_send_receive.c b/vendor/yibaina_3061M/demo/sample_can_send_receive/src/sample_can_send_receive.c similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/can/sample_can_send_receive/src/sample_can_send_receive.c rename to vendor/yibaina_3061M/demo/sample_can_send_receive/src/sample_can_send_receive.c diff --git a/vendor/yibaina_3061M/demo/drivers_sample/cfd/sample_cfd_check_error/inc/cfd_check_error_sample.h b/vendor/yibaina_3061M/demo/sample_cfd_check_error/inc/cfd_check_error_sample.h similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/cfd/sample_cfd_check_error/inc/cfd_check_error_sample.h rename to vendor/yibaina_3061M/demo/sample_cfd_check_error/inc/cfd_check_error_sample.h diff --git a/vendor/yibaina_3061M/demo/drivers_sample/cfd/sample_cfd_check_error/init/main.c b/vendor/yibaina_3061M/demo/sample_cfd_check_error/init/main.c similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/cfd/sample_cfd_check_error/init/main.c rename to vendor/yibaina_3061M/demo/sample_cfd_check_error/init/main.c diff --git a/vendor/yibaina_3061M/demo/drivers_sample/cfd/sample_cfd_check_error/init/main.h b/vendor/yibaina_3061M/demo/sample_cfd_check_error/init/main.h similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/cfd/sample_cfd_check_error/init/main.h rename to vendor/yibaina_3061M/demo/sample_cfd_check_error/init/main.h diff --git a/vendor/yibaina_3061M/demo/drivers_sample/cfd/sample_cfd_check_error/init/system_init.c b/vendor/yibaina_3061M/demo/sample_cfd_check_error/init/system_init.c similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/cfd/sample_cfd_check_error/init/system_init.c rename to vendor/yibaina_3061M/demo/sample_cfd_check_error/init/system_init.c diff --git a/vendor/yibaina_3061M/demo/drivers_sample/cfd/sample_cfd_check_error/readme.md b/vendor/yibaina_3061M/demo/sample_cfd_check_error/readme.md similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/cfd/sample_cfd_check_error/readme.md rename to vendor/yibaina_3061M/demo/sample_cfd_check_error/readme.md diff --git a/vendor/yibaina_3061M/demo/drivers_sample/cfd/sample_cfd_check_error/src/cfd_check_error_sample.c b/vendor/yibaina_3061M/demo/sample_cfd_check_error/src/cfd_check_error_sample.c similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/cfd/sample_cfd_check_error/src/cfd_check_error_sample.c rename to vendor/yibaina_3061M/demo/sample_cfd_check_error/src/cfd_check_error_sample.c diff --git a/vendor/yibaina_3061M/demo/drivers_sample/cmm/sample_cmm_check_error/inc/cmm_check_error_sample.h b/vendor/yibaina_3061M/demo/sample_cmm_check_error/inc/cmm_check_error_sample.h similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/cmm/sample_cmm_check_error/inc/cmm_check_error_sample.h rename to vendor/yibaina_3061M/demo/sample_cmm_check_error/inc/cmm_check_error_sample.h diff --git a/vendor/yibaina_3061M/demo/drivers_sample/cmm/sample_cmm_check_error/init/main.c b/vendor/yibaina_3061M/demo/sample_cmm_check_error/init/main.c similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/cmm/sample_cmm_check_error/init/main.c rename to vendor/yibaina_3061M/demo/sample_cmm_check_error/init/main.c diff --git a/vendor/yibaina_3061M/demo/drivers_sample/cmm/sample_cmm_check_error/init/main.h b/vendor/yibaina_3061M/demo/sample_cmm_check_error/init/main.h similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/cmm/sample_cmm_check_error/init/main.h rename to vendor/yibaina_3061M/demo/sample_cmm_check_error/init/main.h diff --git a/vendor/yibaina_3061M/demo/drivers_sample/cmm/sample_cmm_check_error/init/system_init.c b/vendor/yibaina_3061M/demo/sample_cmm_check_error/init/system_init.c similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/cmm/sample_cmm_check_error/init/system_init.c rename to vendor/yibaina_3061M/demo/sample_cmm_check_error/init/system_init.c diff --git a/vendor/yibaina_3061M/demo/drivers_sample/cmm/sample_cmm_check_error/readme.md b/vendor/yibaina_3061M/demo/sample_cmm_check_error/readme.md similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/cmm/sample_cmm_check_error/readme.md rename to vendor/yibaina_3061M/demo/sample_cmm_check_error/readme.md diff --git a/vendor/yibaina_3061M/demo/drivers_sample/cmm/sample_cmm_check_error/src/cmm_check_error_sample.c b/vendor/yibaina_3061M/demo/sample_cmm_check_error/src/cmm_check_error_sample.c similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/cmm/sample_cmm_check_error/src/cmm_check_error_sample.c rename to vendor/yibaina_3061M/demo/sample_cmm_check_error/src/cmm_check_error_sample.c diff --git a/vendor/yibaina_3061M/demo/drivers_sample/crc/sample_crc_gen_algo/inc/sample_crc_gen_algo.h b/vendor/yibaina_3061M/demo/sample_crc_gen_algo/inc/sample_crc_gen_algo.h similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/crc/sample_crc_gen_algo/inc/sample_crc_gen_algo.h rename to vendor/yibaina_3061M/demo/sample_crc_gen_algo/inc/sample_crc_gen_algo.h diff --git a/vendor/yibaina_3061M/demo/drivers_sample/crc/sample_crc_gen_algo/init/main.c b/vendor/yibaina_3061M/demo/sample_crc_gen_algo/init/main.c similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/crc/sample_crc_gen_algo/init/main.c rename to vendor/yibaina_3061M/demo/sample_crc_gen_algo/init/main.c diff --git a/vendor/yibaina_3061M/demo/drivers_sample/crc/sample_crc_gen_algo/init/main.h b/vendor/yibaina_3061M/demo/sample_crc_gen_algo/init/main.h similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/crc/sample_crc_gen_algo/init/main.h rename to vendor/yibaina_3061M/demo/sample_crc_gen_algo/init/main.h diff --git a/vendor/yibaina_3061M/demo/drivers_sample/crc/sample_crc_gen_algo/init/system_init.c b/vendor/yibaina_3061M/demo/sample_crc_gen_algo/init/system_init.c similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/crc/sample_crc_gen_algo/init/system_init.c rename to vendor/yibaina_3061M/demo/sample_crc_gen_algo/init/system_init.c diff --git a/vendor/yibaina_3061M/demo/drivers_sample/crc/sample_crc_gen_algo/readme.md b/vendor/yibaina_3061M/demo/sample_crc_gen_algo/readme.md similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/crc/sample_crc_gen_algo/readme.md rename to vendor/yibaina_3061M/demo/sample_crc_gen_algo/readme.md diff --git a/vendor/yibaina_3061M/demo/drivers_sample/crc/sample_crc_gen_algo/src/sample_crc_gen_algo.c b/vendor/yibaina_3061M/demo/sample_crc_gen_algo/src/sample_crc_gen_algo.c similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/crc/sample_crc_gen_algo/src/sample_crc_gen_algo.c rename to vendor/yibaina_3061M/demo/sample_crc_gen_algo/src/sample_crc_gen_algo.c diff --git a/vendor/yibaina_3061M/demo/drivers_sample/crc/sample_crc_load_algo/inc/sample_crc_load_algo.h b/vendor/yibaina_3061M/demo/sample_crc_load_algo/inc/sample_crc_load_algo.h similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/crc/sample_crc_load_algo/inc/sample_crc_load_algo.h rename to vendor/yibaina_3061M/demo/sample_crc_load_algo/inc/sample_crc_load_algo.h diff --git a/vendor/yibaina_3061M/demo/drivers_sample/crc/sample_crc_load_algo/init/main.c b/vendor/yibaina_3061M/demo/sample_crc_load_algo/init/main.c similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/crc/sample_crc_load_algo/init/main.c rename to vendor/yibaina_3061M/demo/sample_crc_load_algo/init/main.c diff --git a/vendor/yibaina_3061M/demo/drivers_sample/crc/sample_crc_load_algo/init/main.h b/vendor/yibaina_3061M/demo/sample_crc_load_algo/init/main.h similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/crc/sample_crc_load_algo/init/main.h rename to vendor/yibaina_3061M/demo/sample_crc_load_algo/init/main.h diff --git a/vendor/yibaina_3061M/demo/drivers_sample/crc/sample_crc_load_algo/init/system_init.c b/vendor/yibaina_3061M/demo/sample_crc_load_algo/init/system_init.c similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/crc/sample_crc_load_algo/init/system_init.c rename to vendor/yibaina_3061M/demo/sample_crc_load_algo/init/system_init.c diff --git a/vendor/yibaina_3061M/demo/drivers_sample/crc/sample_crc_load_algo/readme.md b/vendor/yibaina_3061M/demo/sample_crc_load_algo/readme.md similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/crc/sample_crc_load_algo/readme.md rename to vendor/yibaina_3061M/demo/sample_crc_load_algo/readme.md diff --git a/vendor/yibaina_3061M/demo/drivers_sample/crc/sample_crc_load_algo/src/sample_crc_load_algo.c b/vendor/yibaina_3061M/demo/sample_crc_load_algo/src/sample_crc_load_algo.c similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/crc/sample_crc_load_algo/src/sample_crc_load_algo.c rename to vendor/yibaina_3061M/demo/sample_crc_load_algo/src/sample_crc_load_algo.c diff --git a/vendor/yibaina_3061M/demo/drivers_sample/capm/capm_hall_sample/inc/capm_hall_sample.h b/vendor/yibaina_3061M/demo/smaple_capm/inc/capm_hall_sample.h similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/capm/capm_hall_sample/inc/capm_hall_sample.h rename to vendor/yibaina_3061M/demo/smaple_capm/inc/capm_hall_sample.h diff --git a/vendor/yibaina_3061M/demo/drivers_sample/capm/capm_hall_sample/init/main.c b/vendor/yibaina_3061M/demo/smaple_capm/init/main.c similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/capm/capm_hall_sample/init/main.c rename to vendor/yibaina_3061M/demo/smaple_capm/init/main.c diff --git a/vendor/yibaina_3061M/demo/drivers_sample/capm/capm_hall_sample/init/main.h b/vendor/yibaina_3061M/demo/smaple_capm/init/main.h similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/capm/capm_hall_sample/init/main.h rename to vendor/yibaina_3061M/demo/smaple_capm/init/main.h diff --git a/vendor/yibaina_3061M/demo/drivers_sample/capm/capm_hall_sample/init/system_init.c b/vendor/yibaina_3061M/demo/smaple_capm/init/system_init.c similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/capm/capm_hall_sample/init/system_init.c rename to vendor/yibaina_3061M/demo/smaple_capm/init/system_init.c diff --git a/vendor/yibaina_3061M/demo/drivers_sample/capm/capm_hall_sample/readme.md b/vendor/yibaina_3061M/demo/smaple_capm/readme.md similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/capm/capm_hall_sample/readme.md rename to vendor/yibaina_3061M/demo/smaple_capm/readme.md diff --git a/vendor/yibaina_3061M/demo/drivers_sample/capm/capm_hall_sample/src/capm_hall_sample.c b/vendor/yibaina_3061M/demo/smaple_capm/src/capm_hall_sample.c similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/capm/capm_hall_sample/src/capm_hall_sample.c rename to vendor/yibaina_3061M/demo/smaple_capm/src/capm_hall_sample.c diff --git "a/vendor/yibaina_3061M/demo/drivers_sample/\345\256\236\351\252\214\346\214\207\345\257\274\346\211\213\345\206\214.md" "b/vendor/yibaina_3061M/demo/\345\256\236\351\252\214\346\214\207\345\257\274\346\211\213\345\206\214.md" similarity index 95% rename from "vendor/yibaina_3061M/demo/drivers_sample/\345\256\236\351\252\214\346\214\207\345\257\274\346\211\213\345\206\214.md" rename to "vendor/yibaina_3061M/demo/\345\256\236\351\252\214\346\214\207\345\257\274\346\211\213\345\206\214.md" index c677f8929..dc185ed8c 100644 --- "a/vendor/yibaina_3061M/demo/drivers_sample/\345\256\236\351\252\214\346\214\207\345\257\274\346\211\213\345\206\214.md" +++ "b/vendor/yibaina_3061M/demo/\345\256\236\351\252\214\346\214\207\345\257\274\346\211\213\345\206\214.md" @@ -222,19 +222,19 @@ } ``` -- 步骤三:点击![](./pic/1726195173004.jpg)编译代码,具体编译步骤"[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)" +- 步骤三:点击![1726195173004](../../../docs/pic/1726195173004.jpg)编译代码,具体编译步骤"[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)" - ![1726194776437](./pic/1726194776437.jpg) + ![1726194776437](../../../docs/pic/1726194776437.jpg) - - 步骤四:点击![](./pic/1726195185553.jpg) 烧录代码,具体烧录步骤"[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)" + - 步骤四:点击![1726195185553](../../../docs/pic/1726195185553.jpg)烧录代码,具体烧录步骤"[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)" - ![](./pic/1726194794028.jpg) + ![1726194794028](../../../docs/pic/1726194794028.jpg) #### 1.1.5实验结果 烧录成功后,打开串口工具,按一下开发板RESET按键复位开发板,可以看到串口打印出来了写入UART0的数据。N极接入的是GPIO2_6,将N极接地,P极就大于N极,会触发回调函数。通过串口输出“ACMP positive callback function”与“ACMP edge callback funtion”,可以看出成功调用了正向回调函数和边缘回调函数,输出比较结果为上升沿。说明ACMP比较器中断驱动实验成功。注意:输入的比较电压不能超过0V~输入电源大小(3.3V),最小可识别有效差分输入电压为20mV。 -![](./pic/1726194739756.jpg) +![1726194739756](../../../docs/pic/1726194739756.jpg) #### 1.1.6扩展实验 @@ -435,25 +435,24 @@ ACMP接口说明请参考该手册1.1.3.4、1.1.3.5、1.1.3.6. } ``` - - 步骤三:点击![](./pic/1726195173004.jpg)编译代码,具体编译步骤"[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)" + - 步骤三:点击![1726195173004](../../../docs/pic/1726195173004.jpg)编译代码,具体编译步骤"[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)" - ![1726194776437](./pic/1726194776437.jpg) + ![1726194776437](../../../docs/pic/1726194776437.jpg) - - 步骤四:点击![](./pic/1726195185553.jpg) 烧录代码,具体烧录步骤"[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)" + - 步骤四:点击![1726195185553](../../../docs/pic/1726195185553.jpg)烧录代码,具体烧录步骤"[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)" - ![](./pic/1726194794028.jpg) + ![1726194794028](../../../docs/pic/1726194794028.jpg) + + - 步骤五:用万用表检测GPIO0_7引脚的电压 - -- 步骤五:用万用表检测GPIO0_7引脚的电压 - #### 1.2.5实验结果 烧录成功后,打开串口工具,按一下开发板RESET按键复位开发板,可以看到串口打印出来了写入UART0的数据。N极接地,P极输入源从DAC输出(0.8V),P极电压大于N极电压,最后GPIO0_7结果输出3.3V电压。 - ![](./pic/1726194824764.jpg) +![1726194824764](../../../docs/pic/1726194824764.jpg) - ![](./pic/1726194869607.jpg) +![1726194869607](../../../docs/pic/1726194869607.jpg) @@ -815,20 +814,20 @@ ACMP接口说明请参考该手册1.1.3.4、1.1.3.5、1.1.3.6. } ``` - - 步骤三:点击![](./pic/1726195173004.jpg)编译代码,具体编译步骤"[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)" + - 步骤三:点击![1726195173004](../../../docs/pic/1726195173004.jpg)编译代码,具体编译步骤"[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)" - ![1726194776437](./pic/1726194776437.jpg) + ![1726194776437](../../../docs/pic/1726194776437.jpg) - - 步骤四:点击![](./pic/1726195185553.jpg) 烧录代码,具体烧录步骤"[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)" + - 步骤四:点击![1726195185553](../../../docs/pic/1726195185553.jpg)烧录代码,具体烧录步骤"[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)" - ![](./pic/1726194794028.jpg) + ![1726194794028](../../../docs/pic/1726194794028.jpg) #### 2.1.5实验结果 烧录成功后,打开串口工具,可以看到串口打印出来了写入UART0的数据。通过串口打印可以看出U相APT模块的定时器中断回调一直在触发,然后判断返回时基方向。 -![](./pic/1726194906962.jpg) +![1726194906962](../../../docs/pic/1726194906962.jpg) #### 2.1.6扩展实验 @@ -1222,18 +1221,20 @@ ACMP接口说明请参考该手册1.1.3.4、1.1.3.5、1.1.3.6. } ``` -- 步骤三:点击![](./pic/1726195173004.jpg)编译代码,具体编译步骤"[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)" +- 步骤三:点击![1726195173004](../../../docs/pic/1726195173004.jpg)编译代码,具体编译步骤"[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)" - ![1726194776437](./pic/1726194776437.jpg) + ![1726194776437](../../../docs/pic/1726194776437.jpg) - - 步骤四:点击![](./pic/1726195185553.jpg) 烧录代码,具体烧录步骤"[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)" + - 步骤四:点击![1726195185553](../../../docs/pic/1726195185553.jpg)烧录代码,具体烧录步骤"[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)" - ![](./pic/1726194794028.jpg) + ![1726194794028](../../../docs/pic/1726194794028.jpg) + +- 步骤五:电机接线如下图所示: -- 步骤五:给电机接电接地,还有一根接在GPIO0_5上 + ![](../../../docs/pic/2d23b1fa3489f9f9ad2d2d1e76fbec4.png) - ![1726194945180](./pic/1726194945180.jpg) + ![](./pic/1726194945180-1726210955941-2.jpg) @@ -1241,7 +1242,7 @@ ACMP接口说明请参考该手册1.1.3.4、1.1.3.5、1.1.3.6. - 烧录成功后,打开串口工具,可以看到串口打印出来了写入UART0的数据,在没转动电机时,串口不断输出0x3,当转动电机时,串口输出0x7,说CAPM0_IN(GPIO0_5)获取到了一个HALL传感器的电平信息,说明实验成功。 - ![](./pic/1726194962547.jpg) +![1726194962547](../../../docs/pic/1726194962547.jpg) @@ -1414,20 +1415,23 @@ ACMP接口说明请参考该手册1.1.3.4、1.1.3.5、1.1.3.6. } ``` -- 步骤三:点击![](./pic/1726195173004.jpg)编译代码,具体编译步骤"[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)" +- - 步骤三:点击![1726195173004](../../../docs/pic/1726195173004.jpg)编译代码,具体编译步骤"[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)" - ![1726194776437](./pic/1726194776437.jpg) + ![1726194776437](../../../docs/pic/1726194776437.jpg) - - 步骤四:点击![](./pic/1726195185553.jpg) 烧录代码,具体烧录步骤"[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)" + - 步骤四:点击![1726195185553](../../../docs/pic/1726195185553.jpg)烧录代码,具体烧录步骤"[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)" - ![](./pic/1726194794028.jpg) + ![1726194794028](../../../docs/pic/1726194794028.jpg) + + + #### 5.1.5实验结果 - 烧录成功后,打开串口工具,可以看到串口打印出来了写入UART0的数据,打印6次正常的CFD计数值,注入错误后,打印6次中断回调,后重新打印正常CFD计数值,循环进行。这现象说明实验成功。 - ![](./pic/1726194980430.jpg) + ![1726194980430](../../../docs/pic/1726194980430.jpg) 提示: @@ -1607,21 +1611,20 @@ ACMP接口说明请参考该手册1.1.3.4、1.1.3.5、1.1.3.6. } ``` - - 步骤三:点击![](./pic/1726195173004.jpg)编译代码,具体编译步骤"[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)" + - 步骤三:点击![1726195173004](../../../docs/pic/1726195173004.jpg)编译代码,具体编译步骤"[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)" - ![1726194776437](./pic/1726194776437.jpg) + ![1726194776437](../../../docs/pic/1726194776437.jpg) - - 步骤四:点击![](./pic/1726195185553.jpg) 烧录代码,具体烧录步骤"[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)" + - 步骤四:点击![1726195185553](../../../docs/pic/1726195185553.jpg)烧录代码,具体烧录步骤"[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)" - ![](./pic/1726194794028.jpg) - + ![1726194794028](../../../docs/pic/1726194794028.jpg) #### 6.1.5实验结果 - 烧录成功后,打开串口工具,可以看到串口打印出来了写入UART0的数据,打印5次正常的CMM计数器锁存值(目标分频为8192),接着打印1遍“ Inject interrupt type error !”,注入错误后,打印5次“In CMM interrupt function : clock frequency error”,再打印一遍“Disable inject interrupt type error”,后重新打印正常CMM计数器锁存值,循环进行。这现象说明实验成功。 - ![](./pic/1726195007716.jpg) + ![1726195007716](../../../docs/pic/1726195007716.jpg) #### 6.1.6扩展实验 @@ -1759,22 +1762,21 @@ ACMP接口说明请参考该手册1.1.3.4、1.1.3.5、1.1.3.6. } ``` -- 步骤三:点击![](./pic/1726195173004.jpg)编译代码,具体编译步骤"[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)" - - ![1726194776437](./pic/1726194776437.jpg) +- 步骤三:点击![1726195173004](../../../docs/pic/1726195173004.jpg)编译代码,具体编译步骤"[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)" - - 步骤四:点击![](./pic/1726195185553.jpg) 烧录代码,具体烧录步骤"[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)" - - ![](./pic/1726194794028.jpg) + ![1726194776437](../../../docs/pic/1726194776437.jpg) + - 步骤四:点击![1726195185553](../../../docs/pic/1726195185553.jpg)烧录代码,具体烧录步骤"[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)" + ![1726194794028](../../../docs/pic/1726194794028.jpg) + #### 7.1.5实验结果 烧录成功后,打开串口工具,按一下开发板RESET按键复位开发板,可以看到串口打印出来了写入UART0的数据,生成的16位CRC数值为F1A1,数据大小为1024. -![](./pic/1726195033006.jpg) +![1726195033006](../../../docs/pic/1726195033006.jpg) #### 7.1.6扩展实验 @@ -1926,13 +1928,13 @@ ACMP接口说明请参考该手册1.1.3.4、1.1.3.5、1.1.3.6. } ``` - - 步骤三:点击![](./pic/1726195173004.jpg)编译代码,具体编译步骤"[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)" + - 步骤三:点击![1726195173004](../../../docs/pic/1726195173004.jpg)编译代码,具体编译步骤"[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)" - ![1726194776437](./pic/1726194776437.jpg) + ![1726194776437](../../../docs/pic/1726194776437.jpg) - - 步骤四:点击![](./pic/1726195185553.jpg) 烧录代码,具体烧录步骤"[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)" + - 步骤四:点击![1726195185553](../../../docs/pic/1726195185553.jpg)烧录代码,具体烧录步骤"[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)" - ![](./pic/1726194794028.jpg) + ![1726194794028](../../../docs/pic/1726194794028.jpg) @@ -1942,7 +1944,7 @@ ACMP接口说明请参考该手册1.1.3.4、1.1.3.5、1.1.3.6. 修改后的初始值为0xFFFF,修改成CRC16_CCIT-FALSE算法后输出数据是0xDF46,证明验证成功。 -![](./pic/1726195055385.jpg) +![1726195055385](./pic/1726195055385.jpg) #### 7.2.6扩展实验 -- Gitee From 2ace59d0bba392179b1897da88d751baf6f81d6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E5=A3=AE=E4=BC=9F?= <1161625498@qq.com> Date: Fri, 13 Sep 2024 16:04:58 +0800 Subject: [PATCH 06/10] xxxxx MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 温壮伟 <1161625498@qq.com> --- docs/pic/1726212673803.jpg | Bin 0 -> 242640 bytes docs/pic/image-20240528173107958.png | Bin 0 -> 502 bytes docs/pic/image-20240829165616356.png | Bin 0 -> 676828 bytes .../pic/1726194945180-1726210955941-2.jpg | Bin 171355 -> 0 bytes .../yibaina_3061M/demo/pic/1726195055385.jpg | Bin 4448 -> 0 bytes .../demo/sample_acmp_interrupt/init/feature.h | 93 +++++++++ .../sample_acmp_out_result/init/feature.h | 93 +++++++++ .../sample_apt_single_resistor/init/feature.h | 93 +++++++++ .../sample_can_send_receive/init/feature.h | 93 +++++++++ .../sample_cfd_check_error/init/feature.h | 93 +++++++++ .../sample_cmm_check_error/init/feature.h | 93 +++++++++ .../demo/sample_crc_gen_algo/init/feature.h | 93 +++++++++ .../demo/sample_crc_load_algo/init/feature.h | 93 +++++++++ .../demo/smaple_capm/init/feature.h | 93 +++++++++ ...07\345\257\274\346\211\213\345\206\214.md" | 182 +++++++++++++----- 15 files changed, 970 insertions(+), 49 deletions(-) create mode 100644 docs/pic/1726212673803.jpg create mode 100644 docs/pic/image-20240528173107958.png create mode 100644 docs/pic/image-20240829165616356.png delete mode 100644 vendor/yibaina_3061M/demo/pic/1726194945180-1726210955941-2.jpg delete mode 100644 vendor/yibaina_3061M/demo/pic/1726195055385.jpg create mode 100644 vendor/yibaina_3061M/demo/sample_acmp_interrupt/init/feature.h create mode 100644 vendor/yibaina_3061M/demo/sample_acmp_out_result/init/feature.h create mode 100644 vendor/yibaina_3061M/demo/sample_apt_single_resistor/init/feature.h create mode 100644 vendor/yibaina_3061M/demo/sample_can_send_receive/init/feature.h create mode 100644 vendor/yibaina_3061M/demo/sample_cfd_check_error/init/feature.h create mode 100644 vendor/yibaina_3061M/demo/sample_cmm_check_error/init/feature.h create mode 100644 vendor/yibaina_3061M/demo/sample_crc_gen_algo/init/feature.h create mode 100644 vendor/yibaina_3061M/demo/sample_crc_load_algo/init/feature.h create mode 100644 vendor/yibaina_3061M/demo/smaple_capm/init/feature.h diff --git a/docs/pic/1726212673803.jpg b/docs/pic/1726212673803.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e1b736beffba597d5a796923a08efbfb3f45362b GIT binary patch literal 242640 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 literal 0 HcmV?d00001 diff --git a/docs/pic/image-20240829165616356.png b/docs/pic/image-20240829165616356.png new file mode 100644 index 0000000000000000000000000000000000000000..999d9e571fca4fabec1e82927d6d2f6c21c36330 GIT binary patch literal 676828 zcmV)5K*_&}P)- zXO|_%ktKM|<7H(jXpjI2(IhBaaM=W#J!e{-{ki)C_Veypab|kDsTHbFKxOHyO0DG! zxBX!En)xfvCJCVGWxNP?H+AirxrhB9|NH;ufWyrJ1I!zM4tIyU!F`6c28Y7{7z_^Q zpBm5{=71Xj0PYTSk88|e7QgVhqr0O`jrVo{KK$A0yYA?4n4Z`GxW|3?Z;KCMhWtKY zae)J{cn+*XKW2P}#_1if1~UiHcn{~8Yg`!S2VRwf@wi_9pgY{+S-p3-ca9Y~S9g!! zp~E}i<}p1t{#Rq1<7utIS`5N4u3rbN*3Mut&=%h}w^&7MF=nfEkX+*L;2OvCt%V!_ zz@`T8h6dx(di-8%Z6SYn$J`z825<3qvzBWNRaP_HbbKw^t^XWXw>(3u7ym-neZA}cIuP;ofPILI)`1=)?E0Q}&QZuAY&qf`{U=A<7^htN z1xHI@(K3cc?CCH7%^F}9k-IgZ8Cq*-ZTbrzDjN&=#=3Wxlw%yuHP-cVqg|28EY>>X zN&{Sa%Qc|RlnferA2G5re-g-yt0saMW-uDDq|&9?&deA83bd ziurhl)5n-w%sce~rB9&FTljakjwY9o8BaZeipZqNR9Ev1_sNumBGnSgVC`Dvc4`v`&MZVj*n;nzwlH z0Hh&@h7e}=PIKu93^)V5!Kt`ta&S^2q|%hhS~>>vhK`xBpH2+|rQs;s7(iM$#h3&Q z!po^d;P^`gb$4M;cz4W@(~P+~9lL}cfA5feI6_xC=>5}K$0T#UgF!hg9G9Gtc{s)% z%GOLkk*;Q#hx5-yN9!Fickq5%&t(9QZdSl<*3-i|V)g_W?n_t?#~pz#bSFOQ>5LfH zFx!mD8vP2Lr5l`jgs#C3!Zt=m?{MqzEWSfM>{qz6eESM-Q>0L92{D zrvN;`iF{GdL^FYCkJQTS0b`87*)!+T5Sl7)U(Yu_COyuByzYz@QrG(Ruh z=@ljSyh_e_2e%xT)TQ^h&WQD#S)9O@ac#oRDnJ7*z$+TusV8oMY^=kz z9_FEcSk>Rir>4{+DncbB@=-R0_VE(O47V2J%2n{c(1lo%if^I+K7gi*XAUN~@;M10 zC@T7Ow}}MPOkHdQuA%d(hCs$t6Uu7?$pG2JsAGU2p@^l?+l{_)v=I580G%N}CFCo* z>|y^P&<)unT&C^wnOxc~|3{mW%V;(+F^r_yNzygxzXRSB=Y=PjI5J7~9`RAQUt8H1l~(o4haN?Hvf=N1a7a`4T_{xX2V zd?1bp7SeHs7pv@sj%JeK2I5zImN2NL5Z~L{gn6b1rqg%xxQ|OaErGD30hA+?~r#vH7KIe%7K!yQS(dl(99OtiO)ViT}$2>C-n%Hk3 z*(e6BWaI<}2PRm7B!GQ9sCP0k0#@MfO-`=^KBc1rnKyba03AI8rY5AhrPdc9Sk`?U zjf{&HDXw>r{pbd70=JHC4)cbYMj;&oV!mPUtU~l*X~a?!5Sq`mE;9NtqlCjIX3zqY z0t*@NdyZQGwdU&au&LHl!%RA18O}ip;$e+p&}7R6kYIq%1c>RpK%GG;O6v*b4HnE* zE-m#^ao+%tl^X3VY(6YJ;jX8)q?p7s7sD`C91M+fiRnauaGNrCmxJo7cI6!&)L}|D z=HoR+>aVA+0)sK-{n9y-h1EUt&$LXKVd?pAQ(JK)T9nyHo?s1+0R2=9_2tarf z?CG!`j8g=J2x@K}y~mi1;B538nb1p6)+m?IcQ7a=m`OkDw!E*a zvc!d=4VzCfcT?OGpbl^d50(=KG-lWC5uf1`*F>?`D#oOoy}&O0Kva$_XH5!(u}i_k zay=~9jn7bp&-F-Wg2rd$EaZ2o;`C|pyG~Y_@r{1nv$`}ecHJX1aemFHOJIeRiDM*( zoRxR@q{=0Mu!)`ZG&zmclKFJ_ur@0R(P(!la5^g-T8F9w!M1y@VO-Ety6B7r#4Aa3 zbO)HsiF7k}bjH6XpQmvH=q7+~)ECB`{Ha)6vL32%(vMLGIg|jvp0xHe@TL_Gm}C1|%@09j2g2;-K_e^6|L? zGq4aMHUUlal}TCi2m;K$0VgeHX@pLP+}e;0OYs;43_ZWDOhEe9nHh-%9)FBJ#etyQ z+rZX2%i8H=bZ-Nup^QuQ^;sZ+2Hwa4OUcQufLTkkDD6k))&k^N-P6pCh#n|Q` zp&(7S?1s57(aCakFqpX|0~-Nr30Lu$(+fRNIi{oc3U-h&K)^YaSD-Kl<#d$kGzbo| z3sMnuy(cqm~GD_CL za8hT}Dd>8~P(H{xru}sUliUr}GGPpG$SfYFz%QUHhr!^a=esy$+7HCIdFoO!3CRkD z{KI+CgEhd(1RFo=E<=htcYf|1Rc7Tt1zNQ#aePj@jC&Cb4?3Mc$rfrJO#aXjETAeq ze5SP(f<%=OM@Hau$nHJt0G^3oR)SR3p+ojuc=;c#HSOIEJp+CUH|A@_D1rK?3Rjv8 zutG3sw&2Q|Nfrb>t`a^q&~$IVCmkA>+o+S3Xi!G1P?!Q^i}ANc zKn{>a){XSXs#cVb>?<0{mEhyzIn4ow$RAd0dH{rA(I|%o^e(_l{Y<^l)U^K62m-93 z+-`%fk&mwhGxQvz7zWc~(FZe8&)6zpA^j4~yb|tme5y`@EtV_t5L4OY!wW>OmihsK zNbi=FHki>x&A|-A5N%FvV04l3Bkmzm&j5?|fyg&vERzLEmhF29EW=M5Or;9~F%YC9 zfR{@ykiyb?v9&&y#x&t zndgzDjHfcWGud(I#$<+B#0KTkokRiWTa{=ry;@^HZJm`s^u$DJoJRw8hZxY|gJEs}{G%ko@!*bHH=WQ$~S1JJ4f>D5y_#Fs3xBsjWI}F{G~GK-RjeTu@n6 zWP8TXS4}>IH?%2a5VGN-aBPl_-e)Dd9DwA z7Ag%Zx^?z%#k>$e6mie!v5S&lH@W&5SSmB-=Txe>2UFr*Y?fm-MN>-#-Z09-a~+#2 zu_B028JE2VzLfJIOT_Q>zJ!_QGv!F5XOH?I>r@Z3%JQA;k-k6tjOCiRM+7{zas+GD zfks)$SqYfASg%+|LbDuWvU=3Xp8D)1N(>1I+gq&8ViMAAa}5mTl_)1CL*rIGaAM|iZY*IAPj)8MaoymAtYS7+67$Z!KwZc=TKJ0u zoT{XlBN_0Hfe~P(s%wNyh+4_SwA{+Xd0#P|kpNPbjipcNPjMCe9F;T}puSLn^00Su zYOk}vRRST9lueIvw$j-_&RQou2ie`PYxsvbMk)qH$yBTdB`v#37aZfB-C^<%%HNbs zyH&NNhs--mKNZ+A+$T74f?>&U^`}L!_8!$ckpKf=b%1{#)vF_gcd=c3@&As z!9l$@&kB?PhO|k4qSMW>q%P%11U4}~*0N<-&-T6Wg#>c~ zB^qVc)bm03i@tFADhI^)C7;DgBN*ouGt(~g%a!@7eM3NCtcD=Kkq3bhNRY9Xl|WcD zFKLfKwI)WzDwCTQgoF8%#Fll%u=1bkbI&TFhy0Y>!RN4&K65_3mMaMrGOO+cWQ}&- zYCTyYDzb3Y#L}-MU?`|4@dwe=NI(Ty79bTip%KhS+g!xx8IIPbs6sLE3c@SmX?)c4 zI}x9vZ&rI+;2!Nv@U*)bMUcg8YA=RjG8p$vAXIue+5{Y0$|KgDBEU^nZc+lGp8ZA+B7^esV?S_pm+9;ju`+qe9#zx3XBn- z=_r^XNA|^X4A(2<5u0el#3`W9-I?{(S{ogNCmQN3D=PvTnFeIfme$96Jm2N~I!jj$ zB;zT$xpL)j)P0sw7RV55Cvely2#5#{bt^ejF<=n08P5^J)5Z8OdsSJD!=ZiyYSEDa zQK7@prX0iY6S$y-98<@_z4YE8<}jX9W$OqS;XKohGDODu&zMu+V=29^BdZ3t+IMII zqS92Bl@T(?x+BYcE*HAdOS^3L=Lq0a&%a;^~|R45JoX`FW^3EfH; z(5Z7H15b&%Ay@@5Ii72;^_2AcYpotmxtjMCKm+&OJeB}>0E$^2hBgcZs3_oGoO!Z% z@C49~W$4ukk?ZtP4Wl?$m@RGmlij;)H}o*Z?5`#G1V`!-Pk?2V8=oz|p>ltBwm6i% zMLP!vM`kj+-=rIqi5T-_epPkKzng@QY(;7UH~JaCfv!nRR`vtRh?fOm&3=1uPm(8m z&UT4$K$>SmB>ajK?B|pil5HK5kc>gHVMH8@K{bxKSJjkyhxAH8&{%>n`E4h7<(won zSJlaZIf8Z2@C@Rqk}bhy^}7$UKt`@u&n`*UkMs-hTs6Resq{=6r_tiU(H^MJkiD4E z780N51}MdC{x0?gA)lB2!a%S~Kjq?BBmQ>!+=|=0zfFu|fK4ssUo8amYo%D_W9aAN z5520{j1v)GLNR8>j|mfUgOA1c%{wNDFyUSWE^Z7V_6%jgE%B2D3u+FV8MbX=Tnq+R zxFhU*W;>6Qxz_E}0OC>pm%rC~($3vH=MnSM4kg*5VWqHI-R=BkF@87jbD zp0V@`8DDB$yzWmw!kulzdyd8yDxk9gA#^=sfFtCu3X-#>H-{V;%^KS}5Ox_|FcI4p z#Pu=xuk{sEmVgW)%PRdioo85gssv_&A`39X)pfSq7<$T9MyJdd zKIj4UI*Jii6Qs77&p@a1>|nMj)uOI3Xv(o^0ZYGW#9)%r0Y|HQP=6ErnLJ|v#1ZHQ zn9^?vIes?_AX!iXu`wwAQtcOp@&!oNPxKm#&$pw zLpC8;d^jc#!b-$~zMdqiDUN%YnRF>6kbVh1CxFdUvCOHPQ|V7%qI#^6nxR%%E+bMQ zjcF2n=R&k_w>cLndp}JXuBGFuUQA=45O^tP+?UK=RQ3i~)@E>RWD*c;XZHxs=$0V6 zYbO+f-fnCf7idUwi)@#602+Z$;3zLpXp0pm8;p*ErJ;`{R*!(tmr@3`4#>&)iW63c zP__m@OrO|ID(mb(@94ga&0xtk*K=tiFo;Q<%b{^Ih8(jLOio3Hl)I?qBPfDl=pBztxTDucU7341eKqMrfK;2ETsjcH@7h_;@?Otp0eNf-1emna4PsxL zO3)c4bYxK-U8CMeOT#s+u!=mrA}SUgqMzJbY_MSKg?H+`dX!s%DLBZ013p6u(=j@o zeIEOQ*M3&dcR(Mqd5i&~f<`dq5h=~fu`Ah)xyFh_j0-k5{8a>?XbGvL)5idx_cP>f z^Df3Y5d)uRd2QLRf~t=BQP|OkafEI67i3{GM_$?a9$m zrKYvcDvWbO+?X`9^h4uJi`*O1K>=vg?*c$6Hp-@r&u79fyW?M0TGRlj1tNhTB7tT@ zBf#pPsXD?KtGH^(=2P>GI$=B+Ad^Ooyeb4bttR%S%&e};-o=uJHjvwbTEJQ}EJY5a zdBqYBE zPK3y63GG?<)QoLG27o6!1%NIcwcIV)s#AgSE!tRO{0pJ}C|mF-4+);7jNrkC8kWmv zGZ4t}i>-pm7u3(h^V+gOxnoud9XiRuhX6+w6*AJezmB`fUQtk3*@nu8&N4{*%bs1G z%b4Q^t1fjWa__yI2X(Xe8K$=4>`@U*=@8=yuq?`jY>4tmv^!8J@IhIP-vP2EMZi&k z*d5;I=+`kHHcX*{uM3D&8%G8`7rd0OC}vJ$u;!GzGuD&A)ft@v7z)f{L1h#QMK=6S ze`e`ti0$?0IRdvbH#tl<$vXt3uN`S1(wld;DfX1Le1mro_398Bw z=E)P(x7yqib|6^<9uazR=ol>5IHj)&XqogB3|lE>_hD1X@VjI_%#sbtO}W&$Jbk7Q zEQor&HGBeUW1x(gunJT|Dqkh1o`KG&L+pVTDCzb6(Cc6fEdAu*)KWB_YZ&(zla_r3 z!^I^^R~S-IW}+HZ9Z$b7GAcPOvTB)>8EE$yuD80@lo)92Y}N3=2N+Arlrv1>n3W_$ zwvyFRZ=5piu<)aLi9<-LA|~4(ThQZSS#i+Z1Tw7V;jyGksaVR(hjyrtr;ih&&Vl*? zbh%h2x2is9y=~AHc9`d)iA_^GRIHEeNB~seRE+chDPuizZw*0N+H{ODt6Nfbr+srR z^2kezG07g{c}%jT_*#jn_55N$rAgxhO{4T z-;Ro_{51h+GR7vA=NJ?ZkpQ`SG=0EKbpb{=$u9JuV@?2^evo>p#4ucCE4{Ib4^Bb~ z2&@u+aLlyj)(DCbmE}0&yJVSFhE`Z?VF7p@QPGa)RmJaGo8jpXvL(ddl2M46{opwf|N!D=ZxkG1F?OkRMMQe2etD^_F~){&9kVYXU>AVROSs~KiY#q~Z^KCQ$FQVi$j=q+GjkF|VN-d?Zp!uPzU0j!Yfi`Kb$+P8WQCMs z8FB-g^oO5Epx_3cE_pGrppix?$1?a-pIrq5=}sMsC+~>YoUXi$HYWIx6-ps`245vv z%?Kl&0qFv)1of|Fd{^O5Yj{qiEdU=4xN&VNiVhP3W4P%yX z7ZeQ<{iu9+cN#{3yx}(RUn0el}6=9YBZAF$Ve0 zv>PBd(`52v0yt5HkX~jhho8LC%q;Q|$XH>offdhtjKi0IPv+A-+elXu?qQu0)Vf+O9Q9%iGASZW_^{fDtbuxw zI=W}}`HRv}+o9$>LU`?g3HbdG>cfO z7|ky!0VE+HN#>tAqJ6LOcCK}7L|b;gOvVZiC>dz?dworMN+C1x zm>E;G@i(vqfU!c$JZpyhX~pm6aSm=YM}RWxn4P*v`800&6knX+-aAdaDsA$=xryI{ zXBMH7??v!nf;$sAnBszxt(a>k-m5((PI5<;N9SBc?gay`mW-@SBwkW0NGwiYd4Wj` zxN^*}<;j}rXEcY1AF0bQR{lw%II$tPAB(b&6{fAHT}O;+^aCA^g}ZL6GhRaj12j>= z`JjYmD#d9>BLL4HI>eD9a~Yk>Te!@dL6r^F^Y{XYJXn7K3KWmZX|ae=3RVd!T!Nw~ z@_F5m&DG@y1_lmNWKSw;3Qa9J@Oiq^V3DG2HH*M|~Nf zU5m_c0~547l9MV|u{CSr)oYmEgym!a3$^*A001BWNklgLP5h5Hmn9-b) zyhiPsr*=Zt9rBoyOjDnZ4d_LVQS6HMWd_>SV|tLmRL&F1_)+-8r8A&2RFCUmtf@aV z?A8W(xS79vCf^}{X?1^&zs?;6M1z>dJ^YM7 zCK8UgrqL1CncDGrxlUDj)H^3oz*Y$P6rFjS?F*i^9Bf?AGJRE%IA$8S(Vs{@F2B6Za*yiqi^)r{qxlFJf}=6ju78IZIb{12VwcL>q6+)F}~MVT&ZP zQL&_{60u3~N3f@tkfdK?(qoF3Y?T;3GvlTlD*piVK@9v5_g!85|udB_W7<&#o+aqIRU=!A&ZA{>qG6sPA zn!1UtFZmUg3>n7BJf7fNKG8ik?p4)Ju7#wYKGs(`#xx7XMEA5C*;XW4Q(`UIz#`9z zgA~n%g@~-IF{1;&7+IOJ*dZV|c;+71|DkwS-_2gdE`~M6CnuNZGdl0V5<@PEGq+Pf zNChgkG)t#cm1sbJtvpS~1Q{HSP(OKHpy*WOJX^6_RnTSv3D7a2C9~~=vFG`u>Y1h2 z7}8ZW;sK(6+Lrn8du6(80|j+X&6a(A(RR%?}vV>uluw+-x<0(5*ULvP3u1Zug< zAINeX0iK@W^|aibsvXBG^QYLdUr*on*8#6|O1~#F-3ZLwF>a8FpusY=6|l)*)dC>v zxEr_5Fw#~eBY@c%4Lg&Zkd@Y6x>xJfhjE%dkaHi}S~3uMt)c#@QdKyEd|R3$J%Y-p z3SiO8?YTC|re_iW+EiLWf-vL5BGCZ>Kxg9DGhqvLWw|hgrod_t%eHzH69X-jU=RF= zf%_8T&k1i7RG=Q^R$>1&~kye%diNpY8w+4ac01qwwXF}A!G{LgKb*&c@WwHCMDnH@#IL2N&S-_`r4^NbXLze}JD9`Tn zp+y3CbJR&grF$uh49FEN^s3ir-EpX#ZLZh<3U|f)IqF!~j!3{HrwD!=qDs%mJudnB zW%`AxlyI%}1!^jE+hpK*e<;%FIiC9I0*PrSv?VLXTbgM$#=`iGas3n83}8!3mz(B! zlLQk+n-XgwZR$1OY+G^tmWieTd76O>$VlGhM@y&UBZ0wK)!0+vs3X1hK z9%tJG^*UcRBLay&2x7Das(4zCTSJ>#l4A0p(y%x!A@sXVxvd`8*O$0lUSaOQWD{;I z)_{qJq4|KN5VDI(Lg%LTQDU_bJ_x%ZMy8;Fe4z|v^FZ$1;Jz0#a8sXQDL`zN_ts+T z1sb|}S3)9v9mmINmU5^D*S>Mo=}L;@Jg&_~Sr0gH<-Xxlpp(t$7J{29oh}egy@FoR z(n&hUycfz&9UW>kSC$>ln+7sT!Fgnb`lU2r8EZNeI#n@83}%y0n6GEdzJz(!*k_4$j4Y)F-*P6*4^1dMnE9Po~L4jJRN+0y_FF-T*tUB7~>3txl}q7A8CuxG9d@8Bz6@D>!k*O zv(zOcuwoh%fVtiY1|h#=h=4l!2qn+DmQF1Dv@8Qrm_&RhX3gV}Tq`>`{Y=`%6D?MM zqTe4`PEJn?|ynS~q9ATLn@x1hAavLC@$f)z&} zZlP<=Gq%%5(S&;XfvUzR12XpWrE*e+p$LO4G8vF>EZeL3TYf)JGcXi6J=|in8HW-e zCUx|C1#-hDMAGA>GYt@f7^=)QOYqRyuQ;%P@)PiE*>S;g>0csr(C3Y$g;@O>)7UbI z+>0ZhQ=n&jb6mPv?Hy@`dVR81w|bIY>zw|+=YMqJy~Uf~JKfat%STEo;DuCFh#x3i7Mj~?Rk`Vt?0^a8Z;-i5X_RxY#wtm#NY<7VYB;(TMP&Y)?H zN7#t#ceug%YbjHFwUM~~S#vrsT%O$Ch4inJvQo$s&{Cx%El7JkZD}d;2 zcM3YXwz>K(I8JhLF4Yzguk&!@+B!l7FzBc;SK_1jsdYtwJ||UHkpY6^tKOdY=>+oH zFKoHS0={+21jrm~Uaw@1dKr4u;(&k3t)Z2^=e1P^j8(UeofMFw& z?X(ZI$3&@|EFG0K^p*m2>8}`7IbNX{bgW+sLz2& zHf+#s*+!P2oNHZ`AO)qdYEo}P)Y|L6uK%+_G9<}l^a2>gJsX{!5oFXo#iA*xFp-fM zH-W`>1;jKLzH8^sUCvTbzlzUZxq!&H{KtL~f@fQAG zCG@z+a=kl(JsvAmVLbwMtI0=>KNYfwl94?f-*$(Txq5L+6ZwUBUh}j~C_W5xug#`P zE-3}>(@27~LIU-TI^1pWt)cZuvKm=UQx7dTUkA)4EZPM45=V#o*xr7L<$R5I-hCf;@4ST@ zZNYU7KVy7_a4?fooK)Z)hx>bY@%$+^Up&DZckbfT?|cty@4lBnUX^moSBu9=EEaKe z+wtK(o;}&X!Tuf&4)$ zP&vARC8Z1+uaySr5apERhm#~!EO2fZ%GV5nJ2H93EacQXni(bw2U`3MdlBW_=2&E% zyBYz$7dRNLc>FPeAk^;-=(Bb*P8mMcdn+@B^=Q|?oZwE!s)V!T90;`A0Ak_B4Gx`v zSAojYMRYl-bQ_*d$rw}xFU0OE)6c2cgwEdF7?!1?COXXMra~T_IEH|wwN6JO1)hdr z3Yd=KGCFE4`v?G4V&OU|-ehLXz?^-Pvl`~-%%%kpSI#^2+VLFswA9ZEJmi1L%GwG5 za&&8HlrbiPn`9TFk)So_X%DReIN7c-Zgj7zfRkB-k@Z)=PqnlPcnbdA>Fj$LkKSsR zUr`C1z=QUu>P!TkL}W-RdD#8I+z;A_6W>#5&tWY#V3>k3=c<6#(e=jB?6(ZS5jGjJ znlj)C4`NLGyfesGH*N(gCRqdr+1|i1T67|D{^{I&&`T*_XM(J9bl7aR$k0BrPjBpd z8paXkq6F4B(rD1ip2HqsA*(*7@dtBOw&Rpi##Kt zm)#`rN5}Q`B~FeGaCLQs+qduH=Iy&^(+vawi@DA|WAa7XxwQ$4X~Mj`#?!|SvH9#V z4i0zV27K=ae~nwW?#44y-|KbUW){a~!m+ve950_g#o6&8wl<$*e{F#ezWwc3QxOVY zF9?bxa)z}DlTFy$-NnO=2RJ`H#>M#=b`SP(eSL-X^>wV>Sj+u8s#-UjFxdi!hx>T` zbOXV^(S?0^e&wa7}FY?PlT zNb*P;BCCsr@v-!;H^?Mx^jKy0W!#6G(EuNeweBJC;S!E$a5U~Jq(kPG{<;oun*#u{ zN6cXCfs4&O@c5oX$c{md|CR-#-g)|5v`lj z4WTlZ^6G(rXJ$u$TXmmgx(a9_^+BczL@5g?o6&Fpox7|+sSQ6awo8Vsp(6lD=wavP zP9+#fETgh=^lPc~C;%J*3VKn)a0-XO1|%05KjmB_X$1&?+904s7tr=lLZ54`GT3U( zlR1@4E3iix+c)#5oB>FHpM`FRu6M-5ae{N4M2^s%4}4{)XTCH zl{AI00QfTX&Kk0GR;7I}fl0p9d2O1F%^Golf3DX!2e0FTs4Or+4S}DmoRw2b8Eaaj ztW(o+D^G&|l(owSwXsDuG0thVJ*nD7I{!Q#OJ>lf77*;hJvYUKD|E6g4D!^yp7Y^o z$?WAuQi8s*`T?N&icsT8v(k&KV{Jdzy<+qE7UNwpotOm-qEI*Y;OD8KXc^&l&mWu8`Z@z=pR=7fp;vISMj#^Hes3?V;TUI4~_ft={BLYC{LfA9N}PZ z8(XiQjoh?AcRn zK7WGa!+mVOe1W~aJ-q$)yI5bpg~ehm;;*XC=`DlJZmnTwXB!V6KEToO5l&A|u)XyP z%X!8ppMHYxe)or1Tf3EUp)pZ!X4u<#g|8lbiId|!%*$&mU^qQFhPh+W1nj7{F42X& zNBm>f6XRBAhPR&s7n@C%l7#nFvdZAVkCPVCE5BZ|0?^njz4O3ghh9A9x zxH}hy0iap+iYX&R4a__k2RL1dB?QIN%W11}jw1%43=noN<55CY+vSM184-4X5Z1Wgb=Y3W=t ziwPPsW}Ze#p*58nlr|d!Ap@ErlY%e=`s9XE)FNYQot$G)k5&eN0%3V5JlCcwx5LqN z2rCSchn|=hXcz;0l)dBcZZkob!cr?lXR$uj|JWr&0P1s{7BEYAX)mKv0N)AyUK&?t?e_~)KG7VoTbT?M1ks~Ko0fL z3FM3ER&_x(LH+f?e>xzBu2^V-921zYM1u=D=#NxyKqss!6@-(2tBtjBPpffi9U5QS z!f&o7jK!*h0aT~M=-8x|Ye89B+%Mi4LC_{&%oj%GCbD8;waf@lT@lcOr%9QQk zV{K~ic@CQ~omevHx>??NrN&SFGIMmBS?vqf4s6j&Mt{X=! za4I=AFyZZ}^K!%3JmpbLxY+EFAN{xbCp%JiQ#X=%#@O?>114{-bT8<^Sx?n;x{62R8N zYG>q}*uK-Hc2?h0teoky=Uj{OMDmT%Cb5LOue4W5XUEF#7@MWPuIrSuNN2&M0Xp4- z)=m2>GS1RhW&4FbBe~Tbu$lI)b~|Al+RNxe^v26Y*e(&fIolQnV-~|RHYK~U(b$JT zIv9}aC?)Q)6+qIY-SeE)WFKh6)_A=KFw8cCX3*x43V&@y2odb&Az~NsidAJ6tbn0X zoU*4poL`_{N2rNv>jfk{Iu*5%E!IO=!_a*R?{mSlp&X&j1@%Tg{&WB;cdM6lg)uPd zWoLj>`4{P2Q*rF|gWeTJduC4pKUyn2!!r=-de6@RV@&6!H!ED$eHEBise-yBU^501 zA@+Q`i&X%$IF3d9TIrD3%;7rr8g(g%l`F^%7GhQuurnYr15Pm;nIm~eu`~wo?K|$M zv!4ZcQtd+5oWP?hB9?O=D<^ z@L{)alR^P`v{5kk&csF_f$PS0ie$vln0XWAs5g*+(x8o<6fk3yImSUnC;=~>LPxqDqkZHvW4)B<8#K5+_^Q%xNd3IPtg2+eR*s=BZgG8mjpg-{ z8+ZWsNo?&iiP?UgA>6<@qVjFHUju_8m+&ZpBvwwxkmb z{EAPpBn_=i@Z}QMmltpVH`Z?lXaQq}BY~%07*NO8H69H(W1g?ETwbHuT5QHj#5n*3 z6cBaFCBWT`vy&s7pP%8*ox8Yk^A76dTP5DTgbt3&JX*MxOYH2t!p`<9tlhYQk3Rks z?dAkUgT@w%0f7PzOwDj{afYM)UF`4eVB@R%`0!gF;lmFcX7w6dC+QQb>3!dHrET+ZazjP*fJU?V_I5<4O!Tvs$mzUVydWDP2OSEai`ufep zA0cbDZDFGBPUwBc*Iz%t#>NAj9PZ)d_!u{D-ommQe(>23@ZLARiN$myUIaDM_oBh3 z3DY#;)vK3y^5hX-y?BPF&z|7w>Kfi1fA!f9@i%|_Q>?AsgjvJvQ6+9p-#HnqO*q)w z!N%i9*xx_Eqm2!mo}FQyJ8s>+iNE>VpWyxXKR{GGLi)`XShNYdJKMN_@6XuY+Qiw( z32xoGg>QcA+qnD2TlnPD?_%x7dUXHxUI|^6_YK~8)a`)R!rgPd98k-RyTI*0B9H{k zS9GgA0TDN?vno6sk6V6Z#z=x>T=K@f7WJIodqe{RR84TUwHbA|p<$Na0wPWtU^-Qd zx&{omppiUE03Q2H=EQ2kCX6K(wIZN}QOEHY(R-@^Zf!!F;%v3mO&z`p5yAE&J?PlCL+gFqB#;jCM7;&%=5ok^tN>C8Lf!n@>Nv5-o&hEt>wDew)6M zuadTw0CWU?$$H8`HnCc?nZ`|sU^_^Tv893ts0FT}W7BC1Bx+<->A<}H;9!Yd&p~uo z#;dBu7{<6=*lh0bzU2DF_l);cX_^s-fvB@D&|{A3=TixhxU>K$+hRJh4Zy|nz$&{= zz}ErOj?#h{?lZhEfv%HM;`hmBX1`KHR03L*o6&P^bHRqbR;Vu(z_{@NVk{|(h6y@% z*HFD{vd(g9O5g%yIuAXsc@P2koNMYFQl1Cw#S&AahMqmt_t-ZWvLwPCPYq~*-qfh% z5kNRC%=AIkA8f`%+XQL|Eo|bZ{30G!##ZQ%YVn?KmP%Kd5LD8Ne&2p z;w3hKkg6Hb%(1ok48Qu1{|8%}&)|N|lK}JrfMHI#)&mHU&zi4sb#)%Bl_ATVd0kq& zdN)2Ifb48=VzyQ`0xS#^FRJO zPLB^G4vFLz#H*LDu(q~_ zv&$=d`;$-cv!DM0H*ejJht3r*TWeUfhW*_wJbU~QFP}ff)5ni+>&6Yd_wKuR_x*3+ zAO6dK#ho|b<|azUNf;YA4GWuac(9L$k2bKszlV*D4P0DaV_K|XT3f^4fBtiP_j})u zb_vGsg)Okw7TDX}#r-e-goE8393LIPCc`J6eu_JH-^52Be}eV(+h|5C)&lRe?zsvP zb%g;Ylt3(7KRfl;y=QBV{H=VGHz4U1jbxntaoMa z=H{k4_rP+_)3-VR0_eaY#v|}Vj8v=$?m)3T2wjKg>y@=ev7bk=6=-O+T}3cSnYexsjkl@10ba%y7=jnf$?$O5bIdKl1~bBXYJutO zMe_Vy8lSJf_8Pxi`~cQKDZg;DcmMz(07*naRFvr%vZ!w@gMnLQ$pQv(t(DVN(5IZ- zEnci_1s3F-XOD`47&F)Fj#YLqt4vHOPOoT%b}5w9qf4 z{SKeOrE>v(#`7g3@GA%kz*+XiN#7@K5R1>J%!BgmUD*yohs_;}d5Jf$#2fP^=Dl5< z?QCOmgu}K8E|v|(m#RcCYBph>mpD5*z{%ku4t963yjrsNHvr4c8avc=+H8-2c<>vAn*@>niE=3^uw`9M=}Q zvi0gEzP$HG-2d|*aCUkW!GlhuFJ{s5gvYd4}bXGukrH5^9+>ox8Zv& zeO46C=m%RvUoP=v;~{?Y%YVoHdw)c=bP)8;{6|c3k}LrNm&;4Mc<~gEAAN;K8(-o2 z>M|Jrw3~qt0b-vB+Z`s0E}Q=FLuy4zT@l6T916*x7o8+~o|~XN#5^kxn2mHg4)X zIM~C*#W_xoPjGR1hUL{&CO~-2#|sJUqbTM;my#`4pSap5W~_-@*qUehX_i*6~mO{IB@-w?Bq8wMo`;4D`{&W1@-~9yZH*R7v-GCuZj+hn`4i5M5 z)%`zXZ+9D8Tdy!X@cr-q2?T3wN0On@$i*^$p+~Xil91g=LI;G-NKSKm)J6#7g*aYE052v2E~h zB}}s9yZUlCS&M!u&_@xE^2s_LuG&OFk^^~WbafVz(KT<$hKlj6!^aEAR$y~@i?X~* z9Qj=XbY5m_7Wif;jW#My7(#$AL2(^aJ|qqldXuLQcM&lgDharGoSoMKoI7VNK!;=j z#7v5Ln-j$43qknQAU5dudCEh}QY;k(K=X#lrzF0{Kq;Y5R*C>1UqP7H1YML_Rxo0S z%^^zM#W+LjHvkK>1g$~kY0Sl#xpiho^@b)n(eXtOslWuno&lGcS~7oB7AT2itpIJk zf>KGGF+K&LkEB{4F21F+c%4oonQmpA3f$S}EYQSfH-T!hw#IP`amEd>RtLWe6^BDt z`+=8Sk|XFV*?A@^E(WZ?SSCA;(xL9PRz2pBH{*Y$d&xk^M<|&XUS{Bft%bbVt4WzF zG05IxW&X)_rndmHw=5nrdB=^u#5--mCpT~7?$tGx2M1U<+i()Nuu751djR2!({t=@ z@8aV43|pJ8aCLc!#i9+MwbeRkEF%+$7658{3t!*+GoCzrhCrJRPET=masngZ7ZdCr z8*<~&_yL^u@E!ZRdpO+N$Kl~2PS4Ic-@%^SVD|!q6S8W!ySIn!-5ner9^vftjK?NY z4+cNzkZ*}3KtS>6=nzMThd4ew#`*abuDPQo_Jfeg&h`z^c9>8!;P~VOJ3D)L^ynE5 z4^MG?a!PfRzT2Rtl?E&JogAOw;P3zsHy&f-(KDQ#U&iyPcB-@}P-o?Zwt04T8sk4Y z#`e|@j?d1rgc~-+`O;>UK&g%G?BoO|$HzE4IKbnl&+uw%8<*GD)f(jUP?1xWv#LiY zCnq>PImN53E&TE~zs2LHFJSEkZmi#q)T`4cXiX`{2E*Cu2@d!7asS?Z{Ez?qC7wNh ziHpl6-v8!@+15gZ<$7rRG4_+gLmV9(;)_4u$NhT`aD6pnZG9d8{7?UePe1)G;1lxA zooY#8VsX8^#Lo6M_Vy0&yFdI1&t7cda_PAH);svG|NL)w>z(((B?mg8a}M8de0+o_ z8ync#e2J}>n^;?0z`J8{V;%qcum6T`e)Ag@!Sji}(VWXltSG(=_4u_z;huY+!qD8()3>6;961u~^)| z(eV*}^3$K)l<(G z@@ayoask1l#TerimJJrYEC@r5bAUY!70QK(;B?x>!~~)z%8wP$f$6DSLMh!4=NjtO znRHB@UpG4Z?3E5}5)kOg&gjOjI8PC<*U;74p#E-^{lP$>6&c3Yq)tsj;6E*OY(>hP zxLK7Ln`9$^oDnF1k#fp#q68(}QLM129?}#e=h^ABn*(v2O&HLmvM4Y-Ge#TXdr89z zhIuxJ>2Ia{(W)>2~A^0UKq~ELI?Tu#XF;6J44Bl?)5p!shU@DDA@}$!n z9LD=NMkdY-XuV@vUgPa)4ejU*`!Bb!{?<3pzjqD0xrWul{?q8=u5E#XgCo4!+(DlW z&!4@(@$m`XeEU7y28%R z0Y3SzC-4D*pScY!E3qzZny_5Xc(M5kUw-`vySoQ?_IwjRUCvmnEh^#2e|!4Kc>7et zayeu3`6eDde1aFR_R(z}SJyKZH>_+DKvoV7gYPjc`;4uvZG3U>KAt^$is{B0&Mz+T z*4u`8=Ji&mBREQr4Gr_vjO|xD_|-3eid&lw75uQDMf?xgmH#j>z#hp7har5RK7$%@=Gm}Fv>u7A@vIbmTUE=8I2oE6_)c7tr@=ay&q!z_MPy{&GXgNNQ*FBU0z~;Zx>(OyN_T0<_}mb)?kZu{4an1 zIll3Y50e-Qf1*v!olI)O#n~y24i53~;UnC;|0OQ2;+4NY|NQ6p{PTanV!8oYpnBxh z!qfYV!-HcS9iQUfmk;p##Y>!@U*h)d+xXXi`!{^@>37KDS8SBv7K?_ft4ln4`UJ0D zZsNt}bD%X$iv<>o8~B%h{a^9%r+)>viKjb-+{_kOOcO3HFYxlkGwg1^!t-a3@#ft- z_~8$JgzcSO{MC0p!}ovqW3310#Ln%@6_z#s)LBM^CG>~h(W+Bk^Ugu}cg{>ds!4?AtJgx;|ZWUYPJ zKszM8d3>TWA7fi-2s8Te^x}*PjQpK@Zal{+qK)}?YevSSb z+Z^7=!QG=aIv7j#xHcc?*&TVr1_5Bs$yxsPj+Jv8dj)@Y_Dc>WMrXvXK4^{Hvsbp5 zyBbH@r6U}zg>niyM~NWj)*8=7wPM$JNDAuK7HlxoAKOxp*~mf$B6?{=4~){Ow|!-c z1sR&?h&&MR+`v1BF0GrJs~Q$|^GB4~}1zM=oY738Te zuJIWSnkLJDA7EaA%+Rg+U7#YM4I)Q1W#if8SxFMyU z=Uz-{oj6cTuMR-ZN=X+ZjI;}rA`dS~F!r@Yf)gt|z8Iiu?XxnY|5BzlrVhanJ3JC^ zbYM9H*VnjZ6a4%Vubwim-o(=m4hq(9U*El-9#L@8;4i1h{n;!u&1qSEq>j&L|;pFTbfBND+ zo^9^n{2JKZKf>HCgI^@oZAAz5X4cjwT%KKGv$IQlasL7S{Xc($?fqk1ErFZ2?!ekYtCru9zbG(kIK8;Q*Bg)V zfBxV94fno!j90ryxO?}VI1UR)Sy+o>y{w5;i18htoZ#`3r})4A-~W!s&tBr-=nU_F z^CP_T-Um^`Yi!w2JBo*F&|?3~@o{|r-~Zz`I61$@#Z|`#-})4veg8)ZqQiM9d14y_ z9J>d5*m(2=zx~~xaCzNvae0l8KmG)t|Lo^Hl_2b=bMD6SH_&i-d5OJ)13Y{20>A(L zAEOs`THpsi{1N`?U;YI*Z{5Ojrp~gm7d8vPI!;ecaCmTtFTeZ>4>um;}0 z(TUb3w1wend4(4*p5Vocr`Y)VE0{aJ^}&bO+1|xF@4b)j|M;)b7VGG95K=*aILRW% z$;lC(Jl?>w=g+XQ@d#JTj+^VZae91?pMCxdeE#`AV*SRQU}hN~&49D>Q#{)E8avxt zc=r4`&Mz8P;rBwsf|YV6R(H& zfVkG-t@EG(CVD16DEv^YZ&gGV3B*_8Dg8ya^4SXoe}nO88x9tvy0x2p#ZATny?(q* z2CLz-*s;j6MF%i|-k7sxpNEbks^DzJ*n*ivmPRR~?4{IswPa<)xF~br4JzYje;AiD zU!h5Xq7@L#g#&?YuhMPpghZ@U?`h!U`O7MGNkR4O>Z5iBbDc?S*<+Wx-;Il)VC*dM znv^Djg8IGU9vYgX9Cc4;R-&L1!Lw{CR$?X2aFOC}0SZAjA1tkl;mEg=DZoLXY1kN& zNIe)|H!<1NNh>+1w668YH!`Wu$g3hCaU@%>zyr_gMvxdv6XWWRI2$%lZpuFXJ0p9i zy4IBEruJ~m1|7}EoIB4pERY?g+?IMFBujewJI zI2qaw$K;-sf;^f^E5^-ElyU%70%N`8LySn+K)lM_8C>IYzHyONl|0*+$5V-k11k-B zk&Dj0b?KIC6J?doW%E$-0p#_t30GG$Zr{3#J2!9R;N%2Xr$@N+&O5lqkX$oantY0+ z+zgo3aJ`H%-tr*H!f4^Q=^@Q-fwOfE&fo_I3s?d{|E_!4XFCjI0Z z3={gi#Q3JYt~Q931bf2v)*d!r?E;H+mQ&YYZ2>qi&#IbvC9p0(81mcM*~PsF4{>t3 z#Nq}3tf5Uea$_{SRNmoGO^|@F|9^NQR$7hWSPl)m??#() zY2FW+S&c!2Gz36aS7oI+_uO;Ot*VBL^Gp8c@BifPzNU4OyeRqizy1xCmDs+pI7u&v z1+QVvES3w-PA~ZT|9;EO{St?uEOP$yZ~skEj;UJ{g2A}wI&b2;S1guuE-$b6=XXCa zTQ+znn3Mzl>%admc{#+`;GmO;grp^v5?m9W`|Rw3fBf%v+^=e~V!&Wn@?Zbw|6^lg zi#EwQTnbpzJAh?XGo4L2Iy&O#Uw&b+s<9sa^)LUzU;p|aC@FBJ3&2J8uR3T+onm%( z$Jy~QAK$-cxmYk7j4;OV)i>Yp#TQ@Vy~WsYrb#41YMgagYq&T&<@ET7_ix`)RVzOI z^fP9Q6@&2xpM3r`4oy>a!Rk&xva9q?(KSnsKYrl&=p*lsKhj#uXguNO`j#)h{u6)x z*MCQMkCxv1ikS9 z_K8l2*9(mf{%B0TPP?b5#KzM-f!zmyI;Gd6b%&3@(z6Dy!aW33{X;`Kc*Cq;FM7Y; zHUr}+Sp(sCk9}~Eo-kS<0Qj=Dy&_%=u4mYFnCy!8`dDvvePa(1*IHC` z%YJSU-(~tfWrR}T7sKAjRHt7X4^C-T#?e^EWHh1nmabZXvptA<_?!vO3L(hz0--go z>!_QK)oK-;X`;=J3;}}msg@$`c@FCZ%ERn_Nn->mA0oA+F&0N)>zrG!_3(UYEECfL z)7gUgs-+lAXuFQigj8nmRF5|uJ5qUpkdmsY`TnP$ zxVfKGbp|is^_O2E^Ma;Z7Yup34xUo_PzqSx-}C*OpSZfar|uk}dG*eY&? zt1JHTzu$6vc7@QIwz2%@fBid~yZbDg7AZVhfD-HMtQ3OQIi}MYM@J|8^V{#4FDi_6 zJUu+*KmYTu!LF@Y_PL@y>xMumMZ2nlrP6!l zIzFOn4cj~WTwLFA_~JFMzy32Fnt9y>HzDsRGL6J@adFJW*(q0-=QK^l?(Qy|Tbu0c z@AKl-YqETRCwgutOd-;#8~6AaNV+s3C3u_2u=u@S?=dn;6H^jD$sxm@?nruc?`=<{ z`PktyO!Rf({2z!)qU<1ce3jnek*V^CWZ9Osx<0_h`_whlYpLBe6qEVrwF@TepV|(=in!rDHuXY$B4QGBPEJ zA&gHDpB*8i4%L%V)(MRI1eX2!`I1DXpI<_-ZYLN)Yb+QPLd8YoNu8F~fk#h|_lHK9 zyX$$=rxj%g*MmOQg+tpXX+Q$XqTgG3;Nu^pJpQmQq9*eJyPg8HFzj~yBa!AbB;DoO zKRS8pCJ9Xf1b>unB%mrD%m`0p3w;3L(#v&&mlP~Tpcz`E#;7;~y}%eJCThKw!W>SF zZWwz@wDBWEx({vY`tgYD;d-ryh}a2_jS)Wapy{V5X-fK@jSC$(lZM_u0QfRyaa@Rt z*UOl2bf@4jrR3M(73k-n5CK51F?a&$GDxtz2OFYxC&9+07V1H5@1B#eLw^jWEQOB& zsdHHG=)5Nr5}lU_A&}N_e{;*$CnjbD*6;eE2HgmW&O(~GGZyO%%T;vH431LVP;Z z18XCJ`TU-rfBBv1vZ87YMON_a#cQhg`8faJ42ge^U`%Vp`Nb7K{`{7CRb#DZb8Cyo zhtHWWn=sGPrX^Tcn#WB@`i_rBC%pOT7w(r8opEe!@AAp(Z&*~W2jD5C9rlhW=kcCQ z2~JK=`Ny|EFr8OeC)n8B;>)l8g;nFQrtMdUbzKZ%Jl1sJ3`z<9D3{G8!Vh<>z01<)`1?F<-W{ooD~x2^)J)Ik}w0cF7^w!$#SWHAwH+oD6B3 z6+iv_EAKy?&|2s^!@=QG%JDuQ&+bsdGAuO1T!L${w#GV3k>z+NIKRB&fByatZl-gT zDj1K4eEIdC=sLsM#W|if?C8l4-ddClp21bs@b2AvJ|3N*bVh4x%3;aY{vH=Mm&hA| z)QT+2qxRT`#v#r#o!;@`-CJ&Mu6X+N8Cf~z{Bq7@=Mlf3%y1_&RIGP0U5yr=GFKFZ zL`lp2-3=#4Cs;4oKX}T`Yz1nBF1GpQ_Y3Ow1GZ}^bIGufYz%WGhH81w^!A3Ts@U7z zN9Q?PyZbzU@d_Q%Cpc#!+DL8-7Uyj5)0>)%r4F~=IfN21Q<2VLu^zJrS(D_rkciBO zS^Ym`_-`$Qb340GTw1wzTba57~nl58Or^OKnLaB-6Rl|%;LW}nWvK8@Yq zQ_un{gpBh)UL##MZ7mV?kP4CMujzYio9HPW4%5iyq{tyXe9!Wv!!v?3A$mpxA%YGy zIYjvNzvw}r5WxdB9pc_aX~aViAR~j8Ou|`zMYQdF0;<8DO!Zab5mbmiIOmU4ya2Br zJUqP?(MRorfOYYU4^flzE&_!J9sa=jhC!E+ZcmXpag$mfHpC4#Jg$5IPD7`ewe&zs ziFGmb39qnk9ocJLh=?G9!Zc}R9B(Ix4i@WYU4O-B0f&^Dhw0>S5XwLN?WDa8w;LrW zQAa5rq{1QOq5uFO07*naRQQDxecGjuS{_U;B_7Nq<6AD)YIRQzMshb)beSJQYy)(tV%xHaxG5-jJf- zltL2(j|Ua2vq?URvB?EKR^O%oE8JJlIVYAKdRE%mgl^-!jx53&WCWlj<9h8K8Jq~OHQulkrB5KSeS6grL`nwXzlv@ zhf|hyhex9GAx;kYaCRHtadfAMi#feFZ#yz2xVpOF{ZaUQfnqq?rs_05y*&?Fe4Dy) zMt#2zU``3gWIW)PpMU1)>^w?ZB*XD07uWM3P0_(qTSnb|+jO*Dhp`=6!0z@YZ{GaE z`Q*vTO1nWB>8ZQH*Zh*?za=V z&ZL)xcfk%&Vkng3^~)#VEdTiD8}9DscrTHvVE558etdgE)x4u=x~S!K;5(FS*%)Sg z{pD+x^LzgJ{ZHI48yp&RhAOxCpYPtrfG`vf6L&J{TBNIacCg16uU>F^`jH=h{)I); z(HhTivV$(S`TGy=Fl~#JhR3^OcE$yn=n!<2Mb75t7FE^qzyJJ!%bRZ?+Yqh53es)JwSCr+D(RhLui7bqqYdm*+T3Av0o#X}5(@P(G1h;E|kc1E^ z6RaY>i$n*IS`eq!>M;H7j^E^Fg?`s--Pg4iEINka`3mTztp9e1<;)f;G@ci!*Yy0e^m-1-`0uPu zde+E7y4VP&mlFt#4S|r1n}sJBwRhg49cYnSGehbim(u3W3w+ceIpUN`JIlkbxQ0ST z%Mxa8ia%qq>3TKCxwjt3ka&piCjmAQB_<-=7cxCxh>VR3;3XVfVeKSmh(HS1pyQGj zB?B`rg}{14V*CTC7d9H>)}Qa9M5uq4VVZ`|iSsI4!GtyD=$X^B6$mLJh_QW9Y$}u! zN#oq7+Co5?-er$~!)sULsV6b0MfXx|q`a@Q%({Qrgh@RJ0lHLwZjpB~3Nw z;_?KG(0Ez$zdyW#pO5J5gLG<)gq^e4wnbrh zy1&Kj?uxtF0+$MLRLTGQ`_G_qycE3_Sj4n|vj*W>O6_?4;(%X&dq>w9q*N$f(0R@O zeETz7n;RTF+G8{<(79$+)!f|8xV@WES1UG#IZqz1`0=NoS=BW{D0Du?$synU{1J=n zjs2asbX^}>Dw&7b~-axlgihZTa0+bK7*Ijgos zSc?{h%~8guy5!AIzwq;~?=UXxGsS2VQEu?@d`8<@tT9NXLP}paGU*Yf=EdO_#yWm} z^M!8|{ir1fh!Oo*6Tu)cb7Ht5*&ZCq7*P>j_^TWq9b;m!y`+Nk&_b zX^xK(xZgKbqyPZVt4NmXP1|J_vR<&RSQzFy}QkmmtW8r#dN;JbOuF- za5LIUlhIOUf+tTNvs_lZ`SBNyPtIwardd^NZf+xs30Jck?+n5jgl!SNBiDjVdUp4= z$?}qmi%Wj}^(|dz(D{(oc((Q))A*8V*5aMTwhdidp|A`}&GyEajq!-vn;T9~PZ*6S zj5qfA<--;4&+n;hj+a>kRsz>`cvG?ee2*uGj~V8kOc?HNZ&6Bd_~a$?%5ghuxtlv0 zlhIgW{eZx@mQoqE4|h4(+b5S6+g1!WHo03Ym@QkLY(1u`4MJ87ikzaz84eVt?YO=? z=l$9}WvjVnT0)~-9OS(|7!kdAc`!7d30#eZWXjtM`FT3*=~4MY^+`&yxNR^n4t zOd?Sdf{8;D&yl`fA`#2}VQ}DsCOBY=km3=k6N(Q|F(Bv%x`dvc3%^UiXsz*xgORMN zgy;cMN?``JM~CZ1dk&vKDJk_Rd*JxTuL!w()F}1?x;{|TLwoNLN(I0jBa{R+Q-mU; z(BBE7j~=lgPz9*`0D!nSaYRfz_mk}5G4JDqdZ1Usdo(gkLg$f6^ubLiZV0{71AA?P z@3MHHqa@ysOcN{3F5uhCT`aya*de02v89`}Kj1!bRZg zSZ4$tTHdT>Eo*raL@k)0&s3z*@!n&)P^{A$i?tr(997e?T6NS-8#0&T!G;$%Fwysa zPxrJAfr5{1U_xzN*C`9*-@TXbtot_cx%JE z^C5r;*@9s4CsYW4oHYz`&EvfZgIr*{2G_QjYKf|A9!Z6in#wq8>sj31^X~0O7!Fxf zZMbhK5V?vvM~PNBtE!=MfYL}^vZxx~ADtn!z*rL)X`*GIS6G+QjFS6B#qG_E%d5Ni zY(Wa~=9iDWzgW_A$=3m_F@bHA3Z*qjM}|k3hMTJ?K4!*@6a4o3IUmkfbS{lYkOoMp z$udQm=L~X5p#`h^E0(J!1U)jtiJYH)KgY`gj|fd8oCu&MQ=xF#8icpx!XfOEs;c9D z2QnLSezl-#?`cej*6^pVwm6*Zk?XLxI_tQ-UvPiF;`02AwzY8{Nt7OOem$o)VO1!l zV@4wELe?3&wjviTrOr4#I>Y;LFiKq_)PTFY3QLQ~GE}bPS~p-U);0)lIM^L?c6P(r z`6UpWpopBN6S#TJr=Nbw{{9YSp&4&XxSP$nzFo4cEcME=vo+wuhmYLePD9r*GITz` zIE`ssC?fQduB~aC8l)%F8m(ZXC=oK_+wXp0dN&6lQA+a3t4|q@Cd`*Bob?Qb8+69g zG@hohWKtopY;Epvd3D3L-~K?;bRadl7%|#B06C)Tpsrf1HDtL&WT3UC>uSb>oZa0W zj*gD`?d?0NrX$NT4h{}^{n^*#!ws%y@2OTz$f(491MAq`-l8l9{P^Rq9G{$HtUxNs zV6;s++6>MfbwieAWEzTGgLSmFL0ZGpS1(vB7X0w-Kbg&@c&W(p0pEP{7rYv9dT|%n zSpo}b+K%PC!qjt~J$Xc3cYOHxmS5j}q%(rfIfN=%b&6j~4`~n#-$Oe){Pbmdl30ctYnT#b^sJM_k`FR850*9j;lTT*Hee`#gEH&*r$KTHSMY za!g*7Z0;QJ?&OxUn}*6}cwOSXMk26nL%W#qc&Fg`!7hdNwAG4by}%g9vuCfkUs{gO zW}IHv)V{=^@ls&wimq8O%q%Zn9Pr8WN8l~D*SA>P;e_Jme#Py5%k{nE>SoEy=LbC6 z+d@jotf@JA{~PDWA6VSqG8mTFETgHL*nc2_ya(n2K9D)V^&zsc@sO91weY=*l`3y3_vzmXo6_YsSKKylLpo&MXDz7_!>C#_6x4iOL9FcF9mJ1LBb zY`O@#vUv2b`6+sUY@H71P)62s2xqI%24QHO&h8(b?D2Uii4ySkr8CQe4HaS zTu6%{y|eUky-(UqA`o`iD1VSD7_nQSX|13$AkdNh78n~-d!+G+VB98wb+r)?zlQGsNR-fZM5r&7D=kt^M_Svt&PvrA*4WOy0>F< z4yUJN$4o&U~l)6kS97Z>+5Ss8fay5OErmN`O#aRzA(U1P#t;R&t^LSx%d2i|rD+eIc^II_)>!C=f} zm@_H_tJxLKc`}`0twpHQmaR!iVZfx`D;3;S4m&_MScDHx19@?hDng%5VVA;5o7?FMYeN$(Z#%|A#pf@ckgFCSN_g(>ru^{cN3O1?Y;Nr$ zixK;~2W;;i(i*|(`8CEl+Pa|-im$)=k|+CHcvG{QFPP0{Xk9Sb-sAFa#qs5W+70lk zM9Mr!KD?vrR_tsReDl>ShK1zr_8QYRIM*^L$DCcyxxMeWt2~`3@G?W9F>OOvEy;Ap zm!H1i*}*2Wn;Y(@H)ti<-q~kfb)4N9<|~1j&bYc=QJYZASvL(ArysdE`9L+Fkt@N* zW{%Ps+k216vOHj}2y&BjAT+2*q(VSCL|~iXzs zsB5v{LdH@^u|9`w!mUw8_<&~C4;kFB%wtMZh+qklDD?Ov5zuL`<@6$H*?jOy@jkjG zt-)W-gZ__nwJ8{7ocgG8iYOPJQs|a}lKU_ZPLI&ZczUgYHgIM&TlB z+B^KXL~*7;T?1+VV2DEyux7cW3=xuvT1FXi)3~lf+VF3c_fg;JFvf-2GAU`D0} zmKjfS+~{Qu9t+kB*l^Oed91q z*FTd~l1yjeBV5>wy0$|^HcM%RQW|4AKw#RC3RX&y7X?DcHlEJYwJmLDFs4PToU#l} zbi(S?bahSFwFs#w%N!*&DN|&-puII#ptFoz76>1@<2mDL8yDIKONr7sN(!phadNTZ zN;=xQqL6}(Va}!$C_45susWw+)|gIlzjT}}XRMsSONq5L21i|0NUa%<#z^mIj6nJh zyrXIt)aHn6u!$-L^evY?ESD>)x@IySarophqjJK2UeMNas(Kz-4T%y8AvIct@vsK) zg0}8Lu?~t%XGpKGW`%Gbr2_M!RYs;W3=%Cf@RDV{#2HJLYsSL?uU{OpG0GShn%mRg zQ7Y=e5ex?-vZ$BqtfOlK13el~kU}B6M@x;sA#8)`>QJC(9ZKe8IwzBgR#=*PMV4!B zZ>H4C1=G75jBP2hoVu#0mMfNvMOe4qQx*kzQP6fFQzcbsh|)WN2!S=0GRv3@3YPbm zG))5nq|g-kfYc#QOVBdNd4!N?EwF7^C7Z(mre1M(dmZ<6iPQyB=aF`|oSl5+#q&do zBIo@4g6V9|e6d7H*cuJExjJVyouZV+d4ZBSGAp7a&X6gMQi4`^v=X!rq#leYM>|Lv zK&!$sE)-TOia{3kPT|P24CxFXkKVIbED=I79FF<7|M)AD&0VhVrnFthtEZ2+o88kj z9Zg+>wQO#T@Lj{Z-+yDiT%dJErb`Cn9i$#&k-;g&Su$nW9xJxT1rUm}GNm{<{>b_H z1zHNM^Su1zGoCzq$#675$N{(0Ic-z3IVt(KKfPvel2I-05EOhoKH=Bj-cffBm6bT3 zG1)pq=pmxB2&IrX3JqU=_Kbu532lAPYJSUVwG4j5XO~D_QjRxy{>kTTY&~YxT1;I9 ziI_3uO7P{Uuh`idGMi1QR|~qj0${wc$8=%1yzA%~BJ(lG7`VG2S=iYu`RwHZikA29 zKCoIX7>~zz0e6cTS-C;ua*PL|1C{BlL3qQ)Fz54E&)DB8xjH@J`tp?FaKOtKuUNJ4 z+tCd-3k%s0sWdBVc>CcDg{72^`@2h4%R7X#>^*yi7n&z8Ua`5oO|rS<0a1}8LP1g% zNjo2Fk0MhWa-50eAQCE36 zqn^k*`n68ety!`)u1^mnh#^#vA0!XC#8}33=Q@=iHj*A7_drNKsF_Q8(^Rk&7{tzm zl%R2r&L)j%I9y1n+XxVC)bjPQkzZ?*E#c3?d#p(>I0AxXzVCu0B&CCUZJnX(63mM2tI&UK`Pku z-V+>{6rF3SEnMC#nci186rFXkLz0Y)bc&2U)|e2WIFHnlyhxxh6p~nDd!1pHX|$e^ z+Q`%ldnZx3$$p{N6{2gzWY6iMJP#d2%i#1;QdR z7FLaAx@b7QxZ~}IbIz}3RE@)U2`EhG(J~KAyD=f!_OeftIcsUE8mSdUo`KGKgLBh1 zG);{&HG|<0txCKVNb54kxRk(*%4h+ zqhxrmc|Kq;oX{D^WT+8##q8#cyd1Jzwg@kn3`+_naHi(;_+vb56+&o6lPv~CiT52_ z!<@-Ruy|XnBxaOjoMMn?OokbY*$wyU-n~cZjPZDr!@~oHMUH95)T;%<@d&)(7K<@9(2@iIN)UIws?iyBoo3KBuZ2-WPPn@ZrOIrqkP4*eEH7o0NkMybRL3JXd5$ zULNl7&6m%Rwq>!LGrOO2a(d3m@iEpJq{u0UWAfo9ACJy>{Kz3t40DAXYo0yXC6|Wj z-4sC}j80B2Sk)c67~p)yXlsvhw1Fc>WuYO2#;~_FL}GaV{vG$XmuLy&$(XaNJ6bCl z4u@<%ddklJ0mWcKbvvc&TC{KsGT7hV#dbA6zIn&$e#-XN27_{dRGOyqENTaO$RHcw zWsdb>XQ1oY*vNT#xQpu+{Py7k%f*bt!$X?RaW}hX|M63{cAwDRRTRFX6BgGQls9Ar zd~*1N-R%Ka=SN(goiZ4dJbU>WPUd_#x?tXFydEHAh7(YCHRFMz={lB+Dbt&41RdXe z{UyV4$arIe!>2DnWdV@-Kt6`!+4q>q$Fn8bPWD!kBGF+!5-?FtVIzO(Lbh1SB%k9C z($a*lq!2-x7hP7vX9tq1FNl+}m&FMgGTPGn9w+*A+C^eBxt1gnGl65F1j4EK_aE2; zLa!0_o)8#D@Vssnov@(jpE(hvN~~puI_V<=;7qKqTjP$z-o_khB(fqHiHudCtl|b9 zKU}2)KOvm>5iz9*F^%8<+6U2e{QS`RE=Cry8a@>`8Ea`x_*{arh7ppX zRHzt{S#N`poKmztSUD|M6~l5sHW+ZVTv924)fr7|B4Axh9F$UIS|gmt8H+O}Fa=uS zl|ZQ+T&M~+E?7J{;_qcllgN;IZn_q0EjlldG7p+JA@N>fjHhX9@KEG=NE@rbMmpzc z>keZKT1&DlM`;!OOq-6jF$e<7s8oi~lDsHFVTg6u)`Zl*3R+016xLZfV=>7TYz9Hw2-)CQ@1V3>T^K-+uE{oq>2pYqkGPdV5hQ|6NB z74Tp_N8NAIq(|Tvg1gv~JO%Q8y=eu~(PN#!SkJ1lT+b?g`u&{WKU^_ew2t8uyZ`_o z07*naRCqKl`XvUbK?o9*%J4F2j+59TxI$PP*2QR$1?JC(w%wUhC?uw{NbAXDWMlDo zCon?djD;*@3j(5v=I2TVCe1pu)RAdaaSUu9$V#c!fq?^*2%BBphoqFT$T2*RloFL? zh%S4eDb@5Gg3Qsy7=cIVf+vShcv@O^GQ;Mk@xkxEQi@>3xOOF(S(V!p`23$*L9nyP>TvKQf*im6|ZB5gxXcrBe z!vQZ29`W1n@5uCkt#O8z9kmIFcT{HhvOsBpz~XKAygU=MO^bIX%vfhAGRdQz0YV7I zgB&G8_pw2tIeffJmSFCF4Rc+!|txV_A1J&hxM(jLHS0 zBBO2YS*_-HAGF_jo-@of|42m5rUiIQ``CX{B5TU?v zb7PY%%NY*~{`}RaNEtki2cu2uiJ%w^>6(u7vlHIFea~V!Lx@nnu(7qr_SQDu!*HPa zw{KpMXM(Efcz=9_cR9uhG9|EW#o5_MtPMJBofT~F?6J4EhZdgM-4!pN9%6>!3|Qn) zNQ*2pGGRIX_@3o*juc>wWp{s<-Q9hpD(Tveaq0QjuV1sjJ)){APA_gaxw-{oSx%>1 zUYtdz6c`T2Z0+n*)gANs9Xnf_j7r5Ib8J7`p{?@JjN^LBFK>^zxw(qqMlzagv%7zY zF2*GJl((?`XqUfy`HWH<>Q#dlmac6$IX$86T9nQxM`QLMKV`XWQQBjT$8;-{@a%4l zsh4wpIsZVjoQ2@kOU^IvFis%7VsHNmqpf`qB~t3J9$ZVAmE_uT^zl7+Hy0FIaCmUY z`OS=*`xRd1eEp|?rCzQ0^s`SvNp7e2sA9y{?qj^vpaeQoj64*| zp}ppCZ-=c(!NvIzCnv{bdB(xB=U6h1Pj0!qZ)jbH&^dUIZ7a4$nwL)>AHf{d`VW6Bzr;`od%dqf^wNUxg9p+GLiRB2 z&yob5i3F&}CmU5lugo#1DlBnLfF7Fl2SAj{tug!@qJy)J|oL7EwK5m7ZOqB~S- z*3n;--aps@$-P8Ha?B?QYa*5CHN~-G1ws%Dsap@UCRhLf>U+EdjntI9B&S6p1)a&dLbY__C} z`Yvw_-i8BRsdWKHV6g+sD`iOYB7y|KbQarok(rh#snA-33;G%9Jiaq14?0t1I!6%t z*n8JuO-R{iIs+Us%gDT>5Q5Bkbc{|4m0_j8_-JX?b%>Rt%rkrovXx|6h7cMr6xfcY zZE)6+7X_M(OsK#Fdxb~S+74?B`JjllXJP7E>#%i)wFWiN2t_Es@j(-2OiNo;bgPPT zG(qJhN~=)JV_RHp=#0Tz7>+U&3Y}$vEmxA|d_gNkTPv9Y;LQRev8<62MKI_g!2v4+vu zQVhbpavn@;Sgj0g-I5nDoD7h8U^lc1dOoWiwv84nLPbq%C|1*2Bc-6JJ19#8s*e<< zkSLkqTpbMYMc5!h!bb)Ru9fAxUr)K6F8Gf>f5OYBdw~TJE&v-Jj(nGZju#=7DeUMkAmUsA%&3Xm^Vz zS;wYdaCNbul$!0W4KA-cyv{&tlv07=)*hj<$jnNVg+j@+icyKlbF9+1RNN^Q zD$gmMMR?22%?+DlO*6lvs+MGU4)-?M+}g%xIkVQ#3QcE&RA4a35Q8F(LSRe*V;iKi z2xk}%OFn;j04is?3YKe`&ha7xpCP>E;^LGtGa=o3cT15;wl>BHZ`c~=eDUglwzJGD z%jxw3?Q=}j+)E{b4pe$_X_;3GtZ7j)G=JFI81m(-$Jnl;brRtXcgvRTtsw`8`*>?< z>Way5!1?J7v%9;V7|C?O|* zwwTZFXgWjJu4vofd+M#FX;$1^UjacbmS-gghlh;Eo4BswtIwYC`q?hin=7QTl-jU4 z2;iluD=yE^X{uGo*hOF7!zWLX0&Z`vd9=GhCM|7OV@yXipHgTTXwBW-4b$ljf>2Ac zxwXg3*Pl_88-Xn=;pO2YULI~^sws$$ap94^p;_H?bA5*Cf<`|p3SNKu83@HIMpObeWa!~GHUYRas- zXL&!zIM4C%Df7hw=b*?kp1=Hr@zy@L;9RjO}l85PWCR~#R`qggGPjD}1m6Yi$> zEE|i;N)8U6vG?dXx)>pZ4p~J7!nK&T;`H<*x7Qbxx#rQ~6Of9tt6S>M^VOGM^5p4r zjDfDLDa!#xrr8_~=rZtK#qV$5GoRk^{Ml2UJ%3KMs##VGkOEzd$+H2&tU#zN1l`t< z%Z$xQL9?21eDs#Ct@-9pUy~Olmp9iSG}}8nw8qnQE2NN&2N|+-2&b8ha>hf=+35#9 z9)Cb*nkUa+fGYTScEjauMN5uXS-?}SWpkkT{F6h3TXJ^#k)~eqmv6q}(W6IHRmB%y zeNA2t;=Y(<0uPGO6UOOJlW?x|e%>Oi84**iJ?z6rC#onZka8^rbq<$mu@Gy<58o>R z5Nnj!GqWTDXRTRIvNvK@O2qTer^|>?Gv(s*_(+n*+rwfL$Xo+xlJ{_|JB#kJ-lqb* z*zk<#G!e0JiWpMECY{b+@nB%q{;cs37Jf}HBl?ZbCwiOot95Z(53M7U`A~bD(7SV@ zml*_~Q{O){5YqEDJYv&17ORH4`xR&BQ;trqnJ*f;&f&ZaB(?!>B(AY!!lMTYrB!I& z0Z1*uMV)B}T81{KT38w%48Fba!B0|z-$@??@-m9Er43)WKR1(^{P zN|H;-KzcIcf}?=3h(cpBMJFZ7ft89$UNEg|Y}2810XBjxsWHBzts9hsjm-g)X!9k5 zp^0f)tOFG-pCLS#lM1xP`i{*qXTF+ZTZ>e|TB;NdsXcXDLn}j?5*t$30<@O2jRWh* zge2Dztv$Ld=rT{c5_D~YGfSK_Xer5}2Wg=sbra0swa^Ha1;(HlBh-+_+~QC;$}ka? z2pR}wk(mpJq$=^U#CwB~4xI_4bSP)=KF5(GM2`11FvhvST1}=4lq^8%2f-F-ouRWF zC4(#=cwKw6&{*$7@G+K1se{pmBaE~2Xssy+CCTN%I}w`(C|qo7(K^G?eRW7yjpO`w$v@tF6=I8@Y$C_sc6J~dF8eOnAnsB^WVT%DSFR_W0Rtj85 z#pQsn8&=-1J1+V3)e}UKvvei5jiyCog(em0%E&x8+p=6P`2FpQ)$|HeE!iCx{GWgO z2AN5go#eyilBI>(0X~n6Nlf_xnUW~yXuLr=gU0ZeFJAN2*RQ#~pEH~{oZqZM2T7U5 zy;LEjWj>#yq~+@BlDmsjgf(OW{`C0^UObwxsA?vir)p|iuko^o{hLAySFI#ny`)~v z`=F>$iZ5O~V|!GvxUXoNj>#|!_KnVPes)f0I$UR14ClOi_m;X@_3LeKXPej0pYZ(A zHf_D4^A)4qBesU12M7^$&=TgeTNd+aC~L8f(PV?yuU@gcwaM<*h~@Ma*VQO**xMPQ z@)5`ooGlkK?yfI`TLhjgD|q?x6Sg+DP{Oe>D!4vB)yvuRo`A8%PbK4gheKmPGgjK(5+2+k4uo)7QdGk>_{elcfqaK`EJDfjaS zE-v2F^^TOF8cq4rpZ}e+^B1|L8&I)iHYvEi`pDwug0}B)y1=;|%g6gXI+5X^cz9fc5?7Vq{`Nb*`05*st6$I0 zx?((?5iu+`4Sh&_^VR44=G#9~mJ_TkFji9-xxemjF1Wn@z~cUn(i)z>c!4qnKfim= z{lkh^Z{G67SHC4C>DH9iQfNtI)pfzTTk+$M-?MnQ=F7LQ`18O2na!r*>hca{N1VNQ zO*KA1*#fPL%wl@1N?09ve7NQP&p*?*9p8QTd+PCo+q*eF7QA}>IrVr-QH@AQXG=aW zM`aT!_FQ~?&&9`&)K$gv7q1A>aB=g7Pn)(oL)!wlGfEk(|=cdpM89Z>>=G$;>p z_YO@`nOw=(G7X7vnXM-2Z1KtyuFXGFS-v;8T3GVInKJSp^q+g%CZ2S^nN$52+)MtM z{DNqTQ%w7BrcZuRWs5SUvQH+tOc-1p_8>f8fS~BTr|Scot><>W<^9K7K3qJo*?N?+ zSR>QIRvA=M_?$1@d5_fvg*6nICkF-vMoDy`O1Uag;y2nxMQ~o)!llkWvT}21tx-W( zG>hOik#&e2O0*FjA{Ir7rc@de#4TZ@b@pSGO{5JGs|_xA#$|y`;ICe>3(IU$aWJVF zkHoXm7_l_$y@LoYL{^)Y`}vB8#g^5!#l?iqAW>d_9%j{6He$3eE-?_37x1slC%rsP zm4}h`1-8ywGp#VnfO3qgf`i$ZLd(4_npY`&i*83de_(13`P0d7xblBx-E_S9&DVTv z@2JL8dQ-`!snpZ%76b&-c=~Jj?VIQP_N$key5xSFF!zp7O~IB@e5ClvtV4|=P^yG` zOxP58aWvy>GU9RjNKL`{tm3ph#H)%vNtYr730u%WX%#v;y2T|_1tY8Z{N))o_Eah{ zs|%{no}r5|A<6(HdCM(~#_CAdIX+xoQ5!{VG^Ym#w3{`{<&r*Go}V3}>KVP40!#)U zHKnoKUUm4sWpD>MJv-&(_?Y{uYimbTqUmnSK{`Q~>#JA0O;Jb|l^@Ax0Te9w9@2PN*=-<`f9 z61lwm$ZENe!#^pWKYz)|$une-5|mEdU*GcK=R2C!g5-O&DJW+LEH^vW>-F9nd^$Vg z=;Rr_PbAlpf=F2&t}nU0{>W~jeN192_;m=>u`-|V=)`pDyAPGK}JUOc0!M_gQ9b91+#98D>z z3BSI(6njGjMr$lN&8>v%tB=eduKDcc8UOXa{$I4c<1hdCk&C+p^+d7u*C=%-(ZeYb zqoXpKH=n&Av|B!Y{FSEJ@YR=JG8#>|xnFSeup(mFcGu{#5bZ27NUfve#j`U`4kuh+ zedOcE3$!(yK6{Rfnupbv#U|iVLCVu2Dtg8iK7Vyi=(pV6eq^&+^7R*A@b=9YT;Dx# zKcAC|io??_+8F6#8x+dsAZ~+?-HY>+N4}QK@E5^g~si%pncQ@q*0blL{yb%fvu|q6BOf znY$>=p(-pvWe17Go>`RPGXo)Uef5FJj;e&1Le|450Y4`DGlqyt9no1#X{jqKa!;k0 zjtfo>$2>nj#)qEApYqS2 z-g9&Jh)$NhAA-?Trly1^FJT2(BihBX1{1}~Obsq087OH>S=RF2_9ftW8cp)`ZJGlZQRC);4)@0?~SiaUS%eA|cTVMq|tCmnY0d zHNo|HbB&l77{wVUtBNxfNb@C+*AG0BIQzZjyRY7IjioaNWi3%XxlhFCDU?FD741dM zm(S0b5V*U&!cp?_{3XTo6o-*6M*i#vrxBx}(uu-t_^1@;2ZuC^6%W@p?2_W-&DTtx zozX^v%j~`A*#kyFX*H>9d6zteP8=W3a81LzhX<}6mXwF5eEz%NlT;x?!I>d9M(pH5 z->})NNm_t?JsPpu?6|nRWWHKq$1{HSZ~vKOOO%sqZc9s9ibQI&SXEDKi)@_-T3c*Uu-)#s`uLvZ{WabPDYDIo`ErRi7E_dTUB`zH0%DEP zC}mL?ZfkZ3`Yp$-Ya{?gLqbW(3{PTyO2;M{T6gse6+_70N85IRbheuEtwoS*w zLL#k=E-=<|aCFMe%{`Y_ck=hqF)B5il`!n%x}q3OpeR{Au1UINR8^GagtDCS?$?ib zDB5F9WMmDY-_bWaYFja#PElGDB3M&X*Ckc0sYZufT;1dSHAIgkQCh`hT+r-RY&VaL z>yo3xL#nc-tj1J59GsLGTQOg*xxHVYk`#lbNzBGIzHeEtR~W50IX$ANYHn`t`FMSc zvL(~QGdhQadytD!@0gBC&Q4}5=3C|u_sk|Ee)rvPSZ-GQ{rg||@%=SEmF(6HtUDB9 z(Wz9RE;MgHd(L)s&&|aL+OFZtFTZ9wnQ}j0ay#F!bDEG6tIZl0dz8*Y@Y?g)ixaH& zTz>qOtIJC!lLO9QykN8ISa*(X4^h{-fCi$YG?AC*2k5Zl_U?km#XT?1Px<<*ubD5l ze7Ib)*tDo>&GVN%ld-3WB{4-LI#}(`u|&oz>50J|EY3a!f_v~d0Nqbm)=z(D4+@84 zMjkYS{3gV^d61*O%D3qxvqRE!v{8C4c*$0!%U8i^mZmR7;IuF+bH|7;K|fWg+orj&tn zL8%mVVM)NQ?Qq_Ss5|Rf6-sithSo@mR90ikir`vyotLUG58i~3P{znKb=K&_)YG({ zaZ#d8MN-)nBRR&UfZ@x_8-DrWKXA>OvXF|_SVc^O!$Cly(V-{wP}sz?(_=h}%gc{U zrW1}&PWa;Um&}(d*@TkG6Q{W}$&t3`Jd7wG6bf>vh-L_$7_8O?J?vhGzORsnFpcoE z$n$+EzbSd^PnB(6yhD{8p9Tt*%8~+|3o3>fVx2u%H7RObH2m`Mj)Q5#iCD$*e zkfU>D!zfF`xHcS4EYFUooF0!Dm4^BJmb~y1y!i8SsEK%G+g7X3(w;OZ_B30Tr zE`GeAI(~*#TNJwC9JPex>y?1FW>7EDOrg5`E9RcfT;SDy`8pUB~6ktsF$ACSdsW z!v(GXi1XQ{$0$mpSUgQxfYN;b{Xek;3a!Bu*vjy@-f{nzze|Fm))dyV+pbux zRt#yNlktp)hdG<|n(b;yX*D`)Hrw9w&wu_vQUc(&>lKg7c|KefqtS@q;luk&(J#** zP}VY<&ZtIHx;C)5xF#rtb3G3a_qqECqw$o<^oYB=1v&;aj_tM)n>1VEx{gsj;$glZ z#yQv5mpJD#QBiYvd`ce@&0>X70YgvMHUd%)kI=RxCb+$Q;QIEO-glrhMq3UJPSMJ; zS?{vtoFZyR*EU#VI5;{cD2;cKP1BGfRAmKds?n6$>=ZSSzAnV()u1cOiJHo2K#m5iyUBlO3f6dA98H?qH`MRSE zlH{6VBH)BUjvh_m`Pnfihcj+(KC+rGIXgY)`OD8(u6MYgh}gX(P5VS5P+B;dl*IOt zo5x#Rx8yuX-pGw*R&=8qk#b;IfLfdKw!2`cVM9sLQ|%raLX4sM+p zY^JPTc-u~?AJPmRVC?Pxqh~|SX zA>Bd*2uEZ{Zm{7UPBfH2R;AVcH7Ava<%Tmb<509F2A&8kl~aD>rzDgVt^&Bl(BP?( z;E5`iZwp&Am?Mi8SpN%^K2U4J-=zU$3?L$;eS7n1sxf=jDVG6Xo+eCUbrxcx>pkmj z$IbnQU*6xd*(DMsg-K`|posKd{x${~I~ocIr4-8M*Q;dUL19TDGr;*5HCkAyB(4!U z3Am}OOsGaD?Y+TAScBM^DY5pkX|M;&hVwC!x}LI}psm5UBod00sDZL9P}a~jTRF@_ z;-DU}@`0}Huu4*Dd<;bIsEPus6eWty8(1sX;M9L~9 z{+k;^lLSzt6zN*W!{U*o5~FcJS=LxBgLbtpDO8Io3=tVfOrgVdTcU3{KAdoTFy>-; zL-Z+o&01kGwG12)9Y!Ub>)1UmP{~2kbX^NdQP<SBwA%O8pGXY!z~<)rMk|{a zL}1Sh^67n=7<{TFNI-JcQwDqa#vl{OPfTzga(k+dhe@#v8}l&eV6Lt7uu_B(mIa@q zox|W5V%atwzka;u)$>!nczuc;fOgE+EN>;l`r9{5hLPH&2m!WD&xflA9=AFDO%EH7 z&Z|>ccjAz&my4QDO&T>wOu5QYukwC1k&(3=O-o)qJLG6ul2XS{KmC)B?|&gVCtB~K zq$o<1(P*s+DX?DN^SHR<;=?VvRp26A|x17Qdbq7 zb0}+=)Dw1XkJ#LS^MR-|IwpMAu$(W%vdBt^#$+{^G<6R3;Dg0AaGfHftrKYK$xIi%})Qj9ds zjzpv$jR-;foXfhx2hU=@q-mNglQWEG2aLzlec`56!u1`&2To278BeA(O-JV>z$T=G zwIwkmW(UX2W(WIFrqUWlm0|U`AcVll@e!sl^u42L#fNw@nc#dvVW}rGPEJlq5xREA zsL)iUVYOOAN}L=VV^o224xk0xxJUP3dp%*hypc&SRU2yAyd6p6AbQ6|y%0bA5m zqbZBW4ZFr=UAnm7phQA8n~X3THtRJ;Db7w$At@%~8ME0DH#ZO5-py&dh_+?c)C>3? zRV7wK+cuCA=cgx(>Je?%F<-1uMa|Jzz`jC*9!P~mX${8*Q~GAhdh>`@@aF9s#?u)e zZ|3~`;TD$)Y%wNf(ux=Fax&v^TCuplVY7bZ#k1#p@%7itmus{s7*9s{PEi4F*P&Fv>d4{9phLss z@){L8{_Xd_sF)*lhc3G0L78NFjF)v$dG)Ix2f>BQq6) zuWlUh*>HA|6WG`jm5H!tkcSRAynhcdM_-aKNjB`g<`*SESg11aUR(tVErU}* z?8Z_I!X#s!w82OcmNw!)>-!#jpf(nq$Hqvl6t#{_OG8mrEEkckX{eOK#6)O%N^L-E zg3?&6DG_aPtu?jL6xQHVV$<~a-lL2qcyXfeUaq;)VlN^?JL1dNw=L~%BOt+OqSow^ zXVyK%D-I6Epe(i?Gn!1W^;p;oMD(w9%XW3gY&zk)-+saF@rv8q8}UswhSqt? zvSKou$}MZf<@NUZf_Fb3@x|}H<%`c>6O+P)#Kq+`ZRbd)$Z{3E@9+;{C<=&50Omg9 zCFv*WO&0{Bg(S&4S*kJi+_~ z%0phaGH9EtTXIBYUVA#p;~A^>)x9jfL|GaRCM7S=4>>&?(>5#q;~#%v@o-C7DyFju z)5(mvfJ%gKCaj`JO1|9|4GyC`10#-`Sv$&Xxg3+*Gr-)MD~!Y_?SCA zO6YI-{8YlbkT0gsgMB&NBn?)LIl?F9WVzrmTH|`h{d_^!^{5!AbVA3T&1S{&{sHyH zYi6?v4^g)LcDrG_+0k?khXt(c8&M*%y#gH~!6!D`mTeOlj}OGfKxtg-U_6E>1Ajs) z7_1hZe2RhXw#5K-S&>3uJf5)eiScAcQEqTi6SZZSKugi1RidhD`fihn4aKhQNZK-< zOo^c-CQ*IZasbe|rI?wNn7d8}NZH*YAmJP-fH4KpD{M|fODWPc9XdsV8_eisFD#2f zI!sDY)HU07o4tvJ!L{0CK~SV^8(iPyK~aUZmhosR$zn#KtfliiRAE6IbX57dBCc=n zzNe}xtToj2n7SGP3FjT7x~3>A+RY}1C!|dFXu75)^Z~02%Ce*^YSFC%F?ssF6}d)P zp|qjdwY1Kml%;DM`nE#~#>BJpXS{j+mgVDy&U<_>P7d|BMq7jP9%Bn!A86Z_w%uWj z6*)p#G8#=~H;N9eA}Vz2bdP46NZqrFB zUS=revL>w7IM)bEo!iB`&XJ;GJRP&y?O1KMXjSDsS^z95QWc82Fl;v~`mW>n?$W|;UP2Nna!ZNN4cAGVA({g%pOi>i<+Kv!4wx~Hent`fh|I6V? zDSC{O858e1HmgTSj<;{#aCY*H`-e3@y}zb&;=de{bfQvl1mAIdG~;MCCi)$Bw{u*( zI$ArE^rJhM`sq2DqZJCa19&WE_w`)Fo^@{I)|9kEp z9%;Icle1T>n?R8~x|ibJYR|ONnAEUc-V^(VKmGA{eDlqhJZ>6(cz46a-Hvr<@Ikt( zZSQH?p3a4R2#z9W#HILz`iAo`4R~r;)A{WCRQ90q`IG;<58_G)!f56fAW>fsC9oK2OX#WmnY6&F-OfB{Rt~P zeC2570rBK#PWj@wEQ8qYdM9l`q1#k21YN*!J7u@ zvtTkknDzizoFb6H0Lf`Zktm8%49~sBI|ngR0C;JCS9_1CgiZp&b&N8sVl}q+q^{#| zI%aG&qpIMzvMf5s)LJTS&;&}Y(Z=FQcrO~=X=ND|M&eBsEVm8B$icx3uQl7?aUp;) z*+xWOgE5lYW}}vo>717+STlITM!KfuumAghvg#Jp`aL||uW3NRM8RUSMggS#R^|(BPt3Li~`pO ztTMcK_KeUw-rd}zlw2>DfsfKQ7gsTBi#=9Zc5P3$ZK$p2*8_oVv%`mgK@yvk7B7+f z;Y*c^;5-qW{D4htd$3>6U3hxu%MVh81#e`4dNp7vh zSYdLjdc&=Eo}@2M0N}NXePFQAwqrV)pp5vt z?{;fcN{q^alsxOKbFNAYM2-$-Or|q1C093dj42r`4Tr+KstjGXqiwcw?pcF(JqPt6 zWm&V??AUbyt&8l2FaW7QT^s6Bv06XU?zYShrh5|M^UuE|M8$gZK%ZrU(w&oY!Wzq{ zR5aT)ZQC*$*MykxyB1TF;?$$8$n9c)q%pa&FRWrzk4Pb~-9F-7&zm=JR`kYxwGm&w2UsCHM0M_wx;lb&m_;1FTZS=*Vn3 z;?>J%XdQ6fj)&VT`rU?CFJAEZ=U;Mpb;Iq$Bjsp@wiO|@!WTx5Re@1$z-?JQ-eG*h zAAbKE-oAa!{o;`y-`#U{-?DQheb98htb@WxDA3R~CuW?Z6=X;H47>6XmL-vyuo#Xu zo%Q|$*(n{l%pAujEpZmkN+E?Vn8c(C~DQ4u%TDH}*rk15=yv8N)r8 zb$|omK?bnM4o#l4lR1dQzF8XcEZU$PPWjPQ#({fjZ@w4Nl2*Ad0`j1{-7~lOq*QwX zT8`0A$zMVInXy%${@y^7%g-cSA+u3?hG8(kkal*=LS&T>a-sDT&IkHF^0?k{_poNy zMO^DJDpHr?7$EJNfzXZ_EQu#9gZ6Uxuh-4iQSFyp0Y4h%24Xa)EerPI5LKjF&t_`pL#~KDOiKs zHYjB&O%gq#_spu2!>XVxENIPQvn2-4WI7>e!^S(TQuwSF4;j=Ac3UbcN@KCgf)`0h zA`o>z$3$Hij*pKxIXz^%+49rRA8C3qPO1vScv^FCe8T<1BW>GZjDQ2Bpsq9r(~8qm z@$&uf(*-UjY+1?T8l(kDu4UVFe0cYc+3^{#-h9FI;E1w5;Pzol=OfAv>nSfD{nUC% ziG6^f8l1sZUW;kJ+)+f)@?~bAE;U`(vEFr3J?q@U9dwIBwVEVuS?#|!B=0;;nu@k{ zSP5|`2?<$t5q%(pfbRpw28=B*g>*=S0om~U>`*Mz1kL3lFw1#|1w0gUNfP{8*Rxn{ z=zI{JECHQ$tP*~q7=i~PFbwVui&pF0X;DK*Cgs_HNNF_32UE^ZW>f~g|KS%Fi#g*_ z&GYj!-oAdtix)3AIyj=N%RG2AYy+}+JU>6@)ytQB`1p|@fBu<^j~_TYd%;(4UvY79 z$B*ysiNRyE3}7iGpMd}$P209~yB^oK1Rohq#?szbGL$(m2ucrO9kOSHAeK}^GLS)G zQ>50KgQ8+$3si)<9tk+{9Wiu_CKXkb)UlLePJa_7KPB-C$M-ogP=I?xG_=mAY$BgO zqLAHQqKE8u;Y6GwX;eWDjl0EyRE-F2oA(=$ex#IJgTa$RPy5)TJ5L#*MD))o!oz${ zG!+F3r7V&hlv{|wkzxm-hZLDkC!8J5C{TFkh$^vbI!rktW!>~Jgc75t?;R;Rv{B4v zQ)c54MPUfulaj=9_uf(069FNasE9!ZVS{T?DROdr%xF~6b-j=Pc^!oiX?JaQ2O$UM zI7nXh2Cb+{vGh_#I$$XULQH5a0X$99QrI$g<08gb`d(}!i=t#S8ttRKZ6RH&-Ze-t zfOup#t|i1oU5)Abo}R>LGGbiUIYh~`nBSp|A*LQ5I*M$;x9K{{x}vBm`nJdWfYPFs zjY0O+!fH$kB%SD;NI#0wGM-FOO5;PIa~+$_j_1#xad>pf!+b$mj-=?19-{@Ib$v^S z4rPWJ7CDuT){LvM?C;uecyz>O+Y*8VBUr77p{H%uq!by|6$g`vIFFPC=g*$8-nMxU z7|!Jc(Nh+h;9A;d!vKJqw&ieo$d_MyO-hP?{`9j9FXrGJm0bd?7C^gLtnjX(Fb1We z?Rwt6{1RJ~ynpwRhvfD;8)Qx=MY*@&*)u$tfFUCXP_ zp7Yt8*WAsQT;45MEE`Z`*kes>jhW$9lKEBbs+OaCg5#1w-Go^88VWXQ?K)%N6K^(K@Heg$&H) zBPB|3Modbya!KrjwD9Rfg!MzEeT!NHB^s>~h04Gydhnj2D40|gUP(X&KA>zu1y6~= zmKDzR__jeA&9ttt!Be`xxQNs-Fd|X*p3+C^dc@s!Lv1w5S{w--9HmyARRxpM5LIH; zwuBHUN=Z?3QQT>xdSWuQQU78IqH+l|8BfJhEqPF)bB@t*GMn<}fBOT!`~7cGO7q|U z`~Sm#`)~g*MQJ!bIil@*9v&8~H%(4;OZjk&xL_GiDvpnjnN4Txn!tbj^Bon6?WW18 zJyLm>RYCBHX1n71zyA$wO2)HeX)`5}kqlp-*yIwD7myb~4;rXX3a#Px8ww&x2aH%1 zIi6_VzCLGERebn($q&C?(>g2Oj01?&BCO9Mpj`ZA(S;iB-$7n6JR1xZ>rh1wc7UM| zw63KnODb*1XE0qCxSv0=*_}{V<9)rFarWMpa41AIGJza{uIt%sce40X)^Me?ukgj8 zV%VJW)z2B&fF(i{W=on=%HAbR$Xrmbymg7-Pv075rHTA&}g{^28 zOUf9s7CYq|O^Ok%5#R9OiFktR(Ur8=qf$JsH|X)0UFV2dzo=4tVyG1Y97w`cDMeD6 z_g6P4VB0(D(G;Hok(hmx^H!_UevUwE#Yt6ja&&;P23HsseS?dEWTJFgf|Ow51QSK} zl>~Urrc=Ip`x)maN9)@qDZOeQ0qpPw_COn7*B5G`#CXrt*}PfU@*2+JFiCxl)I z2Wy2qs0&8*h|PAp@3d(n1!miHq@*ZpB^q|6FXk5{E9p3e%5I8zKXSI5i=c#LvFm!>s z8gYDb%E4^L!~H$R8b+nTIY-|$1mBSeXj4*;DpG{;Xw0r@I5;@qn=iki_nzf)!FXH& zhNf+BuEqOa3bLV9tdK!R61FZWZNaYX3DL7$J`i(?mbC`(tk)}??=V_(dVI*ZDzV1$ z?Adb?iTUDz$HxUeN}8iqMrbMD)Ac(k=m3JmlfQZMhUsj|JP%m*E?^6r?|s=#tV%Sy zHGR`yjiRn9T<{#s4k)V;S68=OU*FR95mVHp9G;_egcR9scSP5tl%@|Iz7Kr<<~4Oa zV%w|qtrG*!kS@R|%aW)@p+5 zSgf{0?>Id^<@vLhTwGjpyI8SYw?s;`kXEj*Hth7q<;NUl5E) zK1`uN87UZaqH{iZi}E$jO*-AWP+MvK4&heugfByl$-dRWruNItC;&IJ+o8(~6J_HvcEd-9x!Oq=R_ zz!XX(h?~#zNc0NlTtHNFeXx}NL5)5MY~01F;L2Fv?aXIi~m@bY=v^GA8^M=apX6HM6FpNhdn%<*rLGLu(wgUr4hX+ijW3)AV z`|a2K_5b?|ZSN=x%k08YDYNeRkw1W8)oAqE~-Tbf-wb`4asC#gu1Yol{v5mUrP3BhTdW3}EgK605g&Fr(zo3(-=X|FCV$wkVdWL#7v zt=Y959)+?c+qS3o0aI4O+NYS=REG_LgYlHF&(HY$#X0lUf*&p~rLd1l21gV5K2?|` zQVH)n>e8aBij*Qv+v0rBwrOx7;9|nXNU4l?3(Kj+pvOfgtThx?QI+C|({(LA2D%XF zoks_VwXC}kd~Qj{J)=_96{AswHi{SnF?v)kc6#TKAv|GnQi=rciBUA*V_Q+xB}HLz z&Ju&mju{fj;zPjNilV3qy~Ft)uRPjn>QTvTGQnEICP*UNdi%(7IVbu^Bw|cK({_YD zl5B(&Fh(&R)yxL{a1aSX@I9{Y==1RIV!343?Bu@bB?!T4!<(0{m>nE&KYw7eTQQr> zsOy3l9ldLCK|(0%s%F>ZJx*!rdc<@xWz%e#FXn8vYmSbNgjDETd}kR0U@&8t?8T$m7SfOFq=(CK5%$+NIe>H|FGo#Zb8%bxvM7t zMOzuDi_sH;Tt0R-26!nR(4xoAsqJ(DrSXfq)Nz;1g%(XPliqW4r5Ux}IIv zqE(rRM};+-6dav*Y&HvG@*GTNR8^VfQVH*+d*odd-LcNyu;eL9(IU5PgYSFBs`aPb@*t|g@h3)z&S?>p6zcd3U{L;|$5vdyJ)&#ufs=la~&JoB@HT z#B)9SFnt0VGY}+@3GDsPhOjSL{bY7l273qGCugr5P%2}quzzg!?nx5fme1b(v*z=8 z;8Im4I`eZu5<-%&|KU?~bK1WiQ9j7orqrMo5K#97z@=lvr>{*9B-#^EHqd1%@uYT8 z>^r7HENLvCdnLFXv0O;pFGOIfb7pC#OpIXeTXLau(O`y)33or;>of~P`Zza z&IOk1hR3Z(nF{3-rYJ$_>>WC21&1dV-Ka+1Twz29YqX}aCObVSh>_4sXo2q?v3Gfz zUvx>*WssJ$3_^ib8jEN{i#!>xV!!~-Krz1rPiYL}QAKc$=mLc?nBcJy##IS@WCWay zD-M%qS}T%iNL5E^9cPn@gR*44+A#6~)jPC;x3A7QozCzsvUQGjvlC|lE7ov>wVYN; z?1vO$xisA94D6&Fpqq_^Qlvokfs|JCdbQ$*AAaQI*)hf{w%bRh^k6o?On0I)+G4iLQ05);rw!A!U*6 zX!2_x6dvS-I%tFwimrF`&gbfNzvNK)S>z=@wVVc!taN_dlq=?;cu*$W`iP@RRT{d! zW3gB;8IO7K;svi?zhOF^kjN>Ad4O~ef^$j_Iu9SjKyt$Dz5U`1+ue@7Z8)4AFdY|! z=ol4nelq5ZFJ7_Ptmyil=|tM^-~UihRdu%d%eojNo1E-J*)Nz3K(mf_A7GO~p^1?y zMMfzw9*vnD9N|zjGJ!;liKc1kdq*gwgOjgTX4d68O{Wtquvp3K98bp7bxmqIx@JdJ zjZj9Ss#TVoL;};vgvyNBnn+C|Xa$87SY6+2j6kP8p6pW`6f`PU7JhnZn zrezmAZRA7Hy}sj7nMbjs1;A#K<2 zxLOF9PZ94soNwv-p5FU?0leO9NJxU(sII8$ip^%tZnGnJ&%6JhtT*eiB+Ih%zBAcy zC!b=>v8L{3cQu#exd;V0qKPzAgCb_0*gHqtGc?fD(8&J!`<&_W@qHX zK6X8dN+6J#;qLcdH#>ID+H0@9*0*1>=$9g?N&!kCOrAoawXPN=1I{@{<%u<{X12Rh z6ifxNF?vFfVZ!z0nqi!vh~d@4_Q316x9s*uk^B(P)_Q)Lh%uh^oYorF>ox1mhL93J zym`a%B(`ihrCPwqyi3V}!*P#~p4D=}<@FWQFkq|$V|e@imWSPe!|{kxj#i6bzSe~p zL(C+ z>fn6c$z|w15L1*ukyaS~+xK^%G(JI0RnCdb1xP}shZ1>ze@hA@hQe~S;Mue1eD%%u z>~<%HkeQMqo2J^!%D$p$V=fA(km@a8Sw{P4gJcO$1{$+~?6 zd^5?RiUisyv6Rdou(30f3CP#U5<5JfpQy8Tc8*G(lY50=P?g{)k7pUPY(YARX`Z>6 zxBt2As9|>R$>#yLdVZzRh;v5hOgY-LkX zbpm|m^D2!$e}FS6mK&|>hmSck`p9lO;HLsOl+L&Y+O~NF=z>zjc1a2A+cuiUHndjL z7)9G!7LAh$V=LOf7$PA?qK_ON4xF|%Db2KW&LJM~88CIj&S;}B8Sx;k@9k87pSOj=Mcy{L63n>7V|kO!yax)GbLW#5DT^=9%rRHZSD^ zP{-WXsBfUunbjw2Uj6Wv|M++Rkw5wD37fv9O%qoOOBo{BMyzWX6C9^RDAE!yXO|RJ zAI`_8Ad^v9i3DdhD6bn$uA02YIqby-RFRgUrcUb{LX@fU5EIT;R*y&B^W4gTdU3N< zv9Zcelr~cMl=?GjE&zCZ7SDBQl`);$Q&omk3I!SVBxjs)^i7ZVM^cV#)+?Spd&*|B zMxn$)sff%(&#!!bz8_iPQa6^A63#kazIe(0IN=(DYYc6Z=^8~Cj-+WI`hnx|$mujN z30#sl`%$)gPdz4Q7J+UB$Wv@R3)WU{cIa4WU7_rS)xOsq2()(U`{&#h^i1jwe0v(oZc%2G&7Ay5tn3YkTBNl}@>Pk29} zwG8t5FrCjQ=NhbbOeru0PfSUi7!F&G`#r%27G2M$AAd~AnRoBsF$GV~ne}Q-j0qnS zMF~((1$-=0*v5E%u2e1H3lMWbTSMD4qJKscXI4BWA&EvWAx2uf(kDMKPA7)bfH9UQ zPo6Lip7*!!utrN1vUc3wJ>Wyc`-sBQwTc)gQW7h=7?X5XtYHd~+xK@Ij}y1I_e?%i zJ+^?~#!CNnci3_oj%ck|E|yG_=kDQw_2z>24?FI+J9hgMDQ3E^#b|{hQBov^Q3e-t z5^^yoE>~B?nAkoX*dI=$C{}Xf)elxfPJyX*Jle)_xw#+%af)b_*&Pq;#}OZ(oulqm zMvI`ZPhGk*M&pYboh`g8;q_K4*QvqkQ#6Q4=2^T|>r z36H)6mAp6~ogbJi)U#Tl$t6|dRGq&B6+|=h#|WWXJB|{hHlLHFvegy5&RD(VMB+#wVFjEf0n&t**p5y(mI1tb+J1o zNoJ~(MH=9EwdVM6oOT0|gsUy6oD!)hNn%6Vb@t+CZt*eGa}=3>31SuQ!= zZ)MPBnrIZPTE{{~R5+5_fz#riXMg<+^&;aAF#P?2a%i|n6RWEQ+G%b!YxHT4%7#37 zg7O|8vV)#Bq)(T#J^ql^Sub56FsG3DrBQ#s5`0W>8^Sj@FLn>fhPtHXOj><%9ZAn_; zQ>YK66hrUczQSWzUA&-VQ=K7n)ov+L-56Ev5J)#A)x};NN9LtGPoh_ytFHD<|Mbg$ z=8Jzg^7%*4c>eq)ttxCfgK8c9#geED?;eia?Iv>FOy&s9+3HW_$F|KJ>>NQCxW$;w8Qav~*!flLv21Tp8S)>6*HdUZ-3rNhQch{SG8dMaFfjS@+&3Qe7Yq1 zDYH$S{$^d4P7aP6I)Uw_{4RIZ!gqx$88s$b+9 zB^S~((&;77Z!YP(mTC0d9ga*|oF1%cC`q*KVkK5XT4oPpr8pi=Y!*F@m4J5R&N^W`V+C@0K`I&Vu4@>^ljupCju=Iku9ZPm9WvUIeIcey%#pI&GY*41lUnio z=@YImFZlY~Z`eNUDHL4WV65ddOcH2PBxP}GBc&Yc-j=IGN0Sh6qqU)wMBDY%<6H`X zVH`2m(x3?;3Fy}rYsAamPZQpIa&6CR)A0SPAJ}gn*lac|rieE4;H+45Hm$4jhlsKE zgEL%l945wb9+qIagr`9D>vM0u|7C4T^8d6EbDHBu1+7@FQv}wr7k`m++DtPvI zKajI9&wan*k!8B`{ z(vYG;rE=EU<}7DSjFA*0S|=%lud1|FNC_n**10D;p9SSZOA2O(8tQq$8R$Nu%S<{CX{S;!m`5-FnbfL9=^2n# z@^qH0oxi38t7&UE`<7N2V9E249p{UpDtJDVC{+$;&lEg!+W_R$skHK$LN4|6(Psv0 zt~BOPE9_scpyhD_wR~_h1aQl5JfCwJeI6>w1wyLem|6QLK^BjJ211y1jbYszHmzgP z3JC5yBNgGp8{WQtCBYOWOC+yrSgkL3{^BEUuAlMz=@rkPU-QMUe#iZr2LhQ!^~}`$ zhf;5?<${x;)kZviLq?w_dTY2|uP`CW$;ULgCG0$J?v5M|gIud($RXm4CFVj-1&6ecW)?oy1tNem)&V2Y z`(1QPruUiTJ-XErvFa3|WbhIjYf8rF$aX*Q-J35t41w+Rnh7U|AG3ZaQ*vd;S||Ff zd0`=~5%GDIB%d4;AxY7s>f+T3Vh%jKe}lC>?edzKOJx)xWod(=%em^+XRrrFCA6|t zJ1dN*o;8{!0Sedj#BRy){=o0Q`JVgTfvYFavE7QsLGK_aXjG(xfvg&|b#;ne4r8r# z_1=|AxXb`e*R`KHzrWG?3|{lxVyaFhA{&s9lNckErnZpgXP`cJC7(AYUH>D+%$(~! z8=DthP(^HUBq>l@zRU&dTm=^?ER{0#+2mZLmU^&(_$52ruv{!zEEa&4_FsKUsT-`W zRko^bB$C)OThvsbT?aR`suGtB$K!-`p7Q>l@4o+@AN}ZKuC6W_!vp){k(jf{Am+XJ zymzSD*{J(P{V?-PfrPZw6eg{)#u9wscsSsePjOAhc6&s%J(NtyiEh!-_dQV?*=ur= z*Vh)MEvI25pY~iE!+O2s_|S4Z9??qSy#Ot(trQbk5;7GE*Y)gnTlPE8x^JYfuN1>1 zK**p)`!16XDK-QTu0XZ?2L?ENJ!)HZOR)zw#q3VawH6}RtiJUXH zclUHP3fZ=@&iby$7=uruAS?=uwHWL0(}<6m-QkG$k(V!CFvWxqnG_0L*I{f&K?+r; z9c`-!VIrm|Lu4e3)2vrZtTFh>Q?kNXOWXEX*O9Xn=vi4|w4)RTq9xU=mkTLmVXQK6xCMmLW5Q$hy@_Yep(+ik14UBbxseH z;3lgrUDHvtWeO0pCM20#5jg<7c=l8}jf*93Z*TeL+wZGyw4!Y~3Yw5L!z7={S;H7+ zc@NAV?lJD+096i*8 z!BWJr<9OPWQewT{&~{7S-*0(%*khf;x}N1?#eP2!-9*>*b$<#NljvGk?Y9giD~@#^ zuoLv-sZt$@zQ%nU^Z_>`WyY()rfQeycc>0ks`+#-MY6#@zWj58lrQ z#QE%<|EZeZ+BFr!)(XCrMirU4&@+zAVvwd6-#0kiDTR55S`w4Cv1 zdHlHw-Q~p)FaK1}a0PaDS}2w3o=>9rp*}NH6$H$e=1i5>)~!?~`Fs(mZ3y{a(HhsM z`23OPsdiltbf9i%(ss43&*O_tb2zwnTL0;`2M?ZI2?DB zQgFu5xCWyPF~M+r;F~WGynp+e=g(jA{MpC+)!+V{U;X0Oy!-w=QE8lQ&o?uJWbnvDV99LM6>L;?ix1BhEFeEa2W2$>W;FS$e(xU|KSttUtYqhfbLlR_eZYo zG~0iAi&2HAKYC8rJEmV9IBZX(py*mlpA}OsxT3@;9WlL^f}l=!^0;udR>V>lk+DGH zVzJ`tvmf)DU;ZcZln9L`w+%_j#-2(RZ{h?~gyR&63PvCJ$AA8v=v_aM3gl9VIns7Z zOjM{MRanjmZG}b5sgRNkair=ks0}1PC-W6@j_kL0*mjM!-D5WZMKK?U;B^JSbpXlK zb#-<-s8%l0;w=;{Z6eqAoVJFE#QW_5pER4B!Vo4Nc3Vu}GmRddCyEM`*kD~RtQ&J- zDIn?W5}u1_ofYS>4FP4cuC+FGP(eOZDl(Xnlvt?cKbV-6hjnIffk(%Q%05dmqa+4$ zj*!Nn^sJ37bw`lRNfaTE4CTz0&(r2oJXQ~5AIK@QSgvXNg|IF5F+e1%d9t?DO|q(; zOMPX<<8wUkr3lzhIWzgd=rgHk#woH`c91n;idZ}ACUrf~=lzE>_?-*uk|0;#>r&-F za|g;)iG*})#Du@^SG;4-IorbeqPw8#OJMcD>jG(Q6xVFdHj)cWzUG420wrM!-M}ik^zMm3hAub!aWPFG? z)6z9dN`{!^nJh&SLaug3kYc2t5-g4Az_lU;@$l`sCC)8~S$4RP6(LJxbjhM=SK4Ag z2HUESY1_6emn$+B9}92fCqgn}U#1jjO-Kn-Q!*_DQ>W#Pmi2Bm zbWP7N1cos)PLTpw+e$*8wrCB`2`Lbx7dy3-SgqDvTwHTFj@&&QiP>PCVSn;``~53o z$c$5%7qgXiOqKj+2EPeEHQuW#7yC&qBZOocLqYJWZx8;KMWsQFwiVhdS8rz!@eX33#E z*P0oi>hnG+jBt4*ThxDZMx2Sw%INADR0|eVRS8gLP+igMnQc~_Vd-qhTPlNG+Yc0# z(U@BN)edOg>nqD8XG|7ZkWu#k*YKrK?cvlJQcKw242|EVdT!xQxWRRu+RtKUON+ zI#b5Ewrf*J91nXMZCS6@l9inzZL3)InpN*uG>X;2VpZVVFMrFc@4geAv6G6v?H4Q; z3!1*gYKzedqvUtoZSTk_^3n58_^ZG9Ise)JJ^R}O^mC${GKOhTT z+9{@6&@7is`w3$eAx@O&8T`P}2a2;~>&Qvsi6a)h*xVCh}+2Q66ad?p#E!aUNc! z$dFtG7&0U&t>^lZprwe>N;7)T?l5q5{e*t8VD!FrqKr)Vmwaw@Jq~Ns`*CIzs`Gbc z&r^bF@Z@ZGf4Apw44_+lg5~;>r!QWzTrU|$(Yjt;-SGO|ftZSDedn6JGTJ#x7eZwv z1A3_z1{H}bt@&;Us>>bfN*MvlYCi|Z>gaKGD%^uS8uTvGBg zd6r;kgLXZxT@gZLf7;P?4L4V7(2=(5aNQDZoER8s2PKo0l0!usP)1xJ#zgBBuIVVo za=+by(im%qIh^hOa?S)FkR#JEO(TU&V>PE?qG=?|qjf#)>=|2{P6lUl*BYm;@r@-ESF1`%M13$iOEB#?md~>*;E>19IdlB z1G#uqkq)CVhPLgP#=`w>sDAARYYbh}Q&fYsj;`$}+2f~UeMTihd9%61hse9TEg=_F zE%ub{*d8W2*Rbf9r0DU}0b`VO3#>ughS3)u_9F>P)3vn-=`hyORCkJ)g%usAfs!-J z#gfa5Yf^;WenQ!fzFXiLheC!{jTMPo^e0l9aIK|jTa>mq*RVT`oTiLzmo%=SZN!?e zl#D=}g!dyUjN*jSwJa7(mWws4-TE~E03ZNKL_t&`L{4KQ(?~dsQK+f`&qaWKP7@T* zaG~CI+p*{t><;o=mTFC>%Nb6J_PFmwVq_E; zafZrs3%JOzyMRRll_Z#FNK^&3awg1366O?6nXIlIw^<|1Oo%>q5XF9s%IeC`on6B| zAX?;G>mYTV8##Lumny}o+GXKxs{EqzOGXf>D3E8|IKM~5iK>!bvkqC+>9@zvQ|djg z^0rzsh=O45Dhk%6%Jp&qD{mzSY(aeID5**w>X4GEt(%!HS4P^i^}@>)FlV-Grcvck zui*l^pb}O4mqZ&z9et`5i_zv$U#uRhpHyV(Um-(pePdX4mW5L+I)lm+Uw!#6+`f4w zmS{~&zq#b{>YDZCrEE~^C5x`b8kx>dAuyc={AuFu?v`g)Px&{0^{4!Q|IdFSris>y zwNHs30D;N?_QvA0K_!{;*G6HDV!3EInmy*n3pW4mkJ)_mW9UAC<^@Hsp*VRh>ru~t zf_r)d-oyA6)7uBiO`_X1q+Mc>HB&BhMl-2GC>mlSj1$EgEHYG35RG3^Voo0s-Ciz` zu)IHce(_IV@bl{>fAhD0$xk2N@W1_Ef5%B_2BR6XOk-1{SePsHa@B`)Zug5; zzZRQXox3tp_R2e!oMn)3CTz1z3YRQjn_EOFN(F3cSVhqaA2Z*6_nOZ?d(P7*&w2Cu zTkamVwEdHMjUS~4^L?d$%EGJ;6GpLa0C*pnCUJFn`|g1$DzFVhNPPL-8?qKh0Y3(^ zcHG_{38}K$x!UJY!MjozCqX1Ri*8x=@_8Ub2IRg-Ezo*r!s11~{ASh&8;@hPGeerxPi4Sl7|?OLoU2P1n*d7ZQk5DnVf_ z$xpI&v<7V`+KEi5adh1ZqYL9W(YTIM#APHWgawP@>|m@zn}7;JQaIDFUT(x&v;(Cr zTDi(JRc*f3q@2a^1)(yP(&QwsvFulPKZ)kDU2z;DS?hEAKUOA7$P$ZnBFhLV2pifq z*rt)|k#v>DWnvcnaLluGMcUE|aXWF=qOGB68oGAD=`<2zA;bbyi?&<`zqDw>rIwRH z(YEW@tX4E_%keM>kPYBtI>*o(48}Fp$wV`adz314O~YcbKpDe01`bD0%F<;3Valy@ zw9e5wgEg8IPUIv`J;oT6)=WNeoH8LPijs6c+jO*TN87mCd6GEjR1*TbuBBhDh&i)6 z4ER{kww3G9bs~k)vak3s;l~3?C2<5lYl41Ba8OXgXJi!K*YYCQk|?pD;SJ>U-9!1#R2nec&_( zrT~K%>@tK&bk=~jEm>u9j?8I}634v}DWbB%`es#&xd=p=BMO;u+!Mwi5r7d8r6r zSxvWCq2~$*0h^1~v1lEe&e590x4-|A+t;sATG94BtE+2nKKh8u>l?1FF1Wh9Vzpk< z_AN?_s6qpA3LLgOPVXN$+&=JhbHh*n=rg|f)tAKVuv%Aas39qA<1nSv=-!NL9Ie*$ zxzIaDv;*$b73%Yz^86CD`IMqQN2v=a4OLKDVZ;VyBJdQt4gH^M)EmRN|CU9xsN6Ay z$PhDW9En+COpDP3ugJEtJmW;F%w;+kD77783b|XdI~Cpxp1*#1!~gt0{ha^vKmQYl zA)=g<)>O_IWpGY(gxY9M<3K3Y99>(e;7SbdBR<%5+UHX+`xudhf|e;z>c_j72HM z6jKE^!qysNpd?WX71?-FU3cODkt;}i><)kwReF99vLer_fRs>5lF-PJlqB4s>011d z7^0^fkMt$gp^zjtO-fh&awG>!oVM7_ii^#LVTzmvkJ8X~jo2JH(V*`4mWOg6)V5ll zwZxdmwoOr3CG7Y-EGUDZRkW|t#<-q8XmSuAZ4-9-mj) zq-5vtK63xCrQjIG$eVZf64$HbpdZG}uYdE6thXX9?o^8bUGHx}n4?*HZsa7c2|tg6 zab%IhSgp~<2vb@zrv%^c2d;eNeu`{*!`t1SeJZ3=;Ft~3IEuEEA~FD##mOX<1O}R} zWeT2Q@)e-=H0u@jyNMJs+GZZ(mgg-}o&C;rWg2xBhXT{IQiK%w9wph#kHJ3kJvTCR zx>~JSc0GQ%qU)DnI<|)>hk&ZOK3#3b=6jE@;*D!*+m0B=s`c(UjZrkX+R!hSl+jbl zR0n+u!oP~^#(KFzE0HqAB!#WgRSHubc2dk|&r)MVU#TjH-fUK~H~2vCk~%j#e#e;3 zC9kT3FV;4gsu65jhcT9E^3_#A*CQ$uV_+Hwa*RO18CNa!q-$V}WxZOE3mlFo3N5MF zI>cB3LlOO8+qD=cUbDGmy3TQPbBSv@9<~Q|2hZSVJE|F62*7hqLoS(d9P7Z6rtLeN zZ5Vw7WihTJPs1Oqh1NNm#$Yw1G?J1>YjG!0N(*35g^WY%eD?Tu*5Vo~g=d_Y{6GjN zloB2BV!0;7%rJRkF}SwJ775sxllVf47*&XVB*j4Ai;wo{G~r_=Moml-X0li;SoA$5 z1z~)vZQ(c$Oku)kxVXG#wOHXpWb_H$bfSf&)G&ln?M@}dFhxlbG{%yPVw@7Y<0M@o z)zCF9t+O;%kxIh*soIi7Qb;&wa7}}?(s6j$o*1V{%o5=~yBDOC#J3-@eM>3w?BGJX#6sa>Galsw-}_2@D0IbV~0rRsz$Q95s*3U!_dnz3y@lOgrg$#TY>hrjhBL#!*P6+o_}Q#?ySW>U4X z%QJm;rrZHr)T|e*EL)}9OV#(v`^@N805g?jl3%h?8?(vl8G+||gw|_=I-5Mt?OrwO zIx1u@y2k%fFwTK8vPq^atfAGky;RhF*UoteB_k8l%3x4?Ody)?%D<=D?B%JK}649!} zVA)uMrW(!bM82`C|LP^~Uw;gnk0|OI)P_RKqxt{ize}+|BkabtqyO(5;kW;u*T4P^ zPG9kUcjROYMu9DvGEJzyl>@0L+IGSAG;ul{iET%*oq#E2FwWwO0FVc9waFxwbuQ|Q};RK*G!XGy6l zinOJ%n&WUHxiVgc7S#3U2sWgIFqV`z-HNW=nY0j?@d5Jyb$Jh@uXwo7jBwrr0lHWw|M<%-p! zr|%bxUd#%M9EY*s? z&h|*-sLa1xl~yU)FR0PPC?(yaRKyCU7V6qqP`36FGsS39Q%I^X6i`!Oae2k_#U&3| zLiXTfbJt4TAdCS>5+Rx;H7TUTaUAHaqwPCly$`y2BU9O~*~?g~YN?h*=Xg4vxLmJz z_VgLCC?0lWU9%agf3MP(6eYHJ@&hq=8Yh7?F$P{df6h2XcE^bn3s`$*PL$R_tVND! zeT}YrY)bUqf|Md5A~C;8K!`XWK(15g;=&+@Qr9+IU0!h5Z>8wbnyhN!CKAf zG*VJ}bbwI>Qmj6w0ZQg{I#unl6$Y)YGa2Np^99uS+yWHw%3ZD3#01;h2ToJK2Q3=> zy6_d?8Ue8-3rHh+APJ}&Js}hnR={;#ujkH@mLiUvi785=TwOOYXX5Cgi0<2%7IZ@E zOw(8z=SV3MeV`Bten6>e+o>(bqp-hOH6jhu!lJpx$?J!SQZlh*q937%O<#5 zz@n_hY0)hEaby}#q~yuY;73IY9_OH2tXM8q#8}v$JQ;ED0BNa<<(jOkoIFrO%WoP| zF-%G0$INLegktF0hQ=8hqfps1j^la15(g>JxMJuw!BX%bDKHjj~kGS6+7=7YlzbB?G)><~}D-K7`;5{LRM_^d> zytDa&ES*fK#ete#a-`u~L8N|UHtQi%X2}&YS2K6==UJPga~+PGK_q8@dES4S_x$oW z7+3#pW@Lp1;Su!CK=$mF44Ara@#yaGNUzQ>TS08qAfE#^iV`AnCQN4xo4B`i$+thR~)rn>T|OO<{#HFX3upeERo{y<$2Z zNzt?FmRzh_%%{8H{ZSDdWRP(lSY&wUuEw zbH(?A=J2aGOx+E8|A4odR085{DDA6Z@&Fhk?Pg=A=OJ;rYvFJiWQ( zH^2Le&3eI;Cs%AA?s<4PaD8>n&wlzT5Bme}-|vY&avD!qYgqus&1rhr@(upbM+(MP- zT9aZRr9j_0P#PbSuyj5!`ibBpSwri3tQM_tN{LXTdQ}nN6GP;9ii8+A90rCdlW0*` zd4DC=NjX-}(~@yD7|19XPlMQS0U-#|Eb3U9^eSK95jWOaEs|qCsVk~G=2w8$XtZf7!m<&eR$XY3RzKuqJD^RSk%1*4} zQqDDa#E82=W!be-XlH1g6A+ud*k*lT#b!GP#ne{1s@GeR44pBc5~0dhw2H(m6CTd> z^xcwi3@F_avvlON)--KP+em>wO#`|la`w^2tciXP6@IAGYj| z1B=ZC8jVrZ4uE*@QZh;ve3+m>%32ZyqZEQEDH5jtyuOsSyM4aLJAlS*3F5L z3Tq8dZf;m_F1fqk^ROK#+G3nY8*)iZe!%L?dfCynE#7-lOsp3R7X9jcHuc>?q)D@vql zCFK7~wK$y9nX;0iTFqn=XW%HF!BT9BL(+W4sF{3)c_6(jx)p8Z`gb!? zN@aD6uChI5`d8MA;+*=MDUY~uCJ>9@&DmLP4v&$hvgqt32t)op7r_+;WIthcM3ZyZ z=Gt;T>oJs~=nuj%X5d&Kuyb0?2Q)KPuUPcl#;#T{%!yd}e1PVhtCV7H-&R~uFYu^7Kuel%J zV>Hf+!j8sZ^OlN@sBN7=%&>!OEikC_zDCDJ;@X4zt$<89oD zX@1oZsys7+)q+Kd=jQQnAjQbV)g{h}evX-S&4t5h;4~d&JsVBq96=H>1PG5KOS=#@ zG7D?nT0^YzgD{?W^~1Mxiv|61L)*xqZH?mY?ye4YWv;KEu~;;`e=l*Paq{F8>Dmt4 zxC(YFP%TpM%+>fK?43I$RimXISBjcDDmhD5Ns)*6yde}2+NwY;Jd~11Z2^$FPV7=A z+^Zc^$yKkfQM%=eFTSI1TmJmdenO$}>W6RG?e=`~@+H^Tmvmiwj@>Nvah^ipcpBO5 zj^v_oZpFLXBft9Ruh|_uO1B^E6-GXHnfH(?f5^fNo`)?8b)xr!2c-@}sw}LMFipCK zl*~FfStmM*%ZxLUayEuUQdSP&d3EQEs+K&uYLOLDfJzAH80l7PB5=1m5K7@V1qL5z zyA{Pa#?do-W(#&tC<=|!Y!)4zYk2$i9Z^snyW^43M_j+5kr7sLzzG3z!YbK2`^M3^ zhVAZ-;3Kx}NeNQ%C{?G>t+0H-dvU7C30pFqu~=0|Dc}#j4nj#3t+uXSQ!SJ6Nmx*$ zW%#voEt3k?md&y!mqa-xQPo#_Me5L4O5)JcwGCDmatv6Vv9&AV9fu)EGN0BsXCTeRXvR=5O7=igG^^Ey=g*&`F}%Oub2v@Xm9U0Z%U~Ee5~D;4 zJL|{^Qu3@;D}M6hpD;~hpcuQq)A@&!3g><=dzXIL)R6g0!+2{93Tb-_^vfwkhq;ZxzX z6^l7j&n0c7i-Q7F-En*nTR5jR3#+7%uG;)Ouk`A;C7pMXAkO&o5i#-y#FCnE6*Dxc zV06ZT3Q*O>rS8XqpE49p`2fqz&J%OPR`6-1N^_-l>-%age)U3ZRnRvlkme7tLw&tR zoxqGQ`2bwk@SNFNv}l>dQDPsOi|p@Zo_8wh{BtvAoiU5mm0kMqpLrN={$}PXLHO7i zLrS$!tBay?)g{U_AoYSg>PQMom)g0V*`CMykY?JivM?D*eWv;KU`Si1o&mNw) zcX!-vx0U^oK`x_311&anVvnV5E%2(YUEZy>u=3*-n>UqNH=%0!(ENJy^YNiX1S1;i z*%(~bnHGb5qcF~5vTU-Lxe8ZcKxGR_EZF|bufN3miJ$+gpYpSxE&1VxZ~6M0*ZlDM z9T%4?`nD5u|B^{DiDon_oa?Z*LIPJRS&oUKe%PGk9#9aHhkD zC~e>v&@r%X9jn%1TZd^3;?oV|B!LBOXV6xIs>51F3Wk(CuIX4WB|u?+*i#gQAiChm zM_LSxZpE&$$n`SC;D-TcH0!>{Si^3=<8(Szw&}mJ^&U;KC0Tyo&(#$nQa)AH)p8o_ z84#qAM&pi#Ef-w#Q}G*c$t9QAkTfG{pfr$xVFU)#jh^Z1s;;MB%E*Yg!W9?C{YDmy z&#bJT$jFSi*RT6I|MM5cQ@5ZTIa3@oT5|Hloar0Q_4$UY%L{JqZn?U+V3;QM$B~>P zNln;B{By0*G$upzSO?qU{Ty>-v)RzJJ@=1~_-UkTI+U>tb0qqJLg5-i^d3Xz_0>6D z+i;Tux}=8fACE$LQIQs)TqC3I`v(rAh~ZLkRBDXH z$62nm0&6tubwf_#DDnE`YrcB@HSa%sWcD5(Bgz>;(x(}5ln_3))0*?uipfum6TEu) zn(ONqy#Me~s4gg+Z3MM1XuHZn>uH^3-M6^XEcAWPFbwQ=PsPrWr4Wb($Z*bbeX&KU zEJ013k)}UIhEen$#yYXi%z^+DJ==B9&%S;|V-)wdw|uynNvn>_s~5~Z@wlHzCHO*+ zVkb?oNnD?8**L}JX2p0s^8NddoNrdxe$6ljhAE;=6+kCq@VM5ZQsU}-!*71|OU}0& z_J=*gbR;Rm#l<;aZXU4O2xm4!n8oTNMM22Brsc)uIeps-)u0g}=I&|FVH~9f(F&`i zS%}3QWxHAP)mN`+oo0WWX{-p|y`RV!yq9#p(FfVvQlU|)>Y*<2RJY7;n%aC$E2{+Woz%&jt&eAoe_$(TXal-qY zJz87ZRZp{7(QQ_2&$q0$E70OBA)ihC=(8<%wUE6-ELryR%ot_@;+x(sC-hbfy-97d*FRx?H!_A1WfiD8QcfquWi80EtdUx))X9d> zpt4R6)Kb)i5I7w6+}+;LbYs~BDxtj|+PO|_&?uaBv|W#O4%;?pXK<}Un}o^^!XN?@ z)8g|?3X|m3TMJoi!76W@RLp0|Jc!ePu{T8wd}(*Wy06u+i);NtkfvLT%sDTOXBCuv!3 zbqbY>N>=~{;qAr{NJjP#V>QlN8Y>)VlOr3e`Re+T-YAZTnI}JUKhKzc#cI{y=SavR zWI>5tm&y^90HlExUkhSlXcSsT9l;fEzWLK4Xw(N9u0v_|vt@|<odRy|kSEjeZO!x5tmZR=15n$~f)J>xKXDM)fI zls?(VH(krsc1?OxN~kt$BQW;O^m`VVanIDDbb z4^PGYMpDkmk*;%`oo$$gBU)vA7U1IU?t!U9D>qFmg-aIBrABf6;+pe|Eh^4T$A;I} zS70n{zvk{?$2dpEkP4So3fgHtvf4CUUtI9=tmnM%xV!nn=f*PU9^IC>a16c_k|NR; zQFEi=*T4D|Z(hCN{`Q8OFJBmsM@-xC<;!PoANF_;=mK_R#XJcOsIf}uL*qyaGujx? zmJlPubRSDi5V7=aizNSqUK67CmT3dtoYN|ZuqBj)q{ zYQ<)=VZGUu5oPUaWHF@W)5zb~XxU0ENhn4iIEtg|C-0Q@92#se^RgyBAjUML3Jo~1~jsGvp!wNI{q#lqHw83XdmhSBGZ~H z=Gy~@fAPfk|Igo({_q`s@Z7}~C-v6>WGES~eV zLB%7x+b_I*`;MH#(u9PZ!6#6~{X&`IOo52)YIJt+GJZ9N^Ycrtu3s>W16mtatBzm% z{O9cUp51OlwFW0yesW)vI+65?6NR7sLd`je;ZBWFE}K^!OD&`#ReAREAd9t^S{`=s zJE0VrGJb?C=r2mVYPAw>ZQT$nc%OAahy_vocyr+H|M*K@ytv?}-@M}De8bt<0IrBIUXbdh1T`Se5ED2BDM#Wjz z@p`-F{qKLzahOnA;irJoQpEVOCX|(=D-qd7=J|-piOcnd$1k6O%&K!V{fg~&!*Q5- z_xXk)f-|NdKY=vQ;Abwa;*#OSd(^0Mps z%~!9;IrHxEkrZQ@a2QO9Q1{Vef(7hC3rlgPQ;MtYn#=Pu9`<{zvs|8^NnGzRGv`Rk zG8M_n$Vfg1G>J{$ak=X08cWi!xxT`*9q&JWWK@#ACU#B|Vv<9`=Ljj#w1!RB(OS!4 zzegzuDN2NIeO*zylffz@g0ht8%IH4kNQePj1ZUP-NzluR;V=?>fEpSQB2H;GUC(el zFpU#hDVoABwbn3uF9&oMKk{4 zoFZa$u3?%+hH2z@9EH;wg=S?;Q-GK9m?p953Q^p5lv3<=JFK%z^UOF+v|7R+ycc0u zg;NV+dq8A?(vS<&lqQM&T*WCI*`g5Qi#1@$aNYhfhp5GaDKL> zRhsDMrAC=%5&kKondgx?iY;A?p8JP^aevQt)8X1PssT^GTH`Z>l!z#XaV9QBWCi5} zfvpy0T8Z-lm;(05S)F3S7-^OTOEAp7x%Uq{7FaBwILo;d)6z&3gj&9+9D_13)~VJ> zl?+_2NfDHi>-#I1kig=Ch^w^JdL>nQsZVS1TWN@7(K6Zkfu9TDo?TNGflB$|Di^Vw zl8s_HoRiQYgm;q?Uq884J~D9Camju zaru(zxaa=qGa;u6xk{r@7DL@wg_w}awUY^q-2S}qiRIo_9!^2_KnmmXeL@N%sBkhi zJRbJUAu|QX6dcZppwyL-TS}o6fTbABiN+clr`c>;F19^=-*JAnCdH9FANaGMz2&=~peARWIDWX=Xf5 z48z1ci9+6(25lTlnUd)!4N=`E7U3HR2fZ3T6y!RES-6R+90Ec{L)T3;MFf#6u?K4Efj8%8{QA`^QcApkeB%CiM6Xx$U5}14huIURiCj4HA&U>TO^LIn;m!F4 zyW@dr9Kl(J;A#7oIVFa}K!};HQS@C;m_|v<3X%18&G~vm4vBf12sv|q{{Zz~04ZdY zN>ZR|O$;-J#LKHouGedZabQldti6bHmTC6PAu#)ZX*JH-#ahZ)%XYnHo<+2&jK*qB zOhTWSeGq?NBV2Bw`wJyT8HZMeDR^do67&w^L<))HF!As>;FA=tf;!8!UX?iMah!!# z<1GEUTS60zl>m)tmSTVRVaYVV*oWOC)s2iKoMnOLqp^68(f} z4IyQ`k9aTNR~46!oHEmJ^(tJdPiB;oJTG96n-D*X*iX5jeq|r+uqzp-CLWtZy z?)dHBk7$3S*BNUpw(r?m$M*7y-C<&w9#Be<(-@>yndZRl{Ud*Kd}Q0VY`abZvR37@ zK0T0gbu-eSbrG-yu@=->tP7DC^W!Lj@RY!ZTsYHG$4s+OR+5+VVU7{2D8^ix`faPpEJCexhTLT2}OUQtQ|S z*{v14sx}nmgDxc$<-lB|dYs}x>JOHiT}UZ%3u?mC>7G;ws;mQH_N6S25Oa_uE~Pcj zC`>6(3^F2;Lr)&WzTcqqO&Kl7=)!854dh&n_saz>osP-~cZ*UDCE+RhX<{B`LP#8r zqZALtMynRGk%U(YPsZoSSKoZa;pQ{DhcEPVWUUnYzxtl&9y$A`*XXY`T2QQea9SXK;4KFTeUJ*&nz&?j&|N<;6mZ+C%2@Ue)vGx2VU} zGq35&RjmOBb^VmrYXw=$_t8e-oD*MG596enVnf#}`mXqwS|bYQGSWnYvJR^=jm>ne z=GCi9ydSxLyyfzI1tw#X$K}lVs^cI3^5=Z`(>p#q>}1m`MQ8|tI4Zo)IOn8;j8U4k zbfR*Q;o<&)oP;x%vu5&l+&&!HJq;)fCGbodCtIi$`V?iEo~ND34pNZvXQ;3$YqS=J zW&E}@OG=P9@(CrQ&^1bCa_Qbn7o77VXeB*!qbREX>g*!@g)XlF83*^o5I82q)6S;kv<*iEMn6(yLqP0^QS1Dx{9=V7(C=F~~%$VmTK-bBe$)p>yJ5z2<8j z3ZhmJz2aS)g8bZze$AV!YaVwy#_1mh#)i(j58r7v}uS4B1^GM zR9Rt+WAK88qm2mu%04QbP4HPp_&!9G(lo~6O32ORr3mWUmTuM4^(&^QJ>CbV5D77p zs&BF>NLxYQQ&#v8i7L~z9Zk1ln&nxPg1MY0Wv`2=#K4zCJ>>&^-*bL;K}v~Xc*GZR zTFwe<8k}nZQ^eqgIM0Nbixr&wT$JT$w`ZPZ+~OKnd~_|*iwHcXM4BSj8oCal!bF(H z$TUTXMlPvsT3Ni85R4c_EIv$u<|tm%)-{0TI2=V}rX?uKSWEIjLO5p65AQxO9yk2t z)wLk!DbY6#rs;`#!iP{ObaHy+f|wqUM~?d^e){^7_4%3<0_%%&vXL~zMr9?}U<+v^aI1#8(_IoMPrB+KS ziT*}auk2W~Yf*~nXF(QqVl0z{TtHH(2kMkSro!UTRR`eKy6JbGAw0qMTr+x zyLw&_S5ia41IvRTTvGXva==U2M66|bD*s+DM-+=5Wi^emGPX>)@V+y1h)jN#&G_<~ z4=1Fcn&UrzOZxJO^Z()s{h#)z7avjP4Vi7ZmZ#J&m{IBu z(%+E}{|Y|6hwmKvZp+2j=WuyO_yEJVH*}jVuU~(~At!E*M>bPn%rGj;ZVEgeCK_k) z1u;{`a?F906F${~sGznnkdjy=U0l3i9^UZy$A>}-D2T=)YJ7f=IXM^<6!Ao5p`eas zCFH_yMY_LI29dKAhpn-k^=l%A!<3n)Ac;xoh{9lOzZ5*WxJqaZtre#R@e7>^B~w0z znVZjh!nh~x@3?V^pTBy+*B2MOzBuRh@u`fb1l3L%8M)`c65~jrY-TCl6wo+_Yg?`^ zE@V7MMjMA~p4dITleJus!P?)Xm@r8MhDs~hke=Q3ygX5LOaqkExm7Se_qU+U1mm=wgf$)Iz%jbyelrMhPWJ z#_nc$_Ki}Y)nXTwVqVZPw3b4$(jTm1oFsT9#z-tq2dW$tI?HQI79lk-2PMsjvsQ#h zTFXYRMNOXPiSyRsVoUEVI*FP7!(mU%31=H($`~WoS<@gM(oauMSf%K#gBWqfV7qRa zGGP=k8kWs)6V^D4%k1`hcEiM%`$vg7wzf=aETEVs&)Rh) z?Kt|#F-5X-^i4~&7Efjhf)pC7rAW$}5HreHUcP*T+jRWl(`WYc2yF+}p-~LOj@{#4 z{9{ck%6LSf?QBEW8nknKy1!?&>cA)(=V;oNyT=`K$V7CxPYz`)7D%DN=giIHBRU1f z80c+B+jmTdBZtG0aheHH3MgY77)N9xWW_K??so&@=s`!??09j0K~|=qu!3Uw;>1&} z))bbQ6H@@|#DYv^XljwQ6fha`x$ zX=z)FHkO<;^C;mR0i;y?YGKx=`Ktv4_ zN-5UsbFxYtj>Ez$ZJUM#V9K@r3h!9N6<@F0L zE-(3fbHmNeJ^SMXO7<5YX67JBe$GOJ@iDTX$(ZAz}SN9ma{#DW$K+$ zAOsi_<$7glIJ1PfRK9I4jl4FB=tV@Fv%&|(VT|Y|;v!5TfHDQNaYCy}QnOTEu{J_g z(^_0wblLZHsmHR;3%aWi8tH=BW|>IDVpU18Jkz=cQBbT~$h6q$MR==@<=EU`XY?0i12g2*X8Zhi&f$7a|9}KX|4ga6C>lrYWUeLdA?uQaGrjh;v~7_{4pj z*(k-T>3Ms~at~AlBcRj)@-6xBJ@N1U9{+D{ z*#CoJ^Wp{FZ(gD{*Vy0BywnZjF4C-9R_isZl-V2yy6X$>4ikqt@z;OzJK{KrWmPMR zVWnGQn3;S;X&F|hg5KsV{+=$*Z2K*1*Kmjv%9@i8YH|E1w;z>DyrZJHfRu-484Jc` zp-R(JICP}|mIat0i$%@F`BswIrfIQh$ywqrLv$!p3i>GbuxT{gb;GK6;%{kSnvS$> zOW(FUJ&ruyKk@x_wO7ZuwKk_t; zn5IYJ1Ys(Nmuos~-|!F;zrVR-7zZZnP_98+!>~WH+Yf}KXu1_m+X+WBC4AOA4uLQ~ z@^E)Uzv=0X<=i#2uI2FdJ;Us2x;3ur1#LB!IR-Ee4?GMb(=ZUVWxZW-d3iy~nd#A%Zv>D=4!c6Fz3^;_QaHV^`tW{RZpYpIj{P{7Jyz&MZQEl_BY_d~$UM(b5cQNs zFc#w@$I0U(BrI(!YXYN*vjmxhB>OW81|P`7M7I+G+#C~8LDTiL{R(9)(FZ~Z%znnt zBHqke5y`lyc-$SO!AOeB%PXvDgqxZrQ7{ym5XSIy82Ik(C%$@h&DY=jl+PbO@$u6Q z!<6Xz4aT)Z6w`QQD)b(ZN!+^+w><8i`13#iHQ65c@acw!hdtVL#V0r}0@{>P5namj z=c8td@HG0;+!_hn%8FPD`&cH^u}q?rk~7%22ICwdfpZ;BYm{=u6FW1{lN7jGf>4^S z$Iz2gz&X(=r3_6Y*Hc*u@JXShJR(4oRZ8|MC1>RVDky0*wU)wBsI{eVBobz!fp(oH z_<;99)5|f5p@1$_f#TwTQp?$ZiIVZ=|K z)>*kI>6AlV(gmc@Dr3zUB4O|xcL(NVG^hWY*rKFs|5mp|wB+aDN@Go5PbX=ISN8+gt9BcMSW1@h|_D zU;OfyoL^jWH%&}FNa|OXwGcxpv5k?K=3RACUQdiqmRwQ|nr#tIb&PPcF}hD0XWw zMR_k77QaO$!h(>gOIlq;H>8LwO%A1Ct)Br^IAFT)#AJWa zNcxz{s?d?7xzgIwbscrSR=++*xt~T!I#x_UdTpi1%9Q9{Iq-ycX9y?`G4uI2@piXo zw}0YpoLPPK729cIP=-T@9On_&7ztNU2(s6%m{j7AU+!qs9s3la@7WDUrV#NVOZbD4 zbT3;*oW?o)?D@PKvF4U(JTRxkF$DUHGmevZ3ePcPyAI==tStpizhX9uzyEy4+k4IV z`G!Cw`vWguzhQhh;ImK|bkhgU9dpt&-5Qdnah)`ADKaM+&BmlS&XJrW-Uh<` zj@>wM|M-MwiWJ~r~1wEea;j$r@DWABs=rTD}OQEVu0a&ZU6T15x%mfw}2ebem^#ohM zP%3?*6x!v?QUFmV&`N_ULTq#`u!~C)HApNi>m;Y5JInmY%2(>R`UWc~Td-YK&%;yU zUP{w){*{ksgn=&%~KLsktw~bV# zV1>iw#10rDZBF1NE>j!vB}7SgHjIJ8apv~^k*~h~8N>0&)9#MP`$u;751g-hd3(hI zEtSGTm9-LsC;CVnJx>o$>~8K!Q(||sJDhf0y!x8mbl~&f++kn*iS}pL@a90)4N7l;2J!=Oev7_) z;?w`|Z*ad|)9hN-%^4h4#CO2p@n1aK%@r3f-!NLs`%j;_KkoVZS3hS8Q|Z_u)+%g* z5QLbnG7ux%Rma{M_EAR5F(cg0Y=~Lo1B_n6ALcZ1`*ep=7NZpj86#u`&NW!)@G)^5 zMzMg&by!{Xqm}kjeV8c-v^)$3FiMd%jFac{=Nn$VdBb|W#^=Zo25|>bGRD%gLODr_ zlJ1;R7|TeSBz~InG;lZ!q8e^joWFR#yH%d40}yUh#CC`1X(QI2`0)iaBBQX^IjH+A76mjWX5c zniN{d^X|N$wkba&j4gCTU z<@wHv9D^*7+CWm6mr9;l(V4dANPV+Lp#P z66BH+361GD?5Ba>-Q1&MU`m1Re1@mJ6nwftX(y54+Q~K261b_mp50;3{=+RXjQCJc z=i^AXUZdL{ts9(^0&Di3oWZmmF-4wY<`4r1b!3_+j4^ooL`atP`eHd)eGr6ESqrWq zD$VR?vR!lZFr>ioPakR8JF;y!Tc2S}BO~xR2wfy6MlZ!dm=igQo5GYL{OK(@D@@a4 zjYBENGzGNeLlA<{*Aj}O7ys=2G%-w(ZkVx+qif}L!zh+fPAL>Jg0)IGan3ez;Dc+04H#%YUdT2`wS!sX0lmoQC-%LY;qpX6>u+pWcRt}!LWFVffstu>SO z#IZ0Ul|#2u%r{okwv8OTIkW9LK^~h{M72sj@6@%BBgtwBGqJ)sZ5k(^tFa{+&lcOo zz%&Q6wj#(aYuXsaX0w*!*GNRQaklVUVH`cqiP$kInOGUUl3<3eqwktU%xsN_#A8hO zkjUDSm13=X%s~@+DaQMz;e5No8F5ZgN*BRlp%i9uUD8%#8zG1~Yv`JmRoCE*gqp+{ z&`zdLsU*m{C=@gwdc2qPyvADkuBGc5*(gk5uIM?8u!5UkT+mmMkDHi+D0w$7at)_29G_1{DY6`8qpe)KPyh>Ks{X1@AL|sArTF~!f9b`Q;^YDWwQ(wctfifT z#nLs)?*+ul3t%cQltzzQSeC+C#M@~(m&7KnpvECrv{M{xis1O)uQL~B0w)SaMVVFk zEV=xEjQA(ZwJV2SWf`#Gx|CzFunXi2wyB_5)v`k=y^JN7L#%w*=Wnp83S|sj3W|C) z$`#7F@`H=0MVI5hcDV($I(dg?$dO(p6cce6Nux(MEqZ%Sa1B$8qJ}+W?1Om3{^FPa zi0{AqJx`C1y#MxF&W+;gY)vjgHf3b7#4Kw6;3IyV+1>4Uy4#@xJl^hk|HEg<25rQX z*r735i8pD^g~p*7M$aFe;<_`MzT?I9n#=1g|MIW@ z6~{2jCZGkQPbrp6c3CIZ+7hu^mRXik>C~K6sobgYDgC6N4!Iuefx|%(+`6tunVB5a zf404yXuF<% zo*0UmzbXZJ{gugt=s64$KU;lz562_7_jjC~ZREg-Nn$TULX|kTm`dz3xdyc@4`uC4 z>vKdBf5f^OREk#Zx>Kr>xI#rJD1khWrPEfYX!C{6L`_0Gg-jSl^>L9#vIwh|n^pO? zs@%1L{Odx^I4O`*39c#ndBw6G#CE6#oCufK{Qqrg$OfhB`;h9pZjUmeDx0S^1-&qG z@Ea%`;1Zf+jertGsHTj<>xNGuardY9>~;^(bbR=C|3G$@VG4{PVw+yPJPX=@5~O(q zOxtsK+VSvoL>)%q=x)#GS6k4I1cVsmpix477=6SiMc1vE4v}M+NhGE`L%XJ13pK!4 zK}17{WR-EwF#AMQMmXwo5@!VOF^>n%&dzbxG0&AVog@rHX`E_^lcCibuPxq>kVM^W zTu-}h3u+sM>lgz{Su%;HYf!miR*G>fG11E4Lz1Z1vR^6`xoc2Zw2WdPWnz%VR$Ev2 zHC)R^E2_?&PA*m<&bV$p-;q^ znWhQn6kRJJJGnU0T%2#QMiG)HCxvwlA;~kYjUlW8heLy3btUaC(pbmYW`nhm3R2dz zB1%)nR+bYfD>j=BU%hM_L)W=dBRyw)+XbJaFN+!#uB#N3MwtEiyRFE$zRrb#kXTDx@I8Mw_ zv`jt*VULxstA(Wec7a}(Ld`n4_ex7phxbt?Y*{T1F16OGf+x{ns6}K~AyKu^@K~NV zI2E7ue8|)yxbt072VQ7u=l z>0&5LE+bu@!Rybi8R9RzT;zPZpq(+iIa^7jVWVK5IR?)U4UJ`6W#PG163HhlM zGB5e&XTRd^(>r!wZh3b+@aiA`l8e`uyuG<&&JDq|%u0(F@L}Nb?h!wDTGOz99C-Wo z3n?3nvx{;*i07(R5)s>Fz z`e)zJUccan_aFFp_#@X}y~a8C^zJh$8(iDa>V%GoT!{ES1m@YJRYqsgKVuczwKP`I zC^*~pTwY$V-n`;ZAKvoz)BD98B4yclQV#fdQcLTsF{QDHDWPopmIbJiD@GEAdMWEaTXMJ z(=}|@E8;wIoM+-Z^X2}L)vCu?OH$yYsA0uFK{ma{Isy`oaU72Hn=M&E2!cq|b~BX% zS=+)dUZxyz*<5s?1W=tLDiT~9>^lB0Yd_abK?_~T`>+(l%UG#)u<4odRTb~eLI$i# z-B_-_v@!X|-Ecnf#;S^1{2*&_t(Ia%m3`FIy`p%{l2k#Viz2;x-{iVC2_?xoX^v8P zZC09;!{U!p8ELYCMHC5V^m3u%*mAx-0}|dDp@$eP0WrqO z-kcKCH1hOl3BCg|o9&vjvyJ#HCz!*GF6dUG9z?=F9FGIz)RMBq5?`F1(Kk&gT*^8} zNnk-1p&Ci3N9$FK4<4lw+trHgW<}FVI83FkRbG0f$tWdbfl zUt$(Im7Gbs6g4uDiXjr_iN+aLZHLiH8jF}jbz&qj&lqvLs6wygB{ZUG3{4}v>|6ku z6i=h@m?bq+_B*xkR&&ZS-gbqzUmDPqVfIB>ixh@A)Y$n%BGNXN^{S^voU4*jDOOg3 z{t3-MEp$z#vJ_ofk}NAymZf4B)H0^x1+A8SLYD$kYe8^pBBoJN2%}Z8I}0N6s?WPI z)n@~%<=hBSbUfDDrFW-Lk19o`x*A(8O|wSq26?vMq=gb!w(`3 zC`$F*0MXqTo>wYja>~V~ zv2e|kLYq=3spcD_si8%`2>z6;d=FRJ`u66ag!5U3E@GD&jKqXJB6|Qk;BV*%-{R2uD>#e$hm5reu&>%@YDJ7<1l7mKD zoOMi-=jQI7&3cV-mepz{ZVXW^s3*0sRl4vBGd^YJq$D;}8BWY;RSd)BxsZ1xJf&&! zJU$(Xxpcic*BwAyOH8S(izj!AmH3~R?0NaVX=z5XDqO45(311wAt~=eLS%IL3@I)p z=*iY6<;CJg>^DUy;eBM7C#;jPwjeUn_1m)V7;R;=UyvQ)rb*EYnH%QY`+b=P$l3pg^DX#0wp{>B_GHED^YE`0X3zb7+MH49m&isb6;ardn zqcN?BXN<7MrktQ8y<^yc+N=zo|F__BBndJ zv7~wqE7|{QXhOBks-XkITj3{mXU zvLY0BjhNHIHPzbSoFM&@&l9i;)~l98W*kK993mXYSuF5UD(J7QVQURW>B9M!>*2jj z@1}Va_le?4(>kFrnA(hFDY(1N;jE_bSHc?~C+;4091bIy#EZ)d-16LOj>E__Pxv{A z$TSMr5a&Sf;)0=-!CFJpwX|)EDN`WIeo2nJx* zvKa@95(V3+HUM8mnMYcam_)w=8Dpf}kr;Cx7&Yl zU0#ahrQ=BD05092Twpo4t4c4WM2<-knC6*{Q(SEv|L9`P*RLb)=Zb&wU;UK-_P_a` z`R9N0p7zx*NX9Z|Nrw3_KQbJic(~s37vEg))t~*8SHJiMb9u!#uYbXR{pM%hhid!`srwkHF-!Q=NMBl8LA4&zLU8kKAr>qGkg*m|#T%hK%1 z>-U*$j=3)4hRZPNE6b@=trjf}U^Fyp@z6+s9vJis5BztGZeHMl0Sy`wf|9AxY6+=~ zvMRGOGknCg=N`NF{tORmefvZ;+%gdvdE*}UnYregYt9(7^`ry5rMyqvEvfUB$w8`va46W+@}iucUgMpA^dot{!q19B$SmI>{~dez&Dy;V$m_Yh|d#z9-na8q!qNp9*2cYMg==7z4@ zakIMN`0$vz5*sYBle6R6%s9OD)V?Of($;e{YDKi$ZOCy=-LyC_hZIIGVOMmxMlRwM z1q|hoS#5f{J`#*8r37mE#VFPHQ|4#SaE9(VMQ`gmaNE>IUy_0k* z3W&&*G^`vGCM8lFus~DSI(05SxrMbYgLpYh%e3nTs;c6nk3Zt{-VFfGXv}GrwsVeI z3qu1=5~qwYW4k|Q@Xksn%R=l$Hh__~FGfZtLJT-B&LMTvjIFovgv=^!8Q*X91J*XJ z3ZU^-t>7YKz0+Y8w5ZDpYU2pBip3E*i}!TVdgt;Qv;JMx*BWq6+mS}QH!+J_jxsti zsFXw3K-AAaE7R+|f`#$x$9Fw-9 z^5wIY;DyzCN8bfP%wnk(f@l?yppa=hk#th)R9YZwYlwq5B!s{)h>HL*Y0&^p<7ujj z*`yV@K;>wB&5&TRTywoxvEJ-t{y}x7AWT~2E9%ORj59{oe&`2D)r*m?>verPtarG| z(N;B;Gn^dGIXyY%U^bzu=4>|umzN7(zrEz;n{!s{EzU{7Xq;hEH?qz(jWwi5A9_-d zL9x&c+6k11>{=apDp%?IoB81JeVY1+?RLZJ=7z(gW48Uk*~JZ)R||$Hl9Z-u&yJ6t`>W1^H73)pU z;n4vP9z3G!wm9b{jc(V|MZ>m>YR{;Wh!BZG#92?%R3r>T0s>eoKKs^42gZ^(I-GNK zIMYs!0MtN)IB2nu$j%}0yoNXkFx47LXVL`Z7Acwx{$}m$nUR?WNvn&oC&q!CrKm}! z$O8&2WxPwI{@Y9C%K5bSi-(*FyHR8a3NmxiHVeaCeopEBgOEughce=jQZQatkRMBj zRLN5<%nJ~OJ+UJlDovm>@BA?;&yzOdxW~!y9iXmcECQ&@06Jq)V8-s{IG3j9A)teC zg$}1w3*-Bu)w@*3Mh6BMUr&L+d8}CB9X*MDpyeN>UnHRF&Ct~16_{WcdI4%c9ENvTU;!j`RdaNF%xo^UHz`THvac)RDzZzN5aHIz zZRWEx-kz^yXv+z3shdhzvK%2hQXIIvTJz2GGj5+8b1<)zIS~d(GSLBK0)4se`Rds@ z7grl{){#>a^?;IAt#R+@s7l)zWq1{U2)}Fw9vJSR@`d>vI&> z2Rja*xQupYJpHici!Zz!iK_V#`VrO3Wg7NAz_=2D6h zGoIDH%{hrJwT6CE^wPx-7V+@RRznd~-V-%|MeUn}trdWuGgv3*V0v#@001BWNklu;R!o`7J8JK>aFx!Du_DPyIGpvQoap<3?XDw+o~CllCN+J(6`)^L znz7dbB+!s z%%%->U9s(Y7K;_TAqrquxk9(=*seCDoS99gBn3a-c>(Xr8s}VOGulE=neBGNa^+ilryHsgBt-q2K*gM*e29zUdMYXRkHV7=~m{rZya zwi7SbtQK5)SvPG%Hw3DxR)Ao|DZxNUgIHJf17VQ!R&KnAcaD%6oT)fEI$}0$n9pZS znki>jH@vx6a=l!$+jb0Lz=2-I~*NMC2=)L2kp(-l4Lwsv6RcEqONNxI-S=JK!)67Z7u1VN$k~1C#9+? zD(7*&#`y|MVm@#9;KL7Sy=O9Mi9{YhexLJ;CFhF`X1S4l?Q2ZcP}xfMUraiDDf`P* z%8W*X^Kvg+XQIvRDeC0>0%8Vo1N{L%ZB7E@Rly80fgu0TH%$VT(`i8d`3;Jjn zV!sEXiq)L9>N9eFXVTcwF(U@bqek51OpJlP-(hp0p6IZd7FdN;!01_{vB3o!3Ii*I zqqTcWHifqD;57MVoaeAkI^7Bl_fc3`i+x5QSu7Ex7S$6r?={_~0MP>S##bu8mjV4U z5Lmia@*XkXZw1&h-dDKtdF~OYSa~YRm$frvEMv57Isf%pBn9~%-hF_=0`m@vmdhFT z-!pz0AgLXaerVbR9sl*a4+^M-lT`0k0iIES2bN72xLz!{*H(nh4Q{dJ!?nfbC4RN$ zzx$^@VDcxw;E!Lw#NWBkwRLpXlT%`|i@ds6@$mjJ@A;O`|Mnla{)@liH@<(D_kZU; zfApVzOg_KnkAM6M(>`ElC!}nJF|yK5uvuWb#o)5EKH?A{XHrO{Au+96WgrcBPjVIK z%N1`fF4!4EJ3mmHF#yFtI={obuJ9gw({TCxHI3~!aNt~z1-21}u4lFDS#>*>F%t2l zXsBbtSF#{uPWwyVI6^W+3n3!Y(Y_KVguElDrZgA`p<~;31Y@Ks&5)zCMYA;wR?OL# zYs+@maeU_%_a3~*^h7RCX^9Q=aZpW>prY(7xdby9c|5B&I%N@Cr#`qg>!y-b;GBTq z5**MpGx}u3kJXG_6j|=dVhu5=y^64}UWevnUzyQ~%o?$EN+t_%v;riom3ZVBBi+ym z>uoKSm+*m{Xx&!bGjjN_wEBNNJLK(}HA-~QJ7939knC$0OKB@T1f2d)+yp1-`{t7mTsQ9x%QezP(M zLYzn;Q`$p`eXe@Z_UEJ_6|oF62zzG6T`D$#-WLv8TYcsoW+Dm8ZY?;IAqAC^l)5(K zOs4i0?8DbvfDAZPXNKv$!3W$f0#p0+^);A_~u#hzwav}|p5Tq3w zbEIinjI|6yCoG%ua_MBzvga&alkBA^-mG_Qw_6MuuaoNr$YB7$Rt>JIu(pyegOTUa zcLSU4mTuQ!jb$>KFrBqH135);vxySrUbhX_ifn7U+0pI98u7DF-lwi7+$?h`?l~vl(?==@3rDTTijuvIb&Ege0=F?RF!M8X<6W zIOYER``kV`;PloZ&U=3K^)t>cR`kIVlH9D;dHQ}w*F`Xvz7miwG7HiC4k-w;Zk(J0 zDUVEcKNvtPxH6uqmPw6%*K0x6U|d7Cj+hfTPc|Ow<^6Y7K$Q2Ek3al~Z-4R;DFymo z?CYB9inr%WaY%6q;xOK6){B*%bF~l;WK5Fq4r2|K^Q6=%*^>o`I*apaeMRQ}d++h> z?|e#S60^xvQq9(1vfXub{U9;1t`c3Y_joJ6_p({E5OK;HMq*HwJzJ9TBCRpvH|$*{ z=Zf>p=QDB^0DE<_U^+d(*a};T(@CaR-LS{{8tW_l+)Hs@10699U}R<@8;f_9Iwg4d zyVi~G*)T-T&)x!&+qZ8spU*izzrmohL&+eq%i=JR3_``}Fqn9VTLnjw5@-$hT7plk z_v86Tf|oDfa5Q@#=PdKtl$bJo*ON(9O+~ls>4$-nSKK|lJ4!qXCz};pl^E_~L00xw&S29!Ltxr& zlfkmAdmu9O9ko{omj*`pn4WD`DoB;N<&kaOe+hnb#t`$~S!dKH7r7ke?v{Nj4j-s; zPJVugKn56tGs3>7Fh`zW1+|dvjSk1MvbhnRdPq~L{To; z{cDDC*ikPs^oj1DhyJ-pFXYvFv;{G?Rm+$DzD&@Yq?L<)n3<%svp&IW_Y;Kq9Rai= zdyHuRvXR{G97O{ni6_b+W9g&i#l@P5y2Gr z!ymtXMLs@ZJDakz4nyK_nU_ngjWIE}G% z)^R+aVylW(4s1*oiR`s?;1DyNkWwOqo)9ua z7xsqZ=+8D%S;ZuIXff?S_YCwgiVQ+^WFbabycy9U89DS!wPLvy4Xo&sWK$OxgPf#E zA1%aa@XA2ivT>5Maf-CYW?`8uLlGuQv}-Su&SlcRsw%vNl!d*+d1daz8#qP*Rzn;( zf4#sMM>}n}x>}GD+}w2BES4B#NXi-+vKdmQ*Mip+YZ&8+SiX9C#>Lf=+qVvx&7|Gw zjA1tf7B?%duQ#kVk!}E^0tfj&E0Q7A?o~RSom0ZNifs^YZONvW{cFYpKsp*kZMQo) zbaD=aeh0xanMz?7gMeLW*<}S!c`TkBMx_w~{)1|FYcHnpRqX|Mra&G7RXri+#B^Hm z_~9wX#|Kykllh#lpT6L4Zm!7zC^6@@!l|P`)U%`vRhTT^pX>D&?+tJA4bEh|O){;I z*wod|lWd~v0x`;&Gz>{n{+demt#-OZ=jRYTqJZWQ5*WuW$lzsLR~oq~vIAqi_@Y~j zrNSgh2HOpWKFYdms}@(aq!5&G_Bh*;jb})rXpK3Na$<;)oEwp!c!RH}SXV<%gt#LG zgRufqFqMFWoH4#3<$?Kh!ViD*H;KCqi^~fR4iEVDXP@zlUw*@j*Oz*+mmw@mHiKNq zE-CYFFuo?MB^1VwE!3Q|7M_3$INy+m03P0Z_>kZEC%?_%w4$v&*;wA5Er{t{67rm| zQ4$$0Ap}m@T8VBI+o!DTQ7J;jqAZD~GHCoT(j9WfV!ebRRh57>ol+L(f$<_X7G&*VhZ)zCGjC(VWWHEY_F2eD#X1ACP#;geg(6Nru$CQAZAx70*&+harhn zBb6x|qnch}ah=lvtvK-f`7>spen{7MwC#i;B(4`r`hLI|LtWM4C{*moLdJNxD^lDS z$suZs+F4;qts8CAMv}~0w(Bk5JblV^QqxqP+Er|pD^}|@M%_1J3C~K9tbE4SNGo87 zQHOJ_=r zE9$Do+kxb2j4^m$YvIk0cIn)DN=f_gZp0 zIwI_)z;a&{#{;HR~d?EyQb|E)>bG=NFCY-o(7aZb{7Foa~-b^~=i!F#KhW@Lz&>8;zW zt}eORZkbG4Jh19IUS4c?tJB?a+OqC?7<%p;%^)Xo*JH3WzGhNY>~ z7*3@%TD3{RYKX{zqn;$vQcG$h6(i&UZzJ9**iR*D(m{$?oSJYKvvZkD%?YYXhgh=2 zXhzkfIq&HD9_JmWC%0IyHk@BBhyiS+3~V;zx-Pq0S~jvDylu!iaeXteTwmxUueO~O z4O2%Pd7VR9syz*=~07SjLNAa1s`L%yu`b$4!RV_iWcI zoUzpE!Ae$rH5#KF%kvWrn759K(q5M-VQVz1+#u`$U}B_3vJv~fmgQQ+dy3v*jjas%9eW7jm&j5{+*e7%(=;C26JTs4CIii{whdwy*J31KQ0I ze{Rw1RaMPwI%N~K%;!@9ipJn8C%}G4vgUPIQ~ZsSFkm+0eXWIn!>SZ1A;A-cX~`KX zUz00K2pe)TEN+%uUte?3+$JZn47|Ep$azq}QG_%EJ@d`4NnJqXBSB-co3^2<<=luN zX#o+H$kAKRI;yI{R*vkWXm8(<1xZo(jz(MWH(yu8n7F>W=H8uK+`V@PZ$%Bb>$fzG z$9YHJ2hrx1Q_5(3xJLJ8y{xl|0_1hygH`FdlS0&3b#4gUEUtO_)ZpHKL_2A@y1XXE zOgovf?GoF#RkBX?+#thGN#1wy5_i%GQP+~f%y}=7+OAUVI|BMsghBn{yFPG!enH8x1zCAD_UMseA@T{YF9_bKw~ z^&6(`eNOM5Fl(pc{E$S8E4k8c(fYEQq(>E*3%06KxEKcIXv@{836O7dqZ zOJ4mz&AK(kaeGmW5w;uDafB7q3rWyUz)29w> z=5jHRYfm;6W;Jl|S6}fToj##G3A9HS{K3C`pEhUykN@*ay7@zBrvz1f7+sjPtvIY( zZcnCMoL_NvbpusPJ(-f6VV5;?J_L5%j=W9Sx+UaHUo?u=NDOhz(xz(~cD-bt56d+} z7$gx02*%-?2`*bY0|6LfpmH9c4K9hVV$9++kgQy(vcQw-o00$oFD=uq>lt#SZfd-B zGUb~y)>c50scGGzm2X*Xw+u0Y6JXs386b#J>|K-+Amzwz*AWm6k&!h>ncbFXW&_AT z;aGtxtI?M!brCjGY;nfDo8&6a>~%&d7l#R?y3XjuE;=De`q@z1$no)%TZa>N>m^rL zJ1DHODbQJ@9vGv8ajJ368FFG6dNG~1mc!YUrf#@<_mqQ!0}keM$nfQt-|)?|Hv-JO zROE6HsYOi6qL&@DWpXLGqA!h^m^IE?_O7s2Mzvfa6&D);rAdDECUNU%!h`#F@s*)z z8&bA>@#Rx~@yo9WeUE&zPKsxFKV4~Yp;kK~C>xO(`Yq82)03ULB`C1a8AZIY_#7p2 zp!k-iNFQa*CA8gUJu!+Tq_(i_w$fF}iO+xbGZL~^Kl_AzsFYVW8Tr@DPf*s@kqn%;l%9v^-D0n6o*U;Oe5j!tf4UCrP9^m8_SREdR5 z=p%{%J-4JN6#J}%wc@!d-75RFy@!;+$_wF3wZQ{|x2UNc1o2Re%Hm@2gaDvXX%*79nxo8e-P#t@w#*~4jsLW?Bpwr^N_@P=Hnr6uQOHONU!VZi# z>P733riHRrrLfFkaRg()dXai*VHiT<@Z^y1eETyhZ+ZRt4eQm8$4?&N-dwZUi4;aa zv<5MF2PR>>8vzn2j{5*-Rg*6g535#~l`D6zeA-VQKBn@ut|8BSUU7VK%BG9ltarpl z94xSwVtXcxo7^XfgmqpdOh%k}oR>9k6dcR&qmVJvw&m#fgw3{N*Y}*geaoYVk0mnM zUgK=SCF#1@Y_T{AEh;>jkuFMc$jIJda;5|=V9L5Q>i1hw*HbR8mpps^iuG#6dk-Jd zv=g?Qj$I#!F)^FXRQ?l~v=i!TL*<0wFXzAf_>5KHJ0_ADIaf+LDAtmb;ppTRckbN7 zduZDRU$$VWsLL4!YN~1aD_t7Y>ZfzrmWwV@#O=F ziSdn+gL-^a#%VirBKiL(-J_uM@rBte4^#kf5~^NwoWf92UZYan5@wMJSW-1%mmOzm zAkA-+oyB!qhF^TifBx-n(}aQH{1x9hy~7`U=Mn$o&;NlJTZ?Hu+Y}g_p$9lTB-)zc z7Yla%7yQ$I@q~lVpncHs`~THPOk&Od_9tJG+C%celyx3tk{htL=4f_E+Zw+6X}Bc*nGD*rhcY=yN7JSuN`n2`LjD^cHp@ zvWtlx*n}kUrpD66M3pr`C?||b3FVn4Iy(^6>6$e*1@?@!shn zHVypMU;db%|MFL=p_8_~%@BvAhmH=P6%4GquGm0Lr&CVnGj5%naDH*ldUeHvyZ89) zlP9DY`R2tXA!wv*jMQ}vstu#~s}>!Yo>e*RZDL4hi&Y*u#i-fvd%ai=(n;ucTU@R< zy?xBX2e)V%(Zh$7nSAF%&R)IX^{aER6=c;z8r`?XP${z)`<@&UE=%MpvDbn^QUtBF zqbIMtuNj*}<6D!l1eL0Y1zWNeeN;=XswQ`9>iG6ClR_i!x)JZ`#?%sL~j*_$_1fv;ky^MA(42cgO-{rH9 z9^xH3AP1j*>qA~$T(W$7B@PI>&Wtg1ItVA**D6a2q$si#EZB;wsYOSf%lT@^IZ9VX zlfs@pd%?6Z%%?3wKVY2W;Al>Jy=J}KVK9=yXT{UCPpHg6z$xn1fHmqEktN6hR9`O+ zFT*hC)oz*84Ttjsx?RuLPoL8?Esx&2&k*0x^-Drf*B=EC5<_nw8M2-msT)LQQ{)$F zgH|q9k%9>e=$$g38oL@ta-|IHicU7?Qd`SwC^8T05)U5SCmF+XwPvwc&`#$Z9^K~o z%QFC+btE!%|w663Ap@#m-GHZEM7St-Q`sz5P82 zq4qWAK-kKQ>ot*x^#+qfUuy($%FSCm-AmWX=sW;Mw7HcZ6X8TpDwJGO;I<2qi^Yj27iGXlyLXYHKIPII=PLO8&Xbq{yNWZflf48b?T(m#@y) z?KUi~uc@nw!{a+#USA7g5+eJsVHqkd{Fw~ds}@)pIs*!97!x_2FU6<<dGskP;_Kq$IgyoxLD*GIVzwm_pH@(wSaD!w-MZC z#{a~;w^@{qQ31{Rdjq8dl#O~M!ze8>=H2f#>I9)wns!)50BkJTYQ<#oI8ZKgX6o2e zumes~J(VmFxkMVBm`b;UY{VjMd;{4tx_bj_$l{)Fr}HpKl{Dk;I_NPzxp?S z&RJUGCpEo+kYE{Bn9Twfm&_i2$PYh#%;xX@K_miXf_L;;m;vVuvvxv*Aq)fS^_rNW zna!!2hOQr|s)jzxz}V5DSV_Hpb51`bdS}_?O!RWu^>HBT`w&7TT0@OtP`fi@%V1m@ z?VK`_NZ4uX2E_76=2J3_k;7ZU2pmHaO|V>s(l$$Es@g*`1O>WnJ0YdaDy|4Ait~e! z3mWH`&1c-ceZs-voXf>EH>)k1u4A!UGxRdmJef>*{P+=*wxJt(>Z;+Jr!V>H`AZlt z_RdNctRm-ZRY<6Kp(!g}maO?Pp6ncifBd0*sG(38EpR=nKm)ARXo1VTOn9gQQ zr!(>x6}|`Y`wg8Wsjg_Q204i2PFEdl>B3|wDB~~?wjHZ(O&mJb>m^@)^@7TKnx^6O z)*a>(izi47F=Bi#2Z}@?dsi`Ur|fnR261H&z}=B;MG6DaNT7f-nORfOI74LuRSq1r zHPfmh1-X2)g>4_$g~X;$tas9q@)O6&@s!PG%e3*-)^K%x&P1p9$(hAsi8YS8lE_(U zLkj4Tff6(_xagbZ&~w(|oqn(Gg<`_L-HCgFbBUjS{&Rl#gCB5kc+7em#t%K~MN#6d zNqV_!w<4o5daJB`u?<4IWLB?%Y{tSY#=yn-CGq|H93IT+`ku{3B9!|OBraB-EM=Y| zr$|;85g9!6h!RKEjPVt&xKt=pCd^wBr-&@YjdzY8{Kjwa{=-wcZbMFqJ9qBz`s|9Y zp1vW*fcN#d=BujGixl;TEkH&bJ@nv*9LMur_N7zVki74A@7?9M|M72gF!6N5hUs+1 zri;9KdreL^Vwa|c>ev-DYB6R+vX!ceb~=TWM5~=jTU0!0jaARqN_42smzjZtb;>N| zOi7o_N!(?e7l#&c`jL5+%2gO&b9udBx7l!TaLjZ*CuP`moyFY`;(6-{NVpJAlkjHWA!F>-&yZ`_o07*naR9slgY=lk! z`q@jSlZNHuhKtJ^9zA}%P+qCn)PZcNr(uG48@ftX@Lc#sQ$?%p-x`66o%Szw^^Qx z&JtN`SZ_Mkn?z+r+Vs^oFH{mI>te`(m#<#)$p?=(n9b?CEjbSYy3+u~|C%UW5aULo zE}IMyY~}Te(r$S&+$=l(?q^@{@ZN2nJbcKTw-+qd9os%gAyxp9)pI2)A)>(08b@}@ zo}$Hv&SI2#HBB4GW;v@v5Q$VsGSgCQ4)-z#WnGOjwF-Fm9sZ2k5Q$_)!EM$DDli`- z1sDeT9JAWk>ETyMU?HH2lSF#wZljce=mu5hSzGOt;^)`d3CgWLS=*RKiIGNhKlSptb#H_Lp| z&>kLeZY|5zhT2zZffQ)0rKvNsw!zJ2IPch{%r0a?HVnovs01KqLl-jHi(^7ak$@bG zl=eSh)EK%?ftU@^7?SfNP%OiAC6+QrNnx|zQdf>ZCvDev7H=3LvG~PWi^DOQP6;Wo zT&)=T9kp+$>lRa4>e_SX?kzs};C&XW8x}WfcKyJ`)q*d-ddg9nP3TW+pz zm`pX|)7a900kcobDVt0-kXCx86i#Vu@r)BrdPrI8=)0acbdUpe?3srxkB<)64UzNR zAij=C25OSFHmh1q&y#{eiT=SFL%-W{bA81Jk00^y(S33jug+l*mNLf3cC(?|N-|$I zkgfR9N=QJ`eI)zC6t+8OY*Yr)O6y2nq7lWkumDD_timub3;|;kPoKRY#w}-WU(?hT zj~_qe{OxPDs|E9^XVSJ<5^XDBcD-BzhQouFJ156%S8KX%$MNAI>zgfC*DJb^h*@;! zwKX)}a4_-QK5RLjIa0Ua^kB-}+b0sAY`}O4z*w$#JbiJ_<@JtD7jW&A#~(c8_1iPv zyy}@vTfYCjZ&6JfhLmY0Q+z!kM#uK^uOvt$$+=Kfmg!`|dbuGRX=e>F;jF9$W97WD z){0IqMjaNEDek}d+n?~@y}Nw#^fk-nj(_xzev9+V8y3qI#>zCjEHS6&x*0DLIb($p z%~l2xLr!>ITYEA9lFdY;ewlc_c>0RXcEiUXJml#3ko9`USI=LwxY>xafHh;GQ?#Ec z%5YrD0f&PKnM76B)J;w4jEo$GKp%{TPNbBumBV;X-OdEy?Y7jD11_$X^lGjz8d9q* zZp2X|Nf^$^#2H!dWuIB?_$Z8(ooNi1B*S0U5<}$jdd=11l7oXow!4ALtA!?*WgYsL zWJQ-H#mpE~5(KsP!bIvF8)764;xyo`401Z>L{B{=0o$U9_E_BL zV;l3p*Uw&XIG=L<_6@gh-{Qf82b`Z@^Xk=Wx)AWr^4|Ts{O||g9s-0-z<20z7}a4A~iy-*aQQrPj{wl zU{aPSc#{}?cauru-B&cW`U6NqAf*9P#V`zX+Z`OFckW63wa~qKl4UJWMsouc#ub87 zzf=CK+@Io>B`mO<7h(yU_WNI@O{k9B=!uw(%)eya8v-q}iiLmu5r0iVF#cX;Af}wK z?|fw_!8fXtkaWnb?5?gKipRNrC6g3<7a-1vZ3Qz}d>MP8NF0;_*hAku9^8z7Igc!e zDmEDf)(Vb`#D7euLcx4044=d1q!)t@50NnpSevv(BP@)eBAQ6=Teg$HTPLFHc>ap- z-oDMrM<4L!)hoL7k{>*LNIE~~o7GCJsf@%1Uv^7k-4Lf!{-2j?`v2*t{Aa&y_~_m} z!u1WGo!;iZ{H-7Ium0`7fMHxo=3xmvFI=Jgq~rjZTbG(@#Qi&_Tx%EJ)ZhC#aJ zR$!6nF@^oK){a`fGz<(mk*(^SwADd^Xp9C`B&JP6=zDfyzN&VEFFxE1)Iy7&DL!89W{$ynX$a=O@oNJU+xb$)SJy_JUu1 z{feurh57=^VH(50ZnKeeBej9c))B2<0$F0mt+hILR*FesTqv)lydyD>QX-QRleXnx zHlwL(?wy`;`}BnQY|68zPuZ<*nAR=t-9M&nEYr5)a6aYY?Hjx`%w`j6=eV&Oa%}j{ zr|;8kI==e)C1=+iSIZqaIjj-S;7M)x_`~}g&0x1kJh*$rM;|;9E4Ub>Sn?Iui#2r% z>viVk+bdi<=X>A#kOzjS@fcE+=pZy_g|W`c1QIEf;T zrM-<eR)1*jqzR5}#XDl>+TVRf$({j0xeei`rnm_x| zU(gRbh8V=c3dgpS7O8c@=naDeN;vDVUI>>EgD`x~YCB&#FJ9$IMNcp84sy#_TfmxJ zQx=Wh)&Cg-m9nDFIZRR=eHiey_~M>lTyuGGNsNK*?u^%OE@f^a449l`Xsm58CULX8 z;(Bq-Y_{fVal>-CAg81WVXE;@a_&28HM~Pe3g?7nFZ##D;)aa);68i#ioOrzoS9E1 zU@XoFi)$!4%|xyQD7kEv;Wfl0au4e)m3M?NNI_vWvFn{Sd%3HN7jI$HiWh5)de``B zJa?Qc&H-s0w39Zs$gaHeLPD5~^BUis#jn-mR?cd97+K>*3NYGxmVqpJ>T2KRq0U4Dt!khDzq~r30jJp z0&p`$no#C*`CB*Uaw~jHn2BcV#C0MF68C;spXJ9hRn-w7rM50W< z-z>SjxMICtv)OIAxW4A{a>3R4H70vpqnEmkIJC+ptD$^p=allvj2p8QS4HoXW5l=; zW@5m~;UyEOvPMIOUp{@#&;I5ue-$IY_q+cD*G?slIYCHaul351VrCb6Vh}LmV&EVS zde}$mwxUl1tM!JatqI1mSlsZFpZ$WTFV2A}DH_rCSv`D`PFIr&eUSF04(b?fr5fEA z)_O{`bTWG#ptBZI8i!1s5#6&R^Zw)ac=Yg;6gwS4Gko;^`@Hz(Io)Q>Xo=m9(}^KkPk%h2GLF@9MKIz5kz>RXnKYK^)G(|DOx|JH zLJT+(L)Q@o1F5I3dv2fJvhkqlPT?d#;wz1UOs=#&;I_WoZLFb*A*cpE*5Jp z-dyPPxd6==4LL-1tF?eNo$`0(bM|&@rwfZJYiCT`N|5mMF_Umu=h*d$PA$@mmjDb3 zb440Sha%02swEU1q%cgy4$#<4$bqPrms6dlGqQ)1b%ZPlTPa7HNh4qn11S=X09Tt} zNTQP~tZ0Z4UwdIN6+jt1M~ivAbB3-Pgw6Hx+$vuaqv7&;jjtRbJ60O`ZLAI{YvF8i z5TIFC#Govzx)@a6F>4!+=OX7=Z+7II=|hw@Ka#lStfi@>bF%Js0!)1^6h@3VYpGm` zSkFvsP3?tIth|6JarKbG#aSoXVWdSqZ7RYr$euuKCY?Gyc#X%FHKBg4dQy=SnMOMW z22zbfVwtN-hJ}YPNO#LxOiF|psHYRW5%4peOvs_)6ZI4)lOYtWYD=lEBQ0y#EQ>p zA*L3>BRN$Py$aj457beq2wGH>3mRoSwf~+|0m?FeQtZ1#$s%`qnPtz`sN_@th$}Lm z6e&rQ1^grh?NZd~g5IMcM&=`nCcJ=j(Iwl_ea7jTom4JF(!HC|b!11JAr1^dG~Ld! zTHcJ^f$5~>zV~C$P0^bdK$TLlg4HgDaU>j9%PqzvF0Tji-OozqS*PR`qoe~E2U(3V zy1wIBtO!FJ_b=ZXOf1@nq|TNiy}()t;!&{e#^KN+$WDc`9R|i>{@tdoLR!^UB6Zp`qxs)Lj6hQG)_)Uk2KWwMH&a1Z7tWZBiIs^XrQ@ zDT`Y^h@=l9I=Z-jU}N<_&tM|x-xK1qOozkCVZ(!abKYJAu5Wf^WV+ShFvjD2!!{)@ zL!?ic6^1wK6%P-On4aF|?CdSCuCLfx!(bvwJqGad6bEZr<9Im?tj;f3Y}Q;axBS+p zpU~yR!EAyZ0&&+9y;VJy#Z(noSZx;IryMjbryo3Foio39`Ic>$$;ne~Hq3o9#-ZXJ zLl%}@B6e?}_r$l!2QBtE^jF9!B0tIP%hBT#24g*z|K`d8EL~_cd zQbH@YJZ>VRQ~1)}Rp6C__*z;=j*wrsV%V{`IOn4$cWCExw%Z+-7Z*qxk|S7fCXnL}h7D6Qp&E9q7Ykyy z#ZRXk5_yP%+3QLFDjY#)nUyaB}+ua^m3dkk@Bd++3~*U5BmgxGsi1aMdrsIkkq< zBq^hs?Qv*V!C}rtdM3r1my|zaEXG>}zw)z_$z+YKHn#liD3_>F#v*2{NqFgkYMPli zV3dhvr&2LvGtNV69nOmHYL4<*IcKT7fYp?xFf~p!?6ug^g<#1+biu(S+G$JO)T(`z zbF=9Aite+jOb&6r$~vLu-qqXTMkwmI)r?kUs$DXF|Jqs(cRFbLVnqhmuT!z=n) zQ_h$u1CiolqwJ&=LdB}{!v23{fJeZL$P=7CmwoV&QF=0_NYl1B=cKKi%l)3Is!DXq zDG4j6tW-+krs93g5HfErZrFA^f+qTw>oJ9%(_6=U_Q{9LrZuG-8g+Qopq*i}f6tAP zLFKIXOc_`z7@|mF1PBONaYpPjZDH@SNLd6E7I}+k_LBmel+$QCMk+DgS;e8s7MfC+ z2pBVZzl$EZ_$|wOUi9=CDVPQ5OYo9-2utxLV66Z{qw<({Wj7-nm#zeg3d!aeK|G9i+nyU| z=?7sbu|-0m%;kQ9TP+loKy*fkB|W237C+?Cg&_&-lmBMbk;d#Od%A|UNyu-tix zaUT>Iymy|63WUdPG@f@x&)lpz z_Fp3T@wG^vx>Z>Max3;MoiouSE@7cXCMYdXi)73ZrPRykvuc3dm+a0XX5q-+?R z=Q1UJvfgs}v(NeE`32wl_+y^0*K9NF`Y5l)2&-Vd$2h}u-tzp-8K1vi@UW`MHlk8K zaGvBV4o;5oRmBhnty+;dO_N8-!$4X5!u+K^QKf;(S^5;jq&-0H0x=6?@~)O8>&LMT zf#u~D$yu@Qp#Vo|ojWU+@TMDxR@@P!?VdDEP(mz*D3Qd&FkpjKHcAdSY26CLBkUL$ z(~@#xxm>f^c07Cjl9b@y{Zp#8W_B>=(W8gltk!(~%WufmP}j9wMyiFvT6Q7O4~gOb zO^Q8XrN zC`3hbh|8<0EwjlKT*aWB(lRMF%K*i*%S(2)#kQ)~YEvl}V?>D?e7v@C)2PadvMBJu zQxpX##dtg=guvGNI_qm|9336;{ot%YmX@dX$8G}g^(Do zi#ZcD#*W5VpOSckc9ukm%f$ZXCif2ZxxPB*{PdJ+dy~WcBQ6dP`0XE`E}J#2WBQ;< z30mV+h=&O%)o2kK!3Xhr#d9GZ$^n3RhBxFD-Ly{%&z&G)zk1^Raf-xjG$XS$km{eoZET;5H zW4b&df*iOi2wHcm)(=q}CC{&wlCY9Udq@-WkI)aT8Y++$o3VJGB}NM7#3)vJE%tXd zo4VTD=2Vk{sVVy6nIVUmoEtLv z0oBB7qa!`REcHhXg~Ugpl|pRjf)Yv*c)GndRb5leO9^I)??2#|?~_>gJMXYDSg76U zGoCIe>sQuly%#RA^s5QiueM(Xly^(YdoV-ic7n*;dXyvx`fnlLuXfw3<;`e}Ni!M3L+C5l>9z-I}rm9r>H zilXHC^XD9&9MkXjxO4X|dj|&)M|n+hlhy&9BskeQ$dtz8QTjSG#lsWuuH*Nah* zXh}3{xRrR}PlXVoa#Zrx>l$*C;)13Mf!bR1XhbV-(@N54yCXiidO7+N6ZO=Xr3i3P zlsFgY4+ew)fBMt+Ty1X9Zg(Jvho-fq>=#QxsT3j3gGw5^8sB6>p_LIXTcezRs}l`G zw=^IG;SGvSmlFY_x1ci)_V?M{-bNcwU0M2_E{lGj7tUj?Co?&B_V#%7-55VFSkGGc zHng>&qc!a`VQtW6v(=#}9sAqcT#ufiYA0enCD)>wmz=#kVJq9ExSuYdNZeR2_fxLO-f8RBSn+?z(%J{KiT47V^!i$jb@N#w3LW91LBQsBI)xM zR8h-~TSv}hmKaQ;NR?wYElHCEqcvr@AkPwx4tH2vTLmql5rX0rR8>Wi8Zc&A7b;W~ z-stF*B1K5E`5L36OM{BVi&`SoQY1!hWW;y0tPXd-vT(bXuuUU=+(eLj~~G(dx8WUmsAGGv2&8<>LB!8BZO&C3uTT44qaB z@5Lv%s-48+B2%(v$|2Xl2?7`_S_j&#oV=A$)sC{PsA`Y%GEuWGL{U}*K;jIPU}@(m zopvYk#~t&sl5{-RAa^=m*H};lp+Th@y4@D-b{nM?i$%erswqoHZNd6RvlD|=@F;3@ zsL4~!+S&@Ob_-`cvw6v)s998w+R3^mIt>Udp~hgz6X>=w*4G9kiJ_`JvuVk!tXLE- zwwMa*oH!>KP`*M@k*9{OjWx1N=siVMGo39c76sPU93CDrU(6Yg#|&?7n9Zkj+iiN? z7VR{n)9FxE1prx=cQJs&l zCChVnS-}ONnkXL;;1HtVwBer!m8*##UJAXNWrSZ+JQ`kjc&i|eUx<}Bw{IZc-?GQN z_4uX;4-NPlzZSXUOIMj#sx}TgZ#SS#1Jc~*ar=)*a5GC>jxEBnI}fpQXZcIQ5*>c~ zO*NJNGS*JE&sgc-?ws=Px85+ZyLdqTLjV9E07*naRP+v8S9n*E7zjx6ijM?xqa}XR z5^z;bRSQ=&m^f}$npsgmW4a!nG`K($$Ei`bi$y8C(YRKNxmJ|6=5jUz3{EFlA4ruE z>VXmdkWN#|x~3*&ZEFjYW)ziWUX&yz#b_9pB`+>68MHDol~6em`B~>6a^k$IDa!>( z(4<*L)A-D-qnb>Z)fMebqDWV|88wQUz;rsLE^5-eMJvl__flqM!FWEy*Rn`l6sY9J z&`%5p7$Ix(8uD?$RwO97i0Xr~G7EG2JA z(%kjUND2z0AfiAJmNyttg`1~2K?T}bN;^#`yrrxarMHY0Gti1wD?`k+JKTJ1h*l96aDPA0MIR89PBT$_fbVQgY8AWGjjM}miEs{@VqWm%`xor2 zt}~l@o?X0QZ_pqxvKc=(2!+f;hdUnn4fAd>*w$`Mu zQ81ZRoV`9K*P2oVf--T#ZW_8cB9@aQ3Kk_UcYUS9*7_>**_7jxnpV3_mS>!v&S~YE zPd|Q--MwAPx>{~EbyY`Ywu$58aJ#uSJE)d|KrFE0-jj$*-ZY|2ElspEf#|W?Ab28tl@YHa(NYXo z<$^4c5Ct0#P!)@w+WY12sHzz3Lt_glp1`&&&?b;**}sAZAE`?=1gs4#76n-h=dsRV zZ6&}%5G%!Yo?$CXZ7m^aYU{CHQM*86m(^I%5j@^kXyr(w|1D8FQaMlUlyJQp9m*2X zQ4nOjofznKTl9Nfob$|Q3l@u#x~>7wPk;Iq?RJY7FJJTI=`$9K8Lc#7ZDk;QU@T=N zsb;A$q*;r)b}WjL&CN|#);2MTicN|fbS^ZGKJx#?qT=}Els6|AEQ*2Dn3Xm2MNMT9U_du#up`w0?MpHf*xTJ?e|Hn_16MaA7S>ai6|wt82^_bH)G~oufl0(+M|M!$<@(1RbFA_@JZ+ z_e#89y$38iTN~UzI$(cqi>vD^&d+b6bzq7yj(O#=R$-C|x+%FY2AwV+Ji5o>!45`i z&MwZmxE`W|B8?5BQj&CEyHUU6y%cdO$b=`>Ix5J7HZ=N{rdp#(M~ml~R?9{-D0S<_j)W^! zwZr>3Sqib73qmz*1cPc>T1i^y(sRr=8iCtFRBEEenzSiSr9jq7iED?yoh$_0TL^L7 zKNU+Gg@$`fa3Wq0x6R`6_ba4%@CtC^@xSEkHuYtA3mg!{{nju-Eo;;!f%dk04+MX! zw^2ljm2MsuZcESjC%H9WUsk=hA8^x|DB-jaO`MwuWu**6^WqRyd=1A~{;guaar;LF zO&w|)j5j}{)1r%}+$r{HRbwpMIQf~0>bEoyz0q?A>KR?Qfo>6Anr z8=_Fa21ig4@zIJ(HwkAkI#(HzOzeShjx@{Ybb1U{R#{(P=XzSwPZJhOy5piKNs^o- zmH5h98)hz0su~OQvkZd8c}uDdo9pZNy5f8|kAjDcsb1?_g1*NQ5O*o2UPGfj&hbxma~y2v=hTQJaejs45*q?}o=1^@-0V#{T+$ScsR9xzUlS5dJ2Uj!Ej9*SI^7mUX_-t!U2U|) zR10VkEm>&Lk3gEFC<5J9Mry!XL!MIJRb(9TnQ@YF%jFxR+Z#CAVVvxwYj z7W0CW(=*bn#opd7b#3u3aC~w`QPm__8ii9)!5qi9^0Jx@j(Bg#W`wh(NrybksAn@N z%ABBvK1igkR{?^JZXojeyhrSghGW*(2ejKAG=@&Q%gSJtR^G;!jrHoz`E+};N0-tpWCM8Q#d7KL5S)2K+X6PI~2~3VJc@;dJpwQNn zrU_nY#`BWZy?x5LCrdk&3&nT8{+8N2!I_j!zr%~?FStBAVP|ubJZ~`?y$33^%B zxFF)QfKXK$wKI_t5rQXA6p!v5vA@5CwKeTrkz^@*dk6g2=@6|v>uUoDmT$lPBcsU_ z9Sa2S>bPcNu@_|1v`z}kI!J1zIID>0t=Dal<(gn?@G^20p1rs))FguB`D8ias_Rnd z5=LQ^qm?T1R5;sOY3kats4C`_r>FwKYrIp-@!>7yqC`>CX(e>qIU2>HD48w_yicMV zOhQ$;=s4gJ&4okxk}QQ@r$wG6Qs6p44GR}oRDvYpwM;SMfhc3?f=*^w9dyVNxpxJ% zR20@TEov&KFe;%*TqHQOvY1fQX(z0#bl6<&V~yr|IFFvLH47`2avrlhKouTmON_D% zx-C{VR>^bm&Yn$XfTFA%^I0uOqDfFhKC1Up04vMNdY|_m+-GZRowKtu&d)A{uWlVh zCGpI{`Hk)z&a(H;E+2jH9{paMy0%g4P|@%9==S@(K0f35iywf1Q9=VzzCo)!wz7C% zVOue>UYUrhOQEAeU~hYaPd<8=-JMMqvjyju*IeIBxf#zfNzG_d5v(E@Bgme21YeS- znvXwtz(*fEWOZf0_00`=W;io9B+~?=GpsMEJ)lyQ38>%*wqk32m7jj~2}g(f7!+q0 z7o41&;$0ml8xZDpIhB*Mpnza`@7+86=(CU5SQ}8x7o4VI%jcXUsb#|9<~7#GX^2u# zd)5X$e){FdJh*?zpx@=<;(|QUgis3)J<%wmSX7Rtx5YbfH6J{>%V!@wWN&AKL9aun zoseiayBNkK$`qwMvtW^-p+g7HO0UIFfAR_YJ8P`3_VLbPv>?+ajAXCPGE59x(OQvZ zhW8)c=Y#j|(#{N3Sx^)Oxe2VV_gGn7N2|d3MY5di#Cc9E&V&xtP+4S)@=I`2fLI;h zV8e55xUGW0>gcl7P=ma0z(}>6&NPD7vMNZi)HaD(0b$vYYu(_Qf-cjX7YM41Zn&{# zIh|=5NTpnKsF33PZ2;BB0&`g#x^P=OMzmEgjS+4i7q~5awR8&dnqoZ}J4c$RWVFyL znkyr}BP!qmfRD9ckOm`i;~Nn6ZPZto9k)W!CRV*Uf2FpK-sthUlI1s*5>hn+drOfo zKkS!KwQHKb<@jxx5Yi-IsYqCkJQ$&EL@s2A0u6-gC-xa3j%3((!csWSY zSYT^y==KIU9XqtfxZOwYU@apkn+0kQ$|#{1C`IA}o%liISO>>kQ}&=fz{Uww9`{ z1u60#S60;CE-h6=L;;CT#HvcmVOv+0@4kD?<@Gh~yv2Atx+aY7}js)|4S;aldj5raWj#>~#M zm@PWo z+`KqN2W>+J1qfF3fMiU7Fsr8pslKyWqh z>}~S-$Bzj0lowCG!@8Qwt4p@Gw>j9|KxxBhYH`$*wZ++(ii+oxj~;QjyUt{E&Doph zTwPwWC<^ut4%yjW2X3f6QPUEGTC}EE%qSL9T&1YW1!pIxoSq-k?c{v;;m6EoHC0)n zed9tB2~QzfjYa2!NI(=Yfd_<%;?US`+Nz>1OH`<^ zwneZ$);G7$-GtaIMKa6M)JGqB6{$v2ya`pKF+pvLL=|6ibopvrz+%-a0`ACxj>xwF z%u(y`R)s7=!$xn>6u7YlY{Z}Ogw)ZzU>RZrsD`IZzy+CFi{`^G13aQinOke$u>2YM z9ZeBWtW90KMuA3135Yv{yy&<1y&)FwI#%lO@X^f$R*kx^dCN^V!17~}zsm=p8W#WZ z5pU^5V@2;=O8-_mzk^ zP*G(b3mzj0cv{CibSsHWN#p&fG);o;$h!mFP>kc8>+(4Wn zg!q{nu~E~COlSDEBZN6hDax{>*Xht{wJ0h}Y3rq+p*iS`(c+k440)c@?RM$+22o+} z1aa0{Xi8#YB=1cbNX)Y92T0><^uC#_i1%rTYumh~o+fg!h+;i_kVL9P96P*osF2{S z);O%$fKbn*;Tf?dq<^O|;=k^#kZMy`!~Ms>|juggdGk608_Cc`05 zet5~l4?kgTbwFY+r~@Ph@R6e$_ZXrkBQavpbQgx#Z;RM(6=1#|MoHT0DilB<;0Z zIU8$TcDGh|aPJQ7cAGbE&UpUngcrwG%&Holw?IXXs}T`YVl+ql8+`iVUG{cX$uem^ zP@2)C;CJ6V;ky@SEUGfPRiuDSuDmT->1KTT;a%?EJrHw$=h^!F12(qS`PFY9b2VJx zLQCjaNl4f>qdxNjO{D7UURh$#5QugpJwSzxCe#w0Pipc^n2?2w0HO^KjEcfp2 z@fSb&j9xcmczuPfOCCKu!lXIB`{pUr$qR;4E9=W7G7=6BL*S$L-{XtV-ls0+yng;S3G<61f>G+J$%UhJNqn( zis`iEyqF;gW>KJROV(FA{Nj7d(9TUGCl6kKVH`irF+e5fs`e zMX!^Sn81ryFZub;f6nV4UbDZq$6x-%pK);TPIR5{)Kw)k7=3Hg7XnnaMn~|at}X36 zi-)|Y-7w5#9lrVfZ~4`)f5pwsh=&g!@S`uk=clLS?Kc1FpZ_b4 z4)%F^AU;T41Dfal9X<_5k zR>Y*;cFH@4yLeYK9*=l){F)zrc*S%!A!}tk`rs4Fs%AKz#rrWP>>(mqV-((7rn4E7 z`HbOY!s+=bgSA!K?NvEntV|DNKX=P&M}%3obM+fcV3TPSj(iDS1 z&I4_P(ntVpj0gr*SW-T{44|f+R!juRcH{|rbLd&aHIyrx^wyU#+j*shUGQO zXX<6F5t})GTTC`+Z7f8UA%^_K18>;?NIek?izO|i(L3BW0r7RmAB|Ut#$(&RZQ({} zYTtN`_3dj_w{@nDH>X-M{sT%SDD7?wUs5QyMEPu|h$p6OD~d15L+qr;mlSN7Q{%3>Y8*-9noVt}eh^l32XTB2sc_ z8!3WsIV4c{f~vAieZfk*CyO@7Brp&px|I}EpbWL3yYYj*Di){SsoMo_ zW+k<)$dgnAcV$UvccPnwAx{leRb$$17PC3EwUom#=hrv<;rS~}l0llpVoFoFS~i6s zDD};F!n9g2oD9)fN~_c6VtB(%F(Ww8C#NU{(LSd2NHRE!rh zDxZP(m^7nhQYt4Ly*L7(t}2-@s3x;p4l(CL92qG>5EZ%(aB+FV`T66%+xrN$rGJLwvIZZRHvtkDoZpSw|P5}IJs-YnI zY0@<1N$m1fY#qI*wO3YG=y%1`zm=t2pI`C(@)^{Y)=G*-JY7?xNmRfEjZYKsjzob{ z@_BdilvEqa!V$b9Ym)PVY}{F*$h;!gj&1_Gy_}v(=_n7CqLpd#c22Lasa{@Cw>o%R z(n<|^-i>~>HRCsLNZ-H9>Pnw#IK(ar=F=%vF~extNvh?&Hh9}e)sqX7Ilfq zrLYqrTFv^(3SWNuh&u;sTwWgYo5z1*HktC^!2|Bzd&rMJe?(PzX5$|iRdH0QAUI1a z3w-sX5BT`e9bUeC#()3iFBo3m@Ux%&4}9?6d)PYg%dh{$Xy(u{%s?C2qr0tyAARuw z2YVa*?l-^U>#u)}s~tc6=}-9lvoAQ@-QeZxbEb>M(ss@{8B1@kclfifKBJu{{9k|f zfAa0O-$Jl__|b>_vw!w4+1p;@#j8_h^I2T`^2dA2_WFP?KL3bvKH_ix{r|y}r%&^0S})kG%ix9cHs9Or{le5dNeN9&0U!cXoMr?}#Vgf6L$f?Z4;E*(u<8`s4|J z^EdyN{oO4tt|km86^mNXwt&aEk_Y!5u(`3qFMs(D{QT$tjjO9mymOqLpYT8boBxHQ zqg}49uc@j+n&iYpfw9F0$8dPf*T4RnuYdDRj^Wmc4Y{oCJgc(~8UpL|YHoncO| z(a~incu#N@cMtbzrzvl)t~fqE=KA`YX))&yfBc3|KKg{+-3_L*iqz=nQ7j|*Oe^+w zx3IS2^6G+%^K*uy5%Xff(dPOqv$M%?e0(d^j8viZl@=ST;x9g(PGZ63nN6ph zpPcZMFMmo|IIc!hLTHf0K=3uIt38s$P|RnP#T*?J)_WGiA@li+gLm$8HCk{rnhS-- zOI&Z7DB7(ITbIn|GvV$7wXihEN$oVcAG5Am`|^mOeXSmBM5D| zC>Zp5v|BB1MpJR^iOo+y0FqXg6TBhM+vHh`L>asbBuR^IcR-#^D6QyMn(_UTqD5ST zOTK4xG6}NxJH#Kpp~N)^rHNnc+MGcFDRXsXpuUa#3fOR)=oXgyuTV)Fu6_g(BC?BW=ugq1VVR{Sh-~mgZmv96 z6A7(MbanB><{?Cvmw4@#g{xSlMzDSPdYkw2mgtNoneVm^4a@UYu0s62iqrl0>s0eP zfuzZ@mN$5Nf#k#V%L;rc)ec06yczZqzy3B9E**kcgv1Y|;m#->?I4InZ_^1i7b|u= z5#@~urV*Vspjzm(hxa9Q;izpX_9p11y0TfQA+YqTBofmLSCglfZk|hb=OdDsfJzL` zS)slpiEIoZuqaC|ha)b=V{R4&Kl<<^b`B1ionGN>jmFR)^cl~~7)6?bNri;&EVFVU zmo-gEg4iw9&Qg^XwF{`y;*AoKTqfh?%6oF9=yhAHrmG}*h6{@CzJJDOI;Y$3W0j)Y z&QV%X1$h4Y70;i{w<`U;y{+a#%B9w6@x=&h|YxfqF+h?t))X#hIf-gxhkccdr+ z;$v(b!{H5!VoH{ZAgl_S)5(;7_~sdJZWg%iDyFs&lde)_2u?WL-UpO#)bMhExDeI! zDxi|4OV%jg2y`4lfk{&|f`+O9Do41Qs%gTb93VJwmf&hKBlMQC7D0@Pw2L%NDT;#H zIYL>{ss-6;{G3FbBq*S_p2ebIJf2Y273*soWO+ha7IZotoDaNn_zusXA9FRFkmg-M zQ@nJXA#$N=>!WDU#fau++#^ChPejlGtR!YFm9MeBNC-HsBqYXFY;N><|NV#T?XJ`K zqmFOJEar1=&aWuTf?hi(O9O*mPB%+fOf0sjNpyyHHLj}Zwp!fX+hwKIphbtmhD5=8wPl72UNC(?tc&b9VfO#dJbDOPE=?KizUO6`Dw6W7Am4$yhAV?R8jLAJAXx z;#^I)*P)fSNzxQo7X&Y;w+digMLW-U@6kOTK0M;_w}0U4U;lR&vl&17(Pw=1wq>f=p=CWaGU!_JKS9Vz`y%<|2yA)`#p8-SzY}H{>8ueYyRr5|0N$hy2JC= zr!vy^a=<0ZbN6VMPd<1+F}>pd{=2{B$+MUE05_xmjeq^Kf6aUEeZ;HRXDq4-SWN^u z3D&c^+U4HeLtejl%zyZg|AF(%8#IdZ^K-P)eDvv;Y;UY_IV_l$HE0vT2H09(V|#s# z-~Hwn{PwrM;d(d$1=rRYjt&3-AOJ~3K~(?mFWA}J=i`rm#Ok2S#r2%ZHiwrZSj*1V z0sU^9KYjBnUc7w4a56&$_|X_+d#KAic`P1XqlKe#)2Pfi_ytB1|3Xbvcn(1^xQAzRk>W4QF0xN?Rv1GI2 zOPrWwiHKEIjjK!M^M#xoArP$R^y~uX0%@LOk~oDy2@Ng^d-GN<346g|qVKwif>x~q zS!U3Y@2r4ME2pR{Y@`D8y4_{djc*DTNVKNY%5hGb@x&N9?GBZ-1n1F4({8t^eNAag z2}Fv`TVhg_($rQ0TUxE0Ubm08jy%cfv^&g8ao=dt&rmVUhY%e#WD=TZ8U0R|;5-}a z>*QI6caEwo1=#Qn*HtKE&I(UD1Zffm-99MT*xtdIRO~pdr>H7H1%m`kR8>U?Z3)^? znqIeutu33|TXeczri(F)qGZ0PWSyH71uTk+@pMX_rnEb4=JT9>Z-o#vTid&om1R7g zQ&croRbf;bkzi?9w9&LXUD}-%bzL$VUeW7xINUoxCv7^NEBve$T3Um&t2i}}@3Z0c zE^9RX7JBJJ9N)WW(dC!ci;dGu^K;8te7v4I2oz|H!6c$_k+|mYkNkPPvI42Z+A4Sz zi`YQpTC)_l1-YjL)omWjl0(}Rv$u%0VhMqU+a{o~&wblgHxMEaD$@+r0A8_fR6Z7^ zQCuhBXM@v*2Cuy>Y87u4<*~X{dI>a#IDJ~u5`3h8$cv3mu2oP(yJP?o?E&E4I10DSrAWgiE$(d_rnGoeQcWxe*53@QU;0k3_d2B zDM2cXir$1thdk4ew<%^f(se2?t_5DKON9R&Ur3Pt9VII1$zqNVflNyPgp1<_6&$s7 z*Z@8lvE}g=mn0NfLRHmpdX8!hct7i5O^V5KS|(wC|A1BNIKI4MZY}e|#RVV&id;*I zQl>S1qv>TGuz}Yn=akNo^?M{~3aO^{4xOj0Zg245;Snx4N?S84YF?dQa50>s6T{Zt zHoH5U*s8(@&%7>~R;6^0trolQ?33j=WsFH4tgdo)J*5^yNLpv7JM8Zt&}#Ltb;nmKJo={9iw6c^eNtlnv%&xC^XT8PV%788Hm@Ygo z&xef40<9DBM3b7p`bvk@R+mATvUO*L-H-MNtpXMK^%REAP0IWAeO|vAGkbMPH_iC; zV??Jk&6qA3Q<+9mV1y=Dh4|w*t%wK zf18g!e#Ce-qAUxtETfL=$GJdl18GZvj(o*dm!rcy=Ccw1<-h(tr>Cb76pR1%b9(I# zpM3sf4iC0DzIaY!8qti2J6X=o#wzD0FZudczY?bs6uuY`T+;Dkz%FAc3nM^B`F`(x4m% zdpoSJ4*31c$DCbU#KYfketyBX-+jyHUwp~xTAydHuW;l9t(U&!d9+d-USClyDk2!f zWH#s3t5^KlU;GulZVQ5oKDyD0O+%i_^Ur6qB`~5;*ve5XO4{u3ba&}>2duAel9+_W+6te1@+qBekCTfxj3*1Gvjv10qM;1) zS;^()kgd%gYik<3$>%Ie%f6 zO;EbAIuyuPFV7o~j(*D_>ZF>2O?-=WoZ2-ZQ?Z^2emRk74lr?U5b#9`(D*$Y&&p=H zh!XL!Z;Eb~(<=#0YmioXO~G3lSD9#1C|_@;??j43ED{@#$HP*TMg$ZE@YM0_M#O={ zB*EpMhHaphXL2L3^U*$SnNJblQIPUr`86rX8@fo0f{yj=ThKir1VmZTOtju27dO<1 z+slT0KngLXR=1pu=CC3bQg7Q<$%_-OxUhVXTfSu#mNV$IMB#27^F=8f zU!|yhz3gs$2!u4Fa5d*u&36~)6zvWh+xsk(Vrm`d;~TtAu_)@e+9YU0qm_{O6J;2* zbM{v|?5y-@=WUG9JU_d_BnFkIvW7KG%aW6e3w#Re>nrFq;qv;L)5~+vuvjek;rItZ z!MYu^f;T58l%*xjG}kvnUc7k4`sO-$tHsT5#LHK&@j;T2YHNkR8gEJ)=@7(j$tuIV zwp>i+T#Q5{W{qZ2EjYQJ^8M+M*Q1&`>toUm-YBfE$#g1+C{pBVq##xiX_XbCMfek& zDWy%^m>Rxs^!=r=F^k+=-;9b>947(PQK>ECBV%A~eVupj?2@UP+3=e0AAisB**O*? zD4!D7k;-{0U&mh5i$5z-u%{Z@juga;qM%)tBuU0(GUNQ>lCn7E{QQF8165IyuObre0cE6c3lVh)CJ;>HCmX1WO575R!c`S{nhJfR zs7Q@LYtP1dpPii*Qd6@sNHDfdnOjmcy{wJu=bY6OdVbD2Ep~Q#j0?rp`2|(*GA`DE zH1TY#wRm{6L%2DnRujUYPv}f>p~O}d#$`-L3(5j^wpa1l9^=`9clK5=rp?v&>ztjP zbFj6>V1I|XEAS27h zC%567)m0g-#)N`Z+nTbjQ6WSxRT<%i=+CK|gA)=bB!pN0#N3wn0?< zEg0by*TW%;VuACHUcbv|GRHbgyWL`QYZINOSRc*rm-c7!gmq={&e3YM==C}jWr4Gv z-k`_*`*#Qgrt=w9Re?^0UgYJlUX(S?1-7@g+27uyE{_RHvAR0o?%n&8m18z9MGzB3 zogo4Z*TXTTb!_kM@y?wij5(&REjv3q9KCag$z;xGJQD;c9<*8;tW%tvUGT|=57^t= z4W0M%Qx(Auk+yEL#nc--(SH8$B%yW zW7?e_PoBMIGMUqA_m%+;H20!+tgfx_-n$PlMzg-Q0UEyg$xrC_`b;JzF0e%KbZqb? z6vBxMh!($I*YF;Jpbb~oL!Q4n=5TL=`w!n^Wpy1itZi(twz0;}GZnwwo?mnmI*F66I1*d1%I3KB8S^Fx(ji#<$6#hqV;`llOk=_}L##o9)gg63>5xs3(ik6dpFRwx3x^I!&B^YY- zEoc@ihGo?Ww_qqN_mJkh>aD_f`F?b)3*+y<4QP9tji8n&vuc26)w~zpqBH2_WEj=B zWynPkr?=RIcmY?MKh548f^RI+h$wD|ycd}dFP|)kE2}gjx4GIXG;R>fZ^qhKMQ&?+ z5kb<+#DGA4UcXgj1Y{&)lo;4IE)T)PnAllPK zfjd2CG@a60=`vl2AjG6n$Q4Dw`Nak8X`56hOlJjoryVoa71PBWd*MjagjpfQQc)IY zBi*leagk{qn+&n53tC};%4lXNCJyGLU|JL^a5}x=&BQVz!(?qpvL&y%wlzv8w~I|{ zX+Ykhx-6#vARenhgKxYlBQ-$9-q4tM1Ic>wv0%_D!NtBi1hup%tEv*C;r{(YRyu|( z1n%$e@Sp$7&w29tl+t->FZ^Mn3|dK;h$Q-{$WxA%>{>;xoQoD*dwlTzBfN*3n-PEf z?kS!`3dW>`NYomuArW1wNONiBIpfKM+6K@m=?cLKDNe zK(9AoV`GyIwZ_5T9#vKG{gY?B(Z_K+lj|SiZnszzl#7Zi%UD}oVKScJY#_@r@=hBE z%nNCP1*{O!X3&O3Q8Js&SzFuS=ov2wr&l-CBqb7rBLM;|1C*~ypBeU= zW9H#IH?lauLOm2RBW~O{_niIhZ-09ew82_oRZ$kDG7b;V2tjl0+6_MX=mV6|tX50* zuI%!cKmR#pHQ?o&V`j6O;AQ?n9IGske|W*;yZcH` z>%ab6PEL-<@`7vEZ!%l7{O*gdIiD@jIv4AxRIG$(c=+@sdwZMQyM2Sd91gj^m{JXf z?Cf0O`=>AX@(tf!d@AZLDb?|+(j~5u)lvDn^#=Fd5f~D*xSECKrvqmW18h- z>E&pPQ5L)$tVZ|q3F2O)RC04cQ@4T7zW4+12{*1?WoPdy#u_~E@bPp0@bx23E^0gp z01^B6QI<{1Z-4iDe*E!0ZeG96WHOX}WU=J)&%Wfr!>3GFk$|LPN-%>$Da&-W;$J`g zN`Cj+9>ak!@K0YJ@a==|d3|_J7v&r=$@kW2xi3d&bAIvbPkHzD4Q^fEXEYiyozD2? z+duO3#T(9-Ener692bP83{j!5yg5AMm%sXyd+*)iFMs+8HZ%P2>?IE#Kjr0{6P9fR zRS20D#S+oj3{T*}sYZR)gnv=Kn6wc%_! z=fC{oU)UU1T))0gm6seJpKyG9#%$H%oRA4Fc+d)?E!O0mozMC7i*MN47?7p-aM82M z`T6?wF|Q9#-c1dc0V!&OA}_%pqRvHtkOhfsk^{p*-FPE zRRNONq=ih35V0sENzP;$wevLdr7$5XQTtkoe1#s{z4SR!xmJ7KftHhH^OM+O<8l zwl|2;b1^-qZ5=mnzQf7MIg`l-@7%h^psH|P$8W%9h930_;-7*1Qyb}(f5fRm=?^)hhQDSVz` z0IL*zH?AKjlEcZPg6fy;T5dxsq*T&_3xk^~Ya+te_mUggWbm>sv`R6X!6hxNu%o@E z%KONCz9e)G;}zbm7?&CMZd~W$e8H>PjLgVzmG67R$i|{^sUS<)>MD|F86if_&(AqH zctcecY;JC{v9Uqx6sPAktCho;99xv~Wotv{#0y)aC<@E|{vKLuj?d24d!x3A^+|y+ z%Br=6i-f9pRI&tN;Fj4Rw`K0r@*6F@RAka_=beg3X;>CfD}pfbYJ4N?X^MDEi|r zF$G$iq^Xwu)2qI9mdFETdH(tklUs-_#K7&_H~HZH2fTXzhWW+0Z2BYyMj58l6%QW% zz~B7*WB%@M|DN&i_e8JQ+S%g0_dekKV#&+bM?_`cqHmRe;I`wz<7fQM&pzaT{>Oi0 zV{41~V!_R8H@Wx0M?86T#N(%L(56D!j2JaODuT8=disX%pC54l&UOCdKm9Y;Z{DDD zj%!!1^ZxrkVzG4m{@X`P=M7P5I`6Prk=cytqT#>)@^k+8fBrlEr+@el+uUTe)A<4 zi-w2=G<`I+4~prc<>B|Qm`pz8-UlCZ`2<8GJN{^SA6~5V`>Lzn`&X1L(s~wXgYrVn=h$o!0~< z;4?sS0y20Hj~+i0>ocoq+eSJ+-ICMk51=%Edhk65N2d(O+ki@v6|qVSfy;eJsg#^% zB#zl+pfl#Hj!!@Tn(wz?Fd7Xhij0$!GmcND;t{PfjMX?7u{ug>U^J*;nJyYW{rp>= zzdYdMkAB2*x#0UBo^W`4PU|$rK?$TK$gyWn+<3h$K%H@dG+#;%vx6UN;;)MW3vjaY@YxLiLH(Octekr5{OJ8UZw}$QKG6z zj!8*k>N+P8?1+ZBagjEieLBW9k#rd~+!Fvg0d0{L5+Q0W=W`EFd%UOQq0l7aRH-!s z-D{861zPOEWqOS@c9ip8+?jgYGnK4Y6QsPn2_nVN{j(o0uRYnFt_umB@Io)u4R33g zlM+G2YyrWcl`Pac2{#li(%o==%C=S*^gj*+&F)Io7PostiSjIpKo zfZn)ui-!*%b9(w36*W~+Fd1)faQFsmGRkVevzKp}&6jK@9h_2{H!ojO<|WhFf}?{& z(NCKaN2G09X0sV!n2aY_n_^?NLPvv(fwRsNrc0L3JVj|)c*l$a1|liwI){x7Sy`sF zAdF^66`ZwVOxAXCf9Wm5aBu*#50JIc-p|kaz~=NT~JtMY1*1d#2UkBIAVKi8*L1y z=TjE*1y7#6WLdXFGSMXhHnU_(V>3(F%3#WLF{gd;QtoRen~*jdYmuQEjI_8Mcw}Hj z+YFQ1`O)_>5GfXmvY;9an9tAH*c_Ajoa2M19KJauv=UaKbAY z$gs3biXq!o#bmg}U>vC4y@~z%kJ-qc_jVhDWx)pul8 z^W%^2vw!U!d<#aZ$A5m^J$052dUE`R!3c@IG?xtKmYAFtp4uD+`Ds)zuDfC zI>~0VF7oLY-|)xBukaMYaG}vA6Tz4%IXIp3Uw`=p|MB1dJ8s;%N0t>#=PQ2kt1o%@ z{VUp7pmdH_$!8sT1~54<4$k;5|Lxa&^ufE_zIB75s(AdvGrsupTMkc`L{p)S99~{% zIdWT|jpmE5AMot?bH>Ax$!JJ9C^?@_dHU=X^OZ-LflQ~XC>BX7N?X!c&Zag0<6l3c z$Q5OoaqHGQbUyIMZy$-PgD!|h%kWH;pbNA?sf_8e;om;{J!P&K6eU$ra(*#qzHCuC zmk8{btSqB&JX#r)D(Jd~KRtTF4^N+x7ZyTfwQTUgVDpmDc37jaN|9MhQ5M)`!Q&?{ zc=760(iMkv4k|pNL2P{>u7Rz==9x^oC!MFl5L`#}$$~9C-+5*k42J1Y^qkLD%omMV zcD5d^bB1F9S0TtAS>(dlc3p=Gmdp;&F)&}YeEIutiBaZV2BS?XbRw0+X-U9uZ&B(c zUfuwqWwsD-pI0ODp%uNTGQ{*6J+~!;Y2v?Yl*m0)j0^@DMI~+p%H%|yo=anhQOSG~ z0j(Sw0XCiY#4a$IY_hqPiE|EmJ%ky9*l23qyIaWb#UwK+ilKBBldMn}*Pazr>*44= zGzrpLO0!bNT9IHz0b7&Fn6j!EPewTJD9cjhc0Hy+z@$oRiwGe`27{8pXh=6*(yIkR z5P~E2_$HG4bETl@JFJ4YqS#O&xMe+9*MrLB?xnR|yHG?KOi2V!Kdk9!ofHAii3}&n z$mO0WL$4i>?x|Z3f{BK=mr$fGzw{&JJyg=$CM+G_!goE2Rf%cs_qcVWdlWgLLW%bG zt@|S2S6FJ*$07IovQI^X5{okx5(awMl@izM zCJpvQk&%eI1z1#H8}vYS4f7N5ObEUgNyi?gCuAK#X<2B07LT{qf2KcrKiIT@RqO}r z;`%CMz)b)EAOJ~3K~&;;y;ZLt^-1?5$Um;Drh0QeDNN|ABa0%%est;L0M8} zIkWRQv2*ygBeyw=`JA?OY;SC_m@a7QmgRg!S(apZ!K&%dCTDN&3a1xyS_jd2oa=-E z)k@+{ZJF?8#A{H>P)AMMwH&-T6Z<8rX=8@23QP$2t`#e>2zgPVO}5q$_3Tnrl~hGe za56Mf4F?1aN2ljZ=XDB)&^X_v=Pj+BC@pcBfPL$LifJ{3fJNHBb=N=w%5~TBi(meh z-~F3oU_5uPUgMo>*BJ~BP^ZwYYE+REBe=*~Ypk^*xJc_)t6{EnfCM`U*l zX1ha`7HXJ%drtgTvHEm@dwGnVj97jCfMRopIBOYHdsG`EmItp<%5Zda!uI}6wl+7& zv)4E+`ob>7vBuN_(T8iAxxBThhQwh!~2IN(S4=E8Vrt&uCiAjrOS%soQMNiWP>Ux1OIg?3A z)K(J8lBTmSgyl6HT2;ahrtTtEG2R%Z*#y}?wl*dhtI3Ou(RhHeGHq_w=d+w^TAMXf z)k{rwc6KmH?h;amfiz1IQzx@c7LKFgfc^bFyiY@&TBX5mpTJf>45ik9OB-3MA+^;Z zV$&HS75?R!Bu)Twh$k5`R@+1hTmpG*G^S_5)TQp!`5+xuBOcm;h&IW;Hd$#&qGtl7 z=@qp$!k`Nsn~EQKO~Fr+Uq+nd`As-ev5Slt^XL9ecjN!uMEBJ&Z} z=B!p{%;zhbrj-srB5VZ5={1WgzN@JbuZ6^T8~pXyiWtS}G~p)i!zE=L)BR1K$@?zN zo@tyH2M!@$ z5-JVB_4qQm^IW=KM7f`7>UoVzRfrT16iQ(;=l_Ugl{SKETb}y*_P$`I_Z3D|?%jU)g@4RydSGTD$5lx}@ zV#T3@Sb|wC=I9EO!YsU0DC&|Xk2EMMW?cXDmzS2wt<8FIlw?TMcA$>Ku#N3==wztwOsNTUy%rl5Sa3n2cHH zdGqWgp>EMuGo8-JiV~e?_|9>0eooiaY#(hgozGY-YO3K7Z8L1|5gY=g&M;*q8rcwJ zsIahfT}KkO;Ujc0Llxy$&!JoL z^!Xd^-#%qf4H#Dg+T~ITrSzV%DQE(o&Py;$7J@{qM$kr4l_iVClCmrr3`d|WAAkH2 z$EQm!X02GuMaOcvr0Y5+2J*}bBUI-2R{VW4tFby@jhFPcOfwo;%Dm+4%(Gm2I;*J{ z?fNjZ#*!JEBopxJ)giz9IcKC5-Q#m!9KWF1zhLn13a+6`r6p%hgKu zrmmy$Ek1#&l&C9U5OE$5hlm{Sy0l+Jl(i6Yp1(T6yB6obWJ#x|G+AcJj6s3ZcMP9I4H7r&gwkXMMfr}d5iF1ceM(jk5_{elTd+`QhOq1n?sB#A5At;NF zm&}ie1wMH4GRNAICOE!(^qL=@y%7hD5b1&jat5UZ3}q&uM$#yyb?cpjkmK>pmkw2n zx8!7V1F(s;ibOA+FX@=be^y1bi5M;HNYh2elTAj!;FS{3WfEhSEP`U{)R{QKYK^g? zUytd)lyly!t*pfRJ3Z?OfC@WH+TGLOkP+}?OqLilDe7YKOAS%>=7<0%qcqm^1FQWY zTXG`Mmkd^~pI2)Z4m1X1)8A>i)`&byMQ+K9f{l$0-hcmI`u~Zrpy$3+&j}>}CIrr) zsz7NLtAvxCt_m@ayGVM@{ptPf{_5(!A9XI|?* zYFF01*sk@*@g>0&Vt+>U!*3#Z*cSc$>aPr8gcHJaNsHYRSlXGjqlilH(Wj;oV|sm(4OvX=o<`wh$f?I5Du~la z=+Fqmj~3s1=j8W7kk5N^d?w&Z4t8uN#gtDrsm^&^8f11sg1(6I{%z+uJ)3cKI%U;( zeCiU%v`_UQP{p`D|A`78k`-6FM^Pm$Y~Q|DshgR!V8)t*O%)*O*UT{uz>9I4N~?j}W6Q^61}M`}COgZ6(7chLu|` z_pt9y+t^DEbbqV*=SI?aE`M32ho#r^zD4P$)&I7*S}QG@#4qg(qoGwP<-lIuyJQv|T6do^(yJNc+JuX$eQAiCW`AMEi(|4sEP3%_zJ|m3FFz zOt?zB&WnDCOia%_boP8>|EL8>Wv+i^CbsIr@VUog0^k2rbH3?`YM57 z(L4q3(_tqEqJZIK(jEhC@N)lSz;_OxWE3W^z{#LfP2jtiuXyjqO|I41X~$434rsFwhNq{&UpCf30L;_+1lP=Fy3S^7&1Mt@gdO009Z^4NeQV! zwKl^jh0%e`c&v$x2RVa5Nm=F;MMjwyWERfOW-J#nbg^2B1yRprRCy+HlF-sNEz9T# z&XH-wV!EJSE#-YM7^P`i0E1EkvSCHnw$g62IVeMi#$|>wMlv5Mbp`}7Edzza7#Kv) zXlqE+4d-2h8&4SCzQy&Qf6VCqEhr1<9QXdWpK@IMj_iESKo2?n{D|S=I%=wL&SJ8X z-~G#PXtX6(8I4h#EIVFatndze=g4e<*NTuBE}x1h`ojpZt&@W}9n(o4TDw4Ia-vJF zF3EOlXM2-tt46?1YF}%W)^Uss#yNwrL1~MzqE!q;To3@R()!Q{An6mQR;v}Ak4f9A zF*ZXhn?Q?nseB0N%%-+s0*ESLjZCP6xpYQJ#kMdY($+Rc<`*;qwDcva0i_dAPp!c| zT@dk@jfl^y$d3e28Pm5rMO&%0SwC|+4e|DDUL>Z$QF$J!vmAcd<+{?|PNB+fKFi0grz0xd(S!3XKwB}4f{ASLoeC194c^l5#N0C(uARRn1J zC@fTnVxu-&HUwoT2V=Amha9aT`XJV4v5$OB1vrWrH5bd87l&s&c>ILfs>TO}$z;96 zsK8p@9G&o|hfmnt7?I~<0Vl<@Pv0l9Hc|&poN(lHj!NO2$f0^7M-v%V1x1miR7Xwl zk=cC3s&3N!Mmk#)m=bHxh}hpLGOe)5B_$>Yh~-jZi#?a~6h>=FDDw_$6uGhFc}AX# zB%yVl#bQa*bOLITPy>a?A^wcuih)5@vbiy4Hk~tDuB5Yzxa5S;f3Jc8TnI!Lk`Yi! z?9?`${c?}m5R%kU81X(pK*vB)T6VWL84ZT`;8`^d%etlM0?Sn^KE%PHlxKS~W`B2^ zJkO{*N7Fj$re(2MtsSClX2^`iC?PXk(9}(!aVp7RWbf&5%q7s1>knLZLi=HGty1qh z0>R5O$R%0S7a}U*oum*JA|L`WJu?AWBk8+~3BUDNgQx@$Ct|Tjf9s;Ff8LZ{Gq94B zs@L7t^=7bs@Zx%)@6rma_u!4`c~6~*{wz=L+dsEG9*taTe*16_qPi?P6X_w}yX*<6 z3QM3o-Q~ol%QN3!wOU`3LS4E=q|Xr7_ctcE9-PU za`*%%V&W*R`lfCOP9CB>%MuGC$t?0Ec(fMAD9t&TVJsU( z&h});cw>X#KYYaTs)i=jSrNQf>y}Dyj}p@Q&{~*TC1NmgD>}2bZD?yRpdhml6ftx( z&5F*oY;JCoS<7s>qN;MZSP+7f_etx|cZp$$;qpJ9T5d^bF917f&l*S5tO!xOrL~G+ z6jfER@C`nCR<7gV?40X+yX!eefa0tm9&~po>YW6hK(;NN^Ce*qB8f$TEc`k{Q_A9CBrEo87G~s#3I| zJ)5%FZ8<#^?Pb??v~3^;Mev%oiKRhC4(R_ zD59~1OcQbe`L*lFvW(1T&`ElnwIaK4N>Ld}Tr~BH+(jk>jfpMYRm;8q<9{XltDnL4 zE{une4?q==JF@%dT)Xwxu>1xdeTRE`ia)Tpr9wrEQaR&|O~zG@&tdoGO}=^hn&;=w zSuIv9nieWWEDLEdqA*JQmOJNh!C{Mnh;%1Zve=8k5mnNL1u5PZP7c4ksJQ>$`|Mx8 zL0%S#*|^lQg@H7S#REbFo<~4CgAv%RZ>4^&>vDVB`>p zvlTt-rV*VrpwFs5L(Z297=@6z;pK;aoy zC3|~2SZi6;HT7zRbI>|ZT{n0alBT@lNDJ!s4^`vKB@%M9CCiK;`nS%8){

    nyS^m|~LVXx$gTTsHsv?@1-iZW>m}Q4U_F1 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%0A1r!!ZLC!kr*bMRYXE;~O(N>#Mhxrj2 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Μ-)JPt^sU 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Ú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

jc_0bDj>Ph|^Gu+UIYJ|dB`moo_?Xw=& zN_~�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 Y0~r(>Y>08i4FCWD07*qoM6N<$g3C8vf&c&j literal 0 HcmV?d00001 diff --git "a/drivers_sample/\345\233\276\347\211\207/1726194962547.jpg" "b/drivers_sample/\345\233\276\347\211\207/1726194962547.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..9468da025f2bccc563aa4faf201c2aceefe0af51 GIT binary patch literal 7234 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 J?=K&n{5O4($y)#b literal 0 HcmV?d00001 diff --git "a/drivers_sample/\345\233\276\347\211\207/1726195007716.jpg" "b/drivers_sample/\345\233\276\347\211\207/1726195007716.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..800d00c0999bcc27b0becd6a908faecdb8536392 GIT binary patch literal 5702 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 aLNvIk9=9G#JrBU2Js&3Q;_v+A^M3%=K>tSo literal 0 HcmV?d00001 diff --git "a/drivers_sample/\345\233\276\347\211\207/1726195033006.jpg" "b/drivers_sample/\345\233\276\347\211\207/1726195033006.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..af33c5de91e2d83e733a2c4f81247a692b441802 GIT binary patch literal 2418 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 XKhzoUKfe#2iU2-d{+`V5PhI&Zv~3yr literal 0 HcmV?d00001 diff --git "a/drivers_sample/\345\233\276\347\211\207/1726195173004.jpg" "b/drivers_sample/\345\233\276\347\211\207/1726195173004.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..42f1f757263a5a4ee1d41c6f8436a67c27ea09be GIT binary patch literal 538 zcmeAS@N?(olHy`uVBq!ia0vp^YCtT55GnkJgG`2@+T%DlNFSrnla5bIOG`Hzg#+mv8v-K<3}%lkP@7 zpPm-&T%at!G5w;~nfKq7MYt4&I$x-!d1b1ndDR}7^C@U!hDq1qhYhd4YFW(n>o}V9 z=8bZkR@mCGi+S5q?Pd4^HALQ}fs{q9UDh74H*Wg+vr8^!oY-^y_1)Czr&(|2e9P}M}QxJEMSej;W=@ic)W+<{ zK%vtqMmKWIEadtl^rmmSa1m(5k%@=arn-9eXiPsX!NZnQcDlmGZDT}=F<6yxBoP;g#1?r7Gjbs^3* z*RyBZI(hcYV|y#R{kCqEwc#ww`R6}W?KRr&?5Q)?FWGMX>3e=X5jtWXYLhns#d^#> zzdiYm<=4C-kOP1F+a;ZMa@vy4x%NoY!3Fb@?B@HQ%2Z5~IHrG3@0h1xzUbqYI)e|q Yd-tE8bJJ!iD9#x?UHx3vIVCg!0BL;V>Hq)$ literal 0 HcmV?d00001 diff --git "a/drivers_sample/\345\233\276\347\211\207/1726195185553.jpg" "b/drivers_sample/\345\233\276\347\211\207/1726195185553.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..d5e854c9146b31d5214ba175f4803576c49474b0 GIT binary patch literal 538 zcmV+#0_FXQP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0k26!K~zXf?Uhff z0Z|x-eI~aVWrgx5N-+zOQp#3M%3>B$cEpDurQ{1JDJztcNTX!M*ZAo@HFC#0ccwe{ zvYEwGr}>>T&pGdzbH?ZQf8i7OBuT<2@WgM!6Tb~lY)K#xKrWXufg5W`rv-NlDIS zuEkub>Bz)lF(K}BI*7;PFUN=`OJkp(J@YGZu~@`*yG6g>7tn`PC=|Z+p)sz+R;6w< z8sgHpUaz8U&i|#<2DMrZs;aV?>rzLfQRupEd23m5JRT7ahuMs<6%&ia0_}F2&CJjQ zTdkHj%Uo{YNKC7y`+Bq4JT3?;=(-$_$4Dd+?7Ivci3wT>eJtkRp_ybd$&NSUSp3&` c;x{4T4sjkeL0y^dS^xk507*qoM6N<$g5@{#oB#j- literal 0 HcmV?d00001 diff --git "a/drivers_sample/\345\256\236\351\252\214\346\214\207\345\257\274\346\211\213\345\206\214.md" "b/drivers_sample/\345\256\236\351\252\214\346\214\207\345\257\274\346\211\213\345\206\214.md" new file mode 100644 index 000000000..d15baf8e3 --- /dev/null +++ "b/drivers_sample/\345\256\236\351\252\214\346\214\207\345\257\274\346\211\213\345\206\214.md" @@ -0,0 +1,1967 @@ +## 1、ACMP驱动章节 + +### 1.1比较器中断实验 + +#### 1.1.1实验目的 + +- 本实验主要通过会在IOCMG_26输出输入源的比较结果,并调用触发相应的回调函数,通过串口输出触发的回调函数。 + + +#### 1.1.2实验要求 + +- 1.软件要求:open_mcu-master/str(如果采用zip包下载,SDK名称为open_mcu-master/str,如果采用git下载SDK名称为open_mcu_application/str,此处以采用zip下载为例); + +- 2.硬件要求:Hi3061M开发套件; + +#### 1.1.3核心函数说明 + +1.1.3.1 IRQ_Register() + +| 定义: | unsigned int IRQ_Register(unsigned int irqNum, IRQ_PROC_FUNC func, void *arg) | +| -------- | ------------------------------------------------------------ | +| 功能: | 注册IRQ回调函数和参数 | +| 参数: | irqNum:外部中断编号
func:IRQ_PROC_FUNC类型的中断结构体
arg:回调函数参数 | +| 返回值: | BASE_STATUS_OK(success) 或者IRQ_ERRNO_ALREADY_CREATED(fail) 或者 IRQ_ERRNO_NUM_INVALID | +| 依赖: | interrupt.h | + +1.1.3.2 IRQ_SetPriority() + +| 定义: | unsigned int IRQ_SetPriority(unsigned int irqNum, unsigned int priority) | +| -------- | ------------------------------------------------------------ | +| 功能: | 设置外部中断的优先级 | +| 参数: | irqNum:外部中断编号
priority:优先级 | +| 返回值: | IRQ_ERRNO_NUM_INVALID 或者 IRQ_ERRNO_PRIORITY_INVALID o或者BASE_STATUS_OK. | +| 依赖: | interrupt.h | + +1.1.3.3 IRQ_EnableN() + +| 定义: | unsigned int IRQ_EnableN(unsigned int irqNum) | +| -------- | --------------------------------------------- | +| 功能: | 启用指定的中断。 | +| 参数: | irqNum:外部中断编号 | +| 返回值: | BASE_STATUS_OK or IRQ_ERRNO_NUM_INVALID. | +| 依赖: | interrupt.h | + +1.1.3.4HAL_ACMP_Init() + +| 定义: | BASE_StatusType HAL_ACMP_Init(ACMP_Handle *acmpHandle) | +| -------- | ------------------------------------------------------ | +| 功能: | 比较器HAL初始化 | +| 参数: | acmpHandle: ACMP handle类型的变量地址 | +| 返回值: | BASE_StatusType: OK, ERROR | +| 依赖: | acmp.h | + +1.1.3.5HAL_ACMP_RegisterCallBack() + +| 定义: | BASE_StatusType HAL_ACMP_RegisterCallBack(ACMP_Handle *acmpHandle, ACMP_CallBackFun_Type typeID, ACMP_CallBackType callBackFunc) | +| :------- | ------------------------------------------------------------ | +| 功能: | 注册ACMP handle的回调函数 | +| 参数: | acmpHandle: ACMP handle类型的变量地址
typeID:用户回调函数类型
callBackFunc:用户回调功能 | +| 返回值: | BASE_STATUS_OK 成功
BASE_STATUS_ERROR 参数检查失败 | +| 依赖: | acmp.h
iocmg_ip.h | + +1.1.3.6HAL_DAC_Init() + +| 定义: | BASE_StatusType HAL_DAC_Init(DAC_Handle *dacHandle) | +| -------- | --------------------------------------------------- | +| 功能: | DAC HAL初始化 | +| 参数: | dacHandle: DAC handle类型的变量地址 | +| 返回值: | BASE_StatusType: OK, ERROR | +| 依赖: | dac.h | + +#### 1.1.4实验流程 + +- 步骤一:open_mcu-master\src\application\drivers_sample\acmp\sample_acmp_interrupt文件夹复制到workspace\demo\user目录下(workspace自己建的该项目的工作路径) + +- 步骤二:原理:ACMP即模拟比较器,基于比较两个模拟信号的大小,并输出一个数字信号来表示它们之间的关系。当输入信号大于参考信号时,模拟比较器输出高电平;反之,则输出低电平 + + 从原理图和用户手册可以分析出ACMP0_OUT对应的是GPIO0_7,ACMP_N3对应的是GPIO2_6,通过ACMP模拟比较器会在IOCMG_26输出输入源的比较结果,并调用触发相应的回调函数,核心代码如下方所示。 + + ``` + /** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + #include "main.h" + #include "ioconfig.h" + #include "iocmg_ip.h" + #define UART0_BAND_RATE 115200 + BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) + { + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 48; /* PLL Multiplier 48 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.clk1MDiv = (25 - 1); /* The 1 MHz freq is equal to the input clock frequency / (clk_1m_div + 1). 25 is the div of the clk_1m in CLOCK. */ + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; + } + __weak void ACMP0PositveCallFunc(void *handle) + { + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN ACMP0PositveCallFunc */ + /* USER CODE END ACMP0PositveCallFunc */ + } + __weak void ACMP0NegativeCallFunc(void *handle) + { + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN ACMP0NegativeCallFunc */ + /* USER CODE END ACMP0NegativeCallFunc */ + } + __weak void ACMP0EdgedCallFunc(void *handle) + { + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN ACMP0EdgedCallFunc */ + /* USER CODE END ACMP0EdgedCallFunc */ + } + static void ACMP0_Init(void) + { + HAL_CRG_IpEnableSet(ACMP0_BASE, IP_CLK_ENABLE); /* ACMP clock bit reset. */ + g_acmp0.baseAddress = ACMP0_BASE; + g_acmp0.inOutConfig.inputNNum = ACMP_INPUT_N_SELECT3; + g_acmp0.inOutConfig.inputPNum = ACMP_INPUT_P_SELECT5; + g_acmp0.inOutConfig.polarity = ACMP_OUT_NOT_INVERT; + g_acmp0.filterCtrl.filterMode = ACMP_FILTER_NONE; + g_acmp0.hysteresisVol = ACMP_HYS_VOL_30MV; + g_acmp0.interruptEn = BASE_CFG_SET; + HAL_ACMP_Init(&g_acmp0); + HAL_ACMP_RegisterCallBack(&g_acmp0, ACMP_POS_INT, ACMP0PositveCallFunc); + HAL_ACMP_RegisterCallBack(&g_acmp0, ACMP_NEG_INT, ACMP0NegativeCallFunc); + HAL_ACMP_RegisterCallBack(&g_acmp0, ACMP_EDGE_INT, ACMP0EdgedCallFunc); + IRQ_Register(IRQ_ACMP_INT, HAL_ACMP_IrqHandler, &g_acmp0); + IRQ_SetPriority(IRQ_ACMP_INT, 1); /* 1 is priority value */ + IRQ_EnableN(IRQ_ACMP_INT); + } + static void DAC0_Init(void) + { + HAL_CRG_IpEnableSet(DAC0_BASE, IP_CLK_ENABLE); /* DAC0 clock enable. */ + g_dac0.baseAddress = DAC0; + g_dac0.dacValue = 250; + HAL_DAC_Init(&g_dac0); + } + static void UART0_Init(void) + { + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); /* UART0 clock enable. */ + g_uart0.baseAddress = UART0; + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; + g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); + } + static void IOConfig(void) + { + SYSCTRL0->SC_SYS_STAT.BIT.update_mode = 0; + SYSCTRL0->SC_SYS_STAT.BIT.update_mode_clear = 1; + /* Config PIN39 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_3_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_3_AS_UART0_TXD, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_3_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_3_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_3_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN40 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_4_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_4_AS_UART0_RXD, PULL_UP); /* Pull-up and Pull-down, UART RX recommend PULL_UP */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_4_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_4_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_4_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN4 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_6_AS_ACMP_N3); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_6_AS_ACMP_N3, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_6_AS_ACMP_N3, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_6_AS_ACMP_N3, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_6_AS_ACMP_N3, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN1 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_7_AS_ACMP0_OUT); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_7_AS_ACMP0_OUT, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_7_AS_ACMP0_OUT, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_7_AS_ACMP0_OUT, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_7_AS_ACMP0_OUT, DRIVER_RATE_2); /* Output signal edge fast/slow */ + } + void SystemInit(void) + { + IOConfig(); + UART0_Init(); + ACMP0_Init(); + DAC0_Init(); + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ + } + ``` + +- 步骤三:点击![](./pic/1726195173004.jpg)编译代码,具体编译步骤"[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)" + + ![1726194776437](./pic/1726194776437.jpg) + + - 步骤四:点击![](./pic/1726195185553.jpg) 烧录代码,具体烧录步骤"[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)" + + ![](./pic/1726194794028.jpg) + +#### 1.1.5实验结果 + +烧录成功后,打开串口工具,按一下开发板RESET按键复位开发板,可以看到串口打印出来了写入UART0的数据。N极接入的是GPIO2_6,将N极接地,P极就大于N极,会触发回调函数。通过串口输出“ACMP positive callback function”与“ACMP edge callback funtion”,可以看出成功调用了正向回调函数和边缘回调函数,输出比较结果为上升沿。说明ACMP比较器中断驱动实验成功。注意:输入的比较电压不能超过0V~输入电源大小(3.3V),最小可识别有效差分输入电压为20mV。 + +![](./pic/1726194739756.jpg) + +#### 1.1.6扩展实验 + +- 本实验学习使用ACMP比较器中断实验,请学生做如下实验: + - 将GPIO2_6接3.3V,查看是否会触发回调函数。 + + + +### 1.2模拟比较器基本使用 - 内部DAC输出电压和外部输入电压比较 + +#### 1.2.1实验目的 + +- 通过设置输入的N端信号为DAC的内部输出来,对两个输入源进行电压比较,输出比较结果。 + + +#### 1.2.2实验要求 + +- 1.软件要求:open_mcu-master/str(如果采用zip包下载,SDK名称为open_mcu-master/str,如果采用git下载SDK名称为open_mcu_application/str,此处以采用zip下载为例); + +- 2.硬件要求:Hi3061M开发套件; +- 3.工具:万用表 + +#### 1.2.3核心函数说明 + +1.2.3.1 HAL_IOCMG_SetPinAltFuncMode() + +| 定义: | IOCMG_Status HAL_IOCMG_SetPinAltFuncMode(unsigned int pinTypedef) | +| -------- | ------------------------------------------------------------ | +| 功能: | 将引脚设置为功能模式 | +| 参数: | pinTypedef:iomap.h中定义的引脚类型 | +| 返回值: | IOCMG_状态 | +| 依赖: | iocmg.h | + +1.2.3.2 HAL_IOCMG_SetPinPullMode() + +| 定义: | IOCMG_Status HAL_IOCMG_SetPinPullMode(unsigned int pinTypedef, IOCMG_PullMode pullMode) | +| -------- | ------------------------------------------------------------ | +| 功能: | 设置引脚拉动模式 | +| 参数: | pinTypedef:iomap.h中定义的引脚类型
pullMode:定义为IOCMG_PullMode的参数 | +| 返回值: | IOCMG_状态 | +| 依赖: | iocmg_ip.h
iocmg.h | + +1.2.3.3 HAL_IOCMG_SetPinSchmidtMode() + +| 定义: | IOCMG_Status HAL_IOCMG_SetPinSchmidtMode(unsigned int pinTypedef, IOCMG_SchmidtMode schmidtMode) | +| -------- | ------------------------------------------------------------ | +| 功能: | 设置引脚Schmidt模式 | +| 参数: | pinTypedef:iomap.h中定义的引脚类型 schmidtMode:定义为IOCMG_SchmidtMode的参数 | +| 返回值: | IOCMG_状态 | +| 依赖: | iocmg_ip.h
iocmg.h | + +1.2.3.4HAL_IOCMG_SetPinLevelShiftRate() + +| 定义: | IOCMG_Status HAL_IOCMG_SetPinLevelShiftRate(unsigned int pinTypedef, IOCMG_LevelShiftRate levelShiftRate) | +| -------- | ------------------------------------------------------------ | +| 功能: | 设置引脚电平移位速率模式 | +| 参数: | pinTypedef:iomap.h中定义的引脚类型
levelShiftRate:定义为IOCMG_LevelShiftRate的参数 | +| 返回值: | IOCMG_状态 | +| 依赖: | iocmg_ip.h
iocmg.h | + +1.2.3.5HAL_IOCMG_SetPinDriveRate() + +| 定义: | IOCMG_Status HAL_IOCMG_SetPinDriveRate(unsigned int pinTypedef, IOCMG_DriveRate driveRate) | +| -------- | ------------------------------------------------------------ | +| 功能: | 设置引脚驱动速率模式 | +| 参数: | pinTypedef:iomap.h中定义的引脚类型
driveRate: 定义为IOCMG_DriveRate的参数 | +| 返回值: | IOCMG_状态 | +| 依赖: | iocmg_ip.h iocmg.h | + +ACMP接口说明请参考该手册1.1.3.4、1.1.3.5、1.1.3.6. + +#### 1.2.4实验流程 + +- 步骤一:open_mcu-master\src\application\drivers_sample\acmp\sample_acmp_out_result文件夹复制到workspace\demo\user目录下(workspace自己建的该项目的工作路径) + +- 步骤二:原理:ACMP即模拟比较器,基于比较两个模拟信号的大小,并输出一个数字信号来表示它们之间的关系。当输入信号大于参考信号时,模拟比较器输出高电平;反之,则输出低电平 + + 从原理图和用户手册可以分析出ACMP0_OUT对应的是GPIO0_7,ACMP_N3对应的是GPIO2_6,通过ACMP模拟比较器会在输入的N端信号为DAC的内部输出,输入的P端信号为GPIO2_6,在GPIO0_7中输出比较结 果。核心代码如下方所示。 + + ``` + /** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + #include "main.h" + #include "ioconfig.h" + #include "iocmg_ip.h" + #define UART0_BAND_RATE 115200 + BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) + { + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 48; /* PLL Multiplier 48 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.clk1MDiv = (25 - 1); /* The 1 MHz freq is equal to the input clock frequency / (clk_1m_div + 1). 25 is the div of the clk_1m in CLOCK. */ + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; + } + static void ACMP0_Init(void) + { + HAL_CRG_IpEnableSet(ACMP0_BASE, IP_CLK_ENABLE); /* ACMP clock bit reset. */ + g_acmp0.baseAddress = ACMP0_BASE; + g_acmp0.inOutConfig.inputNNum = ACMP_INPUT_N_SELECT3; + g_acmp0.inOutConfig.inputPNum = ACMP_INPUT_P_SELECT5; + g_acmp0.inOutConfig.polarity = ACMP_OUT_NOT_INVERT; + g_acmp0.filterCtrl.filterMode = ACMP_FILTER_NONE; + g_acmp0.hysteresisVol = ACMP_HYS_VOL_30MV; + g_acmp0.interruptEn = BASE_CFG_UNSET; + HAL_ACMP_Init(&g_acmp0); + } + static void DAC0_Init(void) + { + HAL_CRG_IpEnableSet(DAC0_BASE, IP_CLK_ENABLE); /* DAC0 clock enable. */ + g_dac0.baseAddress = DAC0; + g_dac0.dacValue = 250; + HAL_DAC_Init(&g_dac0); + } + static void UART0_Init(void) + { + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); /* UART0 clock enable. */ + g_uart0.baseAddress = UART0; + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; + g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); + } + static void IOConfig(void) + { + SYSCTRL0->SC_SYS_STAT.BIT.update_mode = 0; + SYSCTRL0->SC_SYS_STAT.BIT.update_mode_clear = 1; + /* Config PIN39 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_3_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_3_AS_UART0_TXD, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_3_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_3_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_3_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN40 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_4_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_4_AS_UART0_RXD, PULL_UP); /* Pull-up and Pull-down, UART RX recommend PULL_UP */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_4_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_4_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_4_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN4 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_6_AS_ACMP_N3); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_6_AS_ACMP_N3, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_6_AS_ACMP_N3, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_6_AS_ACMP_N3, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_6_AS_ACMP_N3, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN1 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_7_AS_ACMP0_OUT); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_7_AS_ACMP0_OUT, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_7_AS_ACMP0_OUT, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_7_AS_ACMP0_OUT, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_7_AS_ACMP0_OUT, DRIVER_RATE_2); /* Output signal edge fast/slow */ + } + void SystemInit(void) + { + IOConfig(); + UART0_Init(); + ACMP0_Init(); + DAC0_Init(); + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ + } + ``` + + - 步骤三:点击![](./pic/1726195173004.jpg)编译代码,具体编译步骤"[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)" + + ![1726194776437](./pic/1726194776437.jpg) + + - 步骤四:点击![](./pic/1726195185553.jpg) 烧录代码,具体烧录步骤"[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)" + + ![](./pic/1726194794028.jpg) + + + +- 步骤五:用万用表检测GPIO0_7引脚的电压 + +#### 1.2.5实验结果 + +烧录成功后,打开串口工具,按一下开发板RESET按键复位开发板,可以看到串口打印出来了写入UART0的数据。N极接地,P极输入源从DAC输出(0.8V),P极电压大于N极电压,最后GPIO0_7结果输出3.3V电压。 + + ![](./pic/1726194824764.jpg) + + ![](./pic/1726194869607.jpg) + + + +#### 1.2.6扩展实验 + +- 本实验学习使用ACMP比较器中断实验,请学生做如下实验: + - 交换N端口输入电压,并测量输出端的电压,比较输入源的电压大小。 + + 提示: + + - 输入的比较电压不能超过0V~输入电源大小(3.3V)。 + - 最小可识别有效差分输入电压为20mV。 + +## 2、APT驱动章节 + +### 2.1高级脉宽调制PWM-单电阻采样电机控制 + +#### 2.1.1实验目的 + +- 通过配置APT模块来控制PWM波的输出,实现对电机的保护。 + +#### 2.1.2实验要求 + +- 1.软件要求:open_mcu-master/str(如果采用zip包下载,SDK名称为open_mcu-master/str,如果采用git下载SDK名称为open_mcu_application/str,此处以采用zip下载为例); + +- 2.硬件要求:Hi3061M开发套件; + +#### 2.1.3核心函数说明 + +2.1.3.1 HAL_APT_MasterSyncInit() + +| 定义: | BASE_StatusType HAL_APT_MasterSyncInit(APT_Handle *aptHandle, unsigned short syncOutSrc) | +| -------- | ------------------------------------------------------------ | +| 功能: | 使用多重同步模式时,初始化主APT模块。 | +| 参数: | aptHandle:APT_Handle类型的变量
syncOutSrc:主APT模块同步源。 | +| 返回值: | BASE_StatusType: OK, ERROR, BUSY, TIMEOUT. | +| 依赖: | apt.h | + +2.1.3.2 HAL_APT_SlaveSyncInit() + +| 定义: | BASE_StatusType HAL_APT_SlaveSyncInit(APT_Handle *aptHandle, APT_SlaveSyncIn *slaveSyncIn) | +| -------- | ------------------------------------------------------------ | +| 功能: | 初始化从属APT模块。 | +| 参数: | aptHandle:APT_Handle类型的变量
slaveSyncIn:从属APT模块同步handle | +| 返回值: | BASE_StatusType: OK, ERROR, BUSY, TIMEOUT. | +| 依赖: | apt.h | + +2.1.3.3 HAL_APT_StopModule() + +| 定义: | void HAL_APT_StopModule(unsigned int aptRunMask) | +| -------- | -------------------------------------------------- | +| 功能: | 同时停止所有已使用的APT模块。 | +| 参数: | aptRunMask:可以作为aptRunMask传递的有效值的逻辑OR | +| 返回值: | void | +| 依赖: | apt.h | + +2.1.3.4 HAL_APT_SetPWMDutyByNumber() + +| 定义: | BASE_StatusType HAL_APT_SetPWMDutyByNumber(APT_Handle *aptHandle, unsigned int duty) | +| -------- | ------------------------------------------------------------ | +| 功能: | 沿PWM波形的左右边缘设置计数比较点。修改占空比 | +| 参数: | aptHandle:APT_Handle类型的变量
duty:PWM占空比。范围:1~99。 | +| 返回值: | BASE_StatusType: OK, ERROR, BUSY, TIMEOUT | +| 依赖: | apt.h | + +2.1.3.5 HAL_APT_ProtectInitEx() + +| 定义: | BASE_StatusType HAL_APT_ProtectInitEx(APT_Handle *aptHandle, APT_OutCtrlProtectEx *protect) | +| -------- | ------------------------------------------------------------ | +| 功能: | 初始化APT模块(扩展接口)的输出控制保护事件。 | +| 参数: | aptHandle:APT_Handle类型的变量
protect:输出控制保护事件数据。 | +| 返回值: | BASE_StatusType: OK, ERROR, BUSY, TIMEOUT | +| 依赖: | apt.h
apt_ip.h | + +#### 2.1.4实验流程 + +- 步骤一:open_mcu-master\src\application\drivers_sample\apt\sample_apt_single_resistor文件夹复制到workspace\demo\user目录下(workspace自己建的该项目的工作路径) + +- 步骤二:原理:APT 为高级 PWM 定时器模块,APT模块通过高级PWM信号的产生与调节,结合单电阻采样技术,实现对电机的精确速度控制和电流采样,从而优化电机的性能和效率。 + + 从原理图和用户手册可以分析出APT 分 A、B 两组,GPIO3_0对应的是APT0_PWMA,GPIO3_1对应的是APT1_PWMA,GPIO3_2对应的是APT2_PWMA,GPIO4_0对应的是APT0_PWMB,GPIO4_1对应的是APT1_PWMB,GPIO4_2对应的是APT2_PWMB。同一对 APT(如 APT0_PWMA 和 + + APT0_PWMB)接同一相电源控制,便于死区时间控制,核心代码如下方所示。 + + ``` + /** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + #include "main.h" + #include "ioconfig.h" + #include "iocmg_ip.h" + #define UART0_BAND_RATE 115200 + BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) + { + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 48; /* PLL Multiplier 48 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.clk1MDiv = (25 - 1); /* The 1 MHz freq is equal to the input clock frequency / (clk_1m_div + 1). 25 is the div of the clk_1m in CLOCK. */ + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; + } + __weak void AptUEventCallback(void *aptHandle) + { + BASE_FUNC_UNUSED(aptHandle); + /* USER CODE BEGIN APT0_EVENT_INTERRUPT */ + /* USER CODE END APT0_EVENT_INTERRUPT */ + } + __weak void AptUTimerCallback(void *aptHandle) + { + BASE_FUNC_UNUSED(aptHandle); + /* USER CODE BEGIN APT0_TIMER_INTERRUPT */ + /* USER CODE END APT0_TIMER_INTERRUPT */ + } + static void APT0_ProtectInit(void) + { + APT_OutCtrlProtectEx protectApt = {0}; + protectApt.ocEventEnEx = BASE_CFG_ENABLE; + protectApt.ocEventModeEx = APT_OUT_CTRL_ONE_SHOT; + protectApt.ocActionEx = APT_OUT_CTRL_ACTION_LOW; + protectApt.ocActionBEx = APT_OUT_CTRL_ACTION_LOW; + protectApt.ocEvtInterruptEnEx = BASE_CFG_ENABLE; + protectApt.ocSysEvent = APT_SYS_EVT_DEBUG | APT_SYS_EVT_CLK | APT_SYS_EVT_MEM; + protectApt.originalEvtEx = APT_EM_ORIGINAL_SRC_POE0; + protectApt.filterCycleNumEx = 0; + HAL_APT_ProtectInitEx(&g_hAptU, &protectApt); + } + static void APT0_Init(void) + { + HAL_CRG_IpEnableSet(APT0_BASE, IP_CLK_ENABLE); + g_hAptU.baseAddress = APT0; + /* Clock Settings */ + g_hAptU.waveform.dividerFactor = 1 - 1; + /* Timer Settings */ + g_hAptU.waveform.timerPeriod = 20000; /* 20000 is count period of APT time-base timer */ + g_hAptU.waveform.cntMode = APT_COUNT_MODE_UP_DOWN; + /* Wave Form */ + g_hAptU.waveform.basicType = APT_PWM_BASIC_A_LOW_B_HIGH; + g_hAptU.waveform.chAOutType = APT_PWM_OUT_BASIC_TYPE; + g_hAptU.waveform.chBOutType = APT_PWM_OUT_BASIC_TYPE; + g_hAptU.waveform.divInitVal = 0; + g_hAptU.waveform.cntInitVal = 0; + g_hAptU.waveform.cntCmpLeftEdge = 1; /* 1 is count compare point of the left edge of PWM waveform */ + g_hAptU.waveform.cntCmpRightEdge = 19999; /* 19999 is count compare point of the right edge of PWM waveform */ + g_hAptU.waveform.cntCmpLoadMode = APT_BUFFER_INDEPENDENT_LOAD; + g_hAptU.waveform.cntCmpLoadEvt = APT_COMPARE_LOAD_EVENT_ZERO; + g_hAptU.waveform.deadBandCnt = 10; /* 10 is dead-band value */ + /* ADC Trigger SOCA */ + g_hAptU.adcTrg.trgEnSOCA = BASE_CFG_ENABLE; + g_hAptU.adcTrg.cntCmpSOCA = 1; /* 1 is count compare point of ADC trigger source SOCA when using CMPA */ + g_hAptU.adcTrg.trgSrcSOCA = APT_CS_SRC_CNTR_CMPA_UP; + g_hAptU.adcTrg.trgScaleSOCA = 1; + /* ADC Trigger SOCB */ + g_hAptU.adcTrg.trgEnSOCB = BASE_CFG_ENABLE; + g_hAptU.adcTrg.cntCmpSOCB = 1; + g_hAptU.adcTrg.trgSrcSOCB = APT_CS_SRC_CNTR_CMPB_UP; + g_hAptU.adcTrg.trgScaleSOCB = 1; + g_hAptU.adcTrg.cntCmpLoadMode = APT_BUFFER_INDEPENDENT_LOAD; + g_hAptU.adcTrg.cntCmpLoadEvt = APT_COMPARE_LOAD_EVENT_ZERO; + /* Timer Trigger */ + g_hAptU.tmrInterrupt.tmrInterruptEn = BASE_CFG_ENABLE; + g_hAptU.tmrInterrupt.tmrInterruptSrc = APT_INT_SRC_CNTR_ZERO_PERIOD; + g_hAptU.tmrInterrupt.tmrInterruptScale = 1; + APT0_ProtectInit(); + HAL_APT_PWMInit(&g_hAptU); + HAL_APT_RegisterCallBack(&g_hAptU, APT_EVENT_INTERRUPT, AptUEventCallback); + IRQ_SetPriority(IRQ_APT0_EVT, 1); /* 1 is priority value */ + IRQ_Register(IRQ_APT0_EVT, HAL_APT_EventIrqHandler, &g_hAptU); + IRQ_EnableN(IRQ_APT0_EVT); + HAL_APT_RegisterCallBack(&g_hAptU, APT_TIMER_INTERRUPT, AptUTimerCallback); + IRQ_SetPriority(IRQ_APT0_TMR, 1); /* 1 is priority value */ + IRQ_Register(IRQ_APT0_TMR, HAL_APT_TimerIrqHandler, &g_hAptU); + IRQ_EnableN(IRQ_APT0_TMR); + } + static void APT1_ProtectInit(void) + { + APT_OutCtrlProtectEx protectApt = {0}; + protectApt.ocEventEnEx = BASE_CFG_ENABLE; + protectApt.ocEventModeEx = APT_OUT_CTRL_ONE_SHOT; + protectApt.ocActionEx = APT_OUT_CTRL_ACTION_LOW; + protectApt.ocActionBEx = APT_OUT_CTRL_ACTION_LOW; + protectApt.ocEvtInterruptEnEx = BASE_CFG_DISABLE; + protectApt.ocSysEvent = APT_SYS_EVT_DEBUG | APT_SYS_EVT_CLK | APT_SYS_EVT_MEM; + protectApt.originalEvtEx = APT_EM_ORIGINAL_SRC_POE0; + protectApt.filterCycleNumEx = 0; + HAL_APT_ProtectInitEx(&g_hAptV, &protectApt); + } + static void APT1_Init(void) + { + HAL_CRG_IpEnableSet(APT1_BASE, IP_CLK_ENABLE); + g_hAptV.baseAddress = APT1; + /* Clock Settings */ + g_hAptV.waveform.dividerFactor = 1 - 1; + /* Timer Settings */ + g_hAptV.waveform.timerPeriod = 20000; /* 20000 is count period of APT time-base timer */ + g_hAptV.waveform.cntMode = APT_COUNT_MODE_UP_DOWN; + /* Wave Form */ + g_hAptV.waveform.basicType = APT_PWM_BASIC_A_LOW_B_HIGH; + g_hAptV.waveform.chAOutType = APT_PWM_OUT_BASIC_TYPE; + g_hAptV.waveform.chBOutType = APT_PWM_OUT_BASIC_TYPE; + g_hAptV.waveform.divInitVal = 0; + g_hAptV.waveform.cntInitVal = 0; + g_hAptV.waveform.cntCmpLeftEdge = 1; /* 1 is count compare point of the left edge of PWM waveform */ + g_hAptV.waveform.cntCmpRightEdge = 19999; /* 19999 is count compare point of the right edge of PWM waveform */ + g_hAptV.waveform.cntCmpLoadMode = APT_BUFFER_INDEPENDENT_LOAD; + g_hAptV.waveform.cntCmpLoadEvt = APT_COMPARE_LOAD_EVENT_ZERO; + g_hAptV.waveform.deadBandCnt = 10; /* 10 is dead-band value */ + APT1_ProtectInit(); + HAL_APT_PWMInit(&g_hAptV); + } + static void APT2_ProtectInit(void) + { + APT_OutCtrlProtectEx protectApt = {0}; + protectApt.ocEventEnEx = BASE_CFG_ENABLE; + protectApt.ocEventModeEx = APT_OUT_CTRL_ONE_SHOT; + protectApt.ocActionEx = APT_OUT_CTRL_ACTION_LOW; + protectApt.ocActionBEx = APT_OUT_CTRL_ACTION_LOW; + protectApt.ocEvtInterruptEnEx = BASE_CFG_DISABLE; + protectApt.ocSysEvent = APT_SYS_EVT_DEBUG | APT_SYS_EVT_CLK | APT_SYS_EVT_MEM; + protectApt.originalEvtEx = APT_EM_ORIGINAL_SRC_POE0; + protectApt.filterCycleNumEx = 0; + HAL_APT_ProtectInitEx(&g_hAptW, &protectApt); + } + static void APT2_Init(void) + { + HAL_CRG_IpEnableSet(APT2_BASE, IP_CLK_ENABLE); + g_hAptW.baseAddress = APT2; + /* Clock Settings */ + g_hAptW.waveform.dividerFactor = 1 - 1; + /* Timer Settings */ + g_hAptW.waveform.timerPeriod = 20000; /* 20000 is count period of APT time-base timer */ + g_hAptW.waveform.cntMode = APT_COUNT_MODE_UP_DOWN; + /* Wave Form */ + g_hAptW.waveform.basicType = APT_PWM_BASIC_A_LOW_B_HIGH; + g_hAptW.waveform.chAOutType = APT_PWM_OUT_BASIC_TYPE; + g_hAptW.waveform.chBOutType = APT_PWM_OUT_BASIC_TYPE; + g_hAptW.waveform.divInitVal = 0; + g_hAptW.waveform.cntInitVal = 0; + g_hAptW.waveform.cntCmpLeftEdge = 1; /* 1 is count compare point of the left edge of PWM waveform */ + g_hAptW.waveform.cntCmpRightEdge = 19999; /* 19999 is count compare point of the right edge of PWM waveform */ + g_hAptW.waveform.cntCmpLoadMode = APT_BUFFER_INDEPENDENT_LOAD; + g_hAptW.waveform.cntCmpLoadEvt = APT_COMPARE_LOAD_EVENT_ZERO; + g_hAptW.waveform.deadBandCnt = 10; /* 10 is dead-band value */ + APT2_ProtectInit(); + HAL_APT_PWMInit(&g_hAptW); + } + static void UART0_Init(void) + { + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); /* UART0 clock enable. */ + g_uart0Handle.baseAddress = UART0; + g_uart0Handle.baudRate = UART0_BAND_RATE; + g_uart0Handle.dataLength = UART_DATALENGTH_8BIT; + g_uart0Handle.stopBits = UART_STOPBITS_ONE; + g_uart0Handle.parity = UART_PARITY_NONE; + g_uart0Handle.txMode = UART_MODE_BLOCKING; + g_uart0Handle.rxMode = UART_MODE_BLOCKING; + g_uart0Handle.fifoMode = BASE_CFG_ENABLE; + g_uart0Handle.fifoTxThr = UART_FIFODEPTH_SIZE8; + g_uart0Handle.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart0Handle.hwFlowCtr = BASE_CFG_DISABLE; + g_uart0Handle.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart0Handle.handleEx.msbFirst = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0Handle); + } + static void IOConfig(void) + { + SYSCTRL0->SC_SYS_STAT.BIT.update_mode = 0; + SYSCTRL0->SC_SYS_STAT.BIT.update_mode_clear = 1; + /* Config PIN39 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_3_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_3_AS_UART0_TXD, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_3_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_3_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_3_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN40 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_4_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_4_AS_UART0_RXD, PULL_UP); /* Pull-up and Pull-down, UART RX recommend PULL_UP */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_4_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_4_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_4_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN19 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO3_0_AS_APT0_PWMA); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO3_0_AS_APT0_PWMA, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO3_0_AS_APT0_PWMA, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO3_0_AS_APT0_PWMA, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO3_0_AS_APT0_PWMA, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN23 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO4_0_AS_APT0_PWMB); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO4_0_AS_APT0_PWMB, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO4_0_AS_APT0_PWMB, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO4_0_AS_APT0_PWMB, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO4_0_AS_APT0_PWMB, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN21 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO3_2_AS_APT2_PWMA); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO3_2_AS_APT2_PWMA, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO3_2_AS_APT2_PWMA, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO3_2_AS_APT2_PWMA, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO3_2_AS_APT2_PWMA, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN25 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO4_2_AS_APT2_PWMB); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO4_2_AS_APT2_PWMB, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO4_2_AS_APT2_PWMB, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO4_2_AS_APT2_PWMB, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO4_2_AS_APT2_PWMB, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN20 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO3_1_AS_APT1_PWMA); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO3_1_AS_APT1_PWMA, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO3_1_AS_APT1_PWMA, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO3_1_AS_APT1_PWMA, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO3_1_AS_APT1_PWMA, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN24 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO4_1_AS_APT1_PWMB); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO4_1_AS_APT1_PWMB, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO4_1_AS_APT1_PWMB, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO4_1_AS_APT1_PWMB, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO4_1_AS_APT1_PWMB, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN1 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_7_AS_POE0); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_7_AS_POE0, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_7_AS_POE0, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_7_AS_POE0, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_7_AS_POE0, DRIVER_RATE_2); /* Output signal edge fast/slow */ + } + void SystemInit(void) + { + IOConfig(); + UART0_Init(); + APT0_Init(); + APT1_Init(); + APT2_Init(); + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ + } + ``` + + - 步骤三:点击![](./pic/1726195173004.jpg)编译代码,具体编译步骤"[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)" + + ![1726194776437](./pic/1726194776437.jpg) + + - 步骤四:点击![](./pic/1726195185553.jpg) 烧录代码,具体烧录步骤"[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)" + + ![](./pic/1726194794028.jpg) + + +#### 2.1.5实验结果 + +烧录成功后,打开串口工具,可以看到串口打印出来了写入UART0的数据。通过串口打印可以看出U相APT模块的定时器中断回调一直在触发,然后判断返回时基方向。 + +![](./pic/1726194906962.jpg) + +#### 2.1.6扩展实验 + +本实验学习使用高级脉宽调制PWM-单电阻采样电机控制实验,请学生做如下实验: + +- 修改占空比,观察其现象。 + + 提示: + + - 占空比可通过“HAL_APT_SetPWMDutyByNumber”进行更改 + - 分频器的分频系数的范围为 0到4095,计数器的计数周期值的范围为 0到65535。死区延时计数值范围 0到65535。 + - PWM 波的频率: + + ```c + ①递增/递减计时模式,PWM 波的频率 = 工作时钟频率 / ((分频器的分频系数+1)*(计数器的计数周期值+1)); + ②先增后减计时模式,PWM 波的频率 = 工作时钟频率 / ((分频器的分频系数+1)*(计数器的计数周期值*2))。 + ``` + + - 死区的宽度:插入死区的宽度 = 工作时钟周期 * 死区延时计数值。 + + + +## 3、CAN驱动章节 + +### 3.1 控制局域网-发送扩展数据帧和接收符合过滤规则的扩展帧数据 + +#### 3.1.1实验目的 + +- 测试和验证CAN总线通信的硬件接口和软件驱动程序是否能够正确地发送和接收数据 + +#### 3.1.2实验要求 + +- 1.软件要求:open_mcu-master/str(如果采用zip包下载,SDK名称为open_mcu-master/str,如果采用git下载SDK名称为open_mcu_application/str,此处以采用zip下载为例); + +- 2.硬件要求:Hi3061M开发套件; + +#### 3.1.3核心函数说明 + +3.1.3.1 HAL_CAN_Write() + +| 定义: | BASE_StatusType HAL_CAN_Write(CAN_Handle *canHandle, CANFrame *data) | +| -------- | ------------------------------------------------------------ | +| 功能: | 立即发送数据 | +| 参数: | canHandle:CAN_Handle类型变量
data:待发送CAN数据帧的指针地址 | +| 返回值: | BASE status type: OK, ERROR, BUSY, TIMEOUT | +| 依赖: | can.h | + +3.1.3.2 HAL_CAN_ReadIT() + +| 定义: | BASE_StatusType HAL_CAN_ReadIT(CAN_Handle *canHandle, CANFrame *data, CAN_FilterConfigure *filterConfigure) | +| -------- | ------------------------------------------------------------ | +| 功能: | 异步接收CAN数据帧 | +| 参数: | canHandle:CAN_Handle类型变量
data:用于存储CAN数据帧的地址
filterConfigure:过滤配置的处理, | +| 返回值: | BASE status type: OK, ERROR, BUSY, TIMEOUT | +| 依赖: | can.h | + +#### 3.1.4实验流程 + +- 步骤一:open_mcu-master\src\application\drivers_sample\can\sample_can_send_receive文件夹复制到workspace\demo\user目录下(workspace自己建的该项目的工作路径) + +- 步骤二:原理:CAN总线是一种用于实时应用的串行通信协议总线,CAN总线中的数据传输通过帧的方式进行,帧类型包括数据帧、远程帧、错误帧和过载帧。数据帧负责数据从发送器到接收器的传输,远程帧用于请求相同数据,错误帧在检测到总线错误时发出,过载帧提供两数据帧或远程帧之间的延时。 + + 从原理图和用户手册可以分析出开发板通过CAN_RX(GPIO3_6)与CAN_TX(GPIO3_5)相接,来接收发数据然后通过串口打印出来,核心代码如下方所示。 + + ``` + /** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + #include "main.h" + #include "ioconfig.h" + #include "iocmg_ip.h" + #define UART0_BAND_RATE 115200 + BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) + { + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 48; /* PLL Multiplier 48 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.clk1MDiv = (25 - 1); /* The 1 MHz freq is equal to the input clock frequency / (clk_1m_div + 1). 25 is the div of the clk_1m in CLOCK. */ + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; + } + __weak void CAN_ReadFinish(void *handle) + { + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN CAN_READ_FINISH */ + /* USER CODE END CAN_READ_FINISH */ + } + __weak void CAN_WriteFinish(void *handle) + { + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN CAN_WRITE_FINISH */ + /* USER CODE END CAN_WRITE_FINISH */ + } + __weak void CAN_Transmit_Error(void *handle) + { + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN CAN_TRANSMIT_ERROR */ + /* USER CODE END CAN_TRANSMIT_ERROR */ + } + static void CAN_Init(void){ + HAL_CRG_IpEnableSet(CAN_BASE, IP_CLK_ENABLE); + g_can.baseAddress = CAN; + g_can.typeMode = CAN_MODE_NORMAL; + g_can.seg1Phase = CAN_SEG1_6TQ; + g_can.seg2Phase = CAN_SEG2_3TQ; + g_can.sjw = CAN_SJW_2TQ; + g_can.prescalser = 25; /* 25 is frequency division coefficient */ + g_can.rxFIFODepth = 3; /* A maximum of 3 packet objects are in RX FIFO */ + g_can.autoRetrans = BASE_CFG_ENABLE; + HAL_CAN_Init(&g_can); + HAL_CAN_RegisterCallBack(&g_can, CAN_READ_FINISH, CAN_ReadFinish); + HAL_CAN_RegisterCallBack(&g_can, CAN_WRITE_FINISH, CAN_WriteFinish); + HAL_CAN_RegisterCallBack(&g_can, CAN_TRNS_ERROR, CAN_Transmit_Error); + IRQ_Register(IRQ_CAN, HAL_CAN_IrqHandler, &g_can); + IRQ_SetPriority(IRQ_CAN, 1); /* 1 is priority value */ + IRQ_EnableN(IRQ_CAN); + } + static void UART0_Init(void) + { + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); /* UART0 clock enable. */ + g_uart0.baseAddress = UART0; + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; + g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); + } + static void IOConfig(void) + { + /* Config PIN9 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO3_5_AS_CAN_TX); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO3_5_AS_CAN_TX, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO3_5_AS_CAN_TX, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO3_5_AS_CAN_TX, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO3_5_AS_CAN_TX, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN8 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO3_6_AS_CAN_RX); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO3_6_AS_CAN_RX, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO3_6_AS_CAN_RX, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO3_6_AS_CAN_RX, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO3_6_AS_CAN_RX, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN39 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_3_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_3_AS_UART0_TXD, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_3_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_3_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_3_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN40 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_4_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_4_AS_UART0_RXD, PULL_UP); /* Pull-up and Pull-down, UART RX recommend PULL_UP */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_4_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_4_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_4_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + } + void SystemInit(void) + { + IOConfig(); + UART0_Init(); + CAN_Init(); + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ + } + ``` + +#### 3.1.5实验结果 + + + +#### 3.1.6扩展实验 + +#### + +## 4、CAPM驱动章节 + +### 4.1 CAPM读取电机HALL位置传感器 + +#### 4.1.1实验目的 + +- 转动电机,通过CAPM来实现捕获电机上HALL位置传感器的电平。 + +#### 4.1.2实验要求 + +- 1.软件要求:open_mcu-master/str(如果采用zip包下载,SDK名称为open_mcu-master/str,如果采用git下载SDK名称为open_mcu_application/str,此处以采用zip下载为例); + +- 2.硬件要求:Hi3061M开发套件; + +#### 4.1.3核心函数说明 + +3.1.3.1 CAPM_CalculateLevel() + +| 定义: | static unsigned char CAPM_CalculateLevel(CAPM_Handle *handle) | +| -------- | ------------------------------------------------------------ | +| 功能: | 计算当前水平 | +| 参数: | canHandle:CAPM_Handle类型变量 | +| 返回值: | unsigned char类型变量 | +| 依赖: | can.h | + +#### 4.1.4实验流程 + +- 步骤一:open_mcu-master\src\application\drivers_sample\capm\capm_hall_sample文件夹复制到workspace\demo\user目录下(workspace自己建的该项目的工作路径) + +- 步骤二:原理:通过检测霍尔元件的状态变化,可以确定电机转子的角度和位置,从原理图和用户手册可以分析出开发板通过CAPM0_IN(GPIO5_0)获取电机一个HALL传感器的电平信息,然后通过串口打印出数据,核心代码如下方所示。 + + ``` + /** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + #include "main.h" + #include "ioconfig.h" + #include "iocmg_ip.h" + #define UART0_BAND_RATE 115200 + BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) + { + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 48; /* PLL Multiplier 48 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.clk1MDiv = (25 - 1); /* The 1 MHz freq is equal to the input clock frequency / (clk_1m_div + 1). 25 is the div of the clk_1m in CLOCK. */ + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; + } + static void CAPM0_Init(void) + { + HAL_CRG_IpEnableSet(CAPM0_BASE, IP_CLK_ENABLE); + g_capmAConfig.baseAddress = CAPM0; + g_capmAConfig.deburrNum = 0; + g_capmAConfig.capMode = CAPM_CONTINUECAP; + g_capmAConfig.preScale = 0; + g_capmAConfig.capRegConfig[CAPM_ECR_NUM1].capEvent = CAPM_RISING; + g_capmAConfig.capRegConfig[CAPM_ECR_NUM1].regReset = CAPM_NOTRESET; + g_capmAConfig.capRegConfig[CAPM_ECR_NUM2].capEvent = CAPM_FALLING; + g_capmAConfig.capRegConfig[CAPM_ECR_NUM2].regReset = CAPM_NOTRESET; + g_capmAConfig.useCapNum = 2; + g_capmAConfig.tscntDiv = 1 - 1; + g_capmAConfig.inputSrc = CAPM_INPUT; + HAL_CAPM_Init(&g_capmAConfig); + } + static void CAPM1_Init(void) + { + HAL_CRG_IpEnableSet(CAPM1_BASE, IP_CLK_ENABLE); + g_capmBConfig.baseAddress = CAPM1; + g_capmBConfig.deburrNum = 0; + g_capmBConfig.capMode = CAPM_CONTINUECAP; + g_capmBConfig.preScale = 0; + g_capmBConfig.capRegConfig[CAPM_ECR_NUM1].capEvent = CAPM_RISING; + g_capmBConfig.capRegConfig[CAPM_ECR_NUM1].regReset = CAPM_NOTRESET; + g_capmBConfig.capRegConfig[CAPM_ECR_NUM2].capEvent = CAPM_FALLING; + g_capmBConfig.capRegConfig[CAPM_ECR_NUM2].regReset = CAPM_NOTRESET; + g_capmBConfig.useCapNum = 2; + g_capmBConfig.tscntDiv = 1 - 1; + g_capmBConfig.inputSrc = CAPM_INPUT; + HAL_CAPM_Init(&g_capmBConfig); + } + static void CAPM2_Init(void) + { + HAL_CRG_IpEnableSet(CAPM2_BASE, IP_CLK_ENABLE); + g_capmCConfig.baseAddress = CAPM2; + g_capmCConfig.deburrNum = 0; + g_capmCConfig.capMode = CAPM_CONTINUECAP; + g_capmCConfig.preScale = 0; + g_capmCConfig.capRegConfig[CAPM_ECR_NUM1].capEvent = CAPM_RISING; + g_capmCConfig.capRegConfig[CAPM_ECR_NUM1].regReset = CAPM_NOTRESET; + g_capmCConfig.capRegConfig[CAPM_ECR_NUM2].capEvent = CAPM_FALLING; + g_capmCConfig.capRegConfig[CAPM_ECR_NUM2].regReset = CAPM_NOTRESET; + g_capmCConfig.useCapNum = 2; + g_capmCConfig.tscntDiv = 1 - 1; + g_capmCConfig.inputSrc = CAPM_INPUT; + HAL_CAPM_Init(&g_capmCConfig); + } + static void UART0_Init(void) + { + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); /* UART0 clock enable. */ + g_uart0.baseAddress = UART0; + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; + g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); + } + static void IOConfig(void) + { + /* Config PIN39 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_3_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_3_AS_UART0_TXD, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_3_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_3_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_3_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN40 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_4_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_4_AS_UART0_RXD, PULL_UP); /* Pull-up and Pull-down, UART RX recommend PULL_UP */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_4_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_4_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_4_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN33 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO5_0_AS_CAPM0_IN); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO5_0_AS_CAPM0_IN, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO5_0_AS_CAPM0_IN, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO5_0_AS_CAPM0_IN, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO5_0_AS_CAPM0_IN, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN32 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_1_AS_CAPM1_IN); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_1_AS_CAPM1_IN, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_1_AS_CAPM1_IN, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_1_AS_CAPM1_IN, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_1_AS_CAPM1_IN, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN31 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO2_0_AS_CAPM2_IN); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO2_0_AS_CAPM2_IN, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO2_0_AS_CAPM2_IN, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO2_0_AS_CAPM2_IN, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO2_0_AS_CAPM2_IN, DRIVER_RATE_2); /* Output signal edge fast/slow */ + } + void SystemInit(void) + { + IOConfig(); + UART0_Init(); + CAPM0_Init(); + CAPM1_Init(); + CAPM2_Init(); + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ + } + ``` + +- 步骤三:点击![](./pic/1726195173004.jpg)编译代码,具体编译步骤"[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)" + + ![1726194776437](./pic/1726194776437.jpg) + + - 步骤四:点击![](./pic/1726195185553.jpg) 烧录代码,具体烧录步骤"[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)" + + ![](./pic/1726194794028.jpg) + + +- 步骤五:给电机接电接地,还有一根接在GPIO0_5上 + + ![1726194945180](./pic/1726194945180.jpg) + + + +#### 4.1.5实验结果 + +- 烧录成功后,打开串口工具,可以看到串口打印出来了写入UART0的数据,在没转动电机时,串口不断输出0x3,当转动电机时,串口输出0x7,说CAPM0_IN(GPIO0_5)获取到了一个HALL传感器的电平信息,说明实验成功。 + + ![](./pic/1726194962547.jpg) + + + +#### 4.1.6扩展实验 + +- 本实验学习了用CAPM0_IN获取电平信息,请学生做如下实验: + +- 切换CAPM1_IN或者CAPM2_IN与电机连接,查看串口输出数据的变化。 + + + +## 5、CFD驱动章节 + +### 5.1 验证CFD的时钟失效保护功能 + +#### 5.1.1实验目的 + +- 验证CFD的时钟失效保护功能,监测目标时钟(HOSC或TCXO)是否失效,通过每隔5s分别注入时钟失效中断和解除时钟失效中断, + +#### 5.1.2实验要求 + +- 1.软件要求:open_mcu-master/str(如果采用zip包下载,SDK名称为open_mcu-master/str,如果采用git下载SDK名称为open_mcu_application/str,此处以采用zip下载为例); + +- 2.硬件要求:Hi3061M开发套件; + +#### 5.1.3核心函数说明 + +5.1.3.1 DCL_CFD_GetCntValue() + +| 定义: | static inline unsigned int DCL_CFD_GetCntValue(CFD_RegStruct *cfdx) | +| -------- | ------------------------------------------------------------ | +| 功能: | 内部计数器计数锁存值。 | +| 参数: | cfdx:CFD寄存器基址 | +| 返回值: | unsigned int 类型的锁存值。 | +| 依赖: | cfd_ip.h | + +5.1.3.2 DCL_CFD_EnableInterruptInject() + +| 定义: | static inline void DCL_CFD_EnableInterruptInject(CFD_RegStruct *cfdx, CFD_Interrupt_Type type) | +| -------- | ------------------------------------------------------------ | +| 功能: | 注入指定类型的中断。 | +| 参数: | cfdx: CFD寄存器基址
type: 中断类型的掩码。 | +| 返回值: | None | +| 依赖: | cfd_ip.h | + +5.1.3.2 DCL_CFD_DisableInterruptInject() + +| 定义: | static inline void DCL_CFD_DisableInterruptInject(CFD_RegStruct *cfdx, CFD_Interrupt_Type type) | +| -------- | ------------------------------------------------------------ | +| 功能: | 停止注入指定类型的中断。 | +| 参数: | cfdx: CFD寄存器基址
type: 中断类型的掩码。 | +| 返回值: | None | +| 依赖: | cfd_ip.h | + +#### 5.1.4实验流程 + +- 步骤一:open_mcu-master\src\application\drivers_sample\cfd\sample_cfd_check_error文件夹复制到workspace\demo\user目录下(workspace自己建的该项目的工作路径) + +- 步骤二:CFD注入错误前后监测目标时钟异常功能,核心代码如下方所示。 + + ``` + /** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + #include "main.h" + #include "ioconfig.h" + #include "iocmg_ip.h" + #define UART0_BAND_RATE 115200 + BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) + { + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 48; /* PLL Multiplier 48 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.clk1MDiv = (25 - 1); /* The 1 MHz freq is equal to the input clock frequency / (clk_1m_div + 1). 25 is the div of the clk_1m in CLOCK. */ + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; + } + __weak void CFDCheckEndCallback(CFD_Handle *handle) + { + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN CFD_INT_CHECK_END_MASK */ + /* USER CODE END CFD_INT_CHECK_END_MASK */ + } + __weak void CFD_CheckErrorCallback(CFD_Handle *handle) + { + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN CFD_INT_PLL_REF_CLOCK_STOP_MASK */ + /* USER CODE END CFD_INT_PLL_REF_CLOCK_STOP_MASK */ + } + static BASE_StatusType CFD_Init(void) + { + HAL_CRG_IpEnableSet(CFD_BASE, IP_CLK_ENABLE); + g_cfd.baseAddress = CFD; + g_cfd.upperBound = 12; + g_cfd.interruptType = CFD_INT_PLL_REF_CLOCK_STOP_MASK; + HAL_CFD_RegisterCallback(&g_cfd, CFD_INT_CHECK_END_MASK, (CFD_CallBackFuncType)CFDCheckEndCallback); + HAL_CFD_RegisterCallback(&g_cfd, CFD_INT_PLL_REF_CLOCK_STOP_MASK, (CFD_CallBackFuncType)CFD_CheckErrorCallback); + IRQ_Register(IRQ_CFD, HAL_CFD_IrqHandler, &g_cfd); + IRQ_SetPriority(IRQ_CFD, 1); /* 1 is priority value */ + IRQ_EnableN(IRQ_CFD); + return HAL_CFD_Init(&g_cfd); + } + static void UART0_Init(void) + { + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); /* UART0 clock enable. */ + g_uart0.baseAddress = UART0; + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; + g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); + } + static void IOConfig(void) + { + /* Config PIN39 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_3_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_3_AS_UART0_TXD, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_3_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_3_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_3_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN40 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_4_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_4_AS_UART0_RXD, PULL_UP); /* Pull-up and Pull-down, UART RX recommend PULL_UP */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_4_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_4_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_4_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + } + void SystemInit(void) + { + IOConfig(); + UART0_Init(); + CFD_Init(); + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ + } + ``` + +- 步骤三:点击![](./pic/1726195173004.jpg)编译代码,具体编译步骤"[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)" + + ![1726194776437](./pic/1726194776437.jpg) + + - 步骤四:点击![](./pic/1726195185553.jpg) 烧录代码,具体烧录步骤"[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)" + + ![](./pic/1726194794028.jpg) + + +#### 5.1.5实验结果 + +- 烧录成功后,打开串口工具,可以看到串口打印出来了写入UART0的数据,打印6次正常的CFD计数值,注入错误后,打印6次中断回调,后重新打印正常CFD计数值,循环进行。这现象说明实验成功。 + + ![](./pic/1726194980430.jpg) + + 提示: + +- 时钟失效中断触发硬件系统事件2会自动关闭APT并将主时钟切换为LOSC进行保护,用户可在中断服务函数中进行时钟恢复或者复位等安全操作; +- 每次中断触发后自行判断计数值是否在门限内,非门限内则判定为异常时钟;该模块目标时钟分配比固化为2048分频,参考时钟不分频。 + +## 6、CMM驱动章节 + +### 6.1 验证CMM时钟频率监测功能,同时验证CMM频率错误中断功能 + +#### 6.1.1实验目的 + +- 检查目标时钟(LOSC/HOSC/TCXO/HS_CLK/LS_CLK)频率是否发生错误。每隔5s分别注入频率错误中断,验证CMM的频率中断处理函数。 + +#### 6.1.2实验要求 + +- 1.软件要求:open_mcu-master/str(如果采用zip包下载,SDK名称为open_mcu-master/str,如果采用git下载SDK名称为open_mcu_application/str,此处以采用zip下载为例); + +- 2.硬件要求:Hi3061M开发套件; + +#### 6.1.3核心函数说明 + +6.1.3.1 DCL_CMM_GetCntValue() + +| 定义: | static inline unsigned short DCL_CMM_GetCntValue(CMM_RegStruct *cmmx) | +| -------- | ------------------------------------------------------------ | +| 功能: | 内部计数器计数锁存值。 | +| 参数: | cmmx:CMM寄存器基址 | +| 返回值: | unsigned short.类型的锁存值。 | +| 依赖: | cmm_ip.h | + +6.1.3.2 DCL_CMM_EnableInterruptInject() + +| 定义: | static inline void DCL_CMM_EnableInterruptInject(CMM_RegStruct *cmmx, CMM_Interrupt_Type type) | +| -------- | ------------------------------------------------------------ | +| 功能: | 注入指定类型的中断。 | +| 参数: | cmmx: CMM寄存器基址
type: 中断类型的掩码。 | +| 返回值: | None | +| 依赖: | cmm_ip.h | + +6.1.3.2 DCL_CMM_DisableInterruptInject() + +| 定义: | static inline void DCL_CMM_DisableInterruptInject(CMM_RegStruct *cmmx, CMM_Interrupt_Type type) | +| -------- | ------------------------------------------------------------ | +| 功能: | 停止注入指定类型的中断。 | +| 参数: | cmmx: CMM寄存器基址
type: 中断类型的掩码。 | +| 返回值: | None | +| 依赖: | cmm_ip.h | + +#### 6.1.4实验流程 + +- 步骤一:open_mcu-master\src\application\drivers_sample\cmm\sample_cmm_check_error文件夹复制到workspace\demo\user目录下(workspace自己建的该项目的工作路径) + +- 步骤二:原理:CMM时钟的频率监测功能通过高精度时钟同步技术和先进的频率测量技术,实现了对时钟频率的高精度测量和同步,cmm注入错误前后监测目标时钟异常功能,核心代码如下方所示。 + + ``` + /** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + #include "main.h" + #include "ioconfig.h" + #include "iocmg_ip.h" + #define UART0_BAND_RATE 115200 + BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) + { + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 48; /* PLL Multiplier 48 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.clk1MDiv = (25 - 1); /* The 1 MHz freq is equal to the input clock frequency / (clk_1m_div + 1). 25 is the div of the clk_1m in CLOCK. */ + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; + } + __weak void CMMCounterOverFlowCallback(CMM_Handle *handle) + { + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN CMM_INT_COUNTER_OVERFLOW_MASK */ + /* USER CODE END CMM_INT_COUNTER_OVERFLOW_MASK */ + } + __weak void CMMCheckEndCallback(CMM_Handle *handle) + { + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN CMM_INT_CHECK_END_MASK */ + /* USER CODE END CMM_INT_CHECK_END_MASK */ + } + __weak void CMM_CheckErrorCallback(CMM_Handle *handle) + { + BASE_FUNC_UNUSED(handle); + /* USER CODE BEGIN CMM_INT_FREQ_ERR_MASK */ + /* USER CODE END CMM_INT_FREQ_ERR_MASK */ + } + static BASE_StatusType CMM_Init(void) + { + HAL_CRG_IpEnableSet(CMM_BASE, IP_CLK_ENABLE); + g_cmm.baseAddress = CMM; + g_cmm.targetFreqDivision = CMM_TARGET_FREQ_DIV_8192; + g_cmm.refFreqDivision = CMM_REF_FREQ_DIV_0; + g_cmm.targetClockSource = CMM_TARGET_CLK_LOSC; + g_cmm.refClockSource = CMM_REF_CLK_LOSC; + g_cmm.upperBound = 12; + g_cmm.lowerBound = 8; + g_cmm.interruptType = CMM_INT_FREQ_ERR_MASK; + HAL_CMM_RegisterCallback(&g_cmm, CMM_INT_COUNTER_OVERFLOW_MASK, (CMM_CallBackFuncType)CMMCounterOverFlowCallback); + HAL_CMM_RegisterCallback(&g_cmm, CMM_INT_CHECK_END_MASK, (CMM_CallBackFuncType)CMMCheckEndCallback); + HAL_CMM_RegisterCallback(&g_cmm, CMM_INT_FREQ_ERR_MASK, (CMM_CallBackFuncType)CMM_CheckErrorCallback); + IRQ_Register(IRQ_CMM, HAL_CMM_IrqHandler, &g_cmm); + IRQ_SetPriority(IRQ_CMM, 1); /* 1 is priority value */ + IRQ_EnableN(IRQ_CMM); + return HAL_CMM_Init(&g_cmm); + } + static void UART0_Init(void) + { + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); /* UART0 clock enable. */ + g_uart0.baseAddress = UART0; + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; + g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); + } + static void IOConfig(void) + { + /* Config PIN39 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_3_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_3_AS_UART0_TXD, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_3_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_3_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_3_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN40 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_4_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_4_AS_UART0_RXD, PULL_UP); /* Pull-up and Pull-down, UART RX recommend PULL_UP */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_4_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_4_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_4_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + } + void SystemInit(void) + { + IOConfig(); + UART0_Init(); + CMM_Init(); + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ + } + ``` + + - 步骤三:点击![](./pic/1726195173004.jpg)编译代码,具体编译步骤"[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)" + + ![1726194776437](./pic/1726194776437.jpg) + + - 步骤四:点击![](./pic/1726195185553.jpg) 烧录代码,具体烧录步骤"[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)" + + ![](./pic/1726194794028.jpg) + + + +#### 6.1.5实验结果 + +- 烧录成功后,打开串口工具,可以看到串口打印出来了写入UART0的数据,打印5次正常的CMM计数器锁存值(目标分频为8192),接着打印1遍“ Inject interrupt type error !”,注入错误后,打印5次“In CMM interrupt function : clock frequency error”,再打印一遍“Disable inject interrupt type error”,后重新打印正常CMM计数器锁存值,循环进行。这现象说明实验成功。 + + ![](./pic/1726195007716.jpg) + +#### 6.1.6扩展实验 + +- 本实验学习验证CMM时钟频率监测功能,并验证CMM频率错误中断功能,请学生做如下实验: + +- 改变目标时钟源和分频比,测试其现象。 + +提示:上下限值的范围可反应系统对目标时钟偏差的冗余度,可自行设计门限值和时钟分频比,门限值具体计算方法请参照芯片技术指南 + + + +## 7、CRC驱动章节 + +### 7.1 配置CRC参数,运用CRC16_XMODEM算法对一组数据进行运算生成CRC值 + +#### 7.1.1实验目的 + +- 运用CRC的两种运行方式:1.运用CRC16_XMODEM算法模式对一组数据进行运算生成CRC值;2.根据CRC16_XMODEM算法属性配置对一组数据进行运算生成CRC值。 + +#### 7.1.2实验要求 + +- 1.软件要求:open_mcu-master/str(如果采用zip包下载,SDK名称为open_mcu-master/str,如果采用git下载SDK名称为open_mcu_application/str,此处以采用zip下载为例); + +- 2.硬件要求:Hi3061M开发套件; + +#### 7.1.3核心函数说明 + +7.1.3.1 HAL_CRC_Accumulate() + +| 定义: | unsigned int HAL_CRC_Accumulate(CRC_Handle *handle, const void *pData, unsigned int length) | +| -------- | ------------------------------------------------------------ | +| 功能: | 计算8、16或32位CRC值
以先前计算的CRC作为初始化值开始的32位数据缓冲区。 | +| 参数: | handle:CRC_Handle类型的变量
pData: 指向输入数据缓冲区的指针。
length: pData数组长度。 | +| 返回值: | unsigned int类型的CRC输出数据。 | +| 依赖: | crc.h | + +7.1.3.2 DCL_CRC_GetOutputData() + +| 定义: | static inline unsigned int DCL_CRC_GetOutputData(CRC_RegStruct *crcx) | +| -------- | ------------------------------------------------------------ | +| 功能: | 在值函数中获取CRC数据。 | +| 参数: | crcx:CRC寄存器基地址 | +| 返回值: | unsigned int类型的CRC输出数据。 | +| 依赖: | crc_ip.h | + +#### 7.1.4实验流程 + +- 步骤一:open_mcu-master\src\application\drivers_sample\crc\sample_crc_gen_algo文件夹复制到workspace\demo\user目录下(workspace自己建的该项目的工作路径) + +- 步骤二:原理:CRC是一种用于检测数据传输或存储后可能出现的错误的校验方法,然后CRC16_XMODEM算法的具体步骤包括初始化CRC寄存器、逐字节处理数据、应用多项式进行运算,并最终生成一个16位的CRC值,这个值被附加到数据后面,以便接收方进行校验。核心代码如下方所示。 + + ``` + /** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + #include "main.h" + #include "ioconfig.h" + #include "iocmg_ip.h" + #define UART0_BAND_RATE 115200 + BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) + { + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 48; /* PLL Multiplier 48 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.clk1MDiv = (25 - 1); /* The 1 MHz freq is equal to the input clock frequency / (clk_1m_div + 1). 25 is the div of the clk_1m in CLOCK. */ + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; + } + static void UART0_Init(void) + { + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); /* UART0 clock enable. */ + g_uart0.baseAddress = UART0; + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; + g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); + } + static void IOConfig(void) + { + /* Config PIN39 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_3_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_3_AS_UART0_TXD, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_3_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_3_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_3_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN40 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_4_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_4_AS_UART0_RXD, PULL_UP); /* Pull-up and Pull-down, UART RX recommend PULL_UP */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_4_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_4_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_4_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + } + void SystemInit(void) + { + IOConfig(); + UART0_Init(); + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ + } + ``` + +- 步骤三:点击![](./pic/1726195173004.jpg)编译代码,具体编译步骤"[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)" + + ![1726194776437](./pic/1726194776437.jpg) + + - 步骤四:点击![](./pic/1726195185553.jpg) 烧录代码,具体烧录步骤"[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)" + + ![](./pic/1726194794028.jpg) + + + + +#### 7.1.5实验结果 + +烧录成功后,打开串口工具,按一下开发板RESET按键复位开发板,可以看到串口打印出来了写入UART0的数据,生成的16位CRC数值为F1A1,数据大小为1024. + +![](./pic/1726195033006.jpg) + +#### 7.1.6扩展实验 + +- 本实验学习配置CRC参数,运用CRC16_XMODEM算法对一组数据进行运算生成CRC值,请学生做如下实验: + +- 运用其他算法生成CRC值,并测试其现象。 + + + +### 7.2 通过改变初始值配置,对同一组数据进行不同CRC算法运算验证 + +#### 7.2.1实验目的 + +- 通过load初始值配置,配置算法修改为CRC16_CCIT-FALSE,并对同一组数据进行CRC运算验证 + +#### 7.2.2实验要求 + +- 1.软件要求:open_mcu-master/str(如果采用zip包下载,SDK名称为open_mcu-master/str,如果采用git下载SDK名称为open_mcu_application/str,此处以采用zip下载为例); + +- 2.硬件要求:Hi3061M开发套件; + +#### 7.2.3核心函数说明 + +7.2.3.1 HAL_CRC_SetInputDataGetCheck() + +| 定义: | unsigned int HAL_CRC_SetInputDataGetCheck(CRC_Handle *handle, unsigned int data) | +| -------- | ------------------------------------------------------------ | +| 功能: | 设置CRC输入数据并获得CRC输出。 | +| 参数: | handle:CRC_Handle类型的变量
data:CRC输入数据。 | +| 返回值: | unsigned int类型的CRC输出数据。 | +| 依赖: | crc.h | + +7.2.3.2 HAL_CRC_SetCheckInData() + +| 定义: | void HAL_CRC_SetCheckInData(CRC_Handle *handle, unsigned int data) | +| -------- | ------------------------------------------------------------ | +| 功能: | 将CRC check_in数据设置为注册。 | +| 参数: | handle:CRC_Handle类型的变量
data:CRC输入数据。 | +| 返回值: | None | +| 依赖: | crc.h | + +7.2.3.3 HAL_CRC_LoadCheckInData() + +| 定义: | unsigned int HAL_CRC_LoadCheckInData(CRC_Handle *handle) | +| -------- | -------------------------------------------------------- | +| 功能: | 将CRC校验输入寄存器数据加载到CRC_out寄存器。 | +| 参数: | handle:CRC_Handle类型的变量 | +| 返回值: | unsigned int 类型 反转check_in数据。 | +| 依赖: | crc.h | + +#### 7.2.4实验流程 + +- 步骤一:open_mcu-master\src\application\drivers_sample\crc\sample_crc_gen_algo文件夹复制到workspace\demo\user目录下(workspace自己建的该项目的工作路径) + +- 步骤二:原理:CRC是一种用于检测数据传输或存储后可能出现的错误的校验方法,然后CRC16_XMODEM算法的具体步骤包括初始化CRC寄存器、逐字节处理数据、应用多项式进行运算,并最终生成一个16位的CRC值,这个值被附加到数据后面,以便接收方进行校验。在CRC16_CCITT-FALSE算法中,输入数据在计算之前会进行预处理,通常是将初始值设为0xFFFF。生成多项式为x^16^ + x^12^+x^5^+1,这个多项式用于与输入数据进行模2除法运算,以生成16位的CRC值。核心代码如下方所示。 + + ``` + /** + * @copyright Copyright (c) 2022, HiSilicon (Shanghai) Technologies Co., Ltd. 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 the copyright holder 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. + * @file system_init.c + * @author MCU Driver Team + * @brief This file contains driver init functions. + */ + #include "main.h" + #include "ioconfig.h" + #include "iocmg_ip.h" + #define UART0_BAND_RATE 115200 + BASE_StatusType CRG_Config(CRG_CoreClkSelect *coreClkSelect) + { + CRG_Handle crg; + crg.baseAddress = CRG; + crg.pllRefClkSelect = CRG_PLL_REF_CLK_SELECT_HOSC; + crg.pllPreDiv = CRG_PLL_PREDIV_4; + crg.pllFbDiv = 48; /* PLL Multiplier 48 */ + crg.pllPostDiv = CRG_PLL_POSTDIV_2; + crg.coreClkSelect = CRG_CORE_CLK_SELECT_PLL; + crg.handleEx.pllPostDiv2 = CRG_PLL_POSTDIV2_3; + crg.handleEx.clk1MSelect = CRG_1M_CLK_SELECT_HOSC; + crg.handleEx.clk1MDiv = (25 - 1); /* The 1 MHz freq is equal to the input clock frequency / (clk_1m_div + 1). 25 is the div of the clk_1m in CLOCK. */ + if (HAL_CRG_Init(&crg) != BASE_STATUS_OK) { + return BASE_STATUS_ERROR; + } + *coreClkSelect = crg.coreClkSelect; + return BASE_STATUS_OK; + } + static void CRC_Init(void) + { + HAL_CRG_IpEnableSet(CRC_BASE, IP_CLK_ENABLE); + g_loadCrcHandle.baseAddress = CRC; + g_loadCrcHandle.inputDataFormat = CRC_MODE_BIT16; + g_loadCrcHandle.handleEx.algoMode = CRC16_XMODEM; + HAL_CRC_Init(&g_loadCrcHandle); + } + static void UART0_Init(void) + { + HAL_CRG_IpEnableSet(UART0_BASE, IP_CLK_ENABLE); /* UART0 clock enable. */ + g_uart0.baseAddress = UART0; + g_uart0.baudRate = UART0_BAND_RATE; + g_uart0.dataLength = UART_DATALENGTH_8BIT; + g_uart0.stopBits = UART_STOPBITS_ONE; + g_uart0.parity = UART_PARITY_NONE; + g_uart0.txMode = UART_MODE_BLOCKING; + g_uart0.rxMode = UART_MODE_BLOCKING; + g_uart0.fifoMode = BASE_CFG_ENABLE; + g_uart0.fifoTxThr = UART_FIFODEPTH_SIZE8; + g_uart0.fifoRxThr = UART_FIFODEPTH_SIZE8; + g_uart0.hwFlowCtr = BASE_CFG_DISABLE; + g_uart0.handleEx.overSampleMultiple = UART_OVERSAMPLING_16X; + g_uart0.handleEx.msbFirst = BASE_CFG_DISABLE; + HAL_UART_Init(&g_uart0); + } + static void IOConfig(void) + { + /* Config PIN39 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_3_AS_UART0_TXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_3_AS_UART0_TXD, PULL_NONE); /* Pull-up and Pull-down */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_3_AS_UART0_TXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_3_AS_UART0_TXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_3_AS_UART0_TXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + /* Config PIN40 */ + HAL_IOCMG_SetPinAltFuncMode(GPIO0_4_AS_UART0_RXD); /* Check function selection */ + HAL_IOCMG_SetPinPullMode(GPIO0_4_AS_UART0_RXD, PULL_UP); /* Pull-up and Pull-down, UART RX recommend PULL_UP */ + HAL_IOCMG_SetPinSchmidtMode(GPIO0_4_AS_UART0_RXD, SCHMIDT_DISABLE); /* Schmitt input on/off */ + HAL_IOCMG_SetPinLevelShiftRate(GPIO0_4_AS_UART0_RXD, LEVEL_SHIFT_RATE_SLOW); /* Output drive capability */ + HAL_IOCMG_SetPinDriveRate(GPIO0_4_AS_UART0_RXD, DRIVER_RATE_2); /* Output signal edge fast/slow */ + } + void SystemInit(void) + { + IOConfig(); + UART0_Init(); + CRC_Init(); + /* USER CODE BEGIN system_init */ + /* USER CODE END system_init */ + } + ``` + + - 步骤三:点击![](./pic/1726195173004.jpg)编译代码,具体编译步骤"[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)" + + ![1726194776437](./pic/1726194776437.jpg) + + - 步骤四:点击![](./pic/1726195185553.jpg) 烧录代码,具体烧录步骤"[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools)" + + ![](./pic/1726194794028.jpg) + + + +#### 7.2.5实验结果 + +烧录成功后,打开串口工具,按一下开发板RESET按键复位开发板,可以看到串口打印出来了写入UART0的数据,CRC16_XMODEM算法输出的数据是0x5B86, + +修改后的初始值为0xFFFF,修改成CRC16_CCIT-FALSE算法后输出数据是0xDF46,证明验证成功。 + +![](./pic/1726195055385.jpg) + +#### 7.2.6扩展实验 + +- 本实验学习通过改变初始值配置,对同一组数据进行不同CRC算法运算验证,请学生做如下实验: + +- 用同一组数据用CRC16_CCITT算法与CRC16_XMODEM算法运算认证。 +- 调用“HAL_CRC_CheckInputData()”检查接收到的数据CRC值是否与预期值相同。 + + + +8、 + + + + + + + + + + + -- Gitee From 3bd625544e6fb5d4843d4403e233802fc7ca33f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E5=A3=AE=E4=BC=9F?= <14858320+wen-zhuangwei@user.noreply.gitee.com> Date: Fri, 13 Sep 2024 11:55:36 +0800 Subject: [PATCH 02/10] test --- "README - \345\211\257\346\234\254.md" | 301 +++++++++++++++++++++++++ 1 file changed, 301 insertions(+) create mode 100644 "README - \345\211\257\346\234\254.md" diff --git "a/README - \345\211\257\346\234\254.md" "b/README - \345\211\257\346\234\254.md" new file mode 100644 index 000000000..ec080bb91 --- /dev/null +++ "b/README - \345\211\257\346\234\254.md" @@ -0,0 +1,301 @@ +# open_mcu开发指南 + +## 介绍 + + open_mcu代码仓为支持3061M和3065M解决方案SDK。 + +## 支持的开发板 + +| 开发板名称 | 硬件资料 | 软件资料 | 购买链接 | 开发板介绍 | +| :--------: | ------------------------------------------------------------ | :----------- | :----------------------------------------------------------- | :------------ | +| 3061M | [开发板硬件原理图](https://gitee.com/HiSpark/open_mcu/tree/master/docs/hardware/3061M) | 参考示例教程 | [开发板购买链接](https://m.tb.cn/h.gMEbHlepTLs5DNB?tk=aKIe356U3bY) | 参考3061M介绍 | +| 3065H | [开发板硬件原理图](https://gitee.com/HiSpark/open_mcu/tree/master/docs/hardware/3065H) | 参考示例教程 | [开发板购买链接](https://m.tb.cn/h.gMEbHlepTLs5DNB?tk=aKIe356U3bY) | 参考3065H介绍 | + +## 目录介绍 + +| 目录 | 介绍 | +| ------ | ---------------------- | +| docs | 硬件原理图 | +| src | SDK源码目录 | +| tools | 开发工具及环境搭建指南 | +| vendor | 存放对应开发板案例 | + +## 硬件介绍 + +### 3061M介绍 + +3061M系列 生态板由 ECBMCU201MPC(核心板)和 ECBMOTORA(电机驱动板组成)。 + +ECBMCU201MPC是针对 3061M系列 MCU开发的生态核心板,用于 3061M初始评估和设计参考,内嵌一块 USB接口的调试板。 + +ECBMOTORA是电机驱动扩展板,支持一个 BLDC或 PMSM电机控制。该单板支持24V/12V DCIN输入。 + +核心板电机驱动扩展板的常用组装方式是电机驱动板通过两个40pin连接器扣接到核心板,如下图所示。 + +![image-20240715162059747](docs/pic/tools/image-20240715162059747.png) + +### 3061M硬件说明 + + 3061M通用生态板通过 ECBMCU201MPC核心板实现控制、 ECBMOTORA 扩展板实现接口扩展以及电源接口,同时提供USB TypeC线进行调试 / 供电、12V电源适配器和一个电机。 + +![image-20240715162244103](docs/pic/tools/image-20240715162244103.png) + +3061M通用生态板用户手册详细内容请查阅:
Hi3061M系列 通用生态板用户手册 00B01 + +### 3065H介绍 + +3065H 通用生态板由 ECBMCU105H (核心板)和 ECBMOTORA (电机驱动板)组成。 + +ECBMCU105H是针对 3065H 芯片开发的生态核心板,用于 3065H 芯片初始评估和设计参考,内嵌一块 USB 接口的调试板。 + +ECBMOTORA是电机驱动扩展板,支持一个 BLDC 或 PMSM 电机控制。该单板支持24V/12V DCIN 输入。 + +核心板电机驱动扩展板的常用组装方式是电机驱动板通过两个40pin 连接器扣接到核心板,如下图所示。 + +image-20240530173305431 + +### 3065H硬件说明 + + 3065H通用生态板通过ECBMCU105H 核心板实现控制、 ECBMOTORA 扩展板实现接口扩展以及电源接口,同时提供USB TypeC线进行调试 / 供电、12V电源适配器和一个电机。 + +![image-20240527103127826](docs/pic/tools/image-20240527103127826.png) + +3065H通用生态板用户手册详细内容请查阅:Hi3065H通用生态板用户手册 V03 + +## 开发环境搭建 + +[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools) + +## Demo + +3061M/3065H提供了以下Demo供开发参考,sample存放路径:[application_sample](https://gitee.com/HiSpark/open_mcu/tree/master/src/application) + +**主目录结构说明** + +| 文件夹名 | 描述 | +| ----------------- | -------------- | +| board\_sample | 开发板示例。 | +| drivers_sample | 驱动程序示例。 | +| middleware_sample | 中间件示例。 | +| user | 用户相关。 | + +**表 1 board\_sample目录结构说明** + +| **文件夹名** | **描述** | +| ------------ | -------------------------- | +| dimming | 呼吸灯功能示例。 | +| key | 按键检查功能示例。 | +| led | 数码管功能示例。 | +| pulses | gpio发送pwm波功能示例。 | +| softserial | gpio实现串口通信功能示例。 | + +**表 2 acmp目录结构说明** + +| **文件夹名** | **描述** | +| ------------ | ---------------- | +| sample_acmp | 比较器使用示例。 | + +**表 3 adc目录结构说明** + +| **文件夹名** | **描述** | +| ------------------------------------- | ------------------- | +| sample_adc_associative_trigger_of_apt | APT触发ADC。 | +| sample_adc_continue_trigger | ADC连续采样。 | +| sample_adc_over_sample | ADC过采样。 | +| sample_adc_single_trigger | ADC单次采样。 | +| sample_adc_single_trigger_dma | ADC单次采样带DMA。 | +| sample_adc_single_trigger_it | ADC单次采样带中断。 | +| sample_adc_sync_sample | ADC同步采样。 | +| sample_adc_sync_sample_dma | ADC同步采样带DMA。 | +| sample_adc_sync_sample_it | ADC同步采样带中断。 | + +**表 4 apt目录结构说明** + +| **文件夹名** | **描述** | +| -------------------------- | ------------------------------------------------- | +| sample_apt_single_resistor | APT单电阻采样示例,仅在U相触发ADC采样信号。 | +| sample_apt_three_resistor | APT三电阻采样示例,在U、V和W相都触发ADC采样信号。 | + +**表 5 can目录结构说明** + +| **文件夹名** | **描述** | +| ----------------------- | ----------------------- | +| sample_can_send_receive | CAN发送和接收数据示例。 | + +**表 6 capm目录结构说明** + +| **文件夹名** | **描述** | +| ---------------- | -------------------------- | +| capm_hall_sample | CAPM读取霍尔传感器值示例。 | + +**表 7 cfd目录结构说明** + +| **文件夹名** | **描述** | +| ---------------------- | ------------------------------------- | +| sample_cfd_check_error | cfd注入错误前后监测目标时钟异常功能。 | + +**表 8 cmm目录结构说明** + +| **文件夹名** | **描述** | +| ---------------------- | ------------------------------------- | +| sample_cmm_check_error | cmm注入错误前后监测目标时钟异常功能。 | + +**表 9 crc目录结构说明** + +| **文件夹名** | **描述** | +| ---------------- | -------------------------------------------------------- | +| sample_crc_check | 测试CRC不同算法和输入有效位宽,生成并校验crc值。 | +| sample_crc_gen | 计算并生成CRC数值。 | +| sample_crc_load | 通过load初始值将xmodem算法改为ccit-false算法并校验结果。 | + +**表 10 dac目录结构说明** + +| **文件夹名** | **描述** | +| ------------ | ----------------------- | +| sample_dac | DAC电压输出到管脚示例。 | + +**表 11 dma目录结构说明** + +| **文件夹名** | **描述** | +| --------------------------------- | ------------------------- | +| sample_dma_list_transfer | DMA链式传输。 | +| sample_dma_list_transfer_continue | DMA链式传输实现连续功能。 | +| sample_dma_mem_to_mem | DMA内存到内存传输。 | +| sample_dma_mem_to_per | DMA内存到外设传输。 | +| sample_dma_per_to_mem | DMA外设到内存传输。 | +| sample_dma_per_to_per | DMA外设到外设传输。 | + +**表 12 flash目录结构说明** + +| **文件夹名** | **描述** | +| ---------------------- | ------------------- | +| sample_flash_blocking | 阻塞模式操作flash。 | +| sample_flash_interrupt | 中断方式操作flash。 | + +**表 13 gpio目录结构说明** + +| **文件夹名** | **描述** | +| --------------------- | ---------------------------- | +| sample_gpio_circle | GPIO环回测试电平和方向属性。 | +| sample_gpio_interrupt | 测试GPIO不同中断类型。 | +| sample_gpio_key | GPIO用作按键功能。 | +| sample_gpio_led | GPIO周期控制led亮灭功能。 | + +**表 14 gpt目录结构说明** + +| **文件夹名** | **描述** | +| -------------------- | ---------------- | +| sample_gpt_simplerun | gpt产生PWM波形。 | + +**表 15 i2c目录结构说明** + +| **文件夹名** | **描述** | +| --------------------------- | ------------------------------ | +| sample_i2c_blocking_stlm75 | 使用阻塞的方式读写温度传感器。 | +| sample_i2c_interrupt_stlm75 | 使用中断的方式读写温度传感器。 | +| sample_i2c_dma_stlm75 | 使用dma方式读写温度传感器。 | + +**表 16 iocmg目录结构说明** + +| **文件夹名** | **描述** | +| ------------- | ----------------------------------- | +| iolist_sample | iocmg初始化管脚列表的属性配置功能。 | + +**表 17 pga目录结构说明** + +| **文件夹名** | **描述** | +| ------------------------- | --------------------- | +| sample_pga | PGA内部电阻放大示例。 | +| sample_pga_extra_resistor | PGA外部电阻放大示例。 | + +**表 18 pmc目录结构说明** + +| **文件夹名** | **描述** | +| ----------------- | ------------------- | +| sample_pmc_pvd | PMC掉电检测示例。 | +| sample_pmc_wakeup | PMC定时器唤醒示例。 | + +**表 19 qdm目录结构说明** + +| **文件夹名** | **描述** | +| ------------- | ------------------------------- | +| sample_qdm_m | QDM使用M法读取电机转速的示例。 | +| sample_qdm_mt | QDM使用MT法读取电机转速的示例。 | + +**表 20 spi目录机构说明** + +| **文件夹名** | **描述** | +| ---------------------------- | --------------------------------- | +| sample_spi_blocking_kta7953 | 使用阻塞方式读写ADC。 | +| sample_spi_dma_kta7953 | 使用dma方式读写ADC。 | +| sample_spi_interrupt_kta7953 | 使用中断方式读写ADC。 | +| sample_spi_microwire_master | 演示如何使用microwire master。 | +| sample_spi_microwire_slave | 演示如何使用microwire slave。 | +| sample_spi_slave | 演示如何使用motorola spi slaver。 | + +**表 21 timer目录结构说明** + +| **文件夹名** | **描述** | +| ---------------------- | ------------------------------------- | +| sample_timer_interrupt | timer定时触发中断,执行用户串口打印。 | + +**表 22 tsensor目录结构说明** + +| **文件夹名** | **描述** | +| -------------- | ----------------------- | +| sample_tsensor | tsensor对器件结温采样。 | + +**表 23 uart目录结构说明** + +| **文件夹名** | **描述** | +| ---------------------------------------- | ------------------------------------------ | +| sample_uart_blocking_rx | UART阻塞接收。 | +| sample_uart_blocking_tx | UART阻塞发送。 | +| sample_uart_dma_rx | UART带DMA接收。 | +| sample_uart_dma_tx | UART带DMA发送。 | +| sample_uart_interrupt_tx_after_rx | UART中断接收数据之后,再中断发送此数据。 | +| sample_uart_interrupt_rx | UART中断接收。 | +| sample_uart_interrupt_tx | UART中断发送。 | +| sample_uart_dma_tx_dma_rx_simultaneously | UART全双工模式,DMA同时发送和接收。 | +| sample_uart_dma_tx_int_rx_simultaneously | UART全双工模式,DMA发送的同时,中断接收。 | +| sample_uart_int_tx_dma_rx_simultaneously | UART全双工模式,中断发送的同时,DMA接收。 | +| sample_uart_int_tx_int_rx_simultaneously | UART全双工模式,中断发送的同时,中断接收。 | +| sample_uart_dma_rx_cyclically_stored | UART使用DMA循环搬运数据到指定内存。 | +| sample_uart_single_wire_communication | UART单线通信示例。 | + +**表 24 wdg目录机构说明** + +| **文件夹名** | **描述** | +| ----------------- | ------------------------ | +| sample_wdg_reset | 测试wdg不喂狗复位功能。 | +| sample_iwdg_reset | 测试iwdg不喂狗复位功能。 | + +**表 25 middleware\_sample目录机构说明** + +| **文件夹名** | **描述** | +| -------------------------- | --------------------------------------- | +| mcs_65ldemo | 电机控制算法在AD101HDMA_VER.B板的示例。 | +| mcs_65demo | 电机控制算法在AD105HDMA_VER.B板的示例。 | +| pmsm_sensorless_1shunt_foc | 永磁同步电机单电阻采样无感FOC应用。 | +| pmsm_sensorless_2shunt_foc | 永磁同步电机双电阻采样无感FOC应用。 | + +## **问题与解答** + +如果你对项目中的代码或者文档存在疑问, 欢迎在Issues中提出你的问题(别忘了先在FAQ中看一看是否已经有答案了😎). 如果你自己解决了一个了不起的问题, 非常欢迎你把问题和解决方法发到Issues里, 如果你看到别人的问题而你正好有答案, 也欢迎你帮助解答其他人的问题, 所谓"授人玫瑰手有余香"嘛。 + +## **参与贡献** + +我们非常欢迎你能对这个项目提出代码上的改进或扩展, 方法是: + +1. Fork 本仓库 +2. 下载到本地, 修改, 提交 +3. 推送代码 +4. 在页面点击 Pull Request + +这样我们就能接到你的推送申请。 + +## **最后的话** + +Hispark Studio是一款年轻且处于快速发展的IDE。在使用过程中,你可能会碰到一些棘手的问题,但别担心,你可以尝试多种方法去解决,比如用搜索引擎寻找答案,或者向社区寻求帮助。记住,所有技术大神都是从解决这些问题中成长起来的。我们和其他开发者也会尽力提供帮助。 + +最后的最后, 欢迎来到Hispark Studio的世界探险! \ No newline at end of file -- Gitee From 3d4d36b6585da48c2f7e8d74c7f2d443b6f855a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E5=A3=AE=E4=BC=9F?= <1161625498@qq.com> Date: Fri, 13 Sep 2024 13:51:53 +0800 Subject: [PATCH 03/10] xxxxx MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 温壮伟 <1161625498@qq.com> --- .../inc/sample_acmp_interrupt.h | 0 .../acmp/sample_acmp_interrupt/init/main.c | 0 .../acmp/sample_acmp_interrupt/init/main.h | 0 .../acmp/sample_acmp_interrupt/init/system_init.c | 0 .../acmp/sample_acmp_interrupt/readme.md | 0 .../src/sample_acmp_interrupt.c | 0 .../inc/sample_acmp_out_result.h | 0 .../acmp/sample_acmp_out_result/init/main.c | 0 .../acmp/sample_acmp_out_result/init/main.h | 0 .../acmp/sample_acmp_out_result/init/system_init.c | 0 .../acmp/sample_acmp_out_result/readme.md | 0 .../src/sample_acmp_out_result.c | 0 .../inc/sample_adc_associative_trigger_apt.h | 0 .../init/main.c | 0 .../init/main.h | 0 .../init/system_init.c | 0 .../sample_adc_associative_trigger_of_apt/readme.md | 0 .../src/sample_adc_associative_trigger_apt.c | 0 .../inc/sample_adc_continue_trigger.h | 0 .../adc/sample_adc_continue_trigger/init/main.c | 0 .../adc/sample_adc_continue_trigger/init/main.h | 0 .../sample_adc_continue_trigger/init/system_init.c | 0 .../adc/sample_adc_continue_trigger/readme.md | 0 .../src/sample_adc_continue_trigger.c | 0 .../inc/sample_adc_over_sample.h | 0 .../adc/sample_adc_over_sample/init/main.c | 0 .../adc/sample_adc_over_sample/init/main.h | 0 .../adc/sample_adc_over_sample/init/system_init.c | 0 .../adc/sample_adc_over_sample/readme.md | 0 .../src/sample_adc_over_sample.c | 0 .../inc/sample_adc_oversampling_it.h | 0 .../adc/sample_adc_oversampling_it/init/main.c | 0 .../adc/sample_adc_oversampling_it/init/main.h | 0 .../sample_adc_oversampling_it/init/system_init.c | 0 .../adc/sample_adc_oversampling_it/readme.md | 0 .../src/sample_adc_oversampling_it.c | 0 .../inc/sample_adc_single_trigger.h | 0 .../adc/sample_adc_single_trigger/init/main.c | 0 .../adc/sample_adc_single_trigger/init/main.h | 0 .../sample_adc_single_trigger/init/system_init.c | 0 .../adc/sample_adc_single_trigger/readme.md | 0 .../src/sample_adc_single_trigger.c | 0 .../inc/sample_adc_single_trigger_dma.h | 0 .../adc/sample_adc_single_trigger_dma/init/main.c | 0 .../adc/sample_adc_single_trigger_dma/init/main.h | 0 .../init/system_init.c | 0 .../adc/sample_adc_single_trigger_dma/readme.md | 0 .../src/sample_adc_single_trigger_dma.c | 0 .../inc/sample_adc_single_trigger_it.h | 0 .../adc/sample_adc_single_trigger_it/init/main.c | 0 .../adc/sample_adc_single_trigger_it/init/main.h | 0 .../sample_adc_single_trigger_it/init/system_init.c | 0 .../adc/sample_adc_single_trigger_it/readme.md | 0 .../src/sample_adc_single_trigger_it.c | 0 .../inc/sample_adc_single_with_ppb.h | 0 .../adc/sample_adc_single_with_ppb/init/main.c | 0 .../adc/sample_adc_single_with_ppb/init/main.h | 0 .../sample_adc_single_with_ppb/init/system_init.c | 0 .../adc/sample_adc_single_with_ppb/readme.md | 0 .../src/sample_adc_single_with_ppb.c | 0 .../inc/sample_adc_sync_sample.h | 0 .../adc/sample_adc_sync_sample/init/main.c | 0 .../adc/sample_adc_sync_sample/init/main.h | 0 .../adc/sample_adc_sync_sample/init/system_init.c | 0 .../adc/sample_adc_sync_sample/readme.md | 0 .../src/sample_adc_sync_sample.c | 0 .../inc/sample_adc_sync_sample_dma.h | 0 .../adc/sample_adc_sync_sample_dma/init/main.c | 0 .../adc/sample_adc_sync_sample_dma/init/main.h | 0 .../sample_adc_sync_sample_dma/init/system_init.c | 0 .../adc/sample_adc_sync_sample_dma/readme.md | 0 .../src/sample_adc_sync_sample_dma.c | 0 .../inc/sample_adc_sync_sample_it.h | 0 .../adc/sample_adc_sync_sample_it/init/main.c | 0 .../adc/sample_adc_sync_sample_it/init/main.h | 0 .../sample_adc_sync_sample_it/init/system_init.c | 0 .../adc/sample_adc_sync_sample_it/readme.md | 0 .../src/sample_adc_sync_sample_it.c | 0 .../inc/sample_apt_single_resistor.h | 0 .../apt/sample_apt_single_resistor/init/main.c | 0 .../apt/sample_apt_single_resistor/init/main.h | 0 .../sample_apt_single_resistor/init/system_init.c | 0 .../apt/sample_apt_single_resistor/readme.md | 0 .../src/sample_apt_single_resistor.c | 0 .../inc/sample_can_send_receive.h | 0 .../can/sample_can_send_receive/init/main.c | 0 .../can/sample_can_send_receive/init/main.h | 0 .../can/sample_can_send_receive/init/system_init.c | 0 .../can/sample_can_send_receive/readme.md | 0 .../src/sample_can_send_receive.c | 0 .../capm/capm_hall_sample/inc/capm_hall_sample.h | 0 .../capm/capm_hall_sample/init/main.c | 0 .../capm/capm_hall_sample/init/main.h | 0 .../capm/capm_hall_sample/init/system_init.c | 0 .../drivers_sample}/capm/capm_hall_sample/readme.md | 0 .../capm/capm_hall_sample/src/capm_hall_sample.c | 0 .../inc/cfd_check_error_sample.h | 0 .../cfd/sample_cfd_check_error/init/main.c | 0 .../cfd/sample_cfd_check_error/init/main.h | 0 .../cfd/sample_cfd_check_error/init/system_init.c | 0 .../cfd/sample_cfd_check_error/readme.md | 0 .../src/cfd_check_error_sample.c | 0 .../inc/cmm_check_error_sample.h | 0 .../cmm/sample_cmm_check_error/init/main.c | 0 .../cmm/sample_cmm_check_error/init/main.h | 0 .../cmm/sample_cmm_check_error/init/system_init.c | 0 .../cmm/sample_cmm_check_error/readme.md | 0 .../src/cmm_check_error_sample.c | 0 .../sample_crc_gen_algo/inc/sample_crc_gen_algo.h | 0 .../crc/sample_crc_gen_algo/init/main.c | 0 .../crc/sample_crc_gen_algo/init/main.h | 0 .../crc/sample_crc_gen_algo/init/system_init.c | 0 .../crc/sample_crc_gen_algo/readme.md | 0 .../sample_crc_gen_algo/src/sample_crc_gen_algo.c | 0 .../sample_crc_load_algo/inc/sample_crc_load_algo.h | 0 .../crc/sample_crc_load_algo/init/main.c | 0 .../crc/sample_crc_load_algo/init/main.h | 0 .../crc/sample_crc_load_algo/init/system_init.c | 0 .../crc/sample_crc_load_algo/readme.md | 0 .../sample_crc_load_algo/src/sample_crc_load_algo.c | 0 .../demo/drivers_sample}/dac/sample_dac/init/main.c | 0 .../demo/drivers_sample}/dac/sample_dac/init/main.h | 0 .../dac/sample_dac/init/system_init.c | 0 .../demo/drivers_sample}/dac/sample_dac/readme.md | 0 .../inc/sample_dma_list_transfer.h | 0 .../dma/sample_dma_list_transfer/readme.md | 0 .../src/sample_dma_list_transfer.c | 0 .../inc/sample_dma_list_transfer_continue.h | 0 .../dma/sample_dma_list_transfer_continue/readme.md | 0 .../src/sample_dma_list_transfer_continue.c | 0 .../sysinit/main.c | 0 .../sysinit/main.h | 0 .../sysinit/system_init.c | 0 .../inc/sample_dma_mem_to_mem.h | 0 .../dma/sample_dma_mem_to_mem/init/main.c | 0 .../dma/sample_dma_mem_to_mem/init/main.h | 0 .../dma/sample_dma_mem_to_mem/init/system_init.c | 0 .../dma/sample_dma_mem_to_mem/readme.md | 0 .../src/sample_dma_mem_to_mem.c | 0 .../inc/sample_dma_mem_to_per.h | 0 .../dma/sample_dma_mem_to_per/readme.md | 0 .../src/sample_dma_mem_to_per.c | 0 .../inc/sample_dma_per_to_mem.h | 0 .../dma/sample_dma_per_to_mem/readme.md | 0 .../src/sample_dma_per_to_mem.c | 0 .../inc/sample_dma_per_to_per.h | 0 .../dma/sample_dma_per_to_per/readme.md | 0 .../src/sample_dma_per_to_per.c | 0 .../inc/sample_flash_blocking.h | 0 .../flash/sample_flash_blocking/init/main.c | 0 .../flash/sample_flash_blocking/init/main.h | 0 .../flash/sample_flash_blocking/init/system_init.c | 0 .../flash/sample_flash_blocking/readme.md | 0 .../src/sample_flash_blocking.c | 0 .../inc/sample_flash_blocking_mode.h | 0 .../flash/sample_flash_blocking_mode/init/main.c | 0 .../flash/sample_flash_blocking_mode/init/main.h | 0 .../sample_flash_blocking_mode/init/system_init.c | 0 .../flash/sample_flash_blocking_mode/readme.md | 0 .../src/sample_flash_blocking_mode.c | 0 .../inc/sample_flash_interrupt.h | 0 .../flash/sample_flash_interrupt/init/main.c | 0 .../flash/sample_flash_interrupt/init/main.h | 0 .../flash/sample_flash_interrupt/init/system_init.c | 0 .../flash/sample_flash_interrupt/readme.md | 0 .../src/sample_flash_interrupt.c | 0 .../inc/sample_flash_interrupt_mode.h | 0 .../flash/sample_flash_interrupt_mode/init/main.c | 0 .../flash/sample_flash_interrupt_mode/init/main.h | 0 .../sample_flash_interrupt_mode/init/system_init.c | 0 .../flash/sample_flash_interrupt_mode/readme.md | 0 .../src/sample_flash_interrupt_mode.c | 0 .../sample_gpio_circle/inc/gpio_circle_sample.h | 0 .../gpio/sample_gpio_circle/init/main.c | 0 .../gpio/sample_gpio_circle/init/main.h | 0 .../gpio/sample_gpio_circle/init/system_init.c | 0 .../gpio/sample_gpio_circle/readme.md | 0 .../sample_gpio_circle/src/gpio_circle_sample.c | 0 .../inc/gpio_interrupt_sample.h | 0 .../gpio/sample_gpio_interrupt/init/main.c | 0 .../gpio/sample_gpio_interrupt/init/main.h | 0 .../gpio/sample_gpio_interrupt/init/system_init.c | 0 .../gpio/sample_gpio_interrupt/readme.md | 0 .../src/gpio_interrupt_sample.c | 0 .../gpio/sample_gpio_key/inc/gpio_key_sample.h | 0 .../gpio/sample_gpio_key/init/main.c | 0 .../gpio/sample_gpio_key/init/main.h | 0 .../gpio/sample_gpio_key/init/system_init.c | 0 .../drivers_sample}/gpio/sample_gpio_key/readme.md | 0 .../gpio/sample_gpio_key/src/gpio_key_sample.c | 0 .../gpio/sample_gpio_led/inc/gpio_led_sample.h | 0 .../gpio/sample_gpio_led/init/main.c | 0 .../gpio/sample_gpio_led/init/main.h | 0 .../gpio/sample_gpio_led/init/system_init.c | 0 .../drivers_sample}/gpio/sample_gpio_led/readme.md | 0 .../gpio/sample_gpio_led/src/gpio_led_sample.c | 0 .../inc/sample_gpt_period_interrupt.h | 0 .../gpt/sample_gpt_period_interrupt/init/main.c | 0 .../gpt/sample_gpt_period_interrupt/init/main.h | 0 .../sample_gpt_period_interrupt/init/system_init.c | 0 .../gpt/sample_gpt_period_interrupt/readme.md | 0 .../src/sample_gpt_period_interrupt.c | 0 .../inc/sample_gpt_pwm_output.h | 0 .../gpt/sample_gpt_pwm_output/init/main.c | 0 .../gpt/sample_gpt_pwm_output/init/main.h | 0 .../gpt/sample_gpt_pwm_output/init/system_init.c | 0 .../gpt/sample_gpt_pwm_output/readme.md | 0 .../src/sample_gpt_pwm_output.c | 0 .../sample_gpt_simplerun/inc/sample_gpt_simplerun.h | 0 .../gpt/sample_gpt_simplerun/init/main.c | 0 .../gpt/sample_gpt_simplerun/init/main.h | 0 .../gpt/sample_gpt_simplerun/init/system_init.c | 0 .../gpt/sample_gpt_simplerun/readme.md | 0 .../sample_gpt_simplerun/src/sample_gpt_simplerun.c | 0 .../inc/sample_i2c_blocking_stlm75.h | 0 .../i2c/sample_i2c_blocking_stlm75/init/main.c | 0 .../i2c/sample_i2c_blocking_stlm75/init/main.h | 0 .../sample_i2c_blocking_stlm75/init/system_init.c | 0 .../i2c/sample_i2c_blocking_stlm75/readme.md | 0 .../src/sample_i2c_blocking_stlm75.c | 0 .../inc/sample_i2c_dma_stlm75.h | 0 .../i2c/sample_i2c_dma_stlm75/init/main.c | 0 .../i2c/sample_i2c_dma_stlm75/init/main.h | 0 .../i2c/sample_i2c_dma_stlm75/init/system_init.c | 0 .../i2c/sample_i2c_dma_stlm75/readme.md | 0 .../src/sample_i2c_dma_stlm75.c | 0 .../inc/sample_i2c_interrupt_stlm75.h | 0 .../i2c/sample_i2c_interrupt_stlm75/init/main.c | 0 .../i2c/sample_i2c_interrupt_stlm75/init/main.h | 0 .../sample_i2c_interrupt_stlm75/init/system_init.c | 0 .../i2c/sample_i2c_interrupt_stlm75/readme.md | 0 .../src/sample_i2c_interrupt_stlm75.c | 0 .../inc/sample_i2c_master_blocking_at24c64.h | 0 .../sample_i2c_master_blocking_at24c64/init/main.c | 0 .../sample_i2c_master_blocking_at24c64/init/main.h | 0 .../init/system_init.c | 0 .../sample_i2c_master_blocking_at24c64/readme.md | 0 .../src/sample_i2c_master_blocking_at24c64.c | 0 .../inc/sample_i2c_master_dma_at24c64.h | 0 .../i2c/sample_i2c_master_dma_at24c64/init/main.c | 0 .../i2c/sample_i2c_master_dma_at24c64/init/main.h | 0 .../init/system_init.c | 0 .../i2c/sample_i2c_master_dma_at24c64/readme.md | 0 .../src/sample_i2c_master_dma_at24c64.c | 0 .../inc/sample_i2c_master_interrupt_at24c64.h | 0 .../sample_i2c_master_interrupt_at24c64/init/main.c | 0 .../sample_i2c_master_interrupt_at24c64/init/main.h | 0 .../init/system_init.c | 0 .../sample_i2c_master_interrupt_at24c64/readme.md | 0 .../src/sample_i2c_master_interrupt_at24c64.c | 0 .../inc/sample_i2c_slave_blocking.h | 0 .../i2c/sample_i2c_slave_blocking/init/main.c | 0 .../i2c/sample_i2c_slave_blocking/init/main.h | 0 .../sample_i2c_slave_blocking/init/system_init.c | 0 .../i2c/sample_i2c_slave_blocking/readme.md | 0 .../src/sample_i2c_slave_blocking.c | 0 .../sample_i2c_slave_dma/inc/sample_i2c_slave_dma.h | 0 .../i2c/sample_i2c_slave_dma/init/main.c | 0 .../i2c/sample_i2c_slave_dma/init/main.h | 0 .../i2c/sample_i2c_slave_dma/init/system_init.c | 0 .../i2c/sample_i2c_slave_dma/readme.md | 0 .../sample_i2c_slave_dma/src/sample_i2c_slave_dma.c | 0 .../inc/sample_i2c_slave_interrupt.h | 0 .../i2c/sample_i2c_slave_interrupt/init/main.c | 0 .../i2c/sample_i2c_slave_interrupt/init/main.h | 0 .../sample_i2c_slave_interrupt/init/system_init.c | 0 .../i2c/sample_i2c_slave_interrupt/readme.md | 0 .../src/sample_i2c_slave_interrupt.c | 0 .../iocmg/iolist_sample/inc/iolist_sample.h | 0 .../drivers_sample}/iocmg/iolist_sample/init/main.c | 0 .../drivers_sample}/iocmg/iolist_sample/init/main.h | 0 .../iocmg/iolist_sample/init/system_init.c | 0 .../drivers_sample}/iocmg/iolist_sample/readme.md | 0 .../iocmg/iolist_sample/src/iolist_sample.c | 0 .../iocmg/sample_iocfg_list/inc/sample_iocfg_list.h | 0 .../iocmg/sample_iocfg_list/init/main.c | 0 .../iocmg/sample_iocfg_list/init/main.h | 0 .../iocmg/sample_iocfg_list/init/system_init.c | 0 .../iocmg/sample_iocfg_list/readme.rd | 0 .../iocmg/sample_iocfg_list/src/sample_iocfg_list.c | 0 .../yibaina_3061M/demo/drivers_sample}/open_mcu | 0 .../yibaina_3061M/demo/drivers_sample}/open_mcu_1 | 0 .../demo/drivers_sample}/pga/sample_pga/init/main.c | 0 .../demo/drivers_sample}/pga/sample_pga/init/main.h | 0 .../pga/sample_pga/init/system_init.c | 0 .../demo/drivers_sample}/pga/sample_pga/readme.md | 0 .../pga/sample_pga_extra_resistor/init/main.c | 0 .../pga/sample_pga_extra_resistor/init/main.h | 0 .../sample_pga_extra_resistor/init/system_init.c | 0 .../pga/sample_pga_extra_resistor/readme.md | 0 .../inc/sample_pga_result_sampling.h | 0 .../pga/sample_pga_result_sampling/init/main.c | 0 .../pga/sample_pga_result_sampling/init/main.h | 0 .../sample_pga_result_sampling/init/system_init.c | 0 .../pga/sample_pga_result_sampling/readme.md | 0 .../src/sample_pga_result_sampling.c | 0 .../demo/drivers_sample}/pic/1726194739756.jpg | Bin .../demo/drivers_sample}/pic/1726194776437.jpg | Bin .../demo/drivers_sample}/pic/1726194794028.jpg | Bin .../demo/drivers_sample}/pic/1726194824764.jpg | Bin .../demo/drivers_sample}/pic/1726194869607.jpg | Bin .../pic/1726194906962-1726195658552-18.jpg | Bin .../demo/drivers_sample}/pic/1726194906962.jpg | Bin .../demo/drivers_sample}/pic/1726194945180.jpg | Bin .../pic/1726194962547-1726195476280-9.jpg | Bin .../demo/drivers_sample}/pic/1726194962547.jpg | Bin .../demo/drivers_sample}/pic/1726194980430.jpg | Bin .../demo/drivers_sample}/pic/1726195007716.jpg | Bin .../demo/drivers_sample}/pic/1726195033006.jpg | Bin .../demo/drivers_sample}/pic/1726195055385.jpg | Bin .../demo/drivers_sample}/pic/1726195173004.jpg | Bin .../demo/drivers_sample}/pic/1726195185553.jpg | Bin .../pmc/sample_pmc_pvd/inc/sample_pmc_pvd.h | 0 .../drivers_sample}/pmc/sample_pmc_pvd/init/main.c | 0 .../drivers_sample}/pmc/sample_pmc_pvd/init/main.h | 0 .../pmc/sample_pmc_pvd/init/system_init.c | 0 .../drivers_sample}/pmc/sample_pmc_pvd/readme.md | 0 .../pmc/sample_pmc_pvd/src/sample_pmc_pvd.c | 0 .../pmc/sample_pmc_wakeup/inc/sample_pmc_wakeup.h | 0 .../pmc/sample_pmc_wakeup/init/main.c | 0 .../pmc/sample_pmc_wakeup/init/main.h | 0 .../pmc/sample_pmc_wakeup/init/system_init.c | 0 .../drivers_sample}/pmc/sample_pmc_wakeup/readme.md | 0 .../pmc/sample_pmc_wakeup/src/sample_pmc_wakeup.c | 0 .../qdm/sample_qdm_m/inc/sample_qdm_m.h | 0 .../drivers_sample}/qdm/sample_qdm_m/init/main.c | 0 .../drivers_sample}/qdm/sample_qdm_m/init/main.h | 0 .../qdm/sample_qdm_m/init/system_init.c | 0 .../demo/drivers_sample}/qdm/sample_qdm_m/readme.md | 0 .../qdm/sample_qdm_m/src/sample_qdm_m.c | 0 .../qdm/sample_qdm_mt/inc/sample_qdm_mt.h | 0 .../drivers_sample}/qdm/sample_qdm_mt/init/main.c | 0 .../drivers_sample}/qdm/sample_qdm_mt/init/main.h | 0 .../qdm/sample_qdm_mt/init/system_init.c | 0 .../drivers_sample}/qdm/sample_qdm_mt/readme.md | 0 .../qdm/sample_qdm_mt/src/sample_qdm_mt.c | 0 .../inc/sample_spi_blocking_kta7953.h | 0 .../spi/sample_spi_blocking_kta7953/init/main.c | 0 .../spi/sample_spi_blocking_kta7953/init/main.h | 0 .../sample_spi_blocking_kta7953/init/system_init.c | 0 .../spi/sample_spi_blocking_kta7953/readme.md | 0 .../src/sample_spi_blocking_kta7953.c | 0 .../inc/sample_spi_blocking_w25q32.h | 0 .../spi/sample_spi_blocking_w25q32/init/main.c | 0 .../spi/sample_spi_blocking_w25q32/init/main.h | 0 .../sample_spi_blocking_w25q32/init/system_init.c | 0 .../spi/sample_spi_blocking_w25q32/readme.md | 0 .../src/sample_spi_blocking_w25q32.c | 0 .../inc/sample_spi_blocking_w25q32_internal.h | 0 .../sample_spi_blocking_w25q32_internal/init/main.c | 0 .../sample_spi_blocking_w25q32_internal/init/main.h | 0 .../init/system_init.c | 0 .../sample_spi_blocking_w25q32_internal/readme.md | 0 .../src/sample_spi_blocking_w25q32_internal.c | 0 .../inc/sample_spi_dma_kta7953.h | 0 .../spi/sample_spi_dma_kta7953/init/main.c | 0 .../spi/sample_spi_dma_kta7953/init/main.h | 0 .../spi/sample_spi_dma_kta7953/init/system_init.c | 0 .../spi/sample_spi_dma_kta7953/readme.md | 0 .../src/sample_spi_dma_kta7953.c | 0 .../inc/sample_spi_dma_w25q32.h | 0 .../spi/sample_spi_dma_w25q32/init/main.c | 0 .../spi/sample_spi_dma_w25q32/init/main.h | 0 .../spi/sample_spi_dma_w25q32/init/system_init.c | 0 .../spi/sample_spi_dma_w25q32/readme.md | 0 .../src/sample_spi_dma_w25q32.c | 0 .../inc/sample_spi_dma_w25q32_internal.h | 0 .../spi/sample_spi_dma_w25q32_internal/init/main.c | 0 .../spi/sample_spi_dma_w25q32_internal/init/main.h | 0 .../init/system_init.c | 0 .../spi/sample_spi_dma_w25q32_internal/readme.md | 0 .../src/sample_spi_dma_w25q32_internal.c | 0 .../inc/sample_spi_interrupt_kta7953.h | 0 .../spi/sample_spi_interrupt_kta7953/init/main.c | 0 .../spi/sample_spi_interrupt_kta7953/init/main.h | 0 .../sample_spi_interrupt_kta7953/init/system_init.c | 0 .../spi/sample_spi_interrupt_kta7953/readme.md | 0 .../src/sample_spi_interrupt_kta7953.c | 0 .../inc/sample_spi_interrupt_w25q32.h | 0 .../spi/sample_spi_interrupt_w25q32/init/main.c | 0 .../spi/sample_spi_interrupt_w25q32/init/main.h | 0 .../sample_spi_interrupt_w25q32/init/system_init.c | 0 .../spi/sample_spi_interrupt_w25q32/readme.md | 0 .../src/sample_spi_interrupt_w25q32.c | 0 .../inc/sample_spi_interrupt_w25q32_internal.h | 0 .../init/main.c | 0 .../init/main.h | 0 .../init/system_init.c | 0 .../sample_spi_interrupt_w25q32_internal/readme.md | 0 .../src/sample_spi_interrupt_w25q32_internal.c | 0 .../spi/sample_spi_master/inc/sample_spi_master.h | 0 .../spi/sample_spi_master/init/main.c | 0 .../spi/sample_spi_master/init/main.h | 0 .../spi/sample_spi_master/init/system_init.c | 0 .../drivers_sample}/spi/sample_spi_master/readme.md | 0 .../spi/sample_spi_master/src/sample_spi_master.c | 0 .../inc/sample_spi_microwire_master.h | 0 .../spi/sample_spi_microwire_master/init/main.c | 0 .../spi/sample_spi_microwire_master/init/main.h | 0 .../sample_spi_microwire_master/init/system_init.c | 0 .../spi/sample_spi_microwire_master/readme.md | 0 .../src/sample_spi_microwire_master.c | 0 .../inc/sample_spi_microwire_slave.h | 0 .../spi/sample_spi_microwire_slave/init/main.c | 0 .../spi/sample_spi_microwire_slave/init/main.h | 0 .../sample_spi_microwire_slave/init/system_init.c | 0 .../spi/sample_spi_microwire_slave/readme.md | 0 .../src/sample_spi_microwire_slave.c | 0 .../spi/sample_spi_slave/inc/sample_spi_slave.h | 0 .../spi/sample_spi_slave/init/main.c | 0 .../spi/sample_spi_slave/init/main.h | 0 .../spi/sample_spi_slave/init/system_init.c | 0 .../drivers_sample}/spi/sample_spi_slave/readme.md | 0 .../spi/sample_spi_slave/src/sample_spi_slave.c | 0 .../inc/sample_timer_interrupt.h | 0 .../timer/sample_timer_interrupt/init/main.c | 0 .../timer/sample_timer_interrupt/init/main.h | 0 .../timer/sample_timer_interrupt/init/system_init.c | 0 .../timer/sample_timer_interrupt/readme.md | 0 .../src/sample_timer_interrupt.c | 0 .../tsensor/sample_tsensor/inc/sample_tsensor.h | 0 .../tsensor/sample_tsensor/readme.txt | 0 .../tsensor/sample_tsensor/src/sample_tsensor.c | 0 .../inc/sample_uart_baud_detect.h | 0 .../uart/sample_uart_baud_detect/init/main.c | 0 .../uart/sample_uart_baud_detect/init/main.h | 0 .../uart/sample_uart_baud_detect/init/system_init.c | 0 .../uart/sample_uart_baud_detect/readme.md | 0 .../src/sample_uart_baud_detect.c | 0 .../inc/sample_uart_blocking_rx.h | 0 .../uart/sample_uart_blocking_rx/init/main.c | 0 .../uart/sample_uart_blocking_rx/init/main.h | 0 .../uart/sample_uart_blocking_rx/init/system_init.c | 0 .../uart/sample_uart_blocking_rx/readme.md | 0 .../src/sample_uart_blocking_rx.c | 0 .../inc/sample_uart_blocking_tx.h | 0 .../uart/sample_uart_blocking_tx/init/main.c | 0 .../uart/sample_uart_blocking_tx/init/main.h | 0 .../uart/sample_uart_blocking_tx/init/system_init.c | 0 .../uart/sample_uart_blocking_tx/readme.md | 0 .../src/sample_uart_blocking_tx.c | 0 .../inc/sample_uart_character_match.h | 0 .../uart/sample_uart_character_match/init/main.c | 0 .../uart/sample_uart_character_match/init/main.h | 0 .../sample_uart_character_match/init/system_init.c | 0 .../uart/sample_uart_character_match/readme.md | 0 .../src/sample_uart_character_match.c | 0 .../sample_uart_dma_rx/inc/sample_uart_dma_rx.h | 0 .../uart/sample_uart_dma_rx/init/main.c | 0 .../uart/sample_uart_dma_rx/init/main.h | 0 .../uart/sample_uart_dma_rx/init/system_init.c | 0 .../uart/sample_uart_dma_rx/readme.md | 0 .../sample_uart_dma_rx/src/sample_uart_dma_rx.c | 0 .../inc/sample_uart_dma_rx_cyclically_stored.h | 0 .../init/main.c | 0 .../init/main.h | 0 .../init/system_init.c | 0 .../sample_uart_dma_rx_cyclically_stored/readme.md | 0 .../src/sample_uart_dma_rx_cyclically_stored.c | 0 .../sample_uart_dma_tx/inc/sample_uart_dma_tx.h | 0 .../uart/sample_uart_dma_tx/init/main.c | 0 .../uart/sample_uart_dma_tx/init/main.h | 0 .../uart/sample_uart_dma_tx/init/system_init.c | 0 .../uart/sample_uart_dma_tx/readme.md | 0 .../sample_uart_dma_tx/src/sample_uart_dma_tx.c | 0 .../inc/sample_uart_dma_tx_dma_rx_simultaneously.h | 0 .../init/main.c | 0 .../init/main.h | 0 .../init/system_init.c | 0 .../readme.md | 0 .../src/sample_uart_dma_tx_dma_rx_simultaneously.c | 0 .../inc/sample_uart_dma_tx_int_rx_simultaneously.h | 0 .../init/main.c | 0 .../init/main.h | 0 .../init/system_init.c | 0 .../readme.md | 0 .../src/sample_uart_dma_tx_int_rx_simultaneously.c | 0 .../inc/sample_uart_int_tx_dma_rx_simultaneously.h | 0 .../init/main.c | 0 .../init/main.h | 0 .../init/system_init.c | 0 .../readme.md | 0 .../src/sample_uart_int_tx_dma_rx_simultaneously.c | 0 .../inc/sample_uart_int_tx_int_rx_simultaneously.h | 0 .../init/main.c | 0 .../init/main.h | 0 .../init/system_init.c | 0 .../readme.md | 0 .../src/sample_uart_int_tx_int_rx_simultaneously.c | 0 .../inc/sample_uart_interrupt_rx.h | 0 .../uart/sample_uart_interrupt_rx/init/main.c | 0 .../uart/sample_uart_interrupt_rx/init/main.h | 0 .../sample_uart_interrupt_rx/init/system_init.c | 0 .../uart/sample_uart_interrupt_rx/readme.md | 0 .../src/sample_uart_interrupt_rx.c | 0 .../inc/sample_uart_interrupt_tx.h | 0 .../uart/sample_uart_interrupt_tx/init/main.c | 0 .../uart/sample_uart_interrupt_tx/init/main.h | 0 .../sample_uart_interrupt_tx/init/system_init.c | 0 .../uart/sample_uart_interrupt_tx/readme.md | 0 .../src/sample_uart_interrupt_tx.c | 0 .../inc/sample_uart_interrupt_tx_after_rx.h | 0 .../sample_uart_interrupt_tx_after_rx/init/main.c | 0 .../sample_uart_interrupt_tx_after_rx/init/main.h | 0 .../init/system_init.c | 0 .../sample_uart_interrupt_tx_after_rx/readme.md | 0 .../src/sample_uart_interrupt_tx_after_rx.c | 0 .../inc/sample_uart_single_wire_communication.h | 0 .../init/main.c | 0 .../init/main.h | 0 .../init/system_init.c | 0 .../sample_uart_single_wire_communication/readme.md | 0 .../src/sample_uart_single_wire_communication.c | 0 .../sample_iwdg_refresh/inc/sample_iwdg_refresh.h | 0 .../wdg/sample_iwdg_refresh/init/main.c | 0 .../wdg/sample_iwdg_refresh/init/main.h | 0 .../wdg/sample_iwdg_refresh/init/system_init.c | 0 .../wdg/sample_iwdg_refresh/readme.md | 0 .../sample_iwdg_refresh/src/sample_iwdg_refresh.c | 0 .../wdg/sample_iwdg_reset/inc/iwdg_reset_sample.h | 0 .../wdg/sample_iwdg_reset/init/main.c | 0 .../wdg/sample_iwdg_reset/init/main.h | 0 .../wdg/sample_iwdg_reset/init/system_init.c | 0 .../drivers_sample}/wdg/sample_iwdg_reset/readme.md | 0 .../wdg/sample_iwdg_reset/src/iwdg_reset_sample.c | 0 .../wdg/sample_wdg_reset/inc/wdg_reset_sample.h | 0 .../wdg/sample_wdg_reset/init/main.c | 0 .../wdg/sample_wdg_reset/init/main.h | 0 .../wdg/sample_wdg_reset/init/system_init.c | 0 .../drivers_sample}/wdg/sample_wdg_reset/readme.md | 0 .../wdg/sample_wdg_reset/src/wdg_reset_sample.c | 0 .../sample_wwdg_refresh/inc/sample_wwdg_refresh.h | 0 .../wdg/sample_wwdg_refresh/init/main.c | 0 .../wdg/sample_wwdg_refresh/init/main.h | 0 .../wdg/sample_wwdg_refresh/init/system_init.c | 0 .../wdg/sample_wwdg_refresh/readme.md | 0 .../sample_wwdg_refresh/src/sample_wwdg_refresh.c | 0 .../\345\233\276\347\211\207/1726194739756.jpg" | Bin .../\345\233\276\347\211\207/1726194776437.jpg" | Bin .../\345\233\276\347\211\207/1726194794028.jpg" | Bin .../\345\233\276\347\211\207/1726194824764.jpg" | Bin .../\345\233\276\347\211\207/1726194869607.jpg" | Bin .../\345\233\276\347\211\207/1726194906962.jpg" | Bin .../\345\233\276\347\211\207/1726194945180.jpg" | Bin .../\345\233\276\347\211\207/1726194962547.jpg" | Bin .../\345\233\276\347\211\207/1726194980430.jpg" | Bin .../\345\233\276\347\211\207/1726195007716.jpg" | Bin .../\345\233\276\347\211\207/1726195033006.jpg" | Bin .../\345\233\276\347\211\207/1726195055385.jpg" | Bin .../\345\233\276\347\211\207/1726195173004.jpg" | Bin .../\345\233\276\347\211\207/1726195185553.jpg" | Bin ...\214\207\345\257\274\346\211\213\345\206\214.md" | 0 552 files changed, 0 insertions(+), 0 deletions(-) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/acmp/sample_acmp_interrupt/inc/sample_acmp_interrupt.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/acmp/sample_acmp_interrupt/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/acmp/sample_acmp_interrupt/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/acmp/sample_acmp_interrupt/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/acmp/sample_acmp_interrupt/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/acmp/sample_acmp_interrupt/src/sample_acmp_interrupt.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/acmp/sample_acmp_out_result/inc/sample_acmp_out_result.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/acmp/sample_acmp_out_result/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/acmp/sample_acmp_out_result/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/acmp/sample_acmp_out_result/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/acmp/sample_acmp_out_result/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/acmp/sample_acmp_out_result/src/sample_acmp_out_result.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_associative_trigger_of_apt/inc/sample_adc_associative_trigger_apt.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_associative_trigger_of_apt/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_associative_trigger_of_apt/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_associative_trigger_of_apt/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_associative_trigger_of_apt/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_associative_trigger_of_apt/src/sample_adc_associative_trigger_apt.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_continue_trigger/inc/sample_adc_continue_trigger.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_continue_trigger/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_continue_trigger/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_continue_trigger/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_continue_trigger/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_continue_trigger/src/sample_adc_continue_trigger.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_over_sample/inc/sample_adc_over_sample.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_over_sample/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_over_sample/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_over_sample/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_over_sample/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_over_sample/src/sample_adc_over_sample.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_oversampling_it/inc/sample_adc_oversampling_it.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_oversampling_it/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_oversampling_it/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_oversampling_it/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_oversampling_it/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_oversampling_it/src/sample_adc_oversampling_it.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_single_trigger/inc/sample_adc_single_trigger.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_single_trigger/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_single_trigger/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_single_trigger/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_single_trigger/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_single_trigger/src/sample_adc_single_trigger.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_single_trigger_dma/inc/sample_adc_single_trigger_dma.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_single_trigger_dma/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_single_trigger_dma/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_single_trigger_dma/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_single_trigger_dma/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_single_trigger_dma/src/sample_adc_single_trigger_dma.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_single_trigger_it/inc/sample_adc_single_trigger_it.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_single_trigger_it/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_single_trigger_it/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_single_trigger_it/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_single_trigger_it/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_single_trigger_it/src/sample_adc_single_trigger_it.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_single_with_ppb/inc/sample_adc_single_with_ppb.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_single_with_ppb/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_single_with_ppb/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_single_with_ppb/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_single_with_ppb/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_single_with_ppb/src/sample_adc_single_with_ppb.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_sync_sample/inc/sample_adc_sync_sample.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_sync_sample/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_sync_sample/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_sync_sample/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_sync_sample/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_sync_sample/src/sample_adc_sync_sample.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_sync_sample_dma/inc/sample_adc_sync_sample_dma.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_sync_sample_dma/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_sync_sample_dma/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_sync_sample_dma/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_sync_sample_dma/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_sync_sample_dma/src/sample_adc_sync_sample_dma.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_sync_sample_it/inc/sample_adc_sync_sample_it.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_sync_sample_it/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_sync_sample_it/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_sync_sample_it/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_sync_sample_it/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/adc/sample_adc_sync_sample_it/src/sample_adc_sync_sample_it.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/apt/sample_apt_single_resistor/inc/sample_apt_single_resistor.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/apt/sample_apt_single_resistor/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/apt/sample_apt_single_resistor/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/apt/sample_apt_single_resistor/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/apt/sample_apt_single_resistor/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/apt/sample_apt_single_resistor/src/sample_apt_single_resistor.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/can/sample_can_send_receive/inc/sample_can_send_receive.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/can/sample_can_send_receive/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/can/sample_can_send_receive/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/can/sample_can_send_receive/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/can/sample_can_send_receive/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/can/sample_can_send_receive/src/sample_can_send_receive.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/capm/capm_hall_sample/inc/capm_hall_sample.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/capm/capm_hall_sample/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/capm/capm_hall_sample/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/capm/capm_hall_sample/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/capm/capm_hall_sample/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/capm/capm_hall_sample/src/capm_hall_sample.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/cfd/sample_cfd_check_error/inc/cfd_check_error_sample.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/cfd/sample_cfd_check_error/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/cfd/sample_cfd_check_error/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/cfd/sample_cfd_check_error/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/cfd/sample_cfd_check_error/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/cfd/sample_cfd_check_error/src/cfd_check_error_sample.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/cmm/sample_cmm_check_error/inc/cmm_check_error_sample.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/cmm/sample_cmm_check_error/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/cmm/sample_cmm_check_error/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/cmm/sample_cmm_check_error/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/cmm/sample_cmm_check_error/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/cmm/sample_cmm_check_error/src/cmm_check_error_sample.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/crc/sample_crc_gen_algo/inc/sample_crc_gen_algo.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/crc/sample_crc_gen_algo/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/crc/sample_crc_gen_algo/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/crc/sample_crc_gen_algo/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/crc/sample_crc_gen_algo/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/crc/sample_crc_gen_algo/src/sample_crc_gen_algo.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/crc/sample_crc_load_algo/inc/sample_crc_load_algo.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/crc/sample_crc_load_algo/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/crc/sample_crc_load_algo/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/crc/sample_crc_load_algo/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/crc/sample_crc_load_algo/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/crc/sample_crc_load_algo/src/sample_crc_load_algo.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/dac/sample_dac/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/dac/sample_dac/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/dac/sample_dac/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/dac/sample_dac/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/dma/sample_dma_list_transfer/inc/sample_dma_list_transfer.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/dma/sample_dma_list_transfer/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/dma/sample_dma_list_transfer/src/sample_dma_list_transfer.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/dma/sample_dma_list_transfer_continue/inc/sample_dma_list_transfer_continue.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/dma/sample_dma_list_transfer_continue/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/dma/sample_dma_list_transfer_continue/src/sample_dma_list_transfer_continue.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/dma/sample_dma_list_transfer_continue/sysinit/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/dma/sample_dma_list_transfer_continue/sysinit/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/dma/sample_dma_list_transfer_continue/sysinit/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/dma/sample_dma_mem_to_mem/inc/sample_dma_mem_to_mem.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/dma/sample_dma_mem_to_mem/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/dma/sample_dma_mem_to_mem/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/dma/sample_dma_mem_to_mem/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/dma/sample_dma_mem_to_mem/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/dma/sample_dma_mem_to_mem/src/sample_dma_mem_to_mem.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/dma/sample_dma_mem_to_per/inc/sample_dma_mem_to_per.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/dma/sample_dma_mem_to_per/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/dma/sample_dma_mem_to_per/src/sample_dma_mem_to_per.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/dma/sample_dma_per_to_mem/inc/sample_dma_per_to_mem.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/dma/sample_dma_per_to_mem/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/dma/sample_dma_per_to_mem/src/sample_dma_per_to_mem.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/dma/sample_dma_per_to_per/inc/sample_dma_per_to_per.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/dma/sample_dma_per_to_per/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/dma/sample_dma_per_to_per/src/sample_dma_per_to_per.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/flash/sample_flash_blocking/inc/sample_flash_blocking.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/flash/sample_flash_blocking/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/flash/sample_flash_blocking/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/flash/sample_flash_blocking/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/flash/sample_flash_blocking/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/flash/sample_flash_blocking/src/sample_flash_blocking.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/flash/sample_flash_blocking_mode/inc/sample_flash_blocking_mode.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/flash/sample_flash_blocking_mode/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/flash/sample_flash_blocking_mode/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/flash/sample_flash_blocking_mode/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/flash/sample_flash_blocking_mode/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/flash/sample_flash_blocking_mode/src/sample_flash_blocking_mode.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/flash/sample_flash_interrupt/inc/sample_flash_interrupt.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/flash/sample_flash_interrupt/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/flash/sample_flash_interrupt/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/flash/sample_flash_interrupt/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/flash/sample_flash_interrupt/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/flash/sample_flash_interrupt/src/sample_flash_interrupt.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/flash/sample_flash_interrupt_mode/inc/sample_flash_interrupt_mode.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/flash/sample_flash_interrupt_mode/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/flash/sample_flash_interrupt_mode/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/flash/sample_flash_interrupt_mode/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/flash/sample_flash_interrupt_mode/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/flash/sample_flash_interrupt_mode/src/sample_flash_interrupt_mode.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/gpio/sample_gpio_circle/inc/gpio_circle_sample.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/gpio/sample_gpio_circle/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/gpio/sample_gpio_circle/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/gpio/sample_gpio_circle/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/gpio/sample_gpio_circle/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/gpio/sample_gpio_circle/src/gpio_circle_sample.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/gpio/sample_gpio_interrupt/inc/gpio_interrupt_sample.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/gpio/sample_gpio_interrupt/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/gpio/sample_gpio_interrupt/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/gpio/sample_gpio_interrupt/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/gpio/sample_gpio_interrupt/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/gpio/sample_gpio_interrupt/src/gpio_interrupt_sample.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/gpio/sample_gpio_key/inc/gpio_key_sample.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/gpio/sample_gpio_key/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/gpio/sample_gpio_key/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/gpio/sample_gpio_key/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/gpio/sample_gpio_key/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/gpio/sample_gpio_key/src/gpio_key_sample.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/gpio/sample_gpio_led/inc/gpio_led_sample.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/gpio/sample_gpio_led/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/gpio/sample_gpio_led/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/gpio/sample_gpio_led/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/gpio/sample_gpio_led/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/gpio/sample_gpio_led/src/gpio_led_sample.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/gpt/sample_gpt_period_interrupt/inc/sample_gpt_period_interrupt.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/gpt/sample_gpt_period_interrupt/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/gpt/sample_gpt_period_interrupt/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/gpt/sample_gpt_period_interrupt/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/gpt/sample_gpt_period_interrupt/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/gpt/sample_gpt_period_interrupt/src/sample_gpt_period_interrupt.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/gpt/sample_gpt_pwm_output/inc/sample_gpt_pwm_output.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/gpt/sample_gpt_pwm_output/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/gpt/sample_gpt_pwm_output/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/gpt/sample_gpt_pwm_output/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/gpt/sample_gpt_pwm_output/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/gpt/sample_gpt_pwm_output/src/sample_gpt_pwm_output.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/gpt/sample_gpt_simplerun/inc/sample_gpt_simplerun.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/gpt/sample_gpt_simplerun/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/gpt/sample_gpt_simplerun/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/gpt/sample_gpt_simplerun/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/gpt/sample_gpt_simplerun/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/gpt/sample_gpt_simplerun/src/sample_gpt_simplerun.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_blocking_stlm75/inc/sample_i2c_blocking_stlm75.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_blocking_stlm75/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_blocking_stlm75/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_blocking_stlm75/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_blocking_stlm75/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_blocking_stlm75/src/sample_i2c_blocking_stlm75.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_dma_stlm75/inc/sample_i2c_dma_stlm75.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_dma_stlm75/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_dma_stlm75/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_dma_stlm75/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_dma_stlm75/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_dma_stlm75/src/sample_i2c_dma_stlm75.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_interrupt_stlm75/inc/sample_i2c_interrupt_stlm75.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_interrupt_stlm75/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_interrupt_stlm75/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_interrupt_stlm75/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_interrupt_stlm75/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_interrupt_stlm75/src/sample_i2c_interrupt_stlm75.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_master_blocking_at24c64/inc/sample_i2c_master_blocking_at24c64.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_master_blocking_at24c64/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_master_blocking_at24c64/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_master_blocking_at24c64/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_master_blocking_at24c64/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_master_blocking_at24c64/src/sample_i2c_master_blocking_at24c64.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_master_dma_at24c64/inc/sample_i2c_master_dma_at24c64.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_master_dma_at24c64/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_master_dma_at24c64/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_master_dma_at24c64/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_master_dma_at24c64/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_master_dma_at24c64/src/sample_i2c_master_dma_at24c64.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_master_interrupt_at24c64/inc/sample_i2c_master_interrupt_at24c64.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_master_interrupt_at24c64/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_master_interrupt_at24c64/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_master_interrupt_at24c64/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_master_interrupt_at24c64/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_master_interrupt_at24c64/src/sample_i2c_master_interrupt_at24c64.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_slave_blocking/inc/sample_i2c_slave_blocking.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_slave_blocking/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_slave_blocking/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_slave_blocking/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_slave_blocking/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_slave_blocking/src/sample_i2c_slave_blocking.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_slave_dma/inc/sample_i2c_slave_dma.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_slave_dma/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_slave_dma/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_slave_dma/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_slave_dma/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_slave_dma/src/sample_i2c_slave_dma.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_slave_interrupt/inc/sample_i2c_slave_interrupt.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_slave_interrupt/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_slave_interrupt/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_slave_interrupt/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_slave_interrupt/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/i2c/sample_i2c_slave_interrupt/src/sample_i2c_slave_interrupt.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/iocmg/iolist_sample/inc/iolist_sample.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/iocmg/iolist_sample/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/iocmg/iolist_sample/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/iocmg/iolist_sample/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/iocmg/iolist_sample/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/iocmg/iolist_sample/src/iolist_sample.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/iocmg/sample_iocfg_list/inc/sample_iocfg_list.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/iocmg/sample_iocfg_list/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/iocmg/sample_iocfg_list/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/iocmg/sample_iocfg_list/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/iocmg/sample_iocfg_list/readme.rd (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/iocmg/sample_iocfg_list/src/sample_iocfg_list.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/open_mcu (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/open_mcu_1 (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/pga/sample_pga/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/pga/sample_pga/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/pga/sample_pga/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/pga/sample_pga/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/pga/sample_pga_extra_resistor/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/pga/sample_pga_extra_resistor/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/pga/sample_pga_extra_resistor/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/pga/sample_pga_extra_resistor/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/pga/sample_pga_result_sampling/inc/sample_pga_result_sampling.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/pga/sample_pga_result_sampling/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/pga/sample_pga_result_sampling/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/pga/sample_pga_result_sampling/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/pga/sample_pga_result_sampling/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/pga/sample_pga_result_sampling/src/sample_pga_result_sampling.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/pic/1726194739756.jpg (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/pic/1726194776437.jpg (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/pic/1726194794028.jpg (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/pic/1726194824764.jpg (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/pic/1726194869607.jpg (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/pic/1726194906962-1726195658552-18.jpg (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/pic/1726194906962.jpg (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/pic/1726194945180.jpg (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/pic/1726194962547-1726195476280-9.jpg (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/pic/1726194962547.jpg (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/pic/1726194980430.jpg (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/pic/1726195007716.jpg (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/pic/1726195033006.jpg (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/pic/1726195055385.jpg (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/pic/1726195173004.jpg (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/pic/1726195185553.jpg (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/pmc/sample_pmc_pvd/inc/sample_pmc_pvd.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/pmc/sample_pmc_pvd/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/pmc/sample_pmc_pvd/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/pmc/sample_pmc_pvd/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/pmc/sample_pmc_pvd/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/pmc/sample_pmc_pvd/src/sample_pmc_pvd.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/pmc/sample_pmc_wakeup/inc/sample_pmc_wakeup.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/pmc/sample_pmc_wakeup/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/pmc/sample_pmc_wakeup/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/pmc/sample_pmc_wakeup/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/pmc/sample_pmc_wakeup/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/pmc/sample_pmc_wakeup/src/sample_pmc_wakeup.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/qdm/sample_qdm_m/inc/sample_qdm_m.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/qdm/sample_qdm_m/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/qdm/sample_qdm_m/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/qdm/sample_qdm_m/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/qdm/sample_qdm_m/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/qdm/sample_qdm_m/src/sample_qdm_m.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/qdm/sample_qdm_mt/inc/sample_qdm_mt.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/qdm/sample_qdm_mt/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/qdm/sample_qdm_mt/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/qdm/sample_qdm_mt/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/qdm/sample_qdm_mt/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/qdm/sample_qdm_mt/src/sample_qdm_mt.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_blocking_kta7953/inc/sample_spi_blocking_kta7953.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_blocking_kta7953/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_blocking_kta7953/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_blocking_kta7953/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_blocking_kta7953/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_blocking_kta7953/src/sample_spi_blocking_kta7953.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_blocking_w25q32/inc/sample_spi_blocking_w25q32.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_blocking_w25q32/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_blocking_w25q32/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_blocking_w25q32/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_blocking_w25q32/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_blocking_w25q32/src/sample_spi_blocking_w25q32.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_blocking_w25q32_internal/inc/sample_spi_blocking_w25q32_internal.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_blocking_w25q32_internal/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_blocking_w25q32_internal/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_blocking_w25q32_internal/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_blocking_w25q32_internal/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_blocking_w25q32_internal/src/sample_spi_blocking_w25q32_internal.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_dma_kta7953/inc/sample_spi_dma_kta7953.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_dma_kta7953/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_dma_kta7953/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_dma_kta7953/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_dma_kta7953/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_dma_kta7953/src/sample_spi_dma_kta7953.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_dma_w25q32/inc/sample_spi_dma_w25q32.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_dma_w25q32/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_dma_w25q32/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_dma_w25q32/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_dma_w25q32/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_dma_w25q32/src/sample_spi_dma_w25q32.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_dma_w25q32_internal/inc/sample_spi_dma_w25q32_internal.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_dma_w25q32_internal/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_dma_w25q32_internal/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_dma_w25q32_internal/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_dma_w25q32_internal/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_dma_w25q32_internal/src/sample_spi_dma_w25q32_internal.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_interrupt_kta7953/inc/sample_spi_interrupt_kta7953.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_interrupt_kta7953/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_interrupt_kta7953/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_interrupt_kta7953/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_interrupt_kta7953/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_interrupt_kta7953/src/sample_spi_interrupt_kta7953.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_interrupt_w25q32/inc/sample_spi_interrupt_w25q32.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_interrupt_w25q32/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_interrupt_w25q32/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_interrupt_w25q32/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_interrupt_w25q32/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_interrupt_w25q32/src/sample_spi_interrupt_w25q32.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_interrupt_w25q32_internal/inc/sample_spi_interrupt_w25q32_internal.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_interrupt_w25q32_internal/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_interrupt_w25q32_internal/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_interrupt_w25q32_internal/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_interrupt_w25q32_internal/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_interrupt_w25q32_internal/src/sample_spi_interrupt_w25q32_internal.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_master/inc/sample_spi_master.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_master/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_master/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_master/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_master/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_master/src/sample_spi_master.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_microwire_master/inc/sample_spi_microwire_master.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_microwire_master/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_microwire_master/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_microwire_master/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_microwire_master/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_microwire_master/src/sample_spi_microwire_master.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_microwire_slave/inc/sample_spi_microwire_slave.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_microwire_slave/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_microwire_slave/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_microwire_slave/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_microwire_slave/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_microwire_slave/src/sample_spi_microwire_slave.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_slave/inc/sample_spi_slave.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_slave/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_slave/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_slave/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_slave/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/spi/sample_spi_slave/src/sample_spi_slave.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/timer/sample_timer_interrupt/inc/sample_timer_interrupt.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/timer/sample_timer_interrupt/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/timer/sample_timer_interrupt/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/timer/sample_timer_interrupt/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/timer/sample_timer_interrupt/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/timer/sample_timer_interrupt/src/sample_timer_interrupt.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/tsensor/sample_tsensor/inc/sample_tsensor.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/tsensor/sample_tsensor/readme.txt (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/tsensor/sample_tsensor/src/sample_tsensor.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_baud_detect/inc/sample_uart_baud_detect.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_baud_detect/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_baud_detect/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_baud_detect/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_baud_detect/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_baud_detect/src/sample_uart_baud_detect.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_blocking_rx/inc/sample_uart_blocking_rx.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_blocking_rx/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_blocking_rx/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_blocking_rx/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_blocking_rx/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_blocking_rx/src/sample_uart_blocking_rx.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_blocking_tx/inc/sample_uart_blocking_tx.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_blocking_tx/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_blocking_tx/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_blocking_tx/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_blocking_tx/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_blocking_tx/src/sample_uart_blocking_tx.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_character_match/inc/sample_uart_character_match.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_character_match/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_character_match/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_character_match/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_character_match/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_character_match/src/sample_uart_character_match.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_dma_rx/inc/sample_uart_dma_rx.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_dma_rx/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_dma_rx/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_dma_rx/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_dma_rx/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_dma_rx/src/sample_uart_dma_rx.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_dma_rx_cyclically_stored/inc/sample_uart_dma_rx_cyclically_stored.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_dma_rx_cyclically_stored/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_dma_rx_cyclically_stored/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_dma_rx_cyclically_stored/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_dma_rx_cyclically_stored/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_dma_rx_cyclically_stored/src/sample_uart_dma_rx_cyclically_stored.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_dma_tx/inc/sample_uart_dma_tx.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_dma_tx/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_dma_tx/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_dma_tx/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_dma_tx/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_dma_tx/src/sample_uart_dma_tx.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_dma_tx_dma_rx_simultaneously/inc/sample_uart_dma_tx_dma_rx_simultaneously.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_dma_tx_dma_rx_simultaneously/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_dma_tx_dma_rx_simultaneously/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_dma_tx_dma_rx_simultaneously/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_dma_tx_dma_rx_simultaneously/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_dma_tx_dma_rx_simultaneously/src/sample_uart_dma_tx_dma_rx_simultaneously.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_dma_tx_int_rx_simultaneously/inc/sample_uart_dma_tx_int_rx_simultaneously.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_dma_tx_int_rx_simultaneously/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_dma_tx_int_rx_simultaneously/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_dma_tx_int_rx_simultaneously/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_dma_tx_int_rx_simultaneously/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_dma_tx_int_rx_simultaneously/src/sample_uart_dma_tx_int_rx_simultaneously.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_int_tx_dma_rx_simultaneously/inc/sample_uart_int_tx_dma_rx_simultaneously.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_int_tx_dma_rx_simultaneously/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_int_tx_dma_rx_simultaneously/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_int_tx_dma_rx_simultaneously/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_int_tx_dma_rx_simultaneously/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_int_tx_dma_rx_simultaneously/src/sample_uart_int_tx_dma_rx_simultaneously.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_int_tx_int_rx_simultaneously/inc/sample_uart_int_tx_int_rx_simultaneously.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_int_tx_int_rx_simultaneously/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_int_tx_int_rx_simultaneously/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_int_tx_int_rx_simultaneously/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_int_tx_int_rx_simultaneously/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_int_tx_int_rx_simultaneously/src/sample_uart_int_tx_int_rx_simultaneously.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_interrupt_rx/inc/sample_uart_interrupt_rx.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_interrupt_rx/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_interrupt_rx/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_interrupt_rx/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_interrupt_rx/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_interrupt_rx/src/sample_uart_interrupt_rx.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_interrupt_tx/inc/sample_uart_interrupt_tx.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_interrupt_tx/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_interrupt_tx/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_interrupt_tx/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_interrupt_tx/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_interrupt_tx/src/sample_uart_interrupt_tx.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_interrupt_tx_after_rx/inc/sample_uart_interrupt_tx_after_rx.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_interrupt_tx_after_rx/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_interrupt_tx_after_rx/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_interrupt_tx_after_rx/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_interrupt_tx_after_rx/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_interrupt_tx_after_rx/src/sample_uart_interrupt_tx_after_rx.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_single_wire_communication/inc/sample_uart_single_wire_communication.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_single_wire_communication/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_single_wire_communication/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_single_wire_communication/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_single_wire_communication/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/uart/sample_uart_single_wire_communication/src/sample_uart_single_wire_communication.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/wdg/sample_iwdg_refresh/inc/sample_iwdg_refresh.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/wdg/sample_iwdg_refresh/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/wdg/sample_iwdg_refresh/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/wdg/sample_iwdg_refresh/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/wdg/sample_iwdg_refresh/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/wdg/sample_iwdg_refresh/src/sample_iwdg_refresh.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/wdg/sample_iwdg_reset/inc/iwdg_reset_sample.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/wdg/sample_iwdg_reset/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/wdg/sample_iwdg_reset/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/wdg/sample_iwdg_reset/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/wdg/sample_iwdg_reset/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/wdg/sample_iwdg_reset/src/iwdg_reset_sample.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/wdg/sample_wdg_reset/inc/wdg_reset_sample.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/wdg/sample_wdg_reset/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/wdg/sample_wdg_reset/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/wdg/sample_wdg_reset/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/wdg/sample_wdg_reset/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/wdg/sample_wdg_reset/src/wdg_reset_sample.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/wdg/sample_wwdg_refresh/inc/sample_wwdg_refresh.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/wdg/sample_wwdg_refresh/init/main.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/wdg/sample_wwdg_refresh/init/main.h (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/wdg/sample_wwdg_refresh/init/system_init.c (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/wdg/sample_wwdg_refresh/readme.md (100%) rename {drivers_sample => vendor/yibaina_3061M/demo/drivers_sample}/wdg/sample_wwdg_refresh/src/sample_wwdg_refresh.c (100%) rename "drivers_sample/\345\233\276\347\211\207/1726194739756.jpg" => "vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726194739756.jpg" (100%) rename "drivers_sample/\345\233\276\347\211\207/1726194776437.jpg" => "vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726194776437.jpg" (100%) rename "drivers_sample/\345\233\276\347\211\207/1726194794028.jpg" => "vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726194794028.jpg" (100%) rename "drivers_sample/\345\233\276\347\211\207/1726194824764.jpg" => "vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726194824764.jpg" (100%) rename "drivers_sample/\345\233\276\347\211\207/1726194869607.jpg" => "vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726194869607.jpg" (100%) rename "drivers_sample/\345\233\276\347\211\207/1726194906962.jpg" => "vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726194906962.jpg" (100%) rename "drivers_sample/\345\233\276\347\211\207/1726194945180.jpg" => "vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726194945180.jpg" (100%) rename "drivers_sample/\345\233\276\347\211\207/1726194962547.jpg" => "vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726194962547.jpg" (100%) rename "drivers_sample/\345\233\276\347\211\207/1726194980430.jpg" => "vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726194980430.jpg" (100%) rename "drivers_sample/\345\233\276\347\211\207/1726195007716.jpg" => "vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726195007716.jpg" (100%) rename "drivers_sample/\345\233\276\347\211\207/1726195033006.jpg" => "vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726195033006.jpg" (100%) rename "drivers_sample/\345\233\276\347\211\207/1726195055385.jpg" => "vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726195055385.jpg" (100%) rename "drivers_sample/\345\233\276\347\211\207/1726195173004.jpg" => "vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726195173004.jpg" (100%) rename "drivers_sample/\345\233\276\347\211\207/1726195185553.jpg" => "vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726195185553.jpg" (100%) rename "drivers_sample/\345\256\236\351\252\214\346\214\207\345\257\274\346\211\213\345\206\214.md" => "vendor/yibaina_3061M/demo/drivers_sample/\345\256\236\351\252\214\346\214\207\345\257\274\346\211\213\345\206\214.md" (100%) diff --git a/drivers_sample/acmp/sample_acmp_interrupt/inc/sample_acmp_interrupt.h b/vendor/yibaina_3061M/demo/drivers_sample/acmp/sample_acmp_interrupt/inc/sample_acmp_interrupt.h similarity index 100% rename from drivers_sample/acmp/sample_acmp_interrupt/inc/sample_acmp_interrupt.h rename to vendor/yibaina_3061M/demo/drivers_sample/acmp/sample_acmp_interrupt/inc/sample_acmp_interrupt.h diff --git a/drivers_sample/acmp/sample_acmp_interrupt/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/acmp/sample_acmp_interrupt/init/main.c similarity index 100% rename from drivers_sample/acmp/sample_acmp_interrupt/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/acmp/sample_acmp_interrupt/init/main.c diff --git a/drivers_sample/acmp/sample_acmp_interrupt/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/acmp/sample_acmp_interrupt/init/main.h similarity index 100% rename from drivers_sample/acmp/sample_acmp_interrupt/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/acmp/sample_acmp_interrupt/init/main.h diff --git a/drivers_sample/acmp/sample_acmp_interrupt/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/acmp/sample_acmp_interrupt/init/system_init.c similarity index 100% rename from drivers_sample/acmp/sample_acmp_interrupt/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/acmp/sample_acmp_interrupt/init/system_init.c diff --git a/drivers_sample/acmp/sample_acmp_interrupt/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/acmp/sample_acmp_interrupt/readme.md similarity index 100% rename from drivers_sample/acmp/sample_acmp_interrupt/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/acmp/sample_acmp_interrupt/readme.md diff --git a/drivers_sample/acmp/sample_acmp_interrupt/src/sample_acmp_interrupt.c b/vendor/yibaina_3061M/demo/drivers_sample/acmp/sample_acmp_interrupt/src/sample_acmp_interrupt.c similarity index 100% rename from drivers_sample/acmp/sample_acmp_interrupt/src/sample_acmp_interrupt.c rename to vendor/yibaina_3061M/demo/drivers_sample/acmp/sample_acmp_interrupt/src/sample_acmp_interrupt.c diff --git a/drivers_sample/acmp/sample_acmp_out_result/inc/sample_acmp_out_result.h b/vendor/yibaina_3061M/demo/drivers_sample/acmp/sample_acmp_out_result/inc/sample_acmp_out_result.h similarity index 100% rename from drivers_sample/acmp/sample_acmp_out_result/inc/sample_acmp_out_result.h rename to vendor/yibaina_3061M/demo/drivers_sample/acmp/sample_acmp_out_result/inc/sample_acmp_out_result.h diff --git a/drivers_sample/acmp/sample_acmp_out_result/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/acmp/sample_acmp_out_result/init/main.c similarity index 100% rename from drivers_sample/acmp/sample_acmp_out_result/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/acmp/sample_acmp_out_result/init/main.c diff --git a/drivers_sample/acmp/sample_acmp_out_result/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/acmp/sample_acmp_out_result/init/main.h similarity index 100% rename from drivers_sample/acmp/sample_acmp_out_result/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/acmp/sample_acmp_out_result/init/main.h diff --git a/drivers_sample/acmp/sample_acmp_out_result/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/acmp/sample_acmp_out_result/init/system_init.c similarity index 100% rename from drivers_sample/acmp/sample_acmp_out_result/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/acmp/sample_acmp_out_result/init/system_init.c diff --git a/drivers_sample/acmp/sample_acmp_out_result/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/acmp/sample_acmp_out_result/readme.md similarity index 100% rename from drivers_sample/acmp/sample_acmp_out_result/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/acmp/sample_acmp_out_result/readme.md diff --git a/drivers_sample/acmp/sample_acmp_out_result/src/sample_acmp_out_result.c b/vendor/yibaina_3061M/demo/drivers_sample/acmp/sample_acmp_out_result/src/sample_acmp_out_result.c similarity index 100% rename from drivers_sample/acmp/sample_acmp_out_result/src/sample_acmp_out_result.c rename to vendor/yibaina_3061M/demo/drivers_sample/acmp/sample_acmp_out_result/src/sample_acmp_out_result.c diff --git a/drivers_sample/adc/sample_adc_associative_trigger_of_apt/inc/sample_adc_associative_trigger_apt.h b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_associative_trigger_of_apt/inc/sample_adc_associative_trigger_apt.h similarity index 100% rename from drivers_sample/adc/sample_adc_associative_trigger_of_apt/inc/sample_adc_associative_trigger_apt.h rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_associative_trigger_of_apt/inc/sample_adc_associative_trigger_apt.h diff --git a/drivers_sample/adc/sample_adc_associative_trigger_of_apt/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_associative_trigger_of_apt/init/main.c similarity index 100% rename from drivers_sample/adc/sample_adc_associative_trigger_of_apt/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_associative_trigger_of_apt/init/main.c diff --git a/drivers_sample/adc/sample_adc_associative_trigger_of_apt/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_associative_trigger_of_apt/init/main.h similarity index 100% rename from drivers_sample/adc/sample_adc_associative_trigger_of_apt/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_associative_trigger_of_apt/init/main.h diff --git a/drivers_sample/adc/sample_adc_associative_trigger_of_apt/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_associative_trigger_of_apt/init/system_init.c similarity index 100% rename from drivers_sample/adc/sample_adc_associative_trigger_of_apt/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_associative_trigger_of_apt/init/system_init.c diff --git a/drivers_sample/adc/sample_adc_associative_trigger_of_apt/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_associative_trigger_of_apt/readme.md similarity index 100% rename from drivers_sample/adc/sample_adc_associative_trigger_of_apt/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_associative_trigger_of_apt/readme.md diff --git a/drivers_sample/adc/sample_adc_associative_trigger_of_apt/src/sample_adc_associative_trigger_apt.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_associative_trigger_of_apt/src/sample_adc_associative_trigger_apt.c similarity index 100% rename from drivers_sample/adc/sample_adc_associative_trigger_of_apt/src/sample_adc_associative_trigger_apt.c rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_associative_trigger_of_apt/src/sample_adc_associative_trigger_apt.c diff --git a/drivers_sample/adc/sample_adc_continue_trigger/inc/sample_adc_continue_trigger.h b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_continue_trigger/inc/sample_adc_continue_trigger.h similarity index 100% rename from drivers_sample/adc/sample_adc_continue_trigger/inc/sample_adc_continue_trigger.h rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_continue_trigger/inc/sample_adc_continue_trigger.h diff --git a/drivers_sample/adc/sample_adc_continue_trigger/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_continue_trigger/init/main.c similarity index 100% rename from drivers_sample/adc/sample_adc_continue_trigger/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_continue_trigger/init/main.c diff --git a/drivers_sample/adc/sample_adc_continue_trigger/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_continue_trigger/init/main.h similarity index 100% rename from drivers_sample/adc/sample_adc_continue_trigger/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_continue_trigger/init/main.h diff --git a/drivers_sample/adc/sample_adc_continue_trigger/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_continue_trigger/init/system_init.c similarity index 100% rename from drivers_sample/adc/sample_adc_continue_trigger/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_continue_trigger/init/system_init.c diff --git a/drivers_sample/adc/sample_adc_continue_trigger/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_continue_trigger/readme.md similarity index 100% rename from drivers_sample/adc/sample_adc_continue_trigger/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_continue_trigger/readme.md diff --git a/drivers_sample/adc/sample_adc_continue_trigger/src/sample_adc_continue_trigger.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_continue_trigger/src/sample_adc_continue_trigger.c similarity index 100% rename from drivers_sample/adc/sample_adc_continue_trigger/src/sample_adc_continue_trigger.c rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_continue_trigger/src/sample_adc_continue_trigger.c diff --git a/drivers_sample/adc/sample_adc_over_sample/inc/sample_adc_over_sample.h b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_over_sample/inc/sample_adc_over_sample.h similarity index 100% rename from drivers_sample/adc/sample_adc_over_sample/inc/sample_adc_over_sample.h rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_over_sample/inc/sample_adc_over_sample.h diff --git a/drivers_sample/adc/sample_adc_over_sample/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_over_sample/init/main.c similarity index 100% rename from drivers_sample/adc/sample_adc_over_sample/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_over_sample/init/main.c diff --git a/drivers_sample/adc/sample_adc_over_sample/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_over_sample/init/main.h similarity index 100% rename from drivers_sample/adc/sample_adc_over_sample/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_over_sample/init/main.h diff --git a/drivers_sample/adc/sample_adc_over_sample/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_over_sample/init/system_init.c similarity index 100% rename from drivers_sample/adc/sample_adc_over_sample/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_over_sample/init/system_init.c diff --git a/drivers_sample/adc/sample_adc_over_sample/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_over_sample/readme.md similarity index 100% rename from drivers_sample/adc/sample_adc_over_sample/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_over_sample/readme.md diff --git a/drivers_sample/adc/sample_adc_over_sample/src/sample_adc_over_sample.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_over_sample/src/sample_adc_over_sample.c similarity index 100% rename from drivers_sample/adc/sample_adc_over_sample/src/sample_adc_over_sample.c rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_over_sample/src/sample_adc_over_sample.c diff --git a/drivers_sample/adc/sample_adc_oversampling_it/inc/sample_adc_oversampling_it.h b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_oversampling_it/inc/sample_adc_oversampling_it.h similarity index 100% rename from drivers_sample/adc/sample_adc_oversampling_it/inc/sample_adc_oversampling_it.h rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_oversampling_it/inc/sample_adc_oversampling_it.h diff --git a/drivers_sample/adc/sample_adc_oversampling_it/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_oversampling_it/init/main.c similarity index 100% rename from drivers_sample/adc/sample_adc_oversampling_it/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_oversampling_it/init/main.c diff --git a/drivers_sample/adc/sample_adc_oversampling_it/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_oversampling_it/init/main.h similarity index 100% rename from drivers_sample/adc/sample_adc_oversampling_it/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_oversampling_it/init/main.h diff --git a/drivers_sample/adc/sample_adc_oversampling_it/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_oversampling_it/init/system_init.c similarity index 100% rename from drivers_sample/adc/sample_adc_oversampling_it/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_oversampling_it/init/system_init.c diff --git a/drivers_sample/adc/sample_adc_oversampling_it/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_oversampling_it/readme.md similarity index 100% rename from drivers_sample/adc/sample_adc_oversampling_it/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_oversampling_it/readme.md diff --git a/drivers_sample/adc/sample_adc_oversampling_it/src/sample_adc_oversampling_it.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_oversampling_it/src/sample_adc_oversampling_it.c similarity index 100% rename from drivers_sample/adc/sample_adc_oversampling_it/src/sample_adc_oversampling_it.c rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_oversampling_it/src/sample_adc_oversampling_it.c diff --git a/drivers_sample/adc/sample_adc_single_trigger/inc/sample_adc_single_trigger.h b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger/inc/sample_adc_single_trigger.h similarity index 100% rename from drivers_sample/adc/sample_adc_single_trigger/inc/sample_adc_single_trigger.h rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger/inc/sample_adc_single_trigger.h diff --git a/drivers_sample/adc/sample_adc_single_trigger/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger/init/main.c similarity index 100% rename from drivers_sample/adc/sample_adc_single_trigger/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger/init/main.c diff --git a/drivers_sample/adc/sample_adc_single_trigger/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger/init/main.h similarity index 100% rename from drivers_sample/adc/sample_adc_single_trigger/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger/init/main.h diff --git a/drivers_sample/adc/sample_adc_single_trigger/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger/init/system_init.c similarity index 100% rename from drivers_sample/adc/sample_adc_single_trigger/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger/init/system_init.c diff --git a/drivers_sample/adc/sample_adc_single_trigger/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger/readme.md similarity index 100% rename from drivers_sample/adc/sample_adc_single_trigger/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger/readme.md diff --git a/drivers_sample/adc/sample_adc_single_trigger/src/sample_adc_single_trigger.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger/src/sample_adc_single_trigger.c similarity index 100% rename from drivers_sample/adc/sample_adc_single_trigger/src/sample_adc_single_trigger.c rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger/src/sample_adc_single_trigger.c diff --git a/drivers_sample/adc/sample_adc_single_trigger_dma/inc/sample_adc_single_trigger_dma.h b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_dma/inc/sample_adc_single_trigger_dma.h similarity index 100% rename from drivers_sample/adc/sample_adc_single_trigger_dma/inc/sample_adc_single_trigger_dma.h rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_dma/inc/sample_adc_single_trigger_dma.h diff --git a/drivers_sample/adc/sample_adc_single_trigger_dma/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_dma/init/main.c similarity index 100% rename from drivers_sample/adc/sample_adc_single_trigger_dma/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_dma/init/main.c diff --git a/drivers_sample/adc/sample_adc_single_trigger_dma/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_dma/init/main.h similarity index 100% rename from drivers_sample/adc/sample_adc_single_trigger_dma/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_dma/init/main.h diff --git a/drivers_sample/adc/sample_adc_single_trigger_dma/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_dma/init/system_init.c similarity index 100% rename from drivers_sample/adc/sample_adc_single_trigger_dma/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_dma/init/system_init.c diff --git a/drivers_sample/adc/sample_adc_single_trigger_dma/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_dma/readme.md similarity index 100% rename from drivers_sample/adc/sample_adc_single_trigger_dma/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_dma/readme.md diff --git a/drivers_sample/adc/sample_adc_single_trigger_dma/src/sample_adc_single_trigger_dma.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_dma/src/sample_adc_single_trigger_dma.c similarity index 100% rename from drivers_sample/adc/sample_adc_single_trigger_dma/src/sample_adc_single_trigger_dma.c rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_dma/src/sample_adc_single_trigger_dma.c diff --git a/drivers_sample/adc/sample_adc_single_trigger_it/inc/sample_adc_single_trigger_it.h b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_it/inc/sample_adc_single_trigger_it.h similarity index 100% rename from drivers_sample/adc/sample_adc_single_trigger_it/inc/sample_adc_single_trigger_it.h rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_it/inc/sample_adc_single_trigger_it.h diff --git a/drivers_sample/adc/sample_adc_single_trigger_it/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_it/init/main.c similarity index 100% rename from drivers_sample/adc/sample_adc_single_trigger_it/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_it/init/main.c diff --git a/drivers_sample/adc/sample_adc_single_trigger_it/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_it/init/main.h similarity index 100% rename from drivers_sample/adc/sample_adc_single_trigger_it/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_it/init/main.h diff --git a/drivers_sample/adc/sample_adc_single_trigger_it/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_it/init/system_init.c similarity index 100% rename from drivers_sample/adc/sample_adc_single_trigger_it/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_it/init/system_init.c diff --git a/drivers_sample/adc/sample_adc_single_trigger_it/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_it/readme.md similarity index 100% rename from drivers_sample/adc/sample_adc_single_trigger_it/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_it/readme.md diff --git a/drivers_sample/adc/sample_adc_single_trigger_it/src/sample_adc_single_trigger_it.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_it/src/sample_adc_single_trigger_it.c similarity index 100% rename from drivers_sample/adc/sample_adc_single_trigger_it/src/sample_adc_single_trigger_it.c rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_it/src/sample_adc_single_trigger_it.c diff --git a/drivers_sample/adc/sample_adc_single_with_ppb/inc/sample_adc_single_with_ppb.h b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_with_ppb/inc/sample_adc_single_with_ppb.h similarity index 100% rename from drivers_sample/adc/sample_adc_single_with_ppb/inc/sample_adc_single_with_ppb.h rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_with_ppb/inc/sample_adc_single_with_ppb.h diff --git a/drivers_sample/adc/sample_adc_single_with_ppb/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_with_ppb/init/main.c similarity index 100% rename from drivers_sample/adc/sample_adc_single_with_ppb/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_with_ppb/init/main.c diff --git a/drivers_sample/adc/sample_adc_single_with_ppb/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_with_ppb/init/main.h similarity index 100% rename from drivers_sample/adc/sample_adc_single_with_ppb/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_with_ppb/init/main.h diff --git a/drivers_sample/adc/sample_adc_single_with_ppb/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_with_ppb/init/system_init.c similarity index 100% rename from drivers_sample/adc/sample_adc_single_with_ppb/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_with_ppb/init/system_init.c diff --git a/drivers_sample/adc/sample_adc_single_with_ppb/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_with_ppb/readme.md similarity index 100% rename from drivers_sample/adc/sample_adc_single_with_ppb/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_with_ppb/readme.md diff --git a/drivers_sample/adc/sample_adc_single_with_ppb/src/sample_adc_single_with_ppb.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_with_ppb/src/sample_adc_single_with_ppb.c similarity index 100% rename from drivers_sample/adc/sample_adc_single_with_ppb/src/sample_adc_single_with_ppb.c rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_with_ppb/src/sample_adc_single_with_ppb.c diff --git a/drivers_sample/adc/sample_adc_sync_sample/inc/sample_adc_sync_sample.h b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample/inc/sample_adc_sync_sample.h similarity index 100% rename from drivers_sample/adc/sample_adc_sync_sample/inc/sample_adc_sync_sample.h rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample/inc/sample_adc_sync_sample.h diff --git a/drivers_sample/adc/sample_adc_sync_sample/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample/init/main.c similarity index 100% rename from drivers_sample/adc/sample_adc_sync_sample/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample/init/main.c diff --git a/drivers_sample/adc/sample_adc_sync_sample/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample/init/main.h similarity index 100% rename from drivers_sample/adc/sample_adc_sync_sample/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample/init/main.h diff --git a/drivers_sample/adc/sample_adc_sync_sample/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample/init/system_init.c similarity index 100% rename from drivers_sample/adc/sample_adc_sync_sample/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample/init/system_init.c diff --git a/drivers_sample/adc/sample_adc_sync_sample/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample/readme.md similarity index 100% rename from drivers_sample/adc/sample_adc_sync_sample/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample/readme.md diff --git a/drivers_sample/adc/sample_adc_sync_sample/src/sample_adc_sync_sample.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample/src/sample_adc_sync_sample.c similarity index 100% rename from drivers_sample/adc/sample_adc_sync_sample/src/sample_adc_sync_sample.c rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample/src/sample_adc_sync_sample.c diff --git a/drivers_sample/adc/sample_adc_sync_sample_dma/inc/sample_adc_sync_sample_dma.h b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_dma/inc/sample_adc_sync_sample_dma.h similarity index 100% rename from drivers_sample/adc/sample_adc_sync_sample_dma/inc/sample_adc_sync_sample_dma.h rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_dma/inc/sample_adc_sync_sample_dma.h diff --git a/drivers_sample/adc/sample_adc_sync_sample_dma/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_dma/init/main.c similarity index 100% rename from drivers_sample/adc/sample_adc_sync_sample_dma/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_dma/init/main.c diff --git a/drivers_sample/adc/sample_adc_sync_sample_dma/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_dma/init/main.h similarity index 100% rename from drivers_sample/adc/sample_adc_sync_sample_dma/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_dma/init/main.h diff --git a/drivers_sample/adc/sample_adc_sync_sample_dma/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_dma/init/system_init.c similarity index 100% rename from drivers_sample/adc/sample_adc_sync_sample_dma/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_dma/init/system_init.c diff --git a/drivers_sample/adc/sample_adc_sync_sample_dma/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_dma/readme.md similarity index 100% rename from drivers_sample/adc/sample_adc_sync_sample_dma/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_dma/readme.md diff --git a/drivers_sample/adc/sample_adc_sync_sample_dma/src/sample_adc_sync_sample_dma.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_dma/src/sample_adc_sync_sample_dma.c similarity index 100% rename from drivers_sample/adc/sample_adc_sync_sample_dma/src/sample_adc_sync_sample_dma.c rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_dma/src/sample_adc_sync_sample_dma.c diff --git a/drivers_sample/adc/sample_adc_sync_sample_it/inc/sample_adc_sync_sample_it.h b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_it/inc/sample_adc_sync_sample_it.h similarity index 100% rename from drivers_sample/adc/sample_adc_sync_sample_it/inc/sample_adc_sync_sample_it.h rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_it/inc/sample_adc_sync_sample_it.h diff --git a/drivers_sample/adc/sample_adc_sync_sample_it/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_it/init/main.c similarity index 100% rename from drivers_sample/adc/sample_adc_sync_sample_it/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_it/init/main.c diff --git a/drivers_sample/adc/sample_adc_sync_sample_it/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_it/init/main.h similarity index 100% rename from drivers_sample/adc/sample_adc_sync_sample_it/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_it/init/main.h diff --git a/drivers_sample/adc/sample_adc_sync_sample_it/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_it/init/system_init.c similarity index 100% rename from drivers_sample/adc/sample_adc_sync_sample_it/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_it/init/system_init.c diff --git a/drivers_sample/adc/sample_adc_sync_sample_it/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_it/readme.md similarity index 100% rename from drivers_sample/adc/sample_adc_sync_sample_it/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_it/readme.md diff --git a/drivers_sample/adc/sample_adc_sync_sample_it/src/sample_adc_sync_sample_it.c b/vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_it/src/sample_adc_sync_sample_it.c similarity index 100% rename from drivers_sample/adc/sample_adc_sync_sample_it/src/sample_adc_sync_sample_it.c rename to vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_it/src/sample_adc_sync_sample_it.c diff --git a/drivers_sample/apt/sample_apt_single_resistor/inc/sample_apt_single_resistor.h b/vendor/yibaina_3061M/demo/drivers_sample/apt/sample_apt_single_resistor/inc/sample_apt_single_resistor.h similarity index 100% rename from drivers_sample/apt/sample_apt_single_resistor/inc/sample_apt_single_resistor.h rename to vendor/yibaina_3061M/demo/drivers_sample/apt/sample_apt_single_resistor/inc/sample_apt_single_resistor.h diff --git a/drivers_sample/apt/sample_apt_single_resistor/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/apt/sample_apt_single_resistor/init/main.c similarity index 100% rename from drivers_sample/apt/sample_apt_single_resistor/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/apt/sample_apt_single_resistor/init/main.c diff --git a/drivers_sample/apt/sample_apt_single_resistor/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/apt/sample_apt_single_resistor/init/main.h similarity index 100% rename from drivers_sample/apt/sample_apt_single_resistor/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/apt/sample_apt_single_resistor/init/main.h diff --git a/drivers_sample/apt/sample_apt_single_resistor/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/apt/sample_apt_single_resistor/init/system_init.c similarity index 100% rename from drivers_sample/apt/sample_apt_single_resistor/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/apt/sample_apt_single_resistor/init/system_init.c diff --git a/drivers_sample/apt/sample_apt_single_resistor/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/apt/sample_apt_single_resistor/readme.md similarity index 100% rename from drivers_sample/apt/sample_apt_single_resistor/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/apt/sample_apt_single_resistor/readme.md diff --git a/drivers_sample/apt/sample_apt_single_resistor/src/sample_apt_single_resistor.c b/vendor/yibaina_3061M/demo/drivers_sample/apt/sample_apt_single_resistor/src/sample_apt_single_resistor.c similarity index 100% rename from drivers_sample/apt/sample_apt_single_resistor/src/sample_apt_single_resistor.c rename to vendor/yibaina_3061M/demo/drivers_sample/apt/sample_apt_single_resistor/src/sample_apt_single_resistor.c diff --git a/drivers_sample/can/sample_can_send_receive/inc/sample_can_send_receive.h b/vendor/yibaina_3061M/demo/drivers_sample/can/sample_can_send_receive/inc/sample_can_send_receive.h similarity index 100% rename from drivers_sample/can/sample_can_send_receive/inc/sample_can_send_receive.h rename to vendor/yibaina_3061M/demo/drivers_sample/can/sample_can_send_receive/inc/sample_can_send_receive.h diff --git a/drivers_sample/can/sample_can_send_receive/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/can/sample_can_send_receive/init/main.c similarity index 100% rename from drivers_sample/can/sample_can_send_receive/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/can/sample_can_send_receive/init/main.c diff --git a/drivers_sample/can/sample_can_send_receive/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/can/sample_can_send_receive/init/main.h similarity index 100% rename from drivers_sample/can/sample_can_send_receive/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/can/sample_can_send_receive/init/main.h diff --git a/drivers_sample/can/sample_can_send_receive/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/can/sample_can_send_receive/init/system_init.c similarity index 100% rename from drivers_sample/can/sample_can_send_receive/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/can/sample_can_send_receive/init/system_init.c diff --git a/drivers_sample/can/sample_can_send_receive/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/can/sample_can_send_receive/readme.md similarity index 100% rename from drivers_sample/can/sample_can_send_receive/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/can/sample_can_send_receive/readme.md diff --git a/drivers_sample/can/sample_can_send_receive/src/sample_can_send_receive.c b/vendor/yibaina_3061M/demo/drivers_sample/can/sample_can_send_receive/src/sample_can_send_receive.c similarity index 100% rename from drivers_sample/can/sample_can_send_receive/src/sample_can_send_receive.c rename to vendor/yibaina_3061M/demo/drivers_sample/can/sample_can_send_receive/src/sample_can_send_receive.c diff --git a/drivers_sample/capm/capm_hall_sample/inc/capm_hall_sample.h b/vendor/yibaina_3061M/demo/drivers_sample/capm/capm_hall_sample/inc/capm_hall_sample.h similarity index 100% rename from drivers_sample/capm/capm_hall_sample/inc/capm_hall_sample.h rename to vendor/yibaina_3061M/demo/drivers_sample/capm/capm_hall_sample/inc/capm_hall_sample.h diff --git a/drivers_sample/capm/capm_hall_sample/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/capm/capm_hall_sample/init/main.c similarity index 100% rename from drivers_sample/capm/capm_hall_sample/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/capm/capm_hall_sample/init/main.c diff --git a/drivers_sample/capm/capm_hall_sample/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/capm/capm_hall_sample/init/main.h similarity index 100% rename from drivers_sample/capm/capm_hall_sample/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/capm/capm_hall_sample/init/main.h diff --git a/drivers_sample/capm/capm_hall_sample/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/capm/capm_hall_sample/init/system_init.c similarity index 100% rename from drivers_sample/capm/capm_hall_sample/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/capm/capm_hall_sample/init/system_init.c diff --git a/drivers_sample/capm/capm_hall_sample/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/capm/capm_hall_sample/readme.md similarity index 100% rename from drivers_sample/capm/capm_hall_sample/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/capm/capm_hall_sample/readme.md diff --git a/drivers_sample/capm/capm_hall_sample/src/capm_hall_sample.c b/vendor/yibaina_3061M/demo/drivers_sample/capm/capm_hall_sample/src/capm_hall_sample.c similarity index 100% rename from drivers_sample/capm/capm_hall_sample/src/capm_hall_sample.c rename to vendor/yibaina_3061M/demo/drivers_sample/capm/capm_hall_sample/src/capm_hall_sample.c diff --git a/drivers_sample/cfd/sample_cfd_check_error/inc/cfd_check_error_sample.h b/vendor/yibaina_3061M/demo/drivers_sample/cfd/sample_cfd_check_error/inc/cfd_check_error_sample.h similarity index 100% rename from drivers_sample/cfd/sample_cfd_check_error/inc/cfd_check_error_sample.h rename to vendor/yibaina_3061M/demo/drivers_sample/cfd/sample_cfd_check_error/inc/cfd_check_error_sample.h diff --git a/drivers_sample/cfd/sample_cfd_check_error/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/cfd/sample_cfd_check_error/init/main.c similarity index 100% rename from drivers_sample/cfd/sample_cfd_check_error/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/cfd/sample_cfd_check_error/init/main.c diff --git a/drivers_sample/cfd/sample_cfd_check_error/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/cfd/sample_cfd_check_error/init/main.h similarity index 100% rename from drivers_sample/cfd/sample_cfd_check_error/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/cfd/sample_cfd_check_error/init/main.h diff --git a/drivers_sample/cfd/sample_cfd_check_error/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/cfd/sample_cfd_check_error/init/system_init.c similarity index 100% rename from drivers_sample/cfd/sample_cfd_check_error/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/cfd/sample_cfd_check_error/init/system_init.c diff --git a/drivers_sample/cfd/sample_cfd_check_error/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/cfd/sample_cfd_check_error/readme.md similarity index 100% rename from drivers_sample/cfd/sample_cfd_check_error/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/cfd/sample_cfd_check_error/readme.md diff --git a/drivers_sample/cfd/sample_cfd_check_error/src/cfd_check_error_sample.c b/vendor/yibaina_3061M/demo/drivers_sample/cfd/sample_cfd_check_error/src/cfd_check_error_sample.c similarity index 100% rename from drivers_sample/cfd/sample_cfd_check_error/src/cfd_check_error_sample.c rename to vendor/yibaina_3061M/demo/drivers_sample/cfd/sample_cfd_check_error/src/cfd_check_error_sample.c diff --git a/drivers_sample/cmm/sample_cmm_check_error/inc/cmm_check_error_sample.h b/vendor/yibaina_3061M/demo/drivers_sample/cmm/sample_cmm_check_error/inc/cmm_check_error_sample.h similarity index 100% rename from drivers_sample/cmm/sample_cmm_check_error/inc/cmm_check_error_sample.h rename to vendor/yibaina_3061M/demo/drivers_sample/cmm/sample_cmm_check_error/inc/cmm_check_error_sample.h diff --git a/drivers_sample/cmm/sample_cmm_check_error/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/cmm/sample_cmm_check_error/init/main.c similarity index 100% rename from drivers_sample/cmm/sample_cmm_check_error/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/cmm/sample_cmm_check_error/init/main.c diff --git a/drivers_sample/cmm/sample_cmm_check_error/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/cmm/sample_cmm_check_error/init/main.h similarity index 100% rename from drivers_sample/cmm/sample_cmm_check_error/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/cmm/sample_cmm_check_error/init/main.h diff --git a/drivers_sample/cmm/sample_cmm_check_error/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/cmm/sample_cmm_check_error/init/system_init.c similarity index 100% rename from drivers_sample/cmm/sample_cmm_check_error/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/cmm/sample_cmm_check_error/init/system_init.c diff --git a/drivers_sample/cmm/sample_cmm_check_error/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/cmm/sample_cmm_check_error/readme.md similarity index 100% rename from drivers_sample/cmm/sample_cmm_check_error/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/cmm/sample_cmm_check_error/readme.md diff --git a/drivers_sample/cmm/sample_cmm_check_error/src/cmm_check_error_sample.c b/vendor/yibaina_3061M/demo/drivers_sample/cmm/sample_cmm_check_error/src/cmm_check_error_sample.c similarity index 100% rename from drivers_sample/cmm/sample_cmm_check_error/src/cmm_check_error_sample.c rename to vendor/yibaina_3061M/demo/drivers_sample/cmm/sample_cmm_check_error/src/cmm_check_error_sample.c diff --git a/drivers_sample/crc/sample_crc_gen_algo/inc/sample_crc_gen_algo.h b/vendor/yibaina_3061M/demo/drivers_sample/crc/sample_crc_gen_algo/inc/sample_crc_gen_algo.h similarity index 100% rename from drivers_sample/crc/sample_crc_gen_algo/inc/sample_crc_gen_algo.h rename to vendor/yibaina_3061M/demo/drivers_sample/crc/sample_crc_gen_algo/inc/sample_crc_gen_algo.h diff --git a/drivers_sample/crc/sample_crc_gen_algo/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/crc/sample_crc_gen_algo/init/main.c similarity index 100% rename from drivers_sample/crc/sample_crc_gen_algo/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/crc/sample_crc_gen_algo/init/main.c diff --git a/drivers_sample/crc/sample_crc_gen_algo/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/crc/sample_crc_gen_algo/init/main.h similarity index 100% rename from drivers_sample/crc/sample_crc_gen_algo/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/crc/sample_crc_gen_algo/init/main.h diff --git a/drivers_sample/crc/sample_crc_gen_algo/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/crc/sample_crc_gen_algo/init/system_init.c similarity index 100% rename from drivers_sample/crc/sample_crc_gen_algo/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/crc/sample_crc_gen_algo/init/system_init.c diff --git a/drivers_sample/crc/sample_crc_gen_algo/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/crc/sample_crc_gen_algo/readme.md similarity index 100% rename from drivers_sample/crc/sample_crc_gen_algo/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/crc/sample_crc_gen_algo/readme.md diff --git a/drivers_sample/crc/sample_crc_gen_algo/src/sample_crc_gen_algo.c b/vendor/yibaina_3061M/demo/drivers_sample/crc/sample_crc_gen_algo/src/sample_crc_gen_algo.c similarity index 100% rename from drivers_sample/crc/sample_crc_gen_algo/src/sample_crc_gen_algo.c rename to vendor/yibaina_3061M/demo/drivers_sample/crc/sample_crc_gen_algo/src/sample_crc_gen_algo.c diff --git a/drivers_sample/crc/sample_crc_load_algo/inc/sample_crc_load_algo.h b/vendor/yibaina_3061M/demo/drivers_sample/crc/sample_crc_load_algo/inc/sample_crc_load_algo.h similarity index 100% rename from drivers_sample/crc/sample_crc_load_algo/inc/sample_crc_load_algo.h rename to vendor/yibaina_3061M/demo/drivers_sample/crc/sample_crc_load_algo/inc/sample_crc_load_algo.h diff --git a/drivers_sample/crc/sample_crc_load_algo/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/crc/sample_crc_load_algo/init/main.c similarity index 100% rename from drivers_sample/crc/sample_crc_load_algo/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/crc/sample_crc_load_algo/init/main.c diff --git a/drivers_sample/crc/sample_crc_load_algo/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/crc/sample_crc_load_algo/init/main.h similarity index 100% rename from drivers_sample/crc/sample_crc_load_algo/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/crc/sample_crc_load_algo/init/main.h diff --git a/drivers_sample/crc/sample_crc_load_algo/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/crc/sample_crc_load_algo/init/system_init.c similarity index 100% rename from drivers_sample/crc/sample_crc_load_algo/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/crc/sample_crc_load_algo/init/system_init.c diff --git a/drivers_sample/crc/sample_crc_load_algo/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/crc/sample_crc_load_algo/readme.md similarity index 100% rename from drivers_sample/crc/sample_crc_load_algo/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/crc/sample_crc_load_algo/readme.md diff --git a/drivers_sample/crc/sample_crc_load_algo/src/sample_crc_load_algo.c b/vendor/yibaina_3061M/demo/drivers_sample/crc/sample_crc_load_algo/src/sample_crc_load_algo.c similarity index 100% rename from drivers_sample/crc/sample_crc_load_algo/src/sample_crc_load_algo.c rename to vendor/yibaina_3061M/demo/drivers_sample/crc/sample_crc_load_algo/src/sample_crc_load_algo.c diff --git a/drivers_sample/dac/sample_dac/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/dac/sample_dac/init/main.c similarity index 100% rename from drivers_sample/dac/sample_dac/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/dac/sample_dac/init/main.c diff --git a/drivers_sample/dac/sample_dac/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/dac/sample_dac/init/main.h similarity index 100% rename from drivers_sample/dac/sample_dac/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/dac/sample_dac/init/main.h diff --git a/drivers_sample/dac/sample_dac/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/dac/sample_dac/init/system_init.c similarity index 100% rename from drivers_sample/dac/sample_dac/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/dac/sample_dac/init/system_init.c diff --git a/drivers_sample/dac/sample_dac/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/dac/sample_dac/readme.md similarity index 100% rename from drivers_sample/dac/sample_dac/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/dac/sample_dac/readme.md diff --git a/drivers_sample/dma/sample_dma_list_transfer/inc/sample_dma_list_transfer.h b/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer/inc/sample_dma_list_transfer.h similarity index 100% rename from drivers_sample/dma/sample_dma_list_transfer/inc/sample_dma_list_transfer.h rename to vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer/inc/sample_dma_list_transfer.h diff --git a/drivers_sample/dma/sample_dma_list_transfer/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer/readme.md similarity index 100% rename from drivers_sample/dma/sample_dma_list_transfer/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer/readme.md diff --git a/drivers_sample/dma/sample_dma_list_transfer/src/sample_dma_list_transfer.c b/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer/src/sample_dma_list_transfer.c similarity index 100% rename from drivers_sample/dma/sample_dma_list_transfer/src/sample_dma_list_transfer.c rename to vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer/src/sample_dma_list_transfer.c diff --git a/drivers_sample/dma/sample_dma_list_transfer_continue/inc/sample_dma_list_transfer_continue.h b/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer_continue/inc/sample_dma_list_transfer_continue.h similarity index 100% rename from drivers_sample/dma/sample_dma_list_transfer_continue/inc/sample_dma_list_transfer_continue.h rename to vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer_continue/inc/sample_dma_list_transfer_continue.h diff --git a/drivers_sample/dma/sample_dma_list_transfer_continue/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer_continue/readme.md similarity index 100% rename from drivers_sample/dma/sample_dma_list_transfer_continue/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer_continue/readme.md diff --git a/drivers_sample/dma/sample_dma_list_transfer_continue/src/sample_dma_list_transfer_continue.c b/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer_continue/src/sample_dma_list_transfer_continue.c similarity index 100% rename from drivers_sample/dma/sample_dma_list_transfer_continue/src/sample_dma_list_transfer_continue.c rename to vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer_continue/src/sample_dma_list_transfer_continue.c diff --git a/drivers_sample/dma/sample_dma_list_transfer_continue/sysinit/main.c b/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer_continue/sysinit/main.c similarity index 100% rename from drivers_sample/dma/sample_dma_list_transfer_continue/sysinit/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer_continue/sysinit/main.c diff --git a/drivers_sample/dma/sample_dma_list_transfer_continue/sysinit/main.h b/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer_continue/sysinit/main.h similarity index 100% rename from drivers_sample/dma/sample_dma_list_transfer_continue/sysinit/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer_continue/sysinit/main.h diff --git a/drivers_sample/dma/sample_dma_list_transfer_continue/sysinit/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer_continue/sysinit/system_init.c similarity index 100% rename from drivers_sample/dma/sample_dma_list_transfer_continue/sysinit/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer_continue/sysinit/system_init.c diff --git a/drivers_sample/dma/sample_dma_mem_to_mem/inc/sample_dma_mem_to_mem.h b/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_mem/inc/sample_dma_mem_to_mem.h similarity index 100% rename from drivers_sample/dma/sample_dma_mem_to_mem/inc/sample_dma_mem_to_mem.h rename to vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_mem/inc/sample_dma_mem_to_mem.h diff --git a/drivers_sample/dma/sample_dma_mem_to_mem/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_mem/init/main.c similarity index 100% rename from drivers_sample/dma/sample_dma_mem_to_mem/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_mem/init/main.c diff --git a/drivers_sample/dma/sample_dma_mem_to_mem/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_mem/init/main.h similarity index 100% rename from drivers_sample/dma/sample_dma_mem_to_mem/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_mem/init/main.h diff --git a/drivers_sample/dma/sample_dma_mem_to_mem/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_mem/init/system_init.c similarity index 100% rename from drivers_sample/dma/sample_dma_mem_to_mem/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_mem/init/system_init.c diff --git a/drivers_sample/dma/sample_dma_mem_to_mem/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_mem/readme.md similarity index 100% rename from drivers_sample/dma/sample_dma_mem_to_mem/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_mem/readme.md diff --git a/drivers_sample/dma/sample_dma_mem_to_mem/src/sample_dma_mem_to_mem.c b/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_mem/src/sample_dma_mem_to_mem.c similarity index 100% rename from drivers_sample/dma/sample_dma_mem_to_mem/src/sample_dma_mem_to_mem.c rename to vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_mem/src/sample_dma_mem_to_mem.c diff --git a/drivers_sample/dma/sample_dma_mem_to_per/inc/sample_dma_mem_to_per.h b/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_per/inc/sample_dma_mem_to_per.h similarity index 100% rename from drivers_sample/dma/sample_dma_mem_to_per/inc/sample_dma_mem_to_per.h rename to vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_per/inc/sample_dma_mem_to_per.h diff --git a/drivers_sample/dma/sample_dma_mem_to_per/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_per/readme.md similarity index 100% rename from drivers_sample/dma/sample_dma_mem_to_per/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_per/readme.md diff --git a/drivers_sample/dma/sample_dma_mem_to_per/src/sample_dma_mem_to_per.c b/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_per/src/sample_dma_mem_to_per.c similarity index 100% rename from drivers_sample/dma/sample_dma_mem_to_per/src/sample_dma_mem_to_per.c rename to vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_per/src/sample_dma_mem_to_per.c diff --git a/drivers_sample/dma/sample_dma_per_to_mem/inc/sample_dma_per_to_mem.h b/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_per_to_mem/inc/sample_dma_per_to_mem.h similarity index 100% rename from drivers_sample/dma/sample_dma_per_to_mem/inc/sample_dma_per_to_mem.h rename to vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_per_to_mem/inc/sample_dma_per_to_mem.h diff --git a/drivers_sample/dma/sample_dma_per_to_mem/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_per_to_mem/readme.md similarity index 100% rename from drivers_sample/dma/sample_dma_per_to_mem/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_per_to_mem/readme.md diff --git a/drivers_sample/dma/sample_dma_per_to_mem/src/sample_dma_per_to_mem.c b/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_per_to_mem/src/sample_dma_per_to_mem.c similarity index 100% rename from drivers_sample/dma/sample_dma_per_to_mem/src/sample_dma_per_to_mem.c rename to vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_per_to_mem/src/sample_dma_per_to_mem.c diff --git a/drivers_sample/dma/sample_dma_per_to_per/inc/sample_dma_per_to_per.h b/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_per_to_per/inc/sample_dma_per_to_per.h similarity index 100% rename from drivers_sample/dma/sample_dma_per_to_per/inc/sample_dma_per_to_per.h rename to vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_per_to_per/inc/sample_dma_per_to_per.h diff --git a/drivers_sample/dma/sample_dma_per_to_per/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_per_to_per/readme.md similarity index 100% rename from drivers_sample/dma/sample_dma_per_to_per/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_per_to_per/readme.md diff --git a/drivers_sample/dma/sample_dma_per_to_per/src/sample_dma_per_to_per.c b/vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_per_to_per/src/sample_dma_per_to_per.c similarity index 100% rename from drivers_sample/dma/sample_dma_per_to_per/src/sample_dma_per_to_per.c rename to vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_per_to_per/src/sample_dma_per_to_per.c diff --git a/drivers_sample/flash/sample_flash_blocking/inc/sample_flash_blocking.h b/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking/inc/sample_flash_blocking.h similarity index 100% rename from drivers_sample/flash/sample_flash_blocking/inc/sample_flash_blocking.h rename to vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking/inc/sample_flash_blocking.h diff --git a/drivers_sample/flash/sample_flash_blocking/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking/init/main.c similarity index 100% rename from drivers_sample/flash/sample_flash_blocking/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking/init/main.c diff --git a/drivers_sample/flash/sample_flash_blocking/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking/init/main.h similarity index 100% rename from drivers_sample/flash/sample_flash_blocking/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking/init/main.h diff --git a/drivers_sample/flash/sample_flash_blocking/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking/init/system_init.c similarity index 100% rename from drivers_sample/flash/sample_flash_blocking/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking/init/system_init.c diff --git a/drivers_sample/flash/sample_flash_blocking/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking/readme.md similarity index 100% rename from drivers_sample/flash/sample_flash_blocking/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking/readme.md diff --git a/drivers_sample/flash/sample_flash_blocking/src/sample_flash_blocking.c b/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking/src/sample_flash_blocking.c similarity index 100% rename from drivers_sample/flash/sample_flash_blocking/src/sample_flash_blocking.c rename to vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking/src/sample_flash_blocking.c diff --git a/drivers_sample/flash/sample_flash_blocking_mode/inc/sample_flash_blocking_mode.h b/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking_mode/inc/sample_flash_blocking_mode.h similarity index 100% rename from drivers_sample/flash/sample_flash_blocking_mode/inc/sample_flash_blocking_mode.h rename to vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking_mode/inc/sample_flash_blocking_mode.h diff --git a/drivers_sample/flash/sample_flash_blocking_mode/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking_mode/init/main.c similarity index 100% rename from drivers_sample/flash/sample_flash_blocking_mode/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking_mode/init/main.c diff --git a/drivers_sample/flash/sample_flash_blocking_mode/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking_mode/init/main.h similarity index 100% rename from drivers_sample/flash/sample_flash_blocking_mode/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking_mode/init/main.h diff --git a/drivers_sample/flash/sample_flash_blocking_mode/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking_mode/init/system_init.c similarity index 100% rename from drivers_sample/flash/sample_flash_blocking_mode/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking_mode/init/system_init.c diff --git a/drivers_sample/flash/sample_flash_blocking_mode/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking_mode/readme.md similarity index 100% rename from drivers_sample/flash/sample_flash_blocking_mode/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking_mode/readme.md diff --git a/drivers_sample/flash/sample_flash_blocking_mode/src/sample_flash_blocking_mode.c b/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking_mode/src/sample_flash_blocking_mode.c similarity index 100% rename from drivers_sample/flash/sample_flash_blocking_mode/src/sample_flash_blocking_mode.c rename to vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking_mode/src/sample_flash_blocking_mode.c diff --git a/drivers_sample/flash/sample_flash_interrupt/inc/sample_flash_interrupt.h b/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt/inc/sample_flash_interrupt.h similarity index 100% rename from drivers_sample/flash/sample_flash_interrupt/inc/sample_flash_interrupt.h rename to vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt/inc/sample_flash_interrupt.h diff --git a/drivers_sample/flash/sample_flash_interrupt/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt/init/main.c similarity index 100% rename from drivers_sample/flash/sample_flash_interrupt/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt/init/main.c diff --git a/drivers_sample/flash/sample_flash_interrupt/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt/init/main.h similarity index 100% rename from drivers_sample/flash/sample_flash_interrupt/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt/init/main.h diff --git a/drivers_sample/flash/sample_flash_interrupt/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt/init/system_init.c similarity index 100% rename from drivers_sample/flash/sample_flash_interrupt/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt/init/system_init.c diff --git a/drivers_sample/flash/sample_flash_interrupt/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt/readme.md similarity index 100% rename from drivers_sample/flash/sample_flash_interrupt/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt/readme.md diff --git a/drivers_sample/flash/sample_flash_interrupt/src/sample_flash_interrupt.c b/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt/src/sample_flash_interrupt.c similarity index 100% rename from drivers_sample/flash/sample_flash_interrupt/src/sample_flash_interrupt.c rename to vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt/src/sample_flash_interrupt.c diff --git a/drivers_sample/flash/sample_flash_interrupt_mode/inc/sample_flash_interrupt_mode.h b/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt_mode/inc/sample_flash_interrupt_mode.h similarity index 100% rename from drivers_sample/flash/sample_flash_interrupt_mode/inc/sample_flash_interrupt_mode.h rename to vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt_mode/inc/sample_flash_interrupt_mode.h diff --git a/drivers_sample/flash/sample_flash_interrupt_mode/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt_mode/init/main.c similarity index 100% rename from drivers_sample/flash/sample_flash_interrupt_mode/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt_mode/init/main.c diff --git a/drivers_sample/flash/sample_flash_interrupt_mode/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt_mode/init/main.h similarity index 100% rename from drivers_sample/flash/sample_flash_interrupt_mode/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt_mode/init/main.h diff --git a/drivers_sample/flash/sample_flash_interrupt_mode/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt_mode/init/system_init.c similarity index 100% rename from drivers_sample/flash/sample_flash_interrupt_mode/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt_mode/init/system_init.c diff --git a/drivers_sample/flash/sample_flash_interrupt_mode/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt_mode/readme.md similarity index 100% rename from drivers_sample/flash/sample_flash_interrupt_mode/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt_mode/readme.md diff --git a/drivers_sample/flash/sample_flash_interrupt_mode/src/sample_flash_interrupt_mode.c b/vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt_mode/src/sample_flash_interrupt_mode.c similarity index 100% rename from drivers_sample/flash/sample_flash_interrupt_mode/src/sample_flash_interrupt_mode.c rename to vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt_mode/src/sample_flash_interrupt_mode.c diff --git a/drivers_sample/gpio/sample_gpio_circle/inc/gpio_circle_sample.h b/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_circle/inc/gpio_circle_sample.h similarity index 100% rename from drivers_sample/gpio/sample_gpio_circle/inc/gpio_circle_sample.h rename to vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_circle/inc/gpio_circle_sample.h diff --git a/drivers_sample/gpio/sample_gpio_circle/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_circle/init/main.c similarity index 100% rename from drivers_sample/gpio/sample_gpio_circle/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_circle/init/main.c diff --git a/drivers_sample/gpio/sample_gpio_circle/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_circle/init/main.h similarity index 100% rename from drivers_sample/gpio/sample_gpio_circle/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_circle/init/main.h diff --git a/drivers_sample/gpio/sample_gpio_circle/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_circle/init/system_init.c similarity index 100% rename from drivers_sample/gpio/sample_gpio_circle/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_circle/init/system_init.c diff --git a/drivers_sample/gpio/sample_gpio_circle/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_circle/readme.md similarity index 100% rename from drivers_sample/gpio/sample_gpio_circle/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_circle/readme.md diff --git a/drivers_sample/gpio/sample_gpio_circle/src/gpio_circle_sample.c b/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_circle/src/gpio_circle_sample.c similarity index 100% rename from drivers_sample/gpio/sample_gpio_circle/src/gpio_circle_sample.c rename to vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_circle/src/gpio_circle_sample.c diff --git a/drivers_sample/gpio/sample_gpio_interrupt/inc/gpio_interrupt_sample.h b/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_interrupt/inc/gpio_interrupt_sample.h similarity index 100% rename from drivers_sample/gpio/sample_gpio_interrupt/inc/gpio_interrupt_sample.h rename to vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_interrupt/inc/gpio_interrupt_sample.h diff --git a/drivers_sample/gpio/sample_gpio_interrupt/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_interrupt/init/main.c similarity index 100% rename from drivers_sample/gpio/sample_gpio_interrupt/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_interrupt/init/main.c diff --git a/drivers_sample/gpio/sample_gpio_interrupt/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_interrupt/init/main.h similarity index 100% rename from drivers_sample/gpio/sample_gpio_interrupt/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_interrupt/init/main.h diff --git a/drivers_sample/gpio/sample_gpio_interrupt/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_interrupt/init/system_init.c similarity index 100% rename from drivers_sample/gpio/sample_gpio_interrupt/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_interrupt/init/system_init.c diff --git a/drivers_sample/gpio/sample_gpio_interrupt/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_interrupt/readme.md similarity index 100% rename from drivers_sample/gpio/sample_gpio_interrupt/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_interrupt/readme.md diff --git a/drivers_sample/gpio/sample_gpio_interrupt/src/gpio_interrupt_sample.c b/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_interrupt/src/gpio_interrupt_sample.c similarity index 100% rename from drivers_sample/gpio/sample_gpio_interrupt/src/gpio_interrupt_sample.c rename to vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_interrupt/src/gpio_interrupt_sample.c diff --git a/drivers_sample/gpio/sample_gpio_key/inc/gpio_key_sample.h b/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_key/inc/gpio_key_sample.h similarity index 100% rename from drivers_sample/gpio/sample_gpio_key/inc/gpio_key_sample.h rename to vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_key/inc/gpio_key_sample.h diff --git a/drivers_sample/gpio/sample_gpio_key/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_key/init/main.c similarity index 100% rename from drivers_sample/gpio/sample_gpio_key/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_key/init/main.c diff --git a/drivers_sample/gpio/sample_gpio_key/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_key/init/main.h similarity index 100% rename from drivers_sample/gpio/sample_gpio_key/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_key/init/main.h diff --git a/drivers_sample/gpio/sample_gpio_key/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_key/init/system_init.c similarity index 100% rename from drivers_sample/gpio/sample_gpio_key/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_key/init/system_init.c diff --git a/drivers_sample/gpio/sample_gpio_key/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_key/readme.md similarity index 100% rename from drivers_sample/gpio/sample_gpio_key/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_key/readme.md diff --git a/drivers_sample/gpio/sample_gpio_key/src/gpio_key_sample.c b/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_key/src/gpio_key_sample.c similarity index 100% rename from drivers_sample/gpio/sample_gpio_key/src/gpio_key_sample.c rename to vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_key/src/gpio_key_sample.c diff --git a/drivers_sample/gpio/sample_gpio_led/inc/gpio_led_sample.h b/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_led/inc/gpio_led_sample.h similarity index 100% rename from drivers_sample/gpio/sample_gpio_led/inc/gpio_led_sample.h rename to vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_led/inc/gpio_led_sample.h diff --git a/drivers_sample/gpio/sample_gpio_led/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_led/init/main.c similarity index 100% rename from drivers_sample/gpio/sample_gpio_led/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_led/init/main.c diff --git a/drivers_sample/gpio/sample_gpio_led/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_led/init/main.h similarity index 100% rename from drivers_sample/gpio/sample_gpio_led/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_led/init/main.h diff --git a/drivers_sample/gpio/sample_gpio_led/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_led/init/system_init.c similarity index 100% rename from drivers_sample/gpio/sample_gpio_led/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_led/init/system_init.c diff --git a/drivers_sample/gpio/sample_gpio_led/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_led/readme.md similarity index 100% rename from drivers_sample/gpio/sample_gpio_led/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_led/readme.md diff --git a/drivers_sample/gpio/sample_gpio_led/src/gpio_led_sample.c b/vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_led/src/gpio_led_sample.c similarity index 100% rename from drivers_sample/gpio/sample_gpio_led/src/gpio_led_sample.c rename to vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_led/src/gpio_led_sample.c diff --git a/drivers_sample/gpt/sample_gpt_period_interrupt/inc/sample_gpt_period_interrupt.h b/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_period_interrupt/inc/sample_gpt_period_interrupt.h similarity index 100% rename from drivers_sample/gpt/sample_gpt_period_interrupt/inc/sample_gpt_period_interrupt.h rename to vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_period_interrupt/inc/sample_gpt_period_interrupt.h diff --git a/drivers_sample/gpt/sample_gpt_period_interrupt/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_period_interrupt/init/main.c similarity index 100% rename from drivers_sample/gpt/sample_gpt_period_interrupt/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_period_interrupt/init/main.c diff --git a/drivers_sample/gpt/sample_gpt_period_interrupt/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_period_interrupt/init/main.h similarity index 100% rename from drivers_sample/gpt/sample_gpt_period_interrupt/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_period_interrupt/init/main.h diff --git a/drivers_sample/gpt/sample_gpt_period_interrupt/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_period_interrupt/init/system_init.c similarity index 100% rename from drivers_sample/gpt/sample_gpt_period_interrupt/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_period_interrupt/init/system_init.c diff --git a/drivers_sample/gpt/sample_gpt_period_interrupt/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_period_interrupt/readme.md similarity index 100% rename from drivers_sample/gpt/sample_gpt_period_interrupt/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_period_interrupt/readme.md diff --git a/drivers_sample/gpt/sample_gpt_period_interrupt/src/sample_gpt_period_interrupt.c b/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_period_interrupt/src/sample_gpt_period_interrupt.c similarity index 100% rename from drivers_sample/gpt/sample_gpt_period_interrupt/src/sample_gpt_period_interrupt.c rename to vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_period_interrupt/src/sample_gpt_period_interrupt.c diff --git a/drivers_sample/gpt/sample_gpt_pwm_output/inc/sample_gpt_pwm_output.h b/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_pwm_output/inc/sample_gpt_pwm_output.h similarity index 100% rename from drivers_sample/gpt/sample_gpt_pwm_output/inc/sample_gpt_pwm_output.h rename to vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_pwm_output/inc/sample_gpt_pwm_output.h diff --git a/drivers_sample/gpt/sample_gpt_pwm_output/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_pwm_output/init/main.c similarity index 100% rename from drivers_sample/gpt/sample_gpt_pwm_output/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_pwm_output/init/main.c diff --git a/drivers_sample/gpt/sample_gpt_pwm_output/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_pwm_output/init/main.h similarity index 100% rename from drivers_sample/gpt/sample_gpt_pwm_output/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_pwm_output/init/main.h diff --git a/drivers_sample/gpt/sample_gpt_pwm_output/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_pwm_output/init/system_init.c similarity index 100% rename from drivers_sample/gpt/sample_gpt_pwm_output/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_pwm_output/init/system_init.c diff --git a/drivers_sample/gpt/sample_gpt_pwm_output/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_pwm_output/readme.md similarity index 100% rename from drivers_sample/gpt/sample_gpt_pwm_output/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_pwm_output/readme.md diff --git a/drivers_sample/gpt/sample_gpt_pwm_output/src/sample_gpt_pwm_output.c b/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_pwm_output/src/sample_gpt_pwm_output.c similarity index 100% rename from drivers_sample/gpt/sample_gpt_pwm_output/src/sample_gpt_pwm_output.c rename to vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_pwm_output/src/sample_gpt_pwm_output.c diff --git a/drivers_sample/gpt/sample_gpt_simplerun/inc/sample_gpt_simplerun.h b/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_simplerun/inc/sample_gpt_simplerun.h similarity index 100% rename from drivers_sample/gpt/sample_gpt_simplerun/inc/sample_gpt_simplerun.h rename to vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_simplerun/inc/sample_gpt_simplerun.h diff --git a/drivers_sample/gpt/sample_gpt_simplerun/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_simplerun/init/main.c similarity index 100% rename from drivers_sample/gpt/sample_gpt_simplerun/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_simplerun/init/main.c diff --git a/drivers_sample/gpt/sample_gpt_simplerun/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_simplerun/init/main.h similarity index 100% rename from drivers_sample/gpt/sample_gpt_simplerun/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_simplerun/init/main.h diff --git a/drivers_sample/gpt/sample_gpt_simplerun/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_simplerun/init/system_init.c similarity index 100% rename from drivers_sample/gpt/sample_gpt_simplerun/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_simplerun/init/system_init.c diff --git a/drivers_sample/gpt/sample_gpt_simplerun/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_simplerun/readme.md similarity index 100% rename from drivers_sample/gpt/sample_gpt_simplerun/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_simplerun/readme.md diff --git a/drivers_sample/gpt/sample_gpt_simplerun/src/sample_gpt_simplerun.c b/vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_simplerun/src/sample_gpt_simplerun.c similarity index 100% rename from drivers_sample/gpt/sample_gpt_simplerun/src/sample_gpt_simplerun.c rename to vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_simplerun/src/sample_gpt_simplerun.c diff --git a/drivers_sample/i2c/sample_i2c_blocking_stlm75/inc/sample_i2c_blocking_stlm75.h b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_blocking_stlm75/inc/sample_i2c_blocking_stlm75.h similarity index 100% rename from drivers_sample/i2c/sample_i2c_blocking_stlm75/inc/sample_i2c_blocking_stlm75.h rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_blocking_stlm75/inc/sample_i2c_blocking_stlm75.h diff --git a/drivers_sample/i2c/sample_i2c_blocking_stlm75/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_blocking_stlm75/init/main.c similarity index 100% rename from drivers_sample/i2c/sample_i2c_blocking_stlm75/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_blocking_stlm75/init/main.c diff --git a/drivers_sample/i2c/sample_i2c_blocking_stlm75/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_blocking_stlm75/init/main.h similarity index 100% rename from drivers_sample/i2c/sample_i2c_blocking_stlm75/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_blocking_stlm75/init/main.h diff --git a/drivers_sample/i2c/sample_i2c_blocking_stlm75/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_blocking_stlm75/init/system_init.c similarity index 100% rename from drivers_sample/i2c/sample_i2c_blocking_stlm75/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_blocking_stlm75/init/system_init.c diff --git a/drivers_sample/i2c/sample_i2c_blocking_stlm75/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_blocking_stlm75/readme.md similarity index 100% rename from drivers_sample/i2c/sample_i2c_blocking_stlm75/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_blocking_stlm75/readme.md diff --git a/drivers_sample/i2c/sample_i2c_blocking_stlm75/src/sample_i2c_blocking_stlm75.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_blocking_stlm75/src/sample_i2c_blocking_stlm75.c similarity index 100% rename from drivers_sample/i2c/sample_i2c_blocking_stlm75/src/sample_i2c_blocking_stlm75.c rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_blocking_stlm75/src/sample_i2c_blocking_stlm75.c diff --git a/drivers_sample/i2c/sample_i2c_dma_stlm75/inc/sample_i2c_dma_stlm75.h b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_dma_stlm75/inc/sample_i2c_dma_stlm75.h similarity index 100% rename from drivers_sample/i2c/sample_i2c_dma_stlm75/inc/sample_i2c_dma_stlm75.h rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_dma_stlm75/inc/sample_i2c_dma_stlm75.h diff --git a/drivers_sample/i2c/sample_i2c_dma_stlm75/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_dma_stlm75/init/main.c similarity index 100% rename from drivers_sample/i2c/sample_i2c_dma_stlm75/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_dma_stlm75/init/main.c diff --git a/drivers_sample/i2c/sample_i2c_dma_stlm75/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_dma_stlm75/init/main.h similarity index 100% rename from drivers_sample/i2c/sample_i2c_dma_stlm75/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_dma_stlm75/init/main.h diff --git a/drivers_sample/i2c/sample_i2c_dma_stlm75/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_dma_stlm75/init/system_init.c similarity index 100% rename from drivers_sample/i2c/sample_i2c_dma_stlm75/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_dma_stlm75/init/system_init.c diff --git a/drivers_sample/i2c/sample_i2c_dma_stlm75/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_dma_stlm75/readme.md similarity index 100% rename from drivers_sample/i2c/sample_i2c_dma_stlm75/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_dma_stlm75/readme.md diff --git a/drivers_sample/i2c/sample_i2c_dma_stlm75/src/sample_i2c_dma_stlm75.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_dma_stlm75/src/sample_i2c_dma_stlm75.c similarity index 100% rename from drivers_sample/i2c/sample_i2c_dma_stlm75/src/sample_i2c_dma_stlm75.c rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_dma_stlm75/src/sample_i2c_dma_stlm75.c diff --git a/drivers_sample/i2c/sample_i2c_interrupt_stlm75/inc/sample_i2c_interrupt_stlm75.h b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_interrupt_stlm75/inc/sample_i2c_interrupt_stlm75.h similarity index 100% rename from drivers_sample/i2c/sample_i2c_interrupt_stlm75/inc/sample_i2c_interrupt_stlm75.h rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_interrupt_stlm75/inc/sample_i2c_interrupt_stlm75.h diff --git a/drivers_sample/i2c/sample_i2c_interrupt_stlm75/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_interrupt_stlm75/init/main.c similarity index 100% rename from drivers_sample/i2c/sample_i2c_interrupt_stlm75/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_interrupt_stlm75/init/main.c diff --git a/drivers_sample/i2c/sample_i2c_interrupt_stlm75/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_interrupt_stlm75/init/main.h similarity index 100% rename from drivers_sample/i2c/sample_i2c_interrupt_stlm75/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_interrupt_stlm75/init/main.h diff --git a/drivers_sample/i2c/sample_i2c_interrupt_stlm75/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_interrupt_stlm75/init/system_init.c similarity index 100% rename from drivers_sample/i2c/sample_i2c_interrupt_stlm75/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_interrupt_stlm75/init/system_init.c diff --git a/drivers_sample/i2c/sample_i2c_interrupt_stlm75/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_interrupt_stlm75/readme.md similarity index 100% rename from drivers_sample/i2c/sample_i2c_interrupt_stlm75/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_interrupt_stlm75/readme.md diff --git a/drivers_sample/i2c/sample_i2c_interrupt_stlm75/src/sample_i2c_interrupt_stlm75.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_interrupt_stlm75/src/sample_i2c_interrupt_stlm75.c similarity index 100% rename from drivers_sample/i2c/sample_i2c_interrupt_stlm75/src/sample_i2c_interrupt_stlm75.c rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_interrupt_stlm75/src/sample_i2c_interrupt_stlm75.c diff --git a/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/inc/sample_i2c_master_blocking_at24c64.h b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/inc/sample_i2c_master_blocking_at24c64.h similarity index 100% rename from drivers_sample/i2c/sample_i2c_master_blocking_at24c64/inc/sample_i2c_master_blocking_at24c64.h rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/inc/sample_i2c_master_blocking_at24c64.h diff --git a/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/init/main.c similarity index 100% rename from drivers_sample/i2c/sample_i2c_master_blocking_at24c64/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/init/main.c diff --git a/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/init/main.h similarity index 100% rename from drivers_sample/i2c/sample_i2c_master_blocking_at24c64/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/init/main.h diff --git a/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/init/system_init.c similarity index 100% rename from drivers_sample/i2c/sample_i2c_master_blocking_at24c64/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/init/system_init.c diff --git a/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/readme.md similarity index 100% rename from drivers_sample/i2c/sample_i2c_master_blocking_at24c64/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/readme.md diff --git a/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/src/sample_i2c_master_blocking_at24c64.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/src/sample_i2c_master_blocking_at24c64.c similarity index 100% rename from drivers_sample/i2c/sample_i2c_master_blocking_at24c64/src/sample_i2c_master_blocking_at24c64.c rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/src/sample_i2c_master_blocking_at24c64.c diff --git a/drivers_sample/i2c/sample_i2c_master_dma_at24c64/inc/sample_i2c_master_dma_at24c64.h b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_dma_at24c64/inc/sample_i2c_master_dma_at24c64.h similarity index 100% rename from drivers_sample/i2c/sample_i2c_master_dma_at24c64/inc/sample_i2c_master_dma_at24c64.h rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_dma_at24c64/inc/sample_i2c_master_dma_at24c64.h diff --git a/drivers_sample/i2c/sample_i2c_master_dma_at24c64/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_dma_at24c64/init/main.c similarity index 100% rename from drivers_sample/i2c/sample_i2c_master_dma_at24c64/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_dma_at24c64/init/main.c diff --git a/drivers_sample/i2c/sample_i2c_master_dma_at24c64/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_dma_at24c64/init/main.h similarity index 100% rename from drivers_sample/i2c/sample_i2c_master_dma_at24c64/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_dma_at24c64/init/main.h diff --git a/drivers_sample/i2c/sample_i2c_master_dma_at24c64/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_dma_at24c64/init/system_init.c similarity index 100% rename from drivers_sample/i2c/sample_i2c_master_dma_at24c64/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_dma_at24c64/init/system_init.c diff --git a/drivers_sample/i2c/sample_i2c_master_dma_at24c64/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_dma_at24c64/readme.md similarity index 100% rename from drivers_sample/i2c/sample_i2c_master_dma_at24c64/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_dma_at24c64/readme.md diff --git a/drivers_sample/i2c/sample_i2c_master_dma_at24c64/src/sample_i2c_master_dma_at24c64.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_dma_at24c64/src/sample_i2c_master_dma_at24c64.c similarity index 100% rename from drivers_sample/i2c/sample_i2c_master_dma_at24c64/src/sample_i2c_master_dma_at24c64.c rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_dma_at24c64/src/sample_i2c_master_dma_at24c64.c diff --git a/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/inc/sample_i2c_master_interrupt_at24c64.h b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/inc/sample_i2c_master_interrupt_at24c64.h similarity index 100% rename from drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/inc/sample_i2c_master_interrupt_at24c64.h rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/inc/sample_i2c_master_interrupt_at24c64.h diff --git a/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/init/main.c similarity index 100% rename from drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/init/main.c diff --git a/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/init/main.h similarity index 100% rename from drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/init/main.h diff --git a/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/init/system_init.c similarity index 100% rename from drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/init/system_init.c diff --git a/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/readme.md similarity index 100% rename from drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/readme.md diff --git a/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/src/sample_i2c_master_interrupt_at24c64.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/src/sample_i2c_master_interrupt_at24c64.c similarity index 100% rename from drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/src/sample_i2c_master_interrupt_at24c64.c rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/src/sample_i2c_master_interrupt_at24c64.c diff --git a/drivers_sample/i2c/sample_i2c_slave_blocking/inc/sample_i2c_slave_blocking.h b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_blocking/inc/sample_i2c_slave_blocking.h similarity index 100% rename from drivers_sample/i2c/sample_i2c_slave_blocking/inc/sample_i2c_slave_blocking.h rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_blocking/inc/sample_i2c_slave_blocking.h diff --git a/drivers_sample/i2c/sample_i2c_slave_blocking/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_blocking/init/main.c similarity index 100% rename from drivers_sample/i2c/sample_i2c_slave_blocking/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_blocking/init/main.c diff --git a/drivers_sample/i2c/sample_i2c_slave_blocking/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_blocking/init/main.h similarity index 100% rename from drivers_sample/i2c/sample_i2c_slave_blocking/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_blocking/init/main.h diff --git a/drivers_sample/i2c/sample_i2c_slave_blocking/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_blocking/init/system_init.c similarity index 100% rename from drivers_sample/i2c/sample_i2c_slave_blocking/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_blocking/init/system_init.c diff --git a/drivers_sample/i2c/sample_i2c_slave_blocking/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_blocking/readme.md similarity index 100% rename from drivers_sample/i2c/sample_i2c_slave_blocking/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_blocking/readme.md diff --git a/drivers_sample/i2c/sample_i2c_slave_blocking/src/sample_i2c_slave_blocking.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_blocking/src/sample_i2c_slave_blocking.c similarity index 100% rename from drivers_sample/i2c/sample_i2c_slave_blocking/src/sample_i2c_slave_blocking.c rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_blocking/src/sample_i2c_slave_blocking.c diff --git a/drivers_sample/i2c/sample_i2c_slave_dma/inc/sample_i2c_slave_dma.h b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_dma/inc/sample_i2c_slave_dma.h similarity index 100% rename from drivers_sample/i2c/sample_i2c_slave_dma/inc/sample_i2c_slave_dma.h rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_dma/inc/sample_i2c_slave_dma.h diff --git a/drivers_sample/i2c/sample_i2c_slave_dma/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_dma/init/main.c similarity index 100% rename from drivers_sample/i2c/sample_i2c_slave_dma/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_dma/init/main.c diff --git a/drivers_sample/i2c/sample_i2c_slave_dma/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_dma/init/main.h similarity index 100% rename from drivers_sample/i2c/sample_i2c_slave_dma/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_dma/init/main.h diff --git a/drivers_sample/i2c/sample_i2c_slave_dma/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_dma/init/system_init.c similarity index 100% rename from drivers_sample/i2c/sample_i2c_slave_dma/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_dma/init/system_init.c diff --git a/drivers_sample/i2c/sample_i2c_slave_dma/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_dma/readme.md similarity index 100% rename from drivers_sample/i2c/sample_i2c_slave_dma/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_dma/readme.md diff --git a/drivers_sample/i2c/sample_i2c_slave_dma/src/sample_i2c_slave_dma.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_dma/src/sample_i2c_slave_dma.c similarity index 100% rename from drivers_sample/i2c/sample_i2c_slave_dma/src/sample_i2c_slave_dma.c rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_dma/src/sample_i2c_slave_dma.c diff --git a/drivers_sample/i2c/sample_i2c_slave_interrupt/inc/sample_i2c_slave_interrupt.h b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_interrupt/inc/sample_i2c_slave_interrupt.h similarity index 100% rename from drivers_sample/i2c/sample_i2c_slave_interrupt/inc/sample_i2c_slave_interrupt.h rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_interrupt/inc/sample_i2c_slave_interrupt.h diff --git a/drivers_sample/i2c/sample_i2c_slave_interrupt/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_interrupt/init/main.c similarity index 100% rename from drivers_sample/i2c/sample_i2c_slave_interrupt/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_interrupt/init/main.c diff --git a/drivers_sample/i2c/sample_i2c_slave_interrupt/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_interrupt/init/main.h similarity index 100% rename from drivers_sample/i2c/sample_i2c_slave_interrupt/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_interrupt/init/main.h diff --git a/drivers_sample/i2c/sample_i2c_slave_interrupt/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_interrupt/init/system_init.c similarity index 100% rename from drivers_sample/i2c/sample_i2c_slave_interrupt/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_interrupt/init/system_init.c diff --git a/drivers_sample/i2c/sample_i2c_slave_interrupt/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_interrupt/readme.md similarity index 100% rename from drivers_sample/i2c/sample_i2c_slave_interrupt/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_interrupt/readme.md diff --git a/drivers_sample/i2c/sample_i2c_slave_interrupt/src/sample_i2c_slave_interrupt.c b/vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_interrupt/src/sample_i2c_slave_interrupt.c similarity index 100% rename from drivers_sample/i2c/sample_i2c_slave_interrupt/src/sample_i2c_slave_interrupt.c rename to vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_interrupt/src/sample_i2c_slave_interrupt.c diff --git a/drivers_sample/iocmg/iolist_sample/inc/iolist_sample.h b/vendor/yibaina_3061M/demo/drivers_sample/iocmg/iolist_sample/inc/iolist_sample.h similarity index 100% rename from drivers_sample/iocmg/iolist_sample/inc/iolist_sample.h rename to vendor/yibaina_3061M/demo/drivers_sample/iocmg/iolist_sample/inc/iolist_sample.h diff --git a/drivers_sample/iocmg/iolist_sample/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/iocmg/iolist_sample/init/main.c similarity index 100% rename from drivers_sample/iocmg/iolist_sample/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/iocmg/iolist_sample/init/main.c diff --git a/drivers_sample/iocmg/iolist_sample/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/iocmg/iolist_sample/init/main.h similarity index 100% rename from drivers_sample/iocmg/iolist_sample/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/iocmg/iolist_sample/init/main.h diff --git a/drivers_sample/iocmg/iolist_sample/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/iocmg/iolist_sample/init/system_init.c similarity index 100% rename from drivers_sample/iocmg/iolist_sample/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/iocmg/iolist_sample/init/system_init.c diff --git a/drivers_sample/iocmg/iolist_sample/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/iocmg/iolist_sample/readme.md similarity index 100% rename from drivers_sample/iocmg/iolist_sample/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/iocmg/iolist_sample/readme.md diff --git a/drivers_sample/iocmg/iolist_sample/src/iolist_sample.c b/vendor/yibaina_3061M/demo/drivers_sample/iocmg/iolist_sample/src/iolist_sample.c similarity index 100% rename from drivers_sample/iocmg/iolist_sample/src/iolist_sample.c rename to vendor/yibaina_3061M/demo/drivers_sample/iocmg/iolist_sample/src/iolist_sample.c diff --git a/drivers_sample/iocmg/sample_iocfg_list/inc/sample_iocfg_list.h b/vendor/yibaina_3061M/demo/drivers_sample/iocmg/sample_iocfg_list/inc/sample_iocfg_list.h similarity index 100% rename from drivers_sample/iocmg/sample_iocfg_list/inc/sample_iocfg_list.h rename to vendor/yibaina_3061M/demo/drivers_sample/iocmg/sample_iocfg_list/inc/sample_iocfg_list.h diff --git a/drivers_sample/iocmg/sample_iocfg_list/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/iocmg/sample_iocfg_list/init/main.c similarity index 100% rename from drivers_sample/iocmg/sample_iocfg_list/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/iocmg/sample_iocfg_list/init/main.c diff --git a/drivers_sample/iocmg/sample_iocfg_list/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/iocmg/sample_iocfg_list/init/main.h similarity index 100% rename from drivers_sample/iocmg/sample_iocfg_list/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/iocmg/sample_iocfg_list/init/main.h diff --git a/drivers_sample/iocmg/sample_iocfg_list/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/iocmg/sample_iocfg_list/init/system_init.c similarity index 100% rename from drivers_sample/iocmg/sample_iocfg_list/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/iocmg/sample_iocfg_list/init/system_init.c diff --git a/drivers_sample/iocmg/sample_iocfg_list/readme.rd b/vendor/yibaina_3061M/demo/drivers_sample/iocmg/sample_iocfg_list/readme.rd similarity index 100% rename from drivers_sample/iocmg/sample_iocfg_list/readme.rd rename to vendor/yibaina_3061M/demo/drivers_sample/iocmg/sample_iocfg_list/readme.rd diff --git a/drivers_sample/iocmg/sample_iocfg_list/src/sample_iocfg_list.c b/vendor/yibaina_3061M/demo/drivers_sample/iocmg/sample_iocfg_list/src/sample_iocfg_list.c similarity index 100% rename from drivers_sample/iocmg/sample_iocfg_list/src/sample_iocfg_list.c rename to vendor/yibaina_3061M/demo/drivers_sample/iocmg/sample_iocfg_list/src/sample_iocfg_list.c diff --git a/drivers_sample/open_mcu b/vendor/yibaina_3061M/demo/drivers_sample/open_mcu similarity index 100% rename from drivers_sample/open_mcu rename to vendor/yibaina_3061M/demo/drivers_sample/open_mcu diff --git a/drivers_sample/open_mcu_1 b/vendor/yibaina_3061M/demo/drivers_sample/open_mcu_1 similarity index 100% rename from drivers_sample/open_mcu_1 rename to vendor/yibaina_3061M/demo/drivers_sample/open_mcu_1 diff --git a/drivers_sample/pga/sample_pga/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga/init/main.c similarity index 100% rename from drivers_sample/pga/sample_pga/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga/init/main.c diff --git a/drivers_sample/pga/sample_pga/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga/init/main.h similarity index 100% rename from drivers_sample/pga/sample_pga/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga/init/main.h diff --git a/drivers_sample/pga/sample_pga/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga/init/system_init.c similarity index 100% rename from drivers_sample/pga/sample_pga/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga/init/system_init.c diff --git a/drivers_sample/pga/sample_pga/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga/readme.md similarity index 100% rename from drivers_sample/pga/sample_pga/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga/readme.md diff --git a/drivers_sample/pga/sample_pga_extra_resistor/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_extra_resistor/init/main.c similarity index 100% rename from drivers_sample/pga/sample_pga_extra_resistor/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_extra_resistor/init/main.c diff --git a/drivers_sample/pga/sample_pga_extra_resistor/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_extra_resistor/init/main.h similarity index 100% rename from drivers_sample/pga/sample_pga_extra_resistor/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_extra_resistor/init/main.h diff --git a/drivers_sample/pga/sample_pga_extra_resistor/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_extra_resistor/init/system_init.c similarity index 100% rename from drivers_sample/pga/sample_pga_extra_resistor/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_extra_resistor/init/system_init.c diff --git a/drivers_sample/pga/sample_pga_extra_resistor/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_extra_resistor/readme.md similarity index 100% rename from drivers_sample/pga/sample_pga_extra_resistor/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_extra_resistor/readme.md diff --git a/drivers_sample/pga/sample_pga_result_sampling/inc/sample_pga_result_sampling.h b/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_result_sampling/inc/sample_pga_result_sampling.h similarity index 100% rename from drivers_sample/pga/sample_pga_result_sampling/inc/sample_pga_result_sampling.h rename to vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_result_sampling/inc/sample_pga_result_sampling.h diff --git a/drivers_sample/pga/sample_pga_result_sampling/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_result_sampling/init/main.c similarity index 100% rename from drivers_sample/pga/sample_pga_result_sampling/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_result_sampling/init/main.c diff --git a/drivers_sample/pga/sample_pga_result_sampling/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_result_sampling/init/main.h similarity index 100% rename from drivers_sample/pga/sample_pga_result_sampling/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_result_sampling/init/main.h diff --git a/drivers_sample/pga/sample_pga_result_sampling/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_result_sampling/init/system_init.c similarity index 100% rename from drivers_sample/pga/sample_pga_result_sampling/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_result_sampling/init/system_init.c diff --git a/drivers_sample/pga/sample_pga_result_sampling/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_result_sampling/readme.md similarity index 100% rename from drivers_sample/pga/sample_pga_result_sampling/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_result_sampling/readme.md diff --git a/drivers_sample/pga/sample_pga_result_sampling/src/sample_pga_result_sampling.c b/vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_result_sampling/src/sample_pga_result_sampling.c similarity index 100% rename from drivers_sample/pga/sample_pga_result_sampling/src/sample_pga_result_sampling.c rename to vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_result_sampling/src/sample_pga_result_sampling.c diff --git a/drivers_sample/pic/1726194739756.jpg b/vendor/yibaina_3061M/demo/drivers_sample/pic/1726194739756.jpg similarity index 100% rename from drivers_sample/pic/1726194739756.jpg rename to vendor/yibaina_3061M/demo/drivers_sample/pic/1726194739756.jpg diff --git a/drivers_sample/pic/1726194776437.jpg b/vendor/yibaina_3061M/demo/drivers_sample/pic/1726194776437.jpg similarity index 100% rename from drivers_sample/pic/1726194776437.jpg rename to vendor/yibaina_3061M/demo/drivers_sample/pic/1726194776437.jpg diff --git a/drivers_sample/pic/1726194794028.jpg b/vendor/yibaina_3061M/demo/drivers_sample/pic/1726194794028.jpg similarity index 100% rename from drivers_sample/pic/1726194794028.jpg rename to vendor/yibaina_3061M/demo/drivers_sample/pic/1726194794028.jpg diff --git a/drivers_sample/pic/1726194824764.jpg b/vendor/yibaina_3061M/demo/drivers_sample/pic/1726194824764.jpg similarity index 100% rename from drivers_sample/pic/1726194824764.jpg rename to vendor/yibaina_3061M/demo/drivers_sample/pic/1726194824764.jpg diff --git a/drivers_sample/pic/1726194869607.jpg b/vendor/yibaina_3061M/demo/drivers_sample/pic/1726194869607.jpg similarity index 100% rename from drivers_sample/pic/1726194869607.jpg rename to vendor/yibaina_3061M/demo/drivers_sample/pic/1726194869607.jpg diff --git a/drivers_sample/pic/1726194906962-1726195658552-18.jpg b/vendor/yibaina_3061M/demo/drivers_sample/pic/1726194906962-1726195658552-18.jpg similarity index 100% rename from drivers_sample/pic/1726194906962-1726195658552-18.jpg rename to vendor/yibaina_3061M/demo/drivers_sample/pic/1726194906962-1726195658552-18.jpg diff --git a/drivers_sample/pic/1726194906962.jpg b/vendor/yibaina_3061M/demo/drivers_sample/pic/1726194906962.jpg similarity index 100% rename from drivers_sample/pic/1726194906962.jpg rename to vendor/yibaina_3061M/demo/drivers_sample/pic/1726194906962.jpg diff --git a/drivers_sample/pic/1726194945180.jpg b/vendor/yibaina_3061M/demo/drivers_sample/pic/1726194945180.jpg similarity index 100% rename from drivers_sample/pic/1726194945180.jpg rename to vendor/yibaina_3061M/demo/drivers_sample/pic/1726194945180.jpg diff --git a/drivers_sample/pic/1726194962547-1726195476280-9.jpg b/vendor/yibaina_3061M/demo/drivers_sample/pic/1726194962547-1726195476280-9.jpg similarity index 100% rename from drivers_sample/pic/1726194962547-1726195476280-9.jpg rename to vendor/yibaina_3061M/demo/drivers_sample/pic/1726194962547-1726195476280-9.jpg diff --git a/drivers_sample/pic/1726194962547.jpg b/vendor/yibaina_3061M/demo/drivers_sample/pic/1726194962547.jpg similarity index 100% rename from drivers_sample/pic/1726194962547.jpg rename to vendor/yibaina_3061M/demo/drivers_sample/pic/1726194962547.jpg diff --git a/drivers_sample/pic/1726194980430.jpg b/vendor/yibaina_3061M/demo/drivers_sample/pic/1726194980430.jpg similarity index 100% rename from drivers_sample/pic/1726194980430.jpg rename to vendor/yibaina_3061M/demo/drivers_sample/pic/1726194980430.jpg diff --git a/drivers_sample/pic/1726195007716.jpg b/vendor/yibaina_3061M/demo/drivers_sample/pic/1726195007716.jpg similarity index 100% rename from drivers_sample/pic/1726195007716.jpg rename to vendor/yibaina_3061M/demo/drivers_sample/pic/1726195007716.jpg diff --git a/drivers_sample/pic/1726195033006.jpg b/vendor/yibaina_3061M/demo/drivers_sample/pic/1726195033006.jpg similarity index 100% rename from drivers_sample/pic/1726195033006.jpg rename to vendor/yibaina_3061M/demo/drivers_sample/pic/1726195033006.jpg diff --git a/drivers_sample/pic/1726195055385.jpg b/vendor/yibaina_3061M/demo/drivers_sample/pic/1726195055385.jpg similarity index 100% rename from drivers_sample/pic/1726195055385.jpg rename to vendor/yibaina_3061M/demo/drivers_sample/pic/1726195055385.jpg diff --git a/drivers_sample/pic/1726195173004.jpg b/vendor/yibaina_3061M/demo/drivers_sample/pic/1726195173004.jpg similarity index 100% rename from drivers_sample/pic/1726195173004.jpg rename to vendor/yibaina_3061M/demo/drivers_sample/pic/1726195173004.jpg diff --git a/drivers_sample/pic/1726195185553.jpg b/vendor/yibaina_3061M/demo/drivers_sample/pic/1726195185553.jpg similarity index 100% rename from drivers_sample/pic/1726195185553.jpg rename to vendor/yibaina_3061M/demo/drivers_sample/pic/1726195185553.jpg diff --git a/drivers_sample/pmc/sample_pmc_pvd/inc/sample_pmc_pvd.h b/vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_pvd/inc/sample_pmc_pvd.h similarity index 100% rename from drivers_sample/pmc/sample_pmc_pvd/inc/sample_pmc_pvd.h rename to vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_pvd/inc/sample_pmc_pvd.h diff --git a/drivers_sample/pmc/sample_pmc_pvd/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_pvd/init/main.c similarity index 100% rename from drivers_sample/pmc/sample_pmc_pvd/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_pvd/init/main.c diff --git a/drivers_sample/pmc/sample_pmc_pvd/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_pvd/init/main.h similarity index 100% rename from drivers_sample/pmc/sample_pmc_pvd/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_pvd/init/main.h diff --git a/drivers_sample/pmc/sample_pmc_pvd/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_pvd/init/system_init.c similarity index 100% rename from drivers_sample/pmc/sample_pmc_pvd/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_pvd/init/system_init.c diff --git a/drivers_sample/pmc/sample_pmc_pvd/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_pvd/readme.md similarity index 100% rename from drivers_sample/pmc/sample_pmc_pvd/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_pvd/readme.md diff --git a/drivers_sample/pmc/sample_pmc_pvd/src/sample_pmc_pvd.c b/vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_pvd/src/sample_pmc_pvd.c similarity index 100% rename from drivers_sample/pmc/sample_pmc_pvd/src/sample_pmc_pvd.c rename to vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_pvd/src/sample_pmc_pvd.c diff --git a/drivers_sample/pmc/sample_pmc_wakeup/inc/sample_pmc_wakeup.h b/vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_wakeup/inc/sample_pmc_wakeup.h similarity index 100% rename from drivers_sample/pmc/sample_pmc_wakeup/inc/sample_pmc_wakeup.h rename to vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_wakeup/inc/sample_pmc_wakeup.h diff --git a/drivers_sample/pmc/sample_pmc_wakeup/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_wakeup/init/main.c similarity index 100% rename from drivers_sample/pmc/sample_pmc_wakeup/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_wakeup/init/main.c diff --git a/drivers_sample/pmc/sample_pmc_wakeup/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_wakeup/init/main.h similarity index 100% rename from drivers_sample/pmc/sample_pmc_wakeup/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_wakeup/init/main.h diff --git a/drivers_sample/pmc/sample_pmc_wakeup/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_wakeup/init/system_init.c similarity index 100% rename from drivers_sample/pmc/sample_pmc_wakeup/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_wakeup/init/system_init.c diff --git a/drivers_sample/pmc/sample_pmc_wakeup/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_wakeup/readme.md similarity index 100% rename from drivers_sample/pmc/sample_pmc_wakeup/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_wakeup/readme.md diff --git a/drivers_sample/pmc/sample_pmc_wakeup/src/sample_pmc_wakeup.c b/vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_wakeup/src/sample_pmc_wakeup.c similarity index 100% rename from drivers_sample/pmc/sample_pmc_wakeup/src/sample_pmc_wakeup.c rename to vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_wakeup/src/sample_pmc_wakeup.c diff --git a/drivers_sample/qdm/sample_qdm_m/inc/sample_qdm_m.h b/vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_m/inc/sample_qdm_m.h similarity index 100% rename from drivers_sample/qdm/sample_qdm_m/inc/sample_qdm_m.h rename to vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_m/inc/sample_qdm_m.h diff --git a/drivers_sample/qdm/sample_qdm_m/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_m/init/main.c similarity index 100% rename from drivers_sample/qdm/sample_qdm_m/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_m/init/main.c diff --git a/drivers_sample/qdm/sample_qdm_m/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_m/init/main.h similarity index 100% rename from drivers_sample/qdm/sample_qdm_m/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_m/init/main.h diff --git a/drivers_sample/qdm/sample_qdm_m/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_m/init/system_init.c similarity index 100% rename from drivers_sample/qdm/sample_qdm_m/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_m/init/system_init.c diff --git a/drivers_sample/qdm/sample_qdm_m/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_m/readme.md similarity index 100% rename from drivers_sample/qdm/sample_qdm_m/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_m/readme.md diff --git a/drivers_sample/qdm/sample_qdm_m/src/sample_qdm_m.c b/vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_m/src/sample_qdm_m.c similarity index 100% rename from drivers_sample/qdm/sample_qdm_m/src/sample_qdm_m.c rename to vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_m/src/sample_qdm_m.c diff --git a/drivers_sample/qdm/sample_qdm_mt/inc/sample_qdm_mt.h b/vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_mt/inc/sample_qdm_mt.h similarity index 100% rename from drivers_sample/qdm/sample_qdm_mt/inc/sample_qdm_mt.h rename to vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_mt/inc/sample_qdm_mt.h diff --git a/drivers_sample/qdm/sample_qdm_mt/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_mt/init/main.c similarity index 100% rename from drivers_sample/qdm/sample_qdm_mt/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_mt/init/main.c diff --git a/drivers_sample/qdm/sample_qdm_mt/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_mt/init/main.h similarity index 100% rename from drivers_sample/qdm/sample_qdm_mt/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_mt/init/main.h diff --git a/drivers_sample/qdm/sample_qdm_mt/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_mt/init/system_init.c similarity index 100% rename from drivers_sample/qdm/sample_qdm_mt/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_mt/init/system_init.c diff --git a/drivers_sample/qdm/sample_qdm_mt/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_mt/readme.md similarity index 100% rename from drivers_sample/qdm/sample_qdm_mt/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_mt/readme.md diff --git a/drivers_sample/qdm/sample_qdm_mt/src/sample_qdm_mt.c b/vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_mt/src/sample_qdm_mt.c similarity index 100% rename from drivers_sample/qdm/sample_qdm_mt/src/sample_qdm_mt.c rename to vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_mt/src/sample_qdm_mt.c diff --git a/drivers_sample/spi/sample_spi_blocking_kta7953/inc/sample_spi_blocking_kta7953.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_kta7953/inc/sample_spi_blocking_kta7953.h similarity index 100% rename from drivers_sample/spi/sample_spi_blocking_kta7953/inc/sample_spi_blocking_kta7953.h rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_kta7953/inc/sample_spi_blocking_kta7953.h diff --git a/drivers_sample/spi/sample_spi_blocking_kta7953/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_kta7953/init/main.c similarity index 100% rename from drivers_sample/spi/sample_spi_blocking_kta7953/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_kta7953/init/main.c diff --git a/drivers_sample/spi/sample_spi_blocking_kta7953/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_kta7953/init/main.h similarity index 100% rename from drivers_sample/spi/sample_spi_blocking_kta7953/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_kta7953/init/main.h diff --git a/drivers_sample/spi/sample_spi_blocking_kta7953/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_kta7953/init/system_init.c similarity index 100% rename from drivers_sample/spi/sample_spi_blocking_kta7953/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_kta7953/init/system_init.c diff --git a/drivers_sample/spi/sample_spi_blocking_kta7953/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_kta7953/readme.md similarity index 100% rename from drivers_sample/spi/sample_spi_blocking_kta7953/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_kta7953/readme.md diff --git a/drivers_sample/spi/sample_spi_blocking_kta7953/src/sample_spi_blocking_kta7953.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_kta7953/src/sample_spi_blocking_kta7953.c similarity index 100% rename from drivers_sample/spi/sample_spi_blocking_kta7953/src/sample_spi_blocking_kta7953.c rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_kta7953/src/sample_spi_blocking_kta7953.c diff --git a/drivers_sample/spi/sample_spi_blocking_w25q32/inc/sample_spi_blocking_w25q32.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32/inc/sample_spi_blocking_w25q32.h similarity index 100% rename from drivers_sample/spi/sample_spi_blocking_w25q32/inc/sample_spi_blocking_w25q32.h rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32/inc/sample_spi_blocking_w25q32.h diff --git a/drivers_sample/spi/sample_spi_blocking_w25q32/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32/init/main.c similarity index 100% rename from drivers_sample/spi/sample_spi_blocking_w25q32/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32/init/main.c diff --git a/drivers_sample/spi/sample_spi_blocking_w25q32/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32/init/main.h similarity index 100% rename from drivers_sample/spi/sample_spi_blocking_w25q32/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32/init/main.h diff --git a/drivers_sample/spi/sample_spi_blocking_w25q32/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32/init/system_init.c similarity index 100% rename from drivers_sample/spi/sample_spi_blocking_w25q32/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32/init/system_init.c diff --git a/drivers_sample/spi/sample_spi_blocking_w25q32/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32/readme.md similarity index 100% rename from drivers_sample/spi/sample_spi_blocking_w25q32/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32/readme.md diff --git a/drivers_sample/spi/sample_spi_blocking_w25q32/src/sample_spi_blocking_w25q32.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32/src/sample_spi_blocking_w25q32.c similarity index 100% rename from drivers_sample/spi/sample_spi_blocking_w25q32/src/sample_spi_blocking_w25q32.c rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32/src/sample_spi_blocking_w25q32.c diff --git a/drivers_sample/spi/sample_spi_blocking_w25q32_internal/inc/sample_spi_blocking_w25q32_internal.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32_internal/inc/sample_spi_blocking_w25q32_internal.h similarity index 100% rename from drivers_sample/spi/sample_spi_blocking_w25q32_internal/inc/sample_spi_blocking_w25q32_internal.h rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32_internal/inc/sample_spi_blocking_w25q32_internal.h diff --git a/drivers_sample/spi/sample_spi_blocking_w25q32_internal/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32_internal/init/main.c similarity index 100% rename from drivers_sample/spi/sample_spi_blocking_w25q32_internal/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32_internal/init/main.c diff --git a/drivers_sample/spi/sample_spi_blocking_w25q32_internal/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32_internal/init/main.h similarity index 100% rename from drivers_sample/spi/sample_spi_blocking_w25q32_internal/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32_internal/init/main.h diff --git a/drivers_sample/spi/sample_spi_blocking_w25q32_internal/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32_internal/init/system_init.c similarity index 100% rename from drivers_sample/spi/sample_spi_blocking_w25q32_internal/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32_internal/init/system_init.c diff --git a/drivers_sample/spi/sample_spi_blocking_w25q32_internal/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32_internal/readme.md similarity index 100% rename from drivers_sample/spi/sample_spi_blocking_w25q32_internal/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32_internal/readme.md diff --git a/drivers_sample/spi/sample_spi_blocking_w25q32_internal/src/sample_spi_blocking_w25q32_internal.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32_internal/src/sample_spi_blocking_w25q32_internal.c similarity index 100% rename from drivers_sample/spi/sample_spi_blocking_w25q32_internal/src/sample_spi_blocking_w25q32_internal.c rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32_internal/src/sample_spi_blocking_w25q32_internal.c diff --git a/drivers_sample/spi/sample_spi_dma_kta7953/inc/sample_spi_dma_kta7953.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_kta7953/inc/sample_spi_dma_kta7953.h similarity index 100% rename from drivers_sample/spi/sample_spi_dma_kta7953/inc/sample_spi_dma_kta7953.h rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_kta7953/inc/sample_spi_dma_kta7953.h diff --git a/drivers_sample/spi/sample_spi_dma_kta7953/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_kta7953/init/main.c similarity index 100% rename from drivers_sample/spi/sample_spi_dma_kta7953/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_kta7953/init/main.c diff --git a/drivers_sample/spi/sample_spi_dma_kta7953/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_kta7953/init/main.h similarity index 100% rename from drivers_sample/spi/sample_spi_dma_kta7953/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_kta7953/init/main.h diff --git a/drivers_sample/spi/sample_spi_dma_kta7953/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_kta7953/init/system_init.c similarity index 100% rename from drivers_sample/spi/sample_spi_dma_kta7953/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_kta7953/init/system_init.c diff --git a/drivers_sample/spi/sample_spi_dma_kta7953/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_kta7953/readme.md similarity index 100% rename from drivers_sample/spi/sample_spi_dma_kta7953/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_kta7953/readme.md diff --git a/drivers_sample/spi/sample_spi_dma_kta7953/src/sample_spi_dma_kta7953.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_kta7953/src/sample_spi_dma_kta7953.c similarity index 100% rename from drivers_sample/spi/sample_spi_dma_kta7953/src/sample_spi_dma_kta7953.c rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_kta7953/src/sample_spi_dma_kta7953.c diff --git a/drivers_sample/spi/sample_spi_dma_w25q32/inc/sample_spi_dma_w25q32.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32/inc/sample_spi_dma_w25q32.h similarity index 100% rename from drivers_sample/spi/sample_spi_dma_w25q32/inc/sample_spi_dma_w25q32.h rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32/inc/sample_spi_dma_w25q32.h diff --git a/drivers_sample/spi/sample_spi_dma_w25q32/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32/init/main.c similarity index 100% rename from drivers_sample/spi/sample_spi_dma_w25q32/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32/init/main.c diff --git a/drivers_sample/spi/sample_spi_dma_w25q32/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32/init/main.h similarity index 100% rename from drivers_sample/spi/sample_spi_dma_w25q32/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32/init/main.h diff --git a/drivers_sample/spi/sample_spi_dma_w25q32/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32/init/system_init.c similarity index 100% rename from drivers_sample/spi/sample_spi_dma_w25q32/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32/init/system_init.c diff --git a/drivers_sample/spi/sample_spi_dma_w25q32/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32/readme.md similarity index 100% rename from drivers_sample/spi/sample_spi_dma_w25q32/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32/readme.md diff --git a/drivers_sample/spi/sample_spi_dma_w25q32/src/sample_spi_dma_w25q32.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32/src/sample_spi_dma_w25q32.c similarity index 100% rename from drivers_sample/spi/sample_spi_dma_w25q32/src/sample_spi_dma_w25q32.c rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32/src/sample_spi_dma_w25q32.c diff --git a/drivers_sample/spi/sample_spi_dma_w25q32_internal/inc/sample_spi_dma_w25q32_internal.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32_internal/inc/sample_spi_dma_w25q32_internal.h similarity index 100% rename from drivers_sample/spi/sample_spi_dma_w25q32_internal/inc/sample_spi_dma_w25q32_internal.h rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32_internal/inc/sample_spi_dma_w25q32_internal.h diff --git a/drivers_sample/spi/sample_spi_dma_w25q32_internal/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32_internal/init/main.c similarity index 100% rename from drivers_sample/spi/sample_spi_dma_w25q32_internal/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32_internal/init/main.c diff --git a/drivers_sample/spi/sample_spi_dma_w25q32_internal/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32_internal/init/main.h similarity index 100% rename from drivers_sample/spi/sample_spi_dma_w25q32_internal/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32_internal/init/main.h diff --git a/drivers_sample/spi/sample_spi_dma_w25q32_internal/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32_internal/init/system_init.c similarity index 100% rename from drivers_sample/spi/sample_spi_dma_w25q32_internal/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32_internal/init/system_init.c diff --git a/drivers_sample/spi/sample_spi_dma_w25q32_internal/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32_internal/readme.md similarity index 100% rename from drivers_sample/spi/sample_spi_dma_w25q32_internal/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32_internal/readme.md diff --git a/drivers_sample/spi/sample_spi_dma_w25q32_internal/src/sample_spi_dma_w25q32_internal.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32_internal/src/sample_spi_dma_w25q32_internal.c similarity index 100% rename from drivers_sample/spi/sample_spi_dma_w25q32_internal/src/sample_spi_dma_w25q32_internal.c rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32_internal/src/sample_spi_dma_w25q32_internal.c diff --git a/drivers_sample/spi/sample_spi_interrupt_kta7953/inc/sample_spi_interrupt_kta7953.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_kta7953/inc/sample_spi_interrupt_kta7953.h similarity index 100% rename from drivers_sample/spi/sample_spi_interrupt_kta7953/inc/sample_spi_interrupt_kta7953.h rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_kta7953/inc/sample_spi_interrupt_kta7953.h diff --git a/drivers_sample/spi/sample_spi_interrupt_kta7953/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_kta7953/init/main.c similarity index 100% rename from drivers_sample/spi/sample_spi_interrupt_kta7953/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_kta7953/init/main.c diff --git a/drivers_sample/spi/sample_spi_interrupt_kta7953/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_kta7953/init/main.h similarity index 100% rename from drivers_sample/spi/sample_spi_interrupt_kta7953/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_kta7953/init/main.h diff --git a/drivers_sample/spi/sample_spi_interrupt_kta7953/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_kta7953/init/system_init.c similarity index 100% rename from drivers_sample/spi/sample_spi_interrupt_kta7953/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_kta7953/init/system_init.c diff --git a/drivers_sample/spi/sample_spi_interrupt_kta7953/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_kta7953/readme.md similarity index 100% rename from drivers_sample/spi/sample_spi_interrupt_kta7953/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_kta7953/readme.md diff --git a/drivers_sample/spi/sample_spi_interrupt_kta7953/src/sample_spi_interrupt_kta7953.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_kta7953/src/sample_spi_interrupt_kta7953.c similarity index 100% rename from drivers_sample/spi/sample_spi_interrupt_kta7953/src/sample_spi_interrupt_kta7953.c rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_kta7953/src/sample_spi_interrupt_kta7953.c diff --git a/drivers_sample/spi/sample_spi_interrupt_w25q32/inc/sample_spi_interrupt_w25q32.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32/inc/sample_spi_interrupt_w25q32.h similarity index 100% rename from drivers_sample/spi/sample_spi_interrupt_w25q32/inc/sample_spi_interrupt_w25q32.h rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32/inc/sample_spi_interrupt_w25q32.h diff --git a/drivers_sample/spi/sample_spi_interrupt_w25q32/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32/init/main.c similarity index 100% rename from drivers_sample/spi/sample_spi_interrupt_w25q32/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32/init/main.c diff --git a/drivers_sample/spi/sample_spi_interrupt_w25q32/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32/init/main.h similarity index 100% rename from drivers_sample/spi/sample_spi_interrupt_w25q32/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32/init/main.h diff --git a/drivers_sample/spi/sample_spi_interrupt_w25q32/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32/init/system_init.c similarity index 100% rename from drivers_sample/spi/sample_spi_interrupt_w25q32/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32/init/system_init.c diff --git a/drivers_sample/spi/sample_spi_interrupt_w25q32/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32/readme.md similarity index 100% rename from drivers_sample/spi/sample_spi_interrupt_w25q32/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32/readme.md diff --git a/drivers_sample/spi/sample_spi_interrupt_w25q32/src/sample_spi_interrupt_w25q32.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32/src/sample_spi_interrupt_w25q32.c similarity index 100% rename from drivers_sample/spi/sample_spi_interrupt_w25q32/src/sample_spi_interrupt_w25q32.c rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32/src/sample_spi_interrupt_w25q32.c diff --git a/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/inc/sample_spi_interrupt_w25q32_internal.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/inc/sample_spi_interrupt_w25q32_internal.h similarity index 100% rename from drivers_sample/spi/sample_spi_interrupt_w25q32_internal/inc/sample_spi_interrupt_w25q32_internal.h rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/inc/sample_spi_interrupt_w25q32_internal.h diff --git a/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/init/main.c similarity index 100% rename from drivers_sample/spi/sample_spi_interrupt_w25q32_internal/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/init/main.c diff --git a/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/init/main.h similarity index 100% rename from drivers_sample/spi/sample_spi_interrupt_w25q32_internal/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/init/main.h diff --git a/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/init/system_init.c similarity index 100% rename from drivers_sample/spi/sample_spi_interrupt_w25q32_internal/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/init/system_init.c diff --git a/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/readme.md similarity index 100% rename from drivers_sample/spi/sample_spi_interrupt_w25q32_internal/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/readme.md diff --git a/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/src/sample_spi_interrupt_w25q32_internal.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/src/sample_spi_interrupt_w25q32_internal.c similarity index 100% rename from drivers_sample/spi/sample_spi_interrupt_w25q32_internal/src/sample_spi_interrupt_w25q32_internal.c rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/src/sample_spi_interrupt_w25q32_internal.c diff --git a/drivers_sample/spi/sample_spi_master/inc/sample_spi_master.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_master/inc/sample_spi_master.h similarity index 100% rename from drivers_sample/spi/sample_spi_master/inc/sample_spi_master.h rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_master/inc/sample_spi_master.h diff --git a/drivers_sample/spi/sample_spi_master/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_master/init/main.c similarity index 100% rename from drivers_sample/spi/sample_spi_master/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_master/init/main.c diff --git a/drivers_sample/spi/sample_spi_master/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_master/init/main.h similarity index 100% rename from drivers_sample/spi/sample_spi_master/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_master/init/main.h diff --git a/drivers_sample/spi/sample_spi_master/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_master/init/system_init.c similarity index 100% rename from drivers_sample/spi/sample_spi_master/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_master/init/system_init.c diff --git a/drivers_sample/spi/sample_spi_master/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_master/readme.md similarity index 100% rename from drivers_sample/spi/sample_spi_master/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_master/readme.md diff --git a/drivers_sample/spi/sample_spi_master/src/sample_spi_master.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_master/src/sample_spi_master.c similarity index 100% rename from drivers_sample/spi/sample_spi_master/src/sample_spi_master.c rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_master/src/sample_spi_master.c diff --git a/drivers_sample/spi/sample_spi_microwire_master/inc/sample_spi_microwire_master.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_master/inc/sample_spi_microwire_master.h similarity index 100% rename from drivers_sample/spi/sample_spi_microwire_master/inc/sample_spi_microwire_master.h rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_master/inc/sample_spi_microwire_master.h diff --git a/drivers_sample/spi/sample_spi_microwire_master/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_master/init/main.c similarity index 100% rename from drivers_sample/spi/sample_spi_microwire_master/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_master/init/main.c diff --git a/drivers_sample/spi/sample_spi_microwire_master/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_master/init/main.h similarity index 100% rename from drivers_sample/spi/sample_spi_microwire_master/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_master/init/main.h diff --git a/drivers_sample/spi/sample_spi_microwire_master/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_master/init/system_init.c similarity index 100% rename from drivers_sample/spi/sample_spi_microwire_master/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_master/init/system_init.c diff --git a/drivers_sample/spi/sample_spi_microwire_master/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_master/readme.md similarity index 100% rename from drivers_sample/spi/sample_spi_microwire_master/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_master/readme.md diff --git a/drivers_sample/spi/sample_spi_microwire_master/src/sample_spi_microwire_master.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_master/src/sample_spi_microwire_master.c similarity index 100% rename from drivers_sample/spi/sample_spi_microwire_master/src/sample_spi_microwire_master.c rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_master/src/sample_spi_microwire_master.c diff --git a/drivers_sample/spi/sample_spi_microwire_slave/inc/sample_spi_microwire_slave.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_slave/inc/sample_spi_microwire_slave.h similarity index 100% rename from drivers_sample/spi/sample_spi_microwire_slave/inc/sample_spi_microwire_slave.h rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_slave/inc/sample_spi_microwire_slave.h diff --git a/drivers_sample/spi/sample_spi_microwire_slave/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_slave/init/main.c similarity index 100% rename from drivers_sample/spi/sample_spi_microwire_slave/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_slave/init/main.c diff --git a/drivers_sample/spi/sample_spi_microwire_slave/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_slave/init/main.h similarity index 100% rename from drivers_sample/spi/sample_spi_microwire_slave/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_slave/init/main.h diff --git a/drivers_sample/spi/sample_spi_microwire_slave/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_slave/init/system_init.c similarity index 100% rename from drivers_sample/spi/sample_spi_microwire_slave/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_slave/init/system_init.c diff --git a/drivers_sample/spi/sample_spi_microwire_slave/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_slave/readme.md similarity index 100% rename from drivers_sample/spi/sample_spi_microwire_slave/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_slave/readme.md diff --git a/drivers_sample/spi/sample_spi_microwire_slave/src/sample_spi_microwire_slave.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_slave/src/sample_spi_microwire_slave.c similarity index 100% rename from drivers_sample/spi/sample_spi_microwire_slave/src/sample_spi_microwire_slave.c rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_slave/src/sample_spi_microwire_slave.c diff --git a/drivers_sample/spi/sample_spi_slave/inc/sample_spi_slave.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_slave/inc/sample_spi_slave.h similarity index 100% rename from drivers_sample/spi/sample_spi_slave/inc/sample_spi_slave.h rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_slave/inc/sample_spi_slave.h diff --git a/drivers_sample/spi/sample_spi_slave/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_slave/init/main.c similarity index 100% rename from drivers_sample/spi/sample_spi_slave/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_slave/init/main.c diff --git a/drivers_sample/spi/sample_spi_slave/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_slave/init/main.h similarity index 100% rename from drivers_sample/spi/sample_spi_slave/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_slave/init/main.h diff --git a/drivers_sample/spi/sample_spi_slave/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_slave/init/system_init.c similarity index 100% rename from drivers_sample/spi/sample_spi_slave/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_slave/init/system_init.c diff --git a/drivers_sample/spi/sample_spi_slave/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_slave/readme.md similarity index 100% rename from drivers_sample/spi/sample_spi_slave/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_slave/readme.md diff --git a/drivers_sample/spi/sample_spi_slave/src/sample_spi_slave.c b/vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_slave/src/sample_spi_slave.c similarity index 100% rename from drivers_sample/spi/sample_spi_slave/src/sample_spi_slave.c rename to vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_slave/src/sample_spi_slave.c diff --git a/drivers_sample/timer/sample_timer_interrupt/inc/sample_timer_interrupt.h b/vendor/yibaina_3061M/demo/drivers_sample/timer/sample_timer_interrupt/inc/sample_timer_interrupt.h similarity index 100% rename from drivers_sample/timer/sample_timer_interrupt/inc/sample_timer_interrupt.h rename to vendor/yibaina_3061M/demo/drivers_sample/timer/sample_timer_interrupt/inc/sample_timer_interrupt.h diff --git a/drivers_sample/timer/sample_timer_interrupt/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/timer/sample_timer_interrupt/init/main.c similarity index 100% rename from drivers_sample/timer/sample_timer_interrupt/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/timer/sample_timer_interrupt/init/main.c diff --git a/drivers_sample/timer/sample_timer_interrupt/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/timer/sample_timer_interrupt/init/main.h similarity index 100% rename from drivers_sample/timer/sample_timer_interrupt/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/timer/sample_timer_interrupt/init/main.h diff --git a/drivers_sample/timer/sample_timer_interrupt/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/timer/sample_timer_interrupt/init/system_init.c similarity index 100% rename from drivers_sample/timer/sample_timer_interrupt/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/timer/sample_timer_interrupt/init/system_init.c diff --git a/drivers_sample/timer/sample_timer_interrupt/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/timer/sample_timer_interrupt/readme.md similarity index 100% rename from drivers_sample/timer/sample_timer_interrupt/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/timer/sample_timer_interrupt/readme.md diff --git a/drivers_sample/timer/sample_timer_interrupt/src/sample_timer_interrupt.c b/vendor/yibaina_3061M/demo/drivers_sample/timer/sample_timer_interrupt/src/sample_timer_interrupt.c similarity index 100% rename from drivers_sample/timer/sample_timer_interrupt/src/sample_timer_interrupt.c rename to vendor/yibaina_3061M/demo/drivers_sample/timer/sample_timer_interrupt/src/sample_timer_interrupt.c diff --git a/drivers_sample/tsensor/sample_tsensor/inc/sample_tsensor.h b/vendor/yibaina_3061M/demo/drivers_sample/tsensor/sample_tsensor/inc/sample_tsensor.h similarity index 100% rename from drivers_sample/tsensor/sample_tsensor/inc/sample_tsensor.h rename to vendor/yibaina_3061M/demo/drivers_sample/tsensor/sample_tsensor/inc/sample_tsensor.h diff --git a/drivers_sample/tsensor/sample_tsensor/readme.txt b/vendor/yibaina_3061M/demo/drivers_sample/tsensor/sample_tsensor/readme.txt similarity index 100% rename from drivers_sample/tsensor/sample_tsensor/readme.txt rename to vendor/yibaina_3061M/demo/drivers_sample/tsensor/sample_tsensor/readme.txt diff --git a/drivers_sample/tsensor/sample_tsensor/src/sample_tsensor.c b/vendor/yibaina_3061M/demo/drivers_sample/tsensor/sample_tsensor/src/sample_tsensor.c similarity index 100% rename from drivers_sample/tsensor/sample_tsensor/src/sample_tsensor.c rename to vendor/yibaina_3061M/demo/drivers_sample/tsensor/sample_tsensor/src/sample_tsensor.c diff --git a/drivers_sample/uart/sample_uart_baud_detect/inc/sample_uart_baud_detect.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_baud_detect/inc/sample_uart_baud_detect.h similarity index 100% rename from drivers_sample/uart/sample_uart_baud_detect/inc/sample_uart_baud_detect.h rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_baud_detect/inc/sample_uart_baud_detect.h diff --git a/drivers_sample/uart/sample_uart_baud_detect/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_baud_detect/init/main.c similarity index 100% rename from drivers_sample/uart/sample_uart_baud_detect/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_baud_detect/init/main.c diff --git a/drivers_sample/uart/sample_uart_baud_detect/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_baud_detect/init/main.h similarity index 100% rename from drivers_sample/uart/sample_uart_baud_detect/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_baud_detect/init/main.h diff --git a/drivers_sample/uart/sample_uart_baud_detect/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_baud_detect/init/system_init.c similarity index 100% rename from drivers_sample/uart/sample_uart_baud_detect/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_baud_detect/init/system_init.c diff --git a/drivers_sample/uart/sample_uart_baud_detect/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_baud_detect/readme.md similarity index 100% rename from drivers_sample/uart/sample_uart_baud_detect/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_baud_detect/readme.md diff --git a/drivers_sample/uart/sample_uart_baud_detect/src/sample_uart_baud_detect.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_baud_detect/src/sample_uart_baud_detect.c similarity index 100% rename from drivers_sample/uart/sample_uart_baud_detect/src/sample_uart_baud_detect.c rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_baud_detect/src/sample_uart_baud_detect.c diff --git a/drivers_sample/uart/sample_uart_blocking_rx/inc/sample_uart_blocking_rx.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_rx/inc/sample_uart_blocking_rx.h similarity index 100% rename from drivers_sample/uart/sample_uart_blocking_rx/inc/sample_uart_blocking_rx.h rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_rx/inc/sample_uart_blocking_rx.h diff --git a/drivers_sample/uart/sample_uart_blocking_rx/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_rx/init/main.c similarity index 100% rename from drivers_sample/uart/sample_uart_blocking_rx/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_rx/init/main.c diff --git a/drivers_sample/uart/sample_uart_blocking_rx/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_rx/init/main.h similarity index 100% rename from drivers_sample/uart/sample_uart_blocking_rx/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_rx/init/main.h diff --git a/drivers_sample/uart/sample_uart_blocking_rx/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_rx/init/system_init.c similarity index 100% rename from drivers_sample/uart/sample_uart_blocking_rx/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_rx/init/system_init.c diff --git a/drivers_sample/uart/sample_uart_blocking_rx/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_rx/readme.md similarity index 100% rename from drivers_sample/uart/sample_uart_blocking_rx/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_rx/readme.md diff --git a/drivers_sample/uart/sample_uart_blocking_rx/src/sample_uart_blocking_rx.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_rx/src/sample_uart_blocking_rx.c similarity index 100% rename from drivers_sample/uart/sample_uart_blocking_rx/src/sample_uart_blocking_rx.c rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_rx/src/sample_uart_blocking_rx.c diff --git a/drivers_sample/uart/sample_uart_blocking_tx/inc/sample_uart_blocking_tx.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_tx/inc/sample_uart_blocking_tx.h similarity index 100% rename from drivers_sample/uart/sample_uart_blocking_tx/inc/sample_uart_blocking_tx.h rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_tx/inc/sample_uart_blocking_tx.h diff --git a/drivers_sample/uart/sample_uart_blocking_tx/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_tx/init/main.c similarity index 100% rename from drivers_sample/uart/sample_uart_blocking_tx/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_tx/init/main.c diff --git a/drivers_sample/uart/sample_uart_blocking_tx/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_tx/init/main.h similarity index 100% rename from drivers_sample/uart/sample_uart_blocking_tx/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_tx/init/main.h diff --git a/drivers_sample/uart/sample_uart_blocking_tx/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_tx/init/system_init.c similarity index 100% rename from drivers_sample/uart/sample_uart_blocking_tx/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_tx/init/system_init.c diff --git a/drivers_sample/uart/sample_uart_blocking_tx/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_tx/readme.md similarity index 100% rename from drivers_sample/uart/sample_uart_blocking_tx/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_tx/readme.md diff --git a/drivers_sample/uart/sample_uart_blocking_tx/src/sample_uart_blocking_tx.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_tx/src/sample_uart_blocking_tx.c similarity index 100% rename from drivers_sample/uart/sample_uart_blocking_tx/src/sample_uart_blocking_tx.c rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_tx/src/sample_uart_blocking_tx.c diff --git a/drivers_sample/uart/sample_uart_character_match/inc/sample_uart_character_match.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_character_match/inc/sample_uart_character_match.h similarity index 100% rename from drivers_sample/uart/sample_uart_character_match/inc/sample_uart_character_match.h rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_character_match/inc/sample_uart_character_match.h diff --git a/drivers_sample/uart/sample_uart_character_match/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_character_match/init/main.c similarity index 100% rename from drivers_sample/uart/sample_uart_character_match/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_character_match/init/main.c diff --git a/drivers_sample/uart/sample_uart_character_match/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_character_match/init/main.h similarity index 100% rename from drivers_sample/uart/sample_uart_character_match/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_character_match/init/main.h diff --git a/drivers_sample/uart/sample_uart_character_match/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_character_match/init/system_init.c similarity index 100% rename from drivers_sample/uart/sample_uart_character_match/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_character_match/init/system_init.c diff --git a/drivers_sample/uart/sample_uart_character_match/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_character_match/readme.md similarity index 100% rename from drivers_sample/uart/sample_uart_character_match/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_character_match/readme.md diff --git a/drivers_sample/uart/sample_uart_character_match/src/sample_uart_character_match.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_character_match/src/sample_uart_character_match.c similarity index 100% rename from drivers_sample/uart/sample_uart_character_match/src/sample_uart_character_match.c rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_character_match/src/sample_uart_character_match.c diff --git a/drivers_sample/uart/sample_uart_dma_rx/inc/sample_uart_dma_rx.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx/inc/sample_uart_dma_rx.h similarity index 100% rename from drivers_sample/uart/sample_uart_dma_rx/inc/sample_uart_dma_rx.h rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx/inc/sample_uart_dma_rx.h diff --git a/drivers_sample/uart/sample_uart_dma_rx/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx/init/main.c similarity index 100% rename from drivers_sample/uart/sample_uart_dma_rx/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx/init/main.c diff --git a/drivers_sample/uart/sample_uart_dma_rx/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx/init/main.h similarity index 100% rename from drivers_sample/uart/sample_uart_dma_rx/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx/init/main.h diff --git a/drivers_sample/uart/sample_uart_dma_rx/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx/init/system_init.c similarity index 100% rename from drivers_sample/uart/sample_uart_dma_rx/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx/init/system_init.c diff --git a/drivers_sample/uart/sample_uart_dma_rx/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx/readme.md similarity index 100% rename from drivers_sample/uart/sample_uart_dma_rx/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx/readme.md diff --git a/drivers_sample/uart/sample_uart_dma_rx/src/sample_uart_dma_rx.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx/src/sample_uart_dma_rx.c similarity index 100% rename from drivers_sample/uart/sample_uart_dma_rx/src/sample_uart_dma_rx.c rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx/src/sample_uart_dma_rx.c diff --git a/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/inc/sample_uart_dma_rx_cyclically_stored.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/inc/sample_uart_dma_rx_cyclically_stored.h similarity index 100% rename from drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/inc/sample_uart_dma_rx_cyclically_stored.h rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/inc/sample_uart_dma_rx_cyclically_stored.h diff --git a/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/init/main.c similarity index 100% rename from drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/init/main.c diff --git a/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/init/main.h similarity index 100% rename from drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/init/main.h diff --git a/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/init/system_init.c similarity index 100% rename from drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/init/system_init.c diff --git a/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/readme.md similarity index 100% rename from drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/readme.md diff --git a/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/src/sample_uart_dma_rx_cyclically_stored.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/src/sample_uart_dma_rx_cyclically_stored.c similarity index 100% rename from drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/src/sample_uart_dma_rx_cyclically_stored.c rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/src/sample_uart_dma_rx_cyclically_stored.c diff --git a/drivers_sample/uart/sample_uart_dma_tx/inc/sample_uart_dma_tx.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx/inc/sample_uart_dma_tx.h similarity index 100% rename from drivers_sample/uart/sample_uart_dma_tx/inc/sample_uart_dma_tx.h rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx/inc/sample_uart_dma_tx.h diff --git a/drivers_sample/uart/sample_uart_dma_tx/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx/init/main.c similarity index 100% rename from drivers_sample/uart/sample_uart_dma_tx/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx/init/main.c diff --git a/drivers_sample/uart/sample_uart_dma_tx/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx/init/main.h similarity index 100% rename from drivers_sample/uart/sample_uart_dma_tx/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx/init/main.h diff --git a/drivers_sample/uart/sample_uart_dma_tx/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx/init/system_init.c similarity index 100% rename from drivers_sample/uart/sample_uart_dma_tx/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx/init/system_init.c diff --git a/drivers_sample/uart/sample_uart_dma_tx/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx/readme.md similarity index 100% rename from drivers_sample/uart/sample_uart_dma_tx/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx/readme.md diff --git a/drivers_sample/uart/sample_uart_dma_tx/src/sample_uart_dma_tx.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx/src/sample_uart_dma_tx.c similarity index 100% rename from drivers_sample/uart/sample_uart_dma_tx/src/sample_uart_dma_tx.c rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx/src/sample_uart_dma_tx.c diff --git a/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/inc/sample_uart_dma_tx_dma_rx_simultaneously.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/inc/sample_uart_dma_tx_dma_rx_simultaneously.h similarity index 100% rename from drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/inc/sample_uart_dma_tx_dma_rx_simultaneously.h rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/inc/sample_uart_dma_tx_dma_rx_simultaneously.h diff --git a/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/init/main.c similarity index 100% rename from drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/init/main.c diff --git a/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/init/main.h similarity index 100% rename from drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/init/main.h diff --git a/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/init/system_init.c similarity index 100% rename from drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/init/system_init.c diff --git a/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/readme.md similarity index 100% rename from drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/readme.md diff --git a/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/src/sample_uart_dma_tx_dma_rx_simultaneously.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/src/sample_uart_dma_tx_dma_rx_simultaneously.c similarity index 100% rename from drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/src/sample_uart_dma_tx_dma_rx_simultaneously.c rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/src/sample_uart_dma_tx_dma_rx_simultaneously.c diff --git a/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/inc/sample_uart_dma_tx_int_rx_simultaneously.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/inc/sample_uart_dma_tx_int_rx_simultaneously.h similarity index 100% rename from drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/inc/sample_uart_dma_tx_int_rx_simultaneously.h rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/inc/sample_uart_dma_tx_int_rx_simultaneously.h diff --git a/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/init/main.c similarity index 100% rename from drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/init/main.c diff --git a/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/init/main.h similarity index 100% rename from drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/init/main.h diff --git a/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/init/system_init.c similarity index 100% rename from drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/init/system_init.c diff --git a/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/readme.md similarity index 100% rename from drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/readme.md diff --git a/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/src/sample_uart_dma_tx_int_rx_simultaneously.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/src/sample_uart_dma_tx_int_rx_simultaneously.c similarity index 100% rename from drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/src/sample_uart_dma_tx_int_rx_simultaneously.c rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/src/sample_uart_dma_tx_int_rx_simultaneously.c diff --git a/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/inc/sample_uart_int_tx_dma_rx_simultaneously.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/inc/sample_uart_int_tx_dma_rx_simultaneously.h similarity index 100% rename from drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/inc/sample_uart_int_tx_dma_rx_simultaneously.h rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/inc/sample_uart_int_tx_dma_rx_simultaneously.h diff --git a/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/init/main.c similarity index 100% rename from drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/init/main.c diff --git a/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/init/main.h similarity index 100% rename from drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/init/main.h diff --git a/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/init/system_init.c similarity index 100% rename from drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/init/system_init.c diff --git a/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/readme.md similarity index 100% rename from drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/readme.md diff --git a/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/src/sample_uart_int_tx_dma_rx_simultaneously.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/src/sample_uart_int_tx_dma_rx_simultaneously.c similarity index 100% rename from drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/src/sample_uart_int_tx_dma_rx_simultaneously.c rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/src/sample_uart_int_tx_dma_rx_simultaneously.c diff --git a/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/inc/sample_uart_int_tx_int_rx_simultaneously.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/inc/sample_uart_int_tx_int_rx_simultaneously.h similarity index 100% rename from drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/inc/sample_uart_int_tx_int_rx_simultaneously.h rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/inc/sample_uart_int_tx_int_rx_simultaneously.h diff --git a/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/init/main.c similarity index 100% rename from drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/init/main.c diff --git a/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/init/main.h similarity index 100% rename from drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/init/main.h diff --git a/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/init/system_init.c similarity index 100% rename from drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/init/system_init.c diff --git a/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/readme.md similarity index 100% rename from drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/readme.md diff --git a/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/src/sample_uart_int_tx_int_rx_simultaneously.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/src/sample_uart_int_tx_int_rx_simultaneously.c similarity index 100% rename from drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/src/sample_uart_int_tx_int_rx_simultaneously.c rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/src/sample_uart_int_tx_int_rx_simultaneously.c diff --git a/drivers_sample/uart/sample_uart_interrupt_rx/inc/sample_uart_interrupt_rx.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_rx/inc/sample_uart_interrupt_rx.h similarity index 100% rename from drivers_sample/uart/sample_uart_interrupt_rx/inc/sample_uart_interrupt_rx.h rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_rx/inc/sample_uart_interrupt_rx.h diff --git a/drivers_sample/uart/sample_uart_interrupt_rx/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_rx/init/main.c similarity index 100% rename from drivers_sample/uart/sample_uart_interrupt_rx/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_rx/init/main.c diff --git a/drivers_sample/uart/sample_uart_interrupt_rx/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_rx/init/main.h similarity index 100% rename from drivers_sample/uart/sample_uart_interrupt_rx/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_rx/init/main.h diff --git a/drivers_sample/uart/sample_uart_interrupt_rx/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_rx/init/system_init.c similarity index 100% rename from drivers_sample/uart/sample_uart_interrupt_rx/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_rx/init/system_init.c diff --git a/drivers_sample/uart/sample_uart_interrupt_rx/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_rx/readme.md similarity index 100% rename from drivers_sample/uart/sample_uart_interrupt_rx/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_rx/readme.md diff --git a/drivers_sample/uart/sample_uart_interrupt_rx/src/sample_uart_interrupt_rx.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_rx/src/sample_uart_interrupt_rx.c similarity index 100% rename from drivers_sample/uart/sample_uart_interrupt_rx/src/sample_uart_interrupt_rx.c rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_rx/src/sample_uart_interrupt_rx.c diff --git a/drivers_sample/uart/sample_uart_interrupt_tx/inc/sample_uart_interrupt_tx.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx/inc/sample_uart_interrupt_tx.h similarity index 100% rename from drivers_sample/uart/sample_uart_interrupt_tx/inc/sample_uart_interrupt_tx.h rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx/inc/sample_uart_interrupt_tx.h diff --git a/drivers_sample/uart/sample_uart_interrupt_tx/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx/init/main.c similarity index 100% rename from drivers_sample/uart/sample_uart_interrupt_tx/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx/init/main.c diff --git a/drivers_sample/uart/sample_uart_interrupt_tx/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx/init/main.h similarity index 100% rename from drivers_sample/uart/sample_uart_interrupt_tx/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx/init/main.h diff --git a/drivers_sample/uart/sample_uart_interrupt_tx/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx/init/system_init.c similarity index 100% rename from drivers_sample/uart/sample_uart_interrupt_tx/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx/init/system_init.c diff --git a/drivers_sample/uart/sample_uart_interrupt_tx/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx/readme.md similarity index 100% rename from drivers_sample/uart/sample_uart_interrupt_tx/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx/readme.md diff --git a/drivers_sample/uart/sample_uart_interrupt_tx/src/sample_uart_interrupt_tx.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx/src/sample_uart_interrupt_tx.c similarity index 100% rename from drivers_sample/uart/sample_uart_interrupt_tx/src/sample_uart_interrupt_tx.c rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx/src/sample_uart_interrupt_tx.c diff --git a/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/inc/sample_uart_interrupt_tx_after_rx.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/inc/sample_uart_interrupt_tx_after_rx.h similarity index 100% rename from drivers_sample/uart/sample_uart_interrupt_tx_after_rx/inc/sample_uart_interrupt_tx_after_rx.h rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/inc/sample_uart_interrupt_tx_after_rx.h diff --git a/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/init/main.c similarity index 100% rename from drivers_sample/uart/sample_uart_interrupt_tx_after_rx/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/init/main.c diff --git a/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/init/main.h similarity index 100% rename from drivers_sample/uart/sample_uart_interrupt_tx_after_rx/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/init/main.h diff --git a/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/init/system_init.c similarity index 100% rename from drivers_sample/uart/sample_uart_interrupt_tx_after_rx/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/init/system_init.c diff --git a/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/readme.md similarity index 100% rename from drivers_sample/uart/sample_uart_interrupt_tx_after_rx/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/readme.md diff --git a/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/src/sample_uart_interrupt_tx_after_rx.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/src/sample_uart_interrupt_tx_after_rx.c similarity index 100% rename from drivers_sample/uart/sample_uart_interrupt_tx_after_rx/src/sample_uart_interrupt_tx_after_rx.c rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/src/sample_uart_interrupt_tx_after_rx.c diff --git a/drivers_sample/uart/sample_uart_single_wire_communication/inc/sample_uart_single_wire_communication.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_single_wire_communication/inc/sample_uart_single_wire_communication.h similarity index 100% rename from drivers_sample/uart/sample_uart_single_wire_communication/inc/sample_uart_single_wire_communication.h rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_single_wire_communication/inc/sample_uart_single_wire_communication.h diff --git a/drivers_sample/uart/sample_uart_single_wire_communication/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_single_wire_communication/init/main.c similarity index 100% rename from drivers_sample/uart/sample_uart_single_wire_communication/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_single_wire_communication/init/main.c diff --git a/drivers_sample/uart/sample_uart_single_wire_communication/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_single_wire_communication/init/main.h similarity index 100% rename from drivers_sample/uart/sample_uart_single_wire_communication/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_single_wire_communication/init/main.h diff --git a/drivers_sample/uart/sample_uart_single_wire_communication/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_single_wire_communication/init/system_init.c similarity index 100% rename from drivers_sample/uart/sample_uart_single_wire_communication/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_single_wire_communication/init/system_init.c diff --git a/drivers_sample/uart/sample_uart_single_wire_communication/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_single_wire_communication/readme.md similarity index 100% rename from drivers_sample/uart/sample_uart_single_wire_communication/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_single_wire_communication/readme.md diff --git a/drivers_sample/uart/sample_uart_single_wire_communication/src/sample_uart_single_wire_communication.c b/vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_single_wire_communication/src/sample_uart_single_wire_communication.c similarity index 100% rename from drivers_sample/uart/sample_uart_single_wire_communication/src/sample_uart_single_wire_communication.c rename to vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_single_wire_communication/src/sample_uart_single_wire_communication.c diff --git a/drivers_sample/wdg/sample_iwdg_refresh/inc/sample_iwdg_refresh.h b/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_refresh/inc/sample_iwdg_refresh.h similarity index 100% rename from drivers_sample/wdg/sample_iwdg_refresh/inc/sample_iwdg_refresh.h rename to vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_refresh/inc/sample_iwdg_refresh.h diff --git a/drivers_sample/wdg/sample_iwdg_refresh/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_refresh/init/main.c similarity index 100% rename from drivers_sample/wdg/sample_iwdg_refresh/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_refresh/init/main.c diff --git a/drivers_sample/wdg/sample_iwdg_refresh/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_refresh/init/main.h similarity index 100% rename from drivers_sample/wdg/sample_iwdg_refresh/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_refresh/init/main.h diff --git a/drivers_sample/wdg/sample_iwdg_refresh/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_refresh/init/system_init.c similarity index 100% rename from drivers_sample/wdg/sample_iwdg_refresh/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_refresh/init/system_init.c diff --git a/drivers_sample/wdg/sample_iwdg_refresh/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_refresh/readme.md similarity index 100% rename from drivers_sample/wdg/sample_iwdg_refresh/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_refresh/readme.md diff --git a/drivers_sample/wdg/sample_iwdg_refresh/src/sample_iwdg_refresh.c b/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_refresh/src/sample_iwdg_refresh.c similarity index 100% rename from drivers_sample/wdg/sample_iwdg_refresh/src/sample_iwdg_refresh.c rename to vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_refresh/src/sample_iwdg_refresh.c diff --git a/drivers_sample/wdg/sample_iwdg_reset/inc/iwdg_reset_sample.h b/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_reset/inc/iwdg_reset_sample.h similarity index 100% rename from drivers_sample/wdg/sample_iwdg_reset/inc/iwdg_reset_sample.h rename to vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_reset/inc/iwdg_reset_sample.h diff --git a/drivers_sample/wdg/sample_iwdg_reset/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_reset/init/main.c similarity index 100% rename from drivers_sample/wdg/sample_iwdg_reset/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_reset/init/main.c diff --git a/drivers_sample/wdg/sample_iwdg_reset/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_reset/init/main.h similarity index 100% rename from drivers_sample/wdg/sample_iwdg_reset/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_reset/init/main.h diff --git a/drivers_sample/wdg/sample_iwdg_reset/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_reset/init/system_init.c similarity index 100% rename from drivers_sample/wdg/sample_iwdg_reset/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_reset/init/system_init.c diff --git a/drivers_sample/wdg/sample_iwdg_reset/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_reset/readme.md similarity index 100% rename from drivers_sample/wdg/sample_iwdg_reset/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_reset/readme.md diff --git a/drivers_sample/wdg/sample_iwdg_reset/src/iwdg_reset_sample.c b/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_reset/src/iwdg_reset_sample.c similarity index 100% rename from drivers_sample/wdg/sample_iwdg_reset/src/iwdg_reset_sample.c rename to vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_reset/src/iwdg_reset_sample.c diff --git a/drivers_sample/wdg/sample_wdg_reset/inc/wdg_reset_sample.h b/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wdg_reset/inc/wdg_reset_sample.h similarity index 100% rename from drivers_sample/wdg/sample_wdg_reset/inc/wdg_reset_sample.h rename to vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wdg_reset/inc/wdg_reset_sample.h diff --git a/drivers_sample/wdg/sample_wdg_reset/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wdg_reset/init/main.c similarity index 100% rename from drivers_sample/wdg/sample_wdg_reset/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wdg_reset/init/main.c diff --git a/drivers_sample/wdg/sample_wdg_reset/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wdg_reset/init/main.h similarity index 100% rename from drivers_sample/wdg/sample_wdg_reset/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wdg_reset/init/main.h diff --git a/drivers_sample/wdg/sample_wdg_reset/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wdg_reset/init/system_init.c similarity index 100% rename from drivers_sample/wdg/sample_wdg_reset/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wdg_reset/init/system_init.c diff --git a/drivers_sample/wdg/sample_wdg_reset/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wdg_reset/readme.md similarity index 100% rename from drivers_sample/wdg/sample_wdg_reset/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wdg_reset/readme.md diff --git a/drivers_sample/wdg/sample_wdg_reset/src/wdg_reset_sample.c b/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wdg_reset/src/wdg_reset_sample.c similarity index 100% rename from drivers_sample/wdg/sample_wdg_reset/src/wdg_reset_sample.c rename to vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wdg_reset/src/wdg_reset_sample.c diff --git a/drivers_sample/wdg/sample_wwdg_refresh/inc/sample_wwdg_refresh.h b/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wwdg_refresh/inc/sample_wwdg_refresh.h similarity index 100% rename from drivers_sample/wdg/sample_wwdg_refresh/inc/sample_wwdg_refresh.h rename to vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wwdg_refresh/inc/sample_wwdg_refresh.h diff --git a/drivers_sample/wdg/sample_wwdg_refresh/init/main.c b/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wwdg_refresh/init/main.c similarity index 100% rename from drivers_sample/wdg/sample_wwdg_refresh/init/main.c rename to vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wwdg_refresh/init/main.c diff --git a/drivers_sample/wdg/sample_wwdg_refresh/init/main.h b/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wwdg_refresh/init/main.h similarity index 100% rename from drivers_sample/wdg/sample_wwdg_refresh/init/main.h rename to vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wwdg_refresh/init/main.h diff --git a/drivers_sample/wdg/sample_wwdg_refresh/init/system_init.c b/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wwdg_refresh/init/system_init.c similarity index 100% rename from drivers_sample/wdg/sample_wwdg_refresh/init/system_init.c rename to vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wwdg_refresh/init/system_init.c diff --git a/drivers_sample/wdg/sample_wwdg_refresh/readme.md b/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wwdg_refresh/readme.md similarity index 100% rename from drivers_sample/wdg/sample_wwdg_refresh/readme.md rename to vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wwdg_refresh/readme.md diff --git a/drivers_sample/wdg/sample_wwdg_refresh/src/sample_wwdg_refresh.c b/vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wwdg_refresh/src/sample_wwdg_refresh.c similarity index 100% rename from drivers_sample/wdg/sample_wwdg_refresh/src/sample_wwdg_refresh.c rename to vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wwdg_refresh/src/sample_wwdg_refresh.c diff --git "a/drivers_sample/\345\233\276\347\211\207/1726194739756.jpg" "b/vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726194739756.jpg" similarity index 100% rename from "drivers_sample/\345\233\276\347\211\207/1726194739756.jpg" rename to "vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726194739756.jpg" diff --git "a/drivers_sample/\345\233\276\347\211\207/1726194776437.jpg" "b/vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726194776437.jpg" similarity index 100% rename from "drivers_sample/\345\233\276\347\211\207/1726194776437.jpg" rename to "vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726194776437.jpg" diff --git "a/drivers_sample/\345\233\276\347\211\207/1726194794028.jpg" "b/vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726194794028.jpg" similarity index 100% rename from "drivers_sample/\345\233\276\347\211\207/1726194794028.jpg" rename to "vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726194794028.jpg" diff --git "a/drivers_sample/\345\233\276\347\211\207/1726194824764.jpg" "b/vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726194824764.jpg" similarity index 100% rename from "drivers_sample/\345\233\276\347\211\207/1726194824764.jpg" rename to "vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726194824764.jpg" diff --git "a/drivers_sample/\345\233\276\347\211\207/1726194869607.jpg" "b/vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726194869607.jpg" similarity index 100% rename from "drivers_sample/\345\233\276\347\211\207/1726194869607.jpg" rename to "vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726194869607.jpg" diff --git "a/drivers_sample/\345\233\276\347\211\207/1726194906962.jpg" "b/vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726194906962.jpg" similarity index 100% rename from "drivers_sample/\345\233\276\347\211\207/1726194906962.jpg" rename to "vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726194906962.jpg" diff --git "a/drivers_sample/\345\233\276\347\211\207/1726194945180.jpg" "b/vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726194945180.jpg" similarity index 100% rename from "drivers_sample/\345\233\276\347\211\207/1726194945180.jpg" rename to "vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726194945180.jpg" diff --git "a/drivers_sample/\345\233\276\347\211\207/1726194962547.jpg" "b/vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726194962547.jpg" similarity index 100% rename from "drivers_sample/\345\233\276\347\211\207/1726194962547.jpg" rename to "vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726194962547.jpg" diff --git "a/drivers_sample/\345\233\276\347\211\207/1726194980430.jpg" "b/vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726194980430.jpg" similarity index 100% rename from "drivers_sample/\345\233\276\347\211\207/1726194980430.jpg" rename to "vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726194980430.jpg" diff --git "a/drivers_sample/\345\233\276\347\211\207/1726195007716.jpg" "b/vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726195007716.jpg" similarity index 100% rename from "drivers_sample/\345\233\276\347\211\207/1726195007716.jpg" rename to "vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726195007716.jpg" diff --git "a/drivers_sample/\345\233\276\347\211\207/1726195033006.jpg" "b/vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726195033006.jpg" similarity index 100% rename from "drivers_sample/\345\233\276\347\211\207/1726195033006.jpg" rename to "vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726195033006.jpg" diff --git "a/drivers_sample/\345\233\276\347\211\207/1726195055385.jpg" "b/vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726195055385.jpg" similarity index 100% rename from "drivers_sample/\345\233\276\347\211\207/1726195055385.jpg" rename to "vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726195055385.jpg" diff --git "a/drivers_sample/\345\233\276\347\211\207/1726195173004.jpg" "b/vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726195173004.jpg" similarity index 100% rename from "drivers_sample/\345\233\276\347\211\207/1726195173004.jpg" rename to "vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726195173004.jpg" diff --git "a/drivers_sample/\345\233\276\347\211\207/1726195185553.jpg" "b/vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726195185553.jpg" similarity index 100% rename from "drivers_sample/\345\233\276\347\211\207/1726195185553.jpg" rename to "vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726195185553.jpg" diff --git "a/drivers_sample/\345\256\236\351\252\214\346\214\207\345\257\274\346\211\213\345\206\214.md" "b/vendor/yibaina_3061M/demo/drivers_sample/\345\256\236\351\252\214\346\214\207\345\257\274\346\211\213\345\206\214.md" similarity index 100% rename from "drivers_sample/\345\256\236\351\252\214\346\214\207\345\257\274\346\211\213\345\206\214.md" rename to "vendor/yibaina_3061M/demo/drivers_sample/\345\256\236\351\252\214\346\214\207\345\257\274\346\211\213\345\206\214.md" -- Gitee From f865784a23050be1cf3e33c9fedb87a547b25d01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E5=A3=AE=E4=BC=9F?= <1161625498@qq.com> Date: Fri, 13 Sep 2024 14:05:36 +0800 Subject: [PATCH 04/10] xxxxx MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 温壮伟 <1161625498@qq.com> --- ...207\345\257\274\346\211\213\345\206\214.md" | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git "a/vendor/yibaina_3061M/demo/drivers_sample/\345\256\236\351\252\214\346\214\207\345\257\274\346\211\213\345\206\214.md" "b/vendor/yibaina_3061M/demo/drivers_sample/\345\256\236\351\252\214\346\214\207\345\257\274\346\211\213\345\206\214.md" index d15baf8e3..c677f8929 100644 --- "a/vendor/yibaina_3061M/demo/drivers_sample/\345\256\236\351\252\214\346\214\207\345\257\274\346\211\213\345\206\214.md" +++ "b/vendor/yibaina_3061M/demo/drivers_sample/\345\256\236\351\252\214\346\214\207\345\257\274\346\211\213\345\206\214.md" @@ -71,7 +71,7 @@ #### 1.1.4实验流程 -- 步骤一:open_mcu-master\src\application\drivers_sample\acmp\sample_acmp_interrupt文件夹复制到workspace\demo\user目录下(workspace自己建的该项目的工作路径) +- 步骤一:open_mcu\vendor\yibaina_3061M\demo\drivers_sample\acmp\sample_acmp_interrupt文件夹复制到workspace\demo\user目录下(workspace自己建的该项目的工作路径) - 步骤二:原理:ACMP即模拟比较器,基于比较两个模拟信号的大小,并输出一个数字信号来表示它们之间的关系。当输入信号大于参考信号时,模拟比较器输出高电平;反之,则输出低电平 @@ -308,7 +308,7 @@ ACMP接口说明请参考该手册1.1.3.4、1.1.3.5、1.1.3.6. #### 1.2.4实验流程 -- 步骤一:open_mcu-master\src\application\drivers_sample\acmp\sample_acmp_out_result文件夹复制到workspace\demo\user目录下(workspace自己建的该项目的工作路径) +- 步骤一:open_mcu\vendor\yibaina_3061M\demo\drivers_sample\acmp\sample_acmp_out_result文件夹复制到workspace\demo\user目录下(workspace自己建的该项目的工作路径) - 步骤二:原理:ACMP即模拟比较器,基于比较两个模拟信号的大小,并输出一个数字信号来表示它们之间的关系。当输入信号大于参考信号时,模拟比较器输出高电平;反之,则输出低电平 @@ -530,7 +530,7 @@ ACMP接口说明请参考该手册1.1.3.4、1.1.3.5、1.1.3.6. #### 2.1.4实验流程 -- 步骤一:open_mcu-master\src\application\drivers_sample\apt\sample_apt_single_resistor文件夹复制到workspace\demo\user目录下(workspace自己建的该项目的工作路径) +- 步骤一:open_mcu\vendor\yibaina_3061M\demo\drivers_sample\apt\sample_apt_single_resistor文件夹复制到workspace\demo\user目录下(workspace自己建的该项目的工作路径) - 步骤二:原理:APT 为高级 PWM 定时器模块,APT模块通过高级PWM信号的产生与调节,结合单电阻采样技术,实现对电机的精确速度控制和电流采样,从而优化电机的性能和效率。 @@ -887,7 +887,7 @@ ACMP接口说明请参考该手册1.1.3.4、1.1.3.5、1.1.3.6. #### 3.1.4实验流程 -- 步骤一:open_mcu-master\src\application\drivers_sample\can\sample_can_send_receive文件夹复制到workspace\demo\user目录下(workspace自己建的该项目的工作路径) +- 步骤一:open_mcu\vendor\yibaina_3061M\demo\drivers_sample\can\sample_can_send_receive文件夹复制到workspace\demo\user目录下(workspace自己建的该项目的工作路径) - 步骤二:原理:CAN总线是一种用于实时应用的串行通信协议总线,CAN总线中的数据传输通过帧的方式进行,帧类型包括数据帧、远程帧、错误帧和过载帧。数据帧负责数据从发送器到接收器的传输,远程帧用于请求相同数据,错误帧在检测到总线错误时发出,过载帧提供两数据帧或远程帧之间的延时。 @@ -1063,7 +1063,7 @@ ACMP接口说明请参考该手册1.1.3.4、1.1.3.5、1.1.3.6. #### 4.1.4实验流程 -- 步骤一:open_mcu-master\src\application\drivers_sample\capm\capm_hall_sample文件夹复制到workspace\demo\user目录下(workspace自己建的该项目的工作路径) +- 步骤一:open_mcu\vendor\yibaina_3061M\demo\drivers_sample\capm\capm_hall_sample文件夹复制到workspace\demo\user目录下(workspace自己建的该项目的工作路径) - 步骤二:原理:通过检测霍尔元件的状态变化,可以确定电机转子的角度和位置,从原理图和用户手册可以分析出开发板通过CAPM0_IN(GPIO5_0)获取电机一个HALL传感器的电平信息,然后通过串口打印出数据,核心代码如下方所示。 @@ -1298,7 +1298,7 @@ ACMP接口说明请参考该手册1.1.3.4、1.1.3.5、1.1.3.6. #### 5.1.4实验流程 -- 步骤一:open_mcu-master\src\application\drivers_sample\cfd\sample_cfd_check_error文件夹复制到workspace\demo\user目录下(workspace自己建的该项目的工作路径) +- 步骤一:oopen_mcu\vendor\yibaina_3061M\demo\drivers_sample\cfd\sample_cfd_check_error文件夹复制到workspace\demo\user目录下(workspace自己建的该项目的工作路径) - 步骤二:CFD注入错误前后监测目标时钟异常功能,核心代码如下方所示。 @@ -1479,7 +1479,7 @@ ACMP接口说明请参考该手册1.1.3.4、1.1.3.5、1.1.3.6. #### 6.1.4实验流程 -- 步骤一:open_mcu-master\src\application\drivers_sample\cmm\sample_cmm_check_error文件夹复制到workspace\demo\user目录下(workspace自己建的该项目的工作路径) +- 步骤一:open_mcu\vendor\yibaina_3061M\demo\drivers_sample\cmm\sample_cmm_check_error文件夹复制到workspace\demo\user目录下(workspace自己建的该项目的工作路径) - 步骤二:原理:CMM时钟的频率监测功能通过高精度时钟同步技术和先进的频率测量技术,实现了对时钟频率的高精度测量和同步,cmm注入错误前后监测目标时钟异常功能,核心代码如下方所示。 @@ -1669,7 +1669,7 @@ ACMP接口说明请参考该手册1.1.3.4、1.1.3.5、1.1.3.6. #### 7.1.4实验流程 -- 步骤一:open_mcu-master\src\application\drivers_sample\crc\sample_crc_gen_algo文件夹复制到workspace\demo\user目录下(workspace自己建的该项目的工作路径) +- 步骤一:open_mcu\vendor\yibaina_3061M\demo\drivers_sample\crc\sample_crc_gen_algo文件夹复制到workspace\demo\user目录下(workspace自己建的该项目的工作路径) - 步骤二:原理:CRC是一种用于检测数据传输或存储后可能出现的错误的校验方法,然后CRC16_XMODEM算法的具体步骤包括初始化CRC寄存器、逐字节处理数据、应用多项式进行运算,并最终生成一个16位的CRC值,这个值被附加到数据后面,以便接收方进行校验。核心代码如下方所示。 @@ -1827,7 +1827,7 @@ ACMP接口说明请参考该手册1.1.3.4、1.1.3.5、1.1.3.6. #### 7.2.4实验流程 -- 步骤一:open_mcu-master\src\application\drivers_sample\crc\sample_crc_gen_algo文件夹复制到workspace\demo\user目录下(workspace自己建的该项目的工作路径) +- 步骤一:open_mcu\vendor\yibaina_3061M\demo\drivers_sample\crc\sample_crc_load_algo文件夹复制到workspace\demo\user目录下(workspace自己建的该项目的工作路径) - 步骤二:原理:CRC是一种用于检测数据传输或存储后可能出现的错误的校验方法,然后CRC16_XMODEM算法的具体步骤包括初始化CRC寄存器、逐字节处理数据、应用多项式进行运算,并最终生成一个16位的CRC值,这个值被附加到数据后面,以便接收方进行校验。在CRC16_CCITT-FALSE算法中,输入数据在计算之前会进行预处理,通常是将初始值设为0xFFFF。生成多项式为x^16^ + x^12^+x^5^+1,这个多项式用于与输入数据进行模2除法运算,以生成16位的CRC值。核心代码如下方所示。 -- Gitee From 8945510f1345bc785dde6b10a14a2b604ad8be0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E5=A3=AE=E4=BC=9F?= <1161625498@qq.com> Date: Fri, 13 Sep 2024 15:03:11 +0800 Subject: [PATCH 05/10] xxxxx MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 温壮伟 <1161625498@qq.com> --- "README - \345\211\257\346\234\254.md" | 301 --------------- .../pic/1726194739756.jpg | Bin .../pic/1726194776437.jpg | Bin .../pic/1726194794028.jpg | Bin .../pic/1726194824764.jpg | Bin .../pic/1726194869607.jpg | Bin .../pic/1726194906962.jpg | Bin .../pic/1726194945180.jpg | Bin .../pic/1726194962547.jpg | Bin .../pic/1726194980430.jpg | Bin .../pic/1726195007716.jpg | Bin .../pic/1726195033006.jpg | Bin .../pic/1726195055385.jpg | Bin .../pic/1726195173004.jpg | Bin .../pic/1726195185553.jpg | Bin docs/pic/2d23b1fa3489f9f9ad2d2d1e76fbec4.png | Bin 0 -> 163583 bytes .../inc/sample_adc_associative_trigger_apt.h | 33 -- .../init/main.c | 37 -- .../init/main.h | 52 --- .../init/system_init.c | 214 ----------- .../readme.md | 18 - .../src/sample_adc_associative_trigger_apt.c | 59 --- .../inc/sample_adc_continue_trigger.h | 33 -- .../sample_adc_continue_trigger/init/main.c | 36 -- .../sample_adc_continue_trigger/init/main.h | 48 --- .../init/system_init.c | 140 ------- .../adc/sample_adc_continue_trigger/readme.md | 18 - .../src/sample_adc_continue_trigger.c | 65 ---- .../inc/sample_adc_over_sample.h | 31 -- .../adc/sample_adc_over_sample/init/main.c | 36 -- .../adc/sample_adc_over_sample/init/main.h | 46 --- .../sample_adc_over_sample/init/system_init.c | 138 ------- .../adc/sample_adc_over_sample/readme.md | 18 - .../src/sample_adc_over_sample.c | 61 --- .../inc/sample_adc_oversampling_it.h | 31 -- .../sample_adc_oversampling_it/init/main.c | 51 --- .../sample_adc_oversampling_it/init/main.h | 55 --- .../init/system_init.c | 138 ------- .../adc/sample_adc_oversampling_it/readme.md | 18 - .../src/sample_adc_oversampling_it.c | 58 --- .../inc/sample_adc_single_trigger.h | 31 -- .../adc/sample_adc_single_trigger/init/main.c | 35 -- .../adc/sample_adc_single_trigger/init/main.h | 46 --- .../init/system_init.c | 128 ------- .../adc/sample_adc_single_trigger/readme.md | 18 - .../src/sample_adc_single_trigger.c | 55 --- .../inc/sample_adc_single_trigger_dma.h | 32 -- .../sample_adc_single_trigger_dma/init/main.c | 37 -- .../sample_adc_single_trigger_dma/init/main.h | 51 --- .../init/system_init.c | 170 --------- .../sample_adc_single_trigger_dma/readme.md | 18 - .../src/sample_adc_single_trigger_dma.c | 59 --- .../inc/sample_adc_single_trigger_it.h | 32 -- .../sample_adc_single_trigger_it/init/main.c | 35 -- .../sample_adc_single_trigger_it/init/main.h | 48 --- .../init/system_init.c | 140 ------- .../sample_adc_single_trigger_it/readme.md | 18 - .../src/sample_adc_single_trigger_it.c | 57 --- .../inc/sample_adc_single_with_ppb.h | 30 -- .../sample_adc_single_with_ppb/init/main.c | 51 --- .../sample_adc_single_with_ppb/init/main.h | 56 --- .../init/system_init.c | 144 ------- .../adc/sample_adc_single_with_ppb/readme.md | 20 - .../src/sample_adc_single_with_ppb.c | 131 ------- .../inc/sample_adc_sync_sample.h | 32 -- .../adc/sample_adc_sync_sample/init/main.c | 35 -- .../adc/sample_adc_sync_sample/init/main.h | 46 --- .../sample_adc_sync_sample/init/system_init.c | 137 ------- .../adc/sample_adc_sync_sample/readme.md | 18 - .../src/sample_adc_sync_sample.c | 63 ---- .../inc/sample_adc_sync_sample_dma.h | 32 -- .../sample_adc_sync_sample_dma/init/main.c | 37 -- .../sample_adc_sync_sample_dma/init/main.h | 51 --- .../init/system_init.c | 180 --------- .../adc/sample_adc_sync_sample_dma/readme.md | 18 - .../src/sample_adc_sync_sample_dma.c | 62 --- .../inc/sample_adc_sync_sample_it.h | 32 -- .../adc/sample_adc_sync_sample_it/init/main.c | 35 -- .../adc/sample_adc_sync_sample_it/init/main.h | 48 --- .../init/system_init.c | 142 ------- .../adc/sample_adc_sync_sample_it/readme.md | 18 - .../src/sample_adc_sync_sample_it.c | 58 --- .../drivers_sample/dac/sample_dac/init/main.c | 33 -- .../drivers_sample/dac/sample_dac/init/main.h | 43 --- .../dac/sample_dac/init/system_init.c | 70 ---- .../drivers_sample/dac/sample_dac/readme.md | 18 - .../inc/sample_dma_list_transfer.h | 32 -- .../dma/sample_dma_list_transfer/readme.md | 18 - .../src/sample_dma_list_transfer.c | 117 ------ .../inc/sample_dma_list_transfer_continue.h | 32 -- .../readme.md | 19 - .../src/sample_dma_list_transfer_continue.c | 70 ---- .../sysinit/main.c | 37 -- .../sysinit/main.h | 48 --- .../sysinit/system_init.c | 123 ------ .../inc/sample_dma_mem_to_mem.h | 33 -- .../dma/sample_dma_mem_to_mem/init/main.c | 36 -- .../dma/sample_dma_mem_to_mem/init/main.h | 48 --- .../sample_dma_mem_to_mem/init/system_init.c | 133 ------- .../dma/sample_dma_mem_to_mem/readme.md | 18 - .../src/sample_dma_mem_to_mem.c | 61 --- .../inc/sample_dma_mem_to_per.h | 32 -- .../dma/sample_dma_mem_to_per/readme.md | 18 - .../src/sample_dma_mem_to_per.c | 118 ------ .../inc/sample_dma_per_to_mem.h | 32 -- .../dma/sample_dma_per_to_mem/readme.md | 18 - .../src/sample_dma_per_to_mem.c | 128 ------- .../inc/sample_dma_per_to_per.h | 32 -- .../dma/sample_dma_per_to_per/readme.md | 18 - .../src/sample_dma_per_to_per.c | 127 ------- .../inc/sample_flash_blocking.h | 29 -- .../flash/sample_flash_blocking/init/main.c | 34 -- .../flash/sample_flash_blocking/init/main.h | 43 --- .../sample_flash_blocking/init/system_init.c | 91 ----- .../flash/sample_flash_blocking/readme.md | 19 - .../src/sample_flash_blocking.c | 95 ----- .../inc/sample_flash_blocking_mode.h | 29 -- .../sample_flash_blocking_mode/init/main.c | 51 --- .../sample_flash_blocking_mode/init/main.h | 48 --- .../init/system_init.c | 95 ----- .../sample_flash_blocking_mode/readme.md | 19 - .../src/sample_flash_blocking_mode.c | 95 ----- .../inc/sample_flash_interrupt.h | 29 -- .../flash/sample_flash_interrupt/init/main.c | 34 -- .../flash/sample_flash_interrupt/init/main.h | 43 --- .../sample_flash_interrupt/init/system_init.c | 91 ----- .../flash/sample_flash_interrupt/readme.md | 19 - .../src/sample_flash_interrupt.c | 149 -------- .../inc/sample_flash_interrupt_mode.h | 29 -- .../sample_flash_interrupt_mode/init/main.c | 51 --- .../sample_flash_interrupt_mode/init/main.h | 48 --- .../init/system_init.c | 94 ----- .../sample_flash_interrupt_mode/readme.md | 19 - .../src/sample_flash_interrupt_mode.c | 151 -------- .../inc/gpio_circle_sample.h | 30 -- .../gpio/sample_gpio_circle/init/main.c | 37 -- .../gpio/sample_gpio_circle/init/main.h | 47 --- .../sample_gpio_circle/init/system_init.c | 123 ------ .../gpio/sample_gpio_circle/readme.md | 22 -- .../src/gpio_circle_sample.c | 99 ----- .../inc/gpio_interrupt_sample.h | 30 -- .../gpio/sample_gpio_interrupt/init/main.c | 37 -- .../gpio/sample_gpio_interrupt/init/main.h | 49 --- .../sample_gpio_interrupt/init/system_init.c | 137 ------- .../gpio/sample_gpio_interrupt/readme.md | 22 -- .../src/gpio_interrupt_sample.c | 126 ------- .../sample_gpio_key/inc/gpio_key_sample.h | 30 -- .../gpio/sample_gpio_key/init/main.c | 36 -- .../gpio/sample_gpio_key/init/main.h | 48 --- .../gpio/sample_gpio_key/init/system_init.c | 121 ------ .../gpio/sample_gpio_key/readme.md | 17 - .../sample_gpio_key/src/gpio_key_sample.c | 65 ---- .../sample_gpio_led/inc/gpio_led_sample.h | 30 -- .../gpio/sample_gpio_led/init/main.c | 36 -- .../gpio/sample_gpio_led/init/main.h | 46 --- .../gpio/sample_gpio_led/init/system_init.c | 109 ------ .../gpio/sample_gpio_led/readme.md | 19 - .../sample_gpio_led/src/gpio_led_sample.c | 49 --- .../inc/sample_gpt_period_interrupt.h | 32 -- .../sample_gpt_period_interrupt/init/main.c | 51 --- .../sample_gpt_period_interrupt/init/main.h | 53 --- .../init/system_init.c | 137 ------- .../gpt/sample_gpt_period_interrupt/readme.md | 24 -- .../src/sample_gpt_period_interrupt.c | 51 --- .../inc/sample_gpt_pwm_output.h | 32 -- .../gpt/sample_gpt_pwm_output/init/main.c | 51 --- .../gpt/sample_gpt_pwm_output/init/main.h | 52 --- .../sample_gpt_pwm_output/init/system_init.c | 118 ------ .../gpt/sample_gpt_pwm_output/readme.md | 24 -- .../src/sample_gpt_pwm_output.c | 45 --- .../inc/sample_gpt_simplerun.h | 32 -- .../gpt/sample_gpt_simplerun/init/main.c | 36 -- .../gpt/sample_gpt_simplerun/init/main.h | 46 --- .../sample_gpt_simplerun/init/system_init.c | 112 ------ .../gpt/sample_gpt_simplerun/readme.md | 18 - .../src/sample_gpt_simplerun.c | 53 --- .../inc/sample_i2c_blocking_stlm75.h | 29 -- .../sample_i2c_blocking_stlm75/init/main.c | 35 -- .../sample_i2c_blocking_stlm75/init/main.h | 46 --- .../init/system_init.c | 127 ------- .../i2c/sample_i2c_blocking_stlm75/readme.md | 18 - .../src/sample_i2c_blocking_stlm75.c | 80 ---- .../inc/sample_i2c_dma_stlm75.h | 29 -- .../i2c/sample_i2c_dma_stlm75/init/main.c | 37 -- .../i2c/sample_i2c_dma_stlm75/init/main.h | 53 --- .../sample_i2c_dma_stlm75/init/system_init.c | 192 ---------- .../i2c/sample_i2c_dma_stlm75/readme.md | 18 - .../src/sample_i2c_dma_stlm75.c | 110 ------ .../inc/sample_i2c_interrupt_stlm75.h | 29 -- .../sample_i2c_interrupt_stlm75/init/main.c | 35 -- .../sample_i2c_interrupt_stlm75/init/main.h | 50 --- .../init/system_init.c | 157 -------- .../i2c/sample_i2c_interrupt_stlm75/readme.md | 18 - .../src/sample_i2c_interrupt_stlm75.c | 110 ------ .../inc/sample_i2c_master_blocking_at24c64.h | 29 -- .../init/main.c | 52 --- .../init/main.h | 51 --- .../init/system_init.c | 125 ------- .../readme.md | 19 - .../src/sample_i2c_master_blocking_at24c64.c | 202 ---------- .../inc/sample_i2c_master_dma_at24c64.h | 29 -- .../sample_i2c_master_dma_at24c64/init/main.c | 53 --- .../sample_i2c_master_dma_at24c64/init/main.h | 54 --- .../init/system_init.c | 212 ----------- .../sample_i2c_master_dma_at24c64/readme.md | 19 - .../src/sample_i2c_master_dma_at24c64.c | 286 -------------- .../inc/sample_i2c_master_interrupt_at24c64.h | 29 -- .../init/main.c | 51 --- .../init/main.h | 55 --- .../init/system_init.c | 156 -------- .../readme.md | 19 - .../src/sample_i2c_master_interrupt_at24c64.c | 293 --------------- .../inc/sample_i2c_slave_blocking.h | 29 -- .../i2c/sample_i2c_slave_blocking/init/main.c | 51 --- .../i2c/sample_i2c_slave_blocking/init/main.h | 51 --- .../init/system_init.c | 129 ------- .../i2c/sample_i2c_slave_blocking/readme.md | 23 -- .../src/sample_i2c_slave_blocking.c | 148 -------- .../inc/sample_i2c_slave_dma.h | 29 -- .../i2c/sample_i2c_slave_dma/init/main.c | 53 --- .../i2c/sample_i2c_slave_dma/init/main.h | 54 --- .../sample_i2c_slave_dma/init/system_init.c | 216 ----------- .../i2c/sample_i2c_slave_dma/readme.md | 23 -- .../src/sample_i2c_slave_dma.c | 208 ---------- .../inc/sample_i2c_slave_interrupt.h | 29 -- .../sample_i2c_slave_interrupt/init/main.c | 52 --- .../sample_i2c_slave_interrupt/init/main.h | 55 --- .../init/system_init.c | 159 -------- .../i2c/sample_i2c_slave_interrupt/readme.md | 23 -- .../src/sample_i2c_slave_interrupt.c | 206 ---------- .../iocmg/iolist_sample/inc/iolist_sample.h | 30 -- .../iocmg/iolist_sample/init/main.c | 34 -- .../iocmg/iolist_sample/init/main.h | 47 --- .../iocmg/iolist_sample/init/system_init.c | 86 ----- .../iocmg/iolist_sample/readme.md | 14 - .../iocmg/iolist_sample/src/iolist_sample.c | 103 ----- .../sample_iocfg_list/inc/sample_iocfg_list.h | 30 -- .../iocmg/sample_iocfg_list/init/main.c | 50 --- .../iocmg/sample_iocfg_list/init/main.h | 49 --- .../sample_iocfg_list/init/system_init.c | 92 ----- .../iocmg/sample_iocfg_list/readme.rd | 14 - .../sample_iocfg_list/src/sample_iocfg_list.c | 106 ------ .../demo/drivers_sample/open_mcu | 1 - .../demo/drivers_sample/open_mcu_1 | 1 - .../drivers_sample/pga/sample_pga/init/main.c | 33 -- .../drivers_sample/pga/sample_pga/init/main.h | 43 --- .../pga/sample_pga/init/system_init.c | 88 ----- .../drivers_sample/pga/sample_pga/readme.md | 14 - .../pga/sample_pga_extra_resistor/init/main.c | 34 -- .../pga/sample_pga_extra_resistor/init/main.h | 43 --- .../init/system_init.c | 88 ----- .../pga/sample_pga_extra_resistor/readme.md | 14 - .../inc/sample_pga_result_sampling.h | 31 -- .../sample_pga_result_sampling/init/main.c | 52 --- .../sample_pga_result_sampling/init/main.h | 54 --- .../init/system_init.c | 143 ------- .../pga/sample_pga_result_sampling/readme.md | 16 - .../src/sample_pga_result_sampling.c | 51 --- .../pic/1726194906962-1726195658552-18.jpg | Bin 4937 -> 0 bytes .../pic/1726194962547-1726195476280-9.jpg | Bin 7234 -> 0 bytes .../pmc/sample_pmc_pvd/inc/sample_pmc_pvd.h | 27 -- .../pmc/sample_pmc_pvd/init/main.c | 42 --- .../pmc/sample_pmc_pvd/init/main.h | 48 --- .../pmc/sample_pmc_pvd/init/system_init.c | 120 ------ .../pmc/sample_pmc_pvd/readme.md | 17 - .../pmc/sample_pmc_pvd/src/sample_pmc_pvd.c | 53 --- .../sample_pmc_wakeup/inc/sample_pmc_wakeup.h | 31 -- .../pmc/sample_pmc_wakeup/init/main.c | 42 --- .../pmc/sample_pmc_wakeup/init/main.h | 46 --- .../pmc/sample_pmc_wakeup/init/system_init.c | 107 ------ .../pmc/sample_pmc_wakeup/readme.md | 17 - .../sample_pmc_wakeup/src/sample_pmc_wakeup.c | 68 ---- .../qdm/sample_qdm_m/inc/sample_qdm_m.h | 26 -- .../qdm/sample_qdm_m/init/main.c | 37 -- .../qdm/sample_qdm_m/init/main.h | 49 --- .../qdm/sample_qdm_m/init/system_init.c | 175 --------- .../drivers_sample/qdm/sample_qdm_m/readme.md | 24 -- .../qdm/sample_qdm_m/src/sample_qdm_m.c | 41 -- .../qdm/sample_qdm_mt/inc/sample_qdm_mt.h | 26 -- .../qdm/sample_qdm_mt/init/main.c | 37 -- .../qdm/sample_qdm_mt/init/main.h | 46 --- .../qdm/sample_qdm_mt/init/system_init.c | 154 -------- .../qdm/sample_qdm_mt/readme.md | 13 - .../qdm/sample_qdm_mt/src/sample_qdm_mt.c | 42 --- .../inc/sample_spi_blocking_kta7953.h | 28 -- .../sample_spi_blocking_kta7953/init/main.c | 35 -- .../sample_spi_blocking_kta7953/init/main.h | 46 --- .../init/system_init.c | 163 -------- .../spi/sample_spi_blocking_kta7953/readme.md | 18 - .../src/sample_spi_blocking_kta7953.c | 95 ----- .../inc/sample_spi_blocking_w25q32.h | 28 -- .../sample_spi_blocking_w25q32/init/main.c | 50 --- .../sample_spi_blocking_w25q32/init/main.h | 50 --- .../init/system_init.c | 157 -------- .../spi/sample_spi_blocking_w25q32/readme.md | 20 - .../src/sample_spi_blocking_w25q32.c | 244 ------------ .../inc/sample_spi_blocking_w25q32_internal.h | 28 -- .../init/main.c | 51 --- .../init/main.h | 50 --- .../init/system_init.c | 157 -------- .../readme.md | 20 - .../src/sample_spi_blocking_w25q32_internal.c | 224 ----------- .../inc/sample_spi_dma_kta7953.h | 28 -- .../spi/sample_spi_dma_kta7953/init/main.c | 37 -- .../spi/sample_spi_dma_kta7953/init/main.h | 55 --- .../sample_spi_dma_kta7953/init/system_init.c | 256 ------------- .../spi/sample_spi_dma_kta7953/readme.md | 20 - .../src/sample_spi_dma_kta7953.c | 164 -------- .../inc/sample_spi_dma_w25q32.h | 28 -- .../spi/sample_spi_dma_w25q32/init/main.c | 51 --- .../spi/sample_spi_dma_w25q32/init/main.h | 59 --- .../sample_spi_dma_w25q32/init/system_init.c | 250 ------------- .../spi/sample_spi_dma_w25q32/readme.md | 20 - .../src/sample_spi_dma_w25q32.c | 288 -------------- .../inc/sample_spi_dma_w25q32_internal.h | 28 -- .../init/main.c | 52 --- .../init/main.h | 59 --- .../init/system_init.c | 250 ------------- .../sample_spi_dma_w25q32_internal/readme.md | 20 - .../src/sample_spi_dma_w25q32_internal.c | 269 ------------- .../inc/sample_spi_interrupt_kta7953.h | 28 -- .../sample_spi_interrupt_kta7953/init/main.c | 35 -- .../sample_spi_interrupt_kta7953/init/main.h | 52 --- .../init/system_init.c | 207 ---------- .../sample_spi_interrupt_kta7953/readme.md | 20 - .../src/sample_spi_interrupt_kta7953.c | 163 -------- .../inc/sample_spi_interrupt_w25q32.h | 28 -- .../sample_spi_interrupt_w25q32/init/main.c | 50 --- .../sample_spi_interrupt_w25q32/init/main.h | 56 --- .../init/system_init.c | 203 ---------- .../spi/sample_spi_interrupt_w25q32/readme.md | 20 - .../src/sample_spi_interrupt_w25q32.c | 286 -------------- .../sample_spi_interrupt_w25q32_internal.h | 28 -- .../init/main.c | 51 --- .../init/main.h | 56 --- .../init/system_init.c | 203 ---------- .../readme.md | 20 - .../sample_spi_interrupt_w25q32_internal.c | 268 ------------- .../sample_spi_master/inc/sample_spi_master.h | 28 -- .../spi/sample_spi_master/init/main.c | 50 --- .../spi/sample_spi_master/init/main.h | 50 --- .../spi/sample_spi_master/init/system_init.c | 157 -------- .../spi/sample_spi_master/readme.md | 18 - .../sample_spi_master/src/sample_spi_master.c | 97 ----- .../inc/sample_spi_microwire_master.h | 28 -- .../sample_spi_microwire_master/init/main.c | 34 -- .../sample_spi_microwire_master/init/main.h | 43 --- .../init/system_init.c | 125 ------- .../spi/sample_spi_microwire_master/readme.md | 26 -- .../src/sample_spi_microwire_master.c | 84 ----- .../inc/sample_spi_microwire_slave.h | 28 -- .../sample_spi_microwire_slave/init/main.c | 35 -- .../sample_spi_microwire_slave/init/main.h | 46 --- .../init/system_init.c | 163 -------- .../spi/sample_spi_microwire_slave/readme.md | 26 -- .../src/sample_spi_microwire_slave.c | 118 ------ .../sample_spi_slave/inc/sample_spi_slave.h | 28 -- .../spi/sample_spi_slave/init/main.c | 35 -- .../spi/sample_spi_slave/init/main.h | 46 --- .../spi/sample_spi_slave/init/system_init.c | 163 -------- .../spi/sample_spi_slave/readme.md | 18 - .../sample_spi_slave/src/sample_spi_slave.c | 97 ----- .../inc/sample_timer_interrupt.h | 32 -- .../timer/sample_timer_interrupt/init/main.c | 48 --- .../timer/sample_timer_interrupt/init/main.h | 52 --- .../sample_timer_interrupt/init/system_init.c | 123 ------ .../timer/sample_timer_interrupt/readme.md | 18 - .../src/sample_timer_interrupt.c | 65 ---- .../sample_tsensor/inc/sample_tsensor.h | 32 -- .../tsensor/sample_tsensor/readme.txt | 6 - .../sample_tsensor/src/sample_tsensor.c | 48 --- .../inc/sample_uart_baud_detect.h | 33 -- .../uart/sample_uart_baud_detect/init/main.c | 50 --- .../uart/sample_uart_baud_detect/init/main.h | 55 --- .../init/system_init.c | 136 ------- .../uart/sample_uart_baud_detect/readme.md | 19 - .../src/sample_uart_baud_detect.c | 67 ---- .../inc/sample_uart_blocking_rx.h | 35 -- .../uart/sample_uart_blocking_rx/init/main.c | 34 -- .../uart/sample_uart_blocking_rx/init/main.h | 43 --- .../init/system_init.c | 90 ----- .../uart/sample_uart_blocking_rx/readme.md | 23 -- .../src/sample_uart_blocking_rx.c | 53 --- .../inc/sample_uart_blocking_tx.h | 35 -- .../uart/sample_uart_blocking_tx/init/main.c | 34 -- .../uart/sample_uart_blocking_tx/init/main.h | 48 --- .../init/system_init.c | 91 ----- .../uart/sample_uart_blocking_tx/readme.md | 22 -- .../src/sample_uart_blocking_tx.c | 53 --- .../inc/sample_uart_character_match.h | 35 -- .../sample_uart_character_match/init/main.c | 50 --- .../sample_uart_character_match/init/main.h | 53 --- .../init/system_init.c | 129 ------- .../sample_uart_character_match/readme.md | 16 - .../src/sample_uart_character_match.c | 67 ---- .../inc/sample_uart_dma_rx.h | 33 -- .../uart/sample_uart_dma_rx/init/main.c | 48 --- .../uart/sample_uart_dma_rx/init/main.h | 58 --- .../sample_uart_dma_rx/init/system_init.c | 142 ------- .../uart/sample_uart_dma_rx/readme.md | 22 -- .../src/sample_uart_dma_rx.c | 59 --- .../sample_uart_dma_rx_cyclically_stored.h | 34 -- .../init/main.c | 51 --- .../init/main.h | 54 --- .../init/system_init.c | 131 ------- .../readme.md | 21 -- .../sample_uart_dma_rx_cyclically_stored.c | 65 ---- .../inc/sample_uart_dma_tx.h | 33 -- .../uart/sample_uart_dma_tx/init/main.c | 48 --- .../uart/sample_uart_dma_tx/init/main.h | 57 --- .../sample_uart_dma_tx/init/system_init.c | 144 ------- .../uart/sample_uart_dma_tx/readme.md | 22 -- .../src/sample_uart_dma_tx.c | 58 --- ...sample_uart_dma_tx_dma_rx_simultaneously.h | 33 -- .../init/main.c | 48 --- .../init/main.h | 54 --- .../init/system_init.c | 158 -------- .../readme.md | 22 -- ...sample_uart_dma_tx_dma_rx_simultaneously.c | 113 ------ ...sample_uart_dma_tx_int_rx_simultaneously.h | 33 -- .../init/main.c | 48 --- .../init/main.h | 57 --- .../init/system_init.c | 150 -------- .../readme.md | 22 -- ...sample_uart_dma_tx_int_rx_simultaneously.c | 115 ------ ...sample_uart_int_tx_dma_rx_simultaneously.h | 34 -- .../init/main.c | 48 --- .../init/main.h | 57 --- .../init/system_init.c | 150 -------- .../readme.md | 22 -- ...sample_uart_int_tx_dma_rx_simultaneously.c | 115 ------ ...sample_uart_int_tx_int_rx_simultaneously.h | 33 -- .../init/main.c | 47 --- .../init/main.h | 53 --- .../init/system_init.c | 118 ------ .../readme.md | 22 -- ...sample_uart_int_tx_int_rx_simultaneously.c | 114 ------ .../inc/sample_uart_interrupt_rx.h | 33 -- .../uart/sample_uart_interrupt_rx/init/main.c | 47 --- .../uart/sample_uart_interrupt_rx/init/main.h | 53 --- .../init/system_init.c | 119 ------ .../uart/sample_uart_interrupt_rx/readme.md | 22 -- .../src/sample_uart_interrupt_rx.c | 64 ---- .../inc/sample_uart_interrupt_tx.h | 33 -- .../uart/sample_uart_interrupt_tx/init/main.c | 47 --- .../uart/sample_uart_interrupt_tx/init/main.h | 53 --- .../init/system_init.c | 118 ------ .../uart/sample_uart_interrupt_tx/readme.md | 20 - .../src/sample_uart_interrupt_tx.c | 58 --- .../inc/sample_uart_interrupt_tx_after_rx.h | 33 -- .../init/main.c | 47 --- .../init/main.h | 52 --- .../init/system_init.c | 118 ------ .../readme.md | 22 -- .../src/sample_uart_interrupt_tx_after_rx.c | 114 ------ .../sample_uart_single_wire_communication.h | 55 --- .../init/main.c | 51 --- .../init/main.h | 60 --- .../init/system_init.c | 268 ------------- .../readme.md | 28 -- .../sample_uart_single_wire_communication.c | 354 ------------------ .../inc/sample_iwdg_refresh.h | 30 -- .../wdg/sample_iwdg_refresh/init/main.c | 52 --- .../wdg/sample_iwdg_refresh/init/main.h | 59 --- .../sample_iwdg_refresh/init/system_init.c | 112 ------ .../wdg/sample_iwdg_refresh/readme.md | 18 - .../src/sample_iwdg_refresh.c | 58 --- .../sample_iwdg_reset/inc/iwdg_reset_sample.h | 30 -- .../wdg/sample_iwdg_reset/init/main.c | 51 --- .../wdg/sample_iwdg_reset/init/main.h | 47 --- .../wdg/sample_iwdg_reset/init/system_init.c | 118 ------ .../wdg/sample_iwdg_reset/readme.md | 18 - .../sample_iwdg_reset/src/iwdg_reset_sample.c | 78 ---- .../sample_wdg_reset/inc/wdg_reset_sample.h | 30 -- .../wdg/sample_wdg_reset/init/main.c | 35 -- .../wdg/sample_wdg_reset/init/main.h | 48 --- .../wdg/sample_wdg_reset/init/system_init.c | 116 ------ .../wdg/sample_wdg_reset/readme.md | 18 - .../sample_wdg_reset/src/wdg_reset_sample.c | 77 ---- .../inc/sample_wwdg_refresh.h | 30 -- .../wdg/sample_wwdg_refresh/init/main.c | 50 --- .../wdg/sample_wwdg_refresh/init/main.h | 52 --- .../sample_wwdg_refresh/init/system_init.c | 119 ------ .../wdg/sample_wwdg_refresh/readme.md | 18 - .../src/sample_wwdg_refresh.c | 76 ---- .../1726194739756.jpg" | Bin 5782 -> 0 bytes .../1726194776437.jpg" | Bin 29480 -> 0 bytes .../1726194794028.jpg" | Bin 62232 -> 0 bytes .../1726194824764.jpg" | Bin 2866 -> 0 bytes .../1726194869607.jpg" | Bin 166495 -> 0 bytes .../1726194906962.jpg" | Bin 4937 -> 0 bytes .../1726194962547.jpg" | Bin 7234 -> 0 bytes .../1726194980430.jpg" | Bin 10987 -> 0 bytes .../1726195007716.jpg" | Bin 5702 -> 0 bytes .../1726195033006.jpg" | Bin 2418 -> 0 bytes .../1726195173004.jpg" | Bin 538 -> 0 bytes .../1726195185553.jpg" | Bin 538 -> 0 bytes .../pic/1726194945180-1726210955941-2.jpg | Bin .../yibaina_3061M/demo/pic/1726195055385.jpg | Bin .../inc/sample_acmp_interrupt.h | 0 .../sample_acmp_interrupt/init/main.c | 0 .../sample_acmp_interrupt/init/main.h | 0 .../sample_acmp_interrupt/init/system_init.c | 0 .../acmp => }/sample_acmp_interrupt/readme.md | 0 .../src/sample_acmp_interrupt.c | 0 .../inc/sample_acmp_out_result.h | 0 .../sample_acmp_out_result/init/main.c | 0 .../sample_acmp_out_result/init/main.h | 0 .../sample_acmp_out_result/init/system_init.c | 0 .../sample_acmp_out_result/readme.md | 0 .../src/sample_acmp_out_result.c | 0 .../inc/sample_apt_single_resistor.h | 0 .../sample_apt_single_resistor/init/main.c | 0 .../sample_apt_single_resistor/init/main.h | 0 .../init/system_init.c | 0 .../sample_apt_single_resistor/readme.md | 0 .../src/sample_apt_single_resistor.c | 0 .../inc/sample_can_send_receive.h | 0 .../sample_can_send_receive/init/main.c | 0 .../sample_can_send_receive/init/main.h | 0 .../init/system_init.c | 0 .../sample_can_send_receive/readme.md | 0 .../src/sample_can_send_receive.c | 0 .../inc/cfd_check_error_sample.h | 0 .../sample_cfd_check_error/init/main.c | 0 .../sample_cfd_check_error/init/main.h | 0 .../sample_cfd_check_error/init/system_init.c | 0 .../cfd => }/sample_cfd_check_error/readme.md | 0 .../src/cfd_check_error_sample.c | 0 .../inc/cmm_check_error_sample.h | 0 .../sample_cmm_check_error/init/main.c | 0 .../sample_cmm_check_error/init/main.h | 0 .../sample_cmm_check_error/init/system_init.c | 0 .../cmm => }/sample_cmm_check_error/readme.md | 0 .../src/cmm_check_error_sample.c | 0 .../inc/sample_crc_gen_algo.h | 0 .../crc => }/sample_crc_gen_algo/init/main.c | 0 .../crc => }/sample_crc_gen_algo/init/main.h | 0 .../sample_crc_gen_algo/init/system_init.c | 0 .../crc => }/sample_crc_gen_algo/readme.md | 0 .../src/sample_crc_gen_algo.c | 0 .../inc/sample_crc_load_algo.h | 0 .../crc => }/sample_crc_load_algo/init/main.c | 0 .../crc => }/sample_crc_load_algo/init/main.h | 0 .../sample_crc_load_algo/init/system_init.c | 0 .../crc => }/sample_crc_load_algo/readme.md | 0 .../src/sample_crc_load_algo.c | 0 .../inc/capm_hall_sample.h | 0 .../init/main.c | 0 .../init/main.h | 0 .../init/system_init.c | 0 .../readme.md | 0 .../src/capm_hall_sample.c | 0 ...07\345\257\274\346\211\213\345\206\214.md" | 100 ++--- 554 files changed, 51 insertions(+), 30978 deletions(-) delete mode 100644 "README - \345\211\257\346\234\254.md" rename {vendor/yibaina_3061M/demo/drivers_sample => docs}/pic/1726194739756.jpg (100%) rename {vendor/yibaina_3061M/demo/drivers_sample => docs}/pic/1726194776437.jpg (100%) rename {vendor/yibaina_3061M/demo/drivers_sample => docs}/pic/1726194794028.jpg (100%) rename {vendor/yibaina_3061M/demo/drivers_sample => docs}/pic/1726194824764.jpg (100%) rename {vendor/yibaina_3061M/demo/drivers_sample => docs}/pic/1726194869607.jpg (100%) rename {vendor/yibaina_3061M/demo/drivers_sample => docs}/pic/1726194906962.jpg (100%) rename {vendor/yibaina_3061M/demo/drivers_sample => docs}/pic/1726194945180.jpg (100%) rename {vendor/yibaina_3061M/demo/drivers_sample => docs}/pic/1726194962547.jpg (100%) rename {vendor/yibaina_3061M/demo/drivers_sample => docs}/pic/1726194980430.jpg (100%) rename {vendor/yibaina_3061M/demo/drivers_sample => docs}/pic/1726195007716.jpg (100%) rename {vendor/yibaina_3061M/demo/drivers_sample => docs}/pic/1726195033006.jpg (100%) rename {vendor/yibaina_3061M/demo/drivers_sample => docs}/pic/1726195055385.jpg (100%) rename {vendor/yibaina_3061M/demo/drivers_sample => docs}/pic/1726195173004.jpg (100%) rename {vendor/yibaina_3061M/demo/drivers_sample => docs}/pic/1726195185553.jpg (100%) create mode 100644 docs/pic/2d23b1fa3489f9f9ad2d2d1e76fbec4.png delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_associative_trigger_of_apt/inc/sample_adc_associative_trigger_apt.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_associative_trigger_of_apt/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_associative_trigger_of_apt/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_associative_trigger_of_apt/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_associative_trigger_of_apt/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_associative_trigger_of_apt/src/sample_adc_associative_trigger_apt.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_continue_trigger/inc/sample_adc_continue_trigger.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_continue_trigger/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_continue_trigger/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_continue_trigger/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_continue_trigger/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_continue_trigger/src/sample_adc_continue_trigger.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_over_sample/inc/sample_adc_over_sample.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_over_sample/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_over_sample/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_over_sample/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_over_sample/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_over_sample/src/sample_adc_over_sample.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_oversampling_it/inc/sample_adc_oversampling_it.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_oversampling_it/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_oversampling_it/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_oversampling_it/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_oversampling_it/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_oversampling_it/src/sample_adc_oversampling_it.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger/inc/sample_adc_single_trigger.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger/src/sample_adc_single_trigger.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_dma/inc/sample_adc_single_trigger_dma.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_dma/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_dma/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_dma/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_dma/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_dma/src/sample_adc_single_trigger_dma.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_it/inc/sample_adc_single_trigger_it.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_it/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_it/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_it/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_it/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_trigger_it/src/sample_adc_single_trigger_it.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_with_ppb/inc/sample_adc_single_with_ppb.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_with_ppb/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_with_ppb/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_with_ppb/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_with_ppb/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_single_with_ppb/src/sample_adc_single_with_ppb.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample/inc/sample_adc_sync_sample.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample/src/sample_adc_sync_sample.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_dma/inc/sample_adc_sync_sample_dma.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_dma/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_dma/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_dma/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_dma/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_dma/src/sample_adc_sync_sample_dma.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_it/inc/sample_adc_sync_sample_it.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_it/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_it/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_it/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_it/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/adc/sample_adc_sync_sample_it/src/sample_adc_sync_sample_it.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/dac/sample_dac/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/dac/sample_dac/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/dac/sample_dac/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/dac/sample_dac/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer/inc/sample_dma_list_transfer.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer/src/sample_dma_list_transfer.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer_continue/inc/sample_dma_list_transfer_continue.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer_continue/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer_continue/src/sample_dma_list_transfer_continue.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer_continue/sysinit/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer_continue/sysinit/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_list_transfer_continue/sysinit/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_mem/inc/sample_dma_mem_to_mem.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_mem/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_mem/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_mem/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_mem/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_mem/src/sample_dma_mem_to_mem.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_per/inc/sample_dma_mem_to_per.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_per/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_mem_to_per/src/sample_dma_mem_to_per.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_per_to_mem/inc/sample_dma_per_to_mem.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_per_to_mem/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_per_to_mem/src/sample_dma_per_to_mem.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_per_to_per/inc/sample_dma_per_to_per.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_per_to_per/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/dma/sample_dma_per_to_per/src/sample_dma_per_to_per.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking/inc/sample_flash_blocking.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking/src/sample_flash_blocking.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking_mode/inc/sample_flash_blocking_mode.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking_mode/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking_mode/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking_mode/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking_mode/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_blocking_mode/src/sample_flash_blocking_mode.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt/inc/sample_flash_interrupt.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt/src/sample_flash_interrupt.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt_mode/inc/sample_flash_interrupt_mode.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt_mode/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt_mode/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt_mode/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt_mode/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/flash/sample_flash_interrupt_mode/src/sample_flash_interrupt_mode.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_circle/inc/gpio_circle_sample.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_circle/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_circle/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_circle/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_circle/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_circle/src/gpio_circle_sample.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_interrupt/inc/gpio_interrupt_sample.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_interrupt/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_interrupt/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_interrupt/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_interrupt/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_interrupt/src/gpio_interrupt_sample.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_key/inc/gpio_key_sample.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_key/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_key/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_key/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_key/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_key/src/gpio_key_sample.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_led/inc/gpio_led_sample.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_led/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_led/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_led/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_led/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/gpio/sample_gpio_led/src/gpio_led_sample.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_period_interrupt/inc/sample_gpt_period_interrupt.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_period_interrupt/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_period_interrupt/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_period_interrupt/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_period_interrupt/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_period_interrupt/src/sample_gpt_period_interrupt.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_pwm_output/inc/sample_gpt_pwm_output.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_pwm_output/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_pwm_output/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_pwm_output/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_pwm_output/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_pwm_output/src/sample_gpt_pwm_output.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_simplerun/inc/sample_gpt_simplerun.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_simplerun/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_simplerun/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_simplerun/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_simplerun/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/gpt/sample_gpt_simplerun/src/sample_gpt_simplerun.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_blocking_stlm75/inc/sample_i2c_blocking_stlm75.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_blocking_stlm75/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_blocking_stlm75/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_blocking_stlm75/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_blocking_stlm75/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_blocking_stlm75/src/sample_i2c_blocking_stlm75.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_dma_stlm75/inc/sample_i2c_dma_stlm75.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_dma_stlm75/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_dma_stlm75/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_dma_stlm75/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_dma_stlm75/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_dma_stlm75/src/sample_i2c_dma_stlm75.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_interrupt_stlm75/inc/sample_i2c_interrupt_stlm75.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_interrupt_stlm75/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_interrupt_stlm75/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_interrupt_stlm75/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_interrupt_stlm75/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_interrupt_stlm75/src/sample_i2c_interrupt_stlm75.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/inc/sample_i2c_master_blocking_at24c64.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_blocking_at24c64/src/sample_i2c_master_blocking_at24c64.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_dma_at24c64/inc/sample_i2c_master_dma_at24c64.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_dma_at24c64/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_dma_at24c64/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_dma_at24c64/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_dma_at24c64/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_dma_at24c64/src/sample_i2c_master_dma_at24c64.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/inc/sample_i2c_master_interrupt_at24c64.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_master_interrupt_at24c64/src/sample_i2c_master_interrupt_at24c64.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_blocking/inc/sample_i2c_slave_blocking.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_blocking/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_blocking/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_blocking/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_blocking/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_blocking/src/sample_i2c_slave_blocking.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_dma/inc/sample_i2c_slave_dma.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_dma/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_dma/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_dma/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_dma/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_dma/src/sample_i2c_slave_dma.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_interrupt/inc/sample_i2c_slave_interrupt.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_interrupt/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_interrupt/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_interrupt/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_interrupt/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/i2c/sample_i2c_slave_interrupt/src/sample_i2c_slave_interrupt.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/iocmg/iolist_sample/inc/iolist_sample.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/iocmg/iolist_sample/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/iocmg/iolist_sample/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/iocmg/iolist_sample/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/iocmg/iolist_sample/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/iocmg/iolist_sample/src/iolist_sample.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/iocmg/sample_iocfg_list/inc/sample_iocfg_list.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/iocmg/sample_iocfg_list/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/iocmg/sample_iocfg_list/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/iocmg/sample_iocfg_list/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/iocmg/sample_iocfg_list/readme.rd delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/iocmg/sample_iocfg_list/src/sample_iocfg_list.c delete mode 160000 vendor/yibaina_3061M/demo/drivers_sample/open_mcu delete mode 160000 vendor/yibaina_3061M/demo/drivers_sample/open_mcu_1 delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_extra_resistor/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_extra_resistor/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_extra_resistor/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_extra_resistor/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_result_sampling/inc/sample_pga_result_sampling.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_result_sampling/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_result_sampling/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_result_sampling/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_result_sampling/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/pga/sample_pga_result_sampling/src/sample_pga_result_sampling.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/pic/1726194906962-1726195658552-18.jpg delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/pic/1726194962547-1726195476280-9.jpg delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_pvd/inc/sample_pmc_pvd.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_pvd/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_pvd/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_pvd/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_pvd/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_pvd/src/sample_pmc_pvd.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_wakeup/inc/sample_pmc_wakeup.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_wakeup/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_wakeup/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_wakeup/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_wakeup/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/pmc/sample_pmc_wakeup/src/sample_pmc_wakeup.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_m/inc/sample_qdm_m.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_m/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_m/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_m/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_m/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_m/src/sample_qdm_m.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_mt/inc/sample_qdm_mt.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_mt/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_mt/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_mt/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_mt/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/qdm/sample_qdm_mt/src/sample_qdm_mt.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_kta7953/inc/sample_spi_blocking_kta7953.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_kta7953/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_kta7953/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_kta7953/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_kta7953/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_kta7953/src/sample_spi_blocking_kta7953.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32/inc/sample_spi_blocking_w25q32.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32/src/sample_spi_blocking_w25q32.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32_internal/inc/sample_spi_blocking_w25q32_internal.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32_internal/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32_internal/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32_internal/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32_internal/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_blocking_w25q32_internal/src/sample_spi_blocking_w25q32_internal.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_kta7953/inc/sample_spi_dma_kta7953.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_kta7953/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_kta7953/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_kta7953/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_kta7953/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_kta7953/src/sample_spi_dma_kta7953.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32/inc/sample_spi_dma_w25q32.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32/src/sample_spi_dma_w25q32.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32_internal/inc/sample_spi_dma_w25q32_internal.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32_internal/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32_internal/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32_internal/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32_internal/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_dma_w25q32_internal/src/sample_spi_dma_w25q32_internal.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_kta7953/inc/sample_spi_interrupt_kta7953.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_kta7953/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_kta7953/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_kta7953/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_kta7953/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_kta7953/src/sample_spi_interrupt_kta7953.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32/inc/sample_spi_interrupt_w25q32.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32/src/sample_spi_interrupt_w25q32.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/inc/sample_spi_interrupt_w25q32_internal.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_interrupt_w25q32_internal/src/sample_spi_interrupt_w25q32_internal.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_master/inc/sample_spi_master.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_master/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_master/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_master/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_master/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_master/src/sample_spi_master.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_master/inc/sample_spi_microwire_master.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_master/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_master/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_master/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_master/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_master/src/sample_spi_microwire_master.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_slave/inc/sample_spi_microwire_slave.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_slave/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_slave/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_slave/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_slave/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_microwire_slave/src/sample_spi_microwire_slave.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_slave/inc/sample_spi_slave.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_slave/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_slave/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_slave/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_slave/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/spi/sample_spi_slave/src/sample_spi_slave.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/timer/sample_timer_interrupt/inc/sample_timer_interrupt.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/timer/sample_timer_interrupt/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/timer/sample_timer_interrupt/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/timer/sample_timer_interrupt/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/timer/sample_timer_interrupt/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/timer/sample_timer_interrupt/src/sample_timer_interrupt.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/tsensor/sample_tsensor/inc/sample_tsensor.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/tsensor/sample_tsensor/readme.txt delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/tsensor/sample_tsensor/src/sample_tsensor.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_baud_detect/inc/sample_uart_baud_detect.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_baud_detect/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_baud_detect/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_baud_detect/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_baud_detect/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_baud_detect/src/sample_uart_baud_detect.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_rx/inc/sample_uart_blocking_rx.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_rx/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_rx/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_rx/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_rx/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_rx/src/sample_uart_blocking_rx.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_tx/inc/sample_uart_blocking_tx.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_tx/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_tx/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_tx/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_tx/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_blocking_tx/src/sample_uart_blocking_tx.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_character_match/inc/sample_uart_character_match.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_character_match/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_character_match/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_character_match/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_character_match/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_character_match/src/sample_uart_character_match.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx/inc/sample_uart_dma_rx.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx/src/sample_uart_dma_rx.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/inc/sample_uart_dma_rx_cyclically_stored.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_rx_cyclically_stored/src/sample_uart_dma_rx_cyclically_stored.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx/inc/sample_uart_dma_tx.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx/src/sample_uart_dma_tx.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/inc/sample_uart_dma_tx_dma_rx_simultaneously.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_dma_rx_simultaneously/src/sample_uart_dma_tx_dma_rx_simultaneously.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/inc/sample_uart_dma_tx_int_rx_simultaneously.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_dma_tx_int_rx_simultaneously/src/sample_uart_dma_tx_int_rx_simultaneously.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/inc/sample_uart_int_tx_dma_rx_simultaneously.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_dma_rx_simultaneously/src/sample_uart_int_tx_dma_rx_simultaneously.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/inc/sample_uart_int_tx_int_rx_simultaneously.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_int_tx_int_rx_simultaneously/src/sample_uart_int_tx_int_rx_simultaneously.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_rx/inc/sample_uart_interrupt_rx.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_rx/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_rx/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_rx/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_rx/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_rx/src/sample_uart_interrupt_rx.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx/inc/sample_uart_interrupt_tx.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx/src/sample_uart_interrupt_tx.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/inc/sample_uart_interrupt_tx_after_rx.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_interrupt_tx_after_rx/src/sample_uart_interrupt_tx_after_rx.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_single_wire_communication/inc/sample_uart_single_wire_communication.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_single_wire_communication/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_single_wire_communication/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_single_wire_communication/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_single_wire_communication/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/uart/sample_uart_single_wire_communication/src/sample_uart_single_wire_communication.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_refresh/inc/sample_iwdg_refresh.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_refresh/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_refresh/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_refresh/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_refresh/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_refresh/src/sample_iwdg_refresh.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_reset/inc/iwdg_reset_sample.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_reset/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_reset/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_reset/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_reset/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_iwdg_reset/src/iwdg_reset_sample.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wdg_reset/inc/wdg_reset_sample.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wdg_reset/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wdg_reset/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wdg_reset/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wdg_reset/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wdg_reset/src/wdg_reset_sample.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wwdg_refresh/inc/sample_wwdg_refresh.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wwdg_refresh/init/main.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wwdg_refresh/init/main.h delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wwdg_refresh/init/system_init.c delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wwdg_refresh/readme.md delete mode 100644 vendor/yibaina_3061M/demo/drivers_sample/wdg/sample_wwdg_refresh/src/sample_wwdg_refresh.c delete mode 100644 "vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726194739756.jpg" delete mode 100644 "vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726194776437.jpg" delete mode 100644 "vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726194794028.jpg" delete mode 100644 "vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726194824764.jpg" delete mode 100644 "vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726194869607.jpg" delete mode 100644 "vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726194906962.jpg" delete mode 100644 "vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726194962547.jpg" delete mode 100644 "vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726194980430.jpg" delete mode 100644 "vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726195007716.jpg" delete mode 100644 "vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726195033006.jpg" delete mode 100644 "vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726195173004.jpg" delete mode 100644 "vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726195185553.jpg" rename "vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726194945180.jpg" => vendor/yibaina_3061M/demo/pic/1726194945180-1726210955941-2.jpg (100%) rename "vendor/yibaina_3061M/demo/drivers_sample/\345\233\276\347\211\207/1726195055385.jpg" => vendor/yibaina_3061M/demo/pic/1726195055385.jpg (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/acmp => }/sample_acmp_interrupt/inc/sample_acmp_interrupt.h (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/acmp => }/sample_acmp_interrupt/init/main.c (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/acmp => }/sample_acmp_interrupt/init/main.h (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/acmp => }/sample_acmp_interrupt/init/system_init.c (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/acmp => }/sample_acmp_interrupt/readme.md (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/acmp => }/sample_acmp_interrupt/src/sample_acmp_interrupt.c (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/acmp => }/sample_acmp_out_result/inc/sample_acmp_out_result.h (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/acmp => }/sample_acmp_out_result/init/main.c (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/acmp => }/sample_acmp_out_result/init/main.h (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/acmp => }/sample_acmp_out_result/init/system_init.c (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/acmp => }/sample_acmp_out_result/readme.md (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/acmp => }/sample_acmp_out_result/src/sample_acmp_out_result.c (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/apt => }/sample_apt_single_resistor/inc/sample_apt_single_resistor.h (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/apt => }/sample_apt_single_resistor/init/main.c (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/apt => }/sample_apt_single_resistor/init/main.h (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/apt => }/sample_apt_single_resistor/init/system_init.c (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/apt => }/sample_apt_single_resistor/readme.md (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/apt => }/sample_apt_single_resistor/src/sample_apt_single_resistor.c (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/can => }/sample_can_send_receive/inc/sample_can_send_receive.h (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/can => }/sample_can_send_receive/init/main.c (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/can => }/sample_can_send_receive/init/main.h (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/can => }/sample_can_send_receive/init/system_init.c (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/can => }/sample_can_send_receive/readme.md (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/can => }/sample_can_send_receive/src/sample_can_send_receive.c (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/cfd => }/sample_cfd_check_error/inc/cfd_check_error_sample.h (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/cfd => }/sample_cfd_check_error/init/main.c (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/cfd => }/sample_cfd_check_error/init/main.h (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/cfd => }/sample_cfd_check_error/init/system_init.c (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/cfd => }/sample_cfd_check_error/readme.md (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/cfd => }/sample_cfd_check_error/src/cfd_check_error_sample.c (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/cmm => }/sample_cmm_check_error/inc/cmm_check_error_sample.h (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/cmm => }/sample_cmm_check_error/init/main.c (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/cmm => }/sample_cmm_check_error/init/main.h (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/cmm => }/sample_cmm_check_error/init/system_init.c (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/cmm => }/sample_cmm_check_error/readme.md (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/cmm => }/sample_cmm_check_error/src/cmm_check_error_sample.c (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/crc => }/sample_crc_gen_algo/inc/sample_crc_gen_algo.h (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/crc => }/sample_crc_gen_algo/init/main.c (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/crc => }/sample_crc_gen_algo/init/main.h (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/crc => }/sample_crc_gen_algo/init/system_init.c (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/crc => }/sample_crc_gen_algo/readme.md (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/crc => }/sample_crc_gen_algo/src/sample_crc_gen_algo.c (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/crc => }/sample_crc_load_algo/inc/sample_crc_load_algo.h (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/crc => }/sample_crc_load_algo/init/main.c (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/crc => }/sample_crc_load_algo/init/main.h (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/crc => }/sample_crc_load_algo/init/system_init.c (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/crc => }/sample_crc_load_algo/readme.md (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/crc => }/sample_crc_load_algo/src/sample_crc_load_algo.c (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/capm/capm_hall_sample => smaple_capm}/inc/capm_hall_sample.h (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/capm/capm_hall_sample => smaple_capm}/init/main.c (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/capm/capm_hall_sample => smaple_capm}/init/main.h (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/capm/capm_hall_sample => smaple_capm}/init/system_init.c (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/capm/capm_hall_sample => smaple_capm}/readme.md (100%) rename vendor/yibaina_3061M/demo/{drivers_sample/capm/capm_hall_sample => smaple_capm}/src/capm_hall_sample.c (100%) rename "vendor/yibaina_3061M/demo/drivers_sample/\345\256\236\351\252\214\346\214\207\345\257\274\346\211\213\345\206\214.md" => "vendor/yibaina_3061M/demo/\345\256\236\351\252\214\346\214\207\345\257\274\346\211\213\345\206\214.md" (95%) diff --git "a/README - \345\211\257\346\234\254.md" "b/README - \345\211\257\346\234\254.md" deleted file mode 100644 index ec080bb91..000000000 --- "a/README - \345\211\257\346\234\254.md" +++ /dev/null @@ -1,301 +0,0 @@ -# open_mcu开发指南 - -## 介绍 - - open_mcu代码仓为支持3061M和3065M解决方案SDK。 - -## 支持的开发板 - -| 开发板名称 | 硬件资料 | 软件资料 | 购买链接 | 开发板介绍 | -| :--------: | ------------------------------------------------------------ | :----------- | :----------------------------------------------------------- | :------------ | -| 3061M | [开发板硬件原理图](https://gitee.com/HiSpark/open_mcu/tree/master/docs/hardware/3061M) | 参考示例教程 | [开发板购买链接](https://m.tb.cn/h.gMEbHlepTLs5DNB?tk=aKIe356U3bY) | 参考3061M介绍 | -| 3065H | [开发板硬件原理图](https://gitee.com/HiSpark/open_mcu/tree/master/docs/hardware/3065H) | 参考示例教程 | [开发板购买链接](https://m.tb.cn/h.gMEbHlepTLs5DNB?tk=aKIe356U3bY) | 参考3065H介绍 | - -## 目录介绍 - -| 目录 | 介绍 | -| ------ | ---------------------- | -| docs | 硬件原理图 | -| src | SDK源码目录 | -| tools | 开发工具及环境搭建指南 | -| vendor | 存放对应开发板案例 | - -## 硬件介绍 - -### 3061M介绍 - -3061M系列 生态板由 ECBMCU201MPC(核心板)和 ECBMOTORA(电机驱动板组成)。 - -ECBMCU201MPC是针对 3061M系列 MCU开发的生态核心板,用于 3061M初始评估和设计参考,内嵌一块 USB接口的调试板。 - -ECBMOTORA是电机驱动扩展板,支持一个 BLDC或 PMSM电机控制。该单板支持24V/12V DCIN输入。 - -核心板电机驱动扩展板的常用组装方式是电机驱动板通过两个40pin连接器扣接到核心板,如下图所示。 - -![image-20240715162059747](docs/pic/tools/image-20240715162059747.png) - -### 3061M硬件说明 - - 3061M通用生态板通过 ECBMCU201MPC核心板实现控制、 ECBMOTORA 扩展板实现接口扩展以及电源接口,同时提供USB TypeC线进行调试 / 供电、12V电源适配器和一个电机。 - -![image-20240715162244103](docs/pic/tools/image-20240715162244103.png) - -3061M通用生态板用户手册详细内容请查阅:Hi3061M系列 通用生态板用户手册 00B01 - -### 3065H介绍 - -3065H 通用生态板由 ECBMCU105H (核心板)和 ECBMOTORA (电机驱动板)组成。 - -ECBMCU105H是针对 3065H 芯片开发的生态核心板,用于 3065H 芯片初始评估和设计参考,内嵌一块 USB 接口的调试板。 - -ECBMOTORA是电机驱动扩展板,支持一个 BLDC 或 PMSM 电机控制。该单板支持24V/12V DCIN 输入。 - -核心板电机驱动扩展板的常用组装方式是电机驱动板通过两个40pin 连接器扣接到核心板,如下图所示。 - -image-20240530173305431 - -### 3065H硬件说明 - - 3065H通用生态板通过ECBMCU105H 核心板实现控制、 ECBMOTORA 扩展板实现接口扩展以及电源接口,同时提供USB TypeC线进行调试 / 供电、12V电源适配器和一个电机。 - -![image-20240527103127826](docs/pic/tools/image-20240527103127826.png) - -3065H通用生态板用户手册详细内容请查阅:Hi3065H通用生态板用户手册 V03 - -## 开发环境搭建 - -[参考tools目录README搭建环境](https://gitee.com/HiSpark/open_mcu/tree/master/tools) - -## Demo - -3061M/3065H提供了以下Demo供开发参考,sample存放路径:[application_sample](https://gitee.com/HiSpark/open_mcu/tree/master/src/application) - -**主目录结构说明** - -| 文件夹名 | 描述 | -| ----------------- | -------------- | -| board\_sample | 开发板示例。 | -| drivers_sample | 驱动程序示例。 | -| middleware_sample | 中间件示例。 | -| user | 用户相关。 | - -**表 1 board\_sample目录结构说明** - -| **文件夹名** | **描述** | -| ------------ | -------------------------- | -| dimming | 呼吸灯功能示例。 | -| key | 按键检查功能示例。 | -| led | 数码管功能示例。 | -| pulses | gpio发送pwm波功能示例。 | -| softserial | gpio实现串口通信功能示例。 | - -**表 2 acmp目录结构说明** - -| **文件夹名** | **描述** | -| ------------ | ---------------- | -| sample_acmp | 比较器使用示例。 | - -**表 3 adc目录结构说明** - -| **文件夹名** | **描述** | -| ------------------------------------- | ------------------- | -| sample_adc_associative_trigger_of_apt | APT触发ADC。 | -| sample_adc_continue_trigger | ADC连续采样。 | -| sample_adc_over_sample | ADC过采样。 | -| sample_adc_single_trigger | ADC单次采样。 | -| sample_adc_single_trigger_dma | ADC单次采样带DMA。 | -| sample_adc_single_trigger_it | ADC单次采样带中断。 | -| sample_adc_sync_sample | ADC同步采样。 | -| sample_adc_sync_sample_dma | ADC同步采样带DMA。 | -| sample_adc_sync_sample_it | ADC同步采样带中断。 | - -**表 4 apt目录结构说明** - -| **文件夹名** | **描述** | -| -------------------------- | ------------------------------------------------- | -| sample_apt_single_resistor | APT单电阻采样示例,仅在U相触发ADC采样信号。 | -| sample_apt_three_resistor | APT三电阻采样示例,在U、V和W相都触发ADC采样信号。 | - -**表 5 can目录结构说明** - -| **文件夹名** | **描述** | -| ----------------------- | ----------------------- | -| sample_can_send_receive | CAN发送和接收数据示例。 | - -**表 6 capm目录结构说明** - -| **文件夹名** | **描述** | -| ---------------- | -------------------------- | -| capm_hall_sample | CAPM读取霍尔传感器值示例。 | - -**表 7 cfd目录结构说明** - -| **文件夹名** | **描述** | -| ---------------------- | ------------------------------------- | -| sample_cfd_check_error | cfd注入错误前后监测目标时钟异常功能。 | - -**表 8 cmm目录结构说明** - -| **文件夹名** | **描述** | -| ---------------------- | ------------------------------------- | -| sample_cmm_check_error | cmm注入错误前后监测目标时钟异常功能。 | - -**表 9 crc目录结构说明** - -| **文件夹名** | **描述** | -| ---------------- | -------------------------------------------------------- | -| sample_crc_check | 测试CRC不同算法和输入有效位宽,生成并校验crc值。 | -| sample_crc_gen | 计算并生成CRC数值。 | -| sample_crc_load | 通过load初始值将xmodem算法改为ccit-false算法并校验结果。 | - -**表 10 dac目录结构说明** - -| **文件夹名** | **描述** | -| ------------ | ----------------------- | -| sample_dac | DAC电压输出到管脚示例。 | - -**表 11 dma目录结构说明** - -| **文件夹名** | **描述** | -| --------------------------------- | ------------------------- | -| sample_dma_list_transfer | DMA链式传输。 | -| sample_dma_list_transfer_continue | DMA链式传输实现连续功能。 | -| sample_dma_mem_to_mem | DMA内存到内存传输。 | -| sample_dma_mem_to_per | DMA内存到外设传输。 | -| sample_dma_per_to_mem | DMA外设到内存传输。 | -| sample_dma_per_to_per | DMA外设到外设传输。 | - -**表 12 flash目录结构说明** - -| **文件夹名** | **描述** | -| ---------------------- | ------------------- | -| sample_flash_blocking | 阻塞模式操作flash。 | -| sample_flash_interrupt | 中断方式操作flash。 | - -**表 13 gpio目录结构说明** - -| **文件夹名** | **描述** | -| --------------------- | ---------------------------- | -| sample_gpio_circle | GPIO环回测试电平和方向属性。 | -| sample_gpio_interrupt | 测试GPIO不同中断类型。 | -| sample_gpio_key | GPIO用作按键功能。 | -| sample_gpio_led | GPIO周期控制led亮灭功能。 | - -**表 14 gpt目录结构说明** - -| **文件夹名** | **描述** | -| -------------------- | ---------------- | -| sample_gpt_simplerun | gpt产生PWM波形。 | - -**表 15 i2c目录结构说明** - -| **文件夹名** | **描述** | -| --------------------------- | ------------------------------ | -| sample_i2c_blocking_stlm75 | 使用阻塞的方式读写温度传感器。 | -| sample_i2c_interrupt_stlm75 | 使用中断的方式读写温度传感器。 | -| sample_i2c_dma_stlm75 | 使用dma方式读写温度传感器。 | - -**表 16 iocmg目录结构说明** - -| **文件夹名** | **描述** | -| ------------- | ----------------------------------- | -| iolist_sample | iocmg初始化管脚列表的属性配置功能。 | - -**表 17 pga目录结构说明** - -| **文件夹名** | **描述** | -| ------------------------- | --------------------- | -| sample_pga | PGA内部电阻放大示例。 | -| sample_pga_extra_resistor | PGA外部电阻放大示例。 | - -**表 18 pmc目录结构说明** - -| **文件夹名** | **描述** | -| ----------------- | ------------------- | -| sample_pmc_pvd | PMC掉电检测示例。 | -| sample_pmc_wakeup | PMC定时器唤醒示例。 | - -**表 19 qdm目录结构说明** - -| **文件夹名** | **描述** | -| ------------- | ------------------------------- | -| sample_qdm_m | QDM使用M法读取电机转速的示例。 | -| sample_qdm_mt | QDM使用MT法读取电机转速的示例。 | - -**表 20 spi目录机构说明** - -| **文件夹名** | **描述** | -| ---------------------------- | --------------------------------- | -| sample_spi_blocking_kta7953 | 使用阻塞方式读写ADC。 | -| sample_spi_dma_kta7953 | 使用dma方式读写ADC。 | -| sample_spi_interrupt_kta7953 | 使用中断方式读写ADC。 | -| sample_spi_microwire_master | 演示如何使用microwire master。 | -| sample_spi_microwire_slave | 演示如何使用microwire slave。 | -| sample_spi_slave | 演示如何使用motorola spi slaver。 | - -**表 21 timer目录结构说明** - -| **文件夹名** | **描述** | -| ---------------------- | ------------------------------------- | -| sample_timer_interrupt | timer定时触发中断,执行用户串口打印。 | - -**表 22 tsensor目录结构说明** - -| **文件夹名** | **描述** | -| -------------- | ----------------------- | -| sample_tsensor | tsensor对器件结温采样。 | - -**表 23 uart目录结构说明** - -| **文件夹名** | **描述** | -| ---------------------------------------- | ------------------------------------------ | -| sample_uart_blocking_rx | UART阻塞接收。 | -| sample_uart_blocking_tx | UART阻塞发送。 | -| sample_uart_dma_rx | UART带DMA接收。 | -| sample_uart_dma_tx | UART带DMA发送。 | -| sample_uart_interrupt_tx_after_rx | UART中断接收数据之后,再中断发送此数据。 | -| sample_uart_interrupt_rx | UART中断接收。 | -| sample_uart_interrupt_tx | UART中断发送。 | -| sample_uart_dma_tx_dma_rx_simultaneously | UART全双工模式,DMA同时发送和接收。 | -| sample_uart_dma_tx_int_rx_simultaneously | UART全双工模式,DMA发送的同时,中断接收。 | -| sample_uart_int_tx_dma_rx_simultaneously | UART全双工模式,中断发送的同时,DMA接收。 | -| sample_uart_int_tx_int_rx_simultaneously | UART全双工模式,中断发送的同时,中断接收。 | -| sample_uart_dma_rx_cyclically_stored | UART使用DMA循环搬运数据到指定内存。 | -| sample_uart_single_wire_communication | UART单线通信示例。 | - -**表 24 wdg目录机构说明** - -| **文件夹名** | **描述** | -| ----------------- | ------------------------ | -| sample_wdg_reset | 测试wdg不喂狗复位功能。 | -| sample_iwdg_reset | 测试iwdg不喂狗复位功能。 | - -**表 25 middleware\_sample目录机构说明** - -| **文件夹名** | **描述** | -| -------------------------- | --------------------------------------- | -| mcs_65ldemo | 电机控制算法在AD101HDMA_VER.B板的示例。 | -| mcs_65demo | 电机控制算法在AD105HDMA_VER.B板的示例。 | -| pmsm_sensorless_1shunt_foc | 永磁同步电机单电阻采样无感FOC应用。 | -| pmsm_sensorless_2shunt_foc | 永磁同步电机双电阻采样无感FOC应用。 | - -## **问题与解答** - -如果你对项目中的代码或者文档存在疑问, 欢迎在Issues中提出你的问题(别忘了先在FAQ中看一看是否已经有答案了😎). 如果你自己解决了一个了不起的问题, 非常欢迎你把问题和解决方法发到Issues里, 如果你看到别人的问题而你正好有答案, 也欢迎你帮助解答其他人的问题, 所谓"授人玫瑰手有余香"嘛。 - -## **参与贡献** - -我们非常欢迎你能对这个项目提出代码上的改进或扩展, 方法是: - -1. Fork 本仓库 -2. 下载到本地, 修改, 提交 -3. 推送代码 -4. 在页面点击 Pull Request - -这样我们就能接到你的推送申请。 - -## **最后的话** - -Hispark Studio是一款年轻且处于快速发展的IDE。在使用过程中,你可能会碰到一些棘手的问题,但别担心,你可以尝试多种方法去解决,比如用搜索引擎寻找答案,或者向社区寻求帮助。记住,所有技术大神都是从解决这些问题中成长起来的。我们和其他开发者也会尽力提供帮助。 - -最后的最后, 欢迎来到Hispark Studio的世界探险! \ No newline at end of file diff --git a/vendor/yibaina_3061M/demo/drivers_sample/pic/1726194739756.jpg b/docs/pic/1726194739756.jpg similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/pic/1726194739756.jpg rename to docs/pic/1726194739756.jpg diff --git a/vendor/yibaina_3061M/demo/drivers_sample/pic/1726194776437.jpg b/docs/pic/1726194776437.jpg similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/pic/1726194776437.jpg rename to docs/pic/1726194776437.jpg diff --git a/vendor/yibaina_3061M/demo/drivers_sample/pic/1726194794028.jpg b/docs/pic/1726194794028.jpg similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/pic/1726194794028.jpg rename to docs/pic/1726194794028.jpg diff --git a/vendor/yibaina_3061M/demo/drivers_sample/pic/1726194824764.jpg b/docs/pic/1726194824764.jpg similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/pic/1726194824764.jpg rename to docs/pic/1726194824764.jpg diff --git a/vendor/yibaina_3061M/demo/drivers_sample/pic/1726194869607.jpg b/docs/pic/1726194869607.jpg similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/pic/1726194869607.jpg rename to docs/pic/1726194869607.jpg diff --git a/vendor/yibaina_3061M/demo/drivers_sample/pic/1726194906962.jpg b/docs/pic/1726194906962.jpg similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/pic/1726194906962.jpg rename to docs/pic/1726194906962.jpg diff --git a/vendor/yibaina_3061M/demo/drivers_sample/pic/1726194945180.jpg b/docs/pic/1726194945180.jpg similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/pic/1726194945180.jpg rename to docs/pic/1726194945180.jpg diff --git a/vendor/yibaina_3061M/demo/drivers_sample/pic/1726194962547.jpg b/docs/pic/1726194962547.jpg similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/pic/1726194962547.jpg rename to docs/pic/1726194962547.jpg diff --git a/vendor/yibaina_3061M/demo/drivers_sample/pic/1726194980430.jpg b/docs/pic/1726194980430.jpg similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/pic/1726194980430.jpg rename to docs/pic/1726194980430.jpg diff --git a/vendor/yibaina_3061M/demo/drivers_sample/pic/1726195007716.jpg b/docs/pic/1726195007716.jpg similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/pic/1726195007716.jpg rename to docs/pic/1726195007716.jpg diff --git a/vendor/yibaina_3061M/demo/drivers_sample/pic/1726195033006.jpg b/docs/pic/1726195033006.jpg similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/pic/1726195033006.jpg rename to docs/pic/1726195033006.jpg diff --git a/vendor/yibaina_3061M/demo/drivers_sample/pic/1726195055385.jpg b/docs/pic/1726195055385.jpg similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/pic/1726195055385.jpg rename to docs/pic/1726195055385.jpg diff --git a/vendor/yibaina_3061M/demo/drivers_sample/pic/1726195173004.jpg b/docs/pic/1726195173004.jpg similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/pic/1726195173004.jpg rename to docs/pic/1726195173004.jpg diff --git a/vendor/yibaina_3061M/demo/drivers_sample/pic/1726195185553.jpg b/docs/pic/1726195185553.jpg similarity index 100% rename from vendor/yibaina_3061M/demo/drivers_sample/pic/1726195185553.jpg rename to docs/pic/1726195185553.jpg diff --git a/docs/pic/2d23b1fa3489f9f9ad2d2d1e76fbec4.png b/docs/pic/2d23b1fa3489f9f9ad2d2d1e76fbec4.png new file mode 100644 index 0000000000000000000000000000000000000000..3c29966493bce662b0af5a65c8daee31e47af2b2 GIT binary patch literal 163583 zcmWieXEa=27sl_5QAY12dW$hSi4tuP(UKU0Ale}FM-tJZx6wingi)f68YPJy(R&b* z=ux6Z@1n*qyxtFI-F41~d)K<>?0ug7+s|v{Lme8*8iFJd=@rX8uCtX`7yeqm}7D1H*sg{T(!MuO#P$dTF^t5%6Y=a&!}2_%jS1%Vl#Hn6=|E8~G zyxIH_Pi*kqtT;bD7hUaFT2EW@EU%>+%y~4w&E&%N6Q7!W&|2%TJaBI|c2L#ESpsF_<`M}mnw!n*&FSi~!=vLSS50`%!G)?(t>u2eeCh31ZZXh+S z?E2xMUr(#gF$;bz`-@b)5#BHEaMf37$ zqNm%Qx!+v#e+}{H_S?7Lw7kF5|D8COVzv$6P_CGKvsE$GWM=Zl~sIJlTU%gM;@SI!p)J8Xo!$5fh)n7tW`qSpe!X^a#b)?ao zF;J0{qg~BV1zRF|X8a3Cn?>GEiePnwp^m+MDDJ`P4BSL(s{&}Nut@C?Yjk@*@uJan zi-${mI1TspXV#Pmn#n<$;NbUW%Z%jdM0q!R@cS+Od6ulX5FKFH3q*6;zZdPl+U!pB zvfjEq*gKdXFlN3f5HzlF6bhVNe*SG20jh1{QY20Psp?*DPs^&&&8Cdb%ZhCSsQqjw zAD7ITQLz+-!#$*NghYZpYdyfdVq!x3MVa8=3QOB!qh=5A>DYXu+ z8&JBbjMuXro8{C}=VmFK<1~`}SpDnl*eKVBQiBHC^$eVb9x9y|$~bDSocE+2LK7pX zy$Yv9wqzDUQ+l6p)4#5h&1DqN%QxSL()R-}@mwv-@5Vf~k2LeVHCG^r632^YQg6Yf z^*ljf^x7EPzRC_I`GOTA4xkzm%?yXqLls?z*^D_NmrJQJch8b~+CKSx^OUkFmXFh> zqOj72l8HY-A;O<_fSK896G;@sZCF+J%i=%43n5y++-VNRhF70He7fE847)CjC*h0K zr-UWRO7`{ynXXa5A{$@h`Ew!Euu-XV*_>NzMVCQ{0{qge+?U5Aq*w1?^UWuXCL^5H z6M>S1S04Ud7230J^5-;E%tWbW*≥s>jyq!vT{Ea*M{u}FIyHey+*{{3_xn{__= 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